diff --git a/.github/workflows/flutter_lint.yml b/.github/workflows/flutter_lint.yml index a95ec2fa..8f9fa050 100644 --- a/.github/workflows/flutter_lint.yml +++ b/.github/workflows/flutter_lint.yml @@ -40,12 +40,22 @@ jobs: id: analyze_step if: steps.changed_files.outputs.all_changed_files != '' run: | - echo "Analyzing the following Dart files:" + echo "Changed Dart files:" echo "${{ steps.changed_files.outputs.all_changed_files }}" + + FILTERED_FILES=$(printf "%s\n" "${{ steps.changed_files.outputs.all_changed_files }}" | tr ' ' '\n' | grep -v '^widgetbook/' | tr '\n' ' ' | sed 's/[[:space:]]*$//') + + if [ -z "$FILTERED_FILES" ]; then + echo "Only widgetbook files changed. Skipping flutter analyze." + exit 0 + fi + + echo "Analyzing:" + echo "$FILTERED_FILES" # Run analyze and save output. Redirect stderr to stdout for capture. # Continue with '|| true' so the workflow doesn't stop if issues are found, # as we want to report them as annotations. - flutter analyze ${{ steps.changed_files.outputs.all_changed_files }} > flutter_analyze_output.txt 2>&1 || true + flutter analyze $FILTERED_FILES > flutter_analyze_output.txt 2>&1 || true echo "--- Flutter Analyze Output (raw) ---" cat flutter_analyze_output.txt diff --git a/.gitignore b/.gitignore index 36565ca4..4729a06b 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,4 @@ app.*.map.json *.freezed.dart *.g.dart *.gr.dart +assets/build diff --git a/analysis_options.yaml b/analysis_options.yaml index a4679e19..e4897b9b 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -32,3 +32,5 @@ analyzer: document_ignores: ignore one_member_abstracts: ignore avoid_bool_literals_in_conditional_expressions: ignore + exclude: + - '**/*.g.dart' diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..e1ac80fd --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/sprk_icon.xml b/android/app/src/main/res/drawable/sprk_icon.xml new file mode 100644 index 00000000..b46e1168 --- /dev/null +++ b/android/app/src/main/res/drawable/sprk_icon.xml @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index c79c58a3..5d66b620 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -3,7 +3,7 @@ + android:drawable="@drawable/sprk_icon" + android:inset="27%" /> diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index c5d5899f..519d63cb 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -1,4 +1,4 @@ - #FFFFFF + #FF0090 \ No newline at end of file diff --git a/assets/icons/add.svg b/assets/icons/add.svg new file mode 100644 index 00000000..d399d2f8 --- /dev/null +++ b/assets/icons/add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/add_post_filled.svg b/assets/icons/add_post_filled.svg new file mode 100644 index 00000000..7fb3b1fa --- /dev/null +++ b/assets/icons/add_post_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/add_user.svg b/assets/icons/add_user.svg new file mode 100644 index 00000000..42dd0a4c --- /dev/null +++ b/assets/icons/add_user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/arrow_right.svg b/assets/icons/arrow_right.svg new file mode 100644 index 00000000..0646aeee --- /dev/null +++ b/assets/icons/arrow_right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/at.svg b/assets/icons/at.svg new file mode 100644 index 00000000..5a02fef6 --- /dev/null +++ b/assets/icons/at.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/attach.svg b/assets/icons/attach.svg new file mode 100644 index 00000000..94da2d80 --- /dev/null +++ b/assets/icons/attach.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bookmark_filled.svg b/assets/icons/bookmark_filled.svg new file mode 100644 index 00000000..a325db07 --- /dev/null +++ b/assets/icons/bookmark_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bookmark_outline.svg b/assets/icons/bookmark_outline.svg new file mode 100644 index 00000000..986b717d --- /dev/null +++ b/assets/icons/bookmark_outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/camera.svg b/assets/icons/camera.svg new file mode 100644 index 00000000..eaa5261e --- /dev/null +++ b/assets/icons/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cancel.svg b/assets/icons/cancel.svg new file mode 100644 index 00000000..08bd4060 --- /dev/null +++ b/assets/icons/cancel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chevron_down.svg b/assets/icons/chevron_down.svg new file mode 100644 index 00000000..2dc3e809 --- /dev/null +++ b/assets/icons/chevron_down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chevronleft.svg b/assets/icons/chevronleft.svg new file mode 100644 index 00000000..d4c56bb6 --- /dev/null +++ b/assets/icons/chevronleft.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/coin.svg b/assets/icons/coin.svg new file mode 100644 index 00000000..125dafc8 --- /dev/null +++ b/assets/icons/coin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/colors.svg b/assets/icons/colors.svg new file mode 100644 index 00000000..d063c3b9 --- /dev/null +++ b/assets/icons/colors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/comment.svg b/assets/icons/comment.svg new file mode 100644 index 00000000..4093bb85 --- /dev/null +++ b/assets/icons/comment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/disk.svg b/assets/icons/disk.svg new file mode 100644 index 00000000..3c5b9ac8 --- /dev/null +++ b/assets/icons/disk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/explore_filled.svg b/assets/icons/explore_filled.svg new file mode 100644 index 00000000..9df2f969 --- /dev/null +++ b/assets/icons/explore_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/explore_filled_2.svg b/assets/icons/explore_filled_2.svg new file mode 100644 index 00000000..9df2f969 --- /dev/null +++ b/assets/icons/explore_filled_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/eye_min.svg b/assets/icons/eye_min.svg new file mode 100644 index 00000000..ee808e2c --- /dev/null +++ b/assets/icons/eye_min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/filters.svg b/assets/icons/filters.svg new file mode 100644 index 00000000..7eb24f0a --- /dev/null +++ b/assets/icons/filters.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/folder_mini.svg b/assets/icons/folder_mini.svg new file mode 100644 index 00000000..a2bee25c --- /dev/null +++ b/assets/icons/folder_mini.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/gallery.svg b/assets/icons/gallery.svg new file mode 100644 index 00000000..9d105d1e --- /dev/null +++ b/assets/icons/gallery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hashtag.svg b/assets/icons/hashtag.svg new file mode 100644 index 00000000..eafd77c4 --- /dev/null +++ b/assets/icons/hashtag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/home_filled.svg b/assets/icons/home_filled.svg new file mode 100644 index 00000000..579cb6b2 --- /dev/null +++ b/assets/icons/home_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/less.svg b/assets/icons/less.svg new file mode 100644 index 00000000..a3938b97 --- /dev/null +++ b/assets/icons/less.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/like.svg b/assets/icons/like.svg new file mode 100644 index 00000000..34c7e266 --- /dev/null +++ b/assets/icons/like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/like_filled.svg b/assets/icons/like_filled.svg new file mode 100644 index 00000000..25f42c94 --- /dev/null +++ b/assets/icons/like_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/link.svg b/assets/icons/link.svg new file mode 100644 index 00000000..2c39fce4 --- /dev/null +++ b/assets/icons/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/link2.svg b/assets/icons/link2.svg new file mode 100644 index 00000000..b4c36f4c --- /dev/null +++ b/assets/icons/link2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/messages_filled.svg b/assets/icons/messages_filled.svg new file mode 100644 index 00000000..bb17888f --- /dev/null +++ b/assets/icons/messages_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/micro.svg b/assets/icons/micro.svg new file mode 100644 index 00000000..d0b7c848 --- /dev/null +++ b/assets/icons/micro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/more.svg b/assets/icons/more.svg new file mode 100644 index 00000000..53fba597 --- /dev/null +++ b/assets/icons/more.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/more1.svg b/assets/icons/more1.svg new file mode 100644 index 00000000..125ee1ab --- /dev/null +++ b/assets/icons/more1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/more2.svg b/assets/icons/more2.svg new file mode 100644 index 00000000..7014c1cf --- /dev/null +++ b/assets/icons/more2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/more21.svg b/assets/icons/more21.svg new file mode 100644 index 00000000..68c32a86 --- /dev/null +++ b/assets/icons/more21.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/music.svg b/assets/icons/music.svg new file mode 100644 index 00000000..016b03eb --- /dev/null +++ b/assets/icons/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_explore.svg b/assets/icons/navbar_explore.svg new file mode 100644 index 00000000..a2e07dcd --- /dev/null +++ b/assets/icons/navbar_explore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_explore_filled.svg b/assets/icons/navbar_explore_filled.svg new file mode 100644 index 00000000..177010a2 --- /dev/null +++ b/assets/icons/navbar_explore_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_home.svg b/assets/icons/navbar_home.svg new file mode 100644 index 00000000..ef062020 --- /dev/null +++ b/assets/icons/navbar_home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_home_filled.svg b/assets/icons/navbar_home_filled.svg new file mode 100644 index 00000000..96c4fe1c --- /dev/null +++ b/assets/icons/navbar_home_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_messages.svg b/assets/icons/navbar_messages.svg new file mode 100644 index 00000000..bfc6917a --- /dev/null +++ b/assets/icons/navbar_messages.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_messages_filled.svg b/assets/icons/navbar_messages_filled.svg new file mode 100644 index 00000000..890915ba --- /dev/null +++ b/assets/icons/navbar_messages_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_post.svg b/assets/icons/navbar_post.svg new file mode 100644 index 00000000..13de1b5d --- /dev/null +++ b/assets/icons/navbar_post.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/navbar_post_filled.svg b/assets/icons/navbar_post_filled.svg new file mode 100644 index 00000000..5af72173 --- /dev/null +++ b/assets/icons/navbar_post_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pin.svg b/assets/icons/pin.svg new file mode 100644 index 00000000..321969ed --- /dev/null +++ b/assets/icons/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/play.svg b/assets/icons/play.svg new file mode 100644 index 00000000..fcc9149d --- /dev/null +++ b/assets/icons/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/play1.svg b/assets/icons/play1.svg new file mode 100644 index 00000000..1311a071 --- /dev/null +++ b/assets/icons/play1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/plus.svg b/assets/icons/plus.svg new file mode 100644 index 00000000..36f34a3e --- /dev/null +++ b/assets/icons/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/plus_filled.svg b/assets/icons/plus_filled.svg new file mode 100644 index 00000000..5599e004 --- /dev/null +++ b/assets/icons/plus_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/profile_curate.svg b/assets/icons/profile_curate.svg new file mode 100644 index 00000000..b4c67202 --- /dev/null +++ b/assets/icons/profile_curate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/profile_grid.svg b/assets/icons/profile_grid.svg new file mode 100644 index 00000000..d1cd017c --- /dev/null +++ b/assets/icons/profile_grid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/profile_grid_filled.svg b/assets/icons/profile_grid_filled.svg new file mode 100644 index 00000000..2aadcae8 --- /dev/null +++ b/assets/icons/profile_grid_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/profile_liked.svg b/assets/icons/profile_liked.svg new file mode 100644 index 00000000..319a3e68 --- /dev/null +++ b/assets/icons/profile_liked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/profile_tagged.svg b/assets/icons/profile_tagged.svg new file mode 100644 index 00000000..b500f1f1 --- /dev/null +++ b/assets/icons/profile_tagged.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/search.svg b/assets/icons/search.svg new file mode 100644 index 00000000..4939787f --- /dev/null +++ b/assets/icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/send.svg b/assets/icons/send.svg new file mode 100644 index 00000000..4a1560e4 --- /dev/null +++ b/assets/icons/send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/share.svg b/assets/icons/share.svg new file mode 100644 index 00000000..25bfdabe --- /dev/null +++ b/assets/icons/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/side_curate.svg b/assets/icons/side_curate.svg new file mode 100644 index 00000000..10852d34 --- /dev/null +++ b/assets/icons/side_curate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/side_share.svg b/assets/icons/side_share.svg new file mode 100644 index 00000000..9530c48f --- /dev/null +++ b/assets/icons/side_share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/smiley.svg b/assets/icons/smiley.svg new file mode 100644 index 00000000..294f293d --- /dev/null +++ b/assets/icons/smiley.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sprk_match.svg b/assets/icons/sprk_match.svg new file mode 100644 index 00000000..9c93fe59 --- /dev/null +++ b/assets/icons/sprk_match.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tag.svg b/assets/icons/tag.svg new file mode 100644 index 00000000..c0f4ed3d --- /dev/null +++ b/assets/icons/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/typo.svg b/assets/icons/typo.svg new file mode 100644 index 00000000..6aa5dcdf --- /dev/null +++ b/assets/icons/typo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/verified.svg b/assets/icons/verified.svg new file mode 100644 index 00000000..22ea48df --- /dev/null +++ b/assets/icons/verified.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/volume.svg b/assets/icons/volume.svg new file mode 100644 index 00000000..c3ed1fe9 --- /dev/null +++ b/assets/icons/volume.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/ataccount.svg b/assets/images/ataccount.svg index 44b05693..75225112 100644 --- a/assets/images/ataccount.svg +++ b/assets/images/ataccount.svg @@ -1,12 +1 @@ - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/assets/images/bsky.svg b/assets/images/bsky.svg index 6ea9b823..28170d52 100644 --- a/assets/images/bsky.svg +++ b/assets/images/bsky.svg @@ -1,3 +1 @@ - - - + diff --git a/assets/images/bskywordmark.svg b/assets/images/bskywordmark.svg index 83c2072f..6b4c7e96 100644 --- a/assets/images/bskywordmark.svg +++ b/assets/images/bskywordmark.svg @@ -1,11 +1 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/bskywordmark_light.svg b/assets/images/bskywordmark_light.svg index 49fdbd6e..c7d4dee1 100644 --- a/assets/images/bskywordmark_light.svg +++ b/assets/images/bskywordmark_light.svg @@ -1,11 +1 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/icon.png b/assets/images/icon.png index 42eaffcb272c2be133b46d411e68dff47288c132..d3b9076a708eba6f394b166a15c0159de20ba5b6 100644 GIT binary patch literal 71942 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⋘X+ zHG)E@OWcFMw&L%_quLBNJRaEkU*2`A<8V8~O$Ll>yAJMo18F^OQ~K~sJ!)x^wvOul zk_&nh&v8N1i@}tJu%iJv(5gk6d(Yn=z4o6C8|NL^J?{|M4h{hcKZn&x7Uu4t;ALn$ z&JtJQU{lzC-0ovNQ$MFo>3WO2cggdA*hBr%&=7W%A)*YF2^pE91uNRsgY#UEdfPI7 zZ?ND81wzAt0H!EW=Z%(-wv`XZ8&m6ZmP~AoYq|G)oN=RU_S*eVLqT3ua7ZX(T-$Xr zcaJkT%$JG&c&UE$oAI){r}(DAB_^ExW*`yUZz+U}d_@@y5jXoMq9hTBvaxIa&)sH?C|y5B8VCf2Q?UR=tp4 z{lNAvb5OxYNU}T3nGwqK{293R(1?3*A@;Fnad$Ywh4us7{000T@;+sdHf=w5MyO5R zLrBSI(9qzm#dbie`uf{#y_5MgW;=Yt6035e7giN$ebF!Ia-a6CKh+-`XaZ59eoSDN z!48M2Wrt6)^VQ8z_7b%?dNU~NC8Rgu406-aXW&e&5%XY6bMm#GL%d7u8xC+*AAPr( z?Z*9eVCxp-Fs|*|^jg0fWS)fIfxGgDcZybD*>-ye&+;3Oyyt+zrVZ4fW;&|~(h#uc zK(~%F7n3WGTgyC(hL5Zi8jCGaU%#JWXyZk+}j z!zOlNmBfrQj37k;yAA|@*Nb)d=geV~nfGS%V}awAEg-u%L^KwJ1}0ow3hpB<=A5(R zdd6|4|21DfcmaghawH89GLuF=9K|EB;FsfY|-k{ z-q`|*=!6i)wOxU%-nRdK>|C0r2hn9Pqao~QLfkiyfsL0~%jQYCpVgFg{CAjh$0}G( zaHwR85`B6#<`~Gu23-e&zjftqmrP|iK25ve$($K`V|TuU_>AL=?t;*Z=2K-s)-^Z? zZCJMKazaMql_yq7+ZXniDS-2hhP%V+MRTG~PXT#zm4L;$QyrlOV%EnJqePEhi+cpN z10`o|{O>2g!J}XBLhrErYY(tr19}?5Tn(2_(*T(mqO{?C-&CID2~Mmrp@A6>mx40@ za@c6ZCfJ9EPO0PSneu<(?!J;8%@7AlGDV4|UWuFrvNNF5q3X-=d+S!MXxVhd@!Pyu zcqlV-WQ6iGq=tiR)`(4b_h!b+`R6X3Z<_e&e(>rf6?=AY)GIRWyRWt6!X;3t)~Lmz z6B5{(bTRqN-Gwi{s6q#he+TJpe#4I_%#l(RUrYO(m&mIdIDKu-r=vuJE}d=xawL8dxfXWgQ;D=zUTDBn1=GV!lpRbb#OsuWce!wp}xSDWGGw?vDsA^d3 zIgpDDHZ+7CJ&?i&Y6CScV$IvP{>2wn`$Y%-u)E0|fclArac!5-Djj!_p)33zO#8iB z`n1PW&OaaCeJYw}2y%~rM1;fYqy!^&a9CbsTDMAL*Pq3z`-^=490|2tENKPy`6+=5 zt27p$+XPD8jjLGl_H17@u_t(rgH>hNdR@J2PEbZ-XgtWeMT^b67#tE)bPCSKs;29I zpU6^Iao(fd8Zzc20!ns1D^!6!Y~H2n@Zi5{IAa|rCSB@JOmClv63 zy5EgXtk>3b%ST9Vyzr=h*0-(a<^*!eg0p2SM@FbfP(~)GKj2WxbU!}oZiJhb=YvzO zs;S!GJg;D|ry=a?vsQvwfL_0RaRIkSxI{0k(%ACh61bL_$a1MjG=7%-B@RA4 zuLq}&x-Qj@1UW>(U{OQZ(T)Z_P}8?Dh*j@X^`{_j`;2=l{R^jO7qEqH1~;5UKuz6} zpO8ZFFn7hbCm+gMWnaGQKg6X6F0UkF9abm7vgJf3^Sk1iN4caMGg-H2EmPgZ3{Gx0 zLL62n1@q4biDpfsz0tQHo*e^6ADpB-&TKD zz80su?u8II?6g?6Xsrq`VFP(WM7!W(Q&RBsA77Z}@3y?=yMMYZxYT55Jj=30%Z&M> zCP%QhwC_9P?ArO#f|*UKf;?-o<~F!g7vik2_fz5q}c z^63&ba9%mY61I+0JWM3)^UKS=-D~R}_q{CN%nov|fWih-#rTo7u=7n%&torz3QqOGDeze;SEmB1?lPu4A3YD+(YLsZ~J z_yhLx=EHqOBfnIg6iD!*G_<9 zK48*;r`=ws!qx?Io!OmxYWrSKu+uqwlox~=@=kyl>=4gnuG2mH{p)Oh>(aOfpIYbo z2SWO%32Q)Zduj@}*}z6UCp8JSpqA*Zzk@{DV{>ZVxj z?@zBU*>^+;9NHg2)$jcqJYY9g@ced8N&aVWw7dQl7 zL_4frl&@tC36V@zop3|l!0qJ)-`%&r*0u&|Ug7PqdXZk{XHZUa;A9Hd>)ZO;%Oj*O zT6{+N?Q8MhwZMU_V9?PJc2pti8z@zSnl5*CD_zoM*k;5Uwx)CSdky2#NJzzy#kxgn z)mIZKkS-DZ2XYgV{2NQYA6L%qItytxIxKKvT-(KE$P4c4vnXxR>ayk52?@-3sS55F zhjM3xhUjM5fZV1L^Wc^0#5|S_qM%X|*3f<|cwv=9|LQ{mbusNd+6kq6L}*m~uG*6xI$3oH1J%oC}%e@3*x1y>!PaZ*V1bOm#u1ptd2m+S`8$l_k_u2uF2?1*ke4l>ouXgv@eHV`C$A@G*0++Om zOv#`g2lFaLuyYC;Oq4Z zRbP+_3Y3JgpdrjP(DnK%crk)1d!YY)uPVRzjPg#+<-cq9?b~tW2&DdCIR$gXYWls@-Yd64T5o!cYrA$WIScN@F6G?8zGOnz?%#`H9?P7fXYjxA$3xqt$|ZLH*~5>T zdRxz53T{<3pbRy72^H{rJYW5HX>{_}Tj$a>9YK++5CEEBIQw83sNip$#G)4!5VXzp z*{gT`N~iTQK`JD+g9h_jd%UM7S}}Q)N!ti-?ySg2U_@KiCtK=Lh=rH3^HKS zflE&dzsjnr#zd^M-)UZ#Vmawh7o@^k;p(t@kyzSfa5CS>^f^!4?CU%AcklY&U5{u3 zdG-RRyJGw<4V1tegILzAx%tp5JG5lSjv%o6+*r40Nj)_OkI9t8J(yj7M9aV9MaIm_ zQ7UF2w<GQ*PJ>AtnHaRG$Gp_BL zvr176r18a)hH3|^$guMIl1*zSfdRbtR47~Ne7I|^e3vch^`rx*ObfqG(onhl+-rLGEG#AM-9L>@Zzh5Bz%7<7 zT3L(D1VIW!bP{%U^@+x>UX;u_6Juv~mF~1d(e1fg2GAY!#%l zxBN;juZIu+nsMY@Z&Ntx(cmzfwd{@_-@T>Z@BgztzDClp`1Xyuzw@Q-Zq(hLVW}(^ zBUx^LX}43|WBd2955uSDuG@RVTy#gy!)5b-ui47vb@SFGPH;#6mePXIi_^S1Cp&y& zy6s|<_`TxOynZt^wOhjNZ={OLCG5VKzD~NST==`W@b2Bhx0iO5{hj|ZSh~@S>rP4h zpC9)uviziz#Xmo0dYOIk54+s|EAA}2)Hl2}+j#lRjm+Km=4)R&!o0d_zn{l{rP~|= z3IU57!d!cAEK|B*+i079-1vKE`g`&7x3+&jI44qcxkd79kKiT${cgPeIPvmQG3i@k z_v5AR?=lWsSNSJaUhqVu!d>P?p%aT6e|4U{EB{yHrh0l~$=1h$#g9(heRRTd?|P4y z)46u%-Ou)Uv#0jW94irH<+mH2ZmTJ^*|6#QHjjF{9skZBm;2}6k=-F84O(&W<(Zx+%Yw|6CY4`OVu@CKe7K{S9Y# z{W$QY`erjj;~~~d-%Vcbo>Sb{v$?-xart@i$NNM-F8%p&=j_LSqLpiNlqbwSU}t?y z)_!($z#~Zqg;-|$@9%3WB^}PJ>*ZK7@89Qd{o*nge!tJG{vOu3sy=$}w(^^gmu^44 zl>2d)YvKP>znl$}8JX6KU09V-`jf>!;SAHuf8AeV&)s}&EyDiJ=GjRtS-aTik6T+m zc1k}Ew(l!B+|lb`$8^80c8HkWK>d zL!WBEMu%PdANL#vO;exdduf}X{a;sCf9ksWKR>>H{28s2Ke2wNi^l>-#>Ep@UrG1%#ak%O+mv2+uvhG2?CHnK*N?WZ>%FaW*M8QL#qJ^&e<$pC5USkw@WU~d zc|SYv&9X3K>g8TiZFNa}@|A@auRq*#nvr|w(ycl3cdop?c}98klHIPLsXcguUn5Mx zHu}q4|Gw?A*MFVXShg-<7n|wYl#k)pkA&yXu5y1bBr)9~D)axma+h7ZPhGQW{4)9K zJNZw>p|4+ETiI|qyl*o9n^KLq+LSkjhc+MB?Bu!M`$xa@dJn-i~aaJ{OIy}p?SjbZ)V<4cr<<9?cMY5T(fH2^6hN) zx%}8GOz%1zcI|xZd;CkDytUfnqifx_?5m6X^Ktv5`*|ODJ_#zy`Yn(K&19`uti!>h z`eBpvrea&QvnGB6KtlQ2S>jVla1nhN)s(*dnuS@#g zo$6!lc1Ne}JAcRg5*O2aYvsNhxu?zdIxX;O{K6BU2bWWWZ??HO;t$?~xy; zs~<157q$Pp1Ycgkk}*!lR;vF%58 z&kwrhbp5iJm95cB@p+df|D37*GxqeBs4|5Ml8ojJCCjD=DH?PhC@g*)@87>%Y){!U z6@$xr{v57;Bpcs*`VPNQ@8s?6A{C$J6`qxDx4D+s%kk#3;P*4;O!23dWOB|fF+AE? zJ$=&q3zf@uo8GVWjMFk!!6BL@22!gWc);{>yTJaBUw&MB{Z*4~d$&bd|GmEo z_5UBev)NH6!Fs&M_rb2+%DPhN+1(DmUY@vBm#Z1}`q7>I<@fSM^z8lTFIs2A~g zA8-9Qv2x?{H~YSA7iMHyD|%s7M(#@%zl5yD#m|nUuJ5$3iCe<@C+9Hd5>eYrTbEtm zcXDx1+vnmdAxzoVkG6hZe(PX$Bxl45rPW0xYBRn_x0Y0=MLEA(-d7lZm?6}+{M4S@ zzjKY=7cD=-kW;35!HRKh*R`oW2UwN~d)Ox|kG9(X{aD4hy3220{k3DcwE5A#qO$cb zCr|scL2yODfg(}Sq`qp6wOxhW;uil7?*6jwt~Wp5{iS=@Cx!*R+w$*4{9KvobEMhd z2A!;6Q*=-;XS`qeJWTMTfQ0XZ39(7{EcdoVQq^_;2MkF?B>^+)gA@bSFeqVLkJ&)>#J+)DQN{`2?o@Am}K<5t=zc$bh+SLqq{3s- z8RgMB@wWFgd*b>I@EJc^A1^Y$E_F#aQ_fV5CFvXMzxDh$z-_y0wUA%4zzKJU)k^cD zI$927FulB)7GE`Wd0&5<#ode6=ilhoeS5C|L1O32C427AKQKM-ZN7cAsn&yc{cb<4 zO@9i1?^qot{=TMY`J_`SGvlommVbOaQLpaI61hVP0gVk|uB;tx3KupUD7$^^{+<=z zCv4v0FnujsV|-;+&Brx2&gvh@+VJj|$h6fNuB~@hUG6e^DxVUy+|qXP>mRnC`?stW zw99?}{%#uC<-tn0hxf7hN>rCt6@@#ER+$Art) zmxpaG^?R_%b*}fyV$QptJ^nm+cP>?RVHImyzWD!to9Q}=6P=VTRjshw+HEc`F~@lkej!|j&4l_p$UwWBOEeA3Gd zx%fS%*Gf%HGp{O7s9QWiPWkID^()4+BdeHRGEG}Q=kc@%b>_xxpsD@6O^@^=6#h<_ zQy22hr;E+M(Q@;n?(}0j-AyH$Rz`#RkY~JqO#L~NU1QH0)=R}E`u681+exhmtTH-r z{ao*t9fi_}91*wUK=yorc&pR-JhSY%x6K!vUlIAIKY4b)3yZGkg;gi^6vRi*sBAcN zI{blWaW%KC+-~=Mf@Rj5w&JjtYy0F zjaz2Dw4WoE`LhE zdO`8!s%h7c7=OY5+zTdA63v=XL zCd+g>?1=fh4EGhRZZ8d&vWo4UG$p>&C4X(p7O&Q|g`fsw`1#H)65Dz~>mV{hx2#Qi zq#N^KYWvapJvM2-X3u_F`C++-i675a8 z{_7fJwB? zVGlOB7T)hlb2g|x%~JRF$dCQ!Gb7JDZJB+`UEap>-lro)M$;Xf=KUsM-_UKF1^m%~JJ!o1>dJB^dSmH8e^c<0Dk_xa_=f6w`~R*3Cz=aFC#J``xIQp! zwA@^EJ@}2y=Z)w8?zd&y|F!2w?cJ_#S61KjSi9!tn*Y-_+i%g@SN(jNes$}CFqTV) zSFH`&B04=L-s}6Nf8QlP>i8R+-Rkg2=>urWFIniHzk+jP?)J|9{U&{LCMRY%z4Csr z_k6+qqWFNaU-x1Q|9kOBa>f|ghpj!UA-6C^d%~_uFB7kBE8|>ppP}~S8jGCkWv;qW zOiMX4LZ^fk{@muJu=d>7P0rDx8xyt*c&tA7e_rUdZ3!O_r7>k+YrV~DW}Nvg_-V$q z{kof%+qG8zy%n_P?4vomo!`HU3SXOd>`^e2C1*zHlMvpG0yiQa+*zzt%b)VP0kqoS zpZ(n~K9Qm`nmgE2&KzjwT_0*VBYa}@^4HJ4Xhy~UeEjU#@i-|to!hUJxb|HJ^=S3h zKe?qn;or|c&oAGS-gm-W{Kwq%WB)6^J=6a+=fE+hC{gKbliwc~wLg0Hdlv7(H#@nP zXg^!yHl=#vua5U?4*%6#$gj3rAj8dJ^&-jg%|bK0623?7Wu0HPY09$@kGIwD>ut6F zZO?Q4{VFW}h`C<3D*tu!xignNpHm_YI}1SI$06O|Juh{c_Nuw=a=v_xx3T2u<4X5Z zWzk3h*mB9a-?*1>3tmp%(syI+-ONY_h>$*cmGZ-NnP1H&bqh+2wxMzmsoHc93QI=XY&k z4jH(5zIyNPrR_U2Uvfz|>ay;8rv5}XFsuIQE7f;LR?6;G6<#*`$DQNX zCq?nfJTv~bG2`fg3_b;eG{&`EhRo9Q4mdE$Td9`aty`e{=8jk67l#QY#cO&Gq%nP# z?~uQ{`DV7=+UNs!Nh>)hLz5TdCQNUWG}O@Un!UYTGI2{OYOlsu00Q5 zR2)sb>+7F38??OX&f7gJJI-I@uHf@{tlkvn`dIaZLBo~!viEUqr7O*rfRgb%x#~9o zZ&$b}J0xT-?QP8An&xj4pGkkwy!xmt#)P>U%=``X&=rmi{7cW zukv`>`kz}$8m~l_U5`^#cihE)-8{MVO4O`efeWiLoTna%Xga_iFR?N@QQP;y-}Alq zYpOCmPnT;oo)$m4YvsM~_bOQTRaHYO`g?kfUjl-@zuvk!McM85vgAisnjtfTAxaBE z134Eva`dQuICc2ZSNDFimc`N9AK1?q|1Zw&Hg7vHU9Uf1SMuXMupBy>vgyn7Y5rZZzX;%w*Z3wT$tTS>s0TKj$_p-IdPN zj(N~O?|s~hL;j7&FJE6(ac9xJ{&$rs>!PFHPf0r+su24=O?P2Tcd&cR%X?=Qm#{pF}tT2(Cm;EwCA^`>6zp%F^(mo&+6YE5j&!Jq!2V#ye7)}ooCN}(Ze>^VOiJ0F%1yA^YJTRcsq7+N zv88n%j-TIN6tHsZ{iu8OKlXrD;uRkF3jSs%H_!U12I#iKG|UPI}z zhs?5x&xKg+J{P)9_>=? zn3;3ZGmlAK<$vF|^z?D7=7aL$1>cW97E`UAvM%O#YPQ7mkdF(C|DIhQ&0d>f!!9Hd z<*+&_!-`!J_<8Xm$9&aRhhAJ#=Ulve{pxGX zSts_@UY4^|KWDkAHnDq#!)ewnT2XNh54ZazT)^Yr|~uAKv#v&Es2kDHrg2 z*gkrhsQq%H_O?YVLGuq?&2kN``I7SYPy%RrQX;@%b&`X@ZefW)1=|HB@AyEY8cwX2 zwx0SG<9hX9HfVTzW6I^LVEsibUo=mxENz{+??Hn_-FdF##v+VNm$@=ReY{iHnWl2> z`Fg{v-8dqVss8VxAC=)xMS{P~e%C$!PPEUqv#M6_w>^7iR{WOfC70>-;4ACyP2{}) z^#1+6kRYjC!3(Q0yq6xi$=S$U);C?|PN$E`#W@bI!uCA=@obrS@m{8Pj4Kb`b`mvJ zNH;p#?!Wb&zuMA_REc~mwX)e)Pn}@(T`-p^O7!iT*(;*8Cdid-UE4lo+m?!(EpyK; z*l($NZ(a06U)N(&9brc!Dlb3imMeOBYDaIer2W^*`fod8ngrdYS<7ZgK9{|E?7&f< z1xuNtM0IuNY`CrYA?*Cqy!3}f-BzXA|GrK6VR^s!dDslYBgs3v3>V}XJrU2p`6PIL zNzj7p4{IlGt+R@}y=$_Uc-RdN0r;d*#kGAOTkaYPtZ-APeg1c0@Y?7=-n4Uzbt*0P zm4}~W+-7H1UcY5u%VkxALe*KJb<2uB)x|TZ%L=r=yLEkDnUX_73ggUj`&*-F!Lhbn}VV%Ecs;3I|85~n8xY)FjC;NiR zhqbB`*F|qE4NZ8Yy<}?buBiLVK2;sQ=zBIN4&F#IQzHVm$!E&7N7Eoy~YBY zlvv6&=jprtAn$nRdoQg&?XNHV)1RC@te1P*rV$6^4Y9)VU>@nxX%B6 zkyR^w{&eZ4-suhusT>)hQv%Z?&Ga6`Z$0LH;Vr|Z?@#|1%*u03?|w6J>0^zzr%XTg z9(^ovV+JqxlJ)H`ql{nwFo|jN^RK`5aIT+!5lfNag;gh(3O#zU>A;-GkAME|p0nUi zk-&@{+Yap#wY;+Elf)J+Ep=b!xSDF4JykNy(wjXSbGN^YO?{@FIN4Mq;obAM^2OyE z3jUfx84(Vv7d>Q}v5%wi%JLZ#>-x3`N^ExcC1<;K)6Z$@eU(y&uj>_jofPq|{ne_Q zx*>sEGd@4|Ey-DX_i~NuE;+|v%idjS-ZgK@9}W}H0-zdRmkYIx;xZTh%B0Tdba)l^ z=W*u8w7XqCuL1)lw67ge-5zc-Em2PR!m0|NMauvEW>BYVBQqxSJ~FL{6K|4-GAYInQZUI#q= zBCfll$RxS;<+X^{f*WEj`7edE)}&i%dI@3&XFJXk#!>;>h|wR2BI zD}7i~n`~WwF)C<{UhB+#<^QKokJ!G*T6OQYcM;nbS-&)y*SXtXO5ZV*amo5pdE2|! zcdfGMHEw9QUCn-AlXhbw%O4igo>|EpJPHMm;+Ws$gfoe9`TSY-k=H%kV#z`&VUOty zKVI%~`nz6tO@V>4soI2nr)>4lLSKGu z2z&CdZCWKhDdWOSPYD7yWRjEAgqE{kgmH{n1dv5!sZ#ioYUTDxNImOa~cciYF0(~s?3w>BgF=cOpo>v!*-yRf-4YPHhr zARe(3F3UsbCmEPl_eVak;AfQFyy4+#u?wp-cK_QXzrA6#)-m0jKZ-0t+aKL8)oyDz z{aD~UqvTRP{vSCHa-j4$Vw2fB*B}qZ3z~(yTb6%7bxjm*T@~^3(KIMrXMPQKGUstELnQZU}JIn=0Tg&m?@e%Q!arVteT0-8%8I@zFOb zMBZ{UL}_PD+b6d4^`12gFLxzz8gcGebtuyz0Y0(1mg~90ZkDRMUDJ&6^t38+sa^2O!p|Ds#Mf@ljs+h2<8(#<%H5 zmdDAhw^=jsq^}iZDe&v^((lI?Bz=8ve{uPSJiou6(qvo{{QVguThDJ~StfL0)eNuW z)hup81))bhYWVUz6iT)Ky%yai%KP%W?c4JAJ-@@h?cFY`yhY2%p8HbxJpcWdx-4gg zdsajX-l%*Q7WYMnktr0EXcuPiFhz^rNSnQO-y2t^o!mYp+HntWb@gy>O^e;JVbT9z zYhr}s@z;n@DT&?2eTVU3-6 zM^E#wEe)E?tFj>UqWyJM?#BnGMD-U?xe-rvD(|}2uGb1#o<)JgvRjxH_nnKW4V2k@Jd%!AIevFW0SIadFT2l{(=U`LD2UKNi*dxNb?- z9rfB!&+wc`-sNsZ!M)xJYj0&MJ0#eEYKlTrtwxoC<=LC(vd0SENc_81RNr!k_RkX4 ze((JEUTTle9KI|6_=;>=&h;$b#m{EMu*QT=%uYRWm63667oSKV*G{e-y*AfRb!1C4 zURnF&&CJ4Cc}EQ@9$TgTW1bkcW`nP8L1){!D-K`x-Tv)W)FxW+%GLa~1#1j=QH{9X zg3!PpoC<#nx$f+&nX_1Ww!>Sdm+3v{=Su2dTe~8*u8Z?7vk|Lb)$3oWg{S`pzkhW1 z7t5vV6ZGeZzEfN6f5+#sc*H}t2_KbbF9a>X57O3uFU2AkA$dCdxLT&5mVvUtRo3pbV+*QJ`8`}5YRKw0H{UmAa_ZjMR%g$K_8(|se>L;C4hxsa zg;g3GUIeWRJaB53Y0~Ufc8yoo{`fPquH z^=ysjg6nH7ytgk>d#kzZ;;I=u>GzsW-uqbP%Ord~_(kxQBe}C~u})jtvBh9!FGJ%; z&=T0=S68s8v0PfrlFMSHv*B^s$D^AcrCbj)iF#b}_Q0yGy>1g;KM`A%vCT;MdR*l7 zWjD2E)UILDTPdNv{$RKGg;g5=L>LUh8sFbFz4nmTZ$V|_m&+cn!uEVeVj2R{Y}2l7sIs~#$_48CR!T~Y@Q(f)w~k6aNJaTLFmOb`)|G$ zobh9(%l1WbZ`YoCBsW1f^4Z;INt1O$v#L~UeGAGXe6KCb3^@=g+WTqt9@t`WX;F{= zZA*Vk)rGiSfMwm5fM8ta|sx7X~y zxf`_e_$$}x^@WYucbG3#@UjGSJN)|j|uDtEi0wwTX;678*Y_kF@`(Aw$N4BcbIcCfhSPMHCl=2D;2ty}6_z z%ysgwXX|1Up3nTaG`uy>_3ej;aua&bp5I^k_I;!)j(t^;5-l|6eryp?H{-|=@+7;Y2NpfqudiOrpz460XzCU)s_wDzx zOq0{i9OIbo7kIkHu?qTrXW62)D?C^-Rqey!>ZGT$&Lj!(H5zjJ{JHb#&fjA;y${WW zejL2JvE--Q{ONxms&1b?w|?(U{}T1J!NKcy-JB)R2C%Wm4~6{vgkK6|+?liSm;qW=539giPMy*xcHYmxuMdFwZwZ*tmP z9tv8TUslT$CHggT_R5$>{qy?f@cZH2zlQIGd`slkIvVGt zKYp%L@V;xujpVkXbrWt_ftE^5bn;RzZ{&V<{MHtS{k;wcnRcJ;;*J+Re`9$<)5qoW z)@f?g%nq;FoVG^Y;Z<zQ4=g%KjyW-$~ zhFudJ*g;_s;G((3<-womD4`VwoISw_kCx9}zI$6z&I#4~%#*@ci~io4ac)iL>P25P zj~&UrA;!7n_>{PU?CwXRT8-a8Q+(UYl=5dEc)nHZR+!PpKF@@6zp}O0L>sEzn-qR+ zOTf_?eyciPFZ?rCR(O5lZPf{RFSnNE@Agu=bq%C{QUgYt#&VQjBm72!0r7dUaf%Ljdr#7(qE@%Y} z!|2SKa9jJs#Mif^cc0)4(Yf&Z=kqxhf!h})UEfikT2otiwRv0O9_eXE&wk&kcp>cQ z3jd3%ia5*OFlCya-Lh<1FGFJ#Xmwtq8D}GBWBqPBxhU3VhDLYRviYK)OSF#_SWT(q z@7QgxWj|HzUt3h$4|d#{oI(FYDG?IBs9G>+^$E)=Fyw|zb{7u5wgCl&?_MCFdpMBsh zf7|gX+ty}0%H7%!=DPZ{`VTR#n$LYZ$}+hhiy1W*axKX_>bgtxD(CtL;pt-EihrBG zD+n!1RS$Uo{_*Oy%E2?2H(Duw*nYqNYPR*{UKfrh`U^rQ*7v&Huw)buD_OThXq7|4 zqg!3e-$Wh^X!Bqa*VX7g=p-6?wfa&1qUuenKAHHXvjlP9_?|y^;6-_$nA@`9$lKY`ogLekJfZ{zMlO>Q|q9K$8nZ_f7>E< z?Mb%uY#;0n|J`qCxZoVhF}5FlL&Z#o9ZL>*IxOI1T-&8~<*cUy=bryr+F=%g96nkT>dL&XFOoMeza+cI zaBV}_(Jd}z9!xLa&)U6i4kybpfgMl({a8QW=i|QZ90C%P8^VsxNZ|EOuxdQYfAoG$ z{jRxt{1+rN?!ESZ*>}%fqKD@(+wU|Nv$J?}@U5j@t?u5$$m&C9buM*k&-lV(tleGk zNvPuf)Omrk!d+d0LDOl5OQ&VDG1Y%rTTu|&R>;}upvSZ~@2KU%Xu}d)y%>Wp3)fnH zX!^O9({#JT<@@VPY+J3@7On2C*d+Ah+uV2O{|D=yemwa8 zsra-GjwdP`zW43TJG!y@iAZpDlIBA>0q#(qay!46txu}D9)6Jt?K@Dd*I)WHMLU?O z5;O-I%70Nr{loJ6eZRv*rf+TG+fCLIA@9T0#{H8pfxREx5kDX*FP`I!AT}WYs2|pd9ButY_7i9 zp?^NibL7vu{O|s5?MqRj+ZtKa)`fi9o~dABEv_*^?&lxraFH3?r*J+|UJyFbU)LpQ z)q(jn*6X&b#jLzKz5G9@NSeo4bmrY(`NZ?{4(wr#Ei3qbe8E-U`utb{EU*Y_syW#z> zyrUP_t$h*wW>f1#z2tXKwiWrt?A$SVX0PhXzh$pt{Xe>BU+Htbz93fk$L9AUA2&Q- zH`UiJ7PJ>L%Ju2xu*Um4?$~$buARFhTkJ)tcAV@k(b`SRSqs<2U3$Jx_x9UOt{*2n zxBVWz<;!-pwZ5zUFV3H~*GqiIyLUhKhfnQOsArPo$OugdU{MtCVEVqkr##lDiJ@^H zi&~xiAC~K3UzT3IS?zG=@5T7P$&aE`UhnyGGIjeQ*08m`+hZhNK8ulNWb)x1<+9`d#i`lh%c zP9fI+<6P@V0fh;m5i!0{0p`ZzEOiej?I=GA*`*%L^=ALSbc4HHniH$?>uL+x>z!xh z<#_sQZS~bPxOlO6`;{wR_f$7HKDb?e?Du+zy&0er1|sV>3*QKN(AWNWy8hiSs`CXE z40bxa3X9mDR5Z{1zNh!iHTEkC(LHlm1w|#;3tyGgFl4*cx+$oG}|U{{7jls;U#tqzjtV zb)47|F~?yS%f~zV$1XiRs;ZaBhxS|BUF13op4HqvzixVD z-CB_gt1?n=vc$GH>`M4u8!k3+r3z<=YQY7)z4I@ZXm5LUb7{4MPRPcqLjEz)DR-x> zeN-{=Knm0QeM^Gp-Z^>ci&di-sQIuV!%5HmLH|C{`8!w6DM|HOzyx*7wrp1C(wvTS zTePmN>-N?S*?9Ek&DWRbW*?oV8?(nD!K-oq9<_h(ZfSo1pvK75%b5{s;+CJpRLi;N z>7gBok@3~HIvE-{8=J5HKeH@)oJUn~vwNw84E8TUXFP=JaT>Q(CuP)cJ zBvwzGu zu!ZU6MEUd@y?4d6*R}+eDO`YdRn#u5cc?PDpEw%Mo+w zpQ@Z(oNTym;CXk}Aa%X9{tx5S)ma)FSuQC*jQ@M|$H~3SvMK3IEU&~btXgsZP7h0) z(2laq_kI(8hx3(gXy%xrW$M(Q!xQCpM*Wy} z?uqyLtxVnz(;L6Ai_NH*H|w_@TU#+hqZ;cLtyx#h%^MY2?W&9SJTcyQ=G0Z^UzTeE z8ox|wxw6(`#T#qKX?p$d@7=s6{GciNwp3+k;cmMXTAq(ZR3}{fY4vyi<4>-xs=AR( zvY=gX4uVSqmN@*n`l8rQ()@mS%BM+c25Ue)#shQPZTATu-}+r{!lC#7Jks-b%{w&J zaqf?3jm}>z?_w`jx81rfe%*ZWOb&q+puO*)qfb`EKWIz+_{RU3`MVYMX~ses8xIKX z{(5b##?ENNe8=e1<%PfHw^^C|b(z2DLv~Z!wc>=0Oxx`xmj4Nld1}2h={!T{cF;b! zyI+NCUow^JzW*!zXQlk~cMA1P%$%S}3E?LVLF?DLYp7wpSRzu_n(gZRIq%~ zB%a1YEL*g=w0D$PYfiZKx&HjqkDudvuj>Bs%~aP`S{cRxa^be5|8t`RbB;R3T{%?k zaI5UqloZ#jt`e{*m5`^9IrhAjKF`;{%z zWR5kl;_^T0-`r)dnG(9|$47Q24p}E|TZOWX3p*BR$hwHI#Jt`$E%fHS@AvNR{k=c; z^xoUIOE>P`b~V;&(U&Y&N7j%4M#V2$u31d~pU;(a@=%+snQ!^Ny6(BL{MF`SkD1l2K|)L%Ecy;Blztd4 zVCAS#TCn^V?@W#RaSH7}^tY=Y5Ro!vRF5)@dea$pMvwC>$2+^6i-paJ(>iN0pjNfHwsmxsJ~lP4WiQ`Vnrz5Is3rY{${8@F#iwX}Zv z{C#>=PuMvbSr%zHtWfG&>@{Ctg~o=YoD-=Y|`@c!S! zMjH=Jx+?$CL$a_drCx7m+W}1`cJH~yxAf~Br@gg!YGtp`;IM^-Bh)3^<|QxFRnDIO zF6Sz5{q+Am@9@>shgM7+7EI4grte(5WGid2_MuI&NB4YK6MFJj|Ae|%Yoh9>n2PW# z8RR#|d|30Rs&mRs!<$`#?gx?>okYd>?P9n4I&7bP>Hn7bAI&9q&-s7gw%Ly_=EjZ1 zU#l0hUhE2JVX*t@6Xss)HbZ#1MCwI5&6$5QRm_>xS?=A}JiOd%|Hno3x)TH(4lsd? z<1vbLS+MB9x8_e%cNRU|JcmChu=P7fh}eaUqjx3>&W~QG*s!%)yZp|U`O5o$Da(m( zPCPp?Q(pI$uu|is+M@3|=|)GVm?~zO`nobS%CK^TKH)g=n4=}wq2AQ6V$qlR3YV{O z8EYK2Y}<0Hxbbt8#l^0$ueR$o4sbnN!@uFvmQ{UaE1c|;t>!mbxJJpd8bxX@*!{n* zexkABmy`TCH{-6KDqMD%Lq${}Wa5<8ZjKv@2HRcQd?#+6KWV?-Wag!1UuMQBP3UY8 zUMnH`G^6$5?a&to<+&GCHw4;)}sGEKYit1>by93-DhSd4xRgof7M!^Wt{Ih=3PI3|I>Xv z^FEkOpo+mt4=ceW`CG%#>GFgYyuVmYL8VQs7M28r6X7t%sZ)3|jmPgQuF`h1~>Va#>c zxIG7t$h~Bi3Cdd{+cwmVcn~W>ea>1UR*I~-(<^sV+4el5J<6htCiWQs{{qdFflJMxqZEtRKKk0ujb$!(u>5@S0^tcLZnkF)-P239R}cID3^q#|($Lw=V6TE4=x_ z^`mQj|E$e9a^Pj3CDZ%7>HmZm39tRJUi-=N=`$D4&Nx}=f0{jTrdZv=b-yKC=N#H` zUV`^i$b%P#>C@lcR9!Ut+>3>ByClUp8Ce8QxHJT~szp6? zlaucZgYGYJKKSq3!aJtMZ`S$!HuYQhJHssfuDb}^WV;aU1sh#?eKJ~{;-$Zb&+e7x zP-t*aV`|Ydx~Qbj#F3)1;P;oWIggL%u!(y2D_vagtiqzCCNMMO=oi6rM>L8r$r?Yo zIrW)|`srygGPgllcv_83+O~#y7dK}lE7>eut~^n|fq`*5D@W)KU9U7CQ_nbq3O(Gry4nUi-kU2%T&$7b&*;o*``?*9wCDe`IW_g&kkMVcGUKeT{f z)c0iUgByhxf8^ABJFh-j zxWHPr^Iy%FPyQ{@7lYstHe&Z zGBC2N5?2Tb+{;@o;Bdgd@z1SuD%}+~ocO<8*7s9kIi&g_EGO^iybJ4CB+KXaSl#9L zl&ya9OR3uym2S6~s3&WFXB?~P(s@&%lF@iL_0z4i^xF1$_ZNEKF4+mHxdb@;8UkDk zzFp~IV7kirV$Dm%jiO3YJ6~K_u`4FV{eVT|(dd*5Dx8^H9%+l8Xs&Hmx2^KwI)3W; zLz~AFEL=axD@09L*wCh2ax%2$cW0~g(}c{n^OI#6Sp+_KH3YPVZ<^B0!1RuzBzM-0 z8;i=T>jGc$X)dkM61bOfbY|ZRhoG^6>4wgfJ;y~;7= z&1B1sk6lYUk8fkXn)1kqi9t!n&yL$v*tDRwKvqej7LA|E# zjR`XxHWry{a40l1JY;Io;*nRF)y}|ll11w2e4AfideTl774SAXu-?0&)a)#=wjyc4 zozlDo1xmK_#P2RPiRrX(-Er*ns%z8agn8$^y22UzXkq>rcOj5Vg&3Vg6(u!hb%KLc zzfstI{C=)k}@pOqu@2ajJVhr)wy2gi9|Yzx0+Zl8AOqSd06yF+B+>;sKKky{K68z1eJ-8uE> zWl+FIGX1%Bam~jCrW^_n`Woc;>}%(KzI0{NJ|4}owCIcvi;|PePc0W=xg_%9YS^-V zj^Hg$_1e-2E1a_Vy)VVqm8Q(}7o7I7E6BQEcKXuWLc5dq?TYN1;<~c<3o9dwfQEQN zn5!jgKB!>=YAG0YJI;Nws_fDX%iCf-I}~GUN+%1iy-|NR8G(K6)=;?yI?4t4Jy@MuyTa9)N#CIVB$zo z4p_cTc^-F~v!4`#F zTq7vtJbPgVJ8YQig?G+U;}wlp7pMnU3~8y>;$fNO!iCM|aiLr;n_dBDpfQ zJi2xA)6SdPj&&Ek>#iuD=1coKqfS2i>xLKaC;0kViN1a+cuC{_6SGU(0=P0Pl799b zc{hXG?9{bYjt#MfL78Z7)sT zmlkkhcJz}^;zlRl*I&E$_UY1xM>PMm_ZRi5{+{#Lwe;JOH$ped6i(SL%?E|eGf-7x z{+N?RV1w_1I@yc*`5!m9Hnc0>I41Y-->ZDz^~M!>t#uE|`#)OSeE)p(Q~vtd*3XV; zo{^osVQbEN!AODIbxz76+U4zQzitr+l|=px0j>4duCy>P1qx_nO^8suw7hvswnVGk z#dZf4lPJTINiqhdv%b%ncxnCO^#--aI%mz8xvuZ*@{AL^_>J4udDd##s&#L-+N}O% zsc;7*e>XVzGPP)B2|co7;!p^fd!SV}Ias&r>8WjpuFrTiWk=lH1AlnW-QhA`ENcHw z(f)mC?BTon*KxEaKlPaTTlIO|Bh$C3w+j9>JmW!w5fNq?^Y#RYzB{S&VGG0qiR z(*E0Gck;UFsn#u*UEltZxRA{vP!Qb^(0Y5(ly(Ltjw#&Wvfk-{b!_E`~(e* zqYPhGN!H!ceEa2Hd*1mIzpeLb+s&TzyKI7ZXK;#g`f1~;J?}2%b{@8lyP5LhlWH_u zbDdIyg9$4~s7rCoOHn3{8LA8RFW$E&_Yu!TIoC~2ajf;z za=W?%IhG2!@*fv3`ttgMuIuu92Wq;$9Mn0rvn)TU{EX%6)bEMiR(|22Qtm#el=Jgz z9F|EWcT^=A~P)6?%HcE2tJ-aBkO|KgyPw!f5+S0w0VEe_Upo$%w^?A(_=Or z(~R5W_~l5L5K|#2S8tzs@vE%y_0Bde4-SO}2Bv)+0;@i>&h!E`KbJ7Ql|DHkNisyI z_Llc+HqXrk7nKXjT8u}nGRC=vZm*mmyq*Co$+Dyx=WpSmQv?*EM%u16v-t6a_R zKQyY$Eq?T;PxZFT^y&$qwh+r7QH79)>&>?+HZU-GvSxLbf&mQ|hQfr0Rln89wvmyrXxYpL)!^cWeB{;B)oI zZfjlAiT%IBSIuvtTG*CNxi{XosHaW0@V40|+YxsE1uv-TOJbas)K>8!!-|Q+CD=h- z?tH}aJtkY%%(wWpC7%7^i^~~(oCMY|r zoqJzV-2I|og#~1AGb=}^gpGv>FC(bK5U_k(Oy#2&m%Y1O{GC)?gATN09F6~da>nPq zmu#ziX7x|~>%LdZer^%FxOH*F4F8FJp&p;t+?vbb|3XvlcVEjEVH0Ua7J&@`4FRpK z&3@Ab9Tc3Hd|#<8i+a)0eR-DKisTYiwFSm}c{PS7c8V@OKcSxQYnH*Y{0aLW@71!I zTlDqM+|DDKmnL#W&s)pxGF|`WC#Bk#VIp9cHVSZU2!{-W}(4@8H5@ z$xAmoV_vMAqx))V`a|Ci)^%@ngxgM@c(6!R%J)LDpv|lu!f)I}v#bkeywKaWB!fdn zW2&pP@bhw=+Yf8{c!40J_BX)%A&WvciencV|o%32GF-eriR-BGLWtbnm}^XLmcj zed$x@Ah9Fw_q88;w#s1sp}&q_S0CA0E!=JWY|Zq$?SEHItpY_FOARPnXq!(3rDjJi z5mSNKIqS7uew9rr<8992EKOGw2-)IfZ>-;cV$ohxn?=)m@{d&|)<^KQ(Un1n7j z?PZ;EpI@d&SwvNBFW-4+oqyN){nF}w4?hW11NH#gojECsc?9k(`BfyzskGoZfXxrhrwECLP(R2tX$f~up- zakE5cTrs+(WR$tJ=Ar8UXJIin{o;0>^evD5wUFDP#@l?3+J6yQW7h~Mgd`p{xa`Ry;Gj_5xF_n;=OY)FPv2Ttf4=EWblUgHb#B@v zi@ENuJ9O06w}iJlZ}m%msda^2uYcV6)f`)_yYzU<$1ruXg~b~8ZYcdy26dYq7#dTU zTC^suECA(X2Zfc;@;!8h3AgxP;Tb!k^1fx~9o_P9QF_g;NhQTc!uY%8UOaG?x)}P; zaEe7M|0UCqjalVMWzKM`bcDD@18xYqy5fw>b|>R zDY8qH73x|a7LL%AMXqt6QmAniQ&rlDqicoJJHBLTe|;Tt_K+w)Yl-Sn-FxoZdO4c! z@4fTWulqRd&lA(~F0VkY!Y&budv`A}TgTm0*?i5iSYz5-0YCAteX}NkGT91lfmI#9 zI4;|RBF(?C$>w6N1^cnI=$H#Z7C*1Z|0$F|z4r3nxzP)qcfPI5jJ)5<_f__N&axMo zQkA=G>UCe+*_hfz?pXICa+mH#>u0NHKPk9*GJ20Q10yK5q8aPHPhBf>9+dMqLPRg* zYZ_m-*7yCjwJbnAeVgn4zC#z6hpvs;WAuyX`St7DD<#)n`1Cw)g8rO|*{i>9f44sW z+|~(K&i8j6)qHiuZ*KSQom^|~&b}cV9A5cj^JkBBy3Z=X0b;-@u!`ey#>Fs@ojy#~ ze5Z<6&zZigc$RutN6g*0Syy<2^$%UTHap3Y#ecDARf_Ywg*sf6I$MNuk5z|vNf&WeQJOX6S%0;a#+#S&j?~Sd}oq>Csh0QW$bh7CGXM~2J3z) z^~~NEw99k-MXvO`qo;$Oo#kWvb^7z2$#qA+>a9Fbd_?okH`^e!^|^j6>eF(BW8XPC zfkWj$HRHEcAMVYN0u>u9lek`d>0;bCqqR+UmznRZ)^17eJs&3CvAerELEP4COK#^!+Aixdw5yhI zXa+Y%pPTad_|tCVJM*I#-cK&(46WGm>+v(=xj#iJ=a^4^$*wxB{=VRIhiNxe&&hDb zE_Hk6mGM&|{VpLnqNVTvxOlD68&IoI~%F|qvqoo6>>f@^&N2L-(YOagYC z;IK#(05|9txzFF0Ezu?>ec@Po_^Ih>yKJ^6{gl0=dwWA5xIvV+E5qg4%Y$c@drU96 z`p%`o$^YYxYL&aoPqZ_Dl7NE%)0tHqPIIlm#gdWeg{hzYYhUa!nS0-8qtlXd>&zMR zGd;zg?*E&!d~^A^lFwJzVwoq!u6Xo!uHJFYJZtZHN`8Ttk5}GqJn~K0s@-Y(A_Z{1 zP!K>G1>jH!(A!Yc{^E7H_tLz1;O51Hu z%b2oPxpk1pQvem9PG$)vpuUsCf;3QZFCG12-JG*rS?BU!eBAsPb{2p$U#xZUcb)QQ zVSB!@UOXIWjdg1OxhMXfH!I%CU2eOM-$LcB zN$tY(E?hsv|gt7@q%#`q+!Pq zp*i8?dY3gUi$EhX3`~Jy7uKJDpHm*UKT3(UvZ(a8%Z*2e!h{}9_J41AzBBmFbmuKj z+gE$ohb)xVej>Dd$M2X*lUIdZweBegj~!v@;xBjo=`T|YtqW`!okU++PUHp!kHROW zs(r~doA!R&lKR)>j8k|=NtVpPb@x|a?0Q`Ee~!-cuowD&o}Ma+EQs~7OzEV3YbgjF8 z-3gAO!J{uAsB&aqb5m2#{zV2a1deXDApa)AmE1}2UWp#(+`Re?HCV^_do zffVE1MgLE!J^%VYu6$Yei(3%RM`hfKWts-NSC z=9dXmTxX|Tvr@PDc<-Bz_^pzNnyGnw@7IO8@vk^J>Q{;G`b@Z03>0iITQoDH9 zAJSFjP?#{4f!kqI(qlz%DrQ;5^@5M@ZnXNcs4rQsWi*8rnUw9UF+H4dw5@t+?c$Kw zE9>8_m7g}ZJ?QDm6930)$%n<3N9;D=XuYg0zby6AO|RPL?hu0nEEFA9JZfS2?*>WC zu8qG+pUk>(arv(8uG_`*#NH$Z*2k*F&z^qpPS<|kN!I5*ug=@P-K+n3aO#SZ_l=*Q zuK#;zqy5o$hZnVPc=c|ERin~wUuW&FbLAmH;jo~If!jeV;e!|`wJ|VmXDM0T^z!wb z={l1Zu^D-s7tk!*wmsweg|$+5^q*^sTNHBjhAo*{BINigz}0QF{joXv{Ig^sdAsb} zybE=iB5u!npshTI1JaC6qW5+LX+fg&DN{86iObq^r>o6P6ujT_`PH{e2K#NgHS_na zy4dyj)7PJwTbCbut96M#G-Jw>|G%WH<|qB+Q#V^E*u^US#33`vCu}fR;$NLdiQV2&-S3JM{eGRU{?z+3)Aada>!)uHJ+Ul}^L%(?%eHA( zew>Ks=?>1hGk=EdLT?+BOD<3o8S7bRgu(^{I1~iLFI;8$Y;LiB{vNef)=Tl>9Y^9~ zXR+vi`N}1y_@x|WH)~q)R*_epPs`?Sz$ z6}Yx`U}${B!Vwyxez+78qkn`h*h(F*eY3}8?zIp$aqGnHeX>g;8{>6X1f4fGi7JfQ zw{^j(-eCO~QUblED!x|o3y&=^oM``jrQ!5;Nw5Bs(b2*WJI%Ls{PTc0o|z?rA?bj^ z1r~?}tGJ$Aoh0Ylxl(NU_Njkvg>J5>d)oj0)b?OE?Gn2aee9Fg$L;(O8M#e4l-pG5 z({j6&Miu4xSKl3ZDEry$#69JESDjBn3JHY?a~T$Py}47t1xXz8tWrq_Hh-7@z&qVwfNur1rw*I(Xt&+Rx|zPdl` z#rOZK7IMY@UFaV=eP8LsKL@8b&d$;GU^1Ny~^)=MZ0xb-iwVDE! z`#~%#62D;Vte2tLoFp9`bJg!v_0QMs_jRYf*Y&!WayKmbS?|>RyQabaz9l~G{y5+C z+sEIlC*Lo6`fB6jPv^cJ`6j$R&nr9IKm65F0f=z|1)#yt>S59`zU(@ybEa@Bs;S9DHW z(_jA0q|fv8{=a-O`+eE;``_$-Cck_C<;j#v)lN>4)!(1Q$*Dq(Zct>3^Aj^&(rv;F ziNe(^WinHq+ZV;nI;Z91v-Lu(`Cy1uWn8CFgOAE?a5QIftwA zoBj4jDg7_X+Vbd=*{5G;)lcuP^GagB@X1^1@sHBH!mg**b8ZUnvVPXYTeM)yo`ic) z2Ro>M1}TdoUW!1{##QbYU%KkRQ)m{8BftJ!wg2<}{L}mQRedUp)4ge`W|;l>g<+;$ z*q0NNK79etTu%Kz<)HN4w@%5zRWmyFZIe0iz;TljG@wtgMlc9{Vq5}g3UH)oZTQ~d z6ZLkF$;&jc=A`tF7Z;c7zFHc6X@ATsnLj@l3t#No^!Qv#`)mJVx%%YKnuT5RaZ3MZ zd(KI^FBrMO(5x|O?~8fj(8i;{hMJg)%(|h`T!@7t`(Awj=8z+ zQ>R?$&VQkxn&tR<)psw-L_Y?&9_`gKS@h99Jgj!hr>U2cKV7>93hX?=xznNDAO^v{RTzm8m7{(SqIZ!a#(e=T?x_D4l*?S%kW zo2l(uCeuEio>JHqx?A{o_qp2&Ru`Kg$(DhMV~#+=`YvIiKcIm%P&u`VOT^T}XX}N< z{*LyY)AGZLryVsWQ`Qy{l4Ap>K8OjQJJM)Tdh(YuEkSCER@BrG(V-ABFrs zD_bp&9t?`yq6wPedh3@4nr{I|)`XyjNKwto9pE~;fq^NM_0_YJq8k_cf909z-94vP z?_c%CnqAj#K3r63`}3ygqSK!DZqB;_8YC;)u_jA02GaHe&GiZ^gappzxekdH2L;~7 zLrq66E|;%;_QY=Yh0cI8x)bNNU#ge^nnr?TMAsqK z&;oG*Q}3sx={f9Y1!G;)gF<}w$2~ft`6=t<)ZDqVf4ObHapkN0|5~M}h3Ye2o#C#{ zyj6SS=EZ(=Sv9=)`_`O3vu zja8oeBem>nj_xc^wa$#1P_emS@t>TH#?^}+O{POjjm10)U zlTJ7OsQm|vUycp49m;QNK?)|h{{gKG5k6&j${bY8IIX`EjcAUk}C;a*o z|L=YEq~CO(wyoOw+`hNRBbD;=r!GF8Rnx=+b1A5`eo;EO3X&5Xyc+-9DhkwAw^_J8 z+sb3@l$n$7{rPMC>29m~`xkX$yN`8yx^@y;gDQ zD%VcqhmV@)p8JO=RGb@F70P;y_d=S%4(h%~&cBzq3*V3mxysxiLSDF$L1iU}&7c z_2fgnmf~B(v(UDsT;ny~In9=jj(2a%e&MwL|BrPw%MaCbRdhzx9W`0-SaTuQ-le;v zGPXP_4-Y>x_2%!euTT3n&z-*PYIVx5<>x}U?}{WpUwGz}qB*4O=4f$jU{y$zP`w52 z95gumVyd!uvDCHmtL!fR*6x@7?@w(PQ_;-7I=3jTwb;l0mTtQ3RF&J?^{3r`F0gh* z)FM63%53i(`*T8-wVP#h*3N3xh6TDCqmyW&jOi_KSGU1Iv~e@n+z%~!A0M2J z;%AprH*PAG2YW$Mw}JtqSObfj|51p2PqZ#9ic9)-gm<~;>0djiO?&ine~9q%3-0UQ z&Us?F_s5Ulp6g!k;fdw^^xV!f?`ehSV&h%zZN+J?rfzy(pp>?7Vz5U0;;L%P8 z2FCxO!KZw`UZ~*;3y$Z0$(ekk?$H~r(|Sc3o7&v}zqkE)>`&I`kXtL1=K1TZ@rJ&L z?X7yz)4u=9%54YkoG?)k;vdORk|S;YUl<)5|m#KW7qcTYNPe|W{%r6jrg zX!KK$ndzp122i6@ln*dX$hlI%2CnHC*R#wL^;j=_yt^#(QK;_ADb{6`yoFr4F6UL( z>b+chWnowQw9_9S8*Qs+xY)HPswmX@`PcWhPaRgCx&PpZPDygNsP&wqny?~_BdQ_5 z^@6g)UueKz7n?ip!JPYnI(u(->V4<1$&`7xx;Q)U=z&LBpI@xKue0`B-k)QKwV%v5 zaoEvC`&9I`1${hk-|R7YYoW0@$&kA@X3hQZd9CIU(-a-ZnS7_;{k|CkLrQ zuH35qeMaditMtCiS19%lO4Zn3{(a}C8xD^biGFF%(zv^^|q}{z4Q`KW}DW$9|vY0`FMjtS!{pE zt0{WNcP`ob`PX#sxx5zfH$`suZ$8o)KV_L=`jVi`Kal*+z?8{huv&>%WfP=vH=*@F zWGg81XE(cPpYiYCtN;D%y2`ummG1X;9pyZ@#3Mg{s@(bIJK}#{oBRBPFtcw@SV&&R zn{?ZEA@yJZR<2eu0DR> z9M3sU{Qh@;HoORw(wsDpbJgw87vaCYToyk+O`W|}Eh_Nd`m^&-``qm>-djB5MBCq| z(<__7bp!*`P0kGrD%R%nAmRO>rQuyiWu>&b)56>Sb1wfmay8&@^!4}@k>wZ8W!48D z*EH!*lL*myY;pDe|iJ+BV*&-p?)cedXVH$<*%3SX@(f@ zvlzu1mVA4t2Z>=(mRqJiYu@iz*KMM`qCj~|{{L?a?-+acy_`2qa#?8kshO>&_Mb22 zS-xI5Yjfz?!qYQ9otdz~O?y?@^MsYfFEal~OiZ=j#JE06EgaJD?^wsMuq3@BfT)g zweotI?4-zzi~UWDHkRf8Ooh98Cj+;`Da{HwA%XgQCR0!*}b=0^QRvd{_F8I z|E{RgZi`m2SX$=jH_lvpg9GV8i<@1Ymomv_|~702e- zpX=T9)?rGOXFSB|CtMpMMR&gV2%f=k*ur9E?kS^hwPdr&ss6D0es6n^X}+5^^RH1$ zJ>S%e>2sozzS_Tx6E)u(^7rkmcNwnr{V`h>Wi2n|JXd{tZm(|1s-vrCr~JRTDsl&O zWXzVSMeB`Zb`@yRiNXY*1*x?cD}{f}uD6Zb;=DM;QmOpy%&DK2$~+ROvU_>$x3NW6 z>2F8PDvQUt*4nH3ZDQkgm}M1fYn5%d^n3B~CtJ^MOm?|;`u6Q5A?IBbAuYXx=?n|G zb|0I451b_|Kt0jL8XNa5PM5y;{@yng+xW-lWFCodm1a)dQ|g_TU^{R6_U&okJeJ-u zFPkdf*7keJR4-ev&+c>M49(51Ci!(1^Jqb*N32_$-Rgt)F(#Q+;?()Tzc#lCvl~_1+zY1+VZvG%$2_u*H7=^ z-BcGpXIeejfeHeijA@}Ru)f^^PDb0fFR#9xW9dqaT~gXC9KQC?_xs@|#nU|^pFN)x zc4?Mz(67=pC2QN{OXD2=bDBQ!e7>zN`FgI=t0>8|RZlh-Z5Q5rVXv-O&V;+|+IOEo z$IA}sIjm56qwMh;+}>ZsVRB~r>Dv|$IcrPvW1nuDDn9SO$GaKtoaQ)PKlesX`K$4q zsg)Z-xQ?HCXe9ok)O%u~i?)`-D@9GKWYvB0&tK1eIzjq`XxDRHNakte5Lm_0GS>@i z_8l=qrMgdcO|;sCS;78)_uTEZXuW2%BVt*RFgd z;$@4Yi+VTyweWs&_wCL3A0{oy(1S$igVhdg`$a!)%?)V-7eo%eOuP0e+f^rJh->Ps z(A+-t`~Qy{vkSStN?*|QcB#FvHsI)%twoQ!jS^>Uw$)m>sNvlKq5qE;h}&Dw>49s7IahI9xS2_E+S|85$KfN|R zHsX6=+^gN&Pq*rxu0QqQY_;{1Md`*T;*+l_9yNMdwMf*|%2Lwn+fh)%qf&L#Q-`Sj z36Nyd=)lSm%5uv8DLB<+a$Q-eE55zxkZ^O?(^X}Y(y#tplqnT@(#-F%$mOM9BBn~; zjLV4g-*#Vr*EO~7CDB@2sv^o{Pd&PrC4cd%hSb^(pADvG1!nEqnA85kru*jW)Qf62 z%a<&>1DP~-P>^7B5hG3ZejzE} z)_b1xB-;Z|>ez-7X+QOxK&9^OCj!4aMcv%emJTTyELo#V%GTXU&mTua+qpJT*%=05UCFhR%g@2bk zxy{uEJgJw^$?)HGd&+{BYD^po2|W(C+lqXv)0vKz#x7aWXn3~E#aXRVY8i;7x~BKx@~5{7a-Vdp z+$lEcQDtwFue2WT=irowVe6RMPd}OJyAf3UT*}RpYn`2ax&l0IqF}|;qP56)+7}i^ z76AiqhyE>Zt|@KXw>aY0mg&1H(@gb~*3R7I=2k7a{KCa6$zESKT#}hA7q-fM+N*<0 z?=4+@`?R-<_MXqSTc6mrr>=Wf|LIN(A?xS9+SJE4E9GTbC!!i#nBZ>#9^16n0&_ z_hxbA#)HgOVShB2e~+4SePNfY^wV3OpFVLYMoqjNkou$Gw_DNmo#(tK&#PGVS*K*% z(M7(CjP*UhDUu^aBZ_|HX-HAZnUug@&E z2zpj|m)pJDFSI~4Q|95T!gW(ZoE7)pI`u{H(vCddn>*gFbhueqS?vAj#bxttKR!l& z-C`{QHuM3guG+t3B|9UFKu4RybhXZ}vQkSfoD^BYz`AVh)QS6!Xnv8oc{h2(2tLc=1NVEf95-ZNxxRheBX=9?^l$@p6@o_ar0(ku*+kee@jl^KG7r1x%y}G zTt{7NepR!_S6r3mzdH*XD7>L~AWjt4=Qa|(z-+CjU35s;s(MknbYi9ZvW9uj>VF1H zz6_t^WW7k9xqPzNi|7?j;<7xmUYuE*5%nNXT|-x$k+HRiU-QSWvQ-n0(LcUW<#HrNZ4dw4`I{8c-bui0#M@<7td%W);< zTtOWyC5Hb$XcnC~UMgQG(;J+z<p5f{K64n z&%~kdpw(gWuA86ay!rLy`TU%W?ULqV0?o&GaV3`prxX*AgXoTZ{CaCtjR-Q4zNj-SN zB9#UAx0cwo)_vvD+FQ{abN%S*Q_I&*O$^?nWiz)(KSQ(F&Fl29mrqpvHCW4Ji~}mF>beOueA=mLsYVlKA?><$M+aj;#%PoA)oP&8c-4*Zh_s-x%=NW!cAF*$e6> z^Bedr+`sak>9NB5<~amA@I)?q-B77Ohgy*8Ifu`uoW{OqkDpxBdoL_7`Q_cH6L$h#w6jXO{MdN=bZ<|z_!VMb_q*S1c{aE{=$ODz9qN){ z@REy(!zBojAL}#Si+WaJN`v{_5}V5qzRk*h5;&!t5l9GYm3-`=4O+?E#pKGnB%l3x_oJY=Rov^^O~3qV-yXUo^4HF@b9ajVa_>)B+u*nU zf_?4BzZRwqkaa;EAq@ep3;u+FO4upfSJo@V)A49g;p$JP_iXe|IOry6rTL&# zzVM^l&vR~~Kjr2tFW!G7&+gh3$sf;;EE3J_2)pq$U9U2~)R?}))G&TJ-Y<k z3w66p%PU?a0U0X^XXOapamq6h;^I9~m-d!Es<^0q+e@~8`rq(1v%V_|UC_6=?q`&` zzir3tyl1;!p8hAetvbZ4{#|_O%PS>r#_CZQ_XS#2o=o0-AiaIAu5QW1j=cPjAJeyG zU#JJIDO6>264i4I;sNb|(7UkIGv_zw-Nr?eO?1KQ{wHy~F!`j|c2slA)bDfD`*}Ss zMfL05wT_mnzrT3XX8mtpBDO4IzS#AKGqzd54$P1e(VfBw&T(n{OsJ&n%&^gXobcFF%$ z-usuW^PRg>bk|NE&PE-UFGnu_xVXG(Q-5RqnawW*`$1)@9c<^OgF+Hh>E|b#79IJ; zR~sCC{>FZo?~)4&>cU#Gcu zj{ibE@oiJe^S|GIz9{|aUfH_vS!uPqmSq3SczNVbm&x7}(}EoQm9HgtK9-Kwxv!XW zd}dJhYz~El%?#~RZ`u6%BFo5fNlYV4p*H!obz8}^n1(G^Pek+{kdEew{VtflzU|>3 z|EQH47j|u}embkrZ_ArySc$i^WXKxgufI3)rylD zHft3=nH*PXcm`;2?m-vBLauNLO%_I$MM?`k zc5p`>yH+l8`s&-Iad9D5ZuVyc4D9_T#z&X+PITM1KIc|_$gKXUi;tg?Se_NNFx$Z- zYT;`~4~`1;1>R2gZa!NhFmrR<7nR4%OYeocf@b?0P9k=+)N#J3Z24<#CD`S7^wO$* z@mquXQ<=I;?T)J4EWYs~?=_!Ju^ZdvL;r;5e3s?)uafF`w`pZ{?j(T^jt=GzYD$Zf zCZ4z*y|ibpZjHloE*1d;*M_}XK9Zcb8X1`CxL>^QExqSrV^f${ygz%n-EEe8x1^dZ zTKP^j^fmVOgyq()Sd=pVi{$$`39FvZm?ZEa%HjOXOSzN2eBG=)N8|Y(-p&n2Pu-2X z4qnaW@Bp;Tu!bXpfr;aX#)NQhJAIA7c%RZk&a7e|LJJh&h(47=7G!4GjB@e3!9d)Zu-o4u_I2wQ+@mP z3Jn=X*{_-M-C=Vawcf+fFucKI{nA`2527$$aPLC;MKiN`5b#zT* ztMrNQUE`6({^fLHy_L7_Gj5&Uqnc&yiFU3s#X0ts5B?~`%17xXKV!Su;PX09x;t!+ z>lUS8i%-=$3!b;>+?v4=y=QmqjlRpt`CaY|jQT7bp%n|gW^yPzSbyLqXi&G-nyui( zqW!f?w_V_9(eqolY4v-q3a(4DY%hI1d4Z>J&qArSGpxP7IzqNbc-HHUz7R>Fp zVpgxv5L^4;M)GwB%@fItu|k`2+#g9ybe;X=^J2N{?jJ$*z%kIyI9^Nic7hsrNw6r)aJf2EnhO{x>8T>^0Q&w zGPY{Fc$dFBzEazzB>CK>Q0o8kIlzH-!rr3dyY8`U=p zZ@%zW_ul=PsfsqBQ6;3gn{XDXr`Dg<*hH-bxt;~?cJflJ<9d1-^3y-l)V5FDrZ{2RfoaU0#x5m?j<)^Hv~^Mg)nK-b zR_{bzK}#eZo-tL;TT$nJ=|;=Gs;#27xl>vkBv?)S7XA)yDYSEqiB>n9IeClWL*CFA zYbMkQ&&g(;+Hs#}JhSlI@{b%5`Ulo2hFb+ya_%x_{&2qFqN8 zXJ6hTrzp(yjC;)u&D!Jb)_#E#)OR2Es7+RjlGB-bXk(GZllVrHD8uR{FCtx4SQcq5 zDC`P1vyzT}k;84fFmf@t>2LrvL;Nl>NQeovu%A_S`gUKR1up_sD(C1&UG30L6uV&2 z`p$o0@jvIeY^9SV&1YS0J}8{}tZMVDDX!VGjxQ1w7hZefP@nrDwFSqGU*8hwjeKD> zvEQCM`gNv06UPjVgfr^{e2y&ic*d09BIB+vExwPT!@6ft2yqb=SJ+dmb81`AoGQ~qBp*gE%`QiH<=rWUQHugl9= zob&?p{nzD8w}=awp0at5@{`A&pD&Ac1kG`(7vJ@_?&9W(9%x-D-1V0pY- z%=>*ATkcVD$waH99S7Ps{uG%w^J>lMnV-IA`>O2!np*i!Sy*~n?Ce=tTasF0uBq)_ zUdh$?f+IuW(^X%i#H~JmT&}(C_S^r0lZj)8uEUB$xq+vg6;?4-SsiHbD{>Z>ESvQr z^0f-f8ETuT$N5u3CqT%w}lM3 z=dN-C%`N$fDufiSVz*a>6nam7=@lK$JZHjHe9mai6^}ZX1M-bicQ1W!aZ{-CujZ+v z*Y4=X&YJQ+<-+W()lavm^JMjF`(_4Rx6FB3v`BPaMvzAf%e`A#^)=!DK2DUe6&B#*n-kvuv zzR6BJIQhxevo~$e26MPXF35HM`Cfa;leo&71u-{_Ae)vav@tB~GMR9qseza2=hmm) z>D}`pcRUIE`KxtNJJSTvmW2iTZ(RQ=^6T}!7fTssd*4ldc=q(IbDd#6Q^L(sV;T6B z1X3HDY|?|C@7{iTPoU8v?e=ch$~7;gnKW4=7$!|>pUrVYVS)ADyZ3$fl}_A}pW!Ii8 zQ_tN~U!>H<&RHgQbB)-AsS5Aw1OFBDzGMtr&E9!V`N1ZJgENt4dpp5QHM z)7>D-v}@%wy|BM3-=f8AmxJo?K=Fk2T`T$x{yHy+QCL6iPW`?=`{!L+=J?a}o{0O0vsW#JiXE3*Oy#?nB8A(AgIUgAUK0nf=+M!{%kxW&V_tTPNG}H&ipN z{(i#z`DyR@yTX-J6&o4~na->-$n(e$V4BAfb0H{hf27UEr18K;7KvI~ecIv6RHbubwfV{Y z-=|ppsqgcB>=*x5;DP^E*~dQmx*`{fZU0?z7rU#HE*^EGdRLFbF($t`Npo}yyRPv* zxg#bi%=)##EL1wj(<(&m@bVKqrPE5L=P5mCYGBj+_qeF?shXd0DdS`%0Rzv5fL71N zj?n@I-U%7$k%jFwZ=F^?4eOlJ?68E@uJ@?swcCdCo!pBGmK*$ix}d&4v-z#3-XVd9tpS`X4wxImO+hw6gk<+gY3-^^YWoV>kj zi42R9-h#re>|>p_g{mf4UPCUL=IAex>^6!(6nIpes z-Mw)6VFzel{KbJwy4I|>OsB9ee!4HO?AyFJi!ALQ6| zFSir!5A%txeid5h#Lzg4<(*x4+8vFvTv?}%*Rlv0#5M%9zEpPkE#MLEP<|n%Xm-pw zyBjZ?Ch{|O9@qRbKWu67Z13Y6&hEOzmc2RG+x=9^6O);{j%};E9M4iDdf~w`xeIks zmt#&ptYi^@54SW#GsW+8c-A|~?AjZf=hLL0-q2ZKtXX2$y6)cw-PSJ-y%Wr=kNZz| z({|gh65J8?l)1wz2MCh6``s zu&n6~)(H35|G9n3&6~A$+ICM}w3nSsStKeNSkdnw#iaZC^qs(>(=#(uRJlR*zr%_{ zM*`nUZh1ad+kUUkZ=nhyMwTXFg%Cl|PPPe)54f&PIk~n-a&|Dt z57Rg^<~({;xGAka^{(B;yK!%qc-|GZZ+Uh9R!;7ot)7cT&G)Ma+ietU=u@7sw872d z|7)(FzVCJ9pBu6uPQ`K1W122zd0DFa#vCPamw8+L6Ass<+qJg-4xYmQwW056{^9Rx zS9;ISz1suV$rFVcC-!dqDKhQ2rqt7JzY|>fmyTtN z>-bBp-I2R%&xeUmc}nCPb6Dywdhe?(G~@ro!^FX&=&(YGqx6-FLUv>JtAw-bDDpYC0(uRNbzr2-~Ed07ZhyC@BC_Bd9lkn{lsPMyITE40vlW%&a+h3 zEa!&rZOy;^Ogg2hu_)|pw?YXUUGHmXz zTR10F;@7$i@h!?rb~LzYznkT`rKz8pNs{}?)k(|QPPXbA*G*s-a5&)3=p<^F6fDYg zld~jGNx0pUv9RmSkBU=ajE_X7y44jFF6B=AYiJ}}n99(1bdjik?F+9&k){S$rmwG0 z9C^L8(zbh-Pq-k*Y=(th8+s+)ZuNC2zc8n&c}reG^!}InOqQHEmJiRRagWJ0viHaI~P067VzMB zQE&I(&SlqD1{TmcNd=EY9(M$Xh`qkN@YB=@|72$N?Rc^NVpnzgX<--b7?Y(M)+{B{ zuAN`EVe#rOLX96lJ8tjKxR}(Co@SczfdYK|IVtiwY;#AW6s~eLJj3>bGu?sKmA)c@pszk#o9%h z&FO+00w0`gEb=Rsw)UGZXaG8AWwsqV05}C#vmTgC$1q&?q$P(Z9 zS61oT+$GM_?z;Ad-LZFtRwH2K+y8&9v^ zeQw3Xp(1#pc|v`C>7>^&PN3biKlDVvWl)HN`J%cch2`n0TOTShon+l6Kc!AM;`>Ay z_w}#Df4BX-dXM)p?_0kkP5STpn%uPaS%v@Gb>?o6CU0X0_nqQ-U*1c6w7X=>;-u=Z zLMi01YjUo@k7KTv`u_*rGPv~RqAH`hpJCj+`!9nE19j9UomN%4sVQz>>$fFo-kCNf@H;P+*>C%+&^C&R+72|OZax41kwb{IIrrNxHO&fWrY6Mki6V9;RFe1+@?Q(?7+#+i`I$(H5BR?>J|X+j>S>*TV}g zdf(D~E2Syhn6Ep*e$Qk-w@(TU4OiBw_VZ2HRT+SM43>k>gG19ky|>*6?g*F36< zNw#y9iW0ncS@BS;cXER9=}&W8KUFUhojG&j?YPD~-6!tTZ{4n~>T57$YSHSEDNX;#;=dX?UkRVcLOp&gUxS-y6N|llvvl2Ht+;02S?5*?8 zKGt0!m$5f^!#m|%UG>Kk9`$T$*Droz{o>bzKOaPYieBWp9;s>2#biE5ZTiOjX(H~^ z>{{I$0$eMObxm^%ePFLYz3pe!;K_6kmwnA~HD3Rp zivFCxeXqt0Bf*YY2hOkWi0XgA&$LiTAw+Q1!$lh}3SXEy;rkr%y?GavSz^RGj%(gi z^qbhZdfxAg%bnHuTMX8h8FU?=U129=Ulm&SaoY2(0gOzE;ujKLn7%!HkMmZ)Lj`CG zto%(zr3y=3X{gD0!JZ=zE^r33nD`kMH0j(;^Qt~{sqfv|rJ;W}n3$a|%VOU;dx;K9 z-6yGH?M(@f1z)q&-8;QY?{XqbkDx+G;+cR80^F=$zBgVk-MHa?iDV-Wi(U6o&1nM5 zPaM#hXnH8UKIF)TC9_3$zqwXDH~M3I{;p7orwRhTjoP9jeH)~xP zEBDzq|5z^kKET2e3R-Qwjr&f~w3w(AYo@>M3atm`9X85Xv}doWt5{yBcEAMny|==u z&ArUG%)S*FbdBl%$F>(q0-!+^^#!ZXxXp{Z>$^_5p`o0qMQhLIr70|{#8(7I*ByLy z{8jCa=7wXMUt%t8?+8x$9e82wgICv2etQ^TyZmm-{oOL|KHG2ndHLFM+QG*hE|Cv@ z%V^0zeYiCL7?;2*gR+c_h$XCU^Y!M=cG=Zl!q+InGUunrp4(D#uU0 z`<48^n@P{YLe?Laea)(uuPnZ0OB^Eu%O5d?kcZnXzA8T8sQIiUBjBL0^T0i2ql!s7 z_a^<(3%@L~A#1beYOC4L*cG~SthPTozJ}!_Q=j`Afrjx+1EF}7H{}<+wZNBW_e@$KGpxfvfdpHU}6#! z+3`3hbB6rEx{InTJYotVi60(Z*s_AlV5!n7W$*n(A_bsA{)C|6w;v1qf};5)H>qW& zZ#}IN&hqbj?$3wX>!!FUa=3Uc@QmI0b&bc@j&lkLdl(jSJ#Oz{bMslSqVZ0R+mT-` z%PVR(dmoLA_u1cfO)%m{s{ipH+r6JwyJ*{}F8d(B z^@1tRb_Zxizm8L2)d%lcRRRHxe{LDI<<9(}p-`~O!N%{SRAE#6aq)ZAmuo-B3SL-uVpI9aNvn6R1Qzj*rR7njTLgO=g@`L&vH-zjO^lAB@7Q0u;6 z(}91Bi{7Rv`UT!pZJ*D6!+fdIx}%l~mNi+E?0>bFKbie`^8H6zOl4dz%0ziz-MCp= z)!Xo&sYUCL`Es{zR*RRX9vxi%+LHx5(79)q=1E<>RNaKP=4IK|^S-*P&Sn4qNA6-* z$($3(-42Uu5_itjZT7Wq7FP%n{3CIJDdy{;{jjqDqFG9u&#u08^HSumPKREm`SMd2 zPVNl8@?uIPn=SX_S$s2Xg=XHlRk-?`?Z?~)CQ%>1{@i!f&6Q(@p23>#m%2-8Ib2*D z0$fAfCe_W*H&~?oUpn`n#zm+3AeX(i6U+Uw(yDsZ&NUuf+;3jK)3m+Xm;K!{j^oe$ z>Q7rMi|%wU(iCpoz!~GdLMg}Dt=bvZ+;dhp`1Iw1=}b1|2b~Tzpffi03v}%_U;gy2 z`eUb-{^x_KpRVq7(LQBck-Xla-K{9myLz|(dBG2$wp9O(kkri%o0(o_zh09w`}o{_ z;i4BTj+RbNRs5{E>e7zFqo4jt>Ac@3J%2$+YEP_Q@-u<89*KY?@r&BE}h@S=ehD$t=aSMC2Qp3 z6!`_#ewZ@j&|!rGWul1^s<$K<8TVPcCJ4NAl3DmPF49`|6vo^43}552&AS-}dD|O=H_n zqa8Q?q+N1iu@UJwuK7%G`G*S;5&stKQmFVT=so4{jo+W1-Yn|LHLKmQj7ypI%Z7#7 z*3vhPq*@)8fQ~H8vUu6Ekjc4gX`QU|ZMV$=9~>Vftc$J-cj@7EjZ4`OOtS zK}!tJC`CQwH`_Wxo znNRo}b>r4guD@X{OBH@9eAv$48TR9Vk7yfL%%xiw+Aiv_D5*HCP;zSa4DS)$apzs{ zyB=9_sb`?lGH-_0oI~uHl2<&leg^ixEY)ZVn(#;PLdMZpWf{HF4{GhmPr+}=&6Myo=dneDFZZi@NCB=?PeCe z{Oo|_3@)aB92s+xeu&IGTEkVp!}VOQo~-om(3u~@_#;x0H}#I;+>F-wPp*jW zVOZGp;CO?WOH4z6>k;-D?^yK@xQQO@XVm==?(kSddD$tSMlwh0krTp0VCxTjj2BiK#_P z$#zePUO}TV_tMI}2cjLB1wMEl=nUSYak(@2$CJ4$miguG+_iUqs8syyCJpYB^^Ns4 zI@|r!qaNDZn6fEMh>t#(yf%{ILr7*n!+*u?>1$qQ3NWqt2RfXkS+L`{X52rM8MkuR zh5nzH8FW3ZL8Ufa;NLIbM~_Y~EtEek9;X!bu-kMhi|zqM1;>7dukO(e0j^t)Prt{i zTfq5RqFIjV)pz#?9yy?*pni+?)k8_`UJ4)O6FpBoI)Ait_1ui3fniNQ4*TjJN zvcO?B8)KN?RSuW9h5*+m?KAk;v;urqCW1S2era~CjLn8SZZx>fxXaRUMpE8ZCF4kl<&isF#ceIqb|@Y=!euU^ z$=tXEbS~JY0zpP|7ORcRmr3_bNu1JfOf#>}vn08G5+~D~Q&X-)ae)7ZM zj<6q|ezEhoH^jC+KN6C#o?#(Z_3?T0szIj@o$p+EAinX^jhe2`Bbt9w{R5@dW0oA~ zyx+9KO=-UInHYU@pNY*&?ZUlFIVw~y>{u7B8mz~3jay*VhJVTo4dqOKuAjD!_WBm@ z@K|K~o-;LE{~xYi`>|=-q5RLQu38p4cZzhSOgW&_8|I@Lm3U>wg&A*HE%dCat>?Kc zU}JO=HDxH2ZhXV~>eF-WYMXf`pjnIUe$zkBpK(>|boAkmVwrUe4PL^h&gX2tetLsu zQNvErx<$d$%|R{A!lfZBAr0$;YIp=b_$-kq9&-XdV?(^B%@72k1g!RYeqw0)|=Rp(eZr%s~ zaUOXr0y^zYzB0=6<@=B8vZjam8GX%D|8wi|nf`-&c#H0){QR?G=Gw)f97{lbTU|9H z#R8{foZno`fCZ|DinUJ}q!>LW8FV)nEA z2@74cdt~LLrnNQ5^?+8D<%1mX*lQ)n3Wm*EKO|bB6y%owVE?SyBjYM&nqs0;kb2~4 z@v~Oxr?*aSn!i)jZg=opZ>IJeMMqUVyBy(rgb(O4riJcM^|buQoiXQ8-^)*j-2Ywo z>CNQa5a=4^qi%Gt)alTLdi_foM^zSyw)OFy_0la^q4Tx&ol=9tHPFVcWsePK7Dodb-rs_Um6{d<1T>r+cJ zR1UMo-BoE;6IyFfGbJM~mGRu2wK|8+bL>!aSaHbIi_2-jCI?At-B7iM>6cmijy@7O zFSy*GdcloK#qN)cy4)uJ?}@0c*h63|j8 zTlFHv39Sr`-*hfisAzzEVj4UzQZnT4mD%eYmLI#cHFMX@li_*`GQ8ZmS`W;&+MYB? zU@gbdgvfgyv40OT37ocPF1hc`=p-8VDrnnNCTspkK8Nql$_om+cBh}bd_?n*K~i(~ z;R{~Mw>jocJUnSnVE6VD2Rc7V7Hd!XTyRx{aaqU=BcUzIvp}n2EZ2QG#nBksqSYh8 zE)@uBExenl>R%h-Y?ddjbik=?4Lj4WH7}VeKdfDAl)!Yc%i+yRli0?y^Ow(_T*IL- zVJE}Ft}|yVm>Nx3XM|2v6S>JGa>3&0-px<*k7zQPj7&akFIaM||v zdDH72xBg$%mU-q)hW2KyHxlVpl2aHKb}e|a@;XzatjyNjgBtA{yTOBb{esImZa)xx z;<`NY-LmQFGm|LBsS`zl8dIg#&QOrym%Q|_J8tuKSph$W&U+g! zDNhCsg_}riQB7jn#d|}|Z)4Yu1#Nq*rIv%%#OzXfa(BblpE_{`sZSD1S`Ak?O*{T9 zOkgd?srgmfTrYg&g_t-hG#yqP@{T>_mT=UMN5H_<;ju{avlGfkG<_r|^xQr;ZGz-v z)oO-gDO!oUmi1$|Bq!YubvjWSr)IdWa5wzZTc2P3x$UZx9;t}S(uuV)H-_siY*dl{29EKYtK$rHWq;oAq@eo%lC-n?PcJ0So5Dlg7L%FN~38Ot%A-IYn5*# zDpv2-@^6Z4Rhc4gcO~Pf#Ujy#GP^lUq7J9XZ?3LlVVk5U0a`Ec;^D%=h2lRFmdjke zpD|g0!_VQdNPVnW%-1V#COPcy(-ULxP?TEJVft12^V9$Lx+CW6yyfE-i;=JJ zh*js^aG*b_SljF!{|3&G+_?vo(n2H5pOxIGXLJ(%H#>N7DpP*`<~4^)uJbhJpPRm4 zV7WoEPEkJVZHH%h5i40dv>RLgy5BW*cpjFc5GDAnk;n6Q>Ef<(%YVu$&926WbsSbG zomuRD+gZ_|-dSUor?Rr@hqbJq(jSQgN(R|(T;$)rqU6|&It@+rRT9Qh?@XQu_lET- zM?K_ITe?K7qOf;^U}TokJEaG03=1Lc4-uyB?H%tT9GwoBH|Fb4u;2SSIydCWPKSOa zO`Q*W#BOT^1huNV`Xqdn+nF|J%A4+p?JxQYnS!rNU00E6aS#E`{1%41oE*sH-hVRt z&EAwN6I^x~-jDq8|MqVF9eYpx%6m}H(PF^Lx#{2|m!pB-om^zLUcL3TE=zXpzF$%9 zZ*N}@jZdE*?R|Ii)vm4+aZEdE)u5@ZEE}>!r2l z+x>q%sXMpx+}HpA*3YupKS%Jt;&P4EN9V0FSW?#{EA%F#-M4>}U*^%A%%d5%1HRmx zzP9Ufx_IouM;u#R9YQWn^PAy*k|}*B`;sT$wyoGUC0M2^vin)GRxd}zDktThei@cG z%D$(5JXuz4m3j2+r7ojeH}`3soAEa5=C{(LJ*PwjLZ{pe58dkhVEX1;rt+ILgB~yk zKM`RyE1RwRsCBn!M7Xq<*M`pPVM`9InG*I#>C$>Lre5wHzZVwn>ROi!sP&Ifgcy9{5Z8#`o|sjo!m>7+xyL#P%WrCx4x-%=JToBwpjA|Xvc<5 zoVRJ_x(yoyGXfOuUakJ}mA5ZlgNemVNnzCuj=p@s3_l09`*W5~ye9tR!_JSYmPdbS zwf?#1%jKNAwUE^UDnQFnI&XV8FpvqmX!y4oEr`tV|5Xg{{AtRiI-ER zKG~UBvhBbwCV5NqeHABn$^VRXWU8Acmu38sZ|Zj5=H<_`naAvMq~#`0?*NF#k-)mo;3{ zj7*PJ6;?^;XFgZ_@K}}IA3<|l%lv=>i5a=O1Od#R{vS@{pwx%T?Y&dUGGoYTnA*v{f2${+co>p%hP zHJ3kMZatiL=!Gdq&7Y7_nGGJQ26(D(Z2q&1V5%YKf}DcPPTbh zaxE_IDak!LvGD96vol9!HVJz0TUnl4eP>hV^iDBlg;g5MrgEKhRERCFI`&3JEvs*> z$d4ziAJ-Rkg>6fdnEdJUXM+%P3$<6gn?(LR%>7>aj%8<5RA52>Y`wSI(~o8SzjkHI zs*fBwUJfA}H5KoxUs!X%d|gJF&El&{A69Zdj(;MuwZwYc4I92Yn`dRY$7U?@d$4U4 zOJ2Rg+8tSrp|0B7{2RaYU6PNz{Cp#yvO@v`W4#%F!}9>9T8=pd$!Fs3953Ws8TH_@ z_%Zwc%d#48b=4ot+j#iMtuDF9y`5H#x3h$IJl<#VTvqcO@|jj&JFArN=UcND-vgYfjuybdYa7@uxSf#Q5xK_^G1KZbiREKTJ3sbw|*H~iMI%m<` zwUV#a*w`kn*wZf~^F!HJ>!(WW?fL80?r@3<^xR*qZ@gE^W~rzd6N{Uo!YYZ@UBzK~ z1=m0QSf(BpvX5hzw!N*3vF)NmVY3f>6MkH|`&!tSj@P~qI`4)pKk#Si$F9Z6v$iZc z_bq?Rt7x&~*JFY<1}fcGG4NpwJZezd>zkm{Sik>FZGZC3AAhzpyRMFqx(JgnXqiYh1OpZ65kc^wm7ICIM)TV2VoK9{(Y z_WVe`;#=_V6swEqRDFi0{eBNV2ggPjTKz4XZ~0V2-g^JtV3Xa6Tt8-3&e)aQr>iJ6 zdD*Od9iPmjfrT$+uZpa>(92cxWKYE2w8hmw)EJo#iwcDDT)+N;<(SBhulFpzY%<*c zTKXziP2Q?Gi*7wD=enPKyW*2yD0k1QA4leW$eqf)gk3|fs3b;d?TQ*%7a2=qzg;V< zSQ%K{bQD%e6f)1*m(_SaUg%|4uyi9k>!qz`^0w~}-v7DCtug#!q)z?`^B62p8lrvB(Jsghp_%xTzO>|K!o{w?!~Q`$MbuBl)Ky zSJ$&`SL`X^JRq-Fx7u%R+?B7Vk{>O)9c8LHS<=37zrFe;?Rj$U8LZ9tHsNju6ixF%Cx8}Z2R#is|0>L zU1O1yCOTECsF^8#pNXAGYV-Y%iKR^U{u+LomVNL<^o3QNOXOqXYkgu2)`w0unyJXO z#J=zO9qS_>d3_rk^qCfQ#cg@xo#4Ur|N9(|dihPE8Xu;5KW;AS;*z#^J2`Kv0o$1$ zwQE=(r_Vh((<<}m#=?DDlqT2l8lBzz?8x_J{6-DQoB|nP4j~uUEWgO{Mb#j`^Ly|& z*6BYT|JOyhB z_ABfFJ(ja)e#45SKWpZ89$3b@ z&ra8GPv+&_Hka0KQ3oH@4X z&G)|~)-i2<*ZIG+Xid!A`)AJ1aA0Lx)WtPx&5=Ez+ncxFoqm1F*=^B{BCdP?zsW1# z79YyQ{$5ttZ1t)~-^6BvjWd|$Q1$PTyqtLYJ)>*iYv=VkWIdJk>-g!tdFF;rp%p$3 zA%T&Hr{1n>w4Q$K{+wr$SKj7_oHzb+Y|D?`o2%_kF;3;Euya~1wN`d*mOHolTNC{a+S}Cg1*XE}wPUx}NK@^2^V&O{c6DH}=n!SFg-)Ez6ZoK6Ky9@@Qmo&H3XjO5g6<$$i%l&=soq(>Hh74UU|c zgxsjYSzD4G`>g$wSEYC3xPHddGd^92>e`{3<j-cC$!^-YD}xAqsO?s@KG>H4i!ri`)ujqw{}iT&w}zAtC4xyEdj zd6cuTYm3rk)(LUGv)s!-_>;b&U?rV$Iue+j@)9yZ`0OkMDjeB57VQ zXW6`azY9OaJucB({xVL%^r&{^uIH<2&Ocpkr9a7{GVCdjEhxJ`Tduyk?X{*^#^b}KEc3q3n6c-p)%+j6(kwy2 zLD@MhyF@%PkItX>LNPctt2b@C=Jv9CMzinTOHy`F5M~T?RqHi6JB#%a|6X~!?P(2v zvi|@3QZapw(*AwDX~*vUHI(|UcW#wwtisKwij7mk{+#Um`1!TmuOs1a1ugRP_I%qB zQB+@@mZHYOkrU()ve8q?S|FqGfVh5V{q7a4pAA~|Sn3Kw|HxaqiU*WMYCqUJV{I&F z)a6^(wv;7(U;oZV$l7-4iECPo+|Q26%ZPtJr5SZqbh6@xOvb>Y%X;59E)ZpUxi%_( z{V~D$Z`)SaDRqKQV)erA=93l|Sh6ey_#0baQrrjQI^K z7S-AsDl^^XSaRFp-yfCmX=To)M`|x+pO34rk$J|b`J$xw;Ir9NV-gs*E@j)v zzNEpfZ(B>H_oGzzsw-D4Odr0n{J7`v<5#VZORSbFIwZ_sTGW;JN^16j0M@>}igA@C zI#G64CQH=#G_sz4BXEBw+wU7C@}m7_zeD`T>G^ejoV35Sj^Cb@Ck=aD8yvVef^~~`7e{G7= zo+ouJUjP1k#c@G}3uTRGuN_&KJAd&{L4^x@57^y4?jJ9#e{b<`z2syzv4Ro@lNbx>-8P!Z-WwF{+&KY zZqCnrn;(66{Y(DfL>7)G3J+Fw$?Qt$W7#F{(O>PO@A~_C_n)=9syF+-*_q{A^Xibr zlMKtFY71(1S2un++&O1a^}31gXU>`$m8NXK)7YKg|NNhhorUV9+v{^@i+F55zr;Im z-kM=%yFYCX*G(AYBCgjiOd>8xL z2bL*5jQp!4CNEoi|H7tiWy@MBm)dXLUz2I`(Ea1zmlOAG%MDOC_~*^78~=}g{QmsN zpQX}wj<&OKh^Q&7(panRDUC z0XCUM4!hpeEYCk)tKD9~X?AFDq9No)N&sd;gqKlWX=e!q8maLLou<@Z?QwoRY2sC;Xn z{KQ2|uUJSoeiXE*_LC_|k*P?zYQM-oULfDnwC?}%Q01QURmEaVxuOE0TeccMb6w!r zSn~e0`T7p^e;WI0m!|9Wyqq;`Akj`MM9M{dm0N(SP;;tHuK64p)Z-Mvdw3gyO9= z;vVHLd;QJ!Z|{fq=lU`~U;lgMJqM5DgD&%DQjHF6O!XgIe!M8& zdt&e9ou8i{eZK4%r+L~9*Whyj3Dx^)hMo-TmU*@4Gi0IKi@QmO%Z_ zBNexUm2F#BE%`6$dA{8%+*Hocc-nfYnQMiG6)xB@2D<*PN^)a4=Bu!`?)~BOeOBwU z{On8T)CAZ3o8)ml_y$MM>;tps$+YjSx^wQC3orMcpI3gI>}fl0BGYKc^6jqOy-oFd zo}T=8WbQAEUApZtyEXcDD)!BhoPOuxG|idpj7+&g0-;-0NZMOV#er9FOaf zJ{m9YXB=DR^ZlS)U2M(6NgmUSZ*%l)KENL@TEF+d#r(@JrG$T6H2rA4+|+DVBL|P( zhdHs2d4C_3mJ|2CTlwMOvE-I7?^(p}iyglwaXd!eSgiNBn*{S&U=5Bwdbu?nD+B4nGXtCqE-^=Re&fWLp?)CCJ;xCQdq#2o5q=W=QO;|D| zm{Pfy)X%JZ`0iu-{_B;Fw~EVqzwFzxE%&9Ri1?Y;cetv5=@ve;sgKTzu0Nx`?S_rm zp6n^&$*&!inZB>-n7d#2<;y*0Os$+t>|d16y5gxPw>NYN>pZc_U;4JmNqghp$0hz1 zzgGEFAY-k=?|Hi~M`;Nw2W)nDUdaF1>i^Q*ODz@m^5&jV`aAto_uFkUl4tgQFJCt0 zQRn98CGVPj>lbel%vgKibNS@pE!!+@eRS^roF7$r?~WYbM(su&mP_(qxTlx?+bpQy zut1h+QCHcQgE|~3DjRY_|NOdku0GTIf54yL{hiF;JJR1v`QI><`@f>%N|>{bs;x-z zv)IDBi#+%jdI)>uCw?4GZ`3}ShNHMLPIWP zqzXy&Ie2kd@qgd&vL-lei7TAG#b=I-9jM$7G3g0$^x6XlOvwt%eQ5O@*i5OQ(v zR9jAg7fuh(EuHw!yT3Og-@9MteqK_}?xW88msz`SyQws7{i`KHFT?td@*fd?`Fcul zh2Hh5s=C>`9lTy&ie=tr#1f<(?0oru#7zzX1&0QP#)X_6T5WFG2}~?p)MV>bH;^a`2am5qh@nXovoP3+Di0=gDNS$OCU!H-RZzj9!6BQ)MRaXu zYo`E+Gm$ASc-2~0E{!gbZ5%wo4k3m^$$-v0uEFcid!+3Q9$RGy=&K-^m zexxoqdUSh4BS^$Ri81hK$Ah`kK(6c(|FD2dS1-;1EQRU=E%6(Lt1G^(n<_mezAmdU zYYQ|MGol^#I8)E&Gy7i5D&gTrN}MP18Wd)>iqp46~h zB4iVf$*xIm+LJ-H9t(E}G2D0W95~jda#RGgx`it(@BxRS0SjZ`QGoznPmtEB+;4W* z+SDCC#hayRZ)&ymHdqG>hl!TLs*EX@6Tr49aPBFJ=Mm-1D0e*@rUeSzp2-a>lIAR! z+Xk{sOQ_(xyX#rMlUM9Qr>>5GSi;A&sH@PSj0?nD;i<6q`{M_Dv$S^niVEJn_s!B@ zp$s6~S!Rg}gqpn0Gy$uMdl1>*c``bDeSok-R(aMgSZMe;gj}4nbRsk~K72dHHNA0J z_>B@(P)a&r!0IA;_=>3+$XOv84^Fbqid)z)2@-pYnHF`qS@MGYG?m+DmVo}v%|*>p zr~Q5X*KUW#B`;@(mQ<4o4@kd&2UA_j+G5F$6|dgxUIj8EA%kgA*TRcZGr%4dDfsT* z>Kh-u>00>hs#dV|0xT|~&JLz3AnhUA4?cE9#jkBR1k&2zP|UQb>zPik3&^Wex!>5F z^wxeI%XI#Z>LsQPP}_YuI<#g5n6QDg3wSWCzhQ009Jueli8vfpnRGvh=x29-x>C*m*$lcL-lV^-nQ}x7rSWL1GtXG^|);=*0}O z(BUdm|9wNb-Og8;y8O8nbeTbw35S4!!G?wvNeNEOpd`=GsPf=Z{pkZn8`vN=Ix{Wm zYE$5KhWMhwH}ffXLhjFLjj53QGD|=p)MQ}>4>$^A6!!jo`1IbtfS*bg3;t~3xs(L+ zXftPr7Tf1y6OfYyJebbkG%dT;#nO1r$fNrpIDS|-c+?bDNt`)<5#(wI1ZqJ{$uOpCf0Kgf82yu&i-!0B&Yox&ahKh`=#@vy)1YzD>#)3n5Il+LcW_2d-ql>Pf0qJ%ONZ-BkS&{)UnBKr4~Wgkcthf1UKx6ZQ; z0ukW~x}94Lpw4wb@$;kx_Rt76X^{;EW+xswgF;;4!rX=xi>%eFLD9?5$jkNP_-Ect zKQ0`C#vY1yr*hj=F29kz8|0G2#w`YyKEYzAma{|aS5mP6*gGCfabFT7b6gI50?&7X z!?TyGL(A;cyd@m?xtZ(|3_lyJV@(C>S_D8=ln8?y-$a?9MNB0qEGWepWu{14D3L}%WkU(gT$I*1Kf`rLT^ISG~Dp^OUz}({P5OPs`b~Ds1 zZ)0!A|KxhH?oSD`N0b)KCGL!YuKfvR>fp%qe4ya(vxRS$fJgsTAMc|ucW5ZAdLek` z9oQNL&K(=>8@&iR@K|eC%O*&+shH8Q;!&c+J{7Pbv0OiXZuZvL?YVUgI208w>~2`G zsNC2clp-9SGF9h^|F+)+nz_)PFwHB<0Ok^L#z0s7sBe&D<#|9=bef|-lbDZxOqm+k zT){b&^Jqf@U;V4alAsu8U}U<>(V?{~a1%c$$OJk*6fX-kSa9HRnM?sgJIEe} zMlXYxSb z6=j80E0$l^0{iSBOWFOh4Uc7G_a1mG7i!B0P7?|jrZ%itq^)KRj_F2$&E z83T{1b-sZZsZ=)4rO|@r*>exokwD+>cC zKQ|m$#_A$E+iVj%*vJk~xsXIr6Ges3Sxy%vK*1QWr(wmSA7a`QK#rIt@Ig3Dxa$}P z_emv?`Hb*cez5KtPuK*y7jQBLx(at41Iag{+TSqWV0M5>n{_8FLxbX5TJ<+5dL6zp z3IFYk{415glHjYnSOU@&5Yc;}AJ=LgQ3-O&g`NYauAc2lo^py+XUQq?hEJf%1UW_< zPqBt|XlcbW@=n!XmBDez0HiBmTf>S)Z~m5&KpxY~%^ve!#1|;mTfy5OCxC zE@y|e}>swG}8{GCUGyu2`ga@>KiI z;>@QEryxZha@q{h-;fdcm4#uJz>dHB)Z7dqjS-C)hmgRE=BeP?_AJL4@lX@y$ln@^ zx^9Ix`~rJLn=#Ne+@}nbI2&)VitWhT|4sFR&)-E|X)?V|pv=?C-J!*mzu^-o<`zgY zhKHIwj`*(89e(7})KcLU^FUF=QKG7_>P6Q{Kd|3-J5&`Ow$;vZ5BT4}q_pi!cl56Krn;aGASGGVa1|!BX)4=+RJ2qPu5(2-S(QP-*q=+?3{Ypd>%8{l}?O-uC2b|Mj&f>6bhzs zYqMQg{p|wx^U&yB&^EC=)1ofB3o_vJA?_Mz3JNso^*P|E4t5B+s6OW~II4phqu=+w77LBqz3I2`jEx$Xg8g7k zr|V3My4J0H;{i&FEZ4YpY&hig!t=qB*;Tjho&#Ie(6Hi=6e!~}GTCxfY)b1-*!o^? z)e7u&t3qt(#w_2r9IxI7J(wq2`0kG0_pOk2fWn3_hmb^7P}ndu%CSDv?~OnE?xV!+ z>sk}0o%*{vTQ}}5*t!M&jDfE63;4hZY!&Oj-?LVo4zKyn^zPq_d#C1sl{_eCTGVyl z^T&QLZ$Wiqa(>5A?Opfp&YQ}$X7oW3Uvmv2?+(cav*0@yr@rl zR?tMn*6v4tD(}9}JKx1}$vWxXj`fSGAW54=3e;0Pm1zJ{xx)8Bad7tPh`q6#HRV;| zyKi=aG9-t{(^3sp=q`6b#xLRwVIA$b)h&L!%yRouTo% z=qpe6m1)O6SXTYWe!bRyA5l=gVQ5U`>dw`1_Jrkb3`q9L# zt<&1!A1kr?(r0gI5|gWh zM{g{@PFr6D4&4h|8dfaI415e~oH#sXn!o43XVceFOxy2@%g+f4KM77rj7-jA0--#T zH$H#@EMWElTkS{8bp>lzzJ715{Vpml_+S>O`NPQMEG`hrGxr83I2Btp&X1K&zZVpH zwN$L;3~%9;ucg!0Wq~aPiL3QU?XjGZ7;4_VZmHGQC_Y|9P57++uL0)^I?B#YJ>+K)D~t-m z;SCIpiX0tUZ4Fr-AR`qvge4r@RPk6pd1-stl&uP3>pRWo3T=L;xmxQgBtxT&n=!GT zn=3tk$ASa9vh-d~7C)wGew}AQ8Q36$9LB(-8(Mq84T!7UHFc}z=bVmYIeuSa{>~M1 zibB8zGE0=E!m5naXdm#1otIF=?+aZ!<3uOc2dCc?&9^2^Ywn3*Is<>e^O* z;t!a^0$QjN|Ia9Fjn=|xS=kXq^?y!w7JmPf#VFzj_Wm)@uwmX6Kk!gUDYwr~(|a{p zOVo{S8HrZ>UjJwn>&$a^w}8T?!6A-mQP-YdsoOvSKVkC${j_7h&!61c(DnS^&Xt8n z&UC$o^g#q9!WjdP?kKXB1f|3)dLMc-KkCb!nsHm}$G52;FMckXz2zq)U-q!Nh)SBD zzXCE|!Mo8vPT>CBc~8&0p7W(XUiiJ`=5v=qA#vmeTFp9j&u5S}hoemI?Tq{O?R)g= zv!?Cc&6DKKZ3rvK?iAGta_fGEFF#_rJN=rR;OSJ+@aO5&N|M{bY5O6yk1aa40N5n zD^U*=UIDWYO#1z}^!RcAv@2odt6$qz`|bI*!(%P1pQkJ&5Zc3WFB9a4h67QJCEW+3 z{d%4CA7A8Z{IahNw1B6X;(FcYb0mWI zSZ_P^P8&R!5~cZoZ9>?#qf5Z)E~-&Dujjd(+-30)Zi9QR@%7<*9y~AV`j}R32X@4U zK*qqMZk09QF;R}5{Rd3BA6K>?=U*rF-#EPdSp3;{PehF0uUc2Y3Mv2@8q2slv~Jy% z-wdii8m&M}p~~mnt292bH*Tio9MKImq0a-Ct+!JX(~&;M*#oT-zvyqcIm=?p|HZQ4 z0aX?bp3n!L)<*@`_b&IBd*!)G`cK!-kIRDZqz1>{7X_C&KRI@+Qkow(QxlYWLNp5A zE~@zV@Z;W>qSNfAOuAg1xW6Xz`9CRtX34Jgj^LPbFlJh}D&yEi4M;%k0MBo}a@=^^ z?69r(&Bf<;n%}F+nq#{BjaDeQwa&sNP!Q_M=o`WWwn5=T_sow=}vth*|)m{T$a4cO|>~Koc?)RgLRap9fKNqgV_fHYDRF4Tc$V5?KwAfb@c`23C3{HnS?7vJ~pb+5f|nUq%Zv(oq^!>8AN9RK|2Pi3e+8+7#G z537sl&+h@O5cAg_m|WJ?Z)bk*%aR+5HksGl-EY;mLyvE-&9ZxWy5O>xk%^U~LyIe8 zkq{^`HXJz2BDdSQ=85IUZOe~@3Cn%UTo|txA$EVK(LO`nXL_1joKivc97CfNtBa^< zS?pPmJpua;$lX4+o3F#%-tt>@$jqa0dpCT3aOQB@kxNrk#a3v60|;dVrAyqye_h2# zxsTWWKGvTnV4WB0wDWY>QO(VdqQj45ZuZu2=LH$;&~TuQ#YI#)=p(p*6wvTdxXbhD z*I%odN3*}3{p2au9e(8G=0_`DTkqG~xqrhm4e?&(K4%}a&4F6Z?~Zp_ae3$2 z%gTDk%DwZY_kQWK$j_T&ZGLXHc=;Xkeap+CEu{sqpxMK(hjYO0IMBhmZN3Ei8yWxk zGVDI@{_Og{IQh9JuYacRkvB&Rzc%g2N_>9(i(bF>v+9ZNhflPDGCCuZC3lBb(Ytv& zL8+Ocu~5L{;nC#sj{CP4ettdgcIl++~NQAHaZ)-f&Wim^_=hbq3ngE7!`Vs5AiC`Ut69}9=TiBN}-iP_K3%!Zi? zu5CF)G!<59Y+Bm|szH!6?BwduDtbGo66{a7c%u@li>T|i&_Glh6~Y+fI`5Mh82rWY|{d_5WxNeTm3{!VbzJP#m^u$DO|iuL?BcIIyned2X=ZRXjv*~ z3kbM$gNr*%WLngvbbFNss*Mv?H>^;)er~2Y+{IvqMvy~DU`n*8E5yrSgBh7vilDnn zK$R9)9VlHfGP!bfXm#bRUIcd;m@yjIqk%n|vPX-N(P9Lt$Q>=SM=MBJ%{f{@j#iMP z7363IIa)!ER*;~6)@ToMvN5@8Bjf2sFsL_Ea@Q@m4G>*8o|0J?9Ff5$z>Eakt!T9Dc_nfI;E8qXEe_uL> zapuPfhs79keSJ?mez!MUsc|D^f6&E_-2ZD8vTp5_=UG$95)z|fgC*UZ;9zK&;kEpd*UiUEpDeYx z`9El7$cM0R^|tS2>wPyy1YGiGe{u?2W;E&-7;J zdaK;_e_Ny;Ms8H7IIgd7<91=av^HCh*q`((_xe@@XmBtv9AE_{!HH8n)0>#<)h6fu zI1sP@`}vYTOwQjf*z0L<{5aY$@nWJ7$kc0~RI8+F@!>c7{~R^@#FqVco0=Ss>2stM zIi7A<%GB1z?#af$&~RfR0|P?`i}jc1n=1D+2;9y0HOp3*dQS7TeHe#?oaDFpii`{l zM;KWd7#xn@;N35~toUZkh1v4zVJkeId%1FZvjlK3Ffar@hi1FnX{T=-+^;QU_}?I+ znxU0}fk7Y@rPIlq{s2e%WK3dWujBRdgtPBhnGC`*4PM#9||765L<@v9J)Fxj% zxR7}XBLjnj`_7vUoD454UVoi`$<%aX`~Qt^t}n2*zpBrY0@A7p(zp%tuhL%HoTkrnV zborN^z&feKYOy*0zJ*B>bN4VXEU-P1#>6ly?PJ-mzpp2My7X`TO+l}vKf-tz7;ZI( z%Q7@9o5KIUY=LWS(@ut;D@8!AjQ-HY%y7Y=`|s_C^AqcP7lXp@R%^I4Lql7^4}SlZ z90saCOj#KiGDPFHGBQYAn)+Jpo4nHRty`2B7#JK@gF@!Y*|MAImm(Eo%v>&B(_ms? z*un&gpxC0BF&j?HtxeQsD*ngJz#w48#lX-oD{{S6`~PdFpYNLDbuo^Sf#HxVBLhRg z=1Ujs*{*J7c4lN`aJT_VEm=u>U;6yXm-mjov4)j_p<%-ZFFuBVP_?<7RhKWueaoKr zt^O@YJE*7(n7a0lbNY?-wrd#}7!-J7v>6z*Hc41r{C`e!JClrzmBxarK`Sp^ugaRV z{%6ugjoOj`09li2DV?$WO!ikD}u^g?cUTfAK5B6GF;`K7*R{j0eyDy|4 zZEz~w^5xq9y_xTC-@bTg1p~uH7e)pK15LjF7ZcYqpFRN`78WH9*BBTw6veEW8TgU~ zi(R7iCW}ux&SgK1VdkaMmdUPG+AKbAXDwS-Q*LlXfI+}6?kOV!Uotz7%j~23*xUKJ zP9_%Czn;sV-5Nh7GP*&Oxvjn3#KcI0!Jz^aKlhT_dsJi$9_iiKf6m~5i^lz5>B7@~ zZ7^%ES*Lv?!y%f1p`|^%lA&RH%AeWhN0^JH?xeHsT;7%usIXA8T_WV5faKGrUZC^8I|IfL%#j;|JLqmp!>%ZMQKF)Jl z7;&NTpm_!-LjxNqSF^ln>veYjeb)Z5$=teMHM*bp|E;z95T4B1=v$|l@ORf&6&9-# zzwYhcz3fN6=c5oOK?VjXcSZ&Vff<)fOQ?e{Nq_aJI+}))6aBc;U;I$mB2=6uM0}J__EwXw|XnMBeZ9JHNepkSh~W zeZZN29iQA5zV`peWWRJX99BNe#BimJiGiWv-+!@9`~GoH)4iCgt#`3!rm=|oG_DMBphSA%$~)y5HgZif zH>bTgr@y|(x4(Y#8ioTK4*a@#rgvqmd%+L>$dw!$=D%fN2w=Ql$-p4<&pDy+Kkxl| z8^iYc;*ZDmFFjj3yX30+dXcPjZF9>%?dQ3)r=@M$&d|^~k%6J1#e36!2B*6lYh?0@%1;J|6j zz`(Ggk@xrF`}^(G=iB&4Z_B&%@%Z_mpvW)t_x(S2GVPO!K0^Wz7X!nD0?lg^LqqNU zoS$hOz2dyi{}1_x87D`v%(!$kYM0;X$puUe+dr)0XK3Kk`Ig`QU(z_8qt`P_@BrUD zIo54`$=VDIdwSn{F);Wv9j>of!|~z5Vg8ldw}*Q=e6f!zax`pHVPgmYd0BgdT6R$R z-My1;)OX~l9e8ERf3mdf!j>2Iiw^&rJ%Nb<+<5kRG3)iZYm17{2^~t+X3GD6`t}o} zMgK2OIs3$ek-=k6iQVn5tc(mo+H<|M4^Me>IA-6Ypt~Q^=Zi)?ZkGSGfbARKi{tiH zQR_B3r_Fm&uQHYY|Ke6bMu(uv%gerqu`+n*SZ^rVxcHB**~j|B-{r&o{rfLOaX-_) zvMsl^sP*gL>C65V|CSFuniTk(|BWbvis=1?3i!+p8cveH}`&i^g` zxX)h7a7kqzgNnrcr3?xWxfU;WI_YbE|HP61W}D73nAiNP+Nm)8q$a3NNH>;ZP*|D4 z$k5QTS$d=LuALv})gQ||_}2c``#Z&A*_V% zobkpfd%pj3gY#H-{M#ihV!q~2_xzdvuK)5#ba`+4?XK{@KL_SDE|A!ISl@@SA=`t2 zfuTv4VH>YPXU?nt!RK=Xt@7`^nVekuV$+NNA^*S0U%Y(zw(yp(XJ%OjZ+?E}+MLSG zS6|n!x#u)rl=;`MUrkL1w$1;>`aU}8=+d{M43kUWFk(Vxw7E>{M-LEHZcFcDR1rl`T6kfJ}{VUa_67Be+(N_+0$Kr4oO~qVtsPapRhffXV+C*oeW|OI}r8v!m9}W zEi4c0KrNAm|9>4k55KMdazv4J!jmID%WwMrXZ?5m&7$ISuYN47Hwxncm26vY{@;5> zhLIr*sUzjTuCh3lTnZ|eSkdRqVLqW-x{EjF7pEM?MQVR&Hz za+QPLvw+3%Kh>0v7cIrm`==seb2XL zUcLVA>c`{fg&4L-b22bED0o_*t^YAuS2td`?b(gD` zzvvTrfAe?!bhG{RVwOv7?m4TvX?gn}o2~u-&gv2a!!1x%@<8_}%N9nR*s^^B{Nk}S z6RplpGPGRuUpJX`=lk0Kg|XWn38`K^)XKf3^0iv*pO5GM*Remai(+74$lu7AZua6# z>XHACA0KEadA~N5coH`NaVW z87|ZRZ=LXUznZ|hq9^lB&K=1yJFxS)PFgTS!!%F_%h|1aana31#gF!S+jKsg7hcc! zV8$aG*~OJsp5l@5-T?v?H}%>6+=-4ac2bypvgk)XWAyv)U-R#+w=7QQ7T$c5;kA6c zyC8#u_k>JlhCNFI3U)IXl)sZvjPr|Gu`JRtA@8G?uHKrg9UVh?yea-v* z-TVGuxcTtDkcG^@)ti+X&a!r#Qt)ATw}6#_pe`c0uHv0yr1ENQBt?WM+D%!~WJM1XP;1B_7Z}2_NV`}*Ke}~npimgYF z7jOR3dMG~g?F+HF;W0`k?T71k!FJ*!z8BsW{M9J%^s^3|f{ z=}XGxrD_Xv3fuBz{!Yr%S#zc2vvRDS8x5d`*q2mkDFN-dKWP;Fj(}g zp3U&gh*@DzFOa%5y+_`tV#v2s!8(TRfj>f17e8(jZaXWgi(%=)-x0mp}jO6<42-aPpK zGTUBt%e6zT+~76|!L>{ zfB%lBZVPQeSxMKXxRGIj94PeP2TX`w&5(YnTc$dZpJ_|<|Kd$qCq5lo-n5ND=3L&t zm%sDZhsN)nUdh1l$_ebg*1+RJ47Mr^kMe$La)qwF`2XaMgacO>_p=)_Da7u36r>w_ z?A4L7&6VJKiP2##DBkWZ4A8MK=MeaK?XL7ag#(r^FI`?UxodN?lEbBT=BO|KFJHg- z{k~>+?IW)!MusarObiSOPOj~@7~V8A{or2Adm!(x|N6!6_e;&@p74d2vEOD_+Z5mS z*#DM6(3YUV!ocIV7zFAQd6;ahZ^wM8SMt*FWq2wG0edpgy9(LZ^dk9UD6K zrwKEZeYW51y1wR=G}9y#VTF!=n?LCr<^8zxm4}5TK$Ml?K;g;|ua_ZFH+}qe`o#Ur znZB#&?yFP%)qnbLp1=A0#`CmGGasyXE$S7!>&fuu&3)A)_X~YR7~Wi~uj{z@zw?F< zgEo^&cS?aljSAG~##|LM}FJq1#+ zZ{JV#OmE)5U6gH&M#6ue-|5j88S^&jGOWvCy0N=_{ew0)Ge(o$pVr51Q@S7*t{Ypn zPcQo6yZ`ltZd?owrXmatGd4Qc-`l^^eo=K)fpdQQrxGpUTZ#L_zMbDvzfDwj*{}b4 z)1(%p9(}Y_GL40My zjAB*B4>9+Po1|Z5GG>&2skgb!vtiGJbGbjCYU^FSl)Z@#hqQ|onvTi+ z@!tMdwubfgf*`F20Uwq8s~uu?1~DiwKIn@IXFTUQeV*UuNCq#uM8q^~EY z7jwYCfkF6@sHK3Sp3EQhBxla$Px?9j)jRLmv5E6Q8pE4gC$${JWoq|asZDu$eq;3i z%gQ1%emNzkzKLecc^dEEAN`hRU9yBiL+6I`+#MXz>(ej()cE?X{bZM9*p(A0MN(37 zS3aDWAi%$k^FV9Tm2dl=zlbes*~%z$!}#a<`E%dqe5v14q0igM`~A_0 z*x_*b>$ykMd{=W&{&!EE3%CO+Dj#j?lPm3?#+ZBKOzy3^e$z?~y1px)gC+3`X zb9eu9$d_GxWoydwb90-dbA%7PoA39hxa_mNaZ_nXHtUbuSFUf3{^+%c<>LSB&VR=z zZe{#)@l0t|?eQn`lUp0E@7cFN;t_S8!8@(nqNpOdolM`sf&T4yy`Tz7w7y#t$Z~!ySNtT z@h~l6c+mH9`JT_obK`!7uimkSHD=eF8c^Fq@t)eRsLUfKXD@jk?cTCugPsQ4jo;r4 z89q8QGGr)Ae=$F5|7W+=i}jLW5;Gr(Gu{vpux(9Jlwf(mWX8B-;qL7w92;`nv~FGe zzwyxorVab*rT?`5*t~wK@cEDxZyw}lG6XR?*c5Ux-cp&adACU2@>4wbZ4ra5)l#~Q zg25$Acpse9jb=5Ua+~4Jwf}Qw^seZr;yTdwPw;Q~@f2O-M2+Q4=d{-?7GOBSvVKFO z*@o!1HS3~R_^$L#lFDr0kX*{kAQ&viA~F5N|A=V}GnUD@PIUc0T`yW`$Kt814Mx%` z5qc~aq!?VJSs4}_eIt;){nm>4e|P!5oaH5@z!VdCeaB=mhV&Z?)BJXQIWloAYmZd- zzxySpdz+#UR=Dk*C ze9#qdyR_uDe7LxnUg(vYzq7xuUamgtB#TMjrmZvAhUD?i2;URLu&9-Z;ewLPzr%-j z9XO{gaz}$9f+^wsfjGr~eU_GW7yoZu!>ZtQm?8JY{W&`~vzp6ZZB%MdWq2l@zgU-{ zLn6+TSvP_Czr~;S{?f*|$8ASeq}3W)DdJ@uvvqFK~c;7>cy%x+&TM`F7`S$?Dk-=P`38pnAZM(a@XA6yZ1{z z_pbTl-QahIaYn~kmJN!HTUZ$89@b7*a539>@AHpMS>o4Nw@ugPWC&y2rTk8p;aCvE z+)Xd$Y%aOk^&(f<;m5B2kdzw_@3XN4u`pOQPv#Psv@S-x{Xbt~Y(jMagTs|0wu}jW zy63{xBkuo?-|$J_aF^8`CWCph|8n&Xl;{dHe0y}&NPsCiaQfK-?z^6AxN~g7%@}Wp zG2CLflfcQKpTs`9Dw5kl{TaiJ3-*itzfhUYo#5HjJ4R28Z7TS&Xv+y8flNzDSHs z$lhVZ{=o7XgT>)i$A;r#x5bbC|7HF@+~5CsIRB!(d^{STo{8sO-u>i20>8o|4F(3^ z2L+O~Yq)vB9rM;Or3fsrj*(#bQFk`b8q~y}WxRcJHv2_M_HP=WP8l=a;A7Y#w!Wj0 z?dhM}^^5+0Jh1D)2NAcMEDaeaEdm%eusEz{XN>xCpY1+3)iY4ev#W-K%MR6&eqb#uhP0!o47XgvovVO++ZmPGW_%MPuXYxFY;=AoD9jI8SDb~#4#Ll zW@K35JniKFb4jrYZ@E~_xfrG~+_2sd-eE7!#juSvp~`SiT-(yq=f2NZW#Z%USbuyA zLqd)i!&(N1ii)M&R}QxQKN!1)drfaHV?nC0gMBW;xq?LD1D;&!tO*zErT?(cxN9H! zX08_(0|zfF!veQ5i!Gd=3gllit(GoTVcjs*m*L!rxeIStZ>yMdsNnhZaG}4)qaW4$ zjz1R0pkT9S7i-oO&*IEQ z<}h1HRwF8xJ+vcH5O*iQ6F*L=6_yY2CVCj}+lqU2{RICW zciFanYVor`28LOO1RNHyy%hQQKWy{7+S}2&g4dSUZE~Hz?_Kajt0|Fzk3NY`f3-4w z+Y9;n4=w-t|Cf0_y3V@m65qz+^uOEJcBqM)Fp z+23n?nao>|%6Fjn3}ZnXcQZr3?zQkATV~e_>CEVm{TCa-Xd!r;gJFT82t$LGk)~B@ zRN@;@lQjD3?fYKSxOO~R_4HMB-t4g2xA%^SGI13xW^Hn8cvp}p@ZfjoZ!HIJ-^kq} z1{3A&HPU6HV-9#ZEN}!F6r{P&=g^Zw2kVu@>;EX_-rMDAUSnsuU8ptCj8P%Vh);w; zhta_I>i?K6FZT2PV^;gTrupyxp`8J zTmSBCTcGe@m(xZ89;TAUTqcJtc{;^M0Wq|KfFhzwoA$87D(QzwYbZ`(drt!zu@zH?yVb59OlQf6e#iy?)Wk-i;;)e!XAUT`IKzr3lOvcyKB8Is5I9 z2Cp~I{(qJAQi*2gSWqUy(7-i=F+jHc|1;f~9SYZ8GsSu`Y~Z>etG9(=PyFWQ7yJK8 za)%^c{I4!_?YI3klbzcW*)vqR7#O6EJ+!wej1%`@WC(nGO0B_q|DH)N>{o3%Sns*_ zul`~VhAVwc3;~XTc|7LXtkOS@KeVqYj1hlvN{!(*lY?}Fv<~BguUglZ)owHSDZk># zqW_*Uf6V2IAyY$I1*y9#Z@h8UWd0we-uId*_Gi@1d+uBZL}yCGb3`#d<|yCRy2y2s z++TU^@Se(}{29tz3=FRhS*`lkd3o1?ix&lVCV;y&kM?jrn6Z^OW>HY1H7tzo z+W3G*7v^0t>pH#5A^aJG&2brq^dqGL3ta!lN+fk$yH&z}@&Cq8N{kFwx|kRO7>ybD z$}gWaFZ%I*!ix3WIwyLQB%2xT3LbZC*vabhKT!7K|MF9T3=COrj0`Il1Sl{Dr0rgz zA6?ja!7?yTJVGK>m|>Bs@MfllyT9ariZX_-jZ%@lqs)-O!OF0pNlBN1u`JNtJ>)uT z)b1W_XiFl0&!R6b{{y>u%`bnq7lgTe12gYz29Y(tm4C_W2F8d-zO|gu$*=1FloZ7#9GsXmQf9jdhoa$>#ZH4CyYWarI}S7()gBuIJTdaCi% z5#04}vE7}2%wHEWFkI2#%w_04XX)+H7q*tWBsJq1xGi2%CG2p1EhsH(|Cjo_X?r9j z_zzEbtl6M?$}9jBaIDK zH_k58{`l;p&OiI|cR7kP55G0HrcJW;f06vfyvR^xbia6xei3}^(DNrU#0Nt{+_!@3|t7- zf0GwA*`&82pg@^%1E`0*MVs-$=~MPs5)PmJ_x7vVLQegP)vOEZL>L;_rUo(O$rPoX znWMO1Qq^_VJ~7!y)*J3j2SnfAU;*XjD{<=1PLW^kv;ALaX)pfwzk{*{0|W0Skpl-G zHWwYdv$L4x%A!4bALg`9^|x$ol4fP_W_TleL;FblYHo(I*Y>^p>aQe-8kf&b+y1{< zN}%BvsD));1je(RStQmt{UOX%IaTGjsAqP~SL8^6Y!X zU;R=xWxCq`4{f*`t;*25kb%ME<%0)}5%MKDKjfJiE_T@e{NsA-*Bz_5X4#KS4y;ht zY*?GaRN(fGXX_C}>hPHTPHWQyKPyAa zWBd7*-mmxX_S3eDo7LjR$Pg%8#*}a?{pD}>Qh)n^stbG4_uOV(U}tqyG;9@=j6H8a` z<5IVDtH6y1`$5GSsPP{eN#>{_@>Ea`FB7J6#IDg7fT~gL{8F zWxkrqq_qjudUXD*^UMFey?`7SgG2X`l^hIPZk?HF{AKF=8qfG$WvM!s8F-jV+>M(V z)>asRlhRcsMU}E2&%eoY@Ut>3XnhpGA|Y`@dqJ$;o_961zb~5px^U*Qh`I>For#%? z7#zOHZ{6_1Ui<%{#EbQ8{}~@HVqn-3aiyD~T9aYHSwD;9Ho1@84F8|Aev}e80nWD4 z)<^vJI=$NG;oy4hv;P-+8JGW!*A_4^Y+-!MaNyw^hO)c1^DiCK&%byk@?!>PMbYW7 zgS=mtF+}`qkBYee|M2P72?BrFqneo*E~tgESQva+)^&8zqLygil1rW9=Ppe9U)^md z*<9MVg>i?n@#b~@{9*qhix^fM$@|y&uRVG9_O2K97nDR88q79{Hs;ISc`we$)z#Iw zcMHRU&2P%Swn?nvzT>&^jO14ph8Mrxb?4PB__Cl9I)3ds@cfqt!;VGQd>LH+2Xc4+vv<5-pK-0K+jIpZV+Jp1tTaOUz`=#)r3F6{ zjz=@?xau-x%5~Pd!pbk#SZ`hDayGsj;LUj8wXW;`#;j{P>c8a0e*J5_wwQsTXUuKBSK!ps;gl*^AjvA|HB*a)?WG?rOWWv zm64&Nv1|?ZonI=K&kEYljS$~a{M_##?^9ofFMk({fy)n@MgJY1gXU%yU46|o|HnBt z#=Eribxow-7kiyAf0^fkEMFM5mb+$>8N-nn>uan*3{y@D+>!tEwce{TAZ>*2rO z`_}zT-;%$`>VntP(#G_fed0z{TuqXmlYS>t$VjN92ECf{Y(rG1fs<)tc=!Z z#s>dYa!6*B2UlgQ=iQTIT(_aLG3>^#FZ1IT%fHRBd%9_|7{h_gYoF!AzU;4=oX`IE z`;vQg`)}U<^C|xSyHEGk|9(3kDfmEizru&jPA}iy;}c_9^S*v{c{78Hv(@~!znT~< z7Qgtv-bCg?uv%<=Z+<~Rz|VDi{OptWF-({Fnr$0ZbWTW=&F1fio6ou!oY~n+Z+3aJ z91i?T*# zzFL@cc>VAHXM+FM|69M*`)i|lh!^jc%h#^(-dcN>Nr3m>7R|ka+?7GnpW5JSUZ9bN+)t2fhs*(?oyIqSbw5JSP; zi=V4XPQH&{bx?O+-JkAbml*c{{{KIA?{nMtVhrUs4%X*c2>D}FOySG|RjrrG``(JC@Co!58KbV@79mFX1_x^*}H5a#~^D%@t zF)?^_#>4x0x$js7-H-piedXl8 zN?H3ET!NFk4>2BzTNrWSAM3)d!;S@FbldfGI;D*_^`R^us(}O z_hkQnJAe7FxeZPw)KHUC!k(>wB!BbM*hr z?sanv3#CAvY$gGJ=h;jDZs#`r)e+BNVXa;2JArM(zWUvN*#&BO7+F3{yLeGhwEHM0 zJIlW(GygB0xj8N4+#O4%Nh(*h=T;ug{B`zGO>XU{m513__C2?Kf9((jAd^;+;*l>`bGY96Pv89AAN~J3?f&($(#`1a zw{-u@_y4E#*400|J^6obFk8b9#b5U=vN?Y|-edCkg61RE{H^oEwM80sByck{c&2Wy zd}{pj@FfQ0^m7;5-rJwca!?67xZkkmhray9x!>=;ykGJ5lK1`_iVPn=E~^id{m~-O zv|sw>%Gq4pCK`)G9AYLgFc_?S_|S20Wx@YMW~N-Z1Iz#YHf5T0DvC*O*V7u?KTpAJ zqZ=#?M>_8QdcWV9<7C^P^gp+onwbRT&oD3q1YZ0fpJ}mRxz8>WrXNS^t1s5AxO{$w zzQW4BdDj=KKGz8>Tz}>7ygdvq^S}P>|H7%bL%($SwWV@_x9W2fEDwU#n!CueGBB7* z>h@%$q(t2GG0Wh*vFoX37lVh5H*>)c_D2VQ{o}u|O0H}A-q>G0RX?NcmvJy0VF&5i zY;xekiw*T3zBl!z$2F&}_Ul23L^7)2djbmL5*Nh@GL|7DdX)rLXxP7Cv(cku` za~A_cgU9cuGuQm#?solO{~&k9hv!Bwb0#oJSX*;AYzbgsxGjJRZ?-GyEBm@xT9)C0 zWwm{{)W7y;Ykh4OZN0bs^{?zrFXt3VZd<|tTFB?HqOFbpRebyp@!BuS-Cx$WzpmcM zz~CTpFXrs2{Tm{_{Qq}lZkCJQ>~O84h0Gm7X$%Y;bI-Ef_zix$fBkFx)n4Y>_y0}b=SV%2jgq#pIb_42ptUD6xJvRO=YrHtGw1mI zxhnkidw*@TaoSk{28Oj?ejQ)h?DLnub?u+c_x`8x^2uJgaAE;NiQG&X23=Ddqb1`1 z-d5H=n8Kg=R9w1SfQccX+kD@thxR&RfB7GO$X_FR;1UCaRX+w?W53=A34(c(Y;aQ~O$;n?$k z-+FF_h7EhF<_QRO|7)-OVSclRm&J$MA>EKgz#;l(!-3l0-(Rx--x8?5|I4Ol=jJX3 zRox61R@9bzG`swF{@C+lsN+ehr7-S8jBrf{@pFjVVy!oHWRsCc!@zJM@MuzCvom|i`MdEK-R<{y?EZE5 zttAV?j_mi(y$=7suxIN^_bu0cZ;R5MduoFq!wUs21_q_Z(nf}csy#cStTse(G`jwO z@4xkZb-teSE&dlG*BF>OWUjF?F=%a!uAlwu{M&kquqFB#m0#+0y#MblEQtRg=1@J6 zfkD7>4L1uzh|?E)n{A)g&uyK{RU$KEfsS{*F=bn$D|07jf7MOgk-)VKw zyOM{Q#i~J!fnj2LcC+8Ft>0f8&;PpxT=6&<-CX-$dpU>V&%0+NZ>>GYd;jbc+pk~t zY~Haynf)W*f=~?xh7Q(l?q{1~cfAr0e=#e2y&5kA17}Km{i6R5H@x^?yK?sxuWx&+ z&fU4`*!6zL%;TBY&dfZRGe7SCW8<{2`5!O87iVH)W4m(yzPt$Qo8z^$wXbepTW(u@ z<1dFv6B9#2#L2WGtB>LSSMJ+?%VlF>a%g(9+xb@gZULs(Ker#OPu$r2&*#5`efqr| z@O;*b+rPKUe3DLeZOHw%x$f?-2em=W4!Iyl%4TzJFgcKJU!FUGje%iD?~D41HSh29 z{qJ@A|8{|Wb==Dd`R#u%i_f`sskv_L8jcSanpZbBF&t$`C=y{{I3o6%iSa;fE91-Q z=|X?`Py4<+pRxA)+g0<;&GzN9*Y3VJ|7HF9xhvA`v(`uyyblk{{JiX}2y;Ur$YN7( z=0D57%dO6~`<)rP?@tgT!<{7U|1*Bc_ibJ2UK0Fj)?vGAoj>ZVBefoUi_Tvzz#!wq z$j~6XM)g7ezZZ`ds5Y1|Fzk4E_Ufer>Ma5hU;h8MdMG7px?a8L^uktUi z?-YwoW^+&qU|@J)bB&eBp=M8!SJAJ3r`c;B{k~Z6H$DHt-tQZVnDQ1gFenH{h;uMp z-2R>~bANN@n~xv=E=aGRC*Wu%{ovQ@JdRt;4B~+d3==fgaI-XIY>KYm{kPw^`+fSG zu>U>V`Tv&PP~Ru7zlG%hX!D#3-)kmDg($9nsjv0V_k@3$|6|{69max-o4U7VK2BrQ zTgbqmFcECq#_z?Kqy=;Ls_mPfbB47cTZ4hY!vy5e^u0T8?a%$&Vzo}@{&|^M2mEW~ zQ@7u(vR=*fkcW$bL8!m9k>P@**w6Z}d%n5FPK5CR7Z(FV0mo}5#szyJfx0?X zt?T{m<2$apD{C+v0PRIg-~pLlz2{?S=6hZ)){nJYPEXZd#}&rPR0vu?sCHnN14D*v z_n-fdd{*8#u&VUY?-wS~f+xxtj)3B01`Eh=(>TkeRrl>b*1Akx%MoKxzp(60$HjYI z4+OYCn@d1mkNN#>!ngj+#cKQdEna=+|DXQDl|h@0q0otufguZQMchGq?YDnrKGyCy zn8tX+he5&b($Adh;w%g+Rs={~&0fEE+4}qc&ApZefp!QnF?rM!m7)_aG_z*|NXV7#rWX{2L=YA7e5}SU*u}I0a`me zYl_#>(o4U=sgi*+buB}2{o|BvObVYo7#JKTcO6|6SNk?Jx8jfd*82Z-bE{slPkDce zn}I>aIXpc4!=K0B|1EFO0PV6;1SM;Rlc~&%+jCzF3xx78vNQPa8{?aS< zaPAHzAqIv3SFNdBe81-fc`Xe-wd74fd_DWsOR3LaLyOaf$7z1{^LiONRD>893OerI zxP5l--B;-=2S2xIaGtyqaLHG6TbdWd{#B=H7FW zW?0nD!qDKt_3O*u3i|+;+1uo|N57+6#mPx z5}$c^|IMAn)9YSeF$U$ZhURsDj!b1*)W*WlaN}i3&3;i2W(I}_^DHlmXPw_+)=>LO z`~qknf=k$x$G_Jmd}gq#y}P{R=O=Gg28KuPH)b#O{qFOp`1hVV-b{zzf14UaS-<@{ zpB*l(w|%}jVV{rH?=boLp!}b!Z|*K%Kd++3`NOv> z!S)Mk!s8ei6yi3;Uh1B`vdaQA-R;{qoI+;U;F!E-ZG0T9kmj6iDm4+?ytxYIuW$! z`|k!cLHxd}>A&__&%66CW`pJdE{5ViP9O`H{gas;av_442#a^{h$ATo|V%2dkb_Aa51c}@aH~xOu#{b&CB`cDfX)O zYnyEi#F&{F89J89+bgV%T-UdGYh(0YX%i1Ag^d=D41!7Qe{+uIefj+ARC#vRcR{N~ zyWN9#FI%a7{cqTQyY_mYl;`JSf2|EZf8mt=JxvA%0aZ7;q&wsz=YJYO@XEHD_EPA|E_R`w@>rQMaYv5hky)~ML!$)eJV56A! z{a3dY_PzTf^53mKs$jMK($^i^^SSQ02u?5+}mVa4d{fs*B;I10zF5z|Up(`TlOJ)8Fwh-9lce z3zUUQ!a}$i+LRoM3|ItKOqTt$cDem)`F}efy2}_U2rx8!`|Yz`>HYlR@RyZq#qJy} zRSi(K{t@l}|H`|}Q>nWx{wQw)6#)!tpKiBS-}hoZ;H$#Wp!H@!zF__Cuk10-QVa|Y z*Q^Z`{@$z)(z(%fV86HS6}zw8?-Ussd=`~_IG>$$-GuLd0jTlCkg=D!T15J(Xk+Dn z-8+W`91@t!j@EnCWo_8kzrsG|I4BWBWq&t&`I22!y6ngNMc-dNzgKloSB0U$@Xdz% zQ(p&dumACV#*6-zpVtoezxZ>1zk`2GdNTuqL&X|ag*-p4xFwZGwOO|p9Af12TzY91 zXff_xc@M2@&K*zo$E}n8|3!_Fp`l>UKIe@kSs$x>FY6oxZFY~>o6N2B|IROF)&GyP z>(^ekD`+eG`d)~EA>&-Op)SJ>n+AUI_o8D;}-?_epQ=*NMfTa`M6gi*pPTr=u8ea6Mq-V(?fpWjYt% z|Cb?d46CZkeit9ybs*pNPc9=v!>yYS>%aSpW?$p_z__2I;YTvBg3$7sAO4k@j4S4@ z<*s@3kr&i2Sitw!zUw;Ifs=c}<*)GN@4a_L+o@(EgTtaJ{Qr4=GfRQPG3)yyH_PO@ zk7kPZELar{E&eb++%WsU4UG+#w>os_OD&kl@wBmC z=3nEjn~wF*&PamyE}x&dHqtnq?fv-=_G}Cct2Y0upDx63jE(8tH!<#yE{qJF7ev?m zeEfmm=NR9w&CjRu{Vcm-Uwbf9<_jZ3#-!}_`ee<9J=a$|99oZHt=c@}qvzmj}krdX%Ja3B-3wIXMF zgUY66yN|UD3|7aFvNX(mF3zy6dbJ1R5dl^Pi_>lYo?8AT(mBG+%3z^9{pmOPwP5#LQS#jWKlQlC^UUq;j0$=h3lk7$__dV=h55!iF^)w0vH_L zOwIehnMp0E@BMAY`+Q&zINXT4J@L%#`s8AUWtr2yt&H!m<6`L8YtmjX;{*zel0$9L zlPZ75m-RdgWa!`o$jcmBu!Dzn4pxJodwoGa=;V)vh)*{CKkC_UzWv8~dK!!Q@AUcAV%vW)Fen(x#W~*pU$KSZ z2)nw*5uuO&zip2GxAfn_`hSwkS@{_l94^_Et^M-Go})w8FR){&PuGun>nZua#OD@^ zwbwB)OvsSVOM4;zsGo@;Npr3r=i21ppU_R4oF75*6=grRPpx;j6UgB3CgOknDR1tF zo16bHU;j5m;43==14DcLj#egyB=xzEKFFJO|GHoDd4BN+b_NEC!&Uz}|Aw0{VN?W# zN!gCS{Qa_j^yBL^1M3+W8Vqx;-cP>n>2I%aC1C=SLk=h=mjr$J-+r*|*WJ?ZUT0@m zIx{dZXjJC5f9YL%>0Pc<@3-o|PBtKQ0Sp;^cYnnfzrDIE=cp{EZPp+ zGcY)Cvj4w!d+k}Lng9j{nL`id85mUN`hLE@FYH!De@Q|Ag(UrI5r#)CObib=Kx@rF z@_|1ufmc8kFDds#a~UXJDAXVYc^w`aj42_suZNWOVt|LnY-feZ``g@Q8g z>Z5kuzM8O#A)|CkvVws3u{4f)hlzFWXwgh9aCQ=j3+mHI{h z85k6Fp8nXkS6BW^=lf(M{fgC+|HP9)Di$wR_R{M97yTX-6MH+}EA!m>cU+p4;Ygn< z!=zoD4>moWUi6!vfk8`YUw_!cZ}$H{BbwbzNz1J5LuZz3dKF&w`~MZ=Xch*B05P9C z_9Yj#JJ(yD;@@)U{xZL13Ou^XTta0)eC;VXA@%R zSQ?_Wc4e%)hUSjH>Sj-?cw|E)@ zLql}Odu6?x5AyBx<^c>2IlVo6+Otn;a_Yqwu4G_vuo1lPKIi7!|DU6DcQi6FBxPGD zvNkL|eJ=fzJp+TGL14}QrMY)rDer6B)2Q%^zZ_)3O@#w0pxwyZTo@P>qE3CRwf=BB zasCgxm@hpY|8}=AF(lXSXr-h`CMi+xatk<_~)YhKI`g__^>m9`&t0({+n|F>V`ez%B$L7j(}f2H;Lm}t)m$j7HkqeKV@Bw)33AkLJe#MKm5hG7z*0XGHvK((3^4ip*%ywEZN!`O-=_X zh86u^{}e+MoI1F$xd?Pd6T_=?O$N|WG7JZvz_ujg-U&UTm=5L)~Bf{`t&ccVy8|67HrZYA$Fqk}DV?WjI z`}!>`49R=n?V@~&;L&~VMthW|9;*- zc2fnF>E^j!`GF11pLXUwHL^T<(R+WwLPG|I#Hzx@Up^GQEZuihDN*Os|CVyY?f*C? zFf?ptYv(&sq}{L)=7=jkDP=+;(PUU}y+S zh*g-h=+5i&UG_chj0}F-KidDBv)|`=#&qN;&#(WC3>li&SPzAkeTbhPCG+Li`{4Zz zA2k>bRD#w8{Q&KBJ{2L(F}=t3$NOt(jFT5KG`L8}Nq*{PXl7zykmxRL>@ep0w<6rl z!HGxKi}A_kN=62TDO0br=IyvypC>4gxxT9Q*UoF%ySH~uty>|@%AmsK%D}*2AnDC~ zBZlD`t5Vjf_PX64pD&X?yMUqL$U@K|Pinz&;u)R|%jE?w2>#wvxA%?wm-652|78Ci zoIks+rIm?6Nb{6yL+sz(EDQ`*%lGJgsO4UIeBETeH-Z<0obNdptoL7oL^

>rVI-H0zS-RedIxbj@Sl`xkr^U}(@tbWq4jWv{iq^Zq;k_x&~{tMlI% zukP1az`(E~gylr)?kQ(eL|OlT+HCjr%Qp@N2AAX6b+vU@mDpGowfwMq)WO7H;AS>E z+-~yw3hx8L_v>SdpPv(BVCa~4eBD&DyUHpYA8U6sNirOeIDEKSN>=h+h4+Et+w+%# z&a-m)dr#c^Hq#mb2dM+PWvlbEzjeGn94f-lP{?((>6`qGcsJt&ZYLCw&{XvxKk6Z_7v-Pk%Abevz{@m&WhG>(67X8ynMu-(U6 z6;We`2B|I89uGjPvaa}V<6vMo(#*?|5}S}Nc%OY0Xie(ExvdOlpaXL3*Kp_9KKc#b zWWuW<&SdnmgvHiiof(jpZFFU~%w zl@^=fnf_P(j{fqs{&`^k@!ZU5IR9V!HPh?F?Z2Lan(hlqLHnvUB{qJmm{-0+U_z+X zRKB`9J!_-q2{ABq=wD;qclpPUeS7n_|C0IA_-z3zL&n4stHoQU>+SVjDwQRgz{kMA z@G)JN(KANeqei|1wCHShgp$HkFZR#OZ$1Vs-L7WpS@>Yt?Ef*-;|pgpFgW~)WIS-R zwDHLIMo_wUxdA%l;ot7pEDQ{H1fG{R3LpL6e7iR9YvYXt3=A%J&fT@Xa{IP61H*$p z(DLl#-`}d;&->c>o;eRJ%{za09O(EIMh1rME{U-UA8QpNH5eEK&EG$%ytS!xG6O@y z>{}c4Cj78taAsuaX#Cp0{_-JXaSjHC9htvxeYnOdbf4Wol8eEC$ACwGf#Lhr-5|9M zRe=l)Nr!GRtdV74VAzrSXP3jH-wcPG7#TV`yY1^HhSk0Wom}=kQYzsoYwa($`$uKI zFt)TYF$gH%{+~KK?d&X728Ibd_jjajwyS>~D#FOnqNK{OvGD1q)hrAQlOFG{t!vz7 zx7}~~*j4m zc2)+4Nl(N5-d&ZSQ$CT8$K!m?Vh)A{b}9@F5}TL~Oj~YdC?LSl!1DW??cZPTx9eTg zX6E5w36O4MU@|l@FgV}<8YX_1Jb%to`P{q9?$0dU%dkLf3j>2;Dl=myD+7bV&0YOd z^nN^Hl3mSuYfq*zGZSNo3pay6@oV|`<*n&@0s`u+|G#D~jF)=%dH&m_+n>$Y%EVx@ zqTYSKp7rlC+pGJdAp5@0oVBW(w(s-Z(lg8sDZRhg|1LbcwE5qQh0gz9>?jLeA71s{ zP4jGiGDAieFZ-V7)2{A%t-U>a{tRA*2L&Pw4D2_u4t%W>JP^gy;3rwVWBcKM9smDz z{IA>CX7Xxc{KQ@QLJSHjYq(iJTg)4j_5S^EjrzK^nsv)9myfm8UA)`omc_piXZW#} zn_*#fZhOh?wcB53^WW10je{|?-}$ifb?M>fGg*2*ToJmT-{$&n?fdyJ>>0LzCPJnJ zGBC(E3o`U>h_1DMVJ>t(pY38jLk7P$b4=a0x4+`-GZ_?4YA`VHE#hc6*&=&C|JW7n zCG&2xFk~#wzq2WF{{F98Y%ENiu8a%?BCZTm9{(9zleT$AfZ)G2MuiX&28QFhaW(70 z?w0FoGszm*?aOEXckt{*yBGc`x6+p?ukdDcP`R<|!1+5x8~?4{@6T`tw78@JG+ti5 zZ@1s(w8E!S;!it&JLc3szis}fFn#;Kvfum+9emeVnNB(~GI(%kGevkGI4Yn1q-x5I zwf{Ws-`@VKu;ab?sn=8Q?Vb3-p1}n)RQ5fPfkEimD*qVCGpq|#7wnDcd~d$^c^GJk zDuc_6rHubx-!y+Q|93cNL$wA21E-6(L-y3izn?CwS$E|7?2EMvOP=gyVmNZ7cKe#^ zzT58|*yV5lv>S_Ma~Xp-a{xz%&!k7c&u%#J-!QxLAG5=q4SE6v{HzQL4`=WO+;#c* z_Y<%ED(g?$LFW7SGAK-o5a$5(-5MBL8-yPHemJYD^-A$<1_s09yBrSiiZC$9sA;w~ zFjp_Rd;4Bp+^>};wbQ@c&gW9xc;f$VGcV0&zDy0m5#k(2K+7SkhSSf#_eq2l9CtM7Y? zMNBIS&u9 z&MN=3=hE%qXIqzqE~q)MUIdh4|LdRUR{Z#9)`i{XLVwvCR1#wq1mr~+7+Q`AF{z)Q zEq;c7L(+kd?f0a9->9(ss`cJpOnJ-m2M#ZDwfTNc-gvm4|Kk4(U+!r6?hRsSXaQ;F z7hzy1Ia8v0;n5+h(o^l5FRjc}RJkke<$h0_!J%oRos(VdGz?tWehHYpd|xWpKq)f$#H1|8tl6 zx8+^VKc8g5BOnTL-xd9<%ct)>n>F3?<)!9=8*BdyF0o-`n7qN{z^(e7zVW~AIL}hM z#Ne1+ zBs`7Zu}go-vQ1|>83dHBu`<1NW@KUp1po3+zWd8xc_k-9M&qYl2cqrD z^Ki8_=5bpo~M`mwU0K*~B>4?!H z3@*@=VtVM>-??Ys)@QuA_CHp7sfhM$MuyyPf7ySR{w(eOddeZ&jFr*z@L!1rk4=pY zy<3W(KQ+*H~{g9JoL8sDP9Lj|c;U%eAogZM(KJ-8gF>{Qt1? zeS3xlmvbB*H2cS{j~2^Mc2KyWlE%Q$VWQ3Or|aC>Ou2@;f1>}$Kits#Kaii3p`q_| zndknkOTyn@cdbf%oM52O;qVufwA+rswgy=2w%E5_#dyvW}68P?(*;V zyM5qJIA8z%ZNKc|%7apg*I1cUL5o+s>}H3XO}2iM{Ci9I|2el7DF0zP@VmRXAHvt*;^D9WsRo$T_TQGCxf=Urc~YuBIK{dd<(`F;Mg>h_wnhR*kx z5ZdjPYc%=h^18L&x_tMTJRO-B9G;|Jk}Q3?Y(?BQ#fF;E~tD$!DFx@tSF(3n-^Yt$bhab@j#nlvA4-uPv2ZD4@`7{f=wV z|I1UT`s)N;L9!@sz_vg3&FP=7csrCCfO@?KIie*A78KZr!4vZ=jSD< zfCH&px15|3seQos-rIlQ&t7GUab;w1NV&Od|GJp%Q43=@ew=;uC*nNEhUR~#Z;8r$ zi1+x}Uh|fR@89mfhyPU=r=JBaK3z9Yu1%Rq?`BE=mm6DG-Ddxzbilnn)G94^r71_j z)x)R%D&1t>T3b2A{*(5;D&WnmQ@y?9&euyc?CL9bNTweQy6wEpLqCe z#q!_vcm7Sc*W1c6fvur?RW8eno~r4)!Vt@O!x*ym-wq2V3 zhP^jeHD~wiynPc7+fQJ)?9aEH!Qe$acWrsZt)Hox53OE?U%M#8P=3aC{m1o_=Tw>Q zubAC;anAw)2PuZatG`}GF$5@g|J$DYB0fmR>bXwrwnsvY1@qrp^IzV)_|mKSp8n^) zcF!;8C^(e=Z{n=7ppQzrdTY4vF%?cZm%e+S0>g_9K30p@-4Rigx%PektAEv3E}uSS zufX}|*UD}G_*=6s)X&rZ!P;>4QuTF@*yopo8Y(t_bkfh86nB5&vL{zp3zy_g;QG<} zeT!T3dNBpL9a+p53a@>?KlQcPp=9Czo&Od~<(1tnyuz6^bAFFU{9p6`54HqUHGfM# zGG{AeOKRLlufL9olb3bcNrKk}%cg_$w5Nj(bV=`Q@M`cTW->uJ_b@vta9m-&qIL-H8Tx{FRE04Z1J!%NQ!(gQ~`{YmmFphTD z|Lb?Y%VL}=!nWkPeOy(2!R7}X(kwT!{QErOe@nl#7xT_vCnjJWrepolr}Z2cLl}nw zZ^Mek;MJbL@|*t)%!6((zx8|P_WT0(Uo7r2cMq`~h}f^;RiDhvv|i(H+@>ZW0rj<7 z({4We&(A%(=^BH=Dh&pP7cA&2_$wCL@j0Uea6Smdgd9eTC z+a~2G!R&R*_UL_>S;;firN+nJRrmNV2N%#HvD|dfStjitY(Bk^V!V2TG53$}+P^b6 zwoBi-%49H)m*da1319ZkUK;MF$lLHD`|E`>M&1k&LI;Exw^<2vFmW+3+{*L19-?Ri zp0&KX=i}AGi~lE!T5PafENeb{a^m~tjo7edIEx1YnNDMz1ii!#)bpi+fB7fg{d4c+U0v++P zaMptN`x`qpY3=tgh6NlAVT%|T7N|D8un+$4{Po1*Y?hGC z@B5DN1uN$;6&&m27L{JZ&2q0(i6N?!iJ@WIj7z4W9R05UU;cJC&94cyy6`};i>1N3 z&&qM*p*^y zDtz!0VZ6Y#$BA8FRfyKwm~Gx1?O*@iFa7Stc=g7q{YjI}mp9L5b$6*1c#v{z9e2&c zzF4M7=eQW&Uw35!ja@lp*qpyS<&TJ>4fyPzt0uR;+u!5JWjNPySmD4)&<@3i*VId{ zxu3hZu8xb*W82Tx+h6p~3Jb7tF)%nyK3^vMm;d6W)aSp?3o%Y*3I0F3=U@Nd>Vv$6 zz6?E6<^N5n`|?=+)nfU`CE!&PiPi#>D}}cyeJJPR&zzOUnIX3R3S*1X?2|wFwf`SV z0%aohkfg(xbbiTCOEhD&czgtObV%3c5Dl>{zyH^IhR1$X-}TFXog!~Tfb5OMH#Qvp z-`@S5D?^Nxfx(wM>|g3AWoAx&T zSJLZmDW!Wz?O%tv3df){eP`M#VbwdS9*1*ovFUsd^d^*`?GSF>g= z)NNAkD@x#N_-f<7Y!2Iwug`9Oxp+U$MT()cvzY0?1+E4+P>)tX`j`9t`U+?nbNgql z;@Ur}znpK7j)`E6IDO05oB7X+m-1N;oA_Tp-2Zo4L)4xfo*T=xG#N}9!rwEza{FQ* z11oWowf}eN_N~1o#?Zx(x51a;uDjN^drNP%N$&aeO272z)9@F<;Wa^j|Nc>POWnO) z^P7&MGZ({GP>#|Q`?>vv{h?%V8RV<|``__ofd$qv9*i=vYiegL+{$Y6;Xw1R8#lYR zg4Rk3SLU{tB=pZoU}kKr3SeLe5MT8FVbrcSHUA@(7EDTbRo}h%|KtCa1lwxwXZFTNF5S7=f0-&n`_GxofBz>Nax;8gz`(FT?b`SJ?f*H> z&yA1s{30LvcK_nP=AS?XbSJlH_17&7K1VKrSJK`s^OjCF>DVGJ>%}0UJ;{)pVJpbn zYGz;hU({E;0iR$sbeE9#1 z&$3;FA?xVsN`}yhzp^Z~;xJ=TD2xzY2_ zS>!I1t18$!!3VUECx^vhEoj?M$JF|V)lV*(GOfBs zpZ|YhE|SY-SOMxam2Wt)-}S$s-0q+1zxuPR?tZtQ_P1I@DWJpQb4&)~hS_JswlMY_ z-Q}?T@9yN)|J9tO8CER>-I3ApuRR;q7;0MiU(mYT09pdHZslAcb&Yk`%g*R299tL{ zNX0#5w(v2F_&Hr1wE1274|_-@=(4 z`dkbQ5kIdp_1o-nb1)5@^~+vxwy%TW0p4w#3x0bXy|??y&Dp-v0w;DI_;I7e|5M)o z(^gYwIDP^3tJnP5e6=3b287gaSNG5DI#^@K20AoN> z_A*IwQ8yFAgn~7HxTizTVJTa^PhTyaU5Mdb!9oUsrOv%e8PC~P8)i0iL~V}gbmL}F zJG{D1;b6zV_SMU`yO-bH8{}ZR?bCXT1rZ925Be6%O0Y<5bw0bycXl&l;~MTBvF?BS zcLa8dwQk{A)XBs!AplaW6kk4D@ApMM)OGLsdK)vw9gmN+cJ0-W%UYw_P}+Dg@#23K zzJJpC>*E-O7cwxYh+O<%06IPQzm8ylr@>eIwA{m67c*i141`@ePe{}>0=ve)_B{}&#UVJP1*fx#k-TSR>gcaE;~ zukXD}nF5r#7#y57eA2IhB#6SppYz=n~ul1kX7wmuiYXsf* zA#^D0-_2L{Er;9wUHsmk^-FF7pT&o&`&<&Oj0YL@wlGAjvDC|DNZzPt5F_)i@fc{c zZo}02hoGg5cC~MpvxFq+`(2Mwf2(_n^9*Cb@h`z5)q(d|0(f6D%|8B6K0`*G=|G{& z|HD@=-(I}`-?P6=t2WLHx$XM5OPRF+ob}}HZ~h$p=ms08V2}ps;A3Stkcb-fxjQ0n z?OprjUxP9$0~_P6#}+~i6A$h>@ax8wdcOZ#rG@rJSEzF_G#o}Q58jkz9oEhN|3jSB zGBKn3LC0d58O#MahH3=5J+*mieWjudxWUSJ^#=Eq zjb&CrpaX~b#KRbm6>=n)uHl|@C;7S;zrOy~(1m5ckGxmiBh1Qh!0{TS4)Ha=@9{-G z^k(;!kK2RS@i1=DWe{P!lQ5fMSAWQxy{9LdHEfI!uh>zv|NpY;7AwL3$5TKvOPdzf zyZk>~{Ikn@>x(&?SwcR&vG@6>G}W=8LrOe|!Cm~WHiN`9)@e89FRw41_2rSf6^T#>0%=_z$(#ik#XcsehFzh(o%GA)!*|71{Yo^K5 z*fj3{ieA)pqW-Z5LxPbA14BD3iP+lOGHGpGSU;65c<&<*#s*OPwk$zlL3c63G4Cj; z1OIfMUbC0kFH)b7oCMN$$_~*@=1G(m}fKGDSYH~blz%R2H}k& z2iWV97ye5+`szX39n-Q0`=4I-)(+YEmH+tZduiZIYSA>c{vp?*|JQ~7x~G0~`qLS` zs(zj}Cqop&ox&@eUAEo~Pp+O$tR#!Yp=>YplHbptfiv&1kCqI=m8!TOpH>hI+D{f*ntHj}ZzGlfOrn$D;Ei}fwfXJvQ( zTWr<6>e}Z+SIrpDlq_&gKcUZ%GO7Go(Ij4`p5JR<8y>B^HTS@Z&2P&=`|YR8?+Ws_ zFPQyop8DTs$CvKhzxu=`d;R!3D!F^wXVkBLEB3J-R6Ph3yZk@AwdCec@X|o7jndnB zOO}fiJ*eI`qGE&dWxU%!0e03BU3 zd+*n(qf^Zo*ch#ncQH%LE)$(>%TZu-K6~r6s%}dGHI9$JRE&%l+r}m6NyL2ktGN`gi-*E9?Qh ztPBcjI=|*C|B|0I@7_FxU;H7P(<&>N*CUm6w*(wQ!sEm|8wL`8t6>*Z43b{1(@jJHP?@xTNztSblDo{AnC+wzA z9H@(Y`+@y}S)tumgw~y5RA79-C(gy7!tg3QPW;FDm8(6NkH~EQzXG(E) ziPO~AZBg#{7w`Q=ern{G|D9sr{`Noj0+;p@EFGP1u02aIV|dN9ICb}StsnW!CZOc0 zDE9X}XhzFF-(TP_`>M#zd%j-$zp>1aok8%i6VrnTU4cXCx{PbMd-xXp2X*ZgoR*dN ziXJKk9qb-BckQ3eC;z|Qa(QZK!);dgITg#2@}nlQIB0LwGmv_-|KI{P7LzU}1_43H zOw}|!>-gzwcepsHiv7KR;n<7%nY@f83po-v8<^HR&wb#;?cld}3*#1v*G$>IL^# z|6ermlXhT9xg-f10stM+&K|NkYogV$sb&n%7;zxnC+|5u#b!WaPV@1Hxjg>ei2Yo^=JP1pPT|JwfFK|+Ip zK{gH4tA$k2B{zi_r$(HwS6}o$Ig&A9J@ah_36>Xqk3AR`FoN1(ze{Tm?T&DWuqb7a zoq{ciO#JX>Mbdle=>2*-9%`^ZV~~kX5q41Dptr&F&4>K`>%RO|_7P!d;M)j33aldM zX}rIGKj>W0{gW^L-#D+ck})ComEhW2rPCjo&T?O`8$z251beqSR6_==xwkw zdprNIeN-LjyVgGJE`M=_qXHO7=*x&v7r4{%87vJ_|*zqWX zosH3mT_Gw$JVIJ}!HI|RZ$TThltD|Y<>xIueeOEwgxP>j*ZTsz z?Llk1ZKbD!o230>R@_+3sxT`;++ye2d%Oo3jym#kWSIIXIm|{+OG@YY{`((GP(E<# zitnwp<$Ql`pA>LN2lwp3dHdqwT?YHR=L; zUH>n>@!ei9o4MnYPJ{dsvlscn^|mk1=P&0yzTO8bUH{_0 zb$()i2;;3zCWZ@apkY4b>hS9yciUg~_k<63E%|h6zt_Cm|JFQU6K7+TbCz~^GW9yE znl5j^zOVI{b~m1|w`vmRypVL$=Un|JCs0%C`o>TEQzJpgv58u56Fe|)#m0s8!mj_1 zS50GSFqUBHDD#YxI`B-P;B~*>Vg`mS6I}o2evm(uto^^Ls){8f$^3s|=fD2%cOPc( zvc$};IqLfvqlJ7T49i5*J?9A+ zhjH9^D?iQul55re|1yC+<&zHc{VRL%{Fr>;Bj4GVq$eMBcGv@1HjsSr|MGb^l@^Wuc83e)4=xBuIfbUrWU=1RHz zFcyog6}4-)7@hAm#C_nFwEups_=CGjp(*E<2G{?Vf7*}piHLzqy*s^!_rEOBK2ZDb zY`txJ{b3mf^Bo4v2R3jj{5!RlQ94MRo&A-D_Wf`F*ZzN>&HT^ekMgPvMuw;a@Jzw= z81FCgS8sxjeS6Q9&HCeA$Cql^8H!n;A=L2oZ*R}P3Yz?QbUuvn*xng#(hb&i>%KZN zCd@MTzP!~zT~zi#A+z@i$^S!L6d+#OOc+7dU zxcUFJw-J9cKGs>kxZQZaOK8gsg+9(HYASHu4KroEo_D~e4Z_U_)Uy${-EurzGWnN?>gnXpD7p_SqH`@H;I(IvJ!lalw( zd|UQE^lRq+`V;?`USB@_Z?ipn-Hrw(1_2>xR{8m5>wKkO{i}3-z4yBRKV^+*LZ(-h ze>cDJwa@oGzU=P_ZRilP{-bEQMj>JQ=WVVDI@&xk5C6xVSRKC8`Mk@U1^M;;ivJ%j z;GZ7Iz~GbwE~%3*{$F}}8pnz!OLOzw{vY3**wD{A)r|SewiTe&6y{6U2O59ld&7H+ zLF101*1f0qS^i(zf7G?;=EAxO_n8kwTdZYJJdsxP?{cGOY~Q9A|9!XL(O58vxq3;y zPH57NfCKqIT^kz3a@jV_{_nQ?)V+z4_WapmI<^^nH?m0)tE&6T^ii(8;h1`z?#pxmP>^ zWfh^;Se6Yh{{LNREjsP_w#f_*B?jya41C8|vSu{h{j)r{=MqOZIHv}5uKiQ3#8~@( z>XdGV^(_G`Kb&683Rv_%HHXPz$^|9{hW5n_3??TQfli!*j8XdvE&ea8Db84Dw5ko9 zIOWyM7DYvne428d<>xJE0YXx5;nhEqdfU=;MHZ-OVa;4S{&KNTvLBzf2n-n zU7cU|&z#!twe2#SKs7u2lb+-m%nS_qpaV${KoaOh%k-Ccnaog<`)|>yjZq2=4xFr@BW^$Y zf3dgmo<8@zy*Eq9r%Pu0876#K`TuKG*%lLp4>t>$nbyAlzwC=?)>hErkw<1`AKjMe z3Ob$Om?ztcK(oo8=dTgq1K*V)9~vS5$$T0Yuf}r5H39*C%s0-~YcKwvIt_9e!}9sL zQ-X_LE#+lk-~*lcdjLFU{qW~6@Vy!R4PFsHukV@5`m&zKYkQB)n)-m>VYx=^3j5;9 z*RUSgz{$YirNO{p`r=eMXgbIAdhA+wYT=)?{r>Cg|6_NA{^oyk`QSokEivw_t#5Of zI#h2nZ1}yrh%c9cA>dFa+loVZ|1N8arL`Od+r8pQ*gsp)5tyK*X|-Chulf3USX&#+ z+3$b2FCVr#r}mSkVqJ{QA8C+x53OWdaR8Q#w&^$Z{D2H!eC#RTU6%dX+Ro0(O323f zu;$XsGZW5vT1^d$*p|1DLBJg}Zhc%#++!Yt!bcAV22r1vv$R@{gG_QZo&8Snm%Lc_ zzi7qA|Lfmj zIu&IYpMT&++em=Z9QSGB8@fT&H;8664cF2O1Ze zHy>&c?~| z#LAnuV@!YD=g8*Xu*hNUzvuRU7yl~%l6~#tk@b%sfHuiaW2kUsn2@8w&`=1{S6=~} zl0CBMxOB(A_Cvq^<-V#9vH9{KOYzs6><_NTg&EE;GB9v497xRJDl?lb3LD5SO7PeG z)nCve_?Q3k-uOsWm-(+h);n`EfG%Ub2cE8L|8VE$)2S~114Xs}ANt(1J?gx6l=(Ym zX69R43O5VndP?leily0_q^D?f$v_zY5Wr`*o( zeYRiRYukEXKf!krW{eCT7Jk+Z`qNKpPF4d)BIrcV4WIO5u6>tZ`r?1YY_r_3`g)W9 zcPFe-x&zAL9u`~-9(xpioxk!wz!p3UFYuSY|L&jnVOx^FeZO~Dr$NK((1-mSC0IBV zUTQEXd<1tXl0nfO*n8I^>W}={?xHXCI=9&pJ~IgDdfwhwxJHbF0d&TX&{OS3nswbT>N}uwRT1kquKnx$`O&6N>&46jCWJM7Q|?rL+O?OdVaX$v zmLn%pi%u=+{MUXIl10G-{(p~K{<4=_%kcK7z&W99P#3f){F?t-?9gZMRJ!vQdz-S) z`=j&j&WP4#h-SQXc#;Lr!y0K<1_n=8MutvKV13G1Ru@qZx>vPlf=Wo9FUtz}cVNt61>izfsCb{pn*%MP$xR`;Vf}54W zqWeYt4p{zdk$wD7@)O&amhz30jo<|G`~wJ%S7*$783j`->>BG`OOD^MLzJ(i2}b3pY%^ZwD*B7kT`m3|A##f)?WJ@ zwRXuOjte`EuY3A|pJ9d!D}x2N&kD*a;B^t*Qnzo}o1A|-wf?JyIHLqlgtYgAi1YUG z?F$t@kf{j?}LbMU(?&`xeC5+ zJp5mQm4N}YVZtxrY5Wezq_yHNc~JB&+*JDd8hbILT$RC2W})7%zyF_QUD{aB{{2t= z+q>R9bDvkre|Rn(SJHXHaKTjG>M40b>S8lnCpzVw)H%Cj(dJ1JQ_rkgx3Y_s>pC0j zMn_rc1u^++*fu2TMTzKX^s5}u)0w!%Sx?GKrjyHwjicSmahp@gMo*Rwk-k#J^a{(F z&wY+9%PDGmQkj0P{M_%~jO@-QrJd(&uK4%9m^1Iv?p^`T71O&q8<&6Gzh=(w|C96U zwG#|~ep>NELwWkYnV$O$cZxrl*j`>@Z(7E@=U2^<$NNpcPmcaP@4ZxjAtM8`ZuGy+ zU*{KndK&-QzWb#0<6C{FE0)jP^7X%1inxRCU53xy|2{p9|8Pw@Q98hwk%8Iwb$w*C zTvfui&j|;dHVG7_@9CMDrp0G=yD8fEKJSF-Ol@1G6>k6i{QKLHTEX>uB}59A&E#l^ zS~*7|V)ZWd|9RY}PF(vR^M{@LWRgm}qUPa~`;Gc!W_DE9Xa5c8Wj!PQ@8-MtvgUDr zPa85ZTv-!Y{5(TF;lPtS|Lnq|3Rmsml1h#%gdL~{%CRM4ace5-`b;- zuglwtB_}5vW^DRk|7p3PzTL_f@m!UR4|XemXK`4|!oaiScKChE-@o>2X(-44%l(^f zSo!Y#%(sq=m7nyt|EvBRA0=&`*RghUq5~UK?)0~R)xW#`c^b_1e`(3KnFWQ+D`qh? zG;XeX`f5k+S6N5No4@{_`Z%3Q%xHhZnMeDL;v{YgE?@L6xa@T1n|T}aBsS#UzINk7 zwe%w0Ph0=r2rh2j|MTC|iOJ@Z&(335F_odA(dhcG`tb7K_Njl4#_vseZQp%r`u{f! z3(D2gyZfi7cMJS_{K_EV?)x>}7cX9n@Jsjm^Jr`Q#r=Q&eLr#R$L|?D4N;s75*p=q zHy*oF?-=!er=aEM`J4ZL(To0He<7#m|(T=8KzaNxw``qklg<)%#J{$KP_UPmSR|K~q57A@^r?tX3d@BEz? z`+JW4DlMMND9Q2Ux$@8FuXRNJWaPZ4^AGAf@#pZH`1k(*tG4}^Z)9}YOe~+tWetx6 z!_8mof9R_}|M&mN?fYC2KIi^w|2u7QuO|4TJ;SndzNP26?yaaVe(JKO^Wbi?fW$cKX`? z&;Fgh`RM}l=K1W*Vv}^ww#)Hz&B$CfM^-w?>=ZxSQTqcjp`vS-ecit%=kNKW^&2L{ z#7tZJe@davmVf-4XU=$aZ`$&^B@YiWNF-@f1dTmNldQShHRD6zFL@cscQF)PL=5TZ@(6z3O58yS+YT^SAnj_(jYO*Eas# z-?Mdb_T&10>;KDbnDIU@@Xz$5ck>UQ?OX8w6I1&m`3K>g3>i~v{%-%dzi0jXf2*$5 zia@BGn!@2pAi#`QO4 zCT!w9;B?^M#ZKmeS|*05qp$1Ve|i$H_pkZro0}pcMK&Tbf1Lj5MR44Zw<=^1Q)5_Q zy6Nxzm;3M4)_#}I{+k|n{%y&p^;71U&da&e@cgh^a(`fh-Gxr(4WN)(_;-JKe9aH; zjW3Jm^G2LlecoNB(n#Y#wlcRN*M>b?{xR$LF*syr{D1Ge?O%QF_i$#hNyY!|YfLm; z4jy#+RQ~uw$7+Vtiq?fKg$&)o3>Ub3FK7IJfAM?$kDLQZMK9-H`)}lDR{bcXhh68% zSBnJ(u}M~i40&@H8p0wBH!1BX-TCGG9s6#}ZRPKr-;2oH>G=~|xz|!)ig|sbvpU~_ z-pp%vEN^kX*nB(uzToPxb$oeo+y3n@`m?m5HRbhx;qR_77UCiwzMQCHWj9YP?K$?` z`uF2^=XNca^H+KHW1om^90iL@7%p%rE7ytUAH8*PYt;Xpiudm>`k{aHj{SC}>5Ot& z+e&x4YdmgE1I3rx%3T?)6OVBmSo`CY-`f8=?=HOSFjjA3+VbymH&5TD*jSDWyZ^|| z%X;&GVMinr!>_!Q6xVW21@rXN&iqIASO2)r1}X}QKg#c&J>Rq~j)Spk`qBLgd=IX1 zFubsS``=vu`M=_i@;Yhfmo1p^c;VOiMlB56-(_s}{>XoUd8&A=`J?L}mep21pT6ba z<`p@A%RjB}*<)yT^9`p)svS$k?wLGd(`79zKfkZ$xF9`MymmSBgJ(4#AL<{O)-J~r zaUxqk>o3S#-l=vh0ax^N_Ba2$fAWmI!~2l9FLN0l97}!uf4cnNpaV`t@BYtx>!`Tx z-{vWwtQxj`dtJSJ=A744IOYm5sIJ(P(D3Bs{;k>9*>qIm|84y@y|Cz8>bH=J(v+8} z3K1P{%`&xr|9|`D|F#SotHJfsg8p~AlGhqHbf38PKfG_h$c70yf6uS|ANT)sMODh) z>F&RtnI~u0?D`yW=c;7)tUdQ+UWom_Y$(bwC7q>VU+^FOoVPD-<-NAod3N({*Z-h1 ze=p}-R!w^Qez|sJ&2(Aw-|l9|7pBdAB%i>^$*|z*zD>ce?YmD;uHX4{{=Lk<%XN)f ztZaTu&1?O*;T_wFvj2bf{atWVB0WioAtK6+;l=Ko_YXd}waw;>!=LS-7J=f;U;lgk z*;rEyC$)B5ufLTs;~3MY-DZ;2ySo4F`N6Cs&&W`#&ah+KoZsiK)vy1r^X#L4)?at*$(35u4V=STm48G9~#xB0mR zQNqa|H_qT@w!3vxAa~;WzmXr(ALj3qUm(lE0E+Izo4)?PF#o^BwRN%51-5?wrhYwi zqVL^mEuLMg4>#;ij$QLk=lzVkx6h``>E(2_ckt$9c(L0$|Nqtq!z8KHd+~p+dPn__ zykdM?x$iA6*NMm{(`Uyr9@aSAz{9l3SmAKvZtK^Jrqn#Fw^rLd-}tP{_7B(Z@n6VW zrT1%H@zTc%Pwju6TI~04;|`raqW@DZejeX&I{e3!{=X3`8VsytpCsCEX+?~OZf1DVZr;n_*(ZhQ9G@&rmy|KUZ!3%K{4w8>8h%f zy-I8hE85D#f4%!O^|WJ&|G$Gt^X{(up|2YMPxL>7gD(rim%CHXO+93G@!+~Q z_}Im?>5t?YR!m}O2wPFge<1ze)7p(s7lNuza7}vR_LI-IFEBD>DKjh()r;RJV*2aU zx&I;?Cd~P1|D__p;oRTnuk9He*0L~cIrP-8R+i!Cule#j=FRzCpH>~vvGzZM!&?@H zEly<&SGKVq0JR{e*RTDbIw$YgeDZq#+5b9EZoZBB?|pLT z|Lw^}3=9Gc7nCCZ#IH<{e31UH^;-QpegA(?pVe1QU;AGYbUcMSgTrc{_&I%v&%e%p zeeznp`u|fmujlYFFw{9RIIQORZOU-^f5eG-zK)7Jznnj5&(Odx%y7XtEm4VV6% z|C;i8|IYtLart~lQZ}nIFn}vz}9EEpNqnihXN6!4a5$M<{w ztY=PN```TRU$^C*Hy3{KGi=}h$zNwRun}kMVJO&|zCHUdDD|8_;=;fHt`E)11s{0v z?9%yH%&D-%=I8X;|6k6%R?pBNtG6hGBL0nYJK^cd9T2S$4m@K>%QK< zQ!kl5n{(}d1_pCah64^KS{uam=Jh*1WnusaRnMH?=RuNpWEdHkmE9TB+Focee6^_8 zdju-Gqy958q_*FFZkJ_+7Md(E^zJtrE{Rkh{4>S;lKgQ`iISp*1S8) z)(SUlwE|bOASb;5>7M+X!EVOCgay->*2#)8T+#6VCu{OO-sjxk?7!>`J4%@t*e*@g zp8ojH8Ft3pWncHtsrhLyEX>GoV68BN!3I#W7f)mRZp3i-?TN{P>+R%47JQXwSir-` z!2I^nQb|RIwUgKWKmV483zCeg)EN>Ua584hhJ}iTJHvs169NyKUw)6?E%8A;|F6o5 z!wc^|`{!+W+b82MJA;M?!+{GY<}%2~ROCPKV==O+t4cCs*zk3K2Q+Y|C^ICiDDh{B ztEm6>{AtGI?f0%Q8oW6-zx&6#X$u5E!S|GtLBdLsX;1yXy)*V%$mV{$7M;&}`0UC3 zMSkXw3$>0hGc;^sVc=Oivs--EX~x?ILI$Q^Hz!ocg4>LK{}>r`WEmNp*Y1}2aOn4D zdwnbj z`&mA{ROdl@uzmOZ7fcdbH-G)Vb8f+e+Oy9X7!oo$8CG2S6LFx3jZs~_l#ypLEI=dV zm>5=-l?oUXXQp|Uv&hu`%rKDQdu#SR{?yGhr`Prj2aGl{GbHJ8%$R2>e|d9#+|HuV zHBlR_!q#d0{D=&^DjF?M4TJL1FNFMgg8D6`@eO2%KxQ*Jox7P z%bDDTFF!4P_rFa0-<#v?%?GFI|Bw2A+Tw1{@s$$%3=Gry85r^|JiU3S{@JB3=b0N< zJ2&nWZl3<=)6~;<3m#N49y~3)o~8Naje9#c*MB(&DtP{7T)SggmF++CfUmTyZ13d% z-(9||H!DB?xB2V+*Y%R1Ccw-Y91IN8rt>jGxCI9X7d~3A-h6NoI0c9QVP^Q!&cHD3 zruqJbUn?i1+^*mD|FShGvHVSCVfgi6t#Q5tGpIxM|46N%_&HWq8{19yKm~x^B}RtY z4|CPOv%H;N464V$`N*D;;mg7De7G z;4uHGYs2xfcU-@opO{?y7Tg`4`-hn!L!FUf%YlD?*&m(gj`R8L__{vQ@;g6+gEc3^ z0#&)6->rAuWzbn~^RxV6OhCirdIpBKY77n2PP8`k=iC?6neV*&?BD4{+h&52_Jtzt zyy(*3*O@X}FE9Te|6S$5`+uMB^G>^#t?y>@`boT?<@fp(H^qz>HnTD;I6KRJKvte7Nhk1yyib|tGhkg z{}>tAS{N9jG`=(D{Jnl#hc$-jyzQzV`bR;D=AaTo!!)bHq)pOH0e*Uat+$zLJjvL6 z8WgdNN(>ER)RWcltKC&SdLnU|@4;WBC66Us^X~e$%7< zdqBNWd4>c7NWas-;MhCKZu!4A|4B$obFb6&|NC@XJ@@}pRm*4gyf>F-W@tFLgqeZO zXCB9&@csLDR;xC|e?2EHSZ${H&wF;}vPTJzwOAPrCG%ve^elvWV``}f6u7n|L-kM8d0o^}EhP46E?FfbVWh+%9{oP6|u z-~SIDZ+?!P*}{ugcg zvA;ksA`O&R+om%xXqo+*crj06!hGKS+ZXCzXa2PG{~1o#dg(JJ!5^E`7K2iXqACMJ zUEbqkyc_fW?s|8ADHqE#?tj<&&g}j6|4YlF{knZ-yOTEE6lP%HQDHf=oWmb24jz3Iu zXJ9bc!@}TTxH{QnTb$*^zb7A@*!jQqY#PWf&Uq>fTr)dYg1Uoj-g$pO#Tk!1BSXNH z&xOrTQ#Pyn9j#zsF!;m5;1HOewCFac!|&AB`wy@&ERbVjSYR>x3A^*Tzy93W3=FFj z85p`wGdPGl?4J3Xonb{k1A~TM_y6GDou9T{`o+%>pw7s!LB&ssIb-R}v{j(+cBo}x zI56qNw@;UMF+@GD09DZ|rZO-@7~M?E6L+XiQAl=FW^mXGQgm{98f&`sjNj}G4h#%B zD|r|;{aCU;=P#5i!&tHNrsx-cy%ZbKZ-xvESNs?lbaq~U>@X)+t?4PK5!g`4#E=jv zlUEkOaf7|`Q~s^`as~z`1_qtUbL{PHHYrEgJ^RPVuwxbjLxhcwZ*fdXin-?_ifPp~pDfJJvZpEX;~IQ@i=@zuHDdi#LBFayJBz3$7+n-v?D zHawN>jqR#uU|8qL!0_ehZ9~a+w{5IXpPc!>GR=m8;XxD&gTwtfot+g2QyY{v{n-A6 zpP`|ZgP~!cmFQ!q202ZTdjy#n7QAm^*zWg{pW#5S5Cg;735o~)O*|{ce2?X*Jp+UJ zVsICjAu7qY=O}2bV%@ojg51hi`rH3T|6pf00KST5vf_bs>-*iitzS3sSFfLGy>Ldj z2m`}|G!BM_YrjgKZ+zEonLfMI!X)~Szw~4Vh6iFC3=Ltw&)&Gj%a|q4X>sdK*U2=0 z28IJ`LH18qW|U<5WW3lvP-mH8fe9mn!3A)3 zWM;SL5-7 z7w9NHh6PNZlj0awG=Rhyv=l(psMKg^fYQNmN*f>gH$*-!p1gA7GLX+aUHx3vIVCg! E0Ouw#u>b%7 diff --git a/assets/images/logo_dark_mode.svg b/assets/images/logo_dark_mode.svg index 93ddd1ed..076fe6b5 100644 --- a/assets/images/logo_dark_mode.svg +++ b/assets/images/logo_dark_mode.svg @@ -1,8 +1,43 @@ - - - - - - - + + + Wordmark White + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/logo_light_mode.svg b/assets/images/logo_light_mode.svg index a0db3fd8..b75d4059 100644 --- a/assets/images/logo_light_mode.svg +++ b/assets/images/logo_light_mode.svg @@ -1,8 +1,43 @@ - - - - - - - + + + Wordmark Pink + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/match.svg b/assets/images/match.svg index 3838803e..3ec081f6 100644 --- a/assets/images/match.svg +++ b/assets/images/match.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + diff --git a/assets/images/sprk.svg b/assets/images/sprk.svg index ad04aefd..6e0f4169 100644 --- a/assets/images/sprk.svg +++ b/assets/images/sprk.svg @@ -1,3 +1,14 @@ - - + + + Icon Full + + + + + + + + + + \ No newline at end of file diff --git a/assets/pubspec.yaml b/assets/pubspec.yaml new file mode 100644 index 00000000..d6cbb6be --- /dev/null +++ b/assets/pubspec.yaml @@ -0,0 +1,17 @@ +name: assets +description: > + Holds the assets for the app. The assets are included in a + separate package, to be able to share it with Widgetbook app. + +version: 0.0.0 +publish_to: none + +environment: + sdk: ">=3.6.0 <4.0.0" +resolution: workspace + +flutter: + assets: + - icons/ + - images/ + - branding/ diff --git a/fonts/lib/Fraunces-Variable.ttf b/fonts/lib/Fraunces-Variable.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c3f165aed04f6aa172787228268ae75d22c02cfc GIT binary patch literal 357632 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

9UxPxI0 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%0Dff{}>q=8Ge0!|My?3JR3XLKSm}_E@lQc4lXeT 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 z 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

@kj5NYWVXq6|iOOJT@IY2goMx^-oxH(xlxOjQE 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 K12aq|hz9`BDo26< literal 0 HcmV?d00001 diff --git a/fonts/pubspec.yaml b/fonts/pubspec.yaml new file mode 100644 index 00000000..540a5a68 --- /dev/null +++ b/fonts/pubspec.yaml @@ -0,0 +1,20 @@ +name: fonts +description: > + Holds the fonts for the app. The fonts are included in a + separate package, to be able to share it with Widgetbook app. + +version: 0.0.0 +publish_to: none + +environment: + sdk: ">=3.6.0 <4.0.0" +resolution: workspace + +flutter: + fonts: + - family: Fraunces + fonts: + - asset: packages/fonts/Fraunces-Variable.ttf + - family: SN Pro + fonts: + - asset: packages/fonts/SNPro-Variable.ttf diff --git a/ios/AppIcon.icon/Assets/Icon Full.svg b/ios/AppIcon.icon/Assets/Icon Full.svg new file mode 100644 index 00000000..6e0f4169 --- /dev/null +++ b/ios/AppIcon.icon/Assets/Icon Full.svg @@ -0,0 +1,14 @@ + + + Icon Full + + + + + + + + + + + \ No newline at end of file diff --git a/ios/AppIcon.icon/icon.json b/ios/AppIcon.icon/icon.json new file mode 100644 index 00000000..dc38b30e --- /dev/null +++ b/ios/AppIcon.icon/icon.json @@ -0,0 +1,39 @@ +{ + "fill" : { + "automatic-gradient" : "display-p3:0.91748,0.20032,0.55762,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "blend-mode" : "normal", + "fill" : "automatic", + "glass" : true, + "image-name" : "Icon Full.svg", + "name" : "Icon Full", + "position" : { + "scale" : 1.38, + "translation-in-points" : [ + 0, + 0 + ] + } + } + ], + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index ae4a9728..8762975b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 22D5B0E9A1860BEEC6084203 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44DF6CB9CFAE3FB41F9BF8BF /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 59C723F32EA9C6BF002F18BF /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 59C723F22EA9C6BF002F18BF /* AppIcon.icon */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -53,6 +54,7 @@ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 44DF6CB9CFAE3FB41F9BF8BF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4E62B4B048ACF350C4CFD2DF /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 59C723F22EA9C6BF002F18BF /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = ""; }; 59DA3B292DA45BAD00C44421 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -110,6 +112,7 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( + 59C723F22EA9C6BF002F18BF /* AppIcon.icon */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, @@ -261,6 +264,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 59C723F32EA9C6BF002F18BF /* AppIcon.icon in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d0d98aa1..00000000 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1 +0,0 @@ -{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index e339a4105c5b65ceab6857e4304b4dd012aeb8ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44354 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 458ed40dfd9328355e465d3fc4beac9cb77c908e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4mJh`hTcwDUIqrHo1QL?Ar*7hUXJt#36weh z@%_xJp35?HnA>xB9DOgFi9|bi9oq8Zpn}qoc8zAPO;fwLUM)PTk}JPR>59YT0!eL0 zpUlR9s?2ni<#Uc**yQ^9)fo%(XI!n7XBXA+e=mBs^Lg?4pP%8S@{I=`>~F4`E0^6O`g>{dmFwmKArU?uhAls47MAR||KMXuAFou2TZ;hCk6)ZD zOe!jB6DG}aO3L9XJSurb&-U=uO{aI(g})tmmpnfuk))HcdUL^* zYb%?j76$hH+4oxcb&+|&rz@P(Qd4_0YF=1P;fwH7>)iOVW|iK$jV#ltXHTAfs z|0=??K@PNQ!i%Zk> z6xGYu8kN0aecmmX)Bk=$RiT-%(gCI8!G(JpW{Z9oIdfDaH`!#y3>mwbhZa3Pb^pU3 zF`EsiO*(RG^!9Wwe=Z&5+IPw5;1^Ew+8yn=87}hgZf^H>{Jm>ojk3kc2UAxx@fU1J z;C>jh)ZOO)*MwIKOg>C43%8E*TxR2c;pW%2-$~EUi?ftmw9;A@b$GFRUtrY}MbF0E zEggp|j*5SsTF=Gycp2yRWiQt+xZm`D()$_CKdQ}7bP0l+XkKAX0jn diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 121526e5e8bffede7dc58f3c699ab26f315c0ac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1794 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2!dPI|gHhE&XXI)gW0%5ll# z_0{(|R;WmHHfXp_&M`^?==_)7L$jbydRF8Si^M z|41B9TDmMaH^*bqS{Eme6%HptJhcT~CMw7sKVF@me&71S_T>d~24{W#8=G(5eE!|$ z{kQKvzj^n%h(*GLQ~VLj{+l}ZzY=z6Hh2&+xAx&F=eSdju{k(*@%jY?)iBv`j-3)V~5FsX2K;J zZ+BHKzub8-;mJbxq|&ec$No1>+#h*JG3m4Way#p# zKi`Tfyqhv<>ddq4@^X*An#ZM{xtqM_?W&b~h1hZ#FYir|%2l}j=G5%7XV0pfn{)R0 z(fPmGG7KcP#;E(VMy}KP-}YmNi&0$M>C4^XrE^tmPkwvR`BfXT{b!E4TWT6* zh)&dRCY-oM+l6_ME8s-Ww}ie_ys^J~buTXjbOIzQmqGU8Uz=zxmX4V~5P2`OJ??#b-q4C$nKIn-qa4z{rLpnJoH%M+U~~SeUdUXp&JThYp4IL2T)(7Wx0M{$@*Q5ow(0j@TNz!8gLeeiFP`SUc+1Y(f>&+H z-#IisFRaf#ZM{RZ3H~tUm>A%H#+!n7pJCS$YWXG)F-+_HKf0elP z&MRrWh^i=8dv^P7L(r#L@osXdO6zZPz7o4|{?YZVTRzzu*(k-N+ZW4l700HsPq#Sr zd5gsx9q-6<+urWv;gfMnUoSm z^Cq4A6a0~>?BT3chwJ}1{C4gB+7lkM)k<>dRhf6z4w5^A4mvm8oU-%cVZHlebJ=S} zt1Yy-Y;K8InqN>@C9$UOS&zjL)xc}z4WD$CKHocYgoTZr_u9>URvfCoW1gy=`(!?` zELq*@sr0wZ%wyrD%r_R+daqo)`s!8ltA`lN`=)K5==4$M?V_9IO!16`^`0lrpI6U2 zX7cRpeD~nqiFf^*|4up`cgig5=>6Zk>)ai9g90OVskDk}W>+kF%hJem{nhIqJxLo^ z#y{M{^k&N9$6W14c-|>;va&zj)2n6mYx=veeB-h}Z%*@bKmIQL-=BZw?@D=_2lWi^ Y*<8Ce%=bCQz`(%Z>FVdQ&MBb@0H)(}EdT%j diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index 0e36ce4061326f6354cc2f6677250164690909af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2858 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index 3e0bcc35f8f258a1774081abb319460f9fdcc0eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4279 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 Qfq{X+)78&qol`;+04WV{=>Px# diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 121526e5e8bffede7dc58f3c699ab26f315c0ac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1794 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2!dPI|gHhE&XXI)gW0%5ll# z_0{(|R;WmHHfXp_&M`^?==_)7L$jbydRF8Si^M z|41B9TDmMaH^*bqS{Eme6%HptJhcT~CMw7sKVF@me&71S_T>d~24{W#8=G(5eE!|$ z{kQKvzj^n%h(*GLQ~VLj{+l}ZzY=z6Hh2&+xAx&F=eSdju{k(*@%jY?)iBv`j-3)V~5FsX2K;J zZ+BHKzub8-;mJbxq|&ec$No1>+#h*JG3m4Way#p# zKi`Tfyqhv<>ddq4@^X*An#ZM{xtqM_?W&b~h1hZ#FYir|%2l}j=G5%7XV0pfn{)R0 z(fPmGG7KcP#;E(VMy}KP-}YmNi&0$M>C4^XrE^tmPkwvR`BfXT{b!E4TWT6* zh)&dRCY-oM+l6_ME8s-Ww}ie_ys^J~buTXjbOIzQmqGU8Uz=zxmX4V~5P2`OJ??#b-q4C$nKIn-qa4z{rLpnJoH%M+U~~SeUdUXp&JThYp4IL2T)(7Wx0M{$@*Q5ow(0j@TNz!8gLeeiFP`SUc+1Y(f>&+H z-#IisFRaf#ZM{RZ3H~tUm>A%H#+!n7pJCS$YWXG)F-+_HKf0elP z&MRrWh^i=8dv^P7L(r#L@osXdO6zZPz7o4|{?YZVTRzzu*(k-N+ZW4l700HsPq#Sr zd5gsx9q-6<+urWv;gfMnUoSm z^Cq4A6a0~>?BT3chwJ}1{C4gB+7lkM)k<>dRhf6z4w5^A4mvm8oU-%cVZHlebJ=S} zt1Yy-Y;K8InqN>@C9$UOS&zjL)xc}z4WD$CKHocYgoTZr_u9>URvfCoW1gy=`(!?` zELq*@sr0wZ%wyrD%r_R+daqo)`s!8ltA`lN`=)K5==4$M?V_9IO!16`^`0lrpI6U2 zX7cRpeD~nqiFf^*|4up`cgig5=>6Zk>)ai9g90OVskDk}W>+kF%hJem{nhIqJxLo^ z#y{M{^k&N9$6W14c-|>;va&zj)2n6mYx=veeB-h}Z%*@bKmIQL-=BZw?@D=_2lWi^ Y*<8Ce%=bCQz`(%Z>FVdQ&MBb@0H)(}EdT%j diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index 643b75cddbe60bf7cb1a7142aa1c0ee77766250e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3923 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 JWt~$(697;ZtIz-d diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 17fae8f196028d63ceeee7425f57fb30f442a513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5948 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 P1_lOCS3j3^P6pCS2~g z{r}46s{As7qNmr#x) zT6LZCQRG7b$7x=V1%)z|_-Cf1{oDQBex}WtB{MruW}cr{_x#D3JJt2y@7@1i|Niga zy6@lnj~%}p{_H=)toc!l>+UYDAn;;G54 zH7v!ZWZsIaQcKsJ z3F+Fn=E=-wWzvG4HK#l~-s_v?FUsF<=T-UWiM_#trT=_7=dGH;`&1=o6ECyWMWZdO z=K1$jw6$L^S5@ln*U|3!`^!95%j1T@v)+p`v2T2z-Ce(P(Z6Mj>JFU#+u0l4-QUlz zHo5bsyiUT`Ri=99-wO%O4eO6udMs&UKvY`Dl=WPjkM_8&J$U{6^>ynNEdGQ~EZHG{ z((81)%8Eyo>ne?t%+>^YXq?J0so9djIGyiF@w;1&U8>K+k7p{$Rr#A_t=+mnY;u;S zW^L2WoK+JxMx0r2Z9<*x-G>r;tsE{gO61NwVD?pfP0UwwsUK!5)D{P=l(<@Gx-e5! zCW%QhXwmPEj^!)ELc6wQ-fpw}oOb!q&xA>n`ZiZQ6#De(lgMQ42{S9(4>dXMsok@> zcQNngI&;Um|i3EKKKiWP%*7y9-cJaEBIabwWf=~1QJr_GS z$Ljd6-q$ZaT{&1LHc9T!|G>TH8p4mh7t?L}nG-CtzGRk5UyWd7(H^UFKLu4(H;JBF z9jc|`8JgJlKJDJ)tqTM97#B+!r=NFNef3)Bg?>d7lNNL4z6moYdnp~3t*TM)@Tid5 zGc~nN>QGSUi*2#L4S3j?@295-3Eess`zw5b0ee?{1H&z0J^cqOL~_-GwFTF@MfbXF z|FEt{(%P%Ag8;_HZ{mWZ>5dW)R>oC{X2ZjG*3*r z`B1{oHg59GmXk3aH8p#R1Xu04nE_+p&}DCa>ta7kJk4Mltur$;%4f z+z4F$d*_~q!rStK|5Zgy+Yn$bdS5H-rvAB~R|T|RBqWNO@N%VGpC`K}PV#WmPi}+L zTbECLRa2z@N^GO^WN-eR@~k$?j(%A7rMKwK-J`YMRi}8D%C|IGUr23Ab~^Ord`-R8 zz4Bk1GalbQWm#w~ICY8B+N&RyiX5MQL{Q>J%i+`fR#S9uvaeFOP`WPe{dFO;eQe>v zi8rc@@AY2g`~AJQW@4f=-{dnkmzMaxQ%$;19VS!p@k!Y6ny&ft=g*zYl+_3jH*P`oX3P~qcmnC!TU*zVWU)lP|dDGJTyUs2u4_(xbwsl?<&e~IL zKZ|eLn=@Qw30wV)qw(!p7p9EmQ|#}HoZqPIc}7amTlkQt zXTzP_Q$M-hSs7?9-r?cZwjs-_mnWXwj!L*%W=fb)FIk&v( zw@(x;y?=M#(cPz&UYyCgtO5DR~=z-|UnqY0EnJcuwVe;cM&G&YiPU@ zSGOW7M_}|1jrX!io9z~6UOteu>EFSp$&dS|%eYKT;a%18ecu72yp7#yUlz~M$=fU+ zX>{}Kb0NWrwkvlnJyczyTy;vNeN+21r?j7DdaTc;9xV#{*EadMzksRHs#!T;2T!#6-P~*Zj`4v0sWbyDVt$r1{8hX;7VP$ojsh&W`P#k4l{?zUT49i`&#OaOQ_k zbDj5Xg^6U=iLx6CIv4n3RxiHwZN=1%3RSgx)iyO5^`*l1s(+hkoLaZWd)l)gjjL~V zyyEtYTXV`{X3eC(o$M8+kG6|`RZn{GYM+;7;`hr-*M41;kz4Sqr=#c3jKF+@q!f|8 zhuV@YZD(BBJN4}$b`{U}*Cx-}dU$EX=^V4orQS@|Ph6Cq{xvx=E6hA_&68Po3Nv1J zS+#yl4PxB=FWq5&x<-}MgoFDvC%xMhZ!I41TzXMKiTTZUak=vt_y5s9b)I*>z|Wlz a_doyoO;D6gX$}Je1B0ilpUXO@geCwOABlqi diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png deleted file mode 100644 index 33257d2c7235ccf8f79b00ca331e857bab3f8065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4977 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 NgQu&X%Q~loCIARO)bjuU diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png deleted file mode 100644 index a65cb1ad6b2407eae589db9d42afbfc9a3f05cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2694 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png deleted file mode 100644 index 22c13682bcfc5c075631e384da3f9c8ceb18cc90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5603 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index 17fae8f196028d63ceeee7425f57fb30f442a513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5948 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png deleted file mode 100644 index 905ea28a08834605d4b5e97ec55a7095678b2450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3471 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

he%UwY%IWEHt70R27anFW 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 BBJ}_O diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 71b660e72d487bd3f75cc5f6dd0ee01edc844138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8476 zcmeAS@N?(olHy`uVBq!ia0y~yU|0^q9Bd2>3?*VdZx|R99(%ethE&XXJD0sgB=mRt z{F^yuoGM?me3uHlGXCXma&ep`s>#(PucUNo_ktB192yD=H4Q-`ISQdV8VU;zwL3Ui zF)k^eASA?*x%;zyx!FXAO{rz+<>`|v&)sz1WNrMt?N8C^>ibE3r@{k{9dKx$!F-pI znb}?9k;w(!HVfX8Zbd)lyGb3F9k$~Zl2!0j^O?ly$rL$ljpiOj>FCQd23 zn_heR^^?lNwrYhlK2A<&BAgCSDP3{R!(+zTg{O?1a?Tz3z9}d8+TNGfzSwMhclPol zk;|1G&8EwCN1PEmdsLG}-z@Fs{|ul1{~S3cE?aUh;NRJ`PcjR;CY}`L64g8M`R%O> zKR&u$=~%a}X8xQxXBz*qN9-&TjX(FhYqGlks=9R&vdV`(@BYf393S>XT~&AHmMo@t-)@M69&YQ8xh?AT9apV8h&PTmOIk&bH*lKnryY~x8@1FWY`=gv~us$fP=B~T(ch{r2 zf`>UcKh}i*&$_NxWAr$f?{BTf?evG!YWVz@&I#O6p!kdLjq`6leE~_ynQuQ|xnffH z;~%?QZ_Rw=_Wp`H-yJ3`Kbko?S8x5wu)SK}@5WzVU3SFs?}M_eEvss7^It=BryzvhP9J1d;H{ix)y zo5r#d-4(Y#)NL#LzrR{cntg|W)x^?2i(XmsCQE(z8D7l6&tLxf*N2XRXEk=w8>Rm2 zaf*#@RP*n?taax>%FUNm>krKpHOX8Z^5yJ$*X*~>tAnn6)6{;lbWgsN)2b)8!XlTQ zk*zVR-gW!XnIk!7#=kd5npEsibnln>y5u*b3v#<6MC$W+(KH zN{Y!X^Yj*EUFeYMVZqJc;&8L4_J(kgwo)#uM9Ql!-=aNd1iYJ1URDd*5a8H z`&4z?U+&GgsKitIn|J+f@&Dz@^KPEF#Th1Kc~bIPvBNK~n{!?Y#&!nZ_}%j1j^iJ9 z?!%iu-17AE{dU9q_|(To=H0Eft;+MW5#n9R$M*8klqDIsX9xZ@Us+YV zKm4!o3~kH*dsfNRp8me*tli)0%DZ`Cmt^NGY73t7?32^9OA}OH&RLdQ)uneNvvAX~ zlIbg$0$p5O3QYfLg$q9p-8qr7vCX4TeBSTJd>Kl9mt_^6vfpg{T;u5_tSYV$=oR4h zO7pV1cAA3j&L>YcXvnLs(C<&*`ehQt#Fr;a^eVOl^5}2LKYf_@Rp6Qk!>6_z4_a0{ z$e*Sgdn~=!?)jgepY`S|yG5nTIsX3s_WO$Z?aDey&t6T~cJ<(MkB}u=)*Y!oR+R79 z{U~YN?B0yq2Iw4P!0I9YDh@A{kb(~UIU z`||muz25KJD`A_(b9wpMf-Gs#*-Gj4a)pJrI)W3{J&c&sY?Dbk{wdi9jCo4O~?5gP8oPIuVSBYlm z+h;B-jOB%lx6HcQWN`eSj9l@H@`&#ftFMbW{C?V^&Js5#Z%%&tr-LnqQ`QIETU^E^ zqLCo)8g24;>h#@r9?jL;UD&fT{koj*k<5L^Kc-J~R#>y}x^K$kU#UNK3Gc|}n#QEh z-P-WoiR19qyhsJ6le0|oAC*=c_8;4jd3yerS2ur)>C1*6pYi+gx64azK91X--_nT@5v{L;M1kcZ;0Gg^5f*{V?W8hzjv{8;^*{N?|!!L-}1hL z{e{~cCBNU_o((-Xs^{Tx&nC9@Us&tSzb(J~A9v^F6LVaSEz@}VeD?k4 z@A;;^X=7jS>DTfz_Q)mAyS461p57`y#$2N4*XYrs`e=h}Z{O2X(?5Ieo~jj^@^qGH zjZK|Yu>CxzSru}r-QR8#hc6#UIC0lNp z%LaAk9ns9`eUuY(B=Nb*g@9gvuT4p2?FJvt+L`3unsI&iw+A;)zS)2A%a@Wqd27d| zr$qPWudg~LE~a53tdbk!mY?{&sH5~v<8)=SHEX8->WpppCi{uuZbz_!5VOkC8yx{n z`|{>KI{I#x$3-Q(-2eBiF80=sT_VbV@gf0f%lH0H8U-{@^0_yU3GQUk3D}69py4iKj>2z zwWaC1ThEg>t+TDe3w3UVFn2fJ_~F9W@JEj0gy^-9AFG68_Ahy7_we@4sfM@8PjHv0 z`x%|_PU_+}Tq-Chwos-}FM87)aqC~|M;!jx+I;;ZY;((`t^A(ExkIVlQ@-o0@m%;aEy z^xAx#=IaZ+(*K^U&%M1ecKNjXxB7La%=a`_zp&)x<2{Bc8t!~At^ZlSte;RXRkF!p zB9G%Ump!~mYd74^vR~Le)veHZ*Ms-(cDY=Cv_)Cl`e#YDhBN!#qx}18mZ$9epzgmV z({Jvst&&y=GvaTDHow)1dCeE9dfl>&YvzJZ&PC1%VYk%28DEdT8{#U^ak=k?PHx{_ zm-lkDGYyMpg-cr4EKIp6RP*a-Nluuwnt9NTAG2E)CWOu`-8kW;RkSjj!zMf72G(AS zlO20vHY79}&GMUTcl5pT3e`K+(#!Qd{)y)41k~TJxLj~{Q>WUIcsdiOmuPG6;mVfCrnTdsNrw@kj=e{ZZDd3nvsQ;E%S98rZ_F6T}s=I=dQ zetO#Hi%UM&SgRgK@|Q@txgUgo`9S7APNb;zTA!+H;$%efz?HAbR^GPo{`E&a{PkX-b zxso5xew(cEkWsX1{$CZZIWOC%OsL>L{+dBBqCEd>_0;hGd3S&QTAlym`ttpkpKRZ! z6y6c6u;;dV&-??k;;$Qg?>@idbzW^n@o%P^Tp!mr&&l|IFXYg>MExV`HuG8(&W1XC zvWfh(zvRV_MMk@}<=t${zJ90UA0Zh5-5Flp5Di@_<)DaKkr=5eR+4i`d{{MM`fh8 z*cTmG8L-f1?<@V(@9&>?Oy?`?D*dCJ`#G}O>c6jNSN!tWjxxryy7g-FJaVR~)tj_V zwO^lf=t<$7_}6yxzgd|J3xC!)x&Lw7Puz2+xv9vVk05w)~NHUy?d&i>N^%ThNS@B|d9{)*3~d z9oNbZh)*dw-8-jXQj1SOxZKgeeb-Z}_&Y3I)r{*ogSRN2+8VMxaB9}o)tYfW-|tlS zPg%*$s`%nEeoj7Hw%~{KH{&CyI1q!jRJK%2b>X^sng;l$>_2U=HoZp`9eI}WA>XNvu)iWe3{QhLlxGR*mBeLa2 zQ+n&3yyNd5g+zad>zU+yPs(SzT&(H&{=5gXl4mF0<9@a2%F;*2?!0GXoO$i8tHu6v zGtDQv_1izYY$uuW{Epp?ADTJ8WO6K*_ZOWI-QrpGth{iQX0+wA!+~uEwLL#-V{BNK zmmk`>x1daa&OOGDTFRE2i<}m_Brpmrua?v8x4Smso9y4$_A_pK?qW*+ey4`huxq+? z<)gc*6NTrfcpROX=NsO%GRCmr1jGI>>gGz9vg2)XwPU(*b$a18^lBM)BHEqDqY+EHamz`DQ!}SYk0n zW%8rLGkG6Ra5p`w?Yw^LhAN#uzZTj$1!ucFd(6^TG;?pvq;CbYN@FI(R5VpMI;_2A z9<)w-wsPPah1GvQKXRQq)1OzwCoSU}Ur09B{gOuScH8_WFizWWlZIYyOQ!fJi|CE-o;UMyem{8x(A z{x4e6Wq%}Iyj$Tk{gFsV)XTT=Iqq}W|A^=3*>V>#%~<_wt>^xLPwxt*t)G2*$HmDr z4L&-r$>KlF+>&=xGw5UI8rkmYy3h9g-r}9F_$hLkeA^f2Z_~fNpB;bNGr**}b$X2B zilb*X2sT%|x+%u<%6`V#Xmhq*-g+0;TChGpAHN{;aaxT@X49kquU_}b1sNOWwr#2X zcE{<|{zs(&8urht7r8a4PM7z&8*V*oYIc3nuPKo|5|(qOTw#cOch}+iBau5h3Y+ED ze^0r0NB_m`_5DFNAAKvit+egwpE`@(((B%|-YQJE%e#qdyOVeA{VS}Ol$Qx~#{G?d zyz!V}N$pbU>PKZPySyzIRTrjhs=S;Qmvg07F$AnxxSL$+o&8c0yt0nKe*L_xJseR$@Nw*6f#=?e^x(ebB7Vgyf z`n2$WUD#Qct2P2NG}L7u&EBR_e&GP=)Ubq{`kyUtWNl4vNVcn-w zP55;kcAPS5<(K|!(ZmSV|I2Tk^9tw=E^zI7?Em?5 z39sPS+1;ymZNFe*Ao?xx`ktiA9u*7BXZ*cmzu7hE%$s>Gb2E>;`Cs~U)0X4=Wl!9i z-mrCzpwg_*Q&Q#iFHG^H2Ft?{tlfQJdr^mRF~H zS7=^esBv^d(qozBmO8QzCTy86EVDH3@Gc#RNBh5AoEPxS?#5OTySGfG`&-k~nqBW6 zc_7Mq+QEmPJ5zp-FKg6>zPy;Jd_UJSAJp@knD6=I^BJ#IQ&xqjN4uXp>7%?@X{O27 z#W~+I9Zy+tT-J!#^2OGC|Gh0-er65-YZzVSFFpJDF5ormkFU%cjo;^J9`V$> zGsi?FSvo4J#YIpFgeTckrdK!A3(HYZf^f zu1WGHwhJ!F0RbE4D9(H7bBTXA zd*fT1CC3|Gn=h^nu;kEZILT>#-+SYsLxuv|rJ~L^o;Y=H`(vJs=X3*pU3(HMn&FmR zX}kKxgJAuNrqDS`!kcc@cs~?;=rh;ur25snlf;~g+%6>EipxEsS+^(XV!@m9Z|1-4 zYkge$@ZiV#i+hT7=d0OfssTvh>~D?`?rAi&W44 zR?eEE&a?05-U7XgU6=TdXnJ@wP24MH@c#KnpWjdRi|9s$>~7m!aM$rjPb-s+-uYzC zucqC>`{ynYS}viebm)ru+}dwDm%qI76J*q#_v=cw{ccE`w9R|>^ZO5#oOaEKnJlWE zc4uc<2&z%++<)q8oo>{O8-P{jqOb=ItoK%!h|=MZEhz>;11;tBR_> zc~{2FQSvfYS#FS|-tna~c$xn<&&q>OOedHa|Ni}ncY_>rvFrQW8liXProYqJJ4Irr zish4d=AVyTy{9V+?ODnnB`ET!=fi>>jVmTx%ukS?|K)i}yn(gnGOa!D4$r@~ zOm|~)xr*Nuk?W?LIGtHI{N{d&zqTgw^qli)g0=ozR+$~`_?gbPxk=gSqwmA$yWN-T zxR&HGss|PM&o#WMK666y{-)s53)W3`&)${1pZ#0S`yZc`inbiyW&iuzJLP8+k5AFK zHr;ynw)e}HAJSKTu)XuuuNiKOc1hoHx&BCGWtNSh^w(Fnoi!8In<|nSQ59>OLf=xSI;Kf{WZ8!msEVwb^03jx6;abyzamL^I2(! zdFua9ugm{ztP=JYo9lP?RI>AjRm^kvX0x&K{5eUvY5t{&*ZxfW`LpC) z$^4L8H_YVA^tRR4y0)1}I>~lknN}F|rQ!QqvAwtF?L9oPV$lkR6*8`~o>XP|PCB>o zMUi&dn!MxApFBPV9(w&xcEY|-za;xEEVXdGw?t<1`JD-Gc3ccuyR6oY#qg@`xlPvM znQ!$^1ROibq1E#-sv}ru`_UIKUo7!BV{m9m3FG(I^Zx7VK497Zp~Gh8?vH!kJ-5$! zF2HTO@4o0R;q)}o#H}`$KV?R3ul4)nboBG;FGf?JmR*^CJUMXDhCA+0VxyEx-KO0+{qa5LF5&cLpEpQ(-4C3# z@$r_kt7e~EWmxcP{hRmiJ==FFCY)NhI(+A$BY*RaCuh$3vha%SIeUGL@NX8&S4z0* zZ|YY26vGvGbZxau-?^zl)j}%wb6SipPPMR|drsYVuEWAZttRi!U$jqL+st6G@zCwO zRx8Vr@}8HvN#FAW-tJY=w#A8O z{v6BVFyZ5Af<_O&6zd<=6!1(;mOScb7q;r(v`O+xlZsBw`X;s9Qa|^hh5clu*pIt( z%P;m?9DNt_RwH<6R%+Y6zis}%HrEKmlo@7sPVx2*TDbM7-UaSCsZE(b_RoKRe|x-e z;jUl#njIF}rZ>;B#7)vt)tEiUdD43`t9OgI3%RP7-I_HcFfj1UpPV-TGj5MWGEUok zUnlx|$MGtc)L@!dvdk5nW6zScT7 z&vJEyu#M}IqC4-7@kG0FRARM zd6r=_H$<)V`I8~^*j{S-7ixcL(dLf^^oizm>0* zp8mCZ|9kzH%*$C9rJbGQd-{1)(EfvmSIyVWnxkJ{yg$5QcZhxbdlr{DWy|@#O3!rb zmH+CgGvO@P=lH#*EZ1buZJsIXQ}!=scJFknKkf42HU7OB;%ujN?sT-DzqRA}2k&Fc zG`0&06t-#Kb9*(%s!K%kOiTaq-zs7+zV|;oQC0eVNulq|b9YZFmVA8VI?L|fob%7l zEzI1krng>Pv~K^aC-+L`d2;hyUcWbS#4|kE4w8}EK-&3T=&as?lpefm})k)ahC@|cEulk+4*@x2dmI*h4>8{*keLwTKI<8MC~y!6#3W`|Fkls_~tT-9qS&LjVEn}1T{k(oO?Sc6W>**#pe zCHV8d4ukglFAfHO>Yovqe$?WGxy&@N?0f3A5B5(CetL7K#pHK4RyIHT8*s)gHvjCs zXMEQ!PMW=RKKpxe=ZPENjB_hu{>|YqztrBHwCz!U>f|T0Rr}>W%(l3?#)Ml`>qyJV zeV&S&Q}tv@AFr{}He0i1@~+=^+CQ$@(&&2SvE$ENt;^>gYG^f`N?IB?XX3vPne|M* z2W0Jwl1^+mI7MUO-kTa9nbuT<|E=A9}d;C#NxARlBq_p!LJL;VgpOOAE;rd30?UPS%nt3^! zyzg$b`m-BRn~P}(M;c1+UB^--$ug~B#-tX9*7=X$x~}t^ zZ?!g3n)7+W#K|n{`)-_{K4-F7)-`_S^PDs02IusxQ&-n|{&ta5TgSeh+v3Z2OcT|3 z5Ic3H&*qC?yI;K%)(qR`A@}3F4&YIo_j=s68>HP{PNn}-6CzX?StjHRpwY- z^N9U3%jCcTOGfeMZ+oQ88~J3dHB7Z^9gi?|+RVzjsa8ATbw6`6@7>PN^SS>Uq@9U4 z)+4+2SDfI)-@fTzI|I(|6y#2MP+y|%cW}$f%PRx-TFL&ueDQ5{i^22q#>HCSjg-VP z=FZ;e!1m8|`XiBtJhr>OCw+fs>$OuTytKt-T3>#Au)fcfhy@E*B{lN=Y1cbC^JLG< z`5Q`38pXZ7HZ?ukZt;@&C%5!+6~Fv=_FKY+wehR_nT2E?tIuE7YxaRJwmZ1s-=9ji z-kSKz&V&s?OTB{B-^OyyuR5mem^SH1<-ZBPvTlYl_g>s8ujOX=%*$~xgLxdJjQYb^p zi8!x~LU@PqWS5r~oih9-<~$}!;hmQi$`kRg2q13V094hd|ChdmeczVfeU*WMfx*+& K&t;ucLK6V|yv%3- diff --git a/ios/Runner/Assets.xcassets/Contents.json b/ios/Runner/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/ios/Runner/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json deleted file mode 100644 index 8bb185b1..00000000 --- a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "background.png", - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "darkbackground.png", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png deleted file mode 100644 index e815fd621f1968ac104bc8b687d1d19a818d00a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmeAS@N?(olHy`uVBq!ia0y~yU|Ml_u4iCiVDNPHb6Mw<&;$UQ`wiXz diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png deleted file mode 100644 index e815fd621f1968ac104bc8b687d1d19a818d00a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmeAS@N?(olHy`uVBq!ia0y~yU|Ml_u4iCiVDNPHb6Mw<&;$UQ`wiXz diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json index 00cabce8..879c4364 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -1,17 +1,15 @@ { "images" : [ { - "filename" : "LaunchImage.png", + "filename" : "Icon Full.svg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "LaunchImage@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "LaunchImage@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Icon Full.svg b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Icon Full.svg new file mode 100644 index 00000000..6e0f4169 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Icon Full.svg @@ -0,0 +1,14 @@ + + + Icon Full + + + + + + + + + + + \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index e815fd621f1968ac104bc8b687d1d19a818d00a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmeAS@N?(olHy`uVBq!ia0y~yU|Ml_u4iCiVDNPHb6Mw<&;$UQ`wiXz diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index e815fd621f1968ac104bc8b687d1d19a818d00a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmeAS@N?(olHy`uVBq!ia0y~yU|Ml_u4iCiVDNPHb6Mw<&;$UQ`wiXz diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index e815fd621f1968ac104bc8b687d1d19a818d00a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmeAS@N?(olHy`uVBq!ia0y~yU|Ml_u4iCiVDNPHb6Mw<&;$UQ`wiXz diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index 55c0caed..6359afc3 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,10 @@ - - + + + - + + @@ -14,31 +16,24 @@ + - - + + + + - - - - - - - - - - - + + - + - - + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard index f3c28516..7e9a2e4b 100644 --- a/ios/Runner/Base.lproj/Main.storyboard +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,10 @@ - - + + + - + + @@ -14,13 +16,14 @@ - + - + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 207849c3..9ef1a5ba 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -60,5 +60,10 @@ UIStatusBarHidden + CFBundleLocalizations + + en + + diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 00000000..3dd24b4a --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,5 @@ +arb-dir: lib/src/core/l10n +template-arb-file: intl_en.arb +output-localization-file: app_localizations.dart +use-escaping: true +nullable-getter: false diff --git a/lib/main.dart b/lib/main.dart index a6613baf..1e6af730 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,8 +4,10 @@ import 'package:flutter/services.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart' as riverpod; import 'package:fvp/fvp.dart' as fvp; +import 'package:sparksocial/src/core/auth/data/repositories/auth_repository.dart'; +import 'package:sparksocial/src/core/auth/data/repositories/auth_repository_impl.dart'; import 'package:sparksocial/src/core/di/service_locator.dart'; -import 'package:sparksocial/src/core/theme/data/models/app_theme.dart'; +import 'package:sparksocial/src/core/ui/theme/data/models/app_theme.dart'; import 'package:sparksocial/src/core/utils/logging/logging.dart'; import 'package:sparksocial/src/core/utils/logging/riverpod_logger.dart'; import 'package:sparksocial/src/sprk_app.dart'; @@ -29,6 +31,9 @@ void main() async { // Setup logging for production/debug _setupLogging(); + // Initialize auth repository + await _initializeAuth(); + // Create a ProviderContainer with the Riverpod logger final container = riverpod.ProviderContainer(observers: [SparkRiverpodLogger()]); runApp(riverpod.UncontrolledProviderScope(container: container, child: const SprkApp())); @@ -47,3 +52,21 @@ void _setupLogging() { logService.appLogger.i('Production logging enabled'); } } + +/// Initialize auth repository and wait for it to be ready +Future _initializeAuth() async { + final logService = sl(); + final logger = logService.getLogger('AppInitialization'); + + try { + final authRepository = sl(); + + if (authRepository is AuthRepositoryImpl) { + logger.d('Waiting for AuthRepository initialization...'); + await authRepository.initializationComplete; + logger.d('AuthRepository initialized successfully'); + } + } catch (e) { + logger.e('AuthRepository initialization failed', error: e); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/accent_button.dart b/lib/src/core/design_system/components/atoms/buttons/accent_button.dart new file mode 100644 index 00000000..85c72d8d --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/accent_button.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/gradients.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class AccentButton extends StatelessWidget { + final String label; + final VoidCallback? onPressed; + + const AccentButton({ + required this.label, + super.key, + this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return InteractivePressable( + onTap: onPressed, + borderRadius: BorderRadius.circular(500), + child: Container( + constraints: BoxConstraints.tightFor(height: 30, width: label.length * 8 + 16), + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8), + decoration: BoxDecoration( + gradient: AppGradients.accent, + borderRadius: BorderRadius.circular(500), // pill shape + border: const GradientBoxBorder( + gradient: AppGradients.glassStroke, + width: 2, + ), + ), + child: Text( + label, + textAlign: TextAlign.center, + style: AppTypography.textSmallBold.copyWith( + color: AppColors.greyWhite, + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/action_button.dart b/lib/src/core/design_system/components/atoms/buttons/action_button.dart new file mode 100644 index 00000000..ad595ba1 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/action_button.dart @@ -0,0 +1,66 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class ActionButton extends StatelessWidget { + final Widget icon; + final String label; + final VoidCallback? onPressed; + final bool isActive; + + const ActionButton({ + required this.icon, + required this.label, + super.key, + this.onPressed, + this.isActive = false, + }); + + @override + Widget build(BuildContext context) { + const baseSize = 45.0; + const pressedScale = 0.9; + const iconSize = 34.0; + + final sizedIcon = SizedBox( + width: iconSize, + height: iconSize, + child: icon, + ); + + return SizedBox( + width: baseSize, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InteractivePressable( + onTap: onPressed, + pressedScale: pressedScale, + borderRadius: BorderRadius.circular(baseSize), + child: ClipOval( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 2.5, sigmaY: 2.5), + child: Container( + width: baseSize, + height: baseSize, + decoration: BoxDecoration( + color: Colors.white.withAlpha(25), + shape: BoxShape.circle, + ), + child: Center(child: sizedIcon), + ), + ), + ), + ), + Text( + label, + textAlign: TextAlign.center, + style: AppTypography.textSmallMedium.copyWith(color: Colors.white), + ), + ], + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/app_leading_button.dart b/lib/src/core/design_system/components/atoms/buttons/app_leading_button.dart new file mode 100644 index 00000000..1485c07d --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/app_leading_button.dart @@ -0,0 +1,34 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; + +/// Design System leading button that leverages AutoLeadingButton for +/// smart back/close/drawer behavior while keeping Spark's visual style. +class AppLeadingButton extends StatelessWidget { + const AppLeadingButton({super.key, this.color, this.tooltip}); + + /// Optional override color for the icon. + final Color? color; + + /// Optional tooltip for accessibility. + final String? tooltip; + + @override + Widget build(BuildContext context) { + return AutoLeadingButton( + builder: (BuildContext context, LeadingType leadingType, VoidCallback? action) { + // If there's nothing to pop/open, render nothing. + if (action == null) return const SizedBox.shrink(); + + final theme = Theme.of(context); + final iconColor = color ?? theme.textTheme.titleLarge?.color; + + return IconButton( + onPressed: action, + icon: AppIcons.chevronleft(color: iconColor), + tooltip: tooltip ?? 'Back', + ); + }, + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/follow_pill_button.dart b/lib/src/core/design_system/components/atoms/buttons/follow_pill_button.dart new file mode 100644 index 00000000..8c7869ca --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/follow_pill_button.dart @@ -0,0 +1,54 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/gradients.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class FollowPillButton extends StatelessWidget { + const FollowPillButton({ + required this.onPressed, + super.key, + this.label = 'Follow', + this.padding = const EdgeInsets.symmetric(horizontal: 14, vertical: 6), + }); + + final VoidCallback onPressed; + final String label; + final EdgeInsets padding; + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(500), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: InteractivePressable( + onTap: onPressed, + borderRadius: BorderRadius.circular(500), + overlayColor: Colors.white24, + child: Container( + padding: padding, + decoration: const BoxDecoration( + color: Color(0x33FFFFFF), + borderRadius: BorderRadius.all(Radius.circular(500)), + border: GradientBoxBorder( + gradient: AppGradients.glassStroke, + width: 2, + ), + ), + child: Text( + label, + textAlign: TextAlign.center, + style: AppTypography.textSmallBold.copyWith( + color: AppColors.greyWhite, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/interactive_pressable.dart b/lib/src/core/design_system/components/atoms/buttons/interactive_pressable.dart new file mode 100644 index 00000000..d64d2c27 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/interactive_pressable.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +class InteractivePressable extends StatefulWidget { + final Widget child; + final VoidCallback? onTap; + final FocusNode? focusNode; + final double pressedScale; + final Duration duration; + final Color overlayColor; + final BorderRadius? borderRadius; + + const InteractivePressable({ + required this.child, + super.key, + this.onTap, + this.focusNode, + this.pressedScale = 0.95, + this.duration = const Duration(milliseconds: 120), + this.overlayColor = Colors.black26, + this.borderRadius, + }); + + @override + State createState() => _InteractivePressableState(); +} + +class _InteractivePressableState extends State { + bool _isPressed = false; + + void _onTapDown(TapDownDetails _) => setState(() => _isPressed = true); + void _onTapUp(TapUpDetails _) => setState(() => _isPressed = false); + void _onTapCancel() => setState(() => _isPressed = false); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: widget.onTap, + onTapDown: _onTapDown, + onTapUp: _onTapUp, + onTapCancel: _onTapCancel, + child: AnimatedScale( + scale: _isPressed ? widget.pressedScale : 1.0, + duration: widget.duration, + curve: Curves.easeOut, + child: Stack( + alignment: Alignment.center, + children: [ + widget.child, + Positioned.fill( + child: AnimatedContainer( + duration: widget.duration, + curve: Curves.easeOut, + decoration: BoxDecoration( + color: _isPressed ? widget.overlayColor : Colors.transparent, + borderRadius: widget.borderRadius, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/live_button.dart b/lib/src/core/design_system/components/atoms/buttons/live_button.dart new file mode 100644 index 00000000..f0912e1e --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/live_button.dart @@ -0,0 +1,48 @@ +import 'dart:ui'; // Required for ImageFilter + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; + +class LiveButton extends StatelessWidget { + final Widget child; + final VoidCallback? onTap; + + const LiveButton({ + required this.child, + super.key, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Positioned( + left: 20, + top: 20, + child: InteractivePressable( + onTap: onTap, + borderRadius: BorderRadius.circular(50), + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + width: 38, + height: 38, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: const Color.fromRGBO(255, 255, 255, 0.2), + border: Border.all( + color: const Color.fromRGBO(255, 255, 255, 0.5), + ), + borderRadius: BorderRadius.circular(50), + ), + child: Center( + child: child, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/long_button.dart b/lib/src/core/design_system/components/atoms/buttons/long_button.dart new file mode 100644 index 00000000..dc23b010 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/long_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/gradients.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class LongButton extends StatelessWidget { + final String label; + final VoidCallback? onPressed; + + const LongButton({ + required this.label, + super.key, + this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return InteractivePressable( + onTap: onPressed, + borderRadius: BorderRadius.circular(8), + child: Container( + // height: 40, + padding: const EdgeInsets.symmetric(vertical: 9, horizontal: 11), + decoration: BoxDecoration( + gradient: AppGradients.accent, + borderRadius: BorderRadius.circular(8), + border: const GradientBoxBorder(gradient: AppGradients.glassStroke, width: 3), + ), + child: Center( + child: Text( + label, + style: AppTypography.textMediumBold.copyWith( + color: AppColors.greyWhite, + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/tappable_text.dart b/lib/src/core/design_system/components/atoms/buttons/tappable_text.dart new file mode 100644 index 00000000..a185c52e --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/tappable_text.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class TappableText extends StatelessWidget { + final String text; + final VoidCallback onTap; + + const TappableText({ + required this.text, required this.onTap, super.key, + }); + + @override + Widget build(BuildContext context) { + return InteractivePressable( + onTap: onTap, + child: SizedBox( + width: 41, + height: 14, + child: Center( + child: Text( + text, + style: AppTypography.textExtraSmallThin + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/buttons/text_button.dart b/lib/src/core/design_system/components/atoms/buttons/text_button.dart new file mode 100644 index 00000000..0c4603ef --- /dev/null +++ b/lib/src/core/design_system/components/atoms/buttons/text_button.dart @@ -0,0 +1,46 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class TextButton extends StatelessWidget { + final String label; + final VoidCallback? onTap; + + const TextButton({ + required this.label, + super.key, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return InteractivePressable( + onTap: onTap, + borderRadius: BorderRadius.circular(8), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 25, sigmaY: 25), + child: Container( + width: double.infinity, + constraints: const BoxConstraints(minHeight: 36), + padding: const EdgeInsets.symmetric(vertical: 9, horizontal: 11), + decoration: BoxDecoration( + color: isDark ? AppColors.darkGreyButton : AppColors.lightGreyButton, + borderRadius: BorderRadius.circular(8), + border: BoxBorder.all( + color: AppColors.greyBorder, + width: 1.25, + ), + ), + child: Text(label, textAlign: TextAlign.center, style: AppTypography.textSmallMedium), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/icons.dart b/lib/src/core/design_system/components/atoms/icons.dart new file mode 100644 index 00000000..7c5d9cc1 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/icons.dart @@ -0,0 +1,73 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +/// https://www.figma.com/design/hPE7Xz93FtdGMqLH1FlBlP/SparkUI---Design-System?node-id=577-17275&t=0mcniLTqUuSpPPW9-0 +class AppIcons { + static const String _path = 'icons'; + + static Widget addPostFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/add_post_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget addUser({double size = 24, Color? color}) => SvgPicture.asset('$_path/add_user.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget add({double size = 24, Color? color}) => SvgPicture.asset('$_path/add.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget arrowRight({double size = 24, Color? color}) => SvgPicture.asset('$_path/arrow_right.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget at({double size = 24, Color? color}) => SvgPicture.asset('$_path/at.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget attach({double size = 24, Color? color}) => SvgPicture.asset('$_path/attach.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget bookmarkFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/bookmark_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget bookmarkOutline({double size = 24, Color? color}) => SvgPicture.asset('$_path/bookmark_outline.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget camera({double size = 24, Color? color}) => SvgPicture.asset('$_path/camera.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget cancel({double size = 24, Color? color}) => SvgPicture.asset('$_path/cancel.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget chevronDown({double size = 24, Color? color}) => SvgPicture.asset('$_path/chevron_down.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget chevronleft({double size = 24, Color? color}) => SvgPicture.asset('$_path/chevronleft.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget coin({double size = 24, Color? color}) => SvgPicture.asset('$_path/coin.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget colors({double size = 24, Color? color}) => SvgPicture.asset('$_path/colors.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget comment({double size = 24, Color? color}) => SvgPicture.asset('$_path/comment.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget disk({double size = 24, Color? color}) => SvgPicture.asset('$_path/disk.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget exploreFilled2({double size = 24, Color? color}) => SvgPicture.asset('$_path/explore_filled_2.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget exploreFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/explore_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget eyeMin({double size = 24, Color? color}) => SvgPicture.asset('$_path/eye_min.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget filters({double size = 24, Color? color}) => SvgPicture.asset('$_path/filters.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget folderMini({double size = 24, Color? color}) => SvgPicture.asset('$_path/folder_mini.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget gallery({double size = 24, Color? color}) => SvgPicture.asset('$_path/gallery.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget hashtag({double size = 24, Color? color}) => SvgPicture.asset('$_path/hashtag.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget homeFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/home_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget less({double size = 24, Color? color}) => SvgPicture.asset('$_path/less.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget like({double size = 24, Color? color}) => SvgPicture.asset('$_path/like.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget likeFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/like_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget link2({double size = 24, Color? color}) => SvgPicture.asset('$_path/link2.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget link({double size = 24, Color? color}) => SvgPicture.asset('$_path/link.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget messagesFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/messages_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget micro({double size = 24, Color? color}) => SvgPicture.asset('$_path/micro.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget more1({double size = 24, Color? color}) => SvgPicture.asset('$_path/more1.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget more2({double size = 24, Color? color}) => SvgPicture.asset('$_path/more2.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget more21({double size = 24, Color? color}) => SvgPicture.asset('$_path/more21.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget more({double size = 24, Color? color}) => SvgPicture.asset('$_path/more.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget music({double size = 24, Color? color}) => SvgPicture.asset('$_path/music.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarExplore({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_explore.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarExploreFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_explore_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarHome({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_home.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarHomeFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_home_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarMessages({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_messages.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarMessagesFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_messages_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarPost({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_post.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget navbarPostFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_post_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget pin({double size = 24, Color? color}) => SvgPicture.asset('$_path/pin.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget play1({double size = 24, Color? color}) => SvgPicture.asset('$_path/play1.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget play({double size = 24, Color? color}) => SvgPicture.asset('$_path/play.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget plusFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/plus_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget plus({double size = 24, Color? color}) => SvgPicture.asset('$_path/plus.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget profileCurate({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_curate.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget profileGrid({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_grid.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget profileGridFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_grid_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget profileLiked({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_liked.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget profileTagged({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_tagged.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget search({double size = 24, Color? color}) => SvgPicture.asset('$_path/search.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget send({double size = 24, Color? color}) => SvgPicture.asset('$_path/send.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget share({double size = 24, Color? color}) => SvgPicture.asset('$_path/share.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget smiley({double size = 24, Color? color}) => SvgPicture.asset('$_path/smiley.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget tag({double size = 24, Color? color}) => SvgPicture.asset('$_path/tag.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget typo({double size = 24, Color? color}) => SvgPicture.asset('$_path/typo.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget verified({double size = 24, Color? color}) => SvgPicture.asset('$_path/verified.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget volume({double size = 24, Color? color}) => SvgPicture.asset('$_path/volume.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget sprkMatch({double size = 24, Color? color}) => SvgPicture.asset('$_path/sprk_match.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget sideShare({double size = 24, Color? color}) => SvgPicture.asset('$_path/side_share.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); + static Widget sideCurate({double size = 24, Color? color}) => SvgPicture.asset('$_path/side_curate.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); +} diff --git a/lib/src/core/design_system/components/atoms/profile_tab_item.dart b/lib/src/core/design_system/components/atoms/profile_tab_item.dart new file mode 100644 index 00000000..a69ff53f --- /dev/null +++ b/lib/src/core/design_system/components/atoms/profile_tab_item.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; + +class ProfileTabItem extends StatelessWidget { + const ProfileTabItem({ + required this.icon, + required this.filledIcon, + required this.isSelected, + required this.onTap, + super.key, + }); + + final Widget icon; + final Widget filledIcon; + final bool isSelected; + final VoidCallback onTap; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Expanded( + child: IconButton( + style: IconButton.styleFrom( + padding: EdgeInsets.zero, + minimumSize: Size.zero, + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + shape: const RoundedRectangleBorder(), + splashFactory: NoSplash.splashFactory + ), + onPressed: onTap, + icon: Container( + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: isSelected ? theme.colorScheme.primary : Colors.transparent, + width: 2, + ), + ), + ), + child: isSelected ? filledIcon : icon, + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/tags/feed_tag.dart b/lib/src/core/design_system/components/atoms/tags/feed_tag.dart new file mode 100644 index 00000000..90607074 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/tags/feed_tag.dart @@ -0,0 +1,49 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class FeedTag extends StatelessWidget { + const FeedTag({required this.id, super.key, this.text = '', this.onTap, this.selected = false}); + + final String text; + final VoidCallback? onTap; + final bool selected; + final String id; + + @override + Widget build(BuildContext context) { + if (!selected) { + return InteractivePressable( + onTap: onTap, + borderRadius: BorderRadius.circular(9), + child: Text(text, style: AppTypography.textMediumThin.copyWith(color: Colors.white70)), + ); + } + return InteractivePressable( + onTap: onTap, + borderRadius: BorderRadius.circular(9), + child: ClipRRect( + borderRadius: BorderRadius.circular(9), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Container( + height: 30, + padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + color: Colors.white.withAlpha(50), + borderRadius: BorderRadius.circular(9), + border: Border.all( + color: Colors.white.withAlpha(37), + ), + ), + child: Center( + child: Text(text, style: AppTypography.textMediumMedium.copyWith(color: Colors.white)), + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/tags/hashtag.dart b/lib/src/core/design_system/components/atoms/tags/hashtag.dart new file mode 100644 index 00000000..1dac28e7 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/tags/hashtag.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class GlassmorphicTag extends StatelessWidget { + final String label; + final VoidCallback? onDeleted; + final VoidCallback? onTap; + + const GlassmorphicTag({ + required this.label, + super.key, + this.onDeleted, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return InteractivePressable( + onTap: onTap, + borderRadius: BorderRadius.circular(13), + child: Container( + // height: 38, + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), + decoration: BoxDecoration( + color: isDark ? AppColors.darkGreyButton : AppColors.lightGreyButton, + borderRadius: BorderRadius.circular(13), + border: Border.all( + color: AppColors.greyBorder, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + AppIcons.hashtag(size: 14), + const SizedBox(width: 5), + Text(label, style: AppTypography.textMediumMedium), + ], + ), + const Spacer(), + if (onDeleted != null) + InteractivePressable( + onTap: onDeleted, + borderRadius: BorderRadius.circular(22), + child: AppIcons.cancel(size: 22), + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/tags/tag.dart b/lib/src/core/design_system/components/atoms/tags/tag.dart new file mode 100644 index 00000000..253ae790 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/tags/tag.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class Tag extends StatelessWidget { + final String mainText; + final String secondaryText; + final VoidCallback? onTap; + + const Tag({ + required this.mainText, + required this.secondaryText, + this.onTap, + super.key, + }); + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return InteractivePressable( + onTap: onTap, + borderRadius: BorderRadius.circular(13), + child: Container( + + // width: 107, + // height: 35, + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), + decoration: BoxDecoration( + color: isDark ? AppColors.darkGreyButton : AppColors.lightGreyButton, + borderRadius: BorderRadius.circular(13), + border: Border.all( + color: AppColors.greyBorder, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(mainText, style: AppTypography.textMediumMedium), + const SizedBox(width: 5), + Text(secondaryText, style: AppTypography.textExtraSmallMedium.copyWith(color: AppColors.grey300)), + ], + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/toggles/follow_button.dart b/lib/src/core/design_system/components/atoms/toggles/follow_button.dart new file mode 100644 index 00000000..9047ea50 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/toggles/follow_button.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/gradients.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class FollowButton extends StatelessWidget { + const FollowButton({ + required this.isFollowing, + required this.onFollow, + required this.onUnfollow, + super.key, + this.followText = 'Follow', + this.unfollowText = 'Unfollow', + }); + + final bool isFollowing; + final VoidCallback onFollow; + final VoidCallback onUnfollow; + final String followText; + final String unfollowText; + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + + return InteractivePressable( + onTap: isFollowing ? onUnfollow : onFollow, + borderRadius: const BorderRadius.all(Radius.circular(8)), + child: Container( + width: 109.47, + height: 36, + decoration: isFollowing + ? const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8)), + gradient: AppGradients.accent, + ) + : BoxDecoration( + color: isDark ? AppColors.darkGreyButton : AppColors.lightGreyButton, + borderRadius: const BorderRadius.all(Radius.circular(8)), + border: const Border.fromBorderSide( + BorderSide( + color: Color.fromRGBO(255, 255, 255, 0.15), + width: 1.14667, + ), + ), + ), + padding: const EdgeInsets.symmetric(horizontal: 11, vertical: 9), + child: Center( + child: Text( + // The text depends on the current state. + isFollowing ? unfollowText : followText, + textAlign: TextAlign.center, + style: AppTypography.textSmallMedium, + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/toggles/glass_follow_button.dart b/lib/src/core/design_system/components/atoms/toggles/glass_follow_button.dart new file mode 100644 index 00000000..d8222403 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/toggles/glass_follow_button.dart @@ -0,0 +1,47 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class GlassFollowButton extends StatelessWidget { + const GlassFollowButton({ + required this.isFollowing, + required this.onFollow, + required this.onUnfollow, + required this.followText, + required this.unfollowText, + super.key, + }); + + final bool isFollowing; + final VoidCallback onFollow; + final VoidCallback onUnfollow; + final String followText; + final String unfollowText; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: isFollowing ? onUnfollow : onFollow, + child: ClipRRect( + borderRadius: BorderRadius.circular(100), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Container( + constraints: const BoxConstraints(maxWidth: 60), + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: Colors.white.withAlpha(51), + borderRadius: BorderRadius.circular(100), + border: Border.all( + color: Colors.white.withAlpha(37), + ), + ), + child: Center( + child: Text(isFollowing ? unfollowText : followText, style: AppTypography.textExtraSmallMedium), + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/toggles/toggle.dart b/lib/src/core/design_system/components/atoms/toggles/toggle.dart new file mode 100644 index 00000000..e0ac00cf --- /dev/null +++ b/lib/src/core/design_system/components/atoms/toggles/toggle.dart @@ -0,0 +1,94 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/gradients.dart'; + +class Toggle extends StatelessWidget { + const Toggle({ + required this.value, + required this.onChanged, + super.key, + }); + + final bool value; + final ValueChanged onChanged; + + static const double _width = 44.73; + static const double _height = 22.73; + static const double _thumbSize = 18.73; + static const Duration _animationDuration = Duration(milliseconds: 250); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + onChanged(!value); + }, + child: AnimatedContainer( + duration: _animationDuration, + curve: Curves.easeInOut, + width: _width, + height: _height, + padding: const EdgeInsets.all(2), + decoration: value ? _activeTrackDecoration : _inactiveTrackDecoration, + child: AnimatedAlign( + duration: _animationDuration, + curve: Curves.easeInOut, + alignment: value ? Alignment.centerRight : Alignment.centerLeft, + child: Thumb(thumbSize: _thumbSize, isActive: value), + ), + ), + ); + } + + static final BoxDecoration _activeTrackDecoration = BoxDecoration( + borderRadius: BorderRadius.circular(100), + gradient: const LinearGradient( + transform: GradientRotation(64.15 * pi / 180), + colors: [Color(0xFFFF97CD), Color(0xFFFF349D)], + ), + ); + + static final BoxDecoration _inactiveTrackDecoration = BoxDecoration( + borderRadius: BorderRadius.circular(100), + color: const Color.fromRGBO(255, 255, 255, 0.05), + border: Border.all( + color: const Color.fromRGBO(255, 255, 255, 0.15), + ), + ); +} + +class Thumb extends StatelessWidget { + const Thumb({ + required double thumbSize, + required this.isActive, + super.key, + }) : _thumbSize = thumbSize; + + final double _thumbSize; + final bool isActive; + + @override + Widget build(BuildContext context) { + return Container( + width: _thumbSize, + height: _thumbSize, + decoration: BoxDecoration( + color: isActive ? Colors.white : Colors.white.withAlpha(128), + shape: BoxShape.circle, + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(_thumbSize / 2), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 2.5, sigmaY: 2.5), + child: Container( + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: AppGradients.glassStroke, + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/atoms/video_progress_bar.dart b/lib/src/core/design_system/components/atoms/video_progress_bar.dart new file mode 100644 index 00000000..4479a456 --- /dev/null +++ b/lib/src/core/design_system/components/atoms/video_progress_bar.dart @@ -0,0 +1,276 @@ +import 'dart:math' as math; + +import 'package:flutter/material.dart'; + +class DSVideoProgressBar extends StatelessWidget { + const DSVideoProgressBar({ + required this.progress, + super.key, + this.bufferedSegments = const <(double, double)>[], + this.height = 4, + this.thumbRadius = 6, + this.showThumb = true, + this.dense = true, + this.enableGestures = false, + this.tapTargetHeight = 24, + this.debugShowHitbox = false, + this.onDragStart, + this.onDragUpdate, + this.onDragEnd, + this.semanticLabel = 'Video progress', + }); + + /// Played fraction (0..1). + final double progress; + + /// Buffered segments (each tuple is startFrac/endFrac in 0..1 space). + final List<(double, double)> bufferedSegments; + + /// Visual track height. + final double height; + + /// Thumb radius. + final double thumbRadius; + + /// Whether to show the thumb. + final bool showThumb; + + /// Dense variant (slightly smaller thumb and height adjustments if true). + final bool dense; + + /// Whether this widget should react to gestures. If true, wraps a GestureDetector. + final bool enableGestures; + + /// Height of the interactive tap/drag target when gestures are enabled. + final double tapTargetHeight; + + /// When true, renders a translucent overlay to visualize the gesture hitbox. + final bool debugShowHitbox; + + final VoidCallback? onDragStart; + final ValueChanged? onDragUpdate; + final ValueChanged? onDragEnd; + + final String semanticLabel; + + @override + Widget build(BuildContext context) { + final effectiveHeight = dense ? height : math.max(height, height + 2); + const trackRadius = Radius.zero; + + final backgroundColor = Colors.white.withValues(alpha: 40 / 255); + final bufferedColor = Colors.white.withValues(alpha: 90 / 255); + const playedColor = Colors.white; + + Widget painted = _ProgressPainterWidget( + progress: progress.clamp(0, 1), + bufferedSegments: bufferedSegments + .where((seg) => seg.$2 > seg.$1) + .map<(double, double)>((s) => (s.$1.clamp(0, 1), s.$2.clamp(0, 1))) + .toList(growable: false), + height: effectiveHeight, + trackRadius: trackRadius, + backgroundColor: backgroundColor, + bufferedColor: bufferedColor, + playedColor: playedColor, + showThumb: showThumb, + thumbRadius: thumbRadius, + ); + + if (enableGestures) { + final gestureHeight = math.max(tapTargetHeight, effectiveHeight); + painted = _GestureWrapper( + onDragStart: onDragStart, + onDragUpdate: onDragUpdate, + onDragEnd: onDragEnd, + child: SizedBox( + height: gestureHeight, + child: Stack( + fit: StackFit.expand, + children: [ + if (debugShowHitbox) + Container( + decoration: BoxDecoration( + color: Colors.pinkAccent.withValues(alpha: 0.13), + border: Border( + top: BorderSide(color: Colors.pinkAccent.withValues(alpha: 0.3)), + bottom: BorderSide(color: Colors.pinkAccent.withValues(alpha: 0.6)), + ), + ), + ), + Align(alignment: Alignment.bottomCenter, child: painted), + ], + ), + ), + ); + } + + return Semantics( + label: semanticLabel, + value: '${(progress * 100).toStringAsFixed(1)}%', + child: SizedBox( + // height: math.max(thumbRadius * 2, effectiveHeight), + child: Center(child: painted), + ), + ); + } +} + +class _ProgressPainterWidget extends StatelessWidget { + const _ProgressPainterWidget({ + required this.progress, + required this.bufferedSegments, + required this.height, + required this.trackRadius, + required this.backgroundColor, + required this.bufferedColor, + required this.playedColor, + required this.showThumb, + required this.thumbRadius, + }); + + final double progress; + final List<(double, double)> bufferedSegments; + final double height; + final Radius trackRadius; + final Color backgroundColor; + final Color bufferedColor; + final Color playedColor; + final bool showThumb; + final double thumbRadius; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + return CustomPaint( + size: Size(constraints.maxWidth, height), + painter: _ProgressPainter( + progress: progress, + bufferedSegments: bufferedSegments, + trackRadius: trackRadius, + backgroundColor: backgroundColor, + bufferedColor: bufferedColor, + playedColor: playedColor, + showThumb: showThumb, + thumbRadius: thumbRadius, + ), + ); + }, + ); + } +} + +class _ProgressPainter extends CustomPainter { + _ProgressPainter({ + required this.progress, + required this.bufferedSegments, + required this.trackRadius, + required this.backgroundColor, + required this.bufferedColor, + required this.playedColor, + required this.showThumb, + required this.thumbRadius, + }); + + final double progress; + final List<(double, double)> bufferedSegments; + final Radius trackRadius; + final Color backgroundColor; + final Color bufferedColor; + final Color playedColor; + final bool showThumb; + final double thumbRadius; + + @override + void paint(Canvas canvas, Size size) { + final trackRect = Rect.fromLTWH(0, 0, size.width, size.height); + + final bgPaint = Paint()..color = backgroundColor; + canvas.drawRect(trackRect, bgPaint); + + final bufferedPaint = Paint()..color = bufferedColor; + for (final (start, end) in bufferedSegments) { + final segRect = Rect.fromLTWH(size.width * start, 0, size.width * (end - start), size.height); + canvas.save(); + canvas.clipRect(trackRect); + canvas.drawRect(segRect, bufferedPaint); + canvas.restore(); + } + + final playedPaint = Paint()..color = playedColor; + final playedRect = Rect.fromLTWH(0, 0, size.width * progress, size.height); + canvas.save(); + canvas.clipRect(trackRect); + canvas.drawRect(playedRect, playedPaint); + canvas.restore(); + + if (showThumb) { + final cx = size.width * progress; + final cy = size.height / 2; + final thumbPaint = Paint()..color = playedColor; + canvas.drawCircle(Offset(cx, cy), thumbRadius, thumbPaint); + } + } + + @override + bool shouldRepaint(covariant _ProgressPainter old) { + return old.progress != progress || + old.bufferedSegments != bufferedSegments || + old.showThumb != showThumb || + old.thumbRadius != thumbRadius || + old.backgroundColor != backgroundColor || + old.bufferedColor != bufferedColor || + old.playedColor != playedColor; + } +} + +class _GestureWrapper extends StatefulWidget { + const _GestureWrapper({ + required this.child, + this.onDragStart, + this.onDragUpdate, + this.onDragEnd, + }); + + final Widget child; + final VoidCallback? onDragStart; + final ValueChanged? onDragUpdate; + final ValueChanged? onDragEnd; + + @override + State<_GestureWrapper> createState() => _GestureWrapperState(); +} + +class _GestureWrapperState extends State<_GestureWrapper> { + double _lastFraction = 0; + + void _handleUpdate(BuildContext context, Offset localPosition) { + final box = context.findRenderObject() as RenderBox?; + if (box == null) return; + final width = box.size.width; + final fx = (localPosition.dx / width).clamp(0, 1).toDouble(); + _lastFraction = fx; + widget.onDragUpdate?.call(fx); + } + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, _) { + return GestureDetector( + behavior: HitTestBehavior.translucent, + onHorizontalDragStart: (_) => widget.onDragStart?.call(), + onHorizontalDragUpdate: (d) => _handleUpdate(context, d.localPosition), + onHorizontalDragEnd: (_) => widget.onDragEnd?.call(_lastFraction), + onTapDown: (d) { + widget.onDragStart?.call(); + _handleUpdate(context, d.localPosition); + }, + onTapUp: (_) => widget.onDragEnd?.call(_lastFraction), + child: widget.child, + ); + }, + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/feed_tag_list.dart b/lib/src/core/design_system/components/molecules/feed_tag_list.dart new file mode 100644 index 00000000..0a0c79a3 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/feed_tag_list.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/tags/feed_tag.dart'; + +class FeedTagList extends StatefulWidget { + const FeedTagList({ + required this.tags, + super.key, + this.selectedTagId, + this.onTagTap, + }); + + final List<({String id, String text})> tags; + final String? selectedTagId; + final Function(String tagId)? onTagTap; + + @override + State createState() => _FeedTagListState(); +} + +class _FeedTagListState extends State { + String? _selectedTagId; + + @override + void initState() { + super.initState(); + _selectedTagId = widget.selectedTagId; + } + + void _handleTagTap(String tagId) { + setState(() { + _selectedTagId = tagId; + }); + widget.onTagTap?.call(tagId); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 30, + child: ListView.separated( + scrollDirection: Axis.horizontal, + separatorBuilder: (context, index) => const SizedBox(width: 30), + itemCount: widget.tags.length, + itemBuilder: (context, index) { + final tag = widget.tags[index]; + return FeedTag( + id: tag.id, + text: tag.text, + selected: _selectedTagId == tag.id, + onTap: () => _handleTagTap(tag.id), + ); + }, + ), + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/glass_input.dart b/lib/src/core/design_system/components/molecules/glass_input.dart new file mode 100644 index 00000000..ba0761eb --- /dev/null +++ b/lib/src/core/design_system/components/molecules/glass_input.dart @@ -0,0 +1,125 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class GlassInput extends StatelessWidget { + final TextEditingController? controller; + final String hintText; + final List? leadingWidgets; + final List? actionWidgets; + final VoidCallback? onSendMessage; + final double borderRadius; + + const GlassInput._({ + required this.controller, + required this.hintText, + required this.leadingWidgets, + required this.actionWidgets, + required this.onSendMessage, + required this.borderRadius, + super.key, + }); + + const GlassInput.comment({ + Key? key, + TextEditingController? controller, + String hintText = '', + List? leadingWidgets, + List? actionWidgets, + }) : this._( + key: key, + controller: controller, + hintText: hintText, + leadingWidgets: leadingWidgets, + actionWidgets: actionWidgets, + borderRadius: 50, + onSendMessage: null, + ); + + const GlassInput.chat({ + Key? key, + TextEditingController? controller, + String hintText = '', + List? leadingWidgets, + VoidCallback? onSendMessage, + }) : this._( + key: key, + controller: controller, + hintText: hintText, + leadingWidgets: leadingWidgets, + onSendMessage: onSendMessage, + borderRadius: 25, + actionWidgets: null, + ); + + const GlassInput.search({ + Key? key, + TextEditingController? controller, + String hintText = '', + List? leadingWidgets, + List? actionWidgets, + }) : this._( + key: key, + controller: controller, + hintText: hintText, + leadingWidgets: leadingWidgets, + actionWidgets: actionWidgets, + borderRadius: 15, + onSendMessage: null, + ); + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return ClipRRect( + borderRadius: BorderRadius.circular(borderRadius), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 25, sigmaY: 25), + child: Container( + height: 38, + decoration: BoxDecoration( + color: isDark ? Colors.white.withAlpha(13) : Colors.black.withAlpha(13), + borderRadius: BorderRadius.circular(borderRadius), + border: Border.all( + color: isDark ? Colors.white.withAlpha(37) : Colors.black.withAlpha(37), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Row( + children: [ + if (leadingWidgets != null) ...leadingWidgets!, + + if (leadingWidgets != null && leadingWidgets!.isNotEmpty) const SizedBox(width: 8), + + Expanded( + child: TextField( + controller: controller, + style: AppTypography.textExtraSmallThin, + decoration: InputDecoration( + hintText: hintText, + hintStyle: AppTypography.textExtraSmallThin, + border: InputBorder.none, + focusedBorder: InputBorder.none, + focusColor: Colors.transparent, + fillColor: Colors.transparent, + hoverColor: Colors.transparent, + isDense: true, + contentPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), + ), + ), + ), + + if (actionWidgets != null && actionWidgets!.isNotEmpty) const SizedBox(width: 8), + + if (actionWidgets != null) ...actionWidgets!, + // TODO: send and record features https://pub.dev/packages/waveform_flutter https://pub.dev/packages/record + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/post_tile.dart b/lib/src/core/design_system/components/molecules/post_tile.dart new file mode 100644 index 00000000..e3d0c808 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/post_tile.dart @@ -0,0 +1,143 @@ +import 'dart:ui'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/shapes.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class PostTile extends StatelessWidget { + final String thumbnailUrl; + final int views; + final bool seen; + final bool nsfwBlur; + final VoidCallback onTap; + + const PostTile({ + required this.thumbnailUrl, + required this.views, + required this.seen, + required this.onTap, + this.nsfwBlur = false, + super.key, + }); + + String _formatViews(int views) { + final formatter = NumberFormat('#,###'); + return formatter.format(views); + } + + @override + Widget build(BuildContext context) { + // Squircle shape from design tokens + final BorderRadiusGeometry radius = BorderRadius.circular(AppShapes.squircleRadius); + final side = BorderSide( + width: AppShapes.squircleBorderWidth, + color: Colors.white.withAlpha(AppShapes.squircleBorderAlpha), + ); + final ShapeBorder shape = RoundedSuperellipseBorder(side: side, borderRadius: radius); + + return GestureDetector( + onTap: onTap, + child: DecoratedBox( + decoration: ShapeDecoration(shape: shape), + child: Material( + color: Colors.transparent, + shape: RoundedSuperellipseBorder(borderRadius: radius), + clipBehavior: Clip.antiAlias, + child: Stack( + fit: StackFit.expand, + children: [ + if (nsfwBlur) + ImageFiltered( + imageFilter: ImageFilter.blur(sigmaX: 20, sigmaY: 20), + child: CachedNetworkImage( + imageUrl: thumbnailUrl, + fit: BoxFit.cover, + placeholder: (context, url) => const ColoredBox( + color: AppColors.grey800, + child: Center( + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation(AppColors.primary500), + ), + ), + ), + errorWidget: (context, url, error) => const ColoredBox( + color: AppColors.grey800, + child: Icon( + Icons.broken_image, + color: AppColors.grey400, + ), + ), + ), + ) + else + CachedNetworkImage( + imageUrl: thumbnailUrl, + fit: BoxFit.cover, + placeholder: (context, url) => const ColoredBox( + color: AppColors.grey800, + child: Center( + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation(AppColors.primary500), + ), + ), + ), + errorWidget: (context, url, error) => const ColoredBox( + color: AppColors.grey800, + child: Icon( + Icons.broken_image, + color: AppColors.grey400, + ), + ), + ), + if (seen) + Container( + color: Colors.black.withAlpha(180), + ), + Positioned( + bottom: 0, + right: 0, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 6), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4), + child: seen + ? Text( + 'seen', + style: AppTypography.textExtraSmallMedium.copyWith( + color: AppColors.greyWhite, + fontSize: 12, + ), + ) + : Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + _formatViews(views), + style: AppTypography.textExtraSmallMedium.copyWith( + color: AppColors.greyWhite, + fontSize: 12, + ), + ), + const SizedBox(width: 4), + AppIcons.eyeMin( + size: 14, + color: AppColors.greyWhite, + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/profile_action_buttons.dart b/lib/src/core/design_system/components/molecules/profile_action_buttons.dart new file mode 100644 index 00000000..5d68e584 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/profile_action_buttons.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/text_button.dart' as ds; +import 'package:sparksocial/src/core/design_system/components/atoms/toggles/glass_follow_button.dart'; + +class ProfileActionButtons extends StatelessWidget { + const ProfileActionButtons({ + required this.isCurrentUser, + super.key, + this.isFollowing = false, + this.onEditTap, + this.onFollowTap, + this.onUnfollowTap, + this.onShareTap, + }); + + final bool isCurrentUser; + final bool isFollowing; + final VoidCallback? onEditTap; + final VoidCallback? onFollowTap; + final VoidCallback? onUnfollowTap; + final VoidCallback? onShareTap; + + @override + Widget build(BuildContext context) { + if (isCurrentUser) { + return Row( + children: [ + Expanded( + child: ds.TextButton( + label: 'Edit', + onTap: onEditTap, + ), + ), + const SizedBox(width: 8), + Expanded( + child: ds.TextButton( + label: 'Share Profile', + onTap: onShareTap, + ), + ), + ], + ); + } + + return Row( + children: [ + Expanded( + child: GlassFollowButton( + isFollowing: isFollowing, + onFollow: onFollowTap ?? () {}, + onUnfollow: onUnfollowTap ?? () {}, + followText: 'Follow', + unfollowText: 'Following', + ), + ), + const SizedBox(width: 8), + ], + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/profile_avatar.dart b/lib/src/core/design_system/components/molecules/profile_avatar.dart new file mode 100644 index 00000000..abf84e27 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/profile_avatar.dart @@ -0,0 +1,128 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/gradients.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; + +class ProfileAvatar extends StatelessWidget { + const ProfileAvatar({ + required this.avatarUrl, + required this.displayName, + super.key, + this.hasStories = false, + this.size = 90.0, + this.onTap, + this.showAddButton = false, + this.onAddTap, + }); + + final String? avatarUrl; + final String displayName; + final bool hasStories; + final double size; + final VoidCallback? onTap; + final bool showAddButton; + final VoidCallback? onAddTap; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final isDarkMode = theme.brightness == Brightness.dark; + + final Widget avatarWidget; + if (avatarUrl != null && avatarUrl!.isNotEmpty) { + avatarWidget = ClipOval( + child: CachedNetworkImage( + imageUrl: avatarUrl!, + width: size, + height: size, + fit: BoxFit.cover, + placeholder: (context, url) => _buildPlaceholder(context, isDarkMode), + errorWidget: (context, url, error) => _buildPlaceholder(context, isDarkMode), + ), + ); + } else { + avatarWidget = _buildPlaceholder(context, isDarkMode); + } + + return Stack( + children: [ + GestureDetector( + onTap: hasStories ? onTap : null, + child: Container( + width: size, + height: size, + decoration: hasStories + ? const BoxDecoration( + shape: BoxShape.circle, + gradient: AppGradients.accent, + ) + : BoxDecoration( + color: isDarkMode ? AppColors.darkPurple : AppColors.lightLavender, + shape: BoxShape.circle, + border: Border.all( + color: isDarkMode ? AppColors.darkPurple : AppColors.lightLavender, + width: 2, + ), + ), + child: hasStories + ? Container( + margin: const EdgeInsets.all(2), + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.black, + ), + child: Center(child: avatarWidget), + ) + : Center(child: avatarWidget), + ), + ), + if (showAddButton) + Positioned( + right: 0, + bottom: 0, + child: GestureDetector( + onTap: onAddTap, + child: Container( + width: 30, + height: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColors.primary, + border: Border.all( + color: isDarkMode ? AppColors.deepPurple : AppColors.white, + width: 2, + ), + ), + child: const Center( + child: Icon( + FluentIcons.add_24_filled, + size: 18, + color: AppColors.white, + ), + ), + ), + ), + ), + ], + ); + } + + Widget _buildPlaceholder(BuildContext context, bool isDarkMode) { + return Container( + width: size, + height: size, + decoration: BoxDecoration( + color: isDarkMode ? AppColors.darkPurple : AppColors.lightLavender, + shape: BoxShape.circle, + ), + child: Center( + child: Icon( + FluentIcons.person_24_regular, + size: size * 0.44, + color: isDarkMode ? AppColors.textLight : AppColors.textSecondary, + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/profile_info.dart b/lib/src/core/design_system/components/molecules/profile_info.dart new file mode 100644 index 00000000..f27ccc53 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/profile_info.dart @@ -0,0 +1,149 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; + +class ProfileInfo extends StatelessWidget { + const ProfileInfo({ + required this.displayName, + required this.handle, + super.key, + this.description, + this.links, + this.isEarlySupporter = false, + this.onEarlySupporterTap, + this.onMentionTap, + }); + + final String displayName; + final String handle; + final String? description; + final List? links; + final bool isEarlySupporter; + final VoidCallback? onEarlySupporterTap; + final Function(String username)? onMentionTap; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (description != null && description!.isNotEmpty) ...[ + const SizedBox(height: 8), + _ProfileDescriptionText( + text: description!, + style: AppTypography.textSmallBold.copyWith(color: theme.colorScheme.onSurface), + onMentionTap: onMentionTap, + ), + ], + if (links != null && links!.isNotEmpty) ...[ + const SizedBox(height: 4), + ...links!.map((url) => _ProfileLinkItem(url: url)), + ], + ], + ); + } +} + +class _ProfileDescriptionText extends StatelessWidget { + const _ProfileDescriptionText({ + required this.text, + required this.style, + this.onMentionTap, + }); + + final String text; + final TextStyle style; + final Function(String username)? onMentionTap; + + List _findUsernameMatches(String text) { + final usernameRegex = RegExp( + r'\B@([a-zA-Z0-9_.-]+\.[a-zA-Z]{2,}|[a-zA-Z0-9_]+)', + caseSensitive: false, + ); + return usernameRegex.allMatches(text).toList(); + } + + List _buildTextSpans(String text, List usernameMatches) { + final spans = []; + var lastEnd = 0; + + usernameMatches.sort((a, b) => a.start.compareTo(b.start)); + + for (final match in usernameMatches) { + if (match.start > lastEnd) { + spans.add(TextSpan(text: text.substring(lastEnd, match.start), style: style)); + } + + final username = match.group(0)!; + spans.add( + TextSpan( + text: username, + style: const TextStyle( + color: AppColors.primary, + fontWeight: FontWeight.bold, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + if (onMentionTap != null) { + onMentionTap!(username); + } + }, + ), + ); + lastEnd = match.end; + } + + if (lastEnd < text.length) { + spans.add(TextSpan(text: text.substring(lastEnd))); + } + return spans; + } + + @override + Widget build(BuildContext context) { + final usernameMatches = _findUsernameMatches(text); + final spans = _buildTextSpans(text, usernameMatches); + + return RichText( + text: TextSpan( + style: style, + children: spans, + ), + ); + } +} + +class _ProfileLinkItem extends StatelessWidget { + const _ProfileLinkItem({required this.url}); + + final String url; + + @override + Widget build(BuildContext context) { + const linkColor = AppColors.primary; + + return Padding( + padding: const EdgeInsets.only(top: 4, bottom: 2), + child: Row( + children: [ + // const Icon(FluentIcons.link_24_regular, size: 16, color: linkColor), + // const SizedBox(width: 6), + Expanded( + child: Text( + url, + style: const TextStyle( + color: linkColor, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/profile_stats.dart b/lib/src/core/design_system/components/molecules/profile_stats.dart new file mode 100644 index 00000000..ee7ca6f8 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/profile_stats.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class ProfileStats extends StatelessWidget { + const ProfileStats({ + required this.postsCount, + required this.followersCount, + required this.followingCount, + super.key, + this.onFollowersTap, + this.onFollowingTap, + }); + + final String postsCount; + final String followersCount; + final String followingCount; + final VoidCallback? onFollowersTap; + final VoidCallback? onFollowingTap; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _StatItem(count: postsCount, label: 'Posts'), + GestureDetector( + onTap: onFollowersTap, + behavior: HitTestBehavior.opaque, + child: _StatItem(count: followersCount, label: 'Followers'), + ), + GestureDetector( + onTap: onFollowingTap, + behavior: HitTestBehavior.opaque, + child: _StatItem(count: followingCount, label: 'Following'), + ), + ], + ); + } +} + +class _StatItem extends StatelessWidget { + const _StatItem({ + required this.count, + required this.label, + }); + + final String count; + final String label; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + count, + style: AppTypography.textLargeBold.copyWith( + color: theme.textTheme.bodyLarge?.color ?? theme.colorScheme.onSurface, + ), + ), + const SizedBox(height: 4), + Text( + label, + style: AppTypography.textSmallThin.copyWith( + color: theme.textTheme.bodyMedium?.color ?? theme.colorScheme.onSurfaceVariant, + fontSize: 14, + ), + ), + ], + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/profile_tab_bar.dart b/lib/src/core/design_system/components/molecules/profile_tab_bar.dart new file mode 100644 index 00000000..1866bf10 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/profile_tab_bar.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/profile_tab_item.dart'; + +class ProfileTabBar extends StatelessWidget { + const ProfileTabBar({ + required this.tabs, + required this.selectedIndex, + super.key, + }); + + final List tabs; + final int selectedIndex; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Container( + decoration: BoxDecoration( + color: theme.scaffoldBackgroundColor, + border: Border( + bottom: BorderSide(color: theme.dividerColor, width: 0.5), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: tabs, + ), + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/story_circle.dart b/lib/src/core/design_system/components/molecules/story_circle.dart new file mode 100644 index 00000000..b4aa6272 --- /dev/null +++ b/lib/src/core/design_system/components/molecules/story_circle.dart @@ -0,0 +1,193 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/tokens/gradients.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +enum StoryType { story, live, cf, create } + +class StoryCircle extends StatelessWidget { + final StoryType type; + final String userName; + final String imageUrl; + final String live; + + const StoryCircle._({ + required this.type, + required this.userName, + required this.imageUrl, + required this.live, + }); + + /// Constructor variant for an unread story with a gradient border. + factory StoryCircle.story({ + required String userName, + required String imageUrl, + }) { + return StoryCircle._( + type: StoryType.story, + userName: userName, + imageUrl: imageUrl, + live: '', + ); + } + + /// Constructor variant for a live story with a "LIVE" badge. + factory StoryCircle.live({ + required String userName, + required String imageUrl, + required String live, + }) { + return StoryCircle._( + type: StoryType.live, + userName: userName, + imageUrl: imageUrl, + live: live, + ); + } + + /// Constructor variant for a "Close Friends" story with a green border. + factory StoryCircle.cf({ + required String userName, + required String imageUrl, + }) { + return StoryCircle._( + type: StoryType.cf, + userName: userName, + imageUrl: imageUrl, + live: '', + ); + } + + /// Constructor variant for the user to create their own story. + /// Displays a "+" icon overlay. + factory StoryCircle.create({ + required String userName, + required String imageUrl, + }) { + return StoryCircle._( + type: StoryType.create, + userName: userName, + imageUrl: imageUrl, + live: '', + ); + } + + static const double _widgetWidth = 74; + static const double _widgetHeight = 102; + static const double _imageContainerSize = 74; + static const double _imageSize = 64; + static const double _liveGap = 10; + static const double _gap = 5; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: _widgetWidth, + height: _widgetHeight, + child: Column( + children: [ + Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + Container( + width: _imageContainerSize, + height: _imageContainerSize, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: _getBorderGradient(), + // border: Border.all(width: 2, color: AppColors.primary500), + // borderRadius: BorderRadius.circular(_imageContainerSize / 2), + ), + child: Padding( + padding: const EdgeInsets.all(4), + child: Container( + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.transparent, + ), + child: CircleAvatar( + radius: _imageSize / 2, + backgroundColor: const Color(0xFFD9D9D9), + backgroundImage: CachedNetworkImageProvider(imageUrl), + ), + ), + ), + ), + if (type == StoryType.live) _LiveBadge(live: live), + if (type == StoryType.create) _CreateButton(), + ], + ), + SizedBox(height: type == StoryType.live ? _liveGap : _gap), + SizedBox( + width: _widgetWidth, + child: Text( + userName, + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: AppTypography.textExtraSmallThin, + ), + ), + ], + ), + ); + } + + LinearGradient? _getBorderGradient() { + switch (type) { + case StoryType.story: + case StoryType.live: + return AppGradients.accent; + case StoryType.cf: + return AppGradients.green; + case StoryType.create: + return null; + } + } +} + +class _LiveBadge extends StatelessWidget { + const _LiveBadge({ + required this.live, + }); + + final String live; + + @override + Widget build(BuildContext context) { + return Positioned( + bottom: -10, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + decoration: BoxDecoration( + gradient: AppGradients.accent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 2), + ), + child: Text(live, style: AppTypography.textExtraSmallMedium), + ), + ); + } +} + +class _CreateButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Positioned( + right: 4, + bottom: 4, + child: Container( + width: 22, + height: 22, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: AppGradients.accent, + border: Border.all(width: 2), + ), + child: AppIcons.add(size: 16, color: Colors.white), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/molecules/suggested_profile.dart b/lib/src/core/design_system/components/molecules/suggested_profile.dart new file mode 100644 index 00000000..b8ec838e --- /dev/null +++ b/lib/src/core/design_system/components/molecules/suggested_profile.dart @@ -0,0 +1,125 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/toggles/follow_button.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/shapes.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class SuggestedProfile extends StatelessWidget { + const SuggestedProfile({ + required this.imageUrl, + required this.userName, + required this.userHandle, + required this.isFollowing, + required this.onFollow, + required this.onUnfollow, + this.showFollowButton = true, + this.description, + super.key, + }); + + // Convenience constructor to surface description explicitly + const SuggestedProfile.withDescription({ + required String imageUrl, + required String userName, + required String userHandle, + required bool isFollowing, + required VoidCallback onFollow, + required VoidCallback onUnfollow, + required String description, + bool showFollowButton = true, + Key? key, + }) : this( + imageUrl: imageUrl, + userName: userName, + userHandle: userHandle, + isFollowing: isFollowing, + onFollow: onFollow, + onUnfollow: onUnfollow, + showFollowButton: showFollowButton, + description: description, + key: key, + ); + + final String imageUrl; + final String userName; + final String userHandle; + final bool isFollowing; + final VoidCallback onFollow; + final VoidCallback onUnfollow; + final bool showFollowButton; + final String? description; + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final radius = BorderRadius.circular(AppShapes.squircleRadius); + final borderColor = isDark ? AppColors.grey800 : AppColors.grey200; + + return ConstrainedBox( + constraints: const BoxConstraints(minHeight: 60), + child: Material( + color: isDark ? AppColors.grey700 : AppColors.grey100, + shape: RoundedSuperellipseBorder(borderRadius: radius), + clipBehavior: Clip.antiAlias, + child: Container( + decoration: ShapeDecoration( + shape: RoundedSuperellipseBorder( + side: BorderSide(color: borderColor), + borderRadius: radius, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(7), + child: CachedNetworkImage( + imageUrl: imageUrl, + width: 36, + height: 36, + fit: BoxFit.cover, + ), + ), + const SizedBox(width: 10), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(userName, style: AppTypography.textMediumBold), + const SizedBox(height: 3), + Text(userHandle, style: AppTypography.textExtraSmallThin), + if (description?.isNotEmpty ?? false) ...[ + const SizedBox(height: 3), + SizedBox( + width: 180, + child: Text( + description!, + style: AppTypography.textExtraSmallThin, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ], + ), + ], + ), + if (showFollowButton) + FollowButton( + isFollowing: isFollowing, + onFollow: onFollow, + onUnfollow: onUnfollow, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/components/organisms/bottom_nav_bar.dart b/lib/src/core/design_system/components/organisms/bottom_nav_bar.dart new file mode 100644 index 00000000..b3f7c797 --- /dev/null +++ b/lib/src/core/design_system/components/organisms/bottom_nav_bar.dart @@ -0,0 +1,158 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/tokens/constants.dart'; + +class SparkBottomNavBar extends StatelessWidget { + const SparkBottomNavBar({ + required this.currentIndex, + required this.onTap, + required this.userAvatar, + super.key, + }); + + /// 0 = home, 1 = explore, 2 = create/post, 3 = messages, 4 = profile + final int currentIndex; + final ValueChanged onTap; + final ImageProvider userAvatar; + + @override + Widget build(BuildContext context) { + final bottomPadding = MediaQuery.of(context).padding.bottom; + final isDark = Theme.of(context).brightness == Brightness.dark; + + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _BarBackground( + child: Container( + padding: EdgeInsets.only( + left: 12, + right: 12, + top: 12, + bottom: 12 + bottomPadding, + ), + color: isDark ? const Color.fromARGB(51, 0, 0, 0) : const Color.fromARGB(178, 255, 255, 255), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + + children: [ + _NavIcon( + isSelected: currentIndex == 0, + onTap: () => onTap(0), + builder: (c, selected) => selected + ? AppIcons.navbarHomeFilled(color: isDark ? null : Colors.black) + : AppIcons.navbarHome(color: isDark ? null : Colors.black), + ), + + _NavIcon( + isSelected: currentIndex == 1, + onTap: () => onTap(1), + builder: (c, selected) => selected + ? AppIcons.navbarExploreFilled(color: isDark ? null : Colors.black) + : AppIcons.navbarExplore(color: isDark ? null : Colors.black), + ), + + _NavIcon( + isSelected: currentIndex == 2, + onTap: () => onTap(2), + builder: (c, selected) => selected + ? AppIcons.navbarPostFilled(color: isDark ? null : Colors.black) + : AppIcons.navbarPost(color: isDark ? null : Colors.black), + ), + + _NavIcon( + isSelected: currentIndex == 3, + onTap: () => onTap(3), + builder: (c, selected) => selected + ? AppIcons.navbarMessagesFilled(color: isDark ? null : Colors.black) + : AppIcons.navbarMessages(color: isDark ? null : Colors.black), + ), + + _ProfileAvatar( + isSelected: currentIndex == 4, + image: userAvatar, + onTap: () => onTap(4), + ), + ], + ), + ), + ), + ], + ); + } +} + +class _BarBackground extends StatelessWidget { + const _BarBackground({required this.child}); + final Widget child; + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(0), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: AppConstants.blurBottomBar.toDouble(), sigmaY: AppConstants.blurBottomBar.toDouble()), + child: DecoratedBox( + decoration: BoxDecoration( + border: Border( + top: BorderSide(color: Colors.white.withValues(alpha: 0.08), width: 2), + ), + ), + child: child, + ), + ), + ); + } +} + +class _NavIcon extends StatelessWidget { + const _NavIcon({ + required this.isSelected, + required this.onTap, + required this.builder, + }); + + final bool isSelected; + final VoidCallback onTap; + final Widget Function(BuildContext, bool) builder; + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: onTap, + child: AnimatedContainer( + duration: AppConstants.animationFast, + padding: const EdgeInsets.all(2), + child: builder(context, isSelected), + ), + ); + } +} + +class _ProfileAvatar extends StatelessWidget { + const _ProfileAvatar({required this.isSelected, required this.image, required this.onTap}); + final bool isSelected; + final ImageProvider image; + final VoidCallback onTap; + + @override + Widget build(BuildContext context) { + final avatar = Container( + width: 34, + height: 34, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.white, + ), + image: DecorationImage(image: image, fit: BoxFit.cover), + ), + ); + return GestureDetector( + onTap: onTap, + child: avatar, + ); + } +} diff --git a/lib/src/core/design_system/components/organisms/side_action_bar.dart b/lib/src/core/design_system/components/organisms/side_action_bar.dart new file mode 100644 index 00000000..271a8696 --- /dev/null +++ b/lib/src/core/design_system/components/organisms/side_action_bar.dart @@ -0,0 +1,357 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/tokens/constants.dart'; + +/// Curate popover item data +class CurateDestination { + final String label; + final VoidCallback? onSelected; + const CurateDestination(this.label, {this.onSelected}); +} + +class SparkSideActionBar extends StatefulWidget { + const SparkSideActionBar({ + super.key, + this.onLike, + this.onComment, + this.onCurate, + this.onShare, + this.likeCount, + this.commentCount, + this.curateCount, + this.shareCount, + this.isLiked = false, + this.isCurated = false, + this.curateDestinations = const [ + CurateDestination('Feed 1'), + CurateDestination('Feed 2'), + CurateDestination('Feed 3'), + ], + }); + + final VoidCallback? onLike; + final VoidCallback? onComment; + final VoidCallback? onCurate; // called after a feed selection (or when opening?) + final VoidCallback? onShare; + + final String? likeCount; + final String? commentCount; + final String? curateCount; + final String? shareCount; + + final bool isLiked; + final bool isCurated; + final List curateDestinations; + + @override + State createState() => _SparkSideActionBarState(); +} + +class _SparkSideActionBarState extends State { + final GlobalKey _curateKey = GlobalKey(); + OverlayEntry? _overlay; + OverlayEntry? _overlayIcon; // icon overlay above popover + bool _showingPopover = false; + + @override + void dispose() { + _removePopover(); + super.dispose(); + } + + void _togglePopover() { + if (_showingPopover) { + _removePopover(); + } else { + _showPopover(); + } + } + + void _showPopover() { + if (!mounted) return; + final renderBox = _curateKey.currentContext?.findRenderObject() as RenderBox?; + final overlayBox = Overlay.of(context).context.findRenderObject() as RenderBox?; + if (renderBox == null || overlayBox == null) return; + + final target = renderBox.localToGlobal(Offset.zero, ancestor: overlayBox); + final size = renderBox.size; + final iconCenter = Offset(target.dx + size.width / 2, target.dy + size.height / 2); + + _overlay = OverlayEntry( + builder: (ctx) { + return GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: _removePopover, + child: Stack( + children: [ + Positioned( + // Place so the connector circle (shiftX=30) centers behind icon; fine-tune offsets empirically. + top: iconCenter.dy - 48, + right: MediaQuery.of(context).size.width - target.dx + 16 - 30, + child: _CuratePopover( + destinations: widget.curateDestinations, + onSelected: (d) { + d.onSelected?.call(); + widget.onCurate?.call(); + _removePopover(); + }, + ), + ), + ], + ), + ); + }, + ); + // Add icon overlay above popover for correct z-order (bar bg -> popover -> actual icon) + _overlayIcon = OverlayEntry( + builder: (ctx) => Positioned( + left: target.dx, + top: target.dy, + width: size.width, + height: size.height, + child: IgnorePointer( + child: Center(child: AppIcons.sideCurate(size: 32)), + ), + ), + ); + + final overlayState = Overlay.of(context); + overlayState.insert(_overlay!); // background popover + overlayState.insert(_overlayIcon!); // icon on top + setState(() => _showingPopover = true); + } + + void _removePopover() { + _overlay?.remove(); + _overlayIcon?.remove(); + _overlay = null; + _overlayIcon = null; + if (mounted) setState(() => _showingPopover = false); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + spacing: 10, + children: [ + _ActionItem( + isActive: widget.isLiked, + label: widget.likeCount, + icon: widget.isLiked ? AppIcons.likeFilled(size: 32) : AppIcons.like(size: 32), + onTap: widget.onLike, + ), + _ActionItem( + icon: AppIcons.comment(size: 32), + label: widget.commentCount, + onTap: widget.onComment, + ), + if (widget.onCurate != null) ...[ + _ActionItem( + key: _curateKey, + isActive: widget.isCurated || _showingPopover, + icon: AppIcons.sideCurate(size: 32), + label: widget.curateCount, + onTap: _togglePopover, + ), + ], + _ActionItem( + icon: AppIcons.share(size: 32), + label: widget.shareCount, + onTap: widget.onShare, + ), + ], + ); + } +} + +class _ActionItem extends StatelessWidget { + const _ActionItem({ + required this.icon, + this.label, + this.onTap, + this.isActive = false, + super.key, + }); + + final Widget icon; + final String? label; + final VoidCallback? onTap; + final bool isActive; + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: onTap, + child: Column( + children: [ + AnimatedScale( + scale: isActive ? 1.05 : 1.0, + duration: AppConstants.animationFast, + child: SizedBox(width: 40, height: 40, child: Center(child: icon)), + ), + if (label != null && label!.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: 4), + child: Text( + label!, + style: const TextStyle( + fontSize: 12, + height: 1.1, + color: Colors.white, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ); + } +} + +class _CuratePopover extends StatelessWidget { + const _CuratePopover({required this.destinations, required this.onSelected}); + final List destinations; + final ValueChanged onSelected; + + @override + Widget build(BuildContext context) { + return _ConnectorPopover( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + for (int i = 0; i < destinations.length; i++) ...[ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => onSelected(destinations[i]), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Text( + destinations[i].label, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: Colors.white, + height: 1.2, + shadows: [ + Shadow( + color: Colors.black54, + offset: Offset(0, 1), + blurRadius: 2, + ), + ], + ), + ), + ), + ), + if (i < destinations.length - 1) + Container( + height: 1, + color: Colors.white.withValues(alpha: 0.25), + ), + ], + ], + ), + ); + } +} + +/// Popover shape: rounded rectangle with a circular connector bubble +/// protruding from the top-right that visually aligns with the curate icon. +class _ConnectorPopover extends StatelessWidget { + const _ConnectorPopover({required this.child}); + final Widget child; + + @override + Widget build(BuildContext context) { + return Material( + type: MaterialType.transparency, + child: _ConnectorShape( + child: ClipPath( + clipper: _ConnectorPopoverClipper(), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 20, sigmaY: 20), + child: Container( + // Increased vertical padding + larger right padding to account for bigger connector circle + padding: const EdgeInsets.fromLTRB(20, 18, 20 + 40, 18), + decoration: const BoxDecoration(), + child: child, + ), + ), + ), + ), + ); + } +} + +class _ConnectorShape extends StatelessWidget { + const _ConnectorShape({required this.child}); + final Widget child; + + @override + Widget build(BuildContext context) { + return CustomPaint( + foregroundPainter: _ConnectorPopoverBorderPainter(), + painter: _ConnectorPopoverBackgroundPainter(), + child: child, + ); + } +} + +class _ConnectorPopoverClipper extends CustomClipper { + static const double radius = 22; // slightly larger pill + static const double connectorRadius = 24; // bigger circle to wrap icon + static const double overlap = 10; // how much circle cuts into main rect + static const double connectorShiftX = 16; // pushes circle further right + static const double connectorShiftDown = 24; // pushes circle downward + + @override + Path getClip(Size size) { + // Main body excludes connector width minus overlap + final bodyWidth = size.width - (connectorRadius - connectorShiftX) + overlap; + final bodyRect = RRect.fromLTRBR(0, 0, bodyWidth, size.height, const Radius.circular(radius)); + final rectPath = Path()..addRRect(bodyRect); + final circleCenter = Offset( + bodyWidth - overlap + connectorShiftX, + connectorRadius + connectorShiftDown, + ); // shifted circle + final circlePath = Path()..addOval(Rect.fromCircle(center: circleCenter, radius: connectorRadius)); + return Path.combine(PathOperation.union, rectPath, circlePath); + } + + @override + bool shouldReclip(covariant CustomClipper oldClipper) => false; +} + +class _ConnectorPopoverBackgroundPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final clipper = _ConnectorPopoverClipper(); + final path = clipper.getClip(size); + final paintFill = Paint()..color = Colors.white.withValues(alpha: 0.20); + canvas.drawPath(path, paintFill); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} + +class _ConnectorPopoverBorderPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final clipper = _ConnectorPopoverClipper(); + final path = clipper.getClip(size); + final border = Paint() + ..color = Colors.white.withValues(alpha: 0.30) + ..style = PaintingStyle.stroke + ..strokeWidth = 1.5; + canvas.drawPath(path, border); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/lib/src/core/design_system/components/organisms/sticky_profile_tab_bar.dart b/lib/src/core/design_system/components/organisms/sticky_profile_tab_bar.dart new file mode 100644 index 00000000..f59f98db --- /dev/null +++ b/lib/src/core/design_system/components/organisms/sticky_profile_tab_bar.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +class StickyProfileTabBar extends SliverPersistentHeaderDelegate { + StickyProfileTabBar({ + required this.child, + this.height = 50.0, + }); + + final Widget child; + final double height; + + @override + Widget build( + BuildContext context, + double shrinkOffset, + bool overlapsContent, + ) { + return Material( + elevation: shrinkOffset > 0 ? 1.0 : 0.0, + child: child, + ); + } + + @override + double get maxExtent => height; + + @override + double get minExtent => height; + + @override + bool shouldRebuild(covariant StickyProfileTabBar oldDelegate) { + return oldDelegate.height != height || oldDelegate.child != child; + } +} diff --git a/lib/src/core/design_system/templates/explore_page_template.dart b/lib/src/core/design_system/templates/explore_page_template.dart new file mode 100644 index 00000000..cf40132d --- /dev/null +++ b/lib/src/core/design_system/templates/explore_page_template.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class ExplorePageTemplate extends StatelessWidget { + const ExplorePageTemplate({ + required this.searchWidget, + required this.emptyStateWidget, + required this.tabsWidget, + required this.contentWidget, + super.key, + this.showTabs = false, + this.backgroundColor, + }); + + final Widget searchWidget; + final Widget emptyStateWidget; + final Widget? tabsWidget; + final Widget contentWidget; + final bool showTabs; + final Color? backgroundColor; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + + return Scaffold( + backgroundColor: backgroundColor ?? colorScheme.surface, + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: searchWidget, + ), + if (showTabs && tabsWidget != null) tabsWidget!, + Expanded( + child: showTabs ? contentWidget : emptyStateWidget, + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/templates/feeds_bar_template.dart b/lib/src/core/design_system/templates/feeds_bar_template.dart new file mode 100644 index 00000000..d4903f56 --- /dev/null +++ b/lib/src/core/design_system/templates/feeds_bar_template.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/feed_tag_list.dart'; + +/// Design-only template for the Feeds Bar. +/// +/// This template renders the tags row with an optional trailing action and +/// a subtle top-to-bottom gradient backdrop. No providers or navigation here. +class FeedsBarTemplate extends StatelessWidget { + const FeedsBarTemplate({ + required this.tags, + this.selectedTagId, + this.onTagTap, + this.action, + this.height = kToolbarHeight, + super.key, + }); + + final List<({String id, String text})> tags; + final String? selectedTagId; + final ValueChanged? onTagTap; + final Widget? action; + final double height; + + // @override + // Size get preferredSize => Size.fromHeight(height); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 30 + kToolbarHeight, + child: Stack( + fit: StackFit.expand, + children: [ + // Backdrop gradient from top (slightly dark) to transparent + const DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [Color.fromARGB(110, 0, 0, 0), Colors.transparent], + ), + ), + ), + SafeArea( + bottom: false, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Row( + children: [ + const SizedBox(width: 8), + Expanded( + child: FeedTagList( + tags: tags, + selectedTagId: selectedTagId, + onTagTap: onTagTap, + ), + ), + if (action != null) ...[ + const SizedBox(width: 8), + action!, + ], + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/core/design_system/templates/image_review_page_template.dart b/lib/src/core/design_system/templates/image_review_page_template.dart new file mode 100644 index 00000000..be256cff --- /dev/null +++ b/lib/src/core/design_system/templates/image_review_page_template.dart @@ -0,0 +1,387 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/app_leading_button.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/long_button.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/toggles/toggle.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/glass_input.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/shapes.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +/// Design-only template for the Image Review flow. +/// +/// The template composes page chrome and common sections using the design system. +/// Content-heavy areas (image pager and description) are provided as slots. +class ImageReviewPageTemplate extends StatelessWidget { + const ImageReviewPageTemplate({ + required this.title, + required this.onBack, + required this.imagePaths, + required this.currentPage, + required this.onPageChanged, + required this.onTapEditImage, + required this.onAltEdit, + required this.onRemoveImage, + required this.showAddMore, + required this.canAddMore, + required this.imagesCount, + required this.maxImages, + required this.onAddMore, + required this.descriptionController, + required this.descriptionMaxChars, + required this.postLabel, + required this.onPost, + required this.isPosting, + required this.crossPostValue, + required this.onCrossPostChanged, + super.key, + this.showCrossPostWarning = false, + this.backgroundColor, + }); + + final String title; + final VoidCallback onBack; + final List imagePaths; + final int currentPage; + final ValueChanged onPageChanged; + final ValueChanged onTapEditImage; + final ValueChanged onAltEdit; + final ValueChanged onRemoveImage; + final bool showAddMore; + final bool canAddMore; + final int imagesCount; + final int maxImages; + final VoidCallback onAddMore; + final TextEditingController descriptionController; + final int descriptionMaxChars; + final bool crossPostValue; + final ValueChanged onCrossPostChanged; + final bool showCrossPostWarning; + final String postLabel; + final VoidCallback? onPost; + final bool isPosting; + final Color? backgroundColor; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + + return Scaffold( + backgroundColor: backgroundColor ?? colorScheme.surface, + appBar: AppBar( + backgroundColor: backgroundColor ?? colorScheme.surface, + elevation: 0, + leading: AppLeadingButton(color: theme.textTheme.titleLarge?.color, tooltip: 'Back'), + title: Text( + title, + + ), + centerTitle: false, + ), + body: SafeArea( + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _ImagePager( + imagePaths: imagePaths, + onTapEditImage: onTapEditImage, + onAltEdit: onAltEdit, + onRemoveImage: onRemoveImage, + currentPage: currentPage, + onPageChanged: onPageChanged, + ), + if (showAddMore) ...[ + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + child: LongButton( + label: canAddMore ? 'Add More Images ($imagesCount/$maxImages)' : 'Image Limit Reached', + onPressed: canAddMore ? onAddMore : null, + ), + ), + ], + const SizedBox(height: 20), + _DescriptionSection( + controller: descriptionController, + maxChars: descriptionMaxChars, + ), + const SizedBox(height: 20), + _CrossPostSection( + value: crossPostValue, + onChanged: onCrossPostChanged, + showWarning: showCrossPostWarning, + ), + ], + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16), + child: SizedBox( + width: double.infinity, + child: isPosting + ? Container( + height: 40, + alignment: Alignment.center, + decoration: BoxDecoration( + color: AppColors.primary500.withAlpha(128), + borderRadius: BorderRadius.circular(8), + ), + child: const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator(strokeWidth: 2, color: AppColors.greyWhite), + ), + ) + : LongButton(label: postLabel, onPressed: onPost), + ), + ), + ], + ), + ), + ); + } +} + +class _ImagePager extends StatelessWidget { + const _ImagePager({ + required this.imagePaths, + required this.currentPage, + required this.onPageChanged, + required this.onTapEditImage, + required this.onAltEdit, + required this.onRemoveImage, + }); + + final List imagePaths; + final int currentPage; + final ValueChanged onPageChanged; + final ValueChanged onTapEditImage; + final ValueChanged onAltEdit; + final ValueChanged onRemoveImage; + + @override + Widget build(BuildContext context) { + if (imagePaths.isEmpty) return const SizedBox.shrink(); + final radius = BorderRadiusGeometry.circular(AppShapes.squircleRadius); + final side = BorderSide(width: AppShapes.squircleBorderWidth, color: Colors.white.withAlpha(AppShapes.squircleBorderAlpha)); + final ShapeBorder shape = RoundedSuperellipseBorder(side: side, borderRadius: radius); + + return AspectRatio( + aspectRatio: 1, + child: DecoratedBox( + decoration: ShapeDecoration(shape: shape), + child: Material( + color: Colors.transparent, + shape: RoundedSuperellipseBorder(borderRadius: radius), + clipBehavior: Clip.antiAlias, + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + PageView.builder( + itemCount: imagePaths.length, + onPageChanged: onPageChanged, + itemBuilder: (context, index) { + final path = imagePaths[index]; + return GestureDetector( + onTap: () => onTapEditImage(index), + child: Stack( + children: [ + // Image content fills the clipped shape + Positioned.fill( + child: Image( + image: FileImage(File(path)), + fit: BoxFit.cover, + ), + ), + Positioned( + bottom: 8, + left: 8, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4), + decoration: BoxDecoration( + color: Colors.black.withAlpha(150), + borderRadius: BorderRadius.circular(6), + border: Border.all(color: Colors.white.withAlpha(38)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.edit, color: AppColors.greyWhite, size: 16), + const SizedBox(width: 6), + Text('Tap to edit', style: AppTypography.textSmallBold.copyWith(color: AppColors.greyWhite)), + ], + ), + ), + ), + Positioned( + bottom: 8, + right: 8, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + // ALT text editor chip + GestureDetector( + onTap: () => onAltEdit(index), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.black.withAlpha(100), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: Colors.white.withAlpha(38)), + ), + child: Row( + children: [ + Text('ALT', style: AppTypography.textSmallBold.copyWith(color: AppColors.greyWhite)), + ], + ), + ), + ), + const SizedBox(width: 8), + // Remove image + GestureDetector( + onTap: () => onRemoveImage(index), + child: Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black.withAlpha(100), + border: Border.all(color: Colors.white.withAlpha(38)), + ), + child: AppIcons.cancel(size: 18, color: AppColors.greyWhite), + ), + ), + ], + ), + ), + ], + ), + ); + }, + ), + if (imagePaths.length > 1) + Positioned( + bottom: 10, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.black.withAlpha(100), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: Colors.white.withAlpha(38)), + ), + child: Text( + '${currentPage + 1} / ${imagePaths.length}', + style: AppTypography.textExtraSmallMedium.copyWith(color: AppColors.greyWhite), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class _DescriptionSection extends StatelessWidget { + const _DescriptionSection({ + required this.controller, + required this.maxChars, + }); + + final TextEditingController controller; + final int maxChars; + + @override + Widget build(BuildContext context) { + final count = controller.text.runes.length; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GlassInput.search( + controller: controller, + hintText: 'Add a description... (optional)', + ), + const SizedBox(height: 8), + Align( + alignment: Alignment.centerRight, + child: Text( + '$count/$maxChars', + style: AppTypography.textSmallMedium.copyWith(color: Colors.white.withAlpha(160)), + ), + ), + ], + ); + } +} + +class _CrossPostSection extends StatelessWidget { + const _CrossPostSection({ + required this.value, + required this.onChanged, + required this.showWarning, + }); + + final bool value; + final ValueChanged onChanged; + final bool showWarning; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + decoration: BoxDecoration( + color: Colors.white.withAlpha(6), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: Colors.white.withAlpha(24)), + ), + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 2), + title: Text( + 'Post to Bluesky', + style: AppTypography.textMediumBold.copyWith(color: AppColors.greyWhite), + ), + trailing: Toggle(value: value, onChanged: onChanged), + onTap: () => onChanged(!value), + ), + ), + if (showWarning) ...[ + const SizedBox(height: 12), + Container( + width: double.infinity, + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: AppColors.rajah500.withAlpha(25), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColors.rajah500.withAlpha(64)), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon(Icons.info_outline, color: AppColors.rajah500, size: 20), + const SizedBox(width: 8), + Expanded( + child: Text( + 'Bluesky supports a maximum of 4 images. Your Bluesky post will link to the full Spark post instead.', + style: AppTypography.textSmallMedium.copyWith(color: AppColors.rajah500), + ), + ), + ], + ), + ), + ], + ], + ); + } +} diff --git a/lib/src/core/design_system/templates/info_bar_template.dart b/lib/src/core/design_system/templates/info_bar_template.dart new file mode 100644 index 00000000..402cc83f --- /dev/null +++ b/lib/src/core/design_system/templates/info_bar_template.dart @@ -0,0 +1,262 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/follow_pill_button.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/profile_avatar.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class InfoBarTemplate extends StatefulWidget { + const InfoBarTemplate({ + required this.displayName, + required this.handle, + super.key, + this.description, + this.descriptionMaxLines = 2, + this.music, + this.informLabels = const [], + this.showFollowButton = false, + this.onFollow, + this.onTitleTap, + this.onHandleTap, + this.onAvatarTap, + this.onDescriptionExpandToggle, + this.altAvailable = false, + this.onAltTap, + this.avatarUrl, + }); + + /// Display name + final String displayName; + + /// Handle without leading @ (e.g. `katiemiddow.sprk.so`). + final String handle; + + /// Optional body/description text. + final String? description; + final int descriptionMaxLines; + + /// Optional music string. Example: `The Weeknd - Blinding Lights`. + final String? music; + + /// Informational labels (content notices, etc.). + final List informLabels; + + /// Follow button config. When false, no follow control is rendered. + final bool showFollowButton; + final VoidCallback? onFollow; + + /// Interactions. + final VoidCallback? onTitleTap; + final VoidCallback? onHandleTap; + final VoidCallback? onAvatarTap; + final Function(bool isExpanded)? onDescriptionExpandToggle; + + /// ALT metadata affordance. + final bool altAvailable; + final VoidCallback? onAltTap; + + /// Avatar shown on left of the name/handle. + final String? avatarUrl; + + @override + State createState() => _InfoBarTemplateState(); +} + +class _InfoBarTemplateState extends State with SingleTickerProviderStateMixin { + bool _isDescriptionExpanded = false; + + void _toggleDescription() { + setState(() => _isDescriptionExpanded = !_isDescriptionExpanded); + widget.onDescriptionExpandToggle?.call(_isDescriptionExpanded); + } + + Widget _buildHandleText(BuildContext context, String handle) { + final theme = Theme.of(context); + final color = theme.textTheme.bodyMedium?.color ?? AppColors.greyWhite; + + final parts = handle.split('.'); + if (parts.length == 1) { + return GestureDetector( + onTap: widget.onHandleTap, + child: Text('@$handle', style: AppTypography.textSmallThin.copyWith(color: color)), + ); + } + + final first = parts.first; + final rest = parts.sublist(1).join('.'); + return GestureDetector( + onTap: widget.onHandleTap, + child: RichText( + text: TextSpan( + style: AppTypography.textSmallThin.copyWith(color: color), + children: [ + TextSpan(text: '@$first'), + TextSpan( + text: '.$rest', + style: AppTypography.textSmallThin.copyWith(color: color.withAlpha(128)), + ), + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textColor = theme.textTheme.bodyMedium?.color ?? AppColors.greyWhite; + + final hasDescription = widget.description?.isNotEmpty ?? false; + final hasInform = widget.informLabels.isNotEmpty; + final hasMusic = widget.music != null && widget.music!.isNotEmpty; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Align( + alignment: Alignment.bottomRight, + child: Padding( + padding: const EdgeInsets.all(8), + child: ProfileAvatar( + avatarUrl: widget.avatarUrl, + displayName: widget.displayName, + size: 36, + onTap: widget.onAvatarTap ?? widget.onTitleTap, + ), + ), + ), + + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: widget.onTitleTap, + child: Text( + widget.displayName, + style: AppTypography.textMediumBold.copyWith(color: textColor), + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(height: 2), + Row( + children: [ + Expanded(child: _buildHandleText(context, widget.handle)), + if (widget.altAvailable) _AltPill(onTap: widget.onAltTap), + ], + ), + ], + ), + ), + if (widget.showFollowButton) + Padding( + padding: const EdgeInsets.only(left: 8, top: 2), + child: FollowPillButton( + onPressed: widget.onFollow ?? () {}, + ), + ), + ], + ), + + if (hasDescription) const SizedBox(height: 10), + + if (hasDescription) + GestureDetector( + onTap: _toggleDescription, + child: Padding( + padding: const EdgeInsets.only(left:8), + child: Text( + widget.description!, + style: AppTypography.textSmallMedium.copyWith(color: textColor), + maxLines: _isDescriptionExpanded ? null : widget.descriptionMaxLines, + overflow: _isDescriptionExpanded ? TextOverflow.visible : TextOverflow.ellipsis, + ), + ), + ), + + if (hasMusic) const SizedBox(height: 8), + if (hasMusic) + Row( + mainAxisSize: MainAxisSize.min, + children: [ + AppIcons.music(size: 16, color: textColor.withAlpha(220)), + const SizedBox(width: 6), + Flexible( + child: Text( + widget.music!, + style: AppTypography.textSmallThin.copyWith(color: textColor), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + + if (hasInform) const SizedBox(height: 8), + if (hasInform) + Wrap( + spacing: 6, + runSpacing: 6, + children: [ + for (final label in widget.informLabels) _InformChip(label: label), + ], + ), + ], + ); + } +} + +class _AltPill extends StatelessWidget { + const _AltPill({this.onTap}); + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return Material( + color: (isDark ? AppColors.grey600 : AppColors.lightGreyButton).withAlpha(180), + borderRadius: BorderRadius.circular(8), + child: InkWell( + borderRadius: BorderRadius.circular(8), + onTap: onTap, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + child: Text( + 'ALT', + style: AppTypography.textExtraSmallMedium.copyWith(color: AppColors.greyWhite), + ), + ), + ), + ); + } +} + +class _InformChip extends StatelessWidget { + const _InformChip({required this.label}); + final String label; + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final bg = isDark ? AppColors.blue700 : AppColors.blue50; + final border = isDark ? AppColors.blue600 : AppColors.blue200; + final text = isDark ? AppColors.greyWhite : AppColors.blue600; + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: bg.withAlpha(200), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: border.withAlpha(160)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text(label, style: AppTypography.textExtraSmallMedium.copyWith(color: text)), + ], + ), + ); + } +} diff --git a/lib/src/core/design_system/templates/profile_page_template.dart b/lib/src/core/design_system/templates/profile_page_template.dart new file mode 100644 index 00000000..e501a0b8 --- /dev/null +++ b/lib/src/core/design_system/templates/profile_page_template.dart @@ -0,0 +1,288 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/app_leading_button.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/profile_action_buttons.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/profile_avatar.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/profile_info.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/profile_stats.dart'; +import 'package:sparksocial/src/core/design_system/components/organisms/sticky_profile_tab_bar.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class ProfilePageTemplate extends StatelessWidget { + const ProfilePageTemplate({ + required this.displayName, + required this.handle, + required this.postsCount, + required this.followersCount, + required this.followingCount, + required this.isCurrentUser, + required this.contentWidget, + required this.tabsWidget, + super.key, + this.avatarUrl, + this.description, + this.links, + this.hasStories = false, + this.isFollowing = false, + this.isEarlySupporter = false, + this.onAvatarTap, + this.onFollowersTap, + this.onFollowingTap, + this.onEditTap, + this.onFollowTap, + this.onUnfollowTap, + this.onShareTap, + this.onEarlySupporterTap, + this.onMentionTap, + this.onAddStoryTap, + this.appBarTitle, + this.appBarActions, + this.onRefresh, + this.selectedTabIndex = 0, + this.onTabChanged, + }); + + final String displayName; + final String handle; + final String postsCount; + final String followersCount; + final String followingCount; + final String? avatarUrl; + final String? description; + final List? links; + final bool hasStories; + final bool isCurrentUser; + final bool isFollowing; + final bool isEarlySupporter; + final VoidCallback? onAvatarTap; + final VoidCallback? onFollowersTap; + final VoidCallback? onFollowingTap; + final VoidCallback? onEditTap; + final VoidCallback? onFollowTap; + final VoidCallback? onUnfollowTap; + final VoidCallback? onShareTap; + final VoidCallback? onEarlySupporterTap; + final Function(String username)? onMentionTap; + final VoidCallback? onAddStoryTap; + final String? appBarTitle; + final List? appBarActions; + final Widget tabsWidget; + final int selectedTabIndex; + final Function(int)? onTabChanged; + final Widget contentWidget; + final Future Function()? onRefresh; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: appBarTitle != null + ? Text( + appBarTitle!, + ) + : null, + elevation: 0, + actions: appBarActions, + leading: const AppLeadingButton(), + ), + body: RefreshIndicator( + onRefresh: onRefresh ?? () async {}, + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: _ProfileHeaderSection( + displayName: displayName, + handle: handle, + postsCount: postsCount, + followersCount: followersCount, + followingCount: followingCount, + avatarUrl: avatarUrl, + description: description, + links: links, + hasStories: hasStories, + isCurrentUser: isCurrentUser, + isFollowing: isFollowing, + isEarlySupporter: isEarlySupporter, + onAvatarTap: onAvatarTap, + onFollowersTap: onFollowersTap, + onFollowingTap: onFollowingTap, + onEditTap: onEditTap, + onFollowTap: onFollowTap, + onUnfollowTap: onUnfollowTap, + onShareTap: onShareTap, + onEarlySupporterTap: onEarlySupporterTap, + onMentionTap: onMentionTap, + onAddStoryTap: onAddStoryTap, + ), + ), + SliverPersistentHeader( + pinned: true, + delegate: StickyProfileTabBar(child: tabsWidget), + ), + SliverFillRemaining(child: contentWidget), + ], + ), + ), + ); + } +} + +class _ProfileHeaderSection extends StatelessWidget { + const _ProfileHeaderSection({ + required this.displayName, + required this.handle, + required this.postsCount, + required this.followersCount, + required this.followingCount, + required this.isCurrentUser, + required this.hasStories, + required this.isFollowing, + required this.isEarlySupporter, + this.avatarUrl, + this.description, + this.links, + this.onAvatarTap, + this.onFollowersTap, + this.onFollowingTap, + this.onEditTap, + this.onFollowTap, + this.onUnfollowTap, + this.onShareTap, + this.onEarlySupporterTap, + this.onMentionTap, + this.onAddStoryTap, + }); + + final String displayName; + final String handle; + final String postsCount; + final String followersCount; + final String followingCount; + final String? avatarUrl; + final String? description; + final List? links; + final bool hasStories; + final bool isCurrentUser; + final bool isFollowing; + final bool isEarlySupporter; + final VoidCallback? onAvatarTap; + final VoidCallback? onFollowersTap; + final VoidCallback? onFollowingTap; + final VoidCallback? onEditTap; + final VoidCallback? onFollowTap; + final VoidCallback? onUnfollowTap; + final VoidCallback? onShareTap; + final VoidCallback? onEarlySupporterTap; + final Function(String username)? onMentionTap; + final VoidCallback? onAddStoryTap; + + Widget _buildHandleText(BuildContext context, String handle) { + final theme = Theme.of(context); + final textColor = theme.textTheme.bodyMedium?.color ?? AppColors.greyWhite; + + final parts = handle.split('.'); + if (parts.length == 1) { + return Text( + '@$handle', + style: AppTypography.textSmallThin.copyWith(color: textColor), + ); + } + + final firstPart = parts[0]; + final remainingPart = parts.sublist(1).join('.'); + + return RichText( + text: TextSpan( + style: AppTypography.textSmallThin.copyWith( + color: textColor, + ), + children: [ + TextSpan(text: '@$firstPart'), + TextSpan( + text: '.$remainingPart', + style: AppTypography.textSmallThin.copyWith( + color: textColor.withAlpha(128), + ), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ProfileAvatar( + avatarUrl: avatarUrl, + displayName: displayName, + hasStories: hasStories, + onTap: onAvatarTap, + showAddButton: isCurrentUser, + onAddTap: onAddStoryTap, + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text(displayName, overflow: TextOverflow.ellipsis, style: AppTypography.textLargeBold), + if (isEarlySupporter) + GestureDetector( + onTap: onEarlySupporterTap, + child: Padding( + padding: const EdgeInsets.only(left: 6), + child: AppIcons.sprkMatch(), + ), + ), + ], + ), + const SizedBox(height: 4), + _buildHandleText(context, handle), + const SizedBox(height: 10), + ProfileStats( + postsCount: postsCount, + followersCount: followersCount, + followingCount: followingCount, + onFollowersTap: onFollowersTap, + onFollowingTap: onFollowingTap, + ), + ], + ), + ), + ], + ), + if ((description?.isNotEmpty ?? false) || (links?.isNotEmpty ?? false)) ...[ + const SizedBox(height: 12), + ProfileInfo( + displayName: displayName, + handle: handle, + description: description, + links: links, + onMentionTap: onMentionTap, + ), + ], + const SizedBox(height: 16), + ProfileActionButtons( + isCurrentUser: isCurrentUser, + isFollowing: isFollowing, + onEditTap: onEditTap, + onFollowTap: onFollowTap, + onUnfollowTap: onUnfollowTap, + onShareTap: onShareTap, + ), + ], + ), + ); + } +} diff --git a/lib/src/core/design_system/theme/app_theme.dart b/lib/src/core/design_system/theme/app_theme.dart new file mode 100644 index 00000000..49000f8d --- /dev/null +++ b/lib/src/core/design_system/theme/app_theme.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/theme/color_scheme.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +class AppTheme { + AppTheme._(); + + static ThemeData get light { + return ThemeData( + useMaterial3: true, + fontFamily: 'SN Pro', + brightness: Brightness.light, + colorScheme: AppColorScheme.light, + scaffoldBackgroundColor: AppColors.greyWhite, + appBarTheme: const AppBarTheme( + elevation: 0, + scrolledUnderElevation: 0, + backgroundColor: AppColors.greyWhite, + foregroundColor: AppColors.grey800, + iconTheme: IconThemeData(color: AppColors.grey800), + titleTextStyle: AppTypography.textLargeBold, + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: AppColorScheme.light.primary, + foregroundColor: AppColors.greyWhite, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24), + textStyle: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: AppColorScheme.light.primary, + side: BorderSide(color: AppColorScheme.light.outline), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24), + textStyle: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: AppColorScheme.light.surfaceContainerHighest, + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: AppColorScheme.light.primary), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: AppColorScheme.light.error), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: AppColorScheme.light.error, width: 2), + ), + ), + dividerTheme: DividerThemeData( + color: AppColorScheme.light.outline, + thickness: 1, + ), + cardTheme: CardThemeData( + elevation: 0, + color: AppColors.greyWhite, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + side: BorderSide(color: AppColorScheme.light.outline), + ), + ), + ); + } + + static ThemeData get dark { + return ThemeData( + useMaterial3: true, + fontFamily: 'SN Pro', + brightness: Brightness.dark, + colorScheme: AppColorScheme.dark, + scaffoldBackgroundColor: AppColors.greyBlack, + appBarTheme: const AppBarTheme( + elevation: 0, + scrolledUnderElevation: 0, + backgroundColor: AppColors.greyBlack, + foregroundColor: AppColors.grey100, + iconTheme: IconThemeData(color: AppColors.grey100), + titleTextStyle: AppTypography.textLargeBold, + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: AppColorScheme.dark.primary, + foregroundColor: AppColorScheme.dark.onPrimary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24), + textStyle: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: AppColorScheme.dark.primary, + side: BorderSide(color: AppColorScheme.dark.outline), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24), + textStyle: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: AppColorScheme.dark.surfaceContainerHighest, + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: AppColorScheme.dark.primary), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: AppColorScheme.dark.error), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: AppColorScheme.dark.error, width: 2), + ), + ), + dividerTheme: DividerThemeData( + color: AppColorScheme.dark.outline, + thickness: 1, + ), + cardTheme: CardThemeData( + elevation: 0, + color: AppColorScheme.dark.surfaceContainerHighest, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + side: BorderSide(color: AppColorScheme.dark.outline), + ), + ), + ); + } +} diff --git a/lib/src/core/design_system/theme/color_scheme.dart b/lib/src/core/design_system/theme/color_scheme.dart new file mode 100644 index 00000000..6ec50109 --- /dev/null +++ b/lib/src/core/design_system/theme/color_scheme.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; + +/// Creates color schemes for light and dark themes using design tokens +class AppColorScheme { + AppColorScheme._(); + + /// Light theme color scheme + static const ColorScheme light = ColorScheme( + brightness: Brightness.light, + // Primary colors - Used for prominent UI elements like FAB, app bars + primary: AppColors.primary500, + onPrimary: AppColors.primary900, + primaryContainer: AppColors.primary100, + onPrimaryContainer: AppColors.primary900, + + // Secondary colors - Used for less prominent elements like chips, switches + secondary: AppColors.turquoise600, + onSecondary: AppColors.greyWhite, + secondaryContainer: AppColors.turquoise100, + onSecondaryContainer: AppColors.turquoise900, + + // Tertiary colors - Used as an additional accent color + tertiary: AppColors.coralReef600, + onTertiary: AppColors.greyWhite, + tertiaryContainer: AppColors.coralReef100, + onTertiaryContainer: AppColors.coralReef900, + + // Error colors - Used for error states and destructive actions + error: AppColors.red600, + onError: AppColors.red900, + errorContainer: AppColors.red100, + onErrorContainer: AppColors.red900, + onSurface: AppColors.grey800, + surfaceContainerHighest: AppColors.lightGreyButton, + onSurfaceVariant: AppColors.grey700, + + // Additional colors for borders and outlines + surface: AppColors.greyWhite, + outline: AppColors.grey200, + outlineVariant: AppColors.grey100, + inverseSurface: AppColors.grey800, + onInverseSurface: AppColors.lightGreyButton, + inversePrimary: AppColors.primary300, + shadow: AppColors.greyBlack, + scrim: AppColors.greyBlack, + ); + + /// Dark theme color scheme + /// Provides appropriate colors for dark mode while maintaining brand identity + static const ColorScheme dark = ColorScheme( + brightness: Brightness.dark, + // Primary colors + primary: AppColors.primary500, + onPrimary: AppColors.primary900, + primaryContainer: AppColors.primary800, + onPrimaryContainer: AppColors.primary100, + + // Secondary colors + secondary: AppColors.turquoise400, + onSecondary: AppColors.turquoise900, + secondaryContainer: AppColors.turquoise800, + onSecondaryContainer: AppColors.turquoise100, + + // Tertiary colors + tertiary: AppColors.coralReef400, + onTertiary: AppColors.coralReef900, + tertiaryContainer: AppColors.coralReef800, + onTertiaryContainer: AppColors.coralReef100, + + // Error colors + error: AppColors.red400, + onError: AppColors.red900, + errorContainer: AppColors.red800, + onErrorContainer: AppColors.red100, + surface: AppColors.grey900, + onSurface: AppColors.grey100, + surfaceContainerHighest: AppColors.grey700, + onSurfaceVariant: AppColors.grey200, + + // Additional colors for borders and outlines + outline: AppColors.grey500, + outlineVariant: AppColors.grey600, + inverseSurface: AppColors.grey100, + onInverseSurface: AppColors.grey800, + inversePrimary: AppColors.primary700, + shadow: AppColors.greyBlack, + scrim: AppColors.greyBlack, + ); +} diff --git a/lib/src/core/design_system/theme/text_theme.dart b/lib/src/core/design_system/theme/text_theme.dart new file mode 100644 index 00000000..29f356be --- /dev/null +++ b/lib/src/core/design_system/theme/text_theme.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +/// Creates text themes using our typography tokens +/// This ensures consistent typography throughout the app +/// https://medium.com/@vosarat1995/material-3-you-typography-cheatsheet-ffc58c540181 +class AppTextTheme { + AppTextTheme._(); + + /// Light theme text theme + static const TextTheme light = TextTheme( + // Display styles - Used for hero text and large headings + displayLarge: AppTypography.displayLargeBold, + displayMedium: AppTypography.displayMediumBold, + displaySmall: AppTypography.displaySmallBold, + + // Headline styles - Used for section headers and important text + headlineLarge: AppTypography.headlineXlBold, + headlineMedium: AppTypography.headlineLargeBold, + headlineSmall: AppTypography.headlineMediumBold, + + // Title styles - Used for list items, card titles + titleLarge: AppTypography.headlineLargeMedium, + titleMedium: AppTypography.headlineMediumMedium, + titleSmall: AppTypography.headlineSmallMedium, + + // Body styles - Used for paragraphs and main content + bodyLarge: AppTypography.textLargeMedium, + bodyMedium: AppTypography.textMediumMedium, + bodySmall: AppTypography.textSmallMedium, + + // Label styles - Used for buttons, tabs, form labels + labelLarge: AppTypography.textLargeBold, + labelMedium: AppTypography.textMediumBold, + labelSmall: AppTypography.textSmallBold, + ); + + /// Dark theme text theme + /// Same typography but optimized for dark backgrounds + static TextTheme get dark => light.apply( + bodyColor: Colors.white, + displayColor: Colors.white, + ); +} diff --git a/lib/src/core/design_system/tokens/colors.dart b/lib/src/core/design_system/tokens/colors.dart new file mode 100644 index 00000000..41e52c74 --- /dev/null +++ b/lib/src/core/design_system/tokens/colors.dart @@ -0,0 +1,193 @@ +import 'package:flutter/material.dart'; + +class AppColors { + static const primary50 = Color(0xfffef1f8); + + static const primary100 = Color(0xfffee5f4); + + static const primary200 = Color(0xffffcaea); + + static const primary300 = Color(0xffff9fd7); + + static const primary400 = Color(0xffff63ba); + + static const primary500 = Color(0xffff2696); + + static const primary600 = Color(0xfff0127a); + + static const primary700 = Color(0xffd1055f); + + static const primary800 = Color(0xffad074e); + + static const primary900 = Color(0xff580024); + + static const darkGreyButton = Color(0xff2c2c2c); + + static const lightGreyButton = Color(0xfff2f2f0); + + static const greyBorder = Color(0xff4c4c4c); + + static const grey100 = Color(0xffdcdde4); + + static const grey200 = Color(0xffa3a4b5); + + static const grey300 = Color(0xff67697c); + + static const grey400 = Color(0xff4d4f60); + + static const grey500 = Color(0xff373946); + + static const grey600 = Color(0xff292a36); + + static const grey700 = Color(0xff20212b); + + static const grey800 = Color(0xff16171f); + + static const grey900 = Color(0xff010109); + + static const greyWhite = Color(0xffffffff); + + static const greyBlack = Color(0xff000000); + + static const coralReef100 = Color(0xffffd9d1); + + static const coralReef200 = Color(0xffffccc1); + + static const coralReef300 = Color(0xffffb2a3); + + static const coralReef400 = Color(0xffff9984); + + static const coralReef500 = Color(0xffff7f65); + + static const coralReef600 = Color(0xffd86851); + + static const coralReef700 = Color(0xffb1503d); + + static const coralReef50 = Color(0xffffe5e0); + + static const coralReef800 = Color(0xff8a3928); + + static const coralReef900 = Color(0xff632114); + + static const turquoise100 = Color(0xffc8f9f9); + + static const turquoise200 = Color(0xffb5f7f7); + + static const turquoise300 = Color(0xff91f3f3); + + static const turquoise400 = Color(0xff6cefef); + + static const turquoise500 = Color(0xff47ebeb); + + static const turquoise600 = Color(0xff39bebe); + + static const turquoise700 = Color(0xff2b9191); + + static const turquoise50 = Color(0xffdafbfb); + + static const turquoise800 = Color(0xff1d6363); + + static const turquoise900 = Color(0xff0f3636); + + static const rajah100 = Color(0xfffef0e1); + + static const rajah200 = Color(0xfffee8d2); + + static const rajah300 = Color(0xfffde0c3); + + static const rajah400 = Color(0xfffdd1a6); + + static const rajah500 = Color(0xfffcc188); + + static const rajah600 = Color(0xfffbb26a); + + static const rajah700 = Color(0xffd59455); + + static const rajah50 = Color(0xfffff7f0); + + static const rajah800 = Color(0xffaf7740); + + static const rajah900 = Color(0xff88592c); + + static const indigo100 = Color(0xffd0bafe); + + static const indigo200 = Color(0xffb897fe); + + static const indigo300 = Color(0xffa175fd); + + static const indigo400 = Color(0xff8952fd); + + static const indigo500 = Color(0xff7042d2); + + static const indigo600 = Color(0xff5731a7); + + static const indigo700 = Color(0xff3f217d); + + static const indigo50 = Color(0xffe7dcff); + + static const indigo800 = Color(0xff321967); + + static const indigo900 = Color(0xff261052); + + static const blue100 = Color(0xffa9aef5); + + static const blue200 = Color(0xff7e85f1); + + static const blue300 = Color(0xff535dec); + + static const blue400 = Color(0xff2834e7); + + static const blue500 = Color(0xff202ab9); + + static const blue600 = Color(0xff181f8b); + + static const blue700 = Color(0xff10155c); + + static const blue50 = Color(0xffd4d6fa); + + static const blue800 = Color(0xff0c1045); + + static const blue900 = Color(0xff080a2e); + + static const red100 = Color(0xfffcc5d2); + + static const red200 = Color(0xfffbb1c3); + + static const red300 = Color(0xfffa8ba4); + + static const red400 = Color(0xfff86486); + + static const red500 = Color(0xfff63d68); + + static const red600 = Color(0xffc73154); + + static const red700 = Color(0xff982540); + + static const red50 = Color(0xfffdd8e1); + + static const red800 = Color(0xff69182b); + + static const red900 = Color(0xff521221); + + static const green50 = Color(0xffe9fbf0); + + static const green100 = Color(0xffd3f6e0); + + static const green500 = Color(0xff23d464); + + static const green400 = Color(0xff4fdd83); + + static const green300 = Color(0xff7be5a2); + + static const green200 = Color(0xffa7eec1); + + static const green600 = Color(0xff1caa50); + + static const green700 = Color(0xff157f3c); + + static const green800 = Color(0xff0e5528); + + static const green900 = Color(0xff0b401e); + + AppColors._(); +} diff --git a/lib/src/core/design_system/tokens/constants.dart b/lib/src/core/design_system/tokens/constants.dart new file mode 100644 index 00000000..9622e587 --- /dev/null +++ b/lib/src/core/design_system/tokens/constants.dart @@ -0,0 +1,43 @@ +class AppConstants { + AppConstants._(); + + // Animation durations + static const Duration animationFast = Duration(milliseconds: 150); + static const Duration animationMedium = Duration(milliseconds: 300); + static const Duration animationSlow = Duration(milliseconds: 500); + + // Common dimensions + static const double iconSizeSmall = 16; + static const double iconSizeMedium = 24; + static const double iconSizeLarge = 32; + static const double iconSizeXLarge = 48; + + static const double buttonHeightSmall = 32; + static const double buttonHeightMedium = 40; + static const double buttonHeightLarge = 48; + + static const double inputHeightSmall = 32; + static const double inputHeightMedium = 40; + static const double inputHeightLarge = 48; + + // Common constraints + static const double maxContentWidth = 1200; + static const double minTapTargetSize = 44; + + static const int opacityDisabled = 97; + static const int opacityHover = 10; + static const int opacityFocus = 31; + static const int opacityPressed = 41; + static const int opacityDrag = 41; + static const int opacityShadow = 76; + + // blur + static const int blurBottomBar = 20; + static const int blur1 = 12; + static const int blur2 = 22; + static const int blur3 = 32; + static const int blur4 = 42; + static const int blur5 = 52; + static const int blur6 = 62; + static const int blurGlass = 5; +} diff --git a/lib/src/core/design_system/tokens/gradients.dart b/lib/src/core/design_system/tokens/gradients.dart new file mode 100644 index 00000000..e3255b90 --- /dev/null +++ b/lib/src/core/design_system/tokens/gradients.dart @@ -0,0 +1,329 @@ +import 'dart:math' as math; + +import 'package:flutter/material.dart'; + +class AppGradients { + static const accent = LinearGradient( + begin: Alignment(-1.3914, 1.0057999999999998), + end: Alignment(2.0484, -1.3258), + stops: [ + 0, + 1, + ], + colors: [ + Color(0xffff97cd), + Color(0xffff349d), + ], + ); + + static const linear2 = LinearGradient( + begin: Alignment(-1.3914, 1.0057999999999998), + end: Alignment(2.0484, -1.3258), + stops: [ + 0, + 1, + ], + colors: [ + Color(0xffffcee2), + Color(0xfff99bb1), + ], + ); + + static const gradientLinearGlass = LinearGradient( + begin: Alignment.topLeft, + end: Alignment(1, 1.0028000000000001), + stops: [ + 0, + 0.37, + 0.72, + 1, + ], + colors: [ + Color(0x4dffffff), + Color(0x26ffffff), + Color(0x1affffff), + Color(0x4dffffff), + ], + ); + + static const gradientLinearSecondaryGradient = LinearGradient( + begin: Alignment(-0.6918, 1), + end: Alignment(0.679, -1), + stops: [ + 0, + 1, + ], + colors: [ + Color(0xffffcee2), + Color(0xfff99bb1), + ], + ); + + static const gradientLinearPrimaryGradient = LinearGradient( + begin: Alignment(-0.28200000000000003, 1), + end: Alignment(0.28200000000000003, -1), + stops: [ + 0, + 1, + ], + colors: [ + Color(0xffff97cd), + Color(0xffff349d), + ], + ); + + static const gradientLinearGr4 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + stops: [ + 0, + 0.2822, + 1, + ], + colors: [ + Color(0xffff7f65), + Color(0xfff63d68), + Color(0xffffd9d1), + ], + ); + + static const gradientLinearGr5 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment(0.6112, 0.1976), + stops: [ + 0, + 0.5312, + 1, + ], + colors: [ + Color(0xfffbb1c3), + Color(0xff2834e7), + Color(0xff000000), + ], + ); + + static const gradientLinearGr6 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment(0.6112, 0.1976), + stops: [ + 0, + 0.5312, + 1, + ], + colors: [ + Color(0xffffd9d1), + Color(0xff7042d2), + Color(0xff000000), + ], + ); + + static const gradientLinearGr7 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment(0.6112, 0.1976), + stops: [ + 0, + 0.5312, + 1, + ], + colors: [ + Color(0xff91f3f3), + Color(0xff4648ff), + Color(0xff000000), + ], + ); + + static const gradientLinearGr8 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment(0.5524, 0.4710000000000001), + stops: [ + 0, + 0.2822, + 1, + ], + colors: [ + Color(0xffffccc1), + Color(0xfff63d68), + Color(0xff000000), + ], + ); + + static const gradientGreyGrey1 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + stops: [ + 0, + 1, + ], + colors: [ + Color(0xff16171f), + Color(0xff000000), + ], + ); + + static const gradientGreyGrey2 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + stops: [ + 0, + 1, + ], + colors: [ + Color(0xff20212b), + Color(0xff16171f), + ], + ); + + static const gradientGreyGrey3 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + stops: [ + 0, + 1, + ], + colors: [ + Color(0xff373946), + Color(0xff16171f), + ], + ); + + static const gradientGreyGrey4 = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + stops: [ + 0, + 1, + ], + colors: [ + Color(0xff4d4f60), + Color(0xff292a36), + ], + ); + + static const backgroundLinearGlass = LinearGradient( + begin: Alignment(-0.8200000000000001, -0.8), + end: Alignment(0.72, 0.8200000000000001), + stops: [ + 0, + 0.3702, + 0.7212, + 1, + ], + colors: [ + Color(0x4dffffff), + Color(0x26ffffff), + Color(0x1affffff), + Color(0x4dffffff), + ], + ); + + static const glassStroke = LinearGradient( + begin: Alignment(-0.8200000000000001, -0.8), + end: Alignment(0.72, 0.8200000000000001), + transform: GradientRotation(45 * (math.pi / 180)), + stops: [ + 0, + 0.3702, + 0.7212, + 1, + ], + colors: [ + Color(0x3FFFFFFF), // was 6 * 5, now 9 * 7 + Color(0x1CFFFFFF), // was 3 * 5, now 4 * 7 + Color(0x15FFFFFF), // was 2 * 5, now 3 * 7 + Color(0x31FFFFFF), // was 6 * 5, now 7 * 7 + ], + ); + + static const glassStrokeLight = LinearGradient( + begin: Alignment(-0.8200000000000001, -0.8), + end: Alignment(0.72, 0.8200000000000001), + stops: [ + 0, + 0.3702, + 0.7212, + 1, + ], + colors: [ + Color(0x4d000000), + Color(0x26000000), + Color(0x1a000000), + Color(0x4d000000), + ], + ); + + static const darkStroke = LinearGradient( + begin: Alignment(-0.8200000000000001, -0.8), + end: Alignment(0.72, 0.8200000000000001), + transform: GradientRotation(45 * (math.pi / 180)), + stops: [ + 0, + 0.3702, + 0.7212, + 1, + ], + colors: [ + Color(0xFF313131), + Color(0xFF232323), + Color(0xFF1E1E1E), + Color(0xFF313131), + ], + ); + + static const softDarkStroke = LinearGradient( + begin: Alignment(-0.8200000000000001, -0.8), + end: Alignment(0.72, 0.8200000000000001), + transform: GradientRotation(45 * (math.pi / 180)), + stops: [ + 0, + 0.7212, + 1, + ], + colors: [ + Color(0xFF6F6F6F), + Color(0xFF3D3D3D), + Color(0xFF6F6F6F), + ], + ); + + static const lightStroke = LinearGradient( + begin: Alignment(-0.8200000000000001, -0.8), + end: Alignment(0.72, 0.8200000000000001), + transform: GradientRotation(45 * (math.pi / 180)), + stops: [ + 0, + 0.3702, + 0.7212, + 1, + ], + colors: [ + Color(0xFFFEFEFE), + Color(0xFFFCFCFC), + Color(0xFFF1F1F1), + Color(0xFFFEFEFE), + ], + ); + + static const softLightStroke = LinearGradient( + begin: Alignment(-0.8200000000000001, -0.8), + end: Alignment(0.72, 0.8200000000000001), + transform: GradientRotation(45 * (math.pi / 180)), + stops: [ + 0, + 0.7212, + 1, + ], + colors: [ + Color(0xFFB0B0B0), + Color(0xFFD2D2D2), + Color(0xFFB0B0B0), + ], + ); + + static const green = LinearGradient( + colors: [Color(0xFF97FFBF), Color(0xFF34FF34)], + begin: Alignment(-0.8, -1), + end: Alignment(0.8, 1), + ); + + AppGradients._(); +} diff --git a/lib/src/core/design_system/tokens/shadows.dart b/lib/src/core/design_system/tokens/shadows.dart new file mode 100644 index 00000000..cb950b26 --- /dev/null +++ b/lib/src/core/design_system/tokens/shadows.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; + +class AppShadows { + static const plusShadow = BoxShadow( + color: Color(0xb2da899f), + offset: Offset(0, 4), + blurRadius: 15.19999980926514, + ); + + static const shadowXs = BoxShadow( + color: Color(0x3d1e1e1e), + offset: Offset(2, 2), + blurRadius: 2, + ); + + static const shadowS = BoxShadow( + color: Color(0x3d1e1e1e), + offset: Offset(4, 4), + blurRadius: 12, + ); + + static const shadowM = BoxShadow( + color: Color(0x591e1e1e), + offset: Offset(6, 6), + blurRadius: 26, + ); + + static const shadowL = BoxShadow( + color: Color(0x591e1e1e), + offset: Offset(6, 6), + blurRadius: 26, + ); + + static const shadowL2 = BoxShadow( + color: Color(0x5e1e1e1e), + offset: Offset(6, 6), + blurRadius: 40, + ); + + static const shadowXl = BoxShadow( + color: Color(0x591e1e1e), + offset: Offset(6, 6), + blurRadius: 26, + ); + + static const shadowXl2 = BoxShadow( + color: Color(0x781e1e1e), + offset: Offset(10, 10), + blurRadius: 40, + ); + + static const shadowXl3 = BoxShadow( + color: Color(0x591e1e1e), + offset: Offset(8, 10), + blurRadius: 84, + ); + + AppShadows._(); +} diff --git a/lib/src/core/design_system/tokens/shapes.dart b/lib/src/core/design_system/tokens/shapes.dart new file mode 100644 index 00000000..7fbadcc3 --- /dev/null +++ b/lib/src/core/design_system/tokens/shapes.dart @@ -0,0 +1,8 @@ +class AppShapes { + AppShapes._(); + + // Squircle/Superellipse defaults used across media surfaces + static const double squircleRadius = 20; + static const double squircleBorderWidth = 2; + static const int squircleBorderAlpha = 70; // ~30% opacity +} diff --git a/lib/src/core/design_system/tokens/typography.dart b/lib/src/core/design_system/tokens/typography.dart new file mode 100644 index 00000000..a6219ed5 --- /dev/null +++ b/lib/src/core/design_system/tokens/typography.dart @@ -0,0 +1,633 @@ +import 'package:flutter/material.dart'; + +class AppTypography { + static const displayXxlBold = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontStyle: FontStyle.normal, + fontSize: 112, + decoration: TextDecoration.none, + letterSpacing: -4.48, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const displayXxlMedium = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 112, + decoration: TextDecoration.none, + letterSpacing: -4.48, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 600), + ], + ); + + static const displayXxlLight = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 112, + decoration: TextDecoration.none, + letterSpacing: -4.48, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const displayXlLight = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 96, + decoration: TextDecoration.none, + letterSpacing: -3.84, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const displayXlMedium = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 96, + decoration: TextDecoration.none, + letterSpacing: -3.84, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 600), + ], + ); + + static const displayXlBold = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 96, + decoration: TextDecoration.none, + letterSpacing: -3.84, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const displayLargeThin = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 88, + decoration: TextDecoration.none, + letterSpacing: -3.52, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const displayLargeMedium = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 88, + decoration: TextDecoration.none, + letterSpacing: -3.52, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 600), + ], + ); + + static const displayLargeBold = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 88, + decoration: TextDecoration.none, + letterSpacing: -3.52, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const displayMediumThin = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 72, + decoration: TextDecoration.none, + letterSpacing: -2.88, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const displayMediumMedium = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 72, + decoration: TextDecoration.none, + letterSpacing: -2.88, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 600), + ], + ); + + static const displayMediumBold = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 72, + decoration: TextDecoration.none, + letterSpacing: -2.88, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const displaySmallThin = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 64, + decoration: TextDecoration.none, + letterSpacing: -1.92, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const displaySmallMedium = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 64, + decoration: TextDecoration.none, + letterSpacing: -1.92, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 600), + ], + ); + + static const displaySmallBold = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 64, + decoration: TextDecoration.none, + letterSpacing: -1.92, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const headlineXlThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 56, + decoration: TextDecoration.none, + letterSpacing: -1.68, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const headlineXlMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 56, + decoration: TextDecoration.none, + letterSpacing: -1.68, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const headlineXlBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 56, + decoration: TextDecoration.none, + letterSpacing: -1.68, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const headlineLargeThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 48, + decoration: TextDecoration.none, + letterSpacing: -1.44, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const headlineLargeMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 48, + decoration: TextDecoration.none, + letterSpacing: -1.44, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const headlineLargeBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 48, + decoration: TextDecoration.none, + letterSpacing: -1.44, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const headlineMediumThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 32, + decoration: TextDecoration.none, + letterSpacing: -0.64, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const headlineMediumMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 32, + decoration: TextDecoration.none, + letterSpacing: -0.64, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const headlineMediumBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 32, + decoration: TextDecoration.none, + letterSpacing: -0.64, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const headlineSmallThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 24, + decoration: TextDecoration.none, + letterSpacing: -0.48, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const headlineSmallMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 24, + decoration: TextDecoration.none, + letterSpacing: -0.48, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const headlineSmallBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 24, + decoration: TextDecoration.none, + letterSpacing: -0.48, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const textSmallThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 14, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const textSmallMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 14, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const textSmallBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 14, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const textExtraSmallThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 12, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const textExtraSmallMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 12, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const textExtraSmallBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 12, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const textLargeThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 18, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const textLargeMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 18, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const textLargeBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 18, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const textMediumThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 16, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const textMediumMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 16, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const textMediumBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 16, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const textXlThin = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w300, + fontStyle: FontStyle.normal, + fontSize: 20, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 300), + ], + ); + + static const textXlMedium = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 20, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 500), + ], + ); + + static const textXlBold = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontWeight: FontWeight.w700, + fontStyle: FontStyle.normal, + fontSize: 20, + decoration: TextDecoration.none, + letterSpacing: 0, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 700), + ], + ); + + static const bannerLMedium = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 320, + decoration: TextDecoration.none, + letterSpacing: -16, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 600), + ], + ); + + static const bannerMMedium = TextStyle( + package: 'fonts', + fontFamily: 'Fraunces', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 240, + decoration: TextDecoration.none, + letterSpacing: -12, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 600), + ], + ); + + static const metaTitle = TextStyle( + package: 'fonts', + fontFamily: 'SN Pro', + fontStyle: FontStyle.normal, + fontSize: 112, + decoration: TextDecoration.none, + letterSpacing: -4.48, + leadingDistribution: TextLeadingDistribution.even, + fontVariations: [ + FontVariation('wght', 590), + ], + ); + + AppTypography._(); +} diff --git a/lib/src/core/di/service_locator.dart b/lib/src/core/di/service_locator.dart index 4d1de6f1..215e441f 100644 --- a/lib/src/core/di/service_locator.dart +++ b/lib/src/core/di/service_locator.dart @@ -15,8 +15,8 @@ import 'package:sparksocial/src/core/storage/cache/sql_cache_interface.dart'; import 'package:sparksocial/src/core/storage/preferences/settings_repository.dart'; import 'package:sparksocial/src/core/storage/preferences/settings_repository_impl.dart'; import 'package:sparksocial/src/core/storage/storage.dart'; -import 'package:sparksocial/src/core/theme/data/repositories/theme_repository.dart'; -import 'package:sparksocial/src/core/theme/data/repositories/theme_repository_impl.dart'; +import 'package:sparksocial/src/core/ui/theme/data/repositories/theme_repository.dart'; +import 'package:sparksocial/src/core/ui/theme/data/repositories/theme_repository_impl.dart'; import 'package:sparksocial/src/core/utils/logging/logging.dart'; import 'package:sparksocial/src/features/auth/auth.dart'; diff --git a/lib/src/core/l10n/app_localizations.dart b/lib/src/core/l10n/app_localizations.dart new file mode 100644 index 00000000..bfc3ed76 --- /dev/null +++ b/lib/src/core/l10n/app_localizations.dart @@ -0,0 +1,165 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_en.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10n/app_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations of(BuildContext context) { + return Localizations.of(context, AppLocalizations)!; + } + + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [Locale('en')]; + + /// Cancel button text + /// + /// In en, this message translates to: + /// **'Cancel'** + String get buttonCancel; + + /// Confirm button text + /// + /// In en, this message translates to: + /// **'Confirm'** + String get buttonConfirm; + + /// Save button text + /// + /// In en, this message translates to: + /// **'Save'** + String get buttonSave; + + /// Error message for required fields + /// + /// In en, this message translates to: + /// **'This field is required'** + String get inputErrorRequired; + + /// Error message for invalid email + /// + /// In en, this message translates to: + /// **'Please enter a valid email address'** + String get inputErrorEmail; + + /// Loading state text + /// + /// In en, this message translates to: + /// **'Loading...'** + String get loading; + + /// Placeholder text for search inputs + /// + /// In en, this message translates to: + /// **'Search...'** + String get searchPlaceholder; +} + +class _AppLocalizationsDelegate extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': + return AppLocalizationsEn(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.', + ); +} diff --git a/lib/src/core/l10n/app_localizations_en.dart b/lib/src/core/l10n/app_localizations_en.dart new file mode 100644 index 00000000..b7539b89 --- /dev/null +++ b/lib/src/core/l10n/app_localizations_en.dart @@ -0,0 +1,31 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppLocalizationsEn extends AppLocalizations { + AppLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get buttonCancel => 'Cancel'; + + @override + String get buttonConfirm => 'Confirm'; + + @override + String get buttonSave => 'Save'; + + @override + String get inputErrorRequired => 'This field is required'; + + @override + String get inputErrorEmail => 'Please enter a valid email address'; + + @override + String get loading => 'Loading...'; + + @override + String get searchPlaceholder => 'Search...'; +} diff --git a/lib/src/core/l10n/intl_en.arb b/lib/src/core/l10n/intl_en.arb new file mode 100644 index 00000000..d543bbee --- /dev/null +++ b/lib/src/core/l10n/intl_en.arb @@ -0,0 +1,39 @@ +{ + "@@locale": "en", + "@@context": "General localization strings", + + "buttonCancel": "Cancel", + "@buttonCancel": { + "description": "Cancel button text" + }, + + "buttonConfirm": "Confirm", + "@buttonConfirm": { + "description": "Confirm button text" + }, + + "buttonSave": "Save", + "@buttonSave": { + "description": "Save button text" + }, + + "inputErrorRequired": "This field is required", + "@inputErrorRequired": { + "description": "Error message for required fields" + }, + + "inputErrorEmail": "Please enter a valid email address", + "@inputErrorEmail": { + "description": "Error message for invalid email" + }, + + "loading": "Loading...", + "@loading": { + "description": "Loading state text" + }, + + "searchPlaceholder": "Search...", + "@searchPlaceholder": { + "description": "Placeholder text for search inputs" + } +} \ No newline at end of file diff --git a/lib/src/core/routing/app_router.dart b/lib/src/core/routing/app_router.dart index dcafdcea..a857af95 100644 --- a/lib/src/core/routing/app_router.dart +++ b/lib/src/core/routing/app_router.dart @@ -1,14 +1,53 @@ import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; +import 'package:get_it/get_it.dart'; import 'package:image_picker/image_picker.dart'; import 'package:imgly_editor/model/editor_result.dart'; +import 'package:sparksocial/src/core/auth/data/repositories/auth_repository.dart'; +import 'package:sparksocial/src/core/auth/data/repositories/onboarding_repository.dart'; import 'package:sparksocial/src/core/network/atproto/atproto.dart'; import 'package:sparksocial/src/core/routing/pages.dart'; +import 'package:sparksocial/src/core/utils/logging/log_service.dart'; +import 'package:sparksocial/src/core/utils/logging/logger.dart'; import 'package:sparksocial/src/features/profile/ui/pages/user_list_page.dart'; part 'app_router.gr.dart'; +class AuthGuard extends AutoRouteGuard { + final SparkLogger _logger = GetIt.instance().getLogger('AuthGuard'); + + @override + Future onNavigation(NavigationResolver resolver, StackRouter router) async { + final authRepository = GetIt.instance(); + final onboardingRepository = GetIt.instance(); + + try { + final hasSpark = await onboardingRepository.hasSparkProfile(); + + if (!hasSpark) { + _logger.d('No Spark profile found, redirecting to register'); + resolver.redirectUntil(const RegisterRoute()); + return; + } + + final isSessionValid = await authRepository.validateSession(); + + if (!isSessionValid) { + _logger.d('Session invalid, redirecting to login'); + resolver.redirectUntil(const LoginRoute()); + return; + } + + _logger.d('Authentication valid, continuing to route'); + resolver.next(); + } catch (e) { + _logger.e('Error during auth check', error: e); + resolver.redirectUntil(const RegisterRoute()); + } + } +} + /// Router configuration for the application /// /// As features are migrated, new routes will be added here @@ -19,23 +58,21 @@ class AppRouter extends RootStackRouter { @override List get routes => [ - // Initial route - AutoRoute(page: SplashRoute.page, path: '/splash', initial: true), - - // Main screens + // Main screens (protected by auth) AutoRoute( page: MainRoute.page, - path: '/main', + path: '/', + initial: true, + guards: [AuthGuard()], children: [ AutoRoute(page: FeedsRoute.page, path: 'feeds'), AutoRoute(page: SearchRoute.page, path: 'search'), AutoRoute(page: EmptyRoute.page, path: 'create'), AutoRoute(page: MessagesRoute.page, path: 'messages'), AutoRoute( - page: UserProfileRoute.page, // for the current user + page: UserProfileRoute.page, path: 'profile', children: [ - AutoRoute(page: ProfilePhotosRoute.page, path: 'photos'), AutoRoute(page: ProfileVideosRoute.page, path: 'videos'), ], ), @@ -74,7 +111,6 @@ class AppRouter extends RootStackRouter { path: '/profile/:did', children: [ AutoRoute(page: ProfileVideosRoute.page, path: 'videos', initial: true), - AutoRoute(page: ProfilePhotosRoute.page, path: 'photos'), ], ), AutoRoute(page: UserListRoute.page, path: '/profile/:did/users'), diff --git a/lib/src/core/routing/pages.dart b/lib/src/core/routing/pages.dart index e4525835..60a66d86 100644 --- a/lib/src/core/routing/pages.dart +++ b/lib/src/core/routing/pages.dart @@ -9,7 +9,6 @@ export 'package:sparksocial/src/features/feed/ui/pages/feeds_page.dart'; export 'package:sparksocial/src/features/feed/ui/pages/standalone_post_page.dart'; export 'package:sparksocial/src/features/home/ui/pages/empty_page.dart'; export 'package:sparksocial/src/features/home/ui/pages/main_page.dart'; -export 'package:sparksocial/src/features/home/ui/pages/placeholder_page.dart'; export 'package:sparksocial/src/features/messages/ui/pages/chat_page.dart'; export 'package:sparksocial/src/features/messages/ui/pages/messages_page.dart'; export 'package:sparksocial/src/features/messages/ui/pages/new_chat_search_page.dart'; @@ -17,7 +16,6 @@ export 'package:sparksocial/src/features/posting/ui/pages/image_review_page.dart export 'package:sparksocial/src/features/posting/ui/pages/video_review_page.dart'; export 'package:sparksocial/src/features/profile/ui/pages/edit_profile_page.dart'; export 'package:sparksocial/src/features/profile/ui/pages/profile_page.dart'; -export 'package:sparksocial/src/features/profile/ui/pages/profile_photos_page.dart'; export 'package:sparksocial/src/features/profile/ui/pages/profile_videos_page.dart'; export 'package:sparksocial/src/features/profile/ui/pages/standalone_profile_feed_page.dart'; export 'package:sparksocial/src/features/profile/ui/pages/user_profile_page.dart'; diff --git a/lib/src/core/theme/theme.dart b/lib/src/core/theme/theme.dart deleted file mode 100644 index 6102c29f..00000000 --- a/lib/src/core/theme/theme.dart +++ /dev/null @@ -1,4 +0,0 @@ -export 'data/models/app_theme.dart'; -export 'data/models/colors.dart'; -export 'domain/theme_provider.dart'; -export 'domain/theme_state.dart'; diff --git a/lib/src/core/theme/data/models/colors.dart b/lib/src/core/ui/foundation/colors.dart similarity index 98% rename from lib/src/core/theme/data/models/colors.dart rename to lib/src/core/ui/foundation/colors.dart index f438ead3..f6cfbc1b 100644 --- a/lib/src/core/theme/data/models/colors.dart +++ b/lib/src/core/ui/foundation/colors.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +// DEPRECATED, USE DESIGN SYSTEM TOKENS /// Application color constants. /// diff --git a/lib/src/core/theme/data/models/app_theme.dart b/lib/src/core/ui/theme/data/models/app_theme.dart similarity index 90% rename from lib/src/core/theme/data/models/app_theme.dart rename to lib/src/core/ui/theme/data/models/app_theme.dart index a8ad0320..d88f224d 100644 --- a/lib/src/core/theme/data/models/app_theme.dart +++ b/lib/src/core/ui/theme/data/models/app_theme.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; /// Application theme management class that provides theme data /// for both light and dark themes. @@ -26,35 +26,6 @@ class AppTheme { systemNavigationBarIconBrightness: Brightness.dark, ); - /// Get the selected UI style based on brightness - static SystemUiOverlayStyle getSystemUiStyle(Brightness brightness) { - return brightness == Brightness.dark ? darkSystemUiStyle : lightSystemUiStyle; - } - - /// Get primary text color from theme context - static Color getTextColor(BuildContext context) { - final brightness = Theme.of(context).brightness; - return brightness == Brightness.dark ? AppColors.textLight : AppColors.textPrimary; - } - - /// Get secondary text color from theme context - static Color getSecondaryTextColor(BuildContext context) { - final brightness = Theme.of(context).brightness; - return brightness == Brightness.dark ? AppColors.textLight.withAlpha(128) : AppColors.textSecondary; - } - - /// Get background color from theme context - static Color getBackgroundColor(BuildContext context) { - final brightness = Theme.of(context).brightness; - return brightness == Brightness.dark ? AppColors.nearBlack : AppColors.background; - } - - /// Get navigation background color from theme context - static Color getNavBackgroundColor(BuildContext context) { - final brightness = Theme.of(context).brightness; - return brightness == Brightness.dark ? AppColors.nearBlack : AppColors.lightBackground; - } - /// Light theme configuration static final ThemeData lightTheme = ThemeData( colorScheme: const ColorScheme.light( diff --git a/lib/src/core/theme/data/repositories/theme_repository.dart b/lib/src/core/ui/theme/data/repositories/theme_repository.dart similarity index 100% rename from lib/src/core/theme/data/repositories/theme_repository.dart rename to lib/src/core/ui/theme/data/repositories/theme_repository.dart diff --git a/lib/src/core/theme/data/repositories/theme_repository_impl.dart b/lib/src/core/ui/theme/data/repositories/theme_repository_impl.dart similarity index 80% rename from lib/src/core/theme/data/repositories/theme_repository_impl.dart rename to lib/src/core/ui/theme/data/repositories/theme_repository_impl.dart index f93d6332..02b5adcb 100644 --- a/lib/src/core/theme/data/repositories/theme_repository_impl.dart +++ b/lib/src/core/ui/theme/data/repositories/theme_repository_impl.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:sparksocial/src/core/storage/storage.dart'; -import 'package:sparksocial/src/core/theme/data/repositories/theme_repository.dart'; -import 'package:sparksocial/src/core/theme/domain/theme_provider.dart'; +import 'package:sparksocial/src/core/ui/theme/data/repositories/theme_repository.dart'; +import 'package:sparksocial/src/core/ui/theme/providers/theme_provider.dart'; /// Implementation of ThemeRepository using SharedPreferences class ThemeRepositoryImpl implements ThemeRepository { diff --git a/lib/src/core/theme/domain/theme_provider.dart b/lib/src/core/ui/theme/providers/theme_provider.dart similarity index 92% rename from lib/src/core/theme/domain/theme_provider.dart rename to lib/src/core/ui/theme/providers/theme_provider.dart index 4ea32c24..6ae809a1 100644 --- a/lib/src/core/theme/domain/theme_provider.dart +++ b/lib/src/core/ui/theme/providers/theme_provider.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:sparksocial/src/core/theme/data/repositories/theme_repository.dart'; -import 'package:sparksocial/src/core/theme/domain/theme_state.dart'; +import 'package:sparksocial/src/core/ui/theme/data/repositories/theme_repository.dart'; +import 'package:sparksocial/src/core/ui/theme/providers/theme_state.dart'; part 'theme_provider.g.dart'; diff --git a/lib/src/core/theme/domain/theme_state.dart b/lib/src/core/ui/theme/providers/theme_state.dart similarity index 100% rename from lib/src/core/theme/domain/theme_state.dart rename to lib/src/core/ui/theme/providers/theme_state.dart diff --git a/lib/src/core/ui/theme/theme.dart b/lib/src/core/ui/theme/theme.dart new file mode 100644 index 00000000..9bee5dfa --- /dev/null +++ b/lib/src/core/ui/theme/theme.dart @@ -0,0 +1,4 @@ +export '../foundation/colors.dart'; +export 'data/models/app_theme.dart'; +export 'providers/theme_provider.dart'; +export 'providers/theme_state.dart'; diff --git a/lib/src/core/widgets/alt_text_editor_dialog.dart b/lib/src/core/ui/widgets/alt_text_editor_dialog.dart similarity index 98% rename from lib/src/core/widgets/alt_text_editor_dialog.dart rename to lib/src/core/ui/widgets/alt_text_editor_dialog.dart index c9167f1e..f9577a28 100644 --- a/lib/src/core/widgets/alt_text_editor_dialog.dart +++ b/lib/src/core/ui/widgets/alt_text_editor_dialog.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; class AltTextEditorDialog extends StatefulWidget { const AltTextEditorDialog({required this.initialAltText, required this.imageFile, super.key}); diff --git a/lib/src/core/widgets/content_warning_overlay.dart b/lib/src/core/ui/widgets/content_warning_overlay.dart similarity index 97% rename from lib/src/core/widgets/content_warning_overlay.dart rename to lib/src/core/ui/widgets/content_warning_overlay.dart index c06d0625..46542ab8 100644 --- a/lib/src/core/widgets/content_warning_overlay.dart +++ b/lib/src/core/ui/widgets/content_warning_overlay.dart @@ -1,7 +1,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; class ContentWarningOverlay extends StatelessWidget { const ContentWarningOverlay({ diff --git a/lib/src/core/widgets/custom_text_field.dart b/lib/src/core/ui/widgets/custom_text_field.dart similarity index 100% rename from lib/src/core/widgets/custom_text_field.dart rename to lib/src/core/ui/widgets/custom_text_field.dart diff --git a/lib/src/core/widgets/heart_animation.dart b/lib/src/core/ui/widgets/heart_animation.dart similarity index 86% rename from lib/src/core/widgets/heart_animation.dart rename to lib/src/core/ui/widgets/heart_animation.dart index dbbeb1c2..71ca97c5 100644 --- a/lib/src/core/widgets/heart_animation.dart +++ b/lib/src/core/ui/widgets/heart_animation.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; class HeartAnimation extends StatefulWidget { const HeartAnimation({ @@ -7,11 +8,13 @@ class HeartAnimation extends StatefulWidget { super.key, this.duration = const Duration(milliseconds: 1000), this.onEnd, + this.bottomOffset = 0, }); final bool isAnimating; final Duration duration; final VoidCallback? onEnd; final Widget child; + final double bottomOffset; @override State createState() => _HeartAnimationState(); @@ -29,7 +32,7 @@ class _HeartAnimationState extends State with TickerProviderStat _scaleAnimation = Tween(begin: 0, end: 1.4).animate(CurvedAnimation(parent: _controller, curve: Curves.elasticOut)); - _opacityAnimation = Tween(begin: 0.8, end: 0).animate( + _opacityAnimation = Tween(begin: 1, end: 0).animate( CurvedAnimation( parent: _controller, curve: const Interval(0.5, 1, curve: Curves.easeOut), @@ -67,6 +70,7 @@ class _HeartAnimationState extends State with TickerProviderStat widget.child, if (widget.isAnimating) Positioned.fill( + bottom: widget.bottomOffset, child: Center( child: AnimatedBuilder( animation: _controller, @@ -75,12 +79,7 @@ class _HeartAnimationState extends State with TickerProviderStat scale: _scaleAnimation.value, child: Opacity( opacity: _opacityAnimation.value, - child: const Icon( - Icons.favorite, - color: Colors.red, - size: 100, - shadows: [Shadow(blurRadius: 10, color: Colors.red)], - ), + child: AppIcons.likeFilled(size: 100), ), ); }, diff --git a/lib/src/core/widgets/image_content.dart b/lib/src/core/ui/widgets/image_content.dart similarity index 98% rename from lib/src/core/widgets/image_content.dart rename to lib/src/core/ui/widgets/image_content.dart index dad3fef1..e4bc8095 100644 --- a/lib/src/core/widgets/image_content.dart +++ b/lib/src/core/ui/widgets/image_content.dart @@ -2,7 +2,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/images/image_carousel.dart'; class ImageContent extends StatelessWidget { diff --git a/lib/src/core/widgets/mentioned_text.dart b/lib/src/core/ui/widgets/mentioned_text.dart similarity index 97% rename from lib/src/core/widgets/mentioned_text.dart rename to lib/src/core/ui/widgets/mentioned_text.dart index e7bafa4b..127d7f33 100644 --- a/lib/src/core/widgets/mentioned_text.dart +++ b/lib/src/core/ui/widgets/mentioned_text.dart @@ -1,6 +1,6 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/core/utils/text_formatter.dart'; /// A widget that displays text with clickable @mentions diff --git a/lib/src/core/widgets/menu_action_button.dart b/lib/src/core/ui/widgets/menu_action_button.dart similarity index 98% rename from lib/src/core/widgets/menu_action_button.dart rename to lib/src/core/ui/widgets/menu_action_button.dart index 4d7392b8..a8951077 100644 --- a/lib/src/core/widgets/menu_action_button.dart +++ b/lib/src/core/ui/widgets/menu_action_button.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:sparksocial/src/core/auth/data/repositories/auth_repository.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; class MenuActionButton extends StatelessWidget { const MenuActionButton({ diff --git a/lib/src/core/widgets/report_dialog.dart b/lib/src/core/ui/widgets/report_dialog.dart similarity index 96% rename from lib/src/core/widgets/report_dialog.dart rename to lib/src/core/ui/widgets/report_dialog.dart index c2587587..153346fc 100644 --- a/lib/src/core/widgets/report_dialog.dart +++ b/lib/src/core/ui/widgets/report_dialog.dart @@ -191,11 +191,18 @@ class _ReasonTile extends StatelessWidget { ), subtitle: Text(description, style: theme.textTheme.bodySmall?.copyWith(color: textColor.withAlpha(179), fontSize: 10)), value: reason, + // ignore: deprecated_member_use groupValue: selectedReason, - activeColor: theme.colorScheme.primary, + fillColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return theme.colorScheme.primary; + } + return theme.colorScheme.onSurface.withAlpha(150); + }), contentPadding: const EdgeInsets.symmetric(horizontal: 4), dense: true, visualDensity: const VisualDensity(horizontal: -4, vertical: -4), + // ignore: deprecated_member_use onChanged: onChanged, ); } diff --git a/lib/src/core/widgets/user_avatar.dart b/lib/src/core/ui/widgets/user_avatar.dart similarity index 96% rename from lib/src/core/widgets/user_avatar.dart rename to lib/src/core/ui/widgets/user_avatar.dart index 8ade1bf3..0b8a8cf8 100644 --- a/lib/src/core/widgets/user_avatar.dart +++ b/lib/src/core/ui/widgets/user_avatar.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; class UserAvatar extends StatelessWidget { const UserAvatar({ super.key, - this.imageUrl, + this.imageUrl = '', this.username = '', this.size = 40, this.borderColor, @@ -14,7 +14,7 @@ class UserAvatar extends StatelessWidget { this.backgroundColor, this.fallbackTextColor, }); - final String? imageUrl; + final String imageUrl; final String username; final double size; final Color? borderColor; @@ -32,7 +32,7 @@ class UserAvatar extends StatelessWidget { final effectiveFallbackTextColor = fallbackTextColor ?? colorScheme.onPrimary; // If no image URL is provided, show fallback avatar - if (imageUrl == null || imageUrl!.isEmpty) { + if (imageUrl.isEmpty) { return Container( width: size, height: size, @@ -62,7 +62,7 @@ class UserAvatar extends StatelessWidget { ), clipBehavior: Clip.antiAlias, child: CachedNetworkImage( - imageUrl: imageUrl!, + imageUrl: imageUrl, fit: BoxFit.cover, placeholder: (context, url) => ColoredBox( color: effectiveBackgroundColor, diff --git a/lib/src/core/widgets/video_content.dart b/lib/src/core/ui/widgets/video_content.dart similarity index 97% rename from lib/src/core/widgets/video_content.dart rename to lib/src/core/ui/widgets/video_content.dart index 5bd55c27..7223f3e9 100644 --- a/lib/src/core/widgets/video_content.dart +++ b/lib/src/core/ui/widgets/video_content.dart @@ -1,6 +1,6 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:video_player/video_player.dart'; class VideoContent extends StatefulWidget { diff --git a/lib/src/core/ui/widgets/widgets.dart b/lib/src/core/ui/widgets/widgets.dart new file mode 100644 index 00000000..e6ee53c8 --- /dev/null +++ b/lib/src/core/ui/widgets/widgets.dart @@ -0,0 +1,10 @@ +export 'alt_text_editor_dialog.dart'; +export 'content_warning_overlay.dart'; +export 'custom_text_field.dart'; +export 'heart_animation.dart'; +export 'image_content.dart'; +export 'mentioned_text.dart'; +export 'menu_action_button.dart'; +export 'report_dialog.dart'; +export 'user_avatar.dart'; +export 'video_content.dart'; diff --git a/lib/src/core/utils/text_formatter.dart b/lib/src/core/utils/text_formatter.dart index 7c33c373..6e0ad26d 100644 --- a/lib/src/core/utils/text_formatter.dart +++ b/lib/src/core/utils/text_formatter.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/mentioned_text.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/mentioned_text.dart'; /// Utility class for text formatting and processing class TextFormatter { diff --git a/lib/src/core/widgets/action_button.dart b/lib/src/core/widgets/action_button.dart deleted file mode 100644 index 8a7b6900..00000000 --- a/lib/src/core/widgets/action_button.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; - -class ActionButton extends StatelessWidget { - const ActionButton({ - required this.icon, - required this.label, - super.key, - this.onPressed, - this.color, - this.isAnimating = false, - this.scale = 1.0, - this.showLabel = true, - }); - final IconData icon; - final String label; - final VoidCallback? onPressed; - final Color? color; - final bool isAnimating; - final double scale; - final bool showLabel; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Stack( - children: [ - // Custom shadow that follows shape of the button - Positioned.fill( - child: LayoutBuilder( - builder: (context, constraints) { - return Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - boxShadow: [BoxShadow(color: Colors.black.withAlpha(100), blurRadius: 30)], - ), - ); - }, - ), - ), - // Button with transparent background - SizedBox( - height: 35, - width: 48, - child: Material( - color: Colors.transparent, - shape: const CircleBorder(), - clipBehavior: Clip.antiAlias, - child: InkWell( - onTap: onPressed, - child: Center( - child: Transform.scale( - scale: scale, - child: Icon(icon, color: color ?? Colors.white, size: 30), - ), - ), - ), - ), - ), - ], - ), - if (showLabel) - Text( - label, - style: const TextStyle( - color: Colors.white, - fontSize: 12, - shadows: [ - Shadow(blurRadius: 20), - Shadow(offset: Offset(1, 1), blurRadius: 8, color: Colors.black87), - ], - ), - ), - ], - ); - } -} diff --git a/lib/src/core/widgets/fading_list_view.dart b/lib/src/core/widgets/fading_list_view.dart deleted file mode 100644 index 93597b8c..00000000 --- a/lib/src/core/widgets/fading_list_view.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -/// A list view with fading edges for a smooth scrolling experience -class FadingListView extends StatelessWidget { - const FadingListView({ - required this.children, - super.key, - this.isHorizontal = true, - this.padding, - this.itemSpacing = 8.0, - this.fadeWidth = 24.0, - this.controller, - this.mainAxisAlignment = MainAxisAlignment.start, - this.crossAxisAlignment = CrossAxisAlignment.center, - }); - final List children; - final bool isHorizontal; - final EdgeInsetsGeometry? padding; - final double itemSpacing; - final double fadeWidth; - final ScrollController? controller; - final MainAxisAlignment mainAxisAlignment; - final CrossAxisAlignment crossAxisAlignment; - - @override - Widget build(BuildContext context) { - if (children.isEmpty) { - return const SizedBox.shrink(); - } - - // Add spacing between items - final itemsWithSpacing = []; - for (var i = 0; i < children.length; i++) { - itemsWithSpacing.add(children[i]); - if (i < children.length - 1) { - itemsWithSpacing.add(isHorizontal ? SizedBox(width: itemSpacing) : SizedBox(height: itemSpacing)); - } - } - - // Create appropriate layout based on direction - final Widget content = isHorizontal - ? SingleChildScrollView( - controller: controller, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: fadeWidth).add(padding ?? EdgeInsets.zero), - child: Row(mainAxisAlignment: mainAxisAlignment, crossAxisAlignment: crossAxisAlignment, children: itemsWithSpacing), - ) - : SingleChildScrollView( - controller: controller, - padding: EdgeInsets.symmetric(vertical: fadeWidth).add(padding ?? EdgeInsets.zero), - child: Column( - mainAxisAlignment: mainAxisAlignment, - crossAxisAlignment: crossAxisAlignment, - children: itemsWithSpacing, - ), - ); - - return ShaderMask( - shaderCallback: (Rect bounds) { - return LinearGradient( - begin: isHorizontal ? Alignment.centerLeft : Alignment.topCenter, - end: isHorizontal ? Alignment.centerRight : Alignment.bottomCenter, - colors: const [Colors.transparent, AppColors.white, AppColors.white, Colors.transparent], - stops: [0.0, fadeWidth / bounds.width, 1 - (fadeWidth / bounds.width), 1.0], - ).createShader(bounds); - }, - blendMode: BlendMode.dstIn, - child: content, - ); - } -} diff --git a/lib/src/features/auth/ui/pages/auth_prompt_page.dart b/lib/src/features/auth/ui/pages/auth_prompt_page.dart index 10c72e60..96b83b38 100644 --- a/lib/src/features/auth/ui/pages/auth_prompt_page.dart +++ b/lib/src/features/auth/ui/pages/auth_prompt_page.dart @@ -3,8 +3,7 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/app_theme.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; @RoutePage() class AuthPromptPage extends StatelessWidget { @@ -17,13 +16,13 @@ class AuthPromptPage extends StatelessWidget { final isDarkMode = brightness == Brightness.dark; return Scaffold( - backgroundColor: AppTheme.getBackgroundColor(context), + backgroundColor: Theme.of(context).colorScheme.surface, appBar: onClose != null ? AppBar( leading: IconButton( padding: EdgeInsets.zero, onPressed: onClose, - icon: Icon(FluentIcons.dismiss_24_regular, color: AppTheme.getTextColor(context)), + icon: Icon(FluentIcons.dismiss_24_regular, color: Theme.of(context).colorScheme.onSurface), ), backgroundColor: Colors.transparent, elevation: 0, @@ -31,7 +30,9 @@ class AuthPromptPage extends StatelessWidget { : null, body: Stack( children: [ - Positioned.fill(child: Image.asset('assets/branding/gradient.webp', fit: BoxFit.cover)), + Positioned.fill( + child: Image.asset('branding/gradient.webp', fit: BoxFit.cover, package: 'assets'), + ), SafeArea( child: Center( child: Padding( @@ -109,7 +110,7 @@ class AuthPromptPage extends StatelessWidget { const SizedBox(height: 24), TextButton( onPressed: onClose, - child: Text('Continue browsing', style: TextStyle(color: AppTheme.getSecondaryTextColor(context))), + child: Text('Continue browsing', style: TextStyle(color: Theme.of(context).colorScheme.onSurface)), ), ], ], diff --git a/lib/src/features/auth/ui/pages/login_page.dart b/lib/src/features/auth/ui/pages/login_page.dart index b1317a20..ccf115b0 100644 --- a/lib/src/features/auth/ui/pages/login_page.dart +++ b/lib/src/features/auth/ui/pages/login_page.dart @@ -5,7 +5,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/core/utils/uppercase_text_formatter.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/auth/providers/onboarding_providers.dart'; @@ -87,14 +87,13 @@ class _LoginPageState extends ConsumerState { final isLoading = ref.watch(authProvider.select((state) => state.isLoading)); final error = ref.watch(authProvider.select((state) => state.error)); - final brightness = MediaQuery.of(context).platformBrightness; - final isDarkMode = brightness == Brightness.dark; - return Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, body: Stack( children: [ - Positioned.fill(child: Image.asset('assets/branding/gradient.webp', fit: BoxFit.cover)), + Positioned.fill( + child: Image.asset('branding/gradient.webp', fit: BoxFit.cover, package: 'assets'), + ), SafeArea( child: Center( child: SingleChildScrollView( @@ -107,9 +106,10 @@ class _LoginPageState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ SvgPicture.asset( - isDarkMode ? 'assets/images/logo_dark_mode.svg' : 'assets/images/logo_dark_mode.svg', + 'images/logo_dark_mode.svg', height: 140, width: 140, + package: 'assets', ), const SizedBox(height: 21), const Text( @@ -128,7 +128,7 @@ class _LoginPageState extends ConsumerState { 'Login using your existing ', style: TextStyle(color: AppColors.white, fontSize: 20, height: 1.7), ), - SvgPicture.asset('assets/images/ataccount.svg', height: 25, width: 100), + SvgPicture.asset('images/ataccount.svg', height: 25, width: 100, package: 'assets'), const SizedBox(width: 4), const ATAccountInfoIcon(), ], diff --git a/lib/src/features/auth/ui/pages/onboarding_page.dart b/lib/src/features/auth/ui/pages/onboarding_page.dart index a5986855..16dfdfd6 100644 --- a/lib/src/features/auth/ui/pages/onboarding_page.dart +++ b/lib/src/features/auth/ui/pages/onboarding_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:sparksocial/src/core/auth/data/models/onboarding_screen_state.dart'; // Import for OnboardingScreenState import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/widgets/custom_text_field.dart'; // Corrected path +import 'package:sparksocial/src/core/ui/widgets/custom_text_field.dart'; // Corrected path import 'package:sparksocial/src/features/auth/providers/onboarding_notifier.dart'; import 'package:sparksocial/src/features/auth/providers/onboarding_providers.dart'; diff --git a/lib/src/features/auth/ui/pages/register_page.dart b/lib/src/features/auth/ui/pages/register_page.dart index e996f6f0..c8567edc 100644 --- a/lib/src/features/auth/ui/pages/register_page.dart +++ b/lib/src/features/auth/ui/pages/register_page.dart @@ -5,7 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:sparksocial/src/core/config/app_config.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/auth/providers/onboarding_providers.dart'; import 'package:sparksocial/src/features/auth/ui/widgets/at_account_dialog.dart'; @@ -88,7 +88,9 @@ class _RegisterPageState extends ConsumerState { backgroundColor: colorScheme.surface, body: Stack( children: [ - Positioned.fill(child: Image.asset('assets/branding/gradient.webp', fit: BoxFit.cover)), + Positioned.fill( + child: Image.asset('branding/gradient.webp', fit: BoxFit.cover, package: 'assets'), + ), SafeArea( child: GestureDetector( onTap: () => FocusScope.of(context).unfocus(), @@ -97,7 +99,7 @@ class _RegisterPageState extends ConsumerState { child: ListView( children: [ const SizedBox(height: 24), - Center(child: SvgPicture.asset('assets/images/logo_dark_mode.svg', height: 140, width: 140)), + Center(child: SvgPicture.asset('images/logo_dark_mode.svg', height: 140, width: 140, package: 'assets')), const SizedBox(height: 21), const Center( child: Text( @@ -115,7 +117,7 @@ class _RegisterPageState extends ConsumerState { crossAxisAlignment: WrapCrossAlignment.center, children: [ const Text('Create your new ', style: TextStyle(color: AppColors.white, fontSize: 20, height: 1.7)), - SvgPicture.asset('assets/images/ataccount.svg', height: 25, width: 100), + SvgPicture.asset('images/ataccount.svg', height: 25, width: 100, package: 'assets'), const SizedBox(width: 4), const ATAccountInfoIcon(), ], diff --git a/lib/src/features/auth/ui/widgets/at_account_dialog.dart b/lib/src/features/auth/ui/widgets/at_account_dialog.dart index e8d3ff53..d240b44b 100644 --- a/lib/src/features/auth/ui/widgets/at_account_dialog.dart +++ b/lib/src/features/auth/ui/widgets/at_account_dialog.dart @@ -1,7 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:url_launcher/url_launcher.dart'; /// A widget that displays an information icon for AT Accounts. @@ -43,7 +43,7 @@ class _ATAccountDialog extends StatelessWidget { contentPadding: const EdgeInsets.fromLTRB(24, 12, 24, 0), title: Column( children: [ - SvgPicture.asset('assets/images/ataccount.svg', height: 40), + SvgPicture.asset('images/ataccount.svg', height: 40, package: 'assets'), const SizedBox(height: 18), const Text( 'What is an AT Account?', diff --git a/lib/src/features/comments/ui/widgets/comment_input.dart b/lib/src/features/comments/ui/widgets/comment_input.dart index ad47db76..cbf3b242 100644 --- a/lib/src/features/comments/ui/widgets/comment_input.dart +++ b/lib/src/features/comments/ui/widgets/comment_input.dart @@ -4,8 +4,8 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:image_picker/image_picker.dart'; // Import image_picker -import 'package:sparksocial/src/core/widgets/alt_text_editor_dialog.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; +import 'package:sparksocial/src/core/ui/widgets/alt_text_editor_dialog.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/comments/providers/comment_input_provider.dart'; import 'package:sparksocial/src/features/comments/providers/comment_input_state.dart'; @@ -75,9 +75,9 @@ class _CommentInputState extends ConsumerState { imageUrl: ref .read(profileNotifierProvider(did: session?.did ?? '')) .when( - data: (profileData) => profileData.profile?.avatar?.toString(), - error: (error, stackTrace) => null, - loading: () => null, + data: (profileData) => profileData.profile?.avatar?.toString() ?? '', + error: (error, stackTrace) => '', + loading: () => '', ), username: session?.handle ?? '', size: 28, diff --git a/lib/src/features/comments/ui/widgets/comment_item.dart b/lib/src/features/comments/ui/widgets/comment_item.dart index ae9ab1b1..e200296b 100644 --- a/lib/src/features/comments/ui/widgets/comment_item.dart +++ b/lib/src/features/comments/ui/widgets/comment_item.dart @@ -7,12 +7,12 @@ import 'package:get_it/get_it.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; import 'package:sparksocial/src/core/network/atproto/data/repositories/sprk_repository.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/image_content.dart'; -import 'package:sparksocial/src/core/widgets/menu_action_button.dart'; -import 'package:sparksocial/src/core/widgets/report_dialog.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; -import 'package:sparksocial/src/core/widgets/video_content.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/image_content.dart'; +import 'package:sparksocial/src/core/ui/widgets/menu_action_button.dart'; +import 'package:sparksocial/src/core/ui/widgets/report_dialog.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; +import 'package:sparksocial/src/core/ui/widgets/video_content.dart'; import 'package:sparksocial/src/features/comments/providers/comment_provider.dart'; import 'package:sparksocial/src/features/comments/providers/comment_state.dart'; import 'package:sparksocial/src/features/comments/providers/comments_page_provider.dart'; diff --git a/lib/src/features/comments/ui/widgets/emoji_picker.dart b/lib/src/features/comments/ui/widgets/emoji_picker.dart index a4c9e557..d5032f0c 100644 --- a/lib/src/features/comments/ui/widgets/emoji_picker.dart +++ b/lib/src/features/comments/ui/widgets/emoji_picker.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; class EmojiPicker extends StatelessWidget { const EmojiPicker({required this.onEmojiSelected, required this.isDarkMode, super.key}); diff --git a/lib/src/features/feed/ui/pages/feed_page.dart b/lib/src/features/feed/ui/pages/feed_page.dart index a1c59188..8b8d43e4 100644 --- a/lib/src/features/feed/ui/pages/feed_page.dart +++ b/lib/src/features/feed/ui/pages/feed_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/features/feed/providers/feed_provider.dart'; import 'package:sparksocial/src/features/feed/providers/feed_refresh_trigger_provider.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/feed/cacheable_page_view.dart'; diff --git a/lib/src/features/feed/ui/pages/feeds_page.dart b/lib/src/features/feed/ui/pages/feeds_page.dart index fe794a3f..0f4dfac6 100644 --- a/lib/src/features/feed/ui/pages/feeds_page.dart +++ b/lib/src/features/feed/ui/pages/feeds_page.dart @@ -2,7 +2,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/features/feed/providers/feed_provider.dart'; import 'package:sparksocial/src/features/feed/providers/feed_state.dart'; import 'package:sparksocial/src/features/feed/ui/pages/feed_page.dart'; @@ -104,8 +104,6 @@ class _FeedsPageState extends ConsumerState { } return Scaffold( - extendBodyBehindAppBar: true, - appBar: FeedsBar(pageController: _pageController!), backgroundColor: AppColors.black, body: Stack( children: [ @@ -135,6 +133,12 @@ class _FeedsPageState extends ConsumerState { return const DecoratedBox(decoration: BoxDecoration(color: AppColors.black)); }, ), + Positioned( + top: 0, + left: 0, + right: 0, + child: FeedsBar(pageController: _pageController!), + ), ], ), ); diff --git a/lib/src/features/feed/ui/pages/standalone_post_page.dart b/lib/src/features/feed/ui/pages/standalone_post_page.dart index 43f946fe..f05d7efb 100644 --- a/lib/src/features/feed/ui/pages/standalone_post_page.dart +++ b/lib/src/features/feed/ui/pages/standalone_post_page.dart @@ -3,12 +3,13 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/app_leading_button.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; import 'package:sparksocial/src/core/network/atproto/data/repositories/sprk_repository.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; import 'package:sparksocial/src/core/storage/cache/sql_cache_interface.dart'; +import 'package:sparksocial/src/core/ui/widgets/content_warning_overlay.dart'; import 'package:sparksocial/src/core/utils/label_utils.dart'; -import 'package:sparksocial/src/core/widgets/content_warning_overlay.dart'; import 'package:sparksocial/src/features/feed/providers/post_updates.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/action_buttons/side_action_bar.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/images/image_carousel.dart'; @@ -127,14 +128,7 @@ class _StandalonePostPageState extends ConsumerState { return Scaffold( backgroundColor: Colors.black, - appBar: AppBar( - backgroundColor: Colors.transparent, - elevation: 0, - leading: IconButton( - icon: const Icon(Icons.arrow_back, color: Colors.white), - onPressed: () => context.router.pop(), - ), - ), + appBar: AppBar(backgroundColor: Colors.transparent, elevation: 0, leading: const AppLeadingButton()), body: SafeArea( child: _postFuture == null ? const Center(child: CircularProgressIndicator()) @@ -177,9 +171,28 @@ class _StandalonePostPageState extends ConsumerState { _ => const SizedBox.shrink(), }, + // Gradient overlay at the bottom to improve text readability + Positioned( + left: 0, + right: 0, + bottom: 16, + child: IgnorePointer( + child: Container( + height: 80, // covers the area behind the InfoBar + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [Colors.black87.withAlpha(170), Colors.transparent], + ), + ), + ), + ), + ), + // Side action bar Positioned( - bottom: 4, + bottom: 20, right: 4, child: SideActionBar( post: postData, @@ -196,27 +209,8 @@ class _StandalonePostPageState extends ConsumerState { ), ), - // Gradient overlay at the bottom to improve text readability Positioned( - left: 0, - right: 0, bottom: 20, - child: IgnorePointer( - child: Container( - height: 120, // covers the area behind the InfoBar - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.bottomCenter, - end: Alignment.topCenter, - colors: [Colors.black87.withAlpha(100), Colors.transparent], - ), - ), - ), - ), - ), - - Positioned( - bottom: 32, left: 4, right: 80, child: FutureBuilder>( @@ -225,6 +219,8 @@ class _StandalonePostPageState extends ConsumerState { final informLabels = snapshot.data ?? []; return InfoBar( username: postData.author.handle, + displayName: postData.author.displayName ?? postData.author.handle, + avatarUrl: postData.author.avatar?.toString(), description: postData.record.text ?? '', hashtags: postData.record.hashtags, informLabels: informLabels, diff --git a/lib/src/features/feed/ui/widgets/action_buttons/bookmark_action_button.dart b/lib/src/features/feed/ui/widgets/action_buttons/bookmark_action_button.dart deleted file mode 100644 index 2bf3a867..00000000 --- a/lib/src/features/feed/ui/widgets/action_buttons/bookmark_action_button.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class BookmarkActionButton extends StatefulWidget { - const BookmarkActionButton({required this.count, super.key, this.isBookmarked = false, this.onPressed}); - final String count; - final bool isBookmarked; - final VoidCallback? onPressed; - - @override - State createState() => _BookmarkActionButtonState(); -} - -class _BookmarkActionButtonState extends State with SingleTickerProviderStateMixin { - late bool _isBookmarked; - late AnimationController _animationController; - late Animation _scaleAnimation; - - @override - void initState() { - super.initState(); - _isBookmarked = widget.isBookmarked; - - _animationController = AnimationController(duration: const Duration(milliseconds: 300), vsync: this); - - _scaleAnimation = TweenSequence([ - TweenSequenceItem(tween: Tween(begin: 1, end: 1.2), weight: 50), - TweenSequenceItem(tween: Tween(begin: 1.2, end: 1), weight: 50), - ]).animate(CurvedAnimation(parent: _animationController, curve: Curves.easeInOut)); - } - - @override - void didUpdateWidget(BookmarkActionButton oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.isBookmarked != widget.isBookmarked) { - setState(() { - _isBookmarked = widget.isBookmarked; - }); - } - } - - @override - void dispose() { - _animationController.dispose(); - super.dispose(); - } - - void _handleTap() { - if (widget.onPressed != null) { - setState(() { - _isBookmarked = !_isBookmarked; - }); - - _animationController.reset(); - _animationController.forward(); - - widget.onPressed!(); - } - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - SizedBox( - height: 40, - width: 40, - child: GestureDetector( - onTap: _handleTap, - child: AnimatedBuilder( - animation: _animationController, - builder: (context, child) { - return Transform.scale( - scale: _animationController.isAnimating ? _scaleAnimation.value : 1.0, - child: Icon( - _isBookmarked ? FluentIcons.bookmark_24_filled : FluentIcons.bookmark_24_regular, - color: _isBookmarked ? AppColors.blue : Colors.white, - size: 30, - ), - ); - }, - ), - ), - ), - const SizedBox(height: 4), - Text(widget.count, style: const TextStyle(color: Colors.white, fontSize: 12)), - ], - ); - } -} diff --git a/lib/src/features/feed/ui/widgets/action_buttons/comment_action_button.dart b/lib/src/features/feed/ui/widgets/action_buttons/comment_action_button.dart deleted file mode 100644 index 0cef9590..00000000 --- a/lib/src/features/feed/ui/widgets/action_buttons/comment_action_button.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/action_button.dart'; - -class CommentActionButton extends StatelessWidget { - const CommentActionButton({ - required this.count, - super.key, - this.onPressed, - }); - final String count; - final VoidCallback? onPressed; - - @override - Widget build(BuildContext context) { - return ActionButton( - key: ValueKey('comment_button_$count'), - icon: FluentIcons.chat_24_regular, - label: count, - color: AppColors.white, - onPressed: onPressed, - ); - } -} diff --git a/lib/src/features/feed/ui/widgets/action_buttons/like_action_button.dart b/lib/src/features/feed/ui/widgets/action_buttons/like_action_button.dart deleted file mode 100644 index 474272d3..00000000 --- a/lib/src/features/feed/ui/widgets/action_buttons/like_action_button.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; - -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/action_button.dart'; - -class LikeActionButton extends StatefulWidget { - const LikeActionButton({required this.count, super.key, this.isLiked = false, this.onPressed}); - final String count; - final bool isLiked; - final VoidCallback? onPressed; - - @override - State createState() => _LikeActionButtonState(); -} - -class _LikeActionButtonState extends State with SingleTickerProviderStateMixin { - late AnimationController _animationController; - late Animation _scaleAnimation; - bool _isLiked = false; - - @override - void initState() { - super.initState(); - _isLiked = widget.isLiked; - - _animationController = AnimationController(duration: const Duration(milliseconds: 400), vsync: this); - - _scaleAnimation = TweenSequence([ - TweenSequenceItem(tween: Tween(begin: 1, end: 1.4), weight: 50), - TweenSequenceItem(tween: Tween(begin: 1.4, end: 1), weight: 50), - ]).animate(CurvedAnimation(parent: _animationController, curve: Curves.easeInOut)); - } - - @override - void didUpdateWidget(LikeActionButton oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.isLiked != widget.isLiked) { - _isLiked = widget.isLiked; - } - } - - @override - void dispose() { - _animationController.dispose(); - super.dispose(); - } - - void _handleTap() { - if (widget.onPressed != null) { - setState(() { - _isLiked = !_isLiked; - }); - - if (_isLiked) { - _animationController.reset(); - _animationController.forward(); - } - - widget.onPressed!(); - } - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _animationController, - builder: (context, child) { - final scale = _isLiked && _animationController.isAnimating ? _scaleAnimation.value : 1.0; - - return ActionButton( - key: ValueKey('like_button_${widget.count}'), - icon: _isLiked ? FluentIcons.heart_24_filled : FluentIcons.heart_24_regular, - color: _isLiked ? AppColors.red : null, - label: widget.count, - onPressed: _handleTap, - scale: scale, - ); - }, - ); - } -} diff --git a/lib/src/features/feed/ui/widgets/action_buttons/profile_action_button.dart b/lib/src/features/feed/ui/widgets/action_buttons/profile_action_button.dart deleted file mode 100644 index 9e4e0c61..00000000 --- a/lib/src/features/feed/ui/widgets/action_buttons/profile_action_button.dart +++ /dev/null @@ -1,144 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; - -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class ProfileActionButton extends StatefulWidget { - const ProfileActionButton({ - super.key, - this.profileImageUrl, - this.onPressed, - this.onFollowPressed, - this.size = 50.0, - this.border, - this.showFollowButton = false, - this.isFollowing = false, - this.followButtonBottomOffset = 8.0, - this.followButtonRightOffset = 13.0, - this.verticalOffset = 0, - this.debugHitboxes = false, - }); - final String? profileImageUrl; - final VoidCallback? onPressed; - final VoidCallback? onFollowPressed; - final double size; - final BoxBorder? border; - final bool showFollowButton; - final bool isFollowing; - final double followButtonBottomOffset; - final double followButtonRightOffset; - final double verticalOffset; - final bool debugHitboxes; - - @override - State createState() => _ProfileActionButtonState(); -} - -class _ProfileActionButtonState extends State { - bool _showCheckIcon = false; - - void _handleFollowTap() { - if (mounted) { - setState(() { - _showCheckIcon = true; - }); - } - - if (widget.onFollowPressed != null) { - widget.onFollowPressed!(); - } - } - - void _handleProfileTap() { - if (widget.onPressed != null) { - widget.onPressed!(); - } - } - - @override - Widget build(BuildContext context) { - final followButtonSize = widget.size * 0.5; - final hasValidImage = - widget.profileImageUrl != null && widget.profileImageUrl!.isNotEmpty && !widget.profileImageUrl!.contains('undefined'); - - return Material( - color: Colors.transparent, - child: SizedBox( - width: widget.size, - height: widget.size, - child: Transform.translate( - offset: Offset(0, widget.verticalOffset), - child: Stack( - clipBehavior: Clip.none, - children: [ - // Profile image - Center( - child: GestureDetector( - onTap: _handleProfileTap, - behavior: HitTestBehavior.opaque, - child: Container( - width: widget.size, - height: widget.size, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: widget.debugHitboxes ? Colors.red.withAlpha(50) : null, - border: widget.border ?? Border.all(color: AppColors.white, width: 2), - ), - child: ClipOval( - child: hasValidImage - ? CachedNetworkImage( - imageUrl: widget.profileImageUrl!, - fit: BoxFit.cover, - placeholder: (context, url) => Container(color: AppColors.deepPurple), - errorWidget: (context, url, error) => ColoredBox( - color: AppColors.deepPurple, - child: Center( - child: Icon(Icons.person, color: AppColors.white, size: widget.size * 0.5), - ), - ), - ) - : ColoredBox( - color: AppColors.deepPurple, - child: Center( - child: Icon(Icons.person, color: AppColors.white, size: widget.size * 0.5), - ), - ), - ), - ), - ), - ), - - // Follow button - if (widget.showFollowButton && !widget.isFollowing) - Positioned( - bottom: -(widget.size * 0.25) + widget.followButtonBottomOffset, - right: widget.size / 2 - widget.followButtonRightOffset, - child: GestureDetector( - onTap: _handleFollowTap, - behavior: HitTestBehavior.opaque, - child: Container( - width: followButtonSize, - height: followButtonSize, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: widget.debugHitboxes ? Colors.blue.withAlpha(50) : AppColors.primary, - border: Border.all(color: AppColors.white, width: 2), - ), - child: Center( - child: Icon( - _showCheckIcon ? FluentIcons.checkmark_24_filled : FluentIcons.add_24_filled, - size: widget.size * 0.3, - color: AppColors.white, - ), - ), - ), - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/src/features/feed/ui/widgets/action_buttons/share_action_button.dart b/lib/src/features/feed/ui/widgets/action_buttons/share_action_button.dart deleted file mode 100644 index 248fc9c5..00000000 --- a/lib/src/features/feed/ui/widgets/action_buttons/share_action_button.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/widgets/action_button.dart'; - -class ShareActionButton extends StatelessWidget { - const ShareActionButton({required this.count, super.key, this.onPressed}); - final String count; - final VoidCallback? onPressed; - - @override - Widget build(BuildContext context) { - return ActionButton(icon: FluentIcons.share_24_regular, label: count, onPressed: onPressed, showLabel: false); - } -} diff --git a/lib/src/features/feed/ui/widgets/action_buttons/side_action_bar.dart b/lib/src/features/feed/ui/widgets/action_buttons/side_action_bar.dart index b160d3bb..abccc2a3 100644 --- a/lib/src/features/feed/ui/widgets/action_buttons/side_action_bar.dart +++ b/lib/src/features/feed/ui/widgets/action_buttons/side_action_bar.dart @@ -4,19 +4,11 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; +import 'package:sparksocial/src/core/design_system/components/organisms/side_action_bar.dart'; import 'package:sparksocial/src/core/network/atproto/atproto.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; import 'package:sparksocial/src/core/storage/cache/sql_cache_interface.dart'; -import 'package:sparksocial/src/core/storage/preferences/settings_repository.dart'; -import 'package:sparksocial/src/core/widgets/menu_action_button.dart'; -import 'package:sparksocial/src/core/widgets/report_dialog.dart'; -import 'package:sparksocial/src/features/feed/providers/feed_provider.dart'; import 'package:sparksocial/src/features/feed/providers/like_post.dart'; -import 'package:sparksocial/src/features/feed/ui/widgets/action_buttons/comment_action_button.dart'; -import 'package:sparksocial/src/features/feed/ui/widgets/action_buttons/like_action_button.dart'; -import 'package:sparksocial/src/features/feed/ui/widgets/action_buttons/profile_action_button.dart'; -import 'package:sparksocial/src/features/feed/ui/widgets/action_buttons/share_action_button.dart'; -import 'package:sparksocial/src/features/profile/providers/profile_feed_provider.dart'; class SideActionBar extends ConsumerStatefulWidget { const SideActionBar({ @@ -36,9 +28,7 @@ class SideActionBar extends ConsumerStatefulWidget { final bool isLiked; final String? profileImageUrl; final PostView post; - // Add flag to identify image content final bool isImage; - // Add callback for profile navigation to allow pausing video final VoidCallback? onProfilePressed; @override @@ -191,115 +181,105 @@ class SideActionBarState extends ConsumerState { ); } - void _handleReport(BuildContext context) { - final currentPost = _currentPost ?? widget.post; - showDialog( - context: context, - builder: (context) => ReportDialog(postUri: currentPost.uri.toString(), postCid: currentPost.cid), - ); - } - - Future _handleDelete(BuildContext context) async { - // Cache context-dependent objects *before* the first await - final messenger = ScaffoldMessenger.of(context); - - // Confirm deletion - final shouldDelete = - await showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text('Delete Post'), - content: const Text('Are you sure you want to delete this post? This action cannot be undone.'), - actions: [ - TextButton(onPressed: () => context.router.maybePop(false), child: const Text('Cancel')), - TextButton( - style: TextButton.styleFrom(foregroundColor: Colors.red), - onPressed: () => context.router.maybePop(true), - child: const Text('Delete'), - ), - ], - ), - ) ?? - false; - - if (!shouldDelete || !mounted) return; - - try { - final currentPost = _currentPost ?? widget.post; - await GetIt.I().deletePost(currentPost.uri); - await GetIt.I().repo.deleteRecord(uri: currentPost.uri); - final feeds = await GetIt.I().getFeeds(); - for (final feed in feeds) { - ref.invalidate(feedNotifierProvider(feed)); - } - final did = currentPost.author.did; - ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), true)); - ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), false)); - messenger.showSnackBar(const SnackBar(content: Text('Post deleted successfully!'))); - if (context.mounted) { - context.router.popUntilRoot(); - } - } catch (e) { - if (mounted) { - messenger.showSnackBar(SnackBar(content: Text('Error deleting post: $e'))); - } - } - } - - void _handleProfilePressed() { - // Call custom callback if provided (for video pausing) - if (widget.onProfilePressed != null) { - widget.onProfilePressed!(); - } - - final currentPost = _currentPost ?? widget.post; - context.router.push(ProfileRoute(did: currentPost.author.did)); - } + // TODO: These handlers were part of the old design with profile and menu buttons. + // They may need to be reintegrated if those UI elements are added back. + // For now, they're kept for reference but not actively used. + + // void _handleReport(BuildContext context) { + // final currentPost = _currentPost ?? widget.post; + // showDialog( + // context: context, + // builder: (context) => ReportDialog(postUri: currentPost.uri.toString(), postCid: currentPost.cid), + // ); + // } + + // Future _handleDelete(BuildContext context) async { + // final messenger = ScaffoldMessenger.of(context); + // final shouldDelete = + // await showDialog( + // context: context, + // builder: (context) => AlertDialog( + // title: const Text('Delete Post'), + // content: const Text('Are you sure you want to delete this post? This action cannot be undone.'), + // actions: [ + // TextButton(onPressed: () => context.router.maybePop(false), child: const Text('Cancel')), + // TextButton( + // style: TextButton.styleFrom(foregroundColor: Colors.red), + // onPressed: () => context.router.maybePop(true), + // child: const Text('Delete'), + // ), + // ], + // ), + // ) ?? + // false; + // if (!shouldDelete || !mounted) return; + // try { + // final currentPost = _currentPost ?? widget.post; + // await GetIt.I().deletePost(currentPost.uri); + // await GetIt.I().repo.deleteRecord(uri: currentPost.uri); + // final feeds = await GetIt.I().getFeeds(); + // for (final feed in feeds) { + // ref.invalidate(feedNotifierProvider(feed)); + // } + // final did = currentPost.author.did; + // ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), true)); + // ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), false)); + // messenger.showSnackBar(const SnackBar(content: Text('Post deleted successfully!'))); + // if (context.mounted) { + // context.router.popUntilRoot(); + // } + // } catch (e) { + // if (mounted) { + // messenger.showSnackBar(SnackBar(content: Text('Error deleting post: $e'))); + // } + // } + // } + + // void _handleProfilePressed() { + // if (widget.onProfilePressed != null) { + // widget.onProfilePressed!(); + // } + // final currentPost = _currentPost ?? widget.post; + // context.router.push(ProfileRoute(did: currentPost.author.did)); + // } void _handleCommentPressed() { final currentPost = _currentPost ?? widget.post; context.router.push(CommentsRoute(postUri: currentPost.uri.toString(), isSprk: currentPost.isSprk, post: currentPost)); } + // Future _handleCurate() async { + // // For now, this is a placeholder for curate functionality + // // In the future, this could add the post to a custom feed or collection + // if (mounted) { + // ScaffoldMessenger.of(context).showSnackBar( + // const SnackBar(content: Text('Post curated to feed!')), + // ); + // } + // } + @override Widget build(BuildContext context) { - return Column( - children: [ - ProfileActionButton(profileImageUrl: widget.profileImageUrl, onPressed: _handleProfilePressed), - const SizedBox(height: 20), - - LikeActionButton( - count: (int.parse(widget.likeCount) + (_isLiked ? 1 : 0)).toString(), - isLiked: _isLiked, - onPressed: _handleLike, - ), - const SizedBox(height: 20), - - CommentActionButton( - count: (_currentPost?.replyCount ?? int.tryParse(widget.commentCount) ?? 0).toString(), - onPressed: _handleCommentPressed, - ), - const SizedBox(height: 20), + // Curation disabled: do not build curate destinations from feeds - // Only show share button for videos, not for images - if (!widget.isImage) ...[ - ShareActionButton(count: widget.shareCount, onPressed: _handleShare), - const SizedBox(height: 20), - ], - - MenuActionButton( - onPressed: () => _handleReport(context), - onDeletePressed: () async { - await _handleDelete(context); - if (context.mounted) { - context.router.popUntilRoot(); - } - }, - isOnVideo: true, - authorDid: (_currentPost ?? widget.post).author.did, - ), - const SizedBox(height: 20), - ], + final currentPost = _currentPost ?? widget.post; + final likeCount = (int.tryParse(widget.likeCount) ?? 0) + (_isLiked ? 1 : 0); + final commentCount = currentPost.replyCount ?? int.tryParse(widget.commentCount) ?? 0; + // final repostCount = currentPost.repostCount ?? int.tryParse(widget.shareCount) ?? 0; // Curation disabled + // final isCurated = currentPost.viewer?.repost != null; // Curation disabled + + return SparkSideActionBar( + onLike: _handleLike, + onComment: _handleCommentPressed, + // onCurate: _handleCurate, // Curation disabled + onShare: widget.isImage ? null : _handleShare, + likeCount: likeCount.toString(), + commentCount: commentCount.toString(), + // curateCount: repostCount.toString(), // Curation disabled + shareCount: widget.shareCount, + isLiked: _isLiked, + // isCurated: isCurated, // Curation disabled + // curateDestinations: curateDestinations, // Curation disabled ); } } diff --git a/lib/src/features/feed/ui/widgets/feed/feeds_bar.dart b/lib/src/features/feed/ui/widgets/feed/feeds_bar.dart index da6afdf0..a837fee8 100644 --- a/lib/src/features/feed/ui/widgets/feed/feeds_bar.dart +++ b/lib/src/features/feed/ui/widgets/feed/feeds_bar.dart @@ -1,12 +1,9 @@ -import 'dart:ui' show lerpDouble; - import 'package:auto_route/auto_route.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:get_it/get_it.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/templates/feeds_bar_template.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/utils/logging/logging.dart'; import 'package:sparksocial/src/features/feed/providers/feed_refresh_trigger_provider.dart'; import 'package:sparksocial/src/features/settings/providers/settings_provider.dart'; @@ -23,174 +20,34 @@ class FeedsBar extends ConsumerStatefulWidget implements PreferredSizeWidget { } class _FeedsBarState extends ConsumerState { - late final SparkLogger _logger; - bool _isReordering = false; - - @override - void initState() { - super.initState(); - _logger = GetIt.I().getLogger('FeedsBar'); - } - - double _getTabWidth(String text) { - final textPainter = TextPainter( - text: TextSpan( - text: text, - style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w700), - ), - textDirection: TextDirection.ltr, - ); - textPainter.layout(); - return textPainter.width + 24; - } - @override Widget build(BuildContext context) { final settings = ref.watch(settingsProvider); - // Calculate total width of all tabs to center them - double totalWidth = 0; - for (final feed in settings.feeds) { - totalWidth += _getTabWidth(feed.name) + 8.0; // 8.0 is margin - } - if (settings.feeds.isNotEmpty) totalWidth -= 8.0; // remove last margin - - return AppBar( - backgroundColor: Colors.transparent, - elevation: 0, - centerTitle: true, - flexibleSpace: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [Color.fromARGB(221, 0, 0, 0), Colors.transparent], - ), - ), - ), - title: LayoutBuilder( - builder: (context, constraints) { - final availableWidth = constraints.maxWidth; - // Account for the leading widget (back button) - approximately 56px - const leadingWidth = 56.0; - final centeringWidth = availableWidth - leadingWidth; - final horizontalPadding = leadingWidth + (centeringWidth - totalWidth) / 2.0; - - return SizedBox( - height: 44, - child: ReorderableListView.builder( - padding: EdgeInsets.symmetric(horizontal: horizontalPadding > 0 ? horizontalPadding : 0), - scrollDirection: Axis.horizontal, - itemCount: settings.feeds.length, - onReorderStart: (index) { - setState(() { - _isReordering = true; - }); - }, - onReorderEnd: (index) { - setState(() { - _isReordering = false; - }); - }, - onReorder: (oldIndex, newIndex) async { - if (_isReordering) return; - setState(() => _isReordering = true); - try { - if (newIndex > oldIndex) newIndex -= 1; - final activeFeedBeforeReorder = settings.activeFeed; - await ref.read(settingsProvider.notifier).reorderFeed(oldIndex, newIndex); - await Future.delayed(const Duration(milliseconds: 50)); - final updatedSettings = ref.read(settingsProvider); - final newActiveFeedIndex = updatedSettings.feeds.indexOf(activeFeedBeforeReorder); - if (newActiveFeedIndex != -1 && widget.pageController.hasClients) { - if ((widget.pageController.page?.round() ?? 0) != newActiveFeedIndex) { - widget.pageController.jumpToPage(newActiveFeedIndex); - } - } - } catch (e) { - _logger.e('Error reordering feeds: $e'); - } finally { - setState(() => _isReordering = false); - } - }, - proxyDecorator: (child, index, animation) { - return AnimatedBuilder( - animation: animation, - builder: (context, child) { - final animValue = Curves.easeInOutCubic.transform(animation.value); - final elevation = lerpDouble(0, 8, animValue)!; - final scale = lerpDouble(1, 1.2, animValue)!; - return Transform.scale( - scale: scale, - child: Material( - elevation: elevation, - borderRadius: BorderRadius.circular(25), - shadowColor: Colors.white.withAlpha(30), - color: Colors.transparent, - child: child, - ), - ); - }, - child: child, - ); - }, - itemBuilder: (context, index) { - final feed = settings.feeds[index]; - final isSelected = settings.activeFeed == feed; - return InkWell( - key: ValueKey(feed.identifier), - onTap: _isReordering - ? null - : () { - if (settings.activeFeed == feed) { - ref.read(feedRefreshTriggerProvider(feed).notifier).trigger(); - } else { - ref.read(settingsProvider.notifier).setActiveFeed(feed); - final feedIndex = settings.feeds.indexOf(feed); - if (feedIndex != -1 && widget.pageController.hasClients) { - widget.pageController.jumpToPage(feedIndex); - } - } - }, - borderRadius: BorderRadius.circular(25), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - feed.name, - style: TextStyle( - color: isSelected ? Colors.white : Colors.white.withAlpha(140), - fontWeight: FontWeight.w700, - fontSize: 18, - ), - ), - const SizedBox(height: 4), - AnimatedContainer( - duration: const Duration(milliseconds: 300), - curve: Curves.easeInOutCubic, - height: 2, - width: isSelected ? _getTabWidth(feed.name) * 0.5 : 0, - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(1)), - ), - ], - ), - ), - ); - }, - ), - ); - }, + final tags = settings.feeds.map((feed) => (id: feed.identifier, text: feed.name)).toList(); + + return FeedsBarTemplate( + tags: tags, + selectedTagId: settings.activeFeed.identifier, + onTagTap: (tagId) { + final feed = settings.feeds.firstWhere( + (f) => f.identifier == tagId, + ); + + if (settings.activeFeed == feed) { + ref.read(feedRefreshTriggerProvider(feed).notifier).trigger(); + } else { + ref.read(settingsProvider.notifier).setActiveFeed(feed); + final feedIndex = settings.feeds.indexOf(feed); + if (feedIndex != -1 && widget.pageController.hasClients) { + widget.pageController.jumpToPage(feedIndex); + } + } + }, + action: IconButton( + icon: AppIcons.hashtag(), + onPressed: () => context.router.navigate(const FeedSettingsRoute()), ), - actions: [ - IconButton( - icon: const Icon(FluentIcons.options_24_regular), - color: Colors.white, - iconSize: 30, - onPressed: () => context.router.navigate(const FeedSettingsRoute()), - ), - ], ); } } diff --git a/lib/src/features/feed/ui/widgets/images/image_carousel.dart b/lib/src/features/feed/ui/widgets/images/image_carousel.dart index b34f76e9..3e5986f2 100644 --- a/lib/src/features/feed/ui/widgets/images/image_carousel.dart +++ b/lib/src/features/feed/ui/widgets/images/image_carousel.dart @@ -3,7 +3,7 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; class ImageCarousel extends ConsumerStatefulWidget { const ImageCarousel({required this.imageUrls, super.key, this.alts}); @@ -26,6 +26,8 @@ class _ImageCarouselState extends ConsumerState { @override Widget build(BuildContext context) { + final safeBottom = MediaQuery.of(context).padding.bottom; + return Stack( children: [ CarouselSlider.builder( @@ -61,45 +63,27 @@ class _ImageCarouselState extends ConsumerState { }, ), ), - // Gradient overlay at the bottom to improve text readability - Positioned( - left: 0, - right: 0, - bottom: 0, - child: IgnorePointer( - child: Container( - height: 120, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.bottomCenter, - end: Alignment.topCenter, - colors: [Colors.black87.withAlpha(100), Colors.transparent], - ), - ), - ), - ), - ), - - Positioned( - bottom: 10, - left: 0, - right: 0, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ...List.generate( - widget.imageUrls.length, - (index) => Container( - width: 8, - height: 8, - margin: const EdgeInsets.symmetric(horizontal: 4), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: currentIndex == index ? Colors.white : Colors.white.withAlpha(128), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.only(bottom: safeBottom), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ...List.generate( + widget.imageUrls.length, + (index) => Container( + width: 8, + height: 8, + margin: const EdgeInsets.symmetric(horizontal: 4), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: currentIndex == index ? Colors.white : Colors.white.withAlpha(128), + ), ), ), - ), - ], + ], + ), ), ), ], diff --git a/lib/src/features/feed/ui/widgets/post/description.dart b/lib/src/features/feed/ui/widgets/post/description.dart deleted file mode 100644 index 91fae3e5..00000000 --- a/lib/src/features/feed/ui/widgets/post/description.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class Description extends StatefulWidget { - const Description({required this.text, super.key, this.style, this.maxLines = 2, this.onExpandToggle}); - final String text; - final TextStyle? style; - final int maxLines; - final Function(bool isExpanded)? onExpandToggle; - - @override - State createState() => _DescriptionState(); -} - -class _DescriptionState extends State with SingleTickerProviderStateMixin { - bool _isExpanded = false; - late final AnimationController _animationController; - late final Animation _scaleAnimation; - - @override - void initState() { - super.initState(); - _animationController = AnimationController(vsync: this, duration: const Duration(milliseconds: 300)); - - _scaleAnimation = TweenSequence([ - TweenSequenceItem(tween: Tween(begin: 1, end: 1.03), weight: 30), - TweenSequenceItem(tween: Tween(begin: 1.03, end: 1), weight: 70), - ]).animate(CurvedAnimation(parent: _animationController, curve: Curves.easeInOut)); - } - - @override - void dispose() { - _animationController.dispose(); - super.dispose(); - } - - void _toggleExpanded() { - setState(() { - _isExpanded = !_isExpanded; - if (_isExpanded) { - _animationController.forward(from: 0); - } else { - _animationController.forward(from: 0); - } - - if (widget.onExpandToggle != null) { - widget.onExpandToggle!(_isExpanded); - } - }); - } - - @override - Widget build(BuildContext context) { - if (widget.text.isEmpty) { - return const SizedBox.shrink(); - } - - return GestureDetector( - onTap: _toggleExpanded, - child: AnimatedBuilder( - animation: _animationController, - builder: (context, child) { - return Transform.scale(scale: _scaleAnimation.value, alignment: Alignment.topLeft, child: child); - }, - child: AnimatedSize( - duration: const Duration(milliseconds: 200), - curve: Curves.easeInOut, - child: Text( - widget.text, - style: widget.style ?? const TextStyle(color: AppColors.white, fontSize: 13), - maxLines: _isExpanded ? null : widget.maxLines, - overflow: _isExpanded ? TextOverflow.visible : TextOverflow.ellipsis, - ), - ), - ), - ); - } -} diff --git a/lib/src/features/feed/ui/widgets/post/feed_post_widget.dart b/lib/src/features/feed/ui/widgets/post/feed_post_widget.dart index 967636f0..ce1b30a7 100644 --- a/lib/src/features/feed/ui/widgets/post/feed_post_widget.dart +++ b/lib/src/features/feed/ui/widgets/post/feed_post_widget.dart @@ -6,10 +6,10 @@ import 'package:get_it/get_it.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; import 'package:sparksocial/src/core/storage/cache/sql_cache_interface.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/content_warning_overlay.dart'; +import 'package:sparksocial/src/core/ui/widgets/heart_animation.dart'; import 'package:sparksocial/src/core/utils/label_utils.dart'; -import 'package:sparksocial/src/core/widgets/content_warning_overlay.dart'; -import 'package:sparksocial/src/core/widgets/heart_animation.dart'; import 'package:sparksocial/src/features/feed/providers/feed_provider.dart'; import 'package:sparksocial/src/features/feed/providers/like_post.dart'; import 'package:sparksocial/src/features/feed/providers/post_updates.dart'; @@ -34,11 +34,12 @@ class _FeedPostWidgetState extends ConsumerState { String? _lastPostUri; int? _lastUpdateCount; final GlobalKey _videoPlayerKey = GlobalKey(); - final GlobalKey _sideActionBarKey = GlobalKey(); bool _isAnimatingHeart = false; bool _showWarningOverlay = false; bool _userDismissedWarning = false; List _warningLabels = []; + // Local UI override for like state to avoid needing a GlobalKey + bool? _overrideIsLiked; @override void initState() { @@ -55,6 +56,8 @@ class _FeedPostWidgetState extends ConsumerState { // Create new future if URI changed or if we need to force refresh _lastPostUri = currentUri; _postFuture = GetIt.instance().getPost(currentUri); + // Reset any UI overrides tied to the previous post + _overrideIsLiked = null; } } @@ -90,9 +93,12 @@ class _FeedPostWidgetState extends ConsumerState { // Update cache with the modified post await GetIt.instance().updatePost(updatedPost); - - // Update SideActionBar state directly - _sideActionBarKey.currentState?.updateLikeState(updatedPost); + // Drive SideActionBar via props instead of GlobalKey/stateful method + if (mounted) { + setState(() { + _overrideIsLiked = true; + }); + } } catch (e) { // Handle error silently for better UX } @@ -169,12 +175,11 @@ class _FeedPostWidgetState extends ConsumerState { if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) { final postData = snapshot.data! as PostView; final sideActionBar = SideActionBar( - key: _sideActionBarKey, post: postData, likeCount: '${postData.likeCount ?? 0}', commentCount: '${postData.replyCount ?? 0}', shareCount: '${postData.repostCount ?? 0}', - isLiked: postData.viewer?.like != null, + isLiked: _overrideIsLiked ?? (postData.viewer?.like != null), profileImageUrl: postData.author.avatar.toString(), isImage: postData.embed is EmbedViewImage || postData.embed is EmbedViewBskyImages, onProfilePressed: () { @@ -192,6 +197,7 @@ class _FeedPostWidgetState extends ConsumerState { final mainContent = HeartAnimation( isAnimating: _isAnimatingHeart, + bottomOffset: MediaQuery.of(context).padding.bottom, onEnd: () { setState(() { _isAnimatingHeart = false; @@ -204,6 +210,7 @@ class _FeedPostWidgetState extends ConsumerState { children: [ // Main content Positioned.fill( + bottom: 0 + MediaQuery.of(context).padding.bottom, child: switch (postData.embed) { EmbedViewVideo() => PostVideoPlayer( key: _videoPlayerKey, @@ -242,12 +249,34 @@ class _FeedPostWidgetState extends ConsumerState { }, ), - // Side action bar - Positioned(bottom: 4, right: 4, child: sideActionBar), + // Gradient overlay at the bottom to improve text readability + Positioned( + left: 0, + right: 0, + bottom: 0, + child: IgnorePointer( + child: Container( + height: 200 + MediaQuery.of(context).padding.bottom, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [Colors.black87.withAlpha(170), Colors.transparent], + ), + ), + ), + ), + ), + + Positioned( + bottom: 16 + MediaQuery.of(context).padding.bottom, + right: 8, + child: sideActionBar, + ), Positioned( - bottom: 32, - left: 4, + bottom: 16 + MediaQuery.of(context).padding.bottom, + left: 8, right: 80, child: Builder( builder: (context) { @@ -268,6 +297,8 @@ class _FeedPostWidgetState extends ConsumerState { final informLabels = snapshot.data ?? []; return InfoBar( username: postData.author.handle, + displayName: postData.author.displayName ?? postData.author.handle, + avatarUrl: postData.author.avatar?.toString(), description: postData.record.text ?? '', hashtags: postData.record.hashtags, informLabels: informLabels, diff --git a/lib/src/features/feed/ui/widgets/post/hashtag_list.dart b/lib/src/features/feed/ui/widgets/post/hashtag_list.dart deleted file mode 100644 index 4c2fd807..00000000 --- a/lib/src/features/feed/ui/widgets/post/hashtag_list.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/fading_list_view.dart'; - -class HashtagList extends StatelessWidget { - const HashtagList({required this.hashtags, super.key, this.style, this.onHashtagTap}); - final List hashtags; - final TextStyle? style; - final Function(String)? onHashtagTap; - - @override - Widget build(BuildContext context) { - if (hashtags.isEmpty) { - return const SizedBox.shrink(); - } - - return FadingListView( - fadeWidth: 16, - children: hashtags.map((tag) { - return GestureDetector( - onTap: onHashtagTap != null ? () => onHashtagTap!(tag) : null, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration(color: AppColors.white.withAlpha(50), borderRadius: BorderRadius.circular(12)), - child: Text( - '#$tag', - style: style ?? const TextStyle(color: AppColors.white, fontWeight: FontWeight.w500, fontSize: 13), - ), - ), - ); - }).toList(), - ); - } -} diff --git a/lib/src/features/feed/ui/widgets/post/info_bar.dart b/lib/src/features/feed/ui/widgets/post/info_bar.dart index bfe54197..3197af20 100644 --- a/lib/src/features/feed/ui/widgets/post/info_bar.dart +++ b/lib/src/features/feed/ui/widgets/post/info_bar.dart @@ -1,159 +1,61 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/design_system/templates/info_bar_template.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/post/alt_text_dialog.dart'; -import 'package:sparksocial/src/features/feed/ui/widgets/post/description.dart'; -import 'package:sparksocial/src/features/feed/ui/widgets/post/hashtag_list.dart'; -import 'package:sparksocial/src/features/feed/ui/widgets/post/post_source.dart'; +/// Adapter widget to keep feature layer API stable while migrating to +/// the Design System `InfoBarTemplate`. class InfoBar extends StatelessWidget { const InfoBar({ required this.username, + required this.displayName, required this.description, required this.hashtags, super.key, + this.avatarUrl, this.informLabels = const [], this.isSprk = false, this.altText, this.onUsernameTap, + this.onAvatarTap, this.onHashtagTap, this.onDescriptionExpandToggle, }); final String username; + final String displayName; final String description; final List hashtags; + final String? avatarUrl; final List informLabels; final bool isSprk; final String? altText; final VoidCallback? onUsernameTap; + final VoidCallback? onAvatarTap; final Function(String)? onHashtagTap; final Function(bool isExpanded)? onDescriptionExpandToggle; @override Widget build(BuildContext context) { - final hasDescription = description.isNotEmpty; - final hasHashtags = hashtags.isNotEmpty; - final hasInformLabels = informLabels.isNotEmpty; - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: GestureDetector( - onTap: onUsernameTap, - child: PostSource(username: username, isSprk: isSprk), - ), - ), - if (altText != null && altText!.trim().isNotEmpty) _AltButton(altText: altText!), - ], - ), - - if (hasDescription) const SizedBox(height: 10), - - Description(text: description, onExpandToggle: onDescriptionExpandToggle), - - if (hasDescription && hasHashtags) const SizedBox(height: 6), - - if (hasHashtags) - SizedBox( - height: 25, - child: HashtagList(hashtags: hashtags, onHashtagTap: onHashtagTap), - ), - - if (hasInformLabels && (hasHashtags || hasDescription)) const SizedBox(height: 6), - - if (hasInformLabels) _InformLabels(labels: informLabels), - ], - ); - } -} - -class _AltButton extends StatelessWidget { - const _AltButton({required this.altText}); - final String altText; - - @override - Widget build(BuildContext context) { - return Material( - color: AppColors.black.withAlpha(100), - borderRadius: BorderRadius.circular(8), - child: InkWell( - borderRadius: BorderRadius.circular(8), - onTap: () { - showModalBottomSheet( - context: context, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (_) => AltTextDialog(altText: altText), - ); - }, - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 6), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(FluentIcons.image_alt_text_20_regular, color: AppColors.white, size: 18), - SizedBox(width: 6), - Text( - 'ALT', - style: TextStyle(color: AppColors.white, fontWeight: FontWeight.bold, fontSize: 12), - ), - ], - ), - ), - ), - ); - } -} - -class _InformLabels extends StatelessWidget { - const _InformLabels({required this.labels}); - final List labels; - - @override - Widget build(BuildContext context) { - return Wrap( - spacing: 6, - runSpacing: 4, - children: labels.map((label) => _InformLabelChip(label: label)).toList(), - ); - } -} - -class _InformLabelChip extends StatelessWidget { - const _InformLabelChip({required this.label}); - final String label; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration( - color: AppColors.blue.withAlpha(150), - borderRadius: BorderRadius.circular(12), - border: Border.all(color: AppColors.blue.withAlpha(100)), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon( - FluentIcons.info_16_regular, - color: AppColors.white, - size: 12, - ), - const SizedBox(width: 4), - Text( - label, - style: const TextStyle( - color: AppColors.white, - fontSize: 11, - fontWeight: FontWeight.w500, - ), - ), - ], - ), + return InfoBarTemplate( + displayName: displayName, + handle: username, + description: description, + informLabels: informLabels, + avatarUrl: avatarUrl, + onTitleTap: onUsernameTap, + onHandleTap: onUsernameTap, + onAvatarTap: onAvatarTap ?? onUsernameTap, + onDescriptionExpandToggle: onDescriptionExpandToggle, + altAvailable: altText != null && altText!.trim().isNotEmpty, + onAltTap: (altText != null && altText!.trim().isNotEmpty) + ? () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (_) => AltTextDialog(altText: altText!), + ); + } + : null, ); } } diff --git a/lib/src/features/feed/ui/widgets/post/no_more_posts.dart b/lib/src/features/feed/ui/widgets/post/no_more_posts.dart index a6905061..35d4d31a 100644 --- a/lib/src/features/feed/ui/widgets/post/no_more_posts.dart +++ b/lib/src/features/feed/ui/widgets/post/no_more_posts.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; class NoMorePosts extends StatelessWidget { const NoMorePosts({super.key}); diff --git a/lib/src/features/feed/ui/widgets/post/post_source.dart b/lib/src/features/feed/ui/widgets/post/post_source.dart deleted file mode 100644 index 02664f34..00000000 --- a/lib/src/features/feed/ui/widgets/post/post_source.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class PostSource extends StatelessWidget { - const PostSource({required this.username, super.key, this.isSprk = false}); - final String username; - final bool isSprk; - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Flexible( - child: Text( - '@$username', - style: const TextStyle(color: AppColors.white, fontSize: 16, fontWeight: FontWeight.bold), - overflow: TextOverflow.ellipsis, - ), - ), - const SizedBox(width: 4), - Container( - padding: const EdgeInsets.all(4), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(42), - boxShadow: [ - BoxShadow(color: AppColors.black.withAlpha(30), blurRadius: 4, spreadRadius: 1), - ], - ), - child: isSprk - ? SvgPicture.asset('assets/images/sprk.svg', width: 14, height: 14) - : SvgPicture.asset('assets/images/bsky.svg', width: 14, height: 14), - ), - ], - ); - } -} diff --git a/lib/src/features/feed/ui/widgets/videos/slider.dart b/lib/src/features/feed/ui/widgets/videos/slider.dart deleted file mode 100644 index 319d1491..00000000 --- a/lib/src/features/feed/ui/widgets/videos/slider.dart +++ /dev/null @@ -1,163 +0,0 @@ -import 'package:flutter/material.dart'; - -/// A [SliderTrackShape] that draws a rounded rectangle track at the -/// bottom of the slider's container, but keeps the slider's gesture -/// hitbox vertically centered. -class BottomAlignedSliderTrackShape extends RoundedRectSliderTrackShape { - /// Create a slider track that is visually aligned to the bottom. - const BottomAlignedSliderTrackShape(); - - @override - void paint( - PaintingContext context, - Offset offset, { - required RenderBox parentBox, - required SliderThemeData sliderTheme, - required Animation enableAnimation, - required TextDirection textDirection, - // This thumbCenter is calculated by the RenderSlider and is vertically centered. - required Offset thumbCenter, - Offset? secondaryOffset, - bool isDiscrete = false, - bool isEnabled = false, - double additionalActiveTrackHeight = 2, - }) { - // These assertions are from the original implementation. - assert(sliderTheme.disabledActiveTrackColor != null); - assert(sliderTheme.disabledInactiveTrackColor != null); - assert(sliderTheme.activeTrackColor != null); - assert(sliderTheme.inactiveTrackColor != null); - assert(sliderTheme.thumbShape != null); - if (sliderTheme.trackHeight == null || sliderTheme.trackHeight! <= 0) { - return; - } - - // --- Start of Custom Logic --- - - // 1. Calculate the visual track rectangle, aligned to the bottom. - // We use the `getPreferredRect` from the superclass to get the correct - // horizontal dimensions and offsets. - final preferredRect = super.getPreferredRect( - parentBox: parentBox, - offset: offset, - sliderTheme: sliderTheme, - isEnabled: isEnabled, - isDiscrete: isDiscrete, - ); - - final trackHeight = sliderTheme.trackHeight!; - // The visual track is at the bottom of the parentBox. - // We subtract the track height to get the top of our visual track. - final trackRect = Rect.fromLTRB( - preferredRect.left, - parentBox.size.height - trackHeight, - preferredRect.right, - parentBox.size.height, - ); - - // 2. Adjust the thumb's vertical position to match our new visual track. - // The incoming `thumbCenter` is for the centered hitbox, so we create a - // new Offset for painting. - final adjustedThumbCenter = Offset( - thumbCenter.dx, - trackRect.center.dy, // Center of our bottom-aligned track - ); - - // 3. Adjust the secondary offset's vertical position as well. - final adjustedSecondaryOffset = secondaryOffset != null ? Offset(secondaryOffset.dx, trackRect.center.dy) : null; - - // --- End of Custom Logic --- - - // The rest of this method is a copy of the original - // `RoundedRectSliderTrackShape.paint` method, but it uses our - // new `trackRect`, `adjustedThumbCenter`, and `adjustedSecondaryOffset` values. - - final activeTrackColorTween = ColorTween( - begin: sliderTheme.disabledActiveTrackColor, - end: sliderTheme.activeTrackColor, - ); - final inactiveTrackColorTween = ColorTween( - begin: sliderTheme.disabledInactiveTrackColor, - end: sliderTheme.inactiveTrackColor, - ); - final activePaint = Paint()..color = activeTrackColorTween.evaluate(enableAnimation)!; - final inactivePaint = Paint()..color = inactiveTrackColorTween.evaluate(enableAnimation)!; - final (Paint leftTrackPaint, Paint rightTrackPaint) = switch (textDirection) { - TextDirection.ltr => (activePaint, inactivePaint), - TextDirection.rtl => (inactivePaint, activePaint), - }; - - final trackRadius = Radius.circular(trackRect.height / 2); - final activeTrackRadius = Radius.circular( - (trackRect.height + additionalActiveTrackHeight) / 2, - ); - final isLTR = textDirection == TextDirection.ltr; - final isRTL = textDirection == TextDirection.rtl; - - final drawInactiveTrack = adjustedThumbCenter.dx < (trackRect.right - (sliderTheme.trackHeight! / 2)); - if (drawInactiveTrack) { - // Draw the inactive track segment. - context.canvas.drawRRect( - RRect.fromLTRBR( - adjustedThumbCenter.dx - (sliderTheme.trackHeight! / 2), - isRTL ? trackRect.top - (additionalActiveTrackHeight / 2) : trackRect.top, - trackRect.right, - isRTL ? trackRect.bottom + (additionalActiveTrackHeight / 2) : trackRect.bottom, - isLTR ? trackRadius : activeTrackRadius, - ), - rightTrackPaint, - ); - } - final drawActiveTrack = adjustedThumbCenter.dx > (trackRect.left + (sliderTheme.trackHeight! / 2)); - if (drawActiveTrack) { - // Draw the active track segment. - context.canvas.drawRRect( - RRect.fromLTRBR( - trackRect.left, - isLTR ? trackRect.top - (additionalActiveTrackHeight / 2) : trackRect.top, - adjustedThumbCenter.dx + (sliderTheme.trackHeight! / 2), - isLTR ? trackRect.bottom + (additionalActiveTrackHeight / 2) : trackRect.bottom, - isLTR ? activeTrackRadius : trackRadius, - ), - leftTrackPaint, - ); - } - - final showSecondaryTrack = - (adjustedSecondaryOffset != null) && - (isLTR ? (adjustedSecondaryOffset.dx > adjustedThumbCenter.dx) : (adjustedSecondaryOffset.dx < adjustedThumbCenter.dx)); - - if (showSecondaryTrack) { - final secondaryTrackColorTween = ColorTween( - begin: sliderTheme.disabledSecondaryActiveTrackColor, - end: sliderTheme.secondaryActiveTrackColor, - ); - final secondaryTrackPaint = Paint()..color = secondaryTrackColorTween.evaluate(enableAnimation)!; - if (isLTR) { - context.canvas.drawRRect( - RRect.fromLTRBAndCorners( - adjustedThumbCenter.dx, - trackRect.top, - adjustedSecondaryOffset.dx, - trackRect.bottom, - topRight: trackRadius, - bottomRight: trackRadius, - ), - secondaryTrackPaint, - ); - } else { - context.canvas.drawRRect( - RRect.fromLTRBAndCorners( - adjustedSecondaryOffset.dx, - trackRect.top, - adjustedThumbCenter.dx, - trackRect.bottom, - topLeft: trackRadius, - bottomLeft: trackRadius, - ), - secondaryTrackPaint, - ); - } - } - } -} diff --git a/lib/src/features/feed/ui/widgets/videos/video_player.dart b/lib/src/features/feed/ui/widgets/videos/video_player.dart index 6bb1193b..73b6739f 100644 --- a/lib/src/features/feed/ui/widgets/videos/video_player.dart +++ b/lib/src/features/feed/ui/widgets/videos/video_player.dart @@ -2,13 +2,13 @@ import 'dart:async'; import 'package:better_player_plus/better_player_plus.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_animated_progress_bar/flutter_animated_progress_bar.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; import 'package:sparksocial/src/core/utils/logging/logging.dart'; import 'package:sparksocial/src/features/feed/providers/feed_provider.dart'; +import 'package:sparksocial/src/features/feed/ui/widgets/videos/video_progress_bar.dart'; import 'package:sparksocial/src/features/home/providers/navigation_provider.dart'; class PostVideoPlayer extends ConsumerStatefulWidget { @@ -25,13 +25,11 @@ class PostVideoPlayer extends ConsumerStatefulWidget { class PostVideoPlayerState extends ConsumerState with TickerProviderStateMixin { BetterPlayerController? videoController; - late final ProgressBarController _progressController; - bool _userInteracted = false; // Track if user manually played/paused + bool _userInteracted = false; late AnimationController _bounceController; late Animation _bounceAnimation; - // State tracking to prevent unnecessary play/pause cycles int? _lastNavigationIndex; int? _lastFeedIndex; @@ -49,11 +47,6 @@ class PostVideoPlayerState extends ConsumerState with TickerPro begin: 1, end: 1.3, ).animate(CurvedAnimation(parent: _bounceController, curve: Curves.elasticOut)); - _progressController = ProgressBarController( - vsync: this, - waitingDuration: const Duration(milliseconds: 100), - barAnimationDuration: const Duration(milliseconds: 200), - ); initVideoPlayer(); GetIt.I().getLogger('PostVideoPlayer').i('Initialized PostVideoPlayer with video URL: ${widget.videoUrl}'); } @@ -62,7 +55,7 @@ class PostVideoPlayerState extends ConsumerState with TickerPro if (videoController?.isPlaying() ?? false) { videoController?.pause(); setState(() { - _userInteracted = true; // Mark as user interaction to prevent auto-resume + _userInteracted = true; }); } } @@ -71,7 +64,6 @@ class PostVideoPlayerState extends ConsumerState with TickerPro void dispose() { _bounceController.dispose(); videoController?.dispose(); - _progressController.dispose(); super.dispose(); } @@ -87,7 +79,7 @@ class PostVideoPlayerState extends ConsumerState with TickerPro final playing = event.betterPlayerEventType == BetterPlayerEventType.play; if (playing) { _bounceController.stop(); - _bounceController.value = 1.0; // Reset bounce animation when playing + _bounceController.value = 1.0; } } } @@ -156,14 +148,11 @@ class PostVideoPlayerState extends ConsumerState with TickerPro return const Center(child: CircularProgressIndicator()); } - // Watch navigation state - handle changes only when they actually occur final navigationState = ref.watch(navigationProvider); final isOnFeedsTab = navigationState.currentIndex == 0; - // Watch feed state for auto-play logic - handle changes only when they actually occur final feedState = widget.feed != null ? ref.watch(feedNotifierProvider(widget.feed!)) : null; - // Handle navigation changes only when they actually change if (_lastNavigationIndex != navigationState.currentIndex) { _lastNavigationIndex = navigationState.currentIndex; WidgetsBinding.instance.addPostFrameCallback((_) { @@ -173,7 +162,6 @@ class PostVideoPlayerState extends ConsumerState with TickerPro }); } WidgetsBinding.instance.addPostFrameCallback((_) { - // Handle feed index changes only when they actually change if (feedState != null && _lastFeedIndex != feedState.index) { _lastFeedIndex = feedState.index; WidgetsBinding.instance.addPostFrameCallback((_) { @@ -187,79 +175,70 @@ class PostVideoPlayerState extends ConsumerState with TickerPro } }); - return GestureDetector( - onTap: () { - _userInteracted = true; // User manually interacted - if (isPlaying) { - videoController?.pause(); - } else { - videoController?.play(); - } - }, - child: Stack( - alignment: Alignment.center, - children: [ - Positioned.fill(child: BetterPlayer(controller: videoController!)), - Center( + final videoAspectRatio = videoController?.videoPlayerController?.value.aspectRatio; + final videoSize = videoController?.videoPlayerController?.value.size; + + final shouldFillScreen = videoAspectRatio != null && videoAspectRatio > 0.5 && videoAspectRatio < 0.7; + final fitMode = shouldFillScreen ? BoxFit.cover : BoxFit.contain; + + return Stack( + alignment: Alignment.center, + children: [ + Positioned.fill( + child: videoSize != null && videoSize.width > 0 && videoSize.height > 0 + ? FittedBox( + fit: fitMode, + child: SizedBox( + width: videoSize.width, + height: videoSize.height, + child: BetterPlayer(controller: videoController!), + ), + ) + : BetterPlayer(controller: videoController!), + ), + Positioned.fill( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + _userInteracted = true; + if (isPlaying) { + videoController?.pause(); + } else { + videoController?.play(); + } + }, + child: Container(color: Colors.transparent), + ), + ), + Center( + child: IgnorePointer( child: AnimatedBuilder( animation: _bounceAnimation, builder: (context, child) { return Transform.scale( - scale: isPlaying ? 1.0 : _bounceAnimation.value, - child: Icon( - isPlaying ? Icons.pause : Icons.play_arrow, - size: 50, - color: isPlaying ? Colors.transparent : AppColors.white, + scale: isPlaying ? 0.0 : _bounceAnimation.value, + child: SizedBox( + width: 50, + height: 50, + child: AppIcons.play(), ), ); }, ), ), - Positioned( - left: 0, - right: 0, - bottom: 0, - child: IgnorePointer( - child: Container( - height: 120, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.bottomCenter, - end: Alignment.topCenter, - colors: [Colors.black87.withAlpha(100), Colors.transparent], - ), - ), - ), - ), - ), + ), + if (videoController != null) Positioned( bottom: 0, left: 0, right: 0, - child: FutureBuilder( - future: videoController?.videoPlayerController?.position, - builder: (context, snapshot) { - final position = snapshot.data; - return ProgressBar( - controller: _progressController, - progress: position ?? Duration.zero, - total: videoController?.videoPlayerController?.value.duration ?? Duration.zero, - thumbGlowRadius: 0, - collapsedThumbRadius: 0, - collapsedProgressBarColor: AppColors.primary, - expandedBarHeight: 16, - - onSeek: (duration) { - if (videoController?.videoPlayerController != null) { - videoController?.videoPlayerController?.seekTo(duration); - } - }, - ); - }, + child: FeedVideoProgressBar( + controller: videoController!, + onSeekStart: (_) => _userInteracted = true, + onSeekEnd: (d) => videoController?.videoPlayerController?.seekTo(d), ), ), - ], - ), + ], ); } } diff --git a/lib/src/features/feed/ui/widgets/videos/video_progress_bar.dart b/lib/src/features/feed/ui/widgets/videos/video_progress_bar.dart new file mode 100644 index 00000000..15dd1308 --- /dev/null +++ b/lib/src/features/feed/ui/widgets/videos/video_progress_bar.dart @@ -0,0 +1,189 @@ +import 'dart:async'; + +import 'package:better_player_plus/better_player_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/video_progress_bar.dart' as ds; + +class FeedVideoProgressBar extends StatefulWidget { + const FeedVideoProgressBar({ + required this.controller, + super.key, + this.enableGestures = true, + this.tapTargetHeight = 30, + this.debugShowHitbox = false, + this.onSeekStart, + this.onSeek, + this.onSeekEnd, + this.updateInterval = const Duration(milliseconds: 250), + }); + + final BetterPlayerController controller; + final bool enableGestures; + final double tapTargetHeight; + final bool debugShowHitbox; + final ValueChanged? onSeekStart; + final ValueChanged? onSeek; + final ValueChanged? onSeekEnd; + final Duration updateInterval; + + @override + State createState() => _FeedVideoProgressBarState(); +} + +class _FeedVideoProgressBarState extends State { + dynamic _vp; + Duration _total = Duration.zero; + Duration _position = Duration.zero; + List _buffered = const []; + Timer? _ticker; + bool _dragging = false; + Duration? _pendingSeek; + + @override + void initState() { + super.initState(); + _attach(); + } + + @override + void didUpdateWidget(covariant FeedVideoProgressBar oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.controller != widget.controller) { + _detach(); + _attach(); + } + } + + void _attach() { + final internal = widget.controller.videoPlayerController; + _vp = internal; + _updateFromController(); + _vp?.addListener(_listener); + _ticker = Timer.periodic(widget.updateInterval, (_) => _throttledUpdate()); + } + + void _detach() { + _vp?.removeListener(_listener); + _ticker?.cancel(); + } + + void _listener() { + final v = _vp?.value; + if (v == null) return; + if (v.duration != _total) { + _updateFromController(force: true); + } + } + + void _throttledUpdate() { + if (!mounted) return; + _updateFromController(); + } + + void _updateFromController({bool force = false}) { + final v = _vp?.value; + if (v == null) return; + final pos = v.position; + final dur = v.duration; + final buf = v.buffered; + + if (!force && !_dragging && pos == _position && dur == _total && _listEquals(List.from(buf as List), _buffered)) { + return; + } + + if (!_dragging) { + setState(() { + _position = pos as Duration; + _total = dur as Duration; + _buffered = List.from(buf as List); + }); + } else if (force) { + setState(() => _total = dur as Duration); + } + } + + bool _listEquals(List a, List b) { + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) { + final ai = a[i]; + final bi = b[i]; + if (ai.start != bi.start || ai.end != bi.end) return false; + } + return true; + } + + @override + void dispose() { + _detach(); + super.dispose(); + } + + double get _progressFraction { + if (_total.inMilliseconds == 0) return 0; + final effective = _dragging && _pendingSeek != null ? _pendingSeek! : _position; + return effective.inMilliseconds / _total.inMilliseconds; + } + + List<(double, double)> get _bufferedFractions { + if (_total.inMilliseconds == 0) return const []; + return _buffered + .map<(double, double)>( + (r) => ( + (r.start.inMilliseconds / _total.inMilliseconds).clamp(0, 1), + (r.end.inMilliseconds / _total.inMilliseconds).clamp(0, 1), + ), + ) + .toList(growable: false); + } + + void _handleDragStart() { + if (_dragging) return; + _dragging = true; + _pendingSeek = _position; + widget.onSeekStart?.call(_position); + } + + void _handleDragUpdate(double fraction) { + if (_total == Duration.zero) return; + final targetMs = (fraction * _total.inMilliseconds).clamp(0, _total.inMilliseconds).toInt(); + final target = Duration(milliseconds: targetMs); + _pendingSeek = target; + widget.onSeek?.call(target); + setState(() {}); // update visual preview + } + + Future _handleDragEnd(double fraction) async { + if (_total == Duration.zero) { + _dragging = false; + return; + } + final finalMs = (fraction * _total.inMilliseconds).clamp(0, _total.inMilliseconds).toInt(); + final finalPos = Duration(milliseconds: finalMs); + _pendingSeek = finalPos; + setState(() {}); + try { + await _vp?.seekTo(finalPos); + } catch (_) {} + widget.onSeekEnd?.call(finalPos); + _dragging = false; + _pendingSeek = null; + } + + @override + Widget build(BuildContext context) { + final showThumb = widget.enableGestures && _dragging; + return ds.DSVideoProgressBar( + progress: _progressFraction, + bufferedSegments: _bufferedFractions, + showThumb: showThumb, + enableGestures: widget.enableGestures, + tapTargetHeight: widget.tapTargetHeight, + debugShowHitbox: widget.debugShowHitbox, + onDragStart: _handleDragStart, + onDragUpdate: _handleDragUpdate, + onDragEnd: _handleDragEnd, + height: 3, + thumbRadius: 5, + ); + } +} diff --git a/lib/src/features/home/ui/pages/main_page.dart b/lib/src/features/home/ui/pages/main_page.dart index 71d93548..b00fe329 100644 --- a/lib/src/features/home/ui/pages/main_page.dart +++ b/lib/src/features/home/ui/pages/main_page.dart @@ -1,16 +1,17 @@ import 'package:auto_route/auto_route.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:image_picker/image_picker.dart'; import 'package:imgly_editor/imgly_editor.dart'; +import 'package:sparksocial/src/core/design_system/components/organisms/bottom_nav_bar.dart'; import 'package:sparksocial/src/core/imgly/imgly_repository.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/feed/providers/feed_refresh_trigger_provider.dart'; import 'package:sparksocial/src/features/home/providers/navigation_provider.dart'; +import 'package:sparksocial/src/features/profile/providers/profile_provider.dart'; import 'package:sparksocial/src/features/settings/providers/settings_provider.dart'; @RoutePage() @@ -35,16 +36,16 @@ class _MainPageState extends ConsumerState { context: context, backgroundColor: Colors.transparent, builder: (BuildContext context) { - return SafeArea( - child: Container( - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: colorScheme.surface, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(20), - topRight: Radius.circular(20), - ), + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: colorScheme.surface, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), ), + ), + child: SafeArea( child: Wrap( children: [ ListTile( @@ -110,6 +111,9 @@ class _MainPageState extends ConsumerState { @override Widget build(BuildContext context) { + final session = ref.watch(sessionProvider); + final userDid = session?.did; + return AutoTabsRouter( key: const ValueKey('mainTabsRouter'), routes: const [FeedsRoute(), SearchRoute(), EmptyRoute(), MessagesRoute(), UserProfileRoute()], @@ -117,12 +121,21 @@ class _MainPageState extends ConsumerState { builder: (context, child) { final tabsRouter = AutoTabsRouter.of(context); + final profileAsync = userDid != null ? ref.watch(profileNotifierProvider(did: userDid)) : null; + final userAvatar = profileAsync?.asData?.value.profile?.avatar?.toString(); + + final avatarProvider = userAvatar != null && userAvatar.isNotEmpty + ? CachedNetworkImageProvider(userAvatar) + : const AssetImage('assets/images/sprk.svg') as ImageProvider; + return Scaffold( backgroundColor: Colors.black, + extendBody: true, body: child, - bottomNavigationBar: NavigationBar( - selectedIndex: tabsRouter.activeIndex, - onDestinationSelected: (index) { + bottomNavigationBar: SparkBottomNavBar( + currentIndex: tabsRouter.activeIndex, + userAvatar: avatarProvider, + onTap: (index) { if (index == 2) { _showCreateMenu(context); } else { @@ -135,37 +148,6 @@ class _MainPageState extends ConsumerState { } } }, - destinations: [ - const NavigationDestination( - icon: Icon(FluentIcons.home_24_regular), - selectedIcon: Icon(FluentIcons.home_24_filled), - label: 'Home', - ), - const NavigationDestination( - icon: Icon(FluentIcons.compass_northwest_24_regular), - selectedIcon: Icon(FluentIcons.compass_northwest_24_filled), - label: 'Discover', - ), - NavigationDestination( - icon: Container( - width: 48, - height: 36, - decoration: BoxDecoration(color: AppColors.primary, borderRadius: BorderRadius.circular(10)), - child: const Center(child: Icon(FluentIcons.add_24_filled, color: AppColors.white, size: 24)), - ), - label: 'Create', - ), - const NavigationDestination( - icon: Icon(FluentIcons.mail_inbox_all_24_regular), - selectedIcon: Icon(FluentIcons.mail_inbox_all_24_filled), - label: 'Inbox', - ), - const NavigationDestination( - icon: Icon(FluentIcons.person_24_regular), - selectedIcon: Icon(FluentIcons.person_24_filled), - label: 'Profile', - ), - ], ), ); }, diff --git a/lib/src/features/home/ui/pages/placeholder_page.dart b/lib/src/features/home/ui/pages/placeholder_page.dart deleted file mode 100644 index ef87f367..00000000 --- a/lib/src/features/home/ui/pages/placeholder_page.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:auto_route/auto_route.dart'; -import 'package:flutter/material.dart'; - -@RoutePage() -class PlaceholderPage extends StatelessWidget { - const PlaceholderPage({super.key}); - - @override - Widget build(BuildContext context) { - return const Scaffold( - body: Center(child: Text('The upload feature is disabled while we work on the video editor! Sorry about that.')), - ); - } -} diff --git a/lib/src/features/messages/ui/pages/chat_page.dart b/lib/src/features/messages/ui/pages/chat_page.dart index 26d69be4..d2acee3a 100644 --- a/lib/src/features/messages/ui/pages/chat_page.dart +++ b/lib/src/features/messages/ui/pages/chat_page.dart @@ -7,8 +7,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:image_picker/image_picker.dart'; import 'package:sparksocial/src/core/network/messages/data/models/message_models.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/messages/providers/conversation_provider.dart'; import 'package:sparksocial/src/features/messages/providers/polling_timer.dart'; @@ -111,7 +111,7 @@ class _ChatPageState extends ConsumerState { child: Row( children: [ UserAvatar( - imageUrl: widget.otherUserAvatar, + imageUrl: widget.otherUserAvatar ?? '', username: widget.otherUserHandle ?? 'User', size: 36, backgroundColor: getAvatarColor((widget.otherUserHandle ?? 'User').hashCode), diff --git a/lib/src/features/messages/ui/pages/messages_page.dart b/lib/src/features/messages/ui/pages/messages_page.dart index df23a546..ea64cd50 100644 --- a/lib/src/features/messages/ui/pages/messages_page.dart +++ b/lib/src/features/messages/ui/pages/messages_page.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; import 'package:sparksocial/src/core/utils/logging/log_service.dart'; import 'package:sparksocial/src/core/utils/logging/logging.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; import 'package:sparksocial/src/features/messages/providers/conversations_provider.dart'; @RoutePage() diff --git a/lib/src/features/messages/ui/widgets/conversation_list.dart b/lib/src/features/messages/ui/widgets/conversation_list.dart deleted file mode 100644 index e4b6e25f..00000000 --- a/lib/src/features/messages/ui/widgets/conversation_list.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:sparksocial/src/core/network/atproto/data/models/models.dart'; -import 'package:sparksocial/src/core/network/messages/data/models/message_models.dart'; -import 'package:sparksocial/src/features/messages/ui/widgets/conversation_list_item.dart'; - -class ConversationList extends StatelessWidget { - const ConversationList({required this.conversations, super.key, this.onConversationTap, this.onConversationLongPress}); - final List<(ProfileViewDetailed, Message)> conversations; - final Function((ProfileViewDetailed, Message))? onConversationTap; - final Function((ProfileViewDetailed, Message))? onConversationLongPress; - - @override - Widget build(BuildContext context) { - if (conversations.isEmpty) { - return const Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.chat_bubble_outline, size: 64, color: Colors.grey), - SizedBox(height: 8), - Text('Start a conversation to see it here', style: TextStyle(fontSize: 14, color: Colors.grey)), - ], - ), - ); - } - - return ListView.builder( - itemCount: conversations.length, - padding: EdgeInsets.zero, - itemBuilder: (context, index) { - final conversation = conversations[index]; - - return ConversationListItem( - message: conversation.$2, - otherUserProfile: conversation.$1, - onTap: () => onConversationTap?.call(conversation), - onLongPress: () => onConversationLongPress?.call(conversation), - ); - }, - ); - } -} diff --git a/lib/src/features/messages/ui/widgets/conversation_list_item.dart b/lib/src/features/messages/ui/widgets/conversation_list_item.dart index 93fa6cea..11e99c0e 100644 --- a/lib/src/features/messages/ui/widgets/conversation_list_item.dart +++ b/lib/src/features/messages/ui/widgets/conversation_list_item.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/models.dart'; import 'package:sparksocial/src/core/network/messages/data/models/message_models.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; class ConversationListItem extends StatelessWidget { const ConversationListItem({ diff --git a/lib/src/features/messages/ui/widgets/message_bubble.dart b/lib/src/features/messages/ui/widgets/message_bubble.dart index bcdc1cd9..e5b838d2 100644 --- a/lib/src/features/messages/ui/widgets/message_bubble.dart +++ b/lib/src/features/messages/ui/widgets/message_bubble.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:sparksocial/src/core/network/messages/data/models/message_models.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/features/messages/ui/widgets/sender_avatar.dart'; class MessageBubble extends StatelessWidget { diff --git a/lib/src/features/messages/ui/widgets/message_input.dart b/lib/src/features/messages/ui/widgets/message_input.dart index 40c21976..e5239c76 100644 --- a/lib/src/features/messages/ui/widgets/message_input.dart +++ b/lib/src/features/messages/ui/widgets/message_input.dart @@ -2,8 +2,8 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/profile/providers/profile_provider.dart'; @@ -41,9 +41,9 @@ class MessageInput extends ConsumerWidget { imageUrl: ref .read(profileNotifierProvider(did: session?.did ?? '')) .when( - data: (profileData) => profileData.profile?.avatar?.toString(), - error: (error, stackTrace) => null, - loading: () => null, + data: (profileData) => profileData.profile?.avatar?.toString() ?? '', + error: (error, stackTrace) => '', + loading: () => '', ), username: session?.handle ?? '', size: 28, diff --git a/lib/src/features/messages/ui/widgets/messages_list.dart b/lib/src/features/messages/ui/widgets/messages_list.dart index 918f739a..fdf61387 100644 --- a/lib/src/features/messages/ui/widgets/messages_list.dart +++ b/lib/src/features/messages/ui/widgets/messages_list.dart @@ -6,9 +6,9 @@ import 'package:get_it/get_it.dart'; import 'package:http/http.dart' as http; import 'package:sparksocial/src/core/network/messages/data/models/message_models.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; +import 'package:sparksocial/src/core/ui/widgets/image_content.dart'; +import 'package:sparksocial/src/core/ui/widgets/video_content.dart'; import 'package:sparksocial/src/core/utils/logging/log_service.dart'; -import 'package:sparksocial/src/core/widgets/image_content.dart'; -import 'package:sparksocial/src/core/widgets/video_content.dart'; import 'package:sparksocial/src/features/messages/ui/widgets/message_bubble.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/src/features/messages/ui/widgets/sender_avatar.dart b/lib/src/features/messages/ui/widgets/sender_avatar.dart index 7d5ed3f9..397c0c6d 100644 --- a/lib/src/features/messages/ui/widgets/sender_avatar.dart +++ b/lib/src/features/messages/ui/widgets/sender_avatar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; import 'package:sparksocial/src/features/messages/ui/pages/chat_page.dart'; class SenderAvatar extends StatelessWidget { @@ -21,7 +21,7 @@ class SenderAvatar extends StatelessWidget { } return UserAvatar( - imageUrl: otherUserAvatar, + imageUrl: otherUserAvatar ?? '', username: otherUserHandle ?? 'User', size: 32, backgroundColor: getAvatarColor((otherUserHandle ?? 'User').hashCode), diff --git a/lib/src/features/posting/ui/pages/image_review_page.dart b/lib/src/features/posting/ui/pages/image_review_page.dart index 97f04dba..abdae229 100644 --- a/lib/src/features/posting/ui/pages/image_review_page.dart +++ b/lib/src/features/posting/ui/pages/image_review_page.dart @@ -1,18 +1,16 @@ -import 'dart:io'; - import 'package:atproto/atproto.dart'; import 'package:atproto_core/atproto_core.dart'; import 'package:auto_route/auto_route.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart' hide Image; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:image_picker/image_picker.dart'; import 'package:imgly_editor/imgly_editor.dart'; +import 'package:sparksocial/src/core/design_system/templates/image_review_page_template.dart'; import 'package:sparksocial/src/core/imgly/imgly_repository.dart'; import 'package:sparksocial/src/core/network/atproto/atproto.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/widgets/alt_text_editor_dialog.dart'; +import 'package:sparksocial/src/core/ui/widgets/alt_text_editor_dialog.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/posting/providers/post_story.dart'; import 'package:sparksocial/src/features/profile/providers/profile_feed_provider.dart'; @@ -30,7 +28,6 @@ class ImageReviewPage extends ConsumerStatefulWidget { class _ImageReviewPageState extends ConsumerState { final TextEditingController _descriptionController = TextEditingController(); - final PageController _pageController = PageController(); bool _isPosting = false; int _currentPage = 0; List _imageFiles = []; @@ -65,20 +62,14 @@ class _ImageReviewPageState extends ConsumerState { super.initState(); _imageFiles = List.from(widget.imageFiles); _feedRepository = GetIt.I().feed; - _pageController.addListener(() { - final page = _pageController.page?.round() ?? 0; - if (_currentPage != page) { - setState(() { - _currentPage = page; - }); - } + _descriptionController.addListener(() { + if (mounted) setState(() {}); }); } @override void dispose() { _descriptionController.dispose(); - _pageController.dispose(); super.dispose(); } @@ -160,344 +151,55 @@ class _ImageReviewPageState extends ConsumerState { @override Widget build(BuildContext context) { final canPickMore = _imageFiles.length < _maxImages; + final settings = ref.watch(settingsProvider); + final crossPostEnabled = settings.postToBskyEnabled; + final showCrossPostWarning = crossPostEnabled && _imageFiles.length > 4; - return Scaffold( - backgroundColor: Theme.of(context).colorScheme.surface, - appBar: AppBar( - backgroundColor: Theme.of(context).colorScheme.surface, - elevation: 0, - leading: IconButton( - icon: Icon(FluentIcons.arrow_left_24_regular, color: Theme.of(context).colorScheme.onSurface), - onPressed: () => context.router.maybePop(), - ), - title: Text('Review Image Post', style: TextStyle(color: Theme.of(context).colorScheme.onSurface)), - ), - body: SafeArea( - child: Column( - children: [ - Expanded( - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (_imageFiles.isNotEmpty) - AspectRatio( - aspectRatio: 1, - child: Stack( - alignment: Alignment.bottomCenter, - children: [ - PageView.builder( - controller: _pageController, - itemCount: _imageFiles.length, - itemBuilder: (context, index) { - final image = _imageFiles[index]; - return GestureDetector( - onTap: () => showImageEditor(context, image), - child: Stack( - children: [ - Container( - margin: const EdgeInsets.symmetric(horizontal: 4), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage(image: FileImage(File(image.path)), fit: BoxFit.cover), - ), - ), - Positioned( - bottom: 8, - left: 8, - child: Container( - padding: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: Colors.black.withAlpha(150), - borderRadius: BorderRadius.circular(4), - ), - child: const Row( - children: [ - Icon(Icons.edit, color: Colors.white, size: 16), - SizedBox(width: 4), - Text( - 'Tap to edit', - style: TextStyle( - color: Colors.white, - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ), - Positioned( - bottom: 8, - right: 8, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Material( - color: Colors.black.withAlpha(100), - borderRadius: BorderRadius.circular(8), - child: InkWell( - onTap: () => _editAltText(image), - borderRadius: BorderRadius.circular(8), - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Row( - children: [ - Icon( - FluentIcons.image_alt_text_20_regular, - color: Colors.white, - size: 16, - ), - SizedBox(width: 2), - Text( - 'ALT', - style: TextStyle( - color: Colors.white, - fontSize: 12, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ), - ), - const SizedBox(width: 8), - Material( - color: Colors.black.withAlpha(100), - shape: const CircleBorder(), - child: InkWell( - onTap: () { - setState(() { - _imageFiles.removeAt(index); - _altTexts.remove(image.path); - if (_currentPage >= _imageFiles.length && _currentPage > 0) { - _currentPage = _imageFiles.length - 1; - } - }); - }, - customBorder: const CircleBorder(), - child: const Padding( - padding: EdgeInsets.all(4), - child: Icon(FluentIcons.dismiss_16_filled, color: Colors.white, size: 20), - ), - ), - ), - ], - ), - ), - ], - ), - ); - }, - ), - if (_imageFiles.length > 1) - Positioned( - bottom: 10, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration( - color: Colors.black.withAlpha(100), - borderRadius: BorderRadius.circular(10), - ), - child: Text( - '${_currentPage + 1} / ${_imageFiles.length}', - style: const TextStyle(color: Colors.white, fontSize: 12), - ), - ), - ), - ], - ), - ), - if (!widget.storyMode) const SizedBox(height: 20), - // Add More Images Button - if (!widget.storyMode) - SizedBox( - width: double.infinity, - child: ElevatedButton.icon( - onPressed: canPickMore ? _pickMoreImages : null, - icon: const Icon(FluentIcons.add_24_regular), - label: Text( - canPickMore ? 'Add More Images (${_imageFiles.length}/$_maxImages)' : 'Image Limit Reached', - ), - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.primary, - disabledBackgroundColor: Theme.of(context).colorScheme.primary.withAlpha(100), - foregroundColor: Theme.of(context).colorScheme.onPrimary, - padding: const EdgeInsets.symmetric(vertical: 14), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - ), - ), - const SizedBox(height: 20), - // Description input with character count - Builder( - builder: (context) { - final theme = Theme.of(context); - final textLength = _descriptionController.text.runes.length; - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Material( - color: Colors.transparent, - borderRadius: BorderRadius.circular(12), - child: TextField( - controller: _descriptionController, - maxLength: 300, - maxLines: 4, - style: theme.textTheme.bodyLarge?.copyWith(color: theme.colorScheme.onSurface), - decoration: InputDecoration( - hintText: 'Add a description... (optional)', - hintStyle: theme.textTheme.bodyLarge?.copyWith(color: theme.colorScheme.onSurfaceVariant), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: BorderSide(color: theme.colorScheme.outline), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: BorderSide(color: theme.colorScheme.outline), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: BorderSide(color: theme.colorScheme.primary, width: 2), - ), - filled: true, - fillColor: theme.colorScheme.surfaceContainerHighest, - contentPadding: const EdgeInsets.all(16), - counterText: '', - ), - onChanged: (_) => setState(() {}), - ), - ), - const SizedBox(height: 8), - Align( - alignment: Alignment.centerRight, - child: Text( - '$textLength/300', - style: theme.textTheme.bodySmall?.copyWith(color: theme.colorScheme.onSurfaceVariant), - ), - ), - ], - ); - }, - ), - const SizedBox(height: 20), - if (!widget.storyMode) - Consumer( - builder: (context, ref, _) { - final settings = ref.watch(settingsProvider); - final showWarning = settings.postToBskyEnabled && _imageFiles.length > 4; - return Column( - children: [ - Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - borderRadius: BorderRadius.circular(8), - ), - child: ListTile( - title: Text( - 'Post to Bluesky', - style: TextStyle(color: Theme.of(context).colorScheme.onSurface), - ), - trailing: Switch( - value: settings.postToBskyEnabled, - onChanged: (bool value) { - ref.read(settingsProvider.notifier).setPostToBsky(value); - }, - activeColor: Theme.of(context).colorScheme.primary, - ), - onTap: () { - ref.read(settingsProvider.notifier).setPostToBsky(!settings.postToBskyEnabled); - }, - ), - ), - if (showWarning) ...[ - const SizedBox(height: 12), - Container( - width: double.infinity, - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.orange.withAlpha(25), - borderRadius: BorderRadius.circular(8), - ), - child: const Row( - children: [ - Icon(Icons.info_outline, color: Colors.orange, size: 20), - SizedBox(width: 8), - Expanded( - child: Text( - 'Bluesky supports a maximum of 4 images. Your Bluesky post will link to the full Spark post instead.', - style: TextStyle(color: Colors.orange, fontSize: 13, fontWeight: FontWeight.w500), - ), - ), - ], - ), - ), - ], - ], - ); - }, - ), - ], - ), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(16), - child: SizedBox( - width: double.infinity, - child: ElevatedButton( - onPressed: _isPosting - ? null - : () async { - final postRef = await _uploadImagesAndPost(); - if (context.mounted && postRef != null) { - if (widget.storyMode) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Story posted successfully!')), - ); - } - context.router.popUntilRoot(); - final did = ref.read(sessionProvider)?.did; - if (did != null) { - ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), false)); - ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), true)); - } - if (!widget.storyMode) { - context.router.push(StandalonePostRoute(postUri: postRef.uri.toString())); - } - } - }, - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.primary, - padding: const EdgeInsets.symmetric(vertical: 16), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - disabledBackgroundColor: Theme.of(context).colorScheme.primary.withAlpha(100), - ), - child: _isPosting - ? SizedBox( - height: 20, - width: 20, - child: CircularProgressIndicator(strokeWidth: 2, color: Theme.of(context).colorScheme.onPrimary), - ) - : Text( - 'Post', - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimary, - fontWeight: FontWeight.bold, - fontSize: 16, - ), - ), - ), - ), - ), - ], - ), - ), + return ImageReviewPageTemplate( + title: 'Review Image Post', + onBack: () => context.router.maybePop(), + imagePaths: _imageFiles.map((e) => e.path).toList(), + currentPage: _currentPage, + onPageChanged: (i) => setState(() => _currentPage = i), + onTapEditImage: (i) => showImageEditor(context, _imageFiles[i]), + onAltEdit: (i) => _editAltText(_imageFiles[i]), + onRemoveImage: (i) { + setState(() { + final removed = _imageFiles.removeAt(i); + _altTexts.remove(removed.path); + if (_currentPage >= _imageFiles.length && _currentPage > 0) { + _currentPage = _imageFiles.length - 1; + } + }); + }, + showAddMore: !widget.storyMode, + canAddMore: canPickMore, + imagesCount: _imageFiles.length, + maxImages: _maxImages, + onAddMore: _pickMoreImages, + descriptionController: _descriptionController, + descriptionMaxChars: 300, + crossPostValue: crossPostEnabled, + onCrossPostChanged: (v) => ref.read(settingsProvider.notifier).setPostToBsky(v), + showCrossPostWarning: showCrossPostWarning, + postLabel: 'Post', + isPosting: _isPosting, + onPost: _isPosting + ? null + : () async { + final postRef = await _uploadImagesAndPost(); + if (context.mounted && postRef != null) { + context.router.popUntilRoot(); + final did = ref.read(sessionProvider)?.did; + if (did != null) { + ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), false)); + ref.invalidate(profileFeedProvider(AtUri.parse('at://$did'), true)); + } + if (!widget.storyMode) { + context.router.push(StandalonePostRoute(postUri: postRef.uri.toString())); + } + } + }, ); } } diff --git a/lib/src/features/posting/ui/pages/video_review_page.dart b/lib/src/features/posting/ui/pages/video_review_page.dart index 71bc4fcd..2bbfd155 100644 --- a/lib/src/features/posting/ui/pages/video_review_page.dart +++ b/lib/src/features/posting/ui/pages/video_review_page.dart @@ -10,7 +10,7 @@ import 'package:image_picker/image_picker.dart'; import 'package:imgly_editor/imgly_editor.dart'; import 'package:sparksocial/src/core/imgly/imgly_repository.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/widgets/alt_text_editor_dialog.dart'; +import 'package:sparksocial/src/core/ui/widgets/alt_text_editor_dialog.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/posting/providers/video_upload_provider.dart'; import 'package:sparksocial/src/features/profile/providers/profile_feed_provider.dart'; @@ -313,7 +313,7 @@ class _VideoReviewPageState extends ConsumerState { onChanged: (bool value) { ref.read(settingsProvider.notifier).setPostToBsky(value); }, - activeColor: Theme.of(context).colorScheme.primary, + activeTrackColor: Theme.of(context).colorScheme.primary, ), onTap: () { ref.read(settingsProvider.notifier).setPostToBsky(!settings.postToBskyEnabled); diff --git a/lib/src/features/posting/ui/widgets/camera_controls.dart b/lib/src/features/posting/ui/widgets/camera_controls.dart deleted file mode 100644 index fbce7c41..00000000 --- a/lib/src/features/posting/ui/widgets/camera_controls.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; - -class CameraControls extends StatelessWidget { - const CameraControls({ - required this.isVideoMode, - required this.isRecording, - required this.onCapturePressed, - required this.onFlipCameraPressed, - required this.onGalleryPressed, - required this.onImageGalleryPressed, - super.key, - }); - final bool isVideoMode; - final bool isRecording; - final VoidCallback onCapturePressed; - final VoidCallback onFlipCameraPressed; - final VoidCallback onGalleryPressed; - final VoidCallback onImageGalleryPressed; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - if (isVideoMode) - TooltipIconButton(icon: FluentIcons.image_multiple_24_regular, onPressed: onGalleryPressed, tooltip: 'Select Video') - else - TooltipIconButton( - icon: FluentIcons.image_add_24_regular, - onPressed: onImageGalleryPressed, - tooltip: 'Create Image Post', - ), - - CaptureButton(isRecording: isRecording, onCapturePressed: onCapturePressed, isVideoMode: isVideoMode), - - TooltipIconButton(icon: FluentIcons.camera_switch_24_regular, onPressed: onFlipCameraPressed, tooltip: 'Flip Camera'), - ], - ), - ); - } -} - -class TooltipIconButton extends StatelessWidget { - const TooltipIconButton({required this.icon, required this.onPressed, required this.tooltip, super.key}); - - final IconData icon; - final VoidCallback onPressed; - final String tooltip; - - @override - Widget build(BuildContext context) { - return Tooltip( - message: tooltip, - child: IconButton( - icon: Icon(icon, color: Colors.white, size: 30), - onPressed: onPressed, - ), - ); - } -} - -class CaptureButton extends StatelessWidget { - const CaptureButton({required this.isRecording, required this.onCapturePressed, required this.isVideoMode, super.key}); - - final bool isRecording; - final VoidCallback onCapturePressed; - final bool isVideoMode; - - @override - Widget build(BuildContext context) { - final size = isRecording ? 50.0 : 70.0; - final innerPadding = isRecording ? 5.0 : 3.0; - final innerShape = isRecording ? BorderRadius.circular(8) : null; - - return GestureDetector( - onTap: onCapturePressed, - child: Container( - width: size, - height: size, - padding: EdgeInsets.all(innerPadding), - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all(color: Colors.white, width: 3), - ), - child: Container( - decoration: BoxDecoration( - color: isVideoMode - ? (isRecording ? Colors.white : Theme.of(context).colorScheme.primary) - : Theme.of(context).colorScheme.primary, - shape: isRecording ? BoxShape.rectangle : BoxShape.circle, - borderRadius: innerShape, - ), - ), - ), - ); - } -} diff --git a/lib/src/features/posting/ui/widgets/camera_view.dart b/lib/src/features/posting/ui/widgets/camera_view.dart deleted file mode 100644 index 3b758ba5..00000000 --- a/lib/src/features/posting/ui/widgets/camera_view.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'dart:math' as math; - -import 'package:camera/camera.dart'; -import 'package:flutter/material.dart'; - -class CameraView extends StatefulWidget { - const CameraView({required this.cameraController, required this.isInitialized, super.key}); - final CameraController? cameraController; - final bool isInitialized; - - @override - State createState() => _CameraViewState(); -} - -class _CameraViewState extends State { - @override - Widget build(BuildContext context) { - if (!widget.isInitialized || widget.cameraController == null || !widget.cameraController!.value.isInitialized) { - return const ColoredBox( - color: Colors.black, - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CircularProgressIndicator(color: Colors.pink), - SizedBox(height: 16), - Text('Initializing camera...', style: TextStyle(color: Colors.grey, fontSize: 16)), - ], - ), - ), - ); - } - - try { - var tmp = MediaQuery.of(context).size; - final screenH = math.max(tmp.height, tmp.width); - final screenW = math.min(tmp.height, tmp.width); - tmp = widget.cameraController!.value.previewSize!; - final previewH = math.max(tmp.height, tmp.width); - final previewW = math.min(tmp.height, tmp.width); - final screenRatio = screenH / screenW; - final previewRatio = previewH / previewW; - - return OverflowBox( - maxHeight: screenRatio > previewRatio ? screenH : screenW / previewW * previewH, - maxWidth: screenRatio > previewRatio ? screenH / previewH * previewW : screenW, - child: CameraPreview(widget.cameraController!), - ); - } catch (e) { - return const ColoredBox( - color: Colors.black, - child: Center( - child: Text('Camera preview unavailable', style: TextStyle(color: Colors.red, fontSize: 16)), - ), - ); - } - } -} diff --git a/lib/src/features/posting/ui/widgets/mode_selector.dart b/lib/src/features/posting/ui/widgets/mode_selector.dart deleted file mode 100644 index ef476a00..00000000 --- a/lib/src/features/posting/ui/widgets/mode_selector.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -class ModeSelector extends StatelessWidget { - const ModeSelector({required this.isVideoMode, required this.onModeSelected, super.key}); - final bool isVideoMode; - final Function(bool) onModeSelected; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration(color: Colors.black.withAlpha(100), borderRadius: BorderRadius.circular(25)), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - ModeButton(label: 'Photo', isSelected: !isVideoMode, onTap: () => onModeSelected(false)), - ModeButton(label: 'Video', isSelected: isVideoMode, onTap: () => onModeSelected(true)), - ], - ), - ); - } -} - -class ModeButton extends StatelessWidget { - const ModeButton({required this.label, required this.isSelected, required this.onTap, super.key}); - - final String label; - final bool isSelected; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - decoration: BoxDecoration(color: isSelected ? Colors.pink : Colors.transparent, borderRadius: BorderRadius.circular(20)), - child: Text( - label, - style: TextStyle(color: Colors.white, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal), - ), - ), - ); - } -} diff --git a/lib/src/features/posting/ui/widgets/permission_requrest.dart b/lib/src/features/posting/ui/widgets/permission_requrest.dart deleted file mode 100644 index 2b961522..00000000 --- a/lib/src/features/posting/ui/widgets/permission_requrest.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; - -class CameraPermissionRequest extends StatelessWidget { - const CameraPermissionRequest({required this.onRequestPermission, super.key}); - final VoidCallback onRequestPermission; - - @override - Widget build(BuildContext context) { - return ColoredBox( - color: Colors.black, - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon(FluentIcons.camera_off_24_regular, color: Colors.white70, size: 48), - const SizedBox(height: 16), - const Text( - 'Camera permission required', - style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 8), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 32), - child: Text( - 'Please allow camera access to use this feature', - style: TextStyle(color: Colors.white70, fontSize: 14), - textAlign: TextAlign.center, - ), - ), - const SizedBox(height: 24), - ElevatedButton( - onPressed: onRequestPermission, - style: ElevatedButton.styleFrom( - backgroundColor: Colors.pink, - foregroundColor: Colors.white, - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), - ), - child: const Text('Grant Permission'), - ), - ], - ), - ), - ); - } -} diff --git a/lib/src/features/posting/ui/widgets/recording_bar.dart b/lib/src/features/posting/ui/widgets/recording_bar.dart deleted file mode 100644 index 66780fa7..00000000 --- a/lib/src/features/posting/ui/widgets/recording_bar.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; - -class RecordingBar extends StatelessWidget { - const RecordingBar({required this.isRecording, required this.progress, required this.timeText, super.key}); - final bool isRecording; - final double progress; // 0.0 to 1.0 - final String timeText; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: const EdgeInsets.symmetric(horizontal: 40), - height: 5, - child: ClipRRect( - borderRadius: BorderRadius.circular(2.5), - child: LinearProgressIndicator( - value: isRecording ? progress : 0, - backgroundColor: Colors.white.withAlpha(77), - valueColor: const AlwaysStoppedAnimation(Colors.pink), - ), - ), - ), - - const SizedBox(height: 10), - - Text( - timeText, - style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - ], - ); - } -} diff --git a/lib/src/features/posting/ui/widgets/video_preview_player.dart b/lib/src/features/posting/ui/widgets/video_preview_player.dart deleted file mode 100644 index e2e8f842..00000000 --- a/lib/src/features/posting/ui/widgets/video_preview_player.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:video_player/video_player.dart'; - -class VideoPreviewPlayer extends StatefulWidget { - const VideoPreviewPlayer({required this.controller, super.key}); - final VideoPlayerController controller; - - @override - State createState() => _VideoPreviewPlayerState(); -} - -class _VideoPreviewPlayerState extends State { - bool _showControls = true; - - @override - void initState() { - super.initState(); - Future.delayed(const Duration(seconds: 3), () { - if (mounted) { - setState(() { - _showControls = false; - }); - } - }); - } - - void _togglePlayPause() { - setState(() { - if (widget.controller.value.isPlaying) { - widget.controller.pause(); - } else { - widget.controller.play(); - - // Auto-hide controls after playing - Future.delayed(const Duration(seconds: 3), () { - if (mounted) { - setState(() { - _showControls = false; - }); - } - }); - } - }); - } - - void _toggleControls() { - setState(() { - _showControls = !_showControls; - - if (_showControls) { - Future.delayed(const Duration(seconds: 3), () { - if (mounted) { - setState(() { - _showControls = false; - }); - } - }); - } - }); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: _toggleControls, - child: Stack( - alignment: Alignment.center, - children: [ - AspectRatio(aspectRatio: widget.controller.value.aspectRatio, child: VideoPlayer(widget.controller)), - if (_showControls) - ColoredBox( - color: Colors.black.withAlpha(100), - child: Center( - child: IconButton( - icon: Icon( - widget.controller.value.isPlaying ? FluentIcons.pause_24_filled : FluentIcons.play_24_filled, - color: Colors.white, - size: 50, - ), - onPressed: _togglePlayPause, - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/src/features/profile/providers/profile_feed_provider.dart b/lib/src/features/profile/providers/profile_feed_provider.dart index 1138ce55..bfda8609 100644 --- a/lib/src/features/profile/providers/profile_feed_provider.dart +++ b/lib/src/features/profile/providers/profile_feed_provider.dart @@ -118,17 +118,13 @@ class ProfileFeed extends _$ProfileFeed { } } - // Filter by video/non-video type first - final typeFilteredPosts = videosOnly - ? allPosts.where((uri) => postTypes[uri] ?? true).toList() - : allPosts.where((uri) => postTypes[uri] == false).toList(); - - // Then filter based on label preferences - final filteredPosts = await _filterHiddenPosts(typeFilteredPosts, postViews); + // Client-side components decide whether to show videos/images/all. + // Here we only apply label-based filtering and return all posts. + final filteredPosts = await _filterHiddenPosts(allPosts, postViews); final isEndOfNetwork = (sparkResult.cursor == null && bskyResult.cursor == null) || - (currentState != null && currentState.loadedPosts.length == filteredPosts.length); + (currentState != null && currentState.allPosts.length == allPosts.length); return ProfileFeedState( loadedPosts: filteredPosts, diff --git a/lib/src/features/profile/ui/pages/edit_profile_page.dart b/lib/src/features/profile/ui/pages/edit_profile_page.dart index 843bc008..958c9bef 100644 --- a/lib/src/features/profile/ui/pages/edit_profile_page.dart +++ b/lib/src/features/profile/ui/pages/edit_profile_page.dart @@ -4,7 +4,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/actor_models.dart'; -import 'package:sparksocial/src/core/widgets/custom_text_field.dart'; +import 'package:sparksocial/src/core/ui/widgets/custom_text_field.dart'; import 'package:sparksocial/src/features/profile/providers/edit_profile_provider.dart'; /// Edit profile page that allows users to update their profile information diff --git a/lib/src/features/profile/ui/pages/profile_page.dart b/lib/src/features/profile/ui/pages/profile_page.dart index ee4cdae2..b99a3b03 100644 --- a/lib/src/features/profile/ui/pages/profile_page.dart +++ b/lib/src/features/profile/ui/pages/profile_page.dart @@ -3,15 +3,26 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; -import 'package:sparksocial/src/core/routing/app_router.dart'; // For EditProfileRoute, LoginRoute +import 'package:image_picker/image_picker.dart'; +import 'package:imgly_editor/model/source.dart'; +import 'package:sparksocial/src/core/auth/data/repositories/identity_repository.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/profile_tab_item.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/profile_tab_bar.dart'; +import 'package:sparksocial/src/core/design_system/templates/profile_page_template.dart'; +import 'package:sparksocial/src/core/imgly/imgly_repository.dart'; +import 'package:sparksocial/src/core/network/atproto/data/models/actor_models.dart' as actor_models; +import 'package:sparksocial/src/core/network/atproto/data/repositories/sprk_repository.dart'; +import 'package:sparksocial/src/core/routing/app_router.dart'; +import 'package:sparksocial/src/core/ui/widgets/menu_action_button.dart'; +import 'package:sparksocial/src/core/ui/widgets/report_dialog.dart'; import 'package:sparksocial/src/core/utils/logging/log_service.dart'; import 'package:sparksocial/src/core/utils/logging/logger.dart'; -import 'package:sparksocial/src/core/widgets/menu_action_button.dart'; -import 'package:sparksocial/src/core/widgets/report_dialog.dart'; +import 'package:sparksocial/src/core/utils/text_formatter.dart'; +import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/profile/providers/profile_provider.dart'; +import 'package:sparksocial/src/features/profile/ui/pages/user_list_page.dart'; import 'package:sparksocial/src/features/profile/ui/widgets/early_supporter_sheet.dart'; -import 'package:sparksocial/src/features/profile/ui/widgets/profile_header.dart'; -import 'package:sparksocial/src/features/profile/ui/widgets/profile_tabs.dart'; @RoutePage() class ProfilePage extends ConsumerStatefulWidget { @@ -24,10 +35,11 @@ class ProfilePage extends ConsumerStatefulWidget { class _ProfilePageState extends ConsumerState { late final SparkLogger _logger = GetIt.instance().getLogger('ProfilePage'); + late final IdentityRepository _identityRepository = GetIt.instance(); + late final IMGLYRepository _imglyRepository = GetIt.instance(); @override void dispose() { - // Ensure we don't have any lingering references before disposal super.dispose(); } @@ -42,6 +54,102 @@ class _ProfilePageState extends ConsumerState { ); } + Future _handleUsernameTap(String username) async { + try { + final cleanUsername = username.startsWith('@') ? username.substring(1) : username; + _logger.d('Username clicked: $cleanUsername'); + + final didRes = await _identityRepository.resolveHandleToDid(cleanUsername); + if (didRes == null) { + _logger.w('Could not resolve handle to DID for $cleanUsername'); + return; + } + if (mounted) { + context.router.push(ProfileRoute(did: didRes)); + } + } catch (e, s) { + _logger.e('Error resolving handle: $e', error: e, stackTrace: s); + } + } + + Future _handleAddStory(BuildContext context) async { + final colorScheme = Theme.of(context).colorScheme; + final handle = ref.read(sessionProvider)?.handle; + + await showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + builder: (BuildContext context) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: colorScheme.surface, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), + child: SafeArea( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.camera_alt, color: colorScheme.onSurface), + title: Text('Record', style: TextStyle(color: colorScheme.onSurface)), + onTap: () async { + final cameraResult = await _imglyRepository.openCamera(userID: handle); + if (cameraResult != null && cameraResult.recording != null && cameraResult.recording!.recordings.isNotEmpty) { + if (context.mounted) { + final video = await _imglyRepository.openVideoEditor( + source: Source.fromVideo(cameraResult.recording!.recordings.first.videos.first.uri), + ); + if (video != null && context.mounted) { + context.router.push(VideoReviewRoute(editorResult: video, storyMode: true)); + } + } + } + }, + ), + ListTile( + leading: Icon(Icons.videocam, color: colorScheme.onSurface), + title: Text('Upload Video', style: TextStyle(color: colorScheme.onSurface)), + onTap: () async { + final pickedVideo = await ImagePicker().pickVideo( + source: ImageSource.gallery, + maxDuration: const Duration(seconds: 180), + ); + if (pickedVideo != null && context.mounted) { + final video = await _imglyRepository.openVideoEditor( + source: Source.fromVideo('file://${pickedVideo.path}'), + ); + if (video != null && context.mounted) { + context.router.push(VideoReviewRoute(editorResult: video, storyMode: true)); + } + } + }, + ), + ListTile( + leading: Icon(Icons.photo_library, color: colorScheme.onSurface), + title: Text('Upload Images', style: TextStyle(color: colorScheme.onSurface)), + onTap: () async { + final pickedImages = await ImagePicker().pickMultiImage(limit: 12); + if (context.mounted && pickedImages.isNotEmpty) { + context.router.push( + ImageReviewRoute( + imageFiles: pickedImages, + storyMode: true, + ), + ); + } + }, + ), + ], + ), + ), + ); + }, + ); + } + @override Widget build(BuildContext context) { final profileStateAsync = ref.watch(profileNotifierProvider(did: widget.did)); @@ -57,9 +165,6 @@ class _ProfilePageState extends ConsumerState { final profile = state.profile; if (profile == null) { - // This case should ideally be handled by error state if loading failed and profile is null - // Or if initial state is null and loading hasn't completed (covered by loading state) - // If profile is null after successful load but no error, it's profile not found. return ErrorScreen( context: context, message: 'Profile not found', @@ -69,163 +174,165 @@ class _ProfilePageState extends ConsumerState { ); } final isCurrentUser = notifier.isCurrentUser(); + final description = profile.description ?? ''; + final links = TextFormatter.extractUrls(description); + final uniqueLinks = links.toSet().toList(); return AutoTabsRouter( routes: [ ProfileVideosRoute(did: widget.did), - ProfilePhotosRoute(did: widget.did), ], builder: (context, child) { final tabsRouter = AutoTabsRouter.of(context); - return Scaffold( - backgroundColor: theme.scaffoldBackgroundColor, - appBar: AppBar( - centerTitle: true, - title: Text( - profile.displayName ?? profile.handle, // handle is not nullable in core Profile model - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: theme.textTheme.titleLarge?.color), - ), - backgroundColor: theme.brightness == Brightness.dark - ? colorScheme.surfaceContainerHighest - : colorScheme.surface, // Example colors - elevation: 0, - actions: [ - if (isCurrentUser) - Padding( - padding: const EdgeInsets.only(right: 8), - child: IconButton( - padding: EdgeInsets.zero, - onPressed: () { - context.router.push(const ProfileSettingsRoute()); - }, - icon: Icon(FluentIcons.options_24_regular, color: Theme.of(context).colorScheme.onSurface), - ), - ) - else - Padding( - padding: const EdgeInsets.only(right: 8), - child: MenuActionButton( - // Assuming this widget is fine - onPressed: () => showDialog( - context: context, - useRootNavigator: false, - builder: (dContext) => ReportDialog( - // postUri & postCid for profiles are a bit different. - // For profiles, the subject is the DID itself. - postUri: 'at://${profile.did}/app.bsky.actor.profile/self', // Or just profile.did - postCid: profile - .did, // Using DID as a placeholder, actual String not usually needed for profile report subject - onSubmit: (subject, reasonType, reason, service) async { - try { - // The ReportDialog gives reasonType as atp.ModerationReasonType - // String reasonTypeString = (reasonType as dynamic).value; // Adapt if ReportDialog gives different type + return ProfilePageTemplate( + displayName: profile.displayName ?? profile.handle, + handle: profile.handle, + postsCount: TextFormatter.formatCount(profile.postsCount), + followersCount: TextFormatter.formatCount(profile.followersCount), + followingCount: TextFormatter.formatCount(profile.followsCount), + avatarUrl: profile.avatar?.toString(), + description: description.isNotEmpty ? description : null, + links: uniqueLinks.isNotEmpty ? uniqueLinks : null, + hasStories: profile.stories?.isNotEmpty ?? false, + isCurrentUser: isCurrentUser, + isFollowing: profile.viewer?.following != null, + isEarlySupporter: state.isEarlySupporter, + onAvatarTap: (profile.stories?.isNotEmpty ?? false) ? () => _openStoriesViewer(profile) : null, + onFollowersTap: () => context.router.push(UserListRoute(did: widget.did, type: UserListType.followers)), + onFollowingTap: () => context.router.push(UserListRoute(did: widget.did, type: UserListType.following)), + onEditTap: () { + context.router.push(EditProfileRoute(profile: profile)).then((updated) { + if (updated == true) { + notifier.refreshProfile(); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Profile updated successfully')), + ); + } + } + }); + }, + onFollowTap: () async { + try { + await notifier.toggleFollow(); + final latestProfileState = ref.read(profileNotifierProvider(did: widget.did)).asData?.value; - final success = await notifier.createReport( - did: profile.did, - reasonType: reasonType, // Pass the enum directly - reason: reason, - ); - if (success) { - if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(const SnackBar(content: Text('Report submitted successfully'))); - } - } - } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Error submitting report: $e'))); - } - } - }, - ), + if (latestProfileState != null && !latestProfileState.showAuthPrompt) { + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Followed successfully'), + backgroundColor: Colors.green, ), - backgroundColor: colorScheme.onSurface.withAlpha(30), // Example adaptive color - isProfile: true, - ), + ); + } + } + } catch (e) { + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error: $e'), backgroundColor: Colors.red), + ); + } + } + }, + onUnfollowTap: () async { + try { + await notifier.toggleFollow(); + final latestProfileState = ref.read(profileNotifierProvider(did: widget.did)).asData?.value; + + if (latestProfileState != null && !latestProfileState.showAuthPrompt) { + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Unfollowed successfully'), + backgroundColor: Colors.green, + ), + ); + } + } + } catch (e) { + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error: $e'), backgroundColor: Colors.red), + ); + } + } + }, + onShareTap: () => _logger.i('Share profile tapped for ${profile.did}'), + onEarlySupporterTap: () => _showEarlySupporterInfo(context), + onMentionTap: _handleUsernameTap, + onAddStoryTap: isCurrentUser ? () => _handleAddStory(context) : null, + appBarTitle: profile.displayName ?? profile.handle, + appBarActions: [ + if (isCurrentUser) + Padding( + padding: const EdgeInsets.only(right: 8), + child: IconButton( + padding: EdgeInsets.zero, + onPressed: () => context.router.push(const ProfileSettingsRoute()), + icon: Icon(FluentIcons.options_24_regular, color: colorScheme.onSurface), ), - ], - ), - body: SafeArea( - child: RefreshIndicator( - onRefresh: notifier.refreshProfile, - child: CustomScrollView( - key: PageStorageKey('profile_${widget.did}'), // Use the passed did - slivers: [ - SliverToBoxAdapter( - child: ProfileHeader( - profile: profile, - isCurrentUser: isCurrentUser, - isEarlySupporter: state.isEarlySupporter, - onEarlySupporterTap: () => _showEarlySupporterInfo(context), - onEditTap: () { - context.router.push(EditProfileRoute(profile: profile)).then((updated) { - if (updated == true) { - notifier.refreshProfile(); - if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(const SnackBar(content: Text('Profile updated successfully'))); - } - } - }); - }, - onShareTap: () => _logger.i('Share profile tapped for ${profile.did}'), - onFollowTap: () async { - final initialFollowingStateForSnackbar = profile.viewer?.following; // Capture before action + ) + else + Padding( + padding: const EdgeInsets.only(right: 8), + child: MenuActionButton( + onPressed: () => showDialog( + context: context, + useRootNavigator: false, + builder: (dContext) => ReportDialog( + postUri: 'at://${profile.did}/app.bsky.actor.profile/self', + postCid: profile.did, + onSubmit: (subject, reasonType, reason, service) async { try { - await notifier.toggleFollow(); - // Read the latest state AFTER the toggleFollow has completed and updated the state. - final latestProfileState = ref.read(profileNotifierProvider(did: widget.did)).asData?.value; - - // Only show snackbar if an actual follow/unfollow action occurred - // and auth prompt was not the primary outcome. - if (latestProfileState != null && - !latestProfileState.showAuthPrompt && - latestProfileState.profile?.viewer?.following != initialFollowingStateForSnackbar) { - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - latestProfileState.profile?.viewer?.following != null - ? 'Followed successfully' - : 'Unfollowed successfully', - ), - backgroundColor: Colors.green, - ), - ); - } + final success = await notifier.createReport( + did: profile.did, + reasonType: reasonType, + reason: reason, + ); + if (success && context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Report submitted successfully')), + ); } } catch (e) { if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Error: $e'), backgroundColor: Colors.red)); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error submitting report: $e')), + ); } } }, ), ), - SliverPersistentHeader( - pinned: true, - delegate: StickyTabBarDelegate( - child: ProfileTabs( - selectedIndex: tabsRouter.activeIndex, - onTabSelected: tabsRouter.setActiveIndex, - isAuthenticated: isCurrentUser, - ), - ), - ), - SliverFillRemaining( - child: child, // This will be the auto-routed tab content - ), - ], + backgroundColor: colorScheme.onSurface.withAlpha(30), + isProfile: true, + ), ), - ), + ], + tabsWidget: ProfileTabBar( + selectedIndex: tabsRouter.activeIndex, + tabs: [ + ProfileTabItem( + icon: AppIcons.profileGrid(), + filledIcon: AppIcons.profileGridFilled(), + isSelected: tabsRouter.activeIndex == 0, + onTap: () => tabsRouter.setActiveIndex(0), + ), + // ProfileTabItem( + // icon: AppIcons.profileLiked(), + // filledIcon: AppIcons.likeFilled(), + // isSelected: tabsRouter.activeIndex == 1, + // onTap: () => tabsRouter.setActiveIndex(1), + // ), + ], ), + + selectedTabIndex: tabsRouter.activeIndex, + onTabChanged: tabsRouter.setActiveIndex, + contentWidget: child, + onRefresh: notifier.refreshProfile, ); }, ); @@ -243,6 +350,39 @@ class _ProfilePageState extends ConsumerState { ), ); } + + Future _openStoriesViewer(actor_models.ProfileViewDetailed profile) async { + if (profile.stories?.isEmpty ?? true) return; + + try { + final storyUris = profile.stories!.map((strongRef) => strongRef.uri).toList(); + if (storyUris.isEmpty) return; + + final sprkRepository = GetIt.instance(); + final stories = await sprkRepository.feed.getStoryViews(storyUris); + if (stories.isEmpty) { + _logger.w('No stories found for profile ${profile.did}'); + return; + } + + stories.sort((a, b) => a.indexedAt.compareTo(b.indexedAt)); + + final authorBasic = actor_models.ProfileViewBasic( + did: profile.did, + handle: profile.handle, + displayName: profile.displayName, + avatar: profile.avatar, + viewer: profile.viewer, + stories: profile.stories, + ); + + if (mounted) { + context.router.push(AllStoriesRoute(storiesByAuthor: {authorBasic: stories})); + } + } catch (e, s) { + _logger.e('Failed to open stories viewer', error: e, stackTrace: s); + } + } } class ErrorScreen extends StatelessWidget { diff --git a/lib/src/features/profile/ui/pages/profile_photos_page.dart b/lib/src/features/profile/ui/pages/profile_photos_page.dart deleted file mode 100644 index 4bbc3722..00000000 --- a/lib/src/features/profile/ui/pages/profile_photos_page.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:atproto_core/atproto_core.dart'; -import 'package:auto_route/auto_route.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:sparksocial/src/features/profile/ui/widgets/profile_grid_widget.dart'; - -@RoutePage() -class ProfilePhotosPage extends ConsumerWidget { - const ProfilePhotosPage({@PathParam('did') required this.did, super.key}); - final String did; - - @override - Widget build(BuildContext context, WidgetRef ref) { - return ProfileGridWidget( - profileUri: AtUri.parse('at://$did'), - videosOnly: false, - ); - } -} diff --git a/lib/src/features/profile/ui/pages/profile_videos_page.dart b/lib/src/features/profile/ui/pages/profile_videos_page.dart index 83896714..473a57e1 100644 --- a/lib/src/features/profile/ui/pages/profile_videos_page.dart +++ b/lib/src/features/profile/ui/pages/profile_videos_page.dart @@ -13,7 +13,8 @@ class ProfileVideosPage extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { return ProfileGridWidget( profileUri: AtUri.parse('at://$did'), - videosOnly: true, + videosOnly: false, + both: true, ); } } diff --git a/lib/src/features/profile/ui/pages/standalone_profile_feed_page.dart b/lib/src/features/profile/ui/pages/standalone_profile_feed_page.dart index 7fdcb985..e66f4732 100644 --- a/lib/src/features/profile/ui/pages/standalone_profile_feed_page.dart +++ b/lib/src/features/profile/ui/pages/standalone_profile_feed_page.dart @@ -2,7 +2,7 @@ import 'package:atproto_core/atproto_core.dart'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/feed/cacheable_page_view.dart'; import 'package:sparksocial/src/features/profile/providers/profile_feed_provider.dart'; import 'package:sparksocial/src/features/profile/ui/widgets/profile_feed_post_widget.dart'; @@ -49,14 +49,19 @@ class _StandaloneProfileFeedPageState extends ConsumerState state.postTypes[u] ?? true).toList() + : state.loadedPosts.where((u) => state.postTypes[u] == false).toList(); + + if (filteredUris.isEmpty) { return const Center( child: Text('No posts available', style: TextStyle(color: AppColors.white)), ); } // Ensure initial index is within bounds - final safeInitialIndex = widget.initialPostIndex.clamp(0, state.loadedPosts.length - 1); + final safeInitialIndex = widget.initialPostIndex.clamp(0, filteredUris.length - 1); // Update page controller if needed if (pageController.hasClients && pageController.page?.round() != safeInitialIndex) { @@ -70,19 +75,19 @@ class _StandaloneProfileFeedPageState extends ConsumerState= state.loadedPosts.length - 3 && !state.isEndOfNetwork) { + if (index >= filteredUris.length - 3 && !state.isEndOfNetwork) { ref.read(profileFeedProvider(profileAtUri, widget.videosOnly).notifier).loadMore(); } }, itemBuilder: (context, index) { - if (index >= state.loadedPosts.length) { + if (index >= filteredUris.length) { return const Center(child: CircularProgressIndicator(color: AppColors.white)); } - final postUri = state.loadedPosts[index]; + final postUri = filteredUris[index]; final post = state.postViews[postUri]; return ProfileFeedPostWidget(postUri: postUri, profileUri: profileAtUri, videosOnly: widget.videosOnly, post: post); }, diff --git a/lib/src/features/profile/ui/pages/user_list_page.dart b/lib/src/features/profile/ui/pages/user_list_page.dart index 12805d6e..0152d3ea 100644 --- a/lib/src/features/profile/ui/pages/user_list_page.dart +++ b/lib/src/features/profile/ui/pages/user_list_page.dart @@ -1,6 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/app_leading_button.dart'; import 'package:sparksocial/src/features/profile/providers/user_list_provider.dart'; import 'package:sparksocial/src/features/profile/ui/widgets/user_list_view.dart'; @@ -46,6 +47,7 @@ class _UserListPageState extends ConsumerState { return Scaffold( appBar: AppBar( + leading: const AppLeadingButton(tooltip: 'Back'), title: Text(title), ), body: RefreshIndicator( diff --git a/lib/src/features/profile/ui/widgets/auth_required_content.dart b/lib/src/features/profile/ui/widgets/auth_required_content.dart deleted file mode 100644 index 0b9e6217..00000000 --- a/lib/src/features/profile/ui/widgets/auth_required_content.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class AuthRequiredContent extends StatelessWidget { - const AuthRequiredContent({ - required this.title, - required this.description, - required this.icon, - required this.onLoginPressed, - super.key, - }); - final String title; - final String description; - final IconData icon; - final VoidCallback onLoginPressed; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - - return SliverFillRemaining( - hasScrollBody: false, - child: Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 24), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(icon, size: 60, color: AppColors.primary), - const SizedBox(height: 20), - Text( - title, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - color: theme.textTheme.titleMedium?.color ?? theme.colorScheme.onSurface, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 10), - Text( - description, - style: TextStyle(color: theme.textTheme.bodyMedium?.color ?? theme.colorScheme.onSurfaceVariant), - textAlign: TextAlign.center, - ), - const SizedBox(height: 24), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: AppColors.primary, - padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - ), - onPressed: onLoginPressed, - child: const Text( - 'Login', - style: TextStyle(fontWeight: FontWeight.bold, color: AppColors.white), - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/early_supporter_sheet.dart b/lib/src/features/profile/ui/widgets/early_supporter_sheet.dart index 01fee5c9..ca3bc955 100644 --- a/lib/src/features/profile/ui/widgets/early_supporter_sheet.dart +++ b/lib/src/features/profile/ui/widgets/early_supporter_sheet.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; class EarlySupporterSheet extends StatelessWidget { const EarlySupporterSheet({super.key}); @@ -26,10 +26,11 @@ class EarlySupporterSheet extends StatelessWidget { decoration: BoxDecoration(color: Colors.grey.shade400, borderRadius: BorderRadius.circular(2)), ), SvgPicture.asset( - 'assets/images/match.svg', + 'images/match.svg', height: 48, width: 48, colorFilter: const ColorFilter.mode(AppColors.primary, BlendMode.srcIn), + package: 'assets', ), const SizedBox(height: 16), const Text( diff --git a/lib/src/features/profile/ui/widgets/profile_avatar_editor.dart b/lib/src/features/profile/ui/widgets/profile_avatar_editor.dart deleted file mode 100644 index 38d9f410..00000000 --- a/lib/src/features/profile/ui/widgets/profile_avatar_editor.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'dart:typed_data'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/features/profile/providers/edit_profile_provider.dart'; -import 'package:sparksocial/src/features/profile/providers/edit_profile_state.dart'; - -/// Widget for editing the profile avatar -class ProfileAvatarEditor extends StatefulWidget { - /// Creates a profile avatar editor - const ProfileAvatarEditor({required this.state, required this.notifier, super.key}); - - /// Current state of the profile being edited - final EditProfileState state; - - /// The notifier to trigger actions on the profile - final EditProfile notifier; - - @override - State createState() => _ProfileAvatarEditorState(); -} - -class _ProfileAvatarEditorState extends State { - @override - Widget build(BuildContext context) { - ImageProvider? avatarImageProvider; - - if (widget.state.localAvatar is Uint8List) { - avatarImageProvider = MemoryImage(widget.state.localAvatar as Uint8List); - } else if (widget.state.localAvatar is String) { - avatarImageProvider = CachedNetworkImageProvider(widget.state.localAvatar as String); - } - - return Stack( - alignment: Alignment.topRight, - children: [ - GestureDetector( - onTap: () { - widget.notifier.pickAvatar(); - }, - child: CircleAvatar( - radius: 50, - backgroundImage: avatarImageProvider, - child: avatarImageProvider == null ? const Icon(Icons.person, size: 50) : null, - ), - ), - if (widget.state.localAvatar is Uint8List) - IconButton(icon: const Icon(Icons.undo), onPressed: widget.notifier.revertAvatar, color: AppColors.pink), - ], - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_content_thumbnail.dart b/lib/src/features/profile/ui/widgets/profile_content_thumbnail.dart deleted file mode 100644 index 0562e32f..00000000 --- a/lib/src/features/profile/ui/widgets/profile_content_thumbnail.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:get_it/get_it.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/utils/logging/log_service.dart'; - -class ProfileContentThumbnail extends StatelessWidget { - const ProfileContentThumbnail({ - required this.index, - required this.backgroundColor, - required this.icon, - required this.viewCount, - super.key, - this.duration, - }); - final int index; - final Color backgroundColor; - final IconData icon; - final String viewCount; - final String? duration; - - @override - Widget build(BuildContext context) { - final logger = GetIt.instance().getLogger('ProfileContentThumbnail'); - - return GestureDetector( - onTap: () { - logger.d('Content clicked at index $index'); - }, - child: ColoredBox( - color: backgroundColor, - child: Stack( - children: [ - Center(child: Icon(icon, color: AppColors.white.withAlpha(204), size: 24)), - Positioned( - bottom: 5, - left: 5, - child: Row( - children: [ - const Icon(FluentIcons.eye_24_regular, color: AppColors.white, size: 12), - const SizedBox(width: 4), - Text(viewCount, style: const TextStyle(color: AppColors.white, fontSize: 12)), - ], - ), - ), - if (duration != null) - Positioned( - top: 5, - right: 5, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), - decoration: BoxDecoration(color: AppColors.black.withAlpha(128), borderRadius: BorderRadius.circular(4)), - child: Text(duration!, style: const TextStyle(color: AppColors.white, fontSize: 10)), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_description.dart b/lib/src/features/profile/ui/widgets/profile_description.dart deleted file mode 100644 index 7517b11f..00000000 --- a/lib/src/features/profile/ui/widgets/profile_description.dart +++ /dev/null @@ -1,130 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class ProfileDescription extends StatefulWidget { - const ProfileDescription({ - required this.text, - super.key, - this.style, - this.maxLines = 2, - this.onExpandToggle, - this.onMentionTap, - }); - final String text; - final TextStyle? style; - final int maxLines; - final Function(bool isExpanded)? onExpandToggle; - final Function(String username)? onMentionTap; - - @override - State createState() => _ProfileDescriptionState(); -} - -class _ProfileDescriptionState extends State with SingleTickerProviderStateMixin { - bool _isExpanded = false; - late final AnimationController _animationController; - late final Animation _scaleAnimation; - - @override - void initState() { - super.initState(); - _animationController = AnimationController(vsync: this, duration: const Duration(milliseconds: 300)); - - _scaleAnimation = TweenSequence([ - TweenSequenceItem(tween: Tween(begin: 1, end: 1.03), weight: 30), - TweenSequenceItem(tween: Tween(begin: 1.03, end: 1), weight: 70), - ]).animate(CurvedAnimation(parent: _animationController, curve: Curves.easeInOut)); - } - - @override - void dispose() { - _animationController.dispose(); - super.dispose(); - } - - void _toggleExpanded() { - setState(() { - _isExpanded = !_isExpanded; - if (_isExpanded) { - _animationController.forward(); - } else { - _animationController.reverse(); - } - - if (widget.onExpandToggle != null) { - widget.onExpandToggle!(_isExpanded); - } - }); - } - - List _findUsernameMatches(String text) { - final usernameRegex = RegExp(r'\B@([a-zA-Z0-9_.-]+\.[a-zA-Z]{2,}|[a-zA-Z0-9_]+)', caseSensitive: false); - return usernameRegex.allMatches(text).toList(); - } - - List _buildTextSpans(String text, List usernameMatches, TextStyle defaultStyle) { - final spans = []; - var lastEnd = 0; - - usernameMatches.sort((a, b) => a.start.compareTo(b.start)); - - for (final match in usernameMatches) { - if (match.start > lastEnd) { - spans.add(TextSpan(text: text.substring(lastEnd, match.start))); // Default style is applied by RichText - } - - final username = match.group(0)!; - spans.add( - TextSpan( - text: username, - style: const TextStyle(color: AppColors.primary, fontWeight: FontWeight.bold), - recognizer: TapGestureRecognizer() - ..onTap = () { - if (widget.onMentionTap != null) { - widget.onMentionTap!(username); - } - }, - ), - ); - lastEnd = match.end; - } - - if (lastEnd < text.length) { - spans.add(TextSpan(text: text.substring(lastEnd))); // Default style is applied by RichText - } - return spans; - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final usernameMatches = _findUsernameMatches(widget.text); - final defaultStyle = - widget.style ?? TextStyle(color: theme.textTheme.bodyMedium?.color ?? theme.colorScheme.onSurface, fontSize: 14); - - final textSpan = TextSpan( - children: _buildTextSpans(widget.text, usernameMatches, defaultStyle), - style: defaultStyle, // Apply default style to the parent TextSpan - ); - - return GestureDetector( - onTap: _toggleExpanded, - child: AnimatedBuilder( - animation: _animationController, - builder: (context, child) { - return Transform.scale(scale: _scaleAnimation.value, alignment: Alignment.topLeft, child: child); - }, - child: AnimatedSize( - duration: const Duration(milliseconds: 200), - curve: Curves.easeInOut, - child: RichText( - text: textSpan, - maxLines: _isExpanded ? null : widget.maxLines, - overflow: _isExpanded ? TextOverflow.visible : TextOverflow.ellipsis, - ), - ), - ), - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_feed_post_widget.dart b/lib/src/features/profile/ui/widgets/profile_feed_post_widget.dart index e23af556..3bc2f355 100644 --- a/lib/src/features/profile/ui/widgets/profile_feed_post_widget.dart +++ b/lib/src/features/profile/ui/widgets/profile_feed_post_widget.dart @@ -7,10 +7,10 @@ import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dar import 'package:sparksocial/src/core/network/atproto/data/repositories/sprk_repository.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; import 'package:sparksocial/src/core/storage/cache/sql_cache_interface.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; +import 'package:sparksocial/src/core/ui/widgets/content_warning_overlay.dart'; +import 'package:sparksocial/src/core/ui/widgets/heart_animation.dart'; import 'package:sparksocial/src/core/utils/label_utils.dart'; -import 'package:sparksocial/src/core/widgets/content_warning_overlay.dart'; -import 'package:sparksocial/src/core/widgets/heart_animation.dart'; import 'package:sparksocial/src/features/feed/providers/like_post.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/action_buttons/side_action_bar.dart'; import 'package:sparksocial/src/features/feed/ui/widgets/images/image_carousel.dart'; @@ -30,10 +30,10 @@ class ProfileFeedPostWidget extends ConsumerStatefulWidget { class _ProfileFeedPostWidgetState extends ConsumerState { bool _isAnimatingHeart = false; - final GlobalKey _sideActionBarKey = GlobalKey(); bool _showWarningOverlay = false; bool _shouldBlurContent = false; List _warningLabels = []; + bool? _overrideIsLiked; @override void initState() { @@ -99,8 +99,12 @@ class _ProfileFeedPostWidgetState extends ConsumerState { // Update cache with the modified post await GetIt.instance().updatePost(updatedPost); - // Update SideActionBar state directly - _sideActionBarKey.currentState?.updateLikeState(updatedPost); + // Drive SideActionBar via props instead of GlobalKey/stateful method + if (mounted) { + setState(() { + _overrideIsLiked = true; + }); + } } catch (e) { // Handle error silently for better UX } @@ -190,17 +194,35 @@ class _ProfileFeedPostWidgetState extends ConsumerState { _ => const DecoratedBox(decoration: BoxDecoration(color: AppColors.black)), }, + // Gradient overlay at the bottom to improve text readability + Positioned( + left: 0, + right: 0, + bottom: 16, + child: IgnorePointer( + child: Container( + height: 80, // covers the area behind the InfoBar + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [Colors.black87.withAlpha(170), Colors.transparent], + ), + ), + ), + ), + ), + // Side action bar Positioned( bottom: 4, right: 4, child: SideActionBar( - key: _sideActionBarKey, post: post, likeCount: '${post.likeCount ?? 0}', commentCount: '${post.replyCount ?? 0}', shareCount: '${post.repostCount ?? 0}', - isLiked: post.viewer?.like != null, + isLiked: _overrideIsLiked ?? (post.viewer?.like != null), profileImageUrl: post.author.avatar.toString(), isImage: post.embed is EmbedViewImage || post.embed is EmbedViewBskyImages, onProfilePressed: () { @@ -219,6 +241,8 @@ class _ProfileFeedPostWidgetState extends ConsumerState { final informLabels = snapshot.data ?? []; return InfoBar( username: post.author.handle, + displayName: post.author.displayName ?? post.author.handle, + avatarUrl: post.author.avatar?.toString(), description: post.record.text ?? '', hashtags: post.record.hashtags, informLabels: informLabels, diff --git a/lib/src/features/profile/ui/widgets/profile_grid_widget.dart b/lib/src/features/profile/ui/widgets/profile_grid_widget.dart index b92e4c4f..0641c496 100644 --- a/lib/src/features/profile/ui/widgets/profile_grid_widget.dart +++ b/lib/src/features/profile/ui/widgets/profile_grid_widget.dart @@ -1,21 +1,26 @@ -import 'dart:ui'; - import 'package:atproto/core.dart'; import 'package:auto_route/auto_route.dart'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/post_tile.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; import 'package:sparksocial/src/core/utils/label_utils.dart'; import 'package:sparksocial/src/features/profile/providers/profile_feed_provider.dart'; class ProfileGridWidget extends ConsumerStatefulWidget { - const ProfileGridWidget({required this.profileUri, required this.videosOnly, super.key}); + const ProfileGridWidget({ + required this.profileUri, + required this.videosOnly, + this.both = false, + super.key, + }); final AtUri profileUri; + // When true, ignore videosOnly and show both images and videos + final bool both; + // When false and both is false: images only; when true and both is false: videos only final bool videosOnly; @override @@ -47,23 +52,36 @@ class _ProfileGridWidgetState extends ConsumerState { @override Widget build(BuildContext context) { + // Watch once and filter locally based on flags final feedState = ref.watch(profileFeedProvider(widget.profileUri, widget.videosOnly)); return feedState.when( data: (state) { - if (state.loadedPosts.isEmpty) { + // Filter posts in client depending on configuration + final filteredUris = () { + if (widget.both) return state.loadedPosts; + if (widget.videosOnly) { + return state.loadedPosts.where((u) => state.postTypes[u] ?? true).toList(); + } + // images only + return state.loadedPosts.where((u) => state.postTypes[u] == false).toList(); + }(); + + if (filteredUris.isEmpty) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( - widget.videosOnly ? FluentIcons.video_24_regular : FluentIcons.image_24_regular, + widget.both + ? FluentIcons.grid_24_regular + : (widget.videosOnly ? FluentIcons.video_24_regular : FluentIcons.image_24_regular), size: 48, color: Theme.of(context).colorScheme.onSurfaceVariant, ), const SizedBox(height: 16), Text( - widget.videosOnly ? 'No videos yet' : 'No images yet', + widget.both ? 'No posts yet' : (widget.videosOnly ? 'No videos yet' : 'No images yet'), style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), ), ], @@ -73,23 +91,23 @@ class _ProfileGridWidgetState extends ConsumerState { return GridView.builder( controller: scrollController, - padding: const EdgeInsets.all(1), + padding: const EdgeInsets.all(5), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 4, - crossAxisSpacing: 1, - mainAxisSpacing: 1, - childAspectRatio: 0.6, + crossAxisCount: 3, + crossAxisSpacing: 5, + mainAxisSpacing: 5, + childAspectRatio: 9 / 16, ), - itemCount: state.loadedPosts.length + (state.isEndOfNetwork ? 0 : 1), + itemCount: filteredUris.length + (state.isEndOfNetwork ? 0 : 1), itemBuilder: (context, index) { - if (index >= state.loadedPosts.length) { + if (index >= filteredUris.length) { return ColoredBox( color: Theme.of(context).colorScheme.surfaceContainerHighest, child: const Center(child: SizedBox(width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2))), ); } - final postUri = state.loadedPosts[index]; + final postUri = filteredUris[index]; final postView = state.postViews[postUri]; final postSource = state.postSources[postUri]; @@ -100,7 +118,7 @@ class _ProfileGridWidgetState extends ConsumerState { return ProfileGridTile( postView: postView, postSource: postSource, - onTap: () => _onPostTap(postUri), + onTap: () => _onPostTapDynamic(postUri), ); }, ); @@ -127,7 +145,11 @@ class _ProfileGridWidgetState extends ConsumerState { void _onPostTap(AtUri postUri) { final feedState = ref.read(profileFeedProvider(widget.profileUri, widget.videosOnly)); feedState.whenData((state) { - final postIndex = state.loadedPosts.indexOf(postUri); + // Compute index based on the filtered list matching the standalone page behavior + final filteredUris = widget.videosOnly + ? state.loadedPosts.where((u) => state.postTypes[u] ?? true).toList() + : state.loadedPosts.where((u) => state.postTypes[u] == false).toList(); + final postIndex = filteredUris.indexOf(postUri); if (postIndex != -1) { context.router.push( StandaloneProfileFeedRoute( @@ -141,6 +163,15 @@ class _ProfileGridWidgetState extends ConsumerState { } }); } + + void _onPostTapDynamic(AtUri postUri) { + if (widget.both) { + // Open standalone post directly for unified mode + context.router.push(StandalonePostRoute(postUri: postUri.toString())); + return; + } + _onPostTap(postUri); + } } class ProfileGridTile extends StatefulWidget { @@ -182,57 +213,50 @@ class _ProfileGridTileState extends State { Widget build(BuildContext context) { final thumbnailUrl = widget.postView.thumbnailUrl; - final image = thumbnailUrl.isNotEmpty - ? CachedNetworkImage( - imageUrl: thumbnailUrl, - fit: BoxFit.cover, - placeholder: (context, url) => const SizedBox.shrink(), - errorWidget: (context, url, error) => ColoredBox( - color: Theme.of(context).colorScheme.surfaceContainerHighest, - child: const Center(child: Icon(FluentIcons.error_circle_24_regular, size: 20)), - ), - ) - : ColoredBox( - color: Theme.of(context).colorScheme.surfaceContainerHighest, - child: const Center(child: Icon(FluentIcons.image_off_24_regular, size: 20)), - ); + // Use like count as a proxy for views, or 0 if not available + final viewCount = widget.postView.likeCount ?? 0; - return GestureDetector( - onTap: widget.onTap, - child: ColoredBox( - color: AppColors.black, - child: thumbnailUrl.isNotEmpty - ? Stack( - fit: StackFit.expand, - children: [ - if (_shouldBlur) - ImageFiltered( - imageFilter: ImageFilter.blur(sigmaX: 20, sigmaY: 20), - child: image, - ) - else - image, - if (widget.postSource != null) - Positioned( - top: 4, - right: 4, - child: Container( - padding: const EdgeInsets.all(4), - decoration: BoxDecoration(color: Colors.black.withAlpha(150), borderRadius: BorderRadius.circular(4)), - child: SvgPicture.asset( - widget.postSource == 'bsky' ? 'assets/images/bsky.svg' : 'assets/images/sprk.svg', - width: 12, - height: 12, - ), - ), - ), - ], - ) - : ColoredBox( - color: Theme.of(context).colorScheme.surfaceContainerHighest, - child: const Center(child: Icon(FluentIcons.image_off_24_regular, size: 20)), + if (thumbnailUrl.isEmpty) { + return GestureDetector( + onTap: widget.onTap, + child: ColoredBox( + color: Theme.of(context).colorScheme.surfaceContainerHighest, + child: const Center(child: Icon(FluentIcons.image_off_24_regular, size: 20)), + ), + ); + } + + return Stack( + fit: StackFit.expand, + children: [ + PostTile( + thumbnailUrl: thumbnailUrl, + views: viewCount, + seen: false, + nsfwBlur: _shouldBlur, + onTap: widget.onTap, + ), + if (widget.postSource != null) + Positioned( + top: 8, + right: 8, + child: Container( + height: 20, + width: 20, + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: Colors.black.withAlpha(150), + borderRadius: BorderRadius.circular(15), ), - ), + child: SvgPicture.asset( + widget.postSource == 'bsky' ? 'images/bsky.svg' : 'images/sprk.svg', + width: 12, + height: 12, + package: 'assets', + ), + ), + ), + ], ); } } diff --git a/lib/src/features/profile/ui/widgets/profile_header.dart b/lib/src/features/profile/ui/widgets/profile_header.dart deleted file mode 100644 index e5a406d8..00000000 --- a/lib/src/features/profile/ui/widgets/profile_header.dart +++ /dev/null @@ -1,420 +0,0 @@ -import 'package:auto_route/auto_route.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get_it/get_it.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:imgly_editor/model/source.dart'; -import 'package:sparksocial/src/core/auth/data/repositories/identity_repository.dart'; -import 'package:sparksocial/src/core/imgly/imgly_repository.dart'; -import 'package:sparksocial/src/core/network/atproto/data/models/actor_models.dart' as actor_models; -import 'package:sparksocial/src/core/network/atproto/data/repositories/sprk_repository.dart'; -import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/utils/logging/log_service.dart'; -import 'package:sparksocial/src/core/utils/logging/logger.dart'; -import 'package:sparksocial/src/core/utils/text_formatter.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; -import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; -import 'package:sparksocial/src/features/profile/ui/pages/user_list_page.dart'; -import 'package:sparksocial/src/features/profile/ui/widgets/profile_description.dart'; -import 'package:sparksocial/src/features/profile/ui/widgets/profile_links.dart'; -import 'package:sparksocial/src/features/profile/ui/widgets/profile_stat_item.dart'; - -class ProfileHeader extends ConsumerStatefulWidget { - const ProfileHeader({ - required this.profile, - required this.isCurrentUser, - required this.onEarlySupporterTap, - required this.onEditTap, - required this.onShareTap, - required this.onFollowTap, - super.key, - this.isEarlySupporter = false, - }); - final actor_models.ProfileViewDetailed profile; - final bool isCurrentUser; - final bool isEarlySupporter; - final VoidCallback onEarlySupporterTap; - final VoidCallback onEditTap; - final VoidCallback onShareTap; - final VoidCallback onFollowTap; - - @override - ConsumerState createState() => _ProfileHeaderState(); -} - -class _ProfileHeaderState extends ConsumerState { - late final SparkLogger _logger; - late final IdentityRepository _identityRepository; - late final SprkRepository _sprkRepository; - - @override - void initState() { - super.initState(); - _logger = GetIt.instance().getLogger('ProfileHeader'); - _identityRepository = GetIt.instance(); - _sprkRepository = GetIt.instance(); - } - - Future _handleUsernameTap(String username) async { - try { - final cleanUsername = username.startsWith('@') ? username.substring(1) : username; - _logger.d('Username clicked: $cleanUsername'); - - final didRes = await _identityRepository.resolveHandleToDid(cleanUsername); - if (didRes == null) { - _logger.w('Could not resolve handle to DID for $cleanUsername'); - return; - } - if (mounted) { - context.router.push(ProfileRoute(did: didRes)); - } - } catch (e, s) { - _logger.e('Error resolving handle: $e', error: e, stackTrace: s); - } - } - - Future _openStoriesViewer() async { - if (!(widget.profile.stories?.isNotEmpty ?? false)) return; - - try { - final storyUris = widget.profile.stories!.map((strongRef) => strongRef.uri).toList(); - - if (storyUris.isEmpty) return; - final stories = await _sprkRepository.feed.getStoryViews(storyUris); - if (stories.isEmpty) { - _logger.w('No stories found for profile ${widget.profile.did}'); - return; - } - - stories.sort((a, b) => a.indexedAt.compareTo(b.indexedAt)); - - final authorBasic = actor_models.ProfileViewBasic( - did: widget.profile.did, - handle: widget.profile.handle, - displayName: widget.profile.displayName, - avatar: widget.profile.avatar, - viewer: widget.profile.viewer, - stories: widget.profile.stories, - ); - - if (mounted) { - context.router.push( - AllStoriesRoute(storiesByAuthor: {authorBasic: stories}), - ); - } - } catch (e, s) { - _logger.e('Failed to open stories viewer', error: e, stackTrace: s); - } - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final isDarkMode = theme.brightness == Brightness.dark; - - // Determine if the profile has any stories associated with it. - final hasStories = widget.profile.stories?.isNotEmpty ?? false; - - final String displayNameForAvatar; - if (widget.profile.displayName case final String dn when dn.isNotEmpty) { - displayNameForAvatar = dn; - } else { - displayNameForAvatar = widget.profile.handle; - } - - final Widget avatarWidget; - if (widget.profile.avatar case final Uri av when av.toString().isNotEmpty) { - avatarWidget = ClipOval( - child: UserAvatar(imageUrl: av.toString(), username: displayNameForAvatar, size: 90), - ); - } else { - avatarWidget = Icon( - FluentIcons.person_24_regular, - size: 40, - color: isDarkMode ? AppColors.textLight : AppColors.textSecondary, - ); - } - - final String headerDisplayName; - if (widget.profile.displayName case final String dn when dn.isNotEmpty) { - headerDisplayName = dn; - } else { - headerDisplayName = widget.profile.handle; - } - - final handle = widget.profile.handle; - final description = widget.profile.description ?? ''; - - final postsCount = TextFormatter.formatCount(widget.profile.postsCount); - final followersCount = TextFormatter.formatCount(widget.profile.followersCount); - final followsCount = TextFormatter.formatCount(widget.profile.followsCount); - - final links = TextFormatter.extractUrls(description); - final uniqueLinks = links.toSet().toList(); - - return Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Stack( - children: [ - GestureDetector( - onTap: hasStories ? _openStoriesViewer : null, - child: Container( - width: 90, - height: 90, - decoration: hasStories - ? BoxDecoration( - shape: BoxShape.circle, - gradient: LinearGradient( - colors: [theme.colorScheme.primary, theme.colorScheme.secondary], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ) - : BoxDecoration( - color: isDarkMode ? AppColors.darkPurple : AppColors.lightLavender, - shape: BoxShape.circle, - border: Border.all(color: isDarkMode ? AppColors.darkPurple : AppColors.lightLavender, width: 2), - ), - child: hasStories - ? Container( - margin: const EdgeInsets.all(2), - decoration: const BoxDecoration(shape: BoxShape.circle, color: Colors.black), - child: Center(child: avatarWidget), - ) - : Center(child: avatarWidget), - ), - ), - if (widget.isCurrentUser) - Positioned( - right: 0, - bottom: 0, - child: GestureDetector( - onTap: () async { - final colorScheme = Theme.of(context).colorScheme; - final imglyRepository = GetIt.I(); - final handle = ref.read(sessionProvider)?.handle; - showModalBottomSheet( - context: context, - backgroundColor: Colors.transparent, - builder: (BuildContext context) { - return SafeArea( - child: Container( - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: colorScheme.surface, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(20), - topRight: Radius.circular(20), - ), - ), - child: Wrap( - children: [ - ListTile( - leading: Icon(Icons.camera_alt, color: colorScheme.onSurface), - title: Text('Record', style: TextStyle(color: colorScheme.onSurface)), - onTap: () async { - // camera -> open editor -> video review page -> post page - final cameraResult = await imglyRepository.openCamera(userID: handle); - if (cameraResult != null && - cameraResult.recording != null && - cameraResult.recording!.recordings.isNotEmpty) { - if (context.mounted) { - final video = await imglyRepository.openVideoEditor( - source: Source.fromVideo(cameraResult.recording!.recordings.first.videos.first.uri), - ); - if (video != null && context.mounted) { - context.router.push(VideoReviewRoute(editorResult: video, storyMode: true)); - } - } - } - }, - ), - ListTile( - leading: Icon(Icons.videocam, color: colorScheme.onSurface), - title: Text('Upload Video', style: TextStyle(color: colorScheme.onSurface)), - onTap: () async { - // pick video -> open editor -> video review page -> post page - final pickedVideo = await ImagePicker().pickVideo( - source: ImageSource.gallery, - maxDuration: const Duration(seconds: 180), - ); - if (pickedVideo != null && context.mounted) { - final video = await imglyRepository.openVideoEditor( - source: Source.fromVideo('file://${pickedVideo.path}'), - ); - if (video != null && context.mounted) { - context.router.push(VideoReviewRoute(editorResult: video, storyMode: true)); - } - } - }, - ), - ListTile( - leading: Icon(Icons.photo_library, color: colorScheme.onSurface), - title: Text('Upload Images', style: TextStyle(color: colorScheme.onSurface)), - onTap: () async { - // pick images -> images review page (image editor when image is selected) -> post page - final pickedImages = await ImagePicker().pickMultiImage(limit: 12); - if (context.mounted && pickedImages.isNotEmpty) { - context.router.push( - ImageReviewRoute( - imageFiles: pickedImages, - storyMode: true, - ), - ); - } - }, - ), - ], - ), - ), - ); - }, - ); - }, - child: Container( - width: 30, - height: 30, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: AppColors.primary, - border: Border.all(color: isDarkMode ? AppColors.deepPurple : AppColors.white, width: 2), - ), - child: const Center(child: Icon(FluentIcons.add_24_filled, size: 18, color: AppColors.white)), - ), - ), - ), - ], - ), - const SizedBox(width: 20), - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - ProfileStatItem(count: postsCount, label: 'Posts'), - GestureDetector( - onTap: () => context.router.push(UserListRoute(did: widget.profile.did, type: UserListType.followers)), - behavior: HitTestBehavior.opaque, - child: ProfileStatItem(count: followersCount, label: 'Followers'), - ), - GestureDetector( - onTap: () => context.router.push(UserListRoute(did: widget.profile.did, type: UserListType.following)), - behavior: HitTestBehavior.opaque, - child: ProfileStatItem(count: followsCount, label: 'Following'), - ), - ], - ), - ), - ], - ), - const SizedBox(height: 16), - Row( - children: [ - Text( - headerDisplayName, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - color: theme.textTheme.titleLarge?.color ?? theme.colorScheme.onSurface, - ), - ), - if (widget.isEarlySupporter) ...[ - const SizedBox(width: 8), - GestureDetector( - onTap: widget.onEarlySupporterTap, - child: SvgPicture.asset( - 'assets/images/match.svg', - height: 20, - width: 20, - colorFilter: const ColorFilter.mode(AppColors.primary, BlendMode.srcIn), - ), - ), - ], - ], - ), - const SizedBox(height: 4), - Text( - '@$handle', - style: TextStyle( - color: theme.textTheme.bodyMedium?.color?.withAlpha(128) ?? theme.colorScheme.onSurfaceVariant, - fontSize: 14, - ), - ), - if (description.isNotEmpty || uniqueLinks.isNotEmpty) ...[ - const SizedBox(height: 8), - if (description.isNotEmpty) - ProfileDescription( - text: description, - style: TextStyle(color: theme.textTheme.bodyMedium?.color ?? theme.colorScheme.onSurface, fontSize: 14), - onMentionTap: _handleUsernameTap, - ), - if (uniqueLinks.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: 4), - child: ProfileLinks(links: uniqueLinks), - ), - ], - const SizedBox(height: 16), - Row( - children: [ - if (widget.isCurrentUser) ...[ - Expanded( - child: Container( - constraints: const BoxConstraints(minHeight: 36), - child: ElevatedButton( - onPressed: widget.onEditTap, - style: ElevatedButton.styleFrom( - backgroundColor: AppColors.primary, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: const Text( - 'Edit Profile', - style: TextStyle(fontWeight: FontWeight.w600, color: AppColors.white), - ), - ), - ), - ), - const SizedBox(width: 8), - ] else ...[ - Expanded( - child: Container( - constraints: const BoxConstraints(minHeight: 36), - child: ElevatedButton( - onPressed: widget.onFollowTap, - style: ElevatedButton.styleFrom( - backgroundColor: widget.profile.viewer?.following != null - ? theme.colorScheme.surfaceContainerHighest - : AppColors.primary, - foregroundColor: widget.profile.viewer?.following != null - ? theme.colorScheme.onSurfaceVariant - : AppColors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: widget.profile.viewer?.following != null - ? BorderSide(color: theme.colorScheme.outline) - : BorderSide.none, - ), - ), - child: Text( - widget.profile.viewer?.following != null ? 'Following' : 'Follow', - style: const TextStyle(fontWeight: FontWeight.w600), - ), - ), - ), - ), - const SizedBox(width: 8), - ], - ], - ), - ], - ), - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_links.dart b/lib/src/features/profile/ui/widgets/profile_links.dart deleted file mode 100644 index bf7d5d73..00000000 --- a/lib/src/features/profile/ui/widgets/profile_links.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:get_it/get_it.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/utils/logging/log_service.dart'; - -// Placeholder for ProfileLinks widget -class ProfileLinks extends StatelessWidget { - const ProfileLinks({required this.links, super.key}); - final List links; - - @override - Widget build(BuildContext context) { - final logger = GetIt.instance().getLogger('ProfileLinks'); - - logger.d('Building ProfileLinks with ${links.length} links: $links'); - - if (links.isEmpty) { - return const SizedBox.shrink(); - } - - return Container( - margin: const EdgeInsets.only(top: 6), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: links.map((url) => _ProfileLinkItem(url: url)).toList(), - ), - ); - } -} - -class _ProfileLinkItem extends StatelessWidget { - const _ProfileLinkItem({required this.url}); - final String url; - - @override - Widget build(BuildContext context) { - // Use theme colors if possible, or keep AppColors.blue if it's a specific brand blue - const linkColor = AppColors.blue; // Or: Theme.of(context).colorScheme.primary; - - return Padding( - padding: const EdgeInsets.only(top: 4, bottom: 2), - child: Row( - children: [ - const Icon(FluentIcons.link_24_regular, size: 16, color: linkColor), - const SizedBox(width: 6), - Expanded( - child: Text( - url, - style: const TextStyle(color: linkColor, fontWeight: FontWeight.bold, fontSize: 14), - overflow: TextOverflow.ellipsis, - ), - ), - ], - ), - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_save_button.dart b/lib/src/features/profile/ui/widgets/profile_save_button.dart deleted file mode 100644 index 4aee1fc0..00000000 --- a/lib/src/features/profile/ui/widgets/profile_save_button.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:auto_route/auto_route.dart'; -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; -import 'package:sparksocial/src/core/utils/logging/logger.dart'; -import 'package:sparksocial/src/features/profile/providers/edit_profile_provider.dart'; -import 'package:sparksocial/src/features/profile/providers/edit_profile_state.dart'; - -/// Button widget for saving profile changes -class ProfileSaveButton extends StatelessWidget { - /// Creates a profile save button - const ProfileSaveButton({required this.state, required this.notifier, required this.formKey, required this.logger, super.key}); - - /// Current state of the profile being edited - final EditProfileState state; - - /// The notifier to trigger actions on the profile - final EditProfile notifier; - - /// Form key to validate the form before saving - final GlobalKey formKey; - - /// Logger for error reporting - final SparkLogger logger; - - @override - Widget build(BuildContext context) { - return SizedBox( - width: double.infinity, - child: ElevatedButton( - onPressed: state.isSaving - ? null - : () async { - if (!formKey.currentState!.validate()) return; - - try { - final result = await notifier.saveProfile(); - if (result && context.mounted) { - context.router.maybePop(true); - } else if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Failed to update profile'))); - } - } catch (e) { - logger.e('Error saving profile', error: e); - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error updating profile: $e'))); - } - } - }, - style: ElevatedButton.styleFrom( - backgroundColor: AppColors.primary, - foregroundColor: Colors.white, - padding: const EdgeInsets.symmetric(vertical: 12), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: state.isSaving - ? const SizedBox( - width: 24, - height: 24, - child: CircularProgressIndicator(valueColor: AlwaysStoppedAnimation(Colors.white), strokeWidth: 2), - ) - : const Text('Save', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600)), - ), - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_stat_item.dart b/lib/src/features/profile/ui/widgets/profile_stat_item.dart deleted file mode 100644 index 00007c15..00000000 --- a/lib/src/features/profile/ui/widgets/profile_stat_item.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter/material.dart'; - -// Placeholder for ProfileStatItem widget -class ProfileStatItem extends StatelessWidget { - const ProfileStatItem({required this.count, required this.label, super.key}); - final String count; - final String label; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - count, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 20, - color: theme.textTheme.titleLarge?.color ?? theme.colorScheme.onSurface, - ), - ), - const SizedBox(height: 4), - Text( - label, - style: TextStyle(color: theme.textTheme.bodyMedium?.color ?? theme.colorScheme.onSurfaceVariant, fontSize: 14), - ), - ], - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_tabs.dart b/lib/src/features/profile/ui/widgets/profile_tabs.dart deleted file mode 100644 index 4ccce29b..00000000 --- a/lib/src/features/profile/ui/widgets/profile_tabs.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; - -class ProfileTabs extends StatelessWidget { - // This might be handled by a provider later if tabs change based on auth state - - const ProfileTabs({required this.selectedIndex, required this.onTabSelected, required this.isAuthenticated, super.key}); - final int selectedIndex; - final Function(int) onTabSelected; - final bool isAuthenticated; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Container( - decoration: BoxDecoration( - color: theme.colorScheme.surface, // Updated color - border: Border( - top: BorderSide(color: theme.dividerColor, width: 0.5), // Updated color - bottom: BorderSide(color: theme.dividerColor, width: 0.5), // Updated color - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _ProfileTabItemWidget( - icon: FluentIcons.video_24_regular, - filledIcon: FluentIcons.video_24_filled, - isSelected: selectedIndex == 0, - onTap: () => onTabSelected(0), - ), - _ProfileTabItemWidget( - icon: FluentIcons.image_24_regular, - filledIcon: FluentIcons.image_24_filled, - isSelected: selectedIndex == 1, - onTap: () => onTabSelected(1), - ), - // Example for conditional tab based on isAuthenticated, if needed: - // if (isAuthenticated) - // _ProfileTabItemWidget( - // icon: FluentIcons.bookmark_24_regular, - // filledIcon: FluentIcons.bookmark_24_filled, - // isSelected: selectedIndex == 4, // Adjust index accordingly - // onTap: () => onTabSelected(4), - // ), - ], - ), - ); - } -} - -class _ProfileTabItemWidget extends StatelessWidget { - const _ProfileTabItemWidget({required this.icon, required this.filledIcon, required this.isSelected, required this.onTap}); - final IconData icon; - final IconData filledIcon; - final bool isSelected; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final iconColor = isSelected ? theme.colorScheme.primary : theme.colorScheme.onSurfaceVariant; - - return Expanded( - // Ensures tabs take equal space - child: TextButton( - style: TextButton.styleFrom( - padding: EdgeInsets.zero, - minimumSize: Size.zero, - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - shape: const RoundedRectangleBorder(), // Makes it rectangular for the border - ), - onPressed: onTap, - child: Container( - padding: const EdgeInsets.symmetric(vertical: 12), // Removed horizontal padding to let Expanded handle width - decoration: BoxDecoration( - border: Border(bottom: BorderSide(color: isSelected ? theme.colorScheme.primary : Colors.transparent, width: 2)), - ), - child: Icon(isSelected ? filledIcon : icon, color: iconColor, size: 26), - ), - ), - ); - } -} - -class StickyTabBarDelegate extends SliverPersistentHeaderDelegate { - StickyTabBarDelegate({required this.child, this.height = 50.0}); - final Widget child; - final double height; - - @override - Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) { - return Material( - elevation: shrinkOffset > 0 ? 1.0 : 0.0, // Add elevation when scrolled - child: child, - ); - } - - @override - double get maxExtent => height; - - @override - double get minExtent => height; - - @override - bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) { - if (oldDelegate case final StickyTabBarDelegate delegate) { - return delegate.height != height || delegate.child != child; - } - return true; - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_text_field.dart b/lib/src/features/profile/ui/widgets/profile_text_field.dart deleted file mode 100644 index c7877849..00000000 --- a/lib/src/features/profile/ui/widgets/profile_text_field.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -/// A customized text field widget for profile editing -class ProfileTextField extends StatefulWidget { - /// Creates a profile text field - const ProfileTextField({ - required this.initialValue, - required this.hintText, - required this.onChanged, - required this.bgColor, - super.key, - this.maxLines = 1, - }); - - /// Initial value of the text field - final String initialValue; - - /// Hint text to display when the field is empty - final String hintText; - - /// Function to call when the text changes - final Function(String) onChanged; - - /// Background color for the field - final Color bgColor; - - /// Number of lines for the text field - final int maxLines; - - @override - State createState() => _ProfileTextFieldState(); -} - -class _ProfileTextFieldState extends State { - late TextEditingController _textController; - - @override - void initState() { - super.initState(); - _textController = TextEditingController(text: widget.initialValue); - } - - @override - void dispose() { - _textController.dispose(); - super.dispose(); - } - - @override - void didUpdateWidget(covariant ProfileTextField oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.initialValue != widget.initialValue && widget.initialValue != _textController.text) { - _textController.text = widget.initialValue; - } - } - - @override - Widget build(BuildContext context) { - return TextFormField( - controller: _textController, - onChanged: widget.onChanged, - maxLines: widget.maxLines, - decoration: InputDecoration( - hintText: widget.hintText, - filled: true, - fillColor: widget.bgColor, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: const BorderSide(color: AppColors.border), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: const BorderSide(color: AppColors.border), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: const BorderSide(color: AppColors.primary), - ), - ), - ); - } -} diff --git a/lib/src/features/profile/ui/widgets/profile_video_tile.dart b/lib/src/features/profile/ui/widgets/profile_video_tile.dart deleted file mode 100644 index 41734564..00000000 --- a/lib/src/features/profile/ui/widgets/profile_video_tile.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class ProfileVideoTile extends StatelessWidget { - const ProfileVideoTile({ - required this.videoUrl, - required this.username, - required this.description, - required this.hashtags, - required this.index, - required this.onTap, - super.key, - this.thumbnailUrl, - this.likeCount = 0, - this.isSprk = false, - this.isImage = false, - }); - final String? videoUrl; - final String? thumbnailUrl; - final String username; - final String description; - final List hashtags; - final int index; - final int likeCount; - final VoidCallback onTap; - final bool isSprk; - final bool isImage; - - @override - Widget build(BuildContext context) { - Widget thumbnailWidget; - if (thumbnailUrl case final String url when url.isNotEmpty) { - thumbnailWidget = CachedNetworkImage( - imageUrl: url, - fit: BoxFit.cover, - fadeInDuration: const Duration(milliseconds: 200), - placeholder: (context, url) => const ColoredBox( - color: Colors.black, - child: Center(child: CircularProgressIndicator(strokeWidth: 2, color: Colors.white)), - ), - errorWidget: (context, url, error) => const ColoredBox( - color: Colors.black, - child: Center(child: Icon(FluentIcons.video_24_regular, color: Colors.white, size: 24)), - ), - ); - } else { - thumbnailWidget = Center(child: Icon(FluentIcons.video_24_regular, color: AppColors.white.withAlpha(204), size: 24)); - } - - return GestureDetector( - onTap: onTap, - child: ColoredBox( - color: AppColors.richPurple.withAlpha(120), - child: Stack( - fit: StackFit.expand, - children: [ - thumbnailWidget, - Positioned( - bottom: 5, - left: 5, - child: Row( - children: [ - const Icon(FluentIcons.eye_24_regular, color: AppColors.white, size: 12), - const SizedBox(width: 4), - Text('$likeCount', style: const TextStyle(color: AppColors.white, fontSize: 12)), - ], - ), - ), - Positioned( - top: 5, - right: 5, - child: Container( - padding: const EdgeInsets.all(2), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(42), - boxShadow: [ - BoxShadow(color: AppColors.black.withAlpha(30), blurRadius: 4, spreadRadius: 1), - ], - ), - child: Icon( - isImage ? FluentIcons.image_24_regular : FluentIcons.play_circle_24_filled, - color: AppColors.white, - size: 16, - ), - ), - ), - Positioned( - top: 5, - left: 5, - child: Container( - padding: const EdgeInsets.all(2), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(42), - boxShadow: [ - BoxShadow(color: AppColors.black.withAlpha(30), blurRadius: 4, spreadRadius: 1), - ], - ), - child: isSprk - ? SvgPicture.asset('assets/images/sprk.svg', width: 14, height: 14) - : SvgPicture.asset('assets/images/bsky.svg', width: 14, height: 14), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/src/features/search/ui/pages/search_page.dart b/lib/src/features/search/ui/pages/search_page.dart index 7b084d7a..bb399861 100644 --- a/lib/src/features/search/ui/pages/search_page.dart +++ b/lib/src/features/search/ui/pages/search_page.dart @@ -2,6 +2,8 @@ import 'package:auto_route/auto_route.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/glass_input.dart'; +import 'package:sparksocial/src/core/design_system/templates/explore_page_template.dart'; import 'package:sparksocial/src/features/search/providers/post_search_provider.dart'; import 'package:sparksocial/src/features/search/providers/search_provider.dart'; import 'package:sparksocial/src/features/search/ui/pages/post_results.dart'; @@ -21,14 +23,21 @@ class SearchPage extends ConsumerStatefulWidget { class _SearchPageState extends ConsumerState { final TextEditingController _searchController = TextEditingController(); + @override + void initState() { + super.initState(); + _searchController.addListener(_onSearchChanged); + } + @override void dispose() { + _searchController.removeListener(_onSearchChanged); _searchController.dispose(); super.dispose(); } - void _onSearchChanged(String query) { - final trimmedQuery = query.trim(); + void _onSearchChanged() { + final trimmedQuery = _searchController.text.trim(); ref.read(searchProvider.notifier).updateQuery(trimmedQuery); ref.read(postSearchProvider.notifier).updateQuery(trimmedQuery); } @@ -36,88 +45,61 @@ class _SearchPageState extends ConsumerState { @override Widget build(BuildContext context) { final searchState = ref.watch(searchProvider); - final theme = Theme.of(context); - final colorScheme = theme.colorScheme; return DefaultTabController( length: 2, - child: Scaffold( - backgroundColor: colorScheme.surface, - body: SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(16), - child: TextField( - controller: _searchController, - onChanged: _onSearchChanged, - decoration: InputDecoration( - hintText: 'Search users, posts...', - prefixIcon: Icon(FluentIcons.search_24_regular, color: theme.textTheme.bodyMedium?.color), - filled: true, - suffixIcon: _searchController.text.isNotEmpty - ? IconButton( - iconSize: 20, - splashRadius: 20, - onPressed: () { - _searchController.clear(); - ref.read(searchProvider.notifier).updateQuery(''); - ref.read(postSearchProvider.notifier).updateQuery(''); - }, - icon: const Icon(FluentIcons.dismiss_24_regular), - ) - : null, - fillColor: colorScheme.surfaceContainerLow.withAlpha(50), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.outline), - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.outline), - ), - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - ), - ), - ), - // ==== Stories or Search Results ==== - if (searchState.query.isEmpty) - Expanded( - child: RefreshIndicator( - onRefresh: () async { - // Refresh the stories timeline - ref.invalidate(storiesByAuthorProvider()); + child: ExplorePageTemplate( + searchWidget: GlassInput.search( + controller: _searchController, + hintText: 'Search users, posts...', + leadingWidgets: const [ + Icon( + FluentIcons.search_24_regular, + size: 20, + ), + ], + actionWidgets: _searchController.text.isNotEmpty + ? [ + GestureDetector( + onTap: () { + _searchController.clear(); + ref.read(searchProvider.notifier).updateQuery(''); + ref.read(postSearchProvider.notifier).updateQuery(''); }, - child: const CustomScrollView( - slivers: [ - SliverToBoxAdapter(child: StoriesList()), - SliverFillRemaining( - hasScrollBody: false, - child: Center( - child: Text('Discover new content'), - ), - ), - ], + child: const Icon( + FluentIcons.dismiss_24_regular, + size: 20, ), ), - ) - else ...[ - const TabBar( - tabs: [ - Tab(text: 'Posts'), - Tab(text: 'Users'), - ], - ), - const Expanded( - child: TabBarView( - children: [ - PostResults(), - UserResults(), - ], - ), + ] + : null, + ), + showTabs: searchState.query.isNotEmpty, + tabsWidget: const TabBar( + tabs: [ + Tab(text: 'Posts'), + Tab(text: 'Users'), + ], + ), + contentWidget: const TabBarView( + children: [ + PostResults(), + UserResults(), + ], + ), + emptyStateWidget: RefreshIndicator( + onRefresh: () async { + ref.invalidate(storiesByAuthorProvider()); + }, + child: const CustomScrollView( + slivers: [ + SliverToBoxAdapter(child: StoriesList()), + SliverFillRemaining( + hasScrollBody: false, + child: Center( + child: Text('Discover new content'), ), - ], + ), ], ), ), diff --git a/lib/src/features/search/ui/widgets/category_chip.dart b/lib/src/features/search/ui/widgets/category_chip.dart deleted file mode 100644 index 3d04e31a..00000000 --- a/lib/src/features/search/ui/widgets/category_chip.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; - -class CategoryChip extends StatelessWidget { - const CategoryChip({required this.label, super.key, this.onTap, this.isSelected = false}); - final String label; - final VoidCallback? onTap; - final bool isSelected; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final colorScheme = theme.colorScheme; - - return GestureDetector( - onTap: onTap, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - decoration: BoxDecoration( - color: isSelected ? colorScheme.primary : colorScheme.surfaceContainerLow.withAlpha(179), - borderRadius: BorderRadius.circular(20), - ), - child: Text( - label, - style: TextStyle( - color: isSelected ? colorScheme.onPrimary : colorScheme.onSurface, - fontWeight: FontWeight.w500, - fontSize: 14, - ), - ), - ), - ); - } -} diff --git a/lib/src/features/search/ui/widgets/post_card.dart b/lib/src/features/search/ui/widgets/post_card.dart index da634f39..e620c602 100644 --- a/lib/src/features/search/ui/widgets/post_card.dart +++ b/lib/src/features/search/ui/widgets/post_card.dart @@ -3,8 +3,8 @@ import 'dart:ui'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:sparksocial/src/core/network/atproto/data/models/feed_models.dart'; +import 'package:sparksocial/src/core/ui/widgets/user_avatar.dart'; import 'package:sparksocial/src/core/utils/label_utils.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; class PostCard extends StatefulWidget { const PostCard({required this.post, super.key, this.onTap}); @@ -102,9 +102,7 @@ class _PostCardState extends State { if (widget.post.record.text?.isNotEmpty ?? false) Text( widget.post.record.text!, - style: theme.textTheme.bodySmall?.copyWith( - color: colorScheme.onSurfaceVariant, - ), + // style: theme.textTheme.bodySmall, maxLines: 2, overflow: TextOverflow.ellipsis, diff --git a/lib/src/features/search/ui/widgets/section_header.dart b/lib/src/features/search/ui/widgets/section_header.dart deleted file mode 100644 index 6814ac04..00000000 --- a/lib/src/features/search/ui/widgets/section_header.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -class SectionHeader extends StatelessWidget { - const SectionHeader({required this.title, super.key, this.onViewAllTap, this.icon}); - final String title; - final VoidCallback? onViewAllTap; - final IconData? icon; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final textColor = theme.textTheme.bodyLarge?.color; - - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - if (icon != null) ...[Icon(icon, color: textColor, size: 22), const SizedBox(width: 8)], - Text( - title, - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 22, color: textColor), - ), - ], - ), - - if (onViewAllTap != null) - GestureDetector( - onTap: onViewAllTap, - child: Text( - 'view all', - style: TextStyle(color: theme.textTheme.bodyMedium?.color, fontWeight: FontWeight.w500, fontSize: 14), - ), - ), - ], - ), - ); - } -} diff --git a/lib/src/features/search/ui/widgets/sound_card.dart b/lib/src/features/search/ui/widgets/sound_card.dart deleted file mode 100644 index 5f412df4..00000000 --- a/lib/src/features/search/ui/widgets/sound_card.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; - -class SoundCard extends StatelessWidget { - const SoundCard({required this.title, required this.artist, required this.imageUrl, super.key, this.onTap}); - final String title; - final String artist; - final String imageUrl; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final colorScheme = theme.colorScheme; - final textColor = theme.textTheme.bodyLarge?.color; - final secondaryTextColor = theme.textTheme.bodyMedium?.color; - - return GestureDetector( - onTap: onTap, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), - decoration: BoxDecoration(color: colorScheme.surfaceContainerLow.withAlpha(125), borderRadius: BorderRadius.circular(12)), - child: Row( - children: [ - Container( - width: 60, - height: 60, - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage(image: NetworkImage(imageUrl), fit: BoxFit.cover), - ), - ), - const SizedBox(width: 12), - - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - title, - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: textColor), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Text( - artist, - style: TextStyle(fontSize: 14, color: secondaryTextColor), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ), - ), - - Container( - width: 36, - height: 36, - decoration: BoxDecoration(color: colorScheme.primary, shape: BoxShape.circle), - child: const Icon(FluentIcons.play_24_regular, color: Colors.white, size: 20), - ), - ], - ), - ), - ); - } -} diff --git a/lib/src/features/search/ui/widgets/story_circle.dart b/lib/src/features/search/ui/widgets/story_circle.dart deleted file mode 100644 index 4def64fa..00000000 --- a/lib/src/features/search/ui/widgets/story_circle.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -class StoryCircle extends StatelessWidget { - const StoryCircle({ - required this.username, - required this.imageUrl, - super.key, - this.isLive = false, - this.isYourStory = false, - this.onTap, - }); - final String username; - final String imageUrl; - final bool isLive; - final bool isYourStory; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - - return GestureDetector( - onTap: onTap, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Stack( - children: [ - Container( - width: 70, - height: 70, - margin: const EdgeInsets.all(4), - decoration: BoxDecoration( - shape: BoxShape.circle, - gradient: isYourStory - ? null - : LinearGradient( - colors: [colorScheme.primary, AppColors.pink], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ), - padding: const EdgeInsets.all(2.5), - child: Container( - decoration: BoxDecoration( - color: Colors.black, - shape: BoxShape.circle, - image: DecorationImage(image: NetworkImage(imageUrl), fit: BoxFit.cover), - ), - ), - ), - - if (isYourStory) - Positioned( - bottom: 0, - right: 0, - child: Container( - width: 24, - height: 24, - decoration: BoxDecoration( - color: colorScheme.primary, - shape: BoxShape.circle, - border: Border.all(width: 1.5), - ), - child: const Icon(FluentIcons.add_24_regular, size: 16, color: Colors.white), - ), - ), - ], - ), - const SizedBox(height: 4), - Text( - username, - style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ), - ); - } -} diff --git a/lib/src/features/search/ui/widgets/suggested_account_card.dart b/lib/src/features/search/ui/widgets/suggested_account_card.dart index 3b3e5788..e2a3f8b0 100644 --- a/lib/src/features/search/ui/widgets/suggested_account_card.dart +++ b/lib/src/features/search/ui/widgets/suggested_account_card.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; - -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/suggested_profile.dart'; class SuggestedAccountCard extends StatelessWidget { const SuggestedAccountCard({ @@ -27,88 +26,17 @@ class SuggestedAccountCard extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = Theme.of(context); - final colorScheme = theme.colorScheme; - final textColor = theme.textTheme.bodyLarge?.color; - final secondaryTextColor = theme.textTheme.bodyMedium?.color; - return GestureDetector( onTap: onTap, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration(color: colorScheme.surfaceContainerLow.withAlpha(102), borderRadius: BorderRadius.circular(12)), - child: Row( - children: [ - Container( - width: 48, - height: 48, - decoration: const BoxDecoration(shape: BoxShape.circle), - clipBehavior: Clip.antiAlias, - child: UserAvatar(imageUrl: avatarUrl, username: username, size: 48), - ), - const SizedBox(width: 12), - - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - username, - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: textColor), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Text( - handle, - style: TextStyle(fontSize: 14, color: secondaryTextColor), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - if (description != null && description!.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: 2), - child: Text( - description!, - style: TextStyle(fontSize: 13, color: secondaryTextColor), - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), - ), - ], - ), - ), - - if (showFollowButton) - isFollowing - ? GestureDetector( - onTap: onUnfollowTap, - child: AnimatedContainer( - duration: const Duration(milliseconds: 200), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - decoration: BoxDecoration( - color: Colors.transparent, - border: Border.all(color: colorScheme.primary, width: 2), - borderRadius: BorderRadius.circular(24), - ), - child: Text( - 'Following', - style: TextStyle(color: colorScheme.primary, fontWeight: FontWeight.w600, fontSize: 14), - ), - ), - ) - : GestureDetector( - onTap: onFollowTap, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - decoration: BoxDecoration(color: colorScheme.primary, borderRadius: BorderRadius.circular(24)), - child: Text( - 'Follow', - style: TextStyle(color: colorScheme.onPrimary, fontWeight: FontWeight.w600, fontSize: 14), - ), - ), - ), - ], - ), + child: SuggestedProfile.withDescription( + imageUrl: avatarUrl, + userName: username, + userHandle: handle, + isFollowing: isFollowing, + onFollow: onFollowTap ?? () {}, + onUnfollow: onUnfollowTap ?? () {}, + showFollowButton: showFollowButton, + description: description ?? '', ), ); } diff --git a/lib/src/features/search/ui/widgets/trending_video_card.dart b/lib/src/features/search/ui/widgets/trending_video_card.dart deleted file mode 100644 index 05a7ba77..00000000 --- a/lib/src/features/search/ui/widgets/trending_video_card.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; - -import 'package:sparksocial/src/core/utils/text_formatter.dart'; - -class TrendingVideoCard extends StatelessWidget { - const TrendingVideoCard({required this.thumbnailUrl, required this.viewCount, super.key, this.onTap}); - final String thumbnailUrl; - final int viewCount; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - final formattedViews = TextFormatter.formatCount(viewCount); - - return GestureDetector( - onTap: onTap, - child: Container( - decoration: BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: NetworkImage(thumbnailUrl), - fit: BoxFit.cover, - colorFilter: ColorFilter.mode(AppColors.black.withAlpha(51), BlendMode.darken), - ), - ), - child: Stack( - children: [ - Positioned( - bottom: 8, - left: 8, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration(color: AppColors.black.withAlpha(153), borderRadius: BorderRadius.circular(4)), - child: Text( - formattedViews, - style: const TextStyle(color: AppColors.white, fontSize: 14, fontWeight: FontWeight.bold), - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/src/features/settings/ui/pages/feed_settings_page.dart b/lib/src/features/settings/ui/pages/feed_settings_page.dart index 3e6ddceb..18efb451 100644 --- a/lib/src/features/settings/ui/pages/feed_settings_page.dart +++ b/lib/src/features/settings/ui/pages/feed_settings_page.dart @@ -1,6 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/app_leading_button.dart'; import 'package:sparksocial/src/features/settings/ui/pages/feed_list_page.dart'; import 'package:sparksocial/src/features/settings/ui/pages/label_settings_page.dart'; @@ -29,21 +30,13 @@ class _FeedSettingsPageState extends ConsumerState with Single @override Widget build(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final backgroundColor = colorScheme.surface; - final textColor = colorScheme.onSurface; - return Scaffold( appBar: AppBar( title: const Text('Feed Settings'), centerTitle: true, - leading: const AutoLeadingButton(), - backgroundColor: backgroundColor, - foregroundColor: textColor, + leading: const AppLeadingButton(), bottom: TabBar( controller: _tabController, - labelColor: textColor, - unselectedLabelColor: textColor.withAlpha(127), tabs: const [ Tab(text: 'Your Feeds'), Tab(text: 'Content Labels'), diff --git a/lib/src/features/settings/ui/pages/profile_settings_page.dart b/lib/src/features/settings/ui/pages/profile_settings_page.dart index 485a9666..bc76cc79 100644 --- a/lib/src/features/settings/ui/pages/profile_settings_page.dart +++ b/lib/src/features/settings/ui/pages/profile_settings_page.dart @@ -2,6 +2,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/app_leading_button.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; import 'package:sparksocial/src/features/profile/providers/profile_provider.dart'; @@ -57,10 +58,9 @@ class _ProfileSettingsPageState extends ConsumerState { appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.surface, elevation: 0, - leading: const AutoLeadingButton(), - title: Text( + leading: const AppLeadingButton(), + title: const Text( 'Profile Settings', - style: TextStyle(color: Theme.of(context).colorScheme.onSurface, fontSize: 18, fontWeight: FontWeight.bold), ), centerTitle: true, ), diff --git a/lib/src/features/splash/ui/pages/splash_page.dart b/lib/src/features/splash/ui/pages/splash_page.dart index b7b05e33..49813d5b 100644 --- a/lib/src/features/splash/ui/pages/splash_page.dart +++ b/lib/src/features/splash/ui/pages/splash_page.dart @@ -8,7 +8,7 @@ import 'package:sparksocial/src/core/auth/data/repositories/auth_repository.dart import 'package:sparksocial/src/core/auth/data/repositories/auth_repository_impl.dart'; import 'package:sparksocial/src/core/auth/data/repositories/onboarding_repository.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/colors.dart'; +import 'package:sparksocial/src/core/ui/foundation/colors.dart'; import 'package:sparksocial/src/core/utils/logging/log_service.dart'; import 'package:sparksocial/src/core/utils/logging/logger.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; @@ -195,8 +195,9 @@ class _SplashPageState extends ConsumerState { fit: StackFit.expand, children: [ Image.asset( - 'assets/branding/intro.webp', + 'branding/intro.webp', fit: BoxFit.cover, + package: 'assets', ), ], ), diff --git a/lib/src/features/stories/ui/widgets/stories_list.dart b/lib/src/features/stories/ui/widgets/stories_list.dart index 1b80e403..3ab4ddf7 100644 --- a/lib/src/features/stories/ui/widgets/stories_list.dart +++ b/lib/src/features/stories/ui/widgets/stories_list.dart @@ -1,14 +1,12 @@ import 'package:auto_route/auto_route.dart'; -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:image_picker/image_picker.dart'; import 'package:imgly_editor/model/source.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/story_circle.dart'; import 'package:sparksocial/src/core/imgly/imgly_repository.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/widgets/user_avatar.dart'; import 'package:sparksocial/src/features/auth/providers/auth_providers.dart'; import 'package:sparksocial/src/features/profile/providers/profile_provider.dart'; import 'package:sparksocial/src/features/stories/providers/stories_by_author.dart'; @@ -31,16 +29,16 @@ class _StoriesListState extends ConsumerState { context: context, backgroundColor: Colors.transparent, builder: (BuildContext context) { - return SafeArea( - child: Container( - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: colorScheme.surface, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(20), - topRight: Radius.circular(20), - ), + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: colorScheme.surface, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), ), + ), + child: SafeArea( child: Wrap( children: [ ListTile( @@ -128,7 +126,7 @@ class _StoriesListState extends ConsumerState { ), ), SizedBox( - height: 100, + height: 102, child: storiesByAuthor.when( loading: () => const Center(child: CircularProgressIndicator()), error: (error, stackTrace) => Center( @@ -142,132 +140,42 @@ class _StoriesListState extends ConsumerState { itemCount: authorsList.length + 1, // +1 for add story button itemBuilder: (context, index) { if (index == 0) { - return Container( - margin: const EdgeInsets.only(right: 12), - child: Column( - children: [ - GestureDetector( - onTap: () => _showCreateMenu(context), - child: Stack( - children: [ - Container( - width: 64, - height: 64, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.grey[800], - border: Border.all( - color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.3), - width: 2, - ), - ), - child: UserAvatar( - imageUrl: ref - .read(profileNotifierProvider(did: ref.read(sessionProvider)!.did)) - .when( - data: (profileData) => profileData.profile!.avatar.toString(), - error: (error, stackTrace) => null, - loading: () => null, - ), - ), - ), - Positioned( - bottom: 0, - right: 0, - child: Container( - width: 20, - height: 20, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Theme.of(context).colorScheme.primary, - border: Border.all(width: 2), - ), - child: const Icon(FluentIcons.add_12_regular, color: Colors.white, size: 12), - ), - ), - ], - ), - ), - const SizedBox(height: 4), - SizedBox( - width: 64, - child: Text( - 'Your story', - style: TextStyle(color: Theme.of(context).colorScheme.onSurface, fontSize: 12), - textAlign: TextAlign.center, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], + final userAvatarUrl = ref + .read(profileNotifierProvider(did: ref.read(sessionProvider)!.did)) + .when( + data: (profileData) => profileData.profile!.avatar.toString(), + error: (error, stackTrace) => '', + loading: () => '', + ); + return GestureDetector( + onTap: () => _showCreateMenu(context), + child: Padding( + padding: const EdgeInsets.only(right: 12), + child: StoryCircle.create( + userName: 'Your story', + imageUrl: userAvatarUrl, + ), ), ); } final realIndex = index - 1; final authorEntry = authorsList[realIndex]; final author = authorEntry.key; - return Container( - margin: const EdgeInsets.only(right: 12), - child: Column( - children: [ - GestureDetector( - onTap: () => { - context.router.push( - AllStoriesRoute( - storiesByAuthor: data.storiesByAuthor, - initialAuthorIndex: realIndex, - ), - ), - }, - child: Stack( - children: [ - Container( - width: 64, - height: 64, - decoration: BoxDecoration( - shape: BoxShape.circle, - gradient: LinearGradient( - colors: [Theme.of(context).colorScheme.primary, Theme.of(context).colorScheme.secondary], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ), - child: Container( - margin: const EdgeInsets.all(2), - decoration: const BoxDecoration(shape: BoxShape.circle, color: Colors.black), - child: ClipOval( - child: CachedNetworkImage( - imageUrl: author.avatar.toString(), - width: 64, - height: 64, - fit: BoxFit.cover, - errorWidget: (context, url, error) { - return Container( - width: 64, - height: 64, - color: Colors.grey[800], - child: const Icon(FluentIcons.person_24_regular, color: Colors.white, size: 32), - ); - }, - ), - ), - ), - ), - ], - ), - ), - const SizedBox(height: 4), - SizedBox( - width: 64, - child: Text( - author.displayName ?? author.handle, - style: TextStyle(color: Theme.of(context).colorScheme.onSurface, fontSize: 12), - textAlign: TextAlign.center, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), + return GestureDetector( + onTap: () => { + context.router.push( + AllStoriesRoute( + storiesByAuthor: data.storiesByAuthor, + initialAuthorIndex: realIndex, ), - ], + ), + }, + child: Padding( + padding: const EdgeInsets.only(right: 12), + child: StoryCircle.story( + userName: author.displayName ?? author.handle, + imageUrl: author.avatar.toString(), + ), ), ); }, diff --git a/lib/src/sprk_app.dart b/lib/src/sprk_app.dart index 54693fa5..5c8c2674 100644 --- a/lib/src/sprk_app.dart +++ b/lib/src/sprk_app.dart @@ -1,9 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:sparksocial/src/core/design_system/theme/app_theme.dart'; +import 'package:sparksocial/src/core/l10n/app_localizations.dart'; import 'package:sparksocial/src/core/routing/app_router.dart'; -import 'package:sparksocial/src/core/theme/data/models/app_theme.dart'; -import 'package:sparksocial/src/core/theme/domain/theme_provider.dart'; +import 'package:sparksocial/src/core/ui/theme/providers/theme_provider.dart'; +import 'package:sparksocial/src/core/utils/logging/log_service.dart'; +import 'package:sparksocial/src/core/utils/logging/logger.dart'; +import 'package:sparksocial/src/features/feed/providers/feed_provider.dart'; +import 'package:sparksocial/src/features/settings/providers/settings_provider.dart'; class SprkApp extends ConsumerStatefulWidget { const SprkApp({super.key}); @@ -14,27 +20,69 @@ class SprkApp extends ConsumerStatefulWidget { class _SprkAppState extends ConsumerState { final _appRouter = AppRouter(); + final SparkLogger _logger = GetIt.instance().getLogger('SprkApp'); @override void initState() { super.initState(); - // Initialize theme provider ref.read(themeProvider.notifier).initialize(); + _initializeApp(); + } + + Future _initializeApp() async { + try { + _logger.d('Syncing user preferences from server...'); + final settingsNotifier = ref.read(settingsProvider.notifier); + await settingsNotifier.syncPreferencesFromServer(); + _logger.d('User preferences synced successfully'); + + _logger.d('Loading settings...'); + await settingsNotifier.loadSettings(); + + if (!mounted) return; + + final activeFeed = ref.read(settingsProvider).activeFeed; + _logger.d('Active feed: ${activeFeed.name}'); + + final feedNotifier = ref.read(feedNotifierProvider(activeFeed).notifier); + feedNotifier.loadAndUpdateFirstLoad(); + _logger.d('Feed loading started'); + } catch (e) { + _logger.w('Error during app initialization', error: e); + } } @override Widget build(BuildContext context) { // Force dark status bar and navigation bar - SystemChrome.setSystemUIOverlayStyle(AppTheme.darkSystemUiStyle); + SystemChrome.setSystemUIOverlayStyle( + const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: Brightness.light, + statusBarBrightness: Brightness.dark, + systemNavigationBarColor: Colors.black, + systemNavigationBarIconBrightness: Brightness.light, + ), + ); final themeMode = ref.watch(themeModeProvider); return MaterialApp.router( title: 'Spark', - theme: AppTheme.lightTheme, - darkTheme: AppTheme.darkTheme, + theme: AppTheme.light, + darkTheme: AppTheme.dark, debugShowCheckedModeBanner: false, themeMode: themeMode, + supportedLocales: AppLocalizations.supportedLocales, + localizationsDelegates: AppLocalizations.localizationsDelegates, + localeResolutionCallback: (locale, supportedLocales) { + for (final supportedLocale in supportedLocales) { + if (supportedLocale.languageCode == locale?.languageCode) { + return supportedLocale; + } + } + return supportedLocales.first; + }, routerConfig: _appRouter.config(), ); } diff --git a/pubspec.lock b/pubspec.lock index 51ac825e..8403c693 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -9,6 +9,14 @@ packages: url: "https://pub.dev" source: hosted version: "82.0.0" + accessibility_tools: + dependency: transitive + description: + name: accessibility_tools + sha256: aaa782bf794d823f371f45d232efe8605cffe081c34a1d83fe4db491ddbba0c7 + url: "https://pub.dev" + source: hosted + version: "2.6.0" analyzer: dependency: transitive description: @@ -441,6 +449,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.11" + device_frame_plus: + dependency: transitive + description: + name: device_frame_plus + sha256: ccc94abccd4d9f0a9f19ef239001b3a59896e678ad42601371d7065889f2bf78 + url: "https://pub.dev" + source: hosted + version: "1.5.0" fake_async: dependency: transitive description: @@ -518,14 +534,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_animated_progress_bar: - dependency: "direct main" - description: - name: flutter_animated_progress_bar - sha256: "805175fab1a1fb7d13f9107321353c0f297b83fb67e05e77ab96cf555e30a62e" - url: "https://pub.dev" - source: hosted - version: "1.0.5" flutter_cache_manager: dependency: "direct main" description: @@ -559,7 +567,7 @@ packages: source: hosted version: "6.0.0" flutter_localizations: - dependency: transitive + dependency: "direct main" description: flutter source: sdk version: "0.0.0" @@ -701,6 +709,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.3" + gradient_borders: + dependency: "direct main" + description: + name: gradient_borders + sha256: "492bc88ab8d88a4117a7f00e525a669b65f19973bea7ee677f9d9de7603bf037" + url: "https://pub.dev" + source: hosted + version: "1.0.2" graphs: dependency: transitive description: @@ -853,8 +869,16 @@ packages: url: "https://pub.dev" source: hosted version: "1.53.0" - intl: + inspector: dependency: transitive + description: + name: inspector + sha256: a01ea538b15947a9189835cc910041bab91aea3ad7c421684118aa1040189ded + url: "https://pub.dev" + source: hosted + version: "3.1.0" + intl: + dependency: "direct main" description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" @@ -897,26 +921,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "11.0.2" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.10" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.1" lean_builder: dependency: transitive description: @@ -989,6 +1013,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" node_preamble: dependency: transitive description: @@ -1165,6 +1197,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + resizable_widget: + dependency: transitive + description: + name: resizable_widget + sha256: db2919754b93f386b9b3fb15e9f48f6c9d6d41f00a24397629133c99df86606a + url: "https://pub.dev" + source: hosted + version: "1.0.5" riverpod: dependency: transitive description: @@ -1454,26 +1494,26 @@ packages: dependency: transitive description: name: test - sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" url: "https://pub.dev" source: hosted - version: "1.26.2" + version: "1.25.15" test_api: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.4" test_core: dependency: transitive description: name: test_core - sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" url: "https://pub.dev" source: hosted - version: "0.6.11" + version: "0.6.8" timing: dependency: transitive description: @@ -1598,10 +1638,10 @@ packages: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.4" very_good_analysis: dependency: "direct dev" description: @@ -1722,6 +1762,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + widgetbook: + dependency: transitive + description: + name: widgetbook + sha256: "83a58c9b4556debc7b87209a860bd5ab3daaec0786a54189aa5a3fd54bdcb6fb" + url: "https://pub.dev" + source: hosted + version: "3.18.0" + widgetbook_annotation: + dependency: transitive + description: + name: widgetbook_annotation + sha256: d29eef40efac4beb51f5e9d3bb6dd800db986f7020822b06b60d27f0299dac49 + url: "https://pub.dev" + source: hosted + version: "3.7.0" + widgetbook_generator: + dependency: transitive + description: + name: widgetbook_generator + sha256: "361f28ae26a4eb9c74625ff1e53eb6a783c8f0e6032baed80de4489da778f955" + url: "https://pub.dev" + source: hosted + version: "3.14.0" win32: dependency: transitive description: @@ -1772,4 +1836,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.8.1 <4.0.0" - flutter: ">=3.29.0" + flutter: ">=3.32.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9c7160b1..bd7f29c9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,13 +3,18 @@ description: "Spark mobile app" publish_to: "none" # The number after + should stay fixed, the android workflow will change it on every build version: 0.2.0+1 - environment: sdk: ^3.8.1 +workspace: + - widgetbook + - fonts + - assets dependencies: flutter: sdk: flutter + flutter_localizations: + sdk: flutter flutter_dotenv: ^5.1.0 cached_network_image: ^3.3.1 camera: ^0.11.1 @@ -45,8 +50,13 @@ dependencies: web_socket_channel: ^3.0.3 any_link_preview: ^3.0.3 better_player_plus: ^1.0.8 - flutter_animated_progress_bar: ^1.0.5 + intl: ^0.20.2 video_player: ^2.10.0 + gradient_borders: ^1.0.1 + fonts: + path: fonts + assets: + path: assets dev_dependencies: flutter_test: @@ -78,7 +88,13 @@ flutter_native_splash: flutter: uses-material-design: true + generate: true assets: - - assets/images/ - - assets/branding/ - .env + fonts: + - family: Fraunces + fonts: + - asset: packages/fonts/Fraunces-Variable.ttf + - family: SN Pro + fonts: + - asset: packages/fonts/SNPro-Variable.ttf diff --git a/widgetbook/.gitignore b/widgetbook/.gitignore new file mode 100644 index 00000000..79c113f9 --- /dev/null +++ b/widgetbook/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/widgetbook/.metadata b/widgetbook/.metadata new file mode 100644 index 00000000..603c6412 --- /dev/null +++ b/widgetbook/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "6fba2447e95c451518584c35e25f5433f14d888c" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + - platform: android + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + - platform: ios + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + - platform: linux + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + - platform: macos + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + - platform: web + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + - platform: windows + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/widgetbook/README.md b/widgetbook/README.md new file mode 100644 index 00000000..28e23a09 --- /dev/null +++ b/widgetbook/README.md @@ -0,0 +1,3 @@ +# widgetbook + +A new Flutter project. diff --git a/widgetbook/analysis_options.yaml b/widgetbook/analysis_options.yaml new file mode 100644 index 00000000..f89249c6 --- /dev/null +++ b/widgetbook/analysis_options.yaml @@ -0,0 +1,5 @@ +include: package:flutter_lints/flutter.yaml +analyzer: + errors: + implementation_imports: ignore + avoid_print: ignore diff --git a/widgetbook/android/.gitignore b/widgetbook/android/.gitignore new file mode 100644 index 00000000..be3943c9 --- /dev/null +++ b/widgetbook/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/widgetbook/android/app/build.gradle.kts b/widgetbook/android/app/build.gradle.kts new file mode 100644 index 00000000..55f85748 --- /dev/null +++ b/widgetbook/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.widgetbook" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.widgetbook" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/widgetbook/android/app/src/debug/AndroidManifest.xml b/widgetbook/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/widgetbook/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/widgetbook/android/app/src/main/AndroidManifest.xml b/widgetbook/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..6ced6c17 --- /dev/null +++ b/widgetbook/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/widgetbook/android/app/src/main/kotlin/com/example/widgetbook/MainActivity.kt b/widgetbook/android/app/src/main/kotlin/com/example/widgetbook/MainActivity.kt new file mode 100644 index 00000000..3bf32e5a --- /dev/null +++ b/widgetbook/android/app/src/main/kotlin/com/example/widgetbook/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.widgetbook + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/widgetbook/android/app/src/main/res/drawable-v21/launch_background.xml b/widgetbook/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/widgetbook/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/widgetbook/android/app/src/main/res/drawable/launch_background.xml b/widgetbook/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/widgetbook/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/widgetbook/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/widgetbook/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84rT@hh9qO>QU(SF$r9IylHmNblJdl&R0hYC z{G?O`&)mfH)S%SFl*+=BsWuD@4C?}XLR=Xb7#RJ!7{h04Zu=H;^aq4w44VZJaXaum zG@>0o`I5 z6U6gpN>(hBs@ovlyiK}omrVN}&28UY_JdsVcA=Cl0|SF_NswPKgMfg5KtMnO2sE4r zf%}pIPku2lFue41aSVw#{PxUsz9t6&hrp0GdlTMw^~h@f`fs1s!olsWbZ#C0v7PJ9 zExVjNeb(Ol`RU07XFf|X@qSK7qke0_C&kUH>MnD(8u-mi5B zt(&|xZ@%@sBNk%nt_5+E&U1QAlyT>>sMB2Zd5T5*R3&Sld5=98o%0qdm+@@-JjKB8 z(xcUiGOB?O=e)LCdt!o~wXBiQlFwyn4J{(JaZG%Q-e|yQz{EjrrIztFmwg@gt#&=FffMC4mtWmbKAF&qdyqKXG0ipk&vT5 zAmZ%d{SXF=bCKq@Z-GZZ;tV#~j83JDzFmxd-Hahq8AGNqhE8V;o5>h9i!po_WB6=l zU2kT?Kvt(bR^JA;;7+;DUGlvL6sMk6nsrHO&Q;BA-wby`jSBSdXJueu5G@Jv3uX`y zP*5;1FzBB@fBpXR=g+?ff&5MV!VC-yOFdm2Lp+YZy>e2h$w0vMVh8iNMNLhM)++IJ z{QqCg*LgRGXKpKZaOLSMJFo8MNc{figWv3mbJp+w-BoBm(|-hT|4dcbJ2lEyX!??Y`jpZ81*D{;rF6b`?;0>>pbJRKPRw2)?8wK8GH9> zL)n=k&vkA#ITl(SSsBW`??>AG{pM|AK2Jc#t6>y4N#$)H8ZEGkUc!`m{6pbTImMF#2{f z`gJk-_b~?aGX_m$44TXsJQ-wH$W+GA>5O4B7{g{VhRtFOpT!tHo5?tW$tsn}K99+{ zjLE&4*|Uz>tC88eNi3sZJbQ{n(LBkDd1t=Sn-plsE283-d*czTa-zm@iQD#kujt@|Kvt4hp|H z71QJA-@DE-vCc=}m3vdfeqD}l&W>B;IduNM%M_}RPx;yPVrk2E_T?&?d+vqXsA}xF zGk52_Ny78;-$vOoENNLjTll#WOG?YLuZ?eO;uVxk)@?h*_~6>qo(~l}_f@BaD>p=c zm>yaWRpaQm|`^KGX?!;c=*_;KycpYksb1 rdBk${xlomwC<})`ozHbP0l+XkKcl<5t literal 0 HcmV?d00001 diff --git a/widgetbook/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/widgetbook/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Lx+13>Rhybuln7NS3%plmzFem6RtIr7}3C z$Dctjh(SM?K|h4SAdJB{hQT_6!9JhSFr3jep3y9U z(L9OKDxJ|flhG!d(I$t{HiywRm(ebd(Y}z;v6#`Zgwd&#(Yb=rrHawDn$fL>(XE!z zt&Y*Xj?trm(W8;kvysuWiP5u}(X)lotC`WOh0&*-(Wisaw}a8QlhLo6(XWTmzlYJk zmocD^F|eO8Z~|lCM8?2Lj6o9_gC>F8A3T{ccnV|4RK}2LjG@yRLuW9C&0q|h$rv_^ zF?<$d_-uBwU=HgjPRC?Uw`?x2A}+rQ?!a2^kVfvX7VhwN?#NE=s4niP9-inPl?69d z7T#1{bVqf`J=LWT)RsR~Tk%+JQT9|ZQFKYxDR#LKT37?|`uT^vIyZoR#b9vmDf()v(?iz7_L)oF78 zkJJ<)r8pUt8M$!5-N#*39u$gn zR>-(G$wg0`aolam=a?PG9$oC(GH>-!X0d*^l*gJvuFJp95x7~EvFLL3EEhhxt`pq; z%_lBC*86lUSiR`uj?O)w{s`}^n&Wz}@?RH+ochG+^SU~oY!t72t=ZWjXFc({Ty9i< zoXX3Kohi2Ju9xPeP296QFr{gETuR&Xh?K77YDUL{MQ1+I?2fS6ciP3jaR24wmqlki zKfgU-wdbO}>o1>vX;$n~9ltDoY4ItEi|?MFbkSNqMRUkMU-}~Bs z)+NdNzgg`VE)XKX=tVT|2z5{L4{YJjHWS*rIm-E6Ws`IFvdRnm87H fR&jd1QhDAN-h`R^uRUjAU|{fc^>bP0l+XkKAv&s= literal 0 HcmV?d00001 diff --git a/widgetbook/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/widgetbook/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Lx+145>_WOc@v$BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFy0FA32|j$U7=vLLgJC#>aTJ4T9D`W`gLwjjbtZ#N4x^eAqnb0LmM5cOIHO54qe%>- zNi3sjJfm3xqeU{KMGB*38lzP@qg4i@bta=t7NczrqirsuT`r?t9;018qkTT3eF39G z5u;-~4uK+6lW`UY0|SF-NswPKgMfko7&thbzyBTz-gcI+Wnf^o^K@|x zskrs_3VX0{ph#Pyi^G})N%|2R%{L?-ZV(U%Y+lqcfu(WAio}U)uIrV(+3WUaecD+A zmQ6SJem|Gdo_Kp z-*x@+`J3Y19B#kQTkx(t_`-K<>p6dn#rh_GuokuWC9d+nXX1zFdIcZVw{qEhc&=6O z^|eUFqwV?=KCBk6c(Pr4!l%_@70=G=P581}wBp75D22D-njfy%?{qk*AOB#Z{bq-g z`q2+|)-Q6ns2@Io{eMN{rubzF`u|EA+wSjG@UL6#aQc1N1oQe;4(H#;OmN?SS>~@F ztIeOC+&g|0i+=ccTfE@YZP5>((!~ot`|Cb zb^PFdrt-VXypJEaJ95?T2$v)Ws{O#V4Ednvz`|Pb} zf4VOe!@bWom-}e`tT2YtP3!%mny=z+}-K6mV2ZEt5Icwo(g z%Zr!wX>UAuh9QhqUj7<;)5IBxDQpH>KRz6|eoM6P*rQ_`EdPlXYgN?$U-3W2|NYf9 z3~H?J-^u1!lq%j3KgpL6_~F~TxcJXA&m~w0?N0Rh)m167XXobE9?sqiHmlnth&$|i z@b&H6->;epMCgPeb()B(Tr|RH~O+1PwlVxdT!ROU2OGQ3PvhLeQAwP zO|AMWqpQ}lM;-?Ix_3Z(ZoZK*%HiZ|EUDeVf^rGH<21r@EM zSf|zZ`p5aNP1ut4@|gFs0GYW>Kcl68^QPJ_Y + + + + + + diff --git a/widgetbook/android/app/src/main/res/values/styles.xml b/widgetbook/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/widgetbook/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/widgetbook/android/app/src/profile/AndroidManifest.xml b/widgetbook/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/widgetbook/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/widgetbook/android/build.gradle.kts b/widgetbook/android/build.gradle.kts new file mode 100644 index 00000000..89176ef4 --- /dev/null +++ b/widgetbook/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/widgetbook/android/build/reports/problems/problems-report.html b/widgetbook/android/build/reports/problems/problems-report.html new file mode 100644 index 00000000..51f39582 --- /dev/null +++ b/widgetbook/android/build/reports/problems/problems-report.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/widgetbook/android/gradle.properties b/widgetbook/android/gradle.properties new file mode 100644 index 00000000..f018a618 --- /dev/null +++ b/widgetbook/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/widgetbook/android/gradle/wrapper/gradle-wrapper.properties b/widgetbook/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..ac3b4792 --- /dev/null +++ b/widgetbook/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/widgetbook/android/settings.gradle.kts b/widgetbook/android/settings.gradle.kts new file mode 100644 index 00000000..ab39a10a --- /dev/null +++ b/widgetbook/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.3" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/widgetbook/devtools_options.yaml b/widgetbook/devtools_options.yaml new file mode 100644 index 00000000..fa0b357c --- /dev/null +++ b/widgetbook/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/widgetbook/ios/.gitignore b/widgetbook/ios/.gitignore new file mode 100644 index 00000000..7a7f9873 --- /dev/null +++ b/widgetbook/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/widgetbook/ios/Flutter/AppFrameworkInfo.plist b/widgetbook/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..7c569640 --- /dev/null +++ b/widgetbook/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/widgetbook/ios/Flutter/Debug.xcconfig b/widgetbook/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/widgetbook/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/widgetbook/ios/Flutter/Release.xcconfig b/widgetbook/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/widgetbook/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/widgetbook/ios/Podfile b/widgetbook/ios/Podfile new file mode 100644 index 00000000..620e46eb --- /dev/null +++ b/widgetbook/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/widgetbook/ios/Runner.xcodeproj/project.pbxproj b/widgetbook/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..29e25871 --- /dev/null +++ b/widgetbook/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,616 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/widgetbook/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/widgetbook/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/widgetbook/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..e3773d42 --- /dev/null +++ b/widgetbook/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/widgetbook/ios/Runner.xcworkspace/contents.xcworkspacedata b/widgetbook/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/widgetbook/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/widgetbook/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/widgetbook/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/widgetbook/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/widgetbook/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/widgetbook/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/widgetbook/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/widgetbook/ios/Runner/AppDelegate.swift b/widgetbook/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..62666446 --- /dev/null +++ b/widgetbook/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 QlAxuUp00i_>zopr0K8b=b^rhX literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7353c41ecf9ca08017312dc233d9830079b50717 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4rT@hhF#%r?HL#tasqrpT>t<7A9D1^uYdo) z|M|}tKKsk>|9v-q-Td@-#@*lDH-5EW`xVx|ck=Dun%lnZzw+$;uYV7|{`>yx&%T#` zTCV3itMfospaXP=IqbwD6@ zDPzzip<9;X3=9lqo-U3d5|`&rILX&+z{6^2n0tA`hWFNg{@V-13-F02^evt^FXuh) zqioI{pPd!OAH8$?v)QG6$`(O>hSVxQ(BJuK)l44>|gSF?_b> zwr?MP{mVP|^ZECG7vKLax$yJ*-~WlHet!D>|IN>T*=K)lIQ^jZ@~?Ye{(b)a|LvEb z0Y`rP`S(BO#1F%r-yXdFthWBGQTaOk(zO$A{%XGZ>(QGprd1nM@>VcS~)W7Xv|RU5C* z4t{O;f8N&}_5C+?Px*80;D6b3eMw0P|M;#gk zx@(v(e(d({O*>zm_z*O6Wr4j%SwPR!NVNm(*@j`u-h7ytc=jp7AC47!Ud63vN~@W4 zk9lFKoRQ+XxagJud84C0HTRxRdr`H|an>x>GuioP5(3lB4!hnxQ^36V3Geh@-1Dxk T&il&1z`)??>gTe~DWM4f7<1Pq literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4rY*ulBNR#14B!IPl)UP|Nldd{?Od^jWK+7 z_^}_6$A7&2`ESXC-;cljn{xa2-OvA`C+~mt4X{jZc3$W9B8C{Hed= z8_2kPWxn6Pj~%=4X!F-+NASyf5FAZxGq=O!5^k+lS~S7VV#{pC1U0k_eAF zuX?KD_kORa=N1$CWGvF-&NxWE?3vyBRr9XNl}WExZ3&HbTX|*TT9=^kZ#xzRx$7M) z5!!ZfV*j>M*0R`*=`%BhLwcI#MPG_O?pERWYQeo9ruU@XcD-JjuiyAPBk}yt=m&PQ zIA_2}^*4&+*^6LLD2H{SDEiagFJZ4~EVDNPH Kb6Mw<&;$TA1m_0; literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0y~yV2}l24rT@hhD6`#whRmmu>n3IuK)l44>|fnbK5t@ z@Y%or{ZBpp^T*%+w?6;d`1H@($A4l@{7}eQzVzYmx%YnOo%^}{`JXAbe=~;7y!P?$ z*Pp+g_J4QW_uXvQ_qN?PtCpXxTz*QX?T~2g4zbb|j3Lt)JsX>Dzf@&lV5snPaSYKo zfA-u>z7_)xhrng260+ZGzyG(t93(6({9^Sz^-01^A0|DrpT4+9{++jyo1%{2kqc=b zo*DCBJYRnJ*P%Q9ns>Y;JzezDj)XbsIUTqs(Jtu`m>$FBl(s|Cab3xdkj`_j<07ZF ppWQXd?cvEPwbtX41?Ao{q_1Z2;nvxn!@$76;OXk;vd$@?2>{PTh06c{ literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0y~yV6XyV4rT@hhHI(2q!<_&rUm$fxc>kDKji2S#_-vi z+rG`a_xsT6zZqwKvP8~3`S$PDXMff|`7`tGZ_h(Nu6_J_{{7#nw|_GRPd@hM@9r0W z9)10H`NQAdo4<5+d^>yZ&F)K2Zhii@#fM*(E;%XDen_%)pG4yh@ro6UE>#SM;nKc$ z`xqD)K6|=2hIkx*d+9k}lYvOv!>U&fOCKHB>mc}j*Zd@!a^%<&5i#n zCKfF86I9jU=KQnrT$~y2$zwKNkJS9Pi$-J#3Pj$mPJcM}i0H+7>k#Mdz1t32i=GQ@ zD%tiab@lP3Q;jzDZGRif7M9%7cE^9I*TJ1zO1omd@5njsQM%OTKttNrb{n&Wm-!jCiA8qYje)|>)qN5lZ4*q+~oVBQ@EP-#ER&*jILX}Yu+g|nhNi^o=~~} bK5y&<-lE%Whh{M_Ffe$!`njxgN@xNAiC*)Y literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..321773cd857a8a0f0c9c7d3dc3f5ff4fb298dc10 GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0y~yU|fnbK5t@ z@Y%or{r~y*fB3Nc#~&-be3r%RWdlx#l~KlQ+;U;oT^e=l5gJhXq0MAI(D z&>0NIQD1)lzy0~&q6fdb4&9f@T*l;4$6yl6Xb`Nr)u4cZf$@l^i(^Q{;kQ?^gPR;g zjulRc6*pPO#u2r$(tESc?(5(G$277^%Vce^HM{lZ^R$`v`z6~JpE!B)q~hAOjisFh zQ|FmwwQh_Hj;ZF^wDsQ99c64=Z{=-iR9%{*cR$GMwKN*wfM7b zHRXR;?r`zY)XcSeubx{Fw!N%Kf|*74%r%qj{PPu^+pbSZkD2$e`SQD0J?T+S4+Z!Z z|6b9&HTI#gU)uvo?$w3zb(d~^m}?fgYVGNL){oa6b}%cM+GWhX=1-6CY)9Qdt^OxR zqL#^;Etr;9TExaPuQ01wYxDNKsWUB33(f7!*lAIJ%y(_w#gpOE4$+}!&RcwR`}(WY zE@$@sU4qQVzUbeo*cjn5d)qF*Wmnxj%>=nKEG=uB=b7xBk=^RHC1UowJ%_g@8SnL- z&^~diP0vErnbX>xU2B#x@0xykTGNI^L+PL95)Xebm=OE>80W4ZWtYC!hT0zHn9X>8 zpUZ5$z8Nj^Z+<7To@fO+TsY?$nRvNmHU1>MW?}RBB6Pex7q~et%bVKu^E>0})Hho%K7*8M`#J Vrpz(l%D}+D;OXk;vd$@?2>@$NY7PJZ literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4rT@hhTRGt@eB+MT>(BJuK)l44>|gSF?_b> zwr?MP{mVP|^ZECG7vKLax$yJ*-~WlHet!D>|IN>T*=K)lIQ^jZ@~?Ye{(b)a|LvEb z0Y`rP`S(BO#1F%r-yXdFthWBGQTaOk(zO$A{%XGZ>(QGprd1nM@>VcS~)W7Xv|RU5C* z4t{O;f8N&}_5C+?Px*80;D6b3eMw0P|M;#gk zx@(v(e(d({O*>zm_z*O6Wr4j%SwPR!NVNm(*@j`u-h7ytc=jp7AC47!Ud63vN~@W4 zk9lFKoRQ+XxagJud84C0HTRxRdr`H|an>x>GuioP5(3lB4!hnxQ^36V3Geh@-1Dxk T&il&1z`)??>gTe~DWM4f7<1Pq literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmeAS@N?(olHy`uVBq!ia0y~yUE@?@xZ~!3`}6<6t3NR(eq8zR_vG8Z zjN!8uAG+;!;JeoLZ?As*JNo8t>4l#~=YMWE{b0qz-wJcCGlow4@caMM@Bb1{{?Oa; zjX88Oqkj*xMf`>*e;Tj+s<`+wzuQ?PgfBfrx8x$CQvpt>#;t-U~ym zBcA{NZ@hR-s={_X&GvS?l==g4&(rp|Nb_%c|R(aICOQw z50)p3zZ<=X+ob4Hh3mhqby*bUIz3PYcqwIfExqk)lbCrAWZ+GR7a{D?%{o_U349Tm>d68jv zR<$2m`K4lmiszkG?Mgr18cx}DX+;$S$IkV6Q*0T6e%6&f=J+_(R>bh_MVYIMcLjcP z;4oT!?y_=wOUPMDjP*8O z`u=Io>B+g7Z6Lms~bw&sPR@y{3(UKgy1-p# literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0y~yV5k6L4rT@h2EJX#9xyO4JP+^*asB`Qf5_1v4B@ji zw|)Eb?|;OxAHV~PpefT@|_OGOqKfe9>_vP0=-Gl$NwtbV?_%;9BPqSU$ z7=x!uZTxChwVuIy%9LBb$}j%B^!{)8g`Y{Meuy>iW%Oxhuq%+LT*c_$%jj0eXc+na z#~%jA3I=)Wo*Ta;8@34)FJ%mzz~I%)V4lLD<$LAB-}CSOo_h0V?)^VaSAM3Q{*ip@ zhxzXBvYWn2ZTNEa@wNz!q@w-CJ?x#{b+t}WHSZqG^It%xX z?~~MSdtEwx=eeGw`I>^(!nIm&))lN=y>8d5Rjb$SGVqNpy&4)0BEFy7b?wXzs0Y|>|Px^$-8>1&d#`b z;>DW|>`|E=wcbYmq|>^^oBT54Cb7m$lANBRDZY7Hspqo2LMxt3I`dy&=WCk(-A!+9 zsz%`Pt?s+Ox+jXzmX65g=D$MniBlVoGv|MUY z|K$VAeexzQ%Y5Le_WkCI4H^R9R3=wj+RQ&>ms&EvufOfO@b4)X_ev?&yi4de+NC~y z@#F5phc^C8c^=p6e)v$Q+*5w*boCRv68D~}tT5Z>A2Vw)$u1$lLoLd0@X^L;Q@J@#Y1Y gvzBH455CXX<`VnX;r43{1_lNOPgg&ebxsLQ0IGJ#9smFU literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0y~yV5k6L4rT@h2EJX#9xyO4JP+^*asB`Qf5_1v4B@ji zw|)Eb?|;OxAHV~PpefT@|_OGOqKfe9>_vP0=-Gl$NwtbV?_%;9BPqSU$ z7=x!uZTxChwVuIy%9LBb$}j%B^!{)8g`Y{Meuy>iW%Oxhuq%+LT*c_$%jj0eXc+na z#~%jA3I=)Wo*Ta;8@34)FJ%mzz~I%)V4lLD<$LAB-}CSOo_h0V?)^VaSAM3Q{*ip@ zhxzXBvYWn2ZTNEa@wNz!q@w-CJ?x#{b+t}WHSZqG^It%xX z?~~MSdtEwx=eeGw`I>^(!nIm&))lN=y>8d5Rjb$SGVqNpy&4)0BEFy7b?wXzs0Y|>|Px^$-8>1&d#`b z;>DW|>`|E=wcbYmq|>^^oBT54Cb7m$lANBRDZY7Hspqo2LMxt3I`dy&=WCk(-A!+9 zsz%`Pt?s+Ox+jXzmX65g=D$MniBlVoGv|MUY z|K$VAeexzQ%Y5Le_WkCI4H^R9R3=wj+RQ&>ms&EvufOfO@b4)X_ev?&yi4de+NC~y z@#F5phc^C8c^=p6e)v$Q+*5w*boCRv68D~}tT5Z>A2Vw)$u1$lLoLd0@X^L;Q@J@#Y1Y gvzBH455CXX<`VnX;r43{1_lNOPgg&ebxsLQ0IGJ#9smFU literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 zcmeAS@N?(olHy`uVBq!ia0y~yVAuk}9Lx+13|zwB7#J8B`2u`GT>t<7A9D1E=C*H) z;j=@J{`mXv|F6IQgO2=&IQHZBzyE*!{&PL>{onup^Y8s)2%F_~=sR=d9G^qq{SW`p z+V+jXXNvfSZ@>Tib#L9a>e26_^FJ8^r@J5ce&+2ThTxeDp))Rh_{$zWx8d?njm@7l zHoVu`^G|2{w-pb6&${#L$M3(V-u$Uwb>`~FziW=&U2)_NW5`qn&qMB`24#+=idD}_x8_(o4*)?CNVfwGdUJ>IwmuiCapSphbv|xvu7=Xbq+(+ zf~60BGss#!`Sx%1qu-?$e)e7evGV90uJF#RGe0f%eAnCl&8}fHgOaoU{{Kf_{h4z6 zSM|l8cbG> zMNLPAkFL)0w*6=q_5Sy-fAL4mPb$6IG<(aY!_sQ!<==iucxL{-T-k>jX<-SyQp z#R{dQBx$z^Ek~a`*?c$o*qe7|@e^h&;P5_iwBSPS>`QO={XN6d7ufuhukT^74|rjl_yi}BVQujiO@Z+ewc z{Nl=-^u6a+_p7e2&y@wf zidf%Vd|~H5p1tSN)*ntSTX%hD#<$olo1W}mQM~uuRlQw(d(X}Oubnjay=!4<;O^?c zt_|J0uD$lV;QYEu|J5SN!1cxFbnd)a)cJl<>c`kCOZ%2o-<@^u>8=X>S4rYiYneN5 z?sv=Q=(_&GHAmd7#Gphatv6BIl-tOk=l%vyBf0ec=)Ze4YOdC7F26HluX**adSAgi z-G{=(rE-gR^?q~x8o=^>QK!je4HMNz7gG-%`E=&Zf%O+(TedI!dB@&Ge{w}-n&OG& z&1HdU>B}xoI{S&UcAsFY+oywPV`iT;I_zM(Kyka_^XqOYhR^eMq!_DA%Ze+L_>^S4 zRP5R0pIZa>T3vU2d)DTa+pU`n7wboDpJzPdwdjn-15;*2mjy07o0yTA=CV|( z^h9pe+`Tiyv)I}uRC~-jcyX4g%gUWU<3eUX49~sZrV#47GO^}Z-14(FPqgQ4_FHpR z?AhgfW$EG!gYYHSVolQRf}~yURFq{GKTV7}+g&}^Y~9x^t~`B4*x-Xa+1c_&<50Q9ncEg1Eo80#25z7>KXFc(yW6FYtBT^DfI^ zWs~IzW-Ch9A5QG+O98w)_hxbX zlJ?}n6;BIg=e4DM-g`JaVC8$6m3IwhH7Cknk%+6A=DFoof*hZ<^xyV~D*-lJZYAVx zwL1JyJ3zTYc|#EQQa!_buaehS-2Q7xeh*mb&id^7<+Hv9-lg@2S+|{PzsM z?y;QlvI#F2SmkcK*~Ncbn^0F=taR$Lx$2X5JGxtb&dTxqdd7XL*|OUQFZ0BJJ#n856zR&t`@EmAb-|COc)-#jWZA!Ylb?g1;}>^>|v;8|S*7c>13)dGvmM%KVlI_6ZU9cxG%A kTD{<=Z4D~;^po}1tFt@5&(mDRz`(%Z>FVdQ&MBb@0GqsRX#fBK literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..84ac32ae7d989f82d5e46a60405adcc8279e8001 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0y~yVDJH94rT@hh7X<#B^ekP?gjXSxc>kDKji3-KmYzm z9Q&cU?HgnG?B9R?HD3Ao^Y8y3zyJCl{*id{$BXZO!;bxMJMf(?YOeR8?_LMLyYBz~ z>c_uNzy4kQ^e^W4j}=GnFoey_KJ!y=`!@!^sUb(c$4uJC6fu{pELMD=)go z;5nJmI)l+5`0MX~H$MJV+5NZX($BQhKNx*GAAkLO=Ix*3um3!J{psrCcNXiPt1fwP z;>x`R`)|(NeJyUv{)CCU{W^CrIP_?R%>Ki`z-VBU|KG#!kEGuHVBD`5rWd+lL6BCZe$9rTtxoN|*?X|d3 zy=dm?(reNOjzyndr@YE~QR>?EiOyFK{bk*B??9Q-p{{A^9IGPZ7wtUOqxNc1mHrm4 z)9e|M@9Sr*uylJFS0t8pa8sky+m7`GlHDeb#gQA{R{3gjKfZbQ#HPjfSEqLOtDo9j zX_@`_{i+#vlypx;7ZuE`?fFflOFflzZHLd|5oL5wg&HP?c6K#)}Hk<`lGo%a>>Hd z3m^Z+zlusL<&V-W=8}r~yEadKW|vvS>wW=e?^x+K-`p4HT{7A%veos@#h&DrE2h$V zXKoyqUB2Y+cj5i1b)si`&RTHiTkK&=;JWp}ech9H)3h^|PruI{JJ&-$s#bZe=Hi=6 hCC<$HDtVWg>A&sfRbjFV85kHCJYD@<);T3K0RZc2mlps4 literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8953cba09064923c5daf2d37e7c3c836ccdd794b GIT binary patch literal 1226 zcmeAS@N?(olHy`uVBq!ia0y~yV3+~I9Lx+14Eiz`gc%qZIRbn_T>t<7A9D1E=C*H) z;j@E}{`mFxf5fpLfByad`|sbs|Nj}nW`!O7;eF`)^KX9>PyX;c__ z_n*J)(Q_F*C$U7$dGhU_#@25P-cvR`{j>eqAGZVF!~6IA{QcLuW~1)*Z?VUJh;R6& zy5%cl==8eFKb5z9)7bLG|L}K*hRqk>|Iyy_$7ts_#-PcJ0sVSAzA<_>F*sKpd;RCw zt3Sp&zX|3nVz4V=G))kQY-G?2(%$p$*z4bne%%aKS$97F-TUHC>Zu=$J{{kG{{H*p zd(!lS0;$sl;(Himtr?`vBG3JQ_w(P0*MC+#{M~!wSLMZ@FW!Hhvi(YM?=Fk(U0Q{! z?2G3!*!M7mwlgR?|Mv2VU|?Xb^>lFzskrra`s*MmM}gMr#Kba|WU&B4Ay-4T#R^AU zj#OM%c~<9t@4v5+a!Az8GXh-}m$T|a|7~3GW7YYE+Zo#uCBUdd$@s9q17^)c4WT>A z41DqtGwb)Wz7rIBC%!D_3HMIs0=Z=!Q^L>%`L6x#SzynU_IjRZ@V=m} z@_cF0niS5emz9EFghGl{Ua9VgzdkXU=iGsN;T+$(U;PsjJo{exs;yw)+v{iV3BUPz zy!*wx1-JAU%vSc)Uvyq^)$i{28T%HqKd_$lUHtyV8u!~foh^gDD(zHX@vZy)i|CIs zi+1h*(YJ4N`4)+;`PNYl%q}LM<|;pUyJqUio6RSj_Zxjsk$%Qxd{e=m|Ipoe4(ko% zThf{eyed5<*g2J}kDgjRZ}T4I@ALO8bDJM-oBf&V*mowzkH@{rT-HCZ+IxXVPW8;1 zxNkBW;~&p{QG6`Crx@kYpo9p-kN^uOkm&1 zd6IiitqkE!e|Cy{JKMdBocbok7uLI+pZ4#X{@bMoO=Q1hE1W%aalv)&FHXkpmXFRD z$@BHZWjxbyH@RG&rvGN9wf-N~>{sDMX)_ixFS*K{{_G65=R3}3$!9M_=1f1x^Sy=n z%wGR*Iv*x27STE`Ri&CPc17Fnnd$?BtFxzHd~#K<00ZS&M z@6*iB#;yGN{B}3@28MHj0=l~4r_&a&-|duKk|*4WARa@^dmQenaOCj5{km)M(Qi_FD>e5l-+A-%t1|1` zYnO#N?aA-GJNI*5`TnaH^un*$e9x(UzUOk@vh+(lS-v%}zZy638NTVqwX4e8rv{;baP(zxXR z`Pj_LJ5nxZm&}S>b0$q^%Cl<+HcBqDOke!*@on{vgOV9#McmdKI;Vst06J}e(f|Me literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/widgetbook/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmeAS@N?(olHy`uVBq!ia0y~yU|0^q9Lx+149+L^++$#1_#EI9;`;yp|B$0UG`D?Y z44)l*^FJ9wruiNI(XswKW6)$KzfNY8aK?asmBsg% zy<5Ki{>$i8#%PzXy8JPdWlG_~V~o1~55N3nP;~h6``@b{|D-m4Q(f_l!Ds5e7k?_Q z{+W08SImhYGjDv&JNv`$(2qOMJ_yggGiUGht_>Gj)}GItb2x40AqLy-#pN|e85mfC zJY5_^DsH{KlN~HvkdO8n4q7p`0N+2 z=AKrCJ+0?lr~Z-MJ;Z|>U6`g7H+dw=I|4`7OZe|h$_JE`;g9fRtM z)f%t+U;AmA998r9@x`tgkD5deU9H)aSo`wp`+JeR!Yp^vOK03#W*_d8cdvEQ%rz~V z4<*d^zKhn#pTk+ncf0o7kE3isM^lci>F7M1TkY()HeYdWW?9- zDN0$#GiyHo)92=UJ2$UfpD|yzHS5ftlxwReuw*cF`FLI}k=43-&G=a9vU^{yr(Wiq z5utYMY&gG+$61rRe6Gu`gc(2PHIHrI)HC~@(<-OyX7)x>%lNL&?mH8mZ7q55=9Q@P zq9OTKM&{S$-lxnFHvB4j^?BOS7-tPm;e|c=JF66m8JDIcy*6Gm;h0MXGxJG~quW8O z$G+F~RcrUYJmI3T{ANi@oxyrFC+Qtk5(}={S6w!|@#|T*aH5jds- zHyV7smab>)|6HSdPUO~mZ+-1stqx4F3T|Ka`ic*udyL`P${nBoai|2SHRf7>KDhn1 zLb5_{1ON7%Gusb8Qs;oqPF=%=Yznl-s$KLky2UE)&_wSX<0>b%y>i*WG&? zj{P{dykkn1tM8du*0-SnrxZfc#g4w4Be|1juCe;>-%EoXWi1wO(wTg2jt@Vdn4kLs zrQ_F>i>+k&re4-uv0}lA8nfA=kAs&R2SoO&r}U|%&rvlgTIAM4r~6P4HY zi;B!#pLQy8#aErF?;MJAYER1ard>|jQP1}BoMh~jl__#^eQJmATAq!3(VX7C-feTz z{_EXJe?@h_UiCO^Vly) z%$wJ^tJ*F3q3D*!j3K#yJAbE_Fn(R&bI)OKX6?J!*UHu=(dw*7#KWV{an^LB{Ts5B8|zr literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q* literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q* literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q* literal 0 HcmV?d00001 diff --git a/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/widgetbook/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/widgetbook/ios/Runner/Base.lproj/LaunchScreen.storyboard b/widgetbook/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/widgetbook/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/widgetbook/ios/Runner/Base.lproj/Main.storyboard b/widgetbook/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/widgetbook/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/widgetbook/ios/Runner/Info.plist b/widgetbook/ios/Runner/Info.plist new file mode 100644 index 00000000..146e7bf3 --- /dev/null +++ b/widgetbook/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Widgetbook + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + widgetbook + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/widgetbook/ios/Runner/Runner-Bridging-Header.h b/widgetbook/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/widgetbook/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/widgetbook/ios/RunnerTests/RunnerTests.swift b/widgetbook/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..86a7c3b1 --- /dev/null +++ b/widgetbook/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/widgetbook/lib/atoms/accent_button.dart b/widgetbook/lib/atoms/accent_button.dart new file mode 100644 index 00000000..ec82e119 --- /dev/null +++ b/widgetbook/lib/atoms/accent_button.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/accent_button.dart'; +import 'package:widgetbook_workspace/widgetbook_usecases_templates.dart'; + +@UseCase(name: 'on_image_background', type: AccentButton) +Widget buildAccentButtonOnImageBackgroundUseCase(BuildContext context) { + return imageBackground( + context: context, + child: AccentButton( + label: context.knobs.string(label: 'Label', initialValue: 'Continue'), + ), + ); +} + +@UseCase(name: 'on_gradient_background', type: AccentButton) +Widget buildAccentButtonOnGradientBackgroundUseCase(BuildContext context) { + return gradientBackground( + context: context, + child: AccentButton( + label: context.knobs.string(label: 'Label', initialValue: 'Continue'), + ), + startColor: context.knobs.color( + label: 'Start Color', + initialValue: Colors.deepPurple, + ), + endColor: context.knobs.color( + label: 'End Color', + initialValue: Colors.pinkAccent, + ), + ); +} + +@UseCase(name: 'on_solid_color_background', type: AccentButton) +Widget buildAccentButtonOnSolidColorBackgroundUseCase(BuildContext context) { + return solidColorBackground( + context: context, + child: AccentButton( + label: context.knobs.string(label: 'Label', initialValue: 'Continue'), + ), + color: context.knobs.color( + label: 'Background Color', + initialValue: const Color(0xFF1A1A2E), + ), + ); +} diff --git a/widgetbook/lib/atoms/action_button.dart b/widgetbook/lib/atoms/action_button.dart new file mode 100644 index 00000000..d13c8347 --- /dev/null +++ b/widgetbook/lib/atoms/action_button.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/action_button.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:widgetbook_workspace/widgetbook_usecases_templates.dart'; + +final _iconOptions = { + 'add': AppIcons.add(), + 'camera': AppIcons.camera(), + 'comment': AppIcons.comment(), + 'like': AppIcons.like(), + 'share': AppIcons.share(), + 'bookmarkOutline': AppIcons.bookmarkOutline(), + 'more': AppIcons.more(), + 'send': AppIcons.send(), + 'search': AppIcons.search(), + 'homeFilled': AppIcons.homeFilled(), +}; + +@UseCase(name: 'gradient', type: ActionButton) +Widget buildActionButtonInteractiveUseCase(BuildContext context) { + return gradientBackground( + context: context, + startColor: context.knobs.color( + label: 'startColor', + initialValue: Colors.blue, + ), + endColor: context.knobs.color( + label: 'endColor', + initialValue: Colors.purple, + ), + child: ActionButton( + icon: context.knobs.object.dropdown( + label: 'Icon', + initialOption: _iconOptions['like']!, + options: _iconOptions.values.toList(), + labelBuilder: (value) { + return _iconOptions.entries + .firstWhere((entry) => entry.value == value) + .key; + }, + ), + label: context.knobs.string(label: 'label', initialValue: '800'), + isActive: context.knobs.boolean(label: 'isActive', initialValue: false), + onPressed: () => print('Bookmark pressed'), + ), + ); +} diff --git a/widgetbook/lib/atoms/follow_buttons_and_toggle.dart b/widgetbook/lib/atoms/follow_buttons_and_toggle.dart new file mode 100644 index 00000000..bc44c8f6 --- /dev/null +++ b/widgetbook/lib/atoms/follow_buttons_and_toggle.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/toggles/follow_button.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/toggles/glass_follow_button.dart'; + +@UseCase(name: 'follow_states', type: FollowButton) +Widget buildFollowButtonFollowStatesUseCase(BuildContext context) { + final isFollowing = context.knobs.boolean( + label: 'is_following', + initialValue: false, + ); + return Center( + child: FollowButton( + isFollowing: isFollowing, + onFollow: () => print('Follow pressed'), + onUnfollow: () => print('Unfollow pressed'), + followText: context.knobs.string( + label: 'follow_text', + initialValue: 'Follow', + ), + unfollowText: context.knobs.string( + label: 'unfollow_text', + initialValue: 'Unfollow', + ), + ), + ); +} + +@UseCase(name: 'glass_follow_states', type: GlassFollowButton) +Widget buildGlassFollowButtonGlassFollowStatesUseCase(BuildContext context) { + final isFollowing = context.knobs.boolean( + label: 'is_following', + initialValue: false, + ); + return Center( + child: GlassFollowButton( + isFollowing: isFollowing, + onFollow: () => print('Follow pressed'), + onUnfollow: () => print('Unfollow pressed'), + followText: context.knobs.string( + label: 'follow_text', + initialValue: 'Follow', + ), + unfollowText: context.knobs.string( + label: 'unfollow_text', + initialValue: 'Unfollow', + ), + ), + ); +} diff --git a/widgetbook/lib/atoms/icons_showcase.dart b/widgetbook/lib/atoms/icons_showcase.dart new file mode 100644 index 00000000..982ef09f --- /dev/null +++ b/widgetbook/lib/atoms/icons_showcase.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +@UseCase(name: 'grid', type: AppIcons) +Widget buildAppIconsGridUseCase(BuildContext context) { + final size = context.knobs.double.slider( + label: 'icon_size', + initialValue: 28, + min: 12, + max: 64, + divisions: 52, + ); + final color = context.knobs.colorOrNull(label: 'tint_color'); + final icons = [ + AppIcons.add(size: size, color: color), + AppIcons.plus(size: size, color: color), + AppIcons.search(size: size, color: color), + AppIcons.comment(size: size, color: color), + AppIcons.like(size: size, color: color), + AppIcons.messagesFilled(size: size, color: color), + AppIcons.bookmarkOutline(size: size, color: color), + AppIcons.bookmarkFilled(size: size, color: color), + AppIcons.camera(size: size, color: color), + AppIcons.arrowRight(size: size, color: color), + AppIcons.pin(size: size, color: color), + AppIcons.music(size: size, color: color), + AppIcons.folderMini(size: size, color: color), + AppIcons.play(size: size, color: color), + AppIcons.play1(size: size, color: color), + AppIcons.micro(size: size, color: color), + AppIcons.tag(size: size, color: color), + AppIcons.hashtag(size: size, color: color), + AppIcons.cancel(size: size, color: color), + ]; + return Center(child: Wrap(spacing: 20, runSpacing: 20, children: icons)); +} diff --git a/widgetbook/lib/atoms/interactive_pressable_and_tags.dart b/widgetbook/lib/atoms/interactive_pressable_and_tags.dart new file mode 100644 index 00000000..7d35581c --- /dev/null +++ b/widgetbook/lib/atoms/interactive_pressable_and_tags.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/tags/feed_tag.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/tags/hashtag.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/tags/tag.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +@UseCase(name: 'default', type: InteractivePressable) +Widget buildInteractivePressableDefaultUseCase(BuildContext context) { + return Center( + child: InteractivePressable( + pressedScale: context.knobs.double.slider( + label: 'pressedScale', + initialValue: 0.93, + min: 0.8, + max: 1.0, + divisions: 20, + ), + overlayColor: context.knobs.color( + label: 'overlayColor', + initialValue: Colors.black26, + ), + duration: Duration( + milliseconds: context.knobs.int.slider( + label: 'duration_ms', + initialValue: 120, + min: 60, + max: 400, + divisions: 34, + ), + ), + onTap: () => print('InteractivePressable tapped'), + borderRadius: BorderRadius.circular(12), + child: Container( + width: 160, + height: 60, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.blueGrey.shade300, + borderRadius: BorderRadius.circular(12), + ), + child: Text( + context.knobs.string(label: 'label', initialValue: 'Press Me'), + style: const TextStyle(fontWeight: FontWeight.bold), + ), + ), + ), + ); +} + +@UseCase(name: 'tag_basic', type: Tag) +Widget buildTagBasicUseCase(BuildContext context) { + return Center( + child: ConstrainedBox( + constraints: BoxConstraints( + maxWidth: context.knobs.double.slider( + label: 'max_width', + initialValue: 200, + min: 100, + max: 400, + divisions: 30, + ), + ), + child: Tag( + mainText: context.knobs.string(label: 'main', initialValue: 'Main'), + secondaryText: context.knobs.string( + label: 'secondary', + initialValue: '1.8M', + ), + onTap: () => print('Tag tapped'), + ), + ), + ); +} + +@UseCase(name: 'glassmorphic_tag_with_delete', type: GlassmorphicTag) +Widget buildGlassmorphicTagWithDeleteUseCase(BuildContext context) { + return Center( + child: ConstrainedBox( + constraints: BoxConstraints( + maxWidth: context.knobs.double.slider( + label: 'max_width', + initialValue: 200, + min: 100, + max: 400, + divisions: 30, + ), + ), + child: GlassmorphicTag( + label: context.knobs.string(label: 'label', initialValue: 'hashtag'), + onTap: () => print('GlassmorphicTag tapped'), + onDeleted: + context.knobs.boolean(label: 'show_delete', initialValue: true) + ? () => print('Delete pressed') + : null, + ), + ), + ); +} + +@UseCase(name: 'feed_tag_selected_states', type: FeedTag) +Widget buildFeedTagSelectedStatesUseCase(BuildContext context) { + final selected = context.knobs.boolean(label: 'selected', initialValue: true); + return Center( + child: ConstrainedBox( + constraints: BoxConstraints( + maxWidth: context.knobs.double.slider( + label: 'max_width', + initialValue: 300, + min: 200, + max: 500, + divisions: 30, + ), + ), + child: Wrap( + spacing: 24, + runSpacing: 16, + children: [ + FeedTag( + id: '1', + text: 'Art', + selected: selected, + onTap: () => print('Art tapped'), + ), + FeedTag( + id: '2', + text: 'Tech', + selected: !selected, + onTap: () => print('Tech tapped'), + ), + ], + ), + ), + ); +} diff --git a/widgetbook/lib/atoms/live_button.dart b/widgetbook/lib/atoms/live_button.dart new file mode 100644 index 00000000..7926e825 --- /dev/null +++ b/widgetbook/lib/atoms/live_button.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; + +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/live_button.dart'; + +import 'package:widgetbook_workspace/widgetbook_usecases_templates.dart'; + +// Helper map to provide a selection of icons for the knob. +final _iconOptions = { + 'add': AppIcons.add(), + 'camera': AppIcons.camera(), + 'comment': AppIcons.comment(), + 'like': AppIcons.like(), + 'share': AppIcons.share(), + 'bookmarkOutline': AppIcons.bookmarkOutline(), + 'more': AppIcons.more(), + 'send': AppIcons.send(), + 'search': AppIcons.search(), + 'homeFilled': AppIcons.homeFilled(), +}; + +@UseCase(name: 'on_image_background', type: LiveButton) +Widget buildLiveButtonOnImageBackgroundUseCase(BuildContext context) { + return imageBackground( + context: context, + child: LiveButton( + onTap: () => print('LiveButton tapped!'), + child: context.knobs.object.dropdown( + label: 'Icon', + initialOption: _iconOptions['camera']!, + options: _iconOptions.values.toList(), + labelBuilder: (value) { + return _iconOptions.entries + .firstWhere((entry) => entry.value == value) + .key; + }, + ), + ), + ); +} + +@UseCase(name: 'on_gradient_background', type: LiveButton) +Widget buildLiveButtonOnGradientBackgroundUseCase(BuildContext context) { + return gradientBackground( + context: context, + child: LiveButton( + onTap: () => print('LiveButton tapped!'), + child: context.knobs.object.dropdown( + label: 'Icon', + initialOption: _iconOptions['camera']!, + options: _iconOptions.values.toList(), + labelBuilder: (value) { + return _iconOptions.entries + .firstWhere((entry) => entry.value == value) + .key; + }, + ), + ), + startColor: context.knobs.color( + label: 'Start Color', + initialValue: Colors.deepPurple, + ), + endColor: context.knobs.color( + label: 'End Color', + initialValue: Colors.pinkAccent, + ), + ); +} + +@UseCase(name: 'on_solid_color_background', type: LiveButton) +Widget buildLiveButtonOnSolidColorBackgroundUseCase(BuildContext context) { + return solidColorBackground( + context: context, + child: LiveButton( + onTap: () => print('LiveButton tapped!'), + child: context.knobs.object.dropdown( + label: 'Icon', + initialOption: _iconOptions['camera']!, + options: _iconOptions.values.toList(), + labelBuilder: (value) { + return _iconOptions.entries + .firstWhere((entry) => entry.value == value) + .key; + }, + ), + ), + color: context.knobs.color( + label: 'Background Color', + initialValue: const Color(0xFF1A1A2E), + ), + ); +} diff --git a/widgetbook/lib/atoms/long_button.dart b/widgetbook/lib/atoms/long_button.dart new file mode 100644 index 00000000..7cca3a15 --- /dev/null +++ b/widgetbook/lib/atoms/long_button.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +// Assuming the LongButton component is located at this path +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/long_button.dart'; + +@UseCase( + name: 'no_ui', + type: LongButton, +) +Widget buildLongButtonNoUIUseCase(BuildContext context) { + return LongButton( + label: context.knobs.string( + label: 'Label', + initialValue: 'Continue', + ), + onPressed: () => print('LongButton was pressed.'), + ); +} + + +@UseCase( + name: 'resizable_parent', + type: LongButton, +) +Widget buildLongButtonInAResizableContainerUseCase(BuildContext context) { + return Center( + child: Container( + width: context.knobs.double.slider( + label: 'Parent Width', + initialValue: 250, + min: 100, + max: 400, + divisions: 30, + ), + height: context.knobs.double.slider( + label: 'Parent Height', + initialValue: 80, + min: 40, + max: 200, + divisions: 16, + ), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.shade400), + color: Colors.grey.shade200, + ), + child: Center( + child: LongButton( + label: context.knobs.string( + label: 'Label', + initialValue: 'Resizable Button', + ), + onPressed: () => print('Button in resizable container pressed.'), + ), + ), + ), + ); +} \ No newline at end of file diff --git a/widgetbook/lib/atoms/profile_tab_item.dart b/widgetbook/lib/atoms/profile_tab_item.dart new file mode 100644 index 00000000..24dc792a --- /dev/null +++ b/widgetbook/lib/atoms/profile_tab_item.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/profile_tab_item.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; + +@UseCase(name: 'selected', type: ProfileTabItem) +Widget buildProfileTabItemSelectedUseCase(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.surface, + child: ProfileTabItem( + icon: AppIcons.profileGrid(), + filledIcon: AppIcons.profileGrid(), + isSelected: true, + onTap: () => print('Tab tapped'), + ), + ); +} + +@UseCase(name: 'unselected', type: ProfileTabItem) +Widget buildProfileTabItemUnselectedUseCase(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.surface, + child: ProfileTabItem( + icon: AppIcons.bookmarkOutline(), + filledIcon: AppIcons.bookmarkFilled(), + isSelected: false, + onTap: () => print('Tab tapped'), + ), + ); +} + +@UseCase(name: 'interactive', type: ProfileTabItem) +Widget buildProfileTabItemInteractiveUseCase(BuildContext context) { + return _InteractiveProfileTabItemDemo(); +} + +class _InteractiveProfileTabItemDemo extends StatefulWidget { + @override + State<_InteractiveProfileTabItemDemo> createState() => + _InteractiveProfileTabItemDemoState(); +} + +class _InteractiveProfileTabItemDemoState + extends State<_InteractiveProfileTabItemDemo> { + bool _isSelected = false; + + @override + Widget build(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.surface, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _isSelected, + onTap: () { + setState(() => _isSelected = !_isSelected); + print('Tab tapped: ${_isSelected ? "selected" : "unselected"}'); + }, + ), + const SizedBox(height: 16), + Text( + 'Status: ${_isSelected ? "Selected" : "Unselected"}', + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + ); + } +} + +@UseCase(name: 'multiple_tabs', type: ProfileTabItem) +Widget buildProfileTabItemMultipleTabsUseCase(BuildContext context) { + return _MultipleTabsDemo(); +} + +class _MultipleTabsDemo extends StatefulWidget { + @override + State<_MultipleTabsDemo> createState() => _MultipleTabsDemoState(); +} + +class _MultipleTabsDemoState extends State<_MultipleTabsDemo> { + int _selectedIndex = 0; + + @override + Widget build(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.surface, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _selectedIndex == 0, + onTap: () { + setState(() => _selectedIndex = 0); + print('Videos tab selected'); + }, + ), + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _selectedIndex == 1, + onTap: () { + setState(() => _selectedIndex = 1); + print('Photos tab selected'); + }, + ), + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _selectedIndex == 2, + onTap: () { + setState(() => _selectedIndex = 2); + print('Grid tab selected'); + }, + ), + ], + ), + const SizedBox(height: 16), + Text( + 'Selected tab: $_selectedIndex', + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + ); + } +} diff --git a/widgetbook/lib/atoms/text_button.dart b/widgetbook/lib/atoms/text_button.dart new file mode 100644 index 00000000..64b621e6 --- /dev/null +++ b/widgetbook/lib/atoms/text_button.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart' hide TextButton; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/buttons/text_button.dart'; +import 'package:widgetbook_workspace/widgetbook_usecases_templates.dart'; + +@UseCase(name: 'on_image_background', type: TextButton) +Widget buildTextButtonOnImageBackgroundUseCase(BuildContext context) { + return imageBackground( + context: context, + child: TextButton( + label: context.knobs.string(label: 'Label', initialValue: 'Continue'), + ), + ); +} + +@UseCase(name: 'on_gradient_background', type: TextButton) +Widget buildTextButtonOnGradientBackgroundUseCase(BuildContext context) { + return gradientBackground( + context: context, + child: TextButton( + label: context.knobs.string(label: 'Label', initialValue: 'Continue'), + ), + startColor: context.knobs.color( + label: 'Start Color', + initialValue: context.knobs.color( + label: 'Start Color', + initialValue: Colors.deepPurple, + ), + ), + endColor: context.knobs.color( + label: 'End Color', + initialValue: context.knobs.color( + label: 'End Color', + initialValue: Colors.pinkAccent, + ), + ), + ); +} + +@UseCase(name: 'on_solid_color_background', type: TextButton) +Widget buildTextButtonOnSolidColorBackgroundUseCase(BuildContext context) { + return solidColorBackground( + context: context, + child: TextButton( + label: context.knobs.string(label: 'Label', initialValue: 'Continue'), + ), + color: context.knobs.color( + label: 'Background Color', + initialValue: const Color(0xFF1A1A2E), + ), + ); +} diff --git a/widgetbook/lib/atoms/toggle.dart b/widgetbook/lib/atoms/toggle.dart new file mode 100644 index 00000000..89031de0 --- /dev/null +++ b/widgetbook/lib/atoms/toggle.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/toggles/toggle.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +@UseCase(name: 'interactive', type: Toggle) +Widget buildToggleInteractiveUseCase(BuildContext context) { + final initialValue = context.knobs.boolean( + label: 'initial_value', + initialValue: true, + ); + return _ToggleDemo(initialValue: initialValue); +} + +class _ToggleDemo extends StatefulWidget { + const _ToggleDemo({required this.initialValue}); + final bool initialValue; + @override + State<_ToggleDemo> createState() => _ToggleDemoState(); +} + +class _ToggleDemoState extends State<_ToggleDemo> { + late bool value = widget.initialValue; + + @override + Widget build(BuildContext context) { + return Center( + child: Toggle( + value: value, + onChanged: (v) { + setState(() => value = v); + print('Toggle changed: $v'); + }, + ), + ); + } +} diff --git a/widgetbook/lib/main.dart b/widgetbook/lib/main.dart new file mode 100644 index 00000000..fb8edeb7 --- /dev/null +++ b/widgetbook/lib/main.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook_workspace/widgetbook.dart'; + +// no main = no custom fonts hahaha +void main() { + runApp(const WidgetbookApp()); +} \ No newline at end of file diff --git a/widgetbook/lib/molecules/feed_tag_list.dart b/widgetbook/lib/molecules/feed_tag_list.dart new file mode 100644 index 00000000..68000795 --- /dev/null +++ b/widgetbook/lib/molecules/feed_tag_list.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/feed_tag_list.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +@UseCase(name: 'interactive', type: FeedTagList) +Widget buildFeedTagListInteractiveUseCase(BuildContext context) { + final tagCount = context.knobs.int.slider( + label: 'tag_count', + initialValue: 6, + min: 2, + max: 12, + divisions: 10, + ); + final selectedIndex = context.knobs.int.slider( + label: 'selected_index', + initialValue: 0, + min: 0, + max: tagCount - 1, + divisions: tagCount - 1, + ); + final tags = List.generate(tagCount, (i) => (id: 'tag_$i', text: 'Tag $i')); + return Center( + child: Container( + constraints: BoxConstraints( + maxWidth: context.knobs.double.slider( + label: 'max_width', + initialValue: 400, + min: 200, + max: 800, + ), + ), + child: FeedTagList( + tags: tags, + selectedTagId: tags[selectedIndex].id, + onTagTap: (id) => print('Tag tapped: $id'), + ), + ), + ); +} diff --git a/widgetbook/lib/molecules/glass_input.dart b/widgetbook/lib/molecules/glass_input.dart new file mode 100644 index 00000000..7721423b --- /dev/null +++ b/widgetbook/lib/molecules/glass_input.dart @@ -0,0 +1,179 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/glass_input.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +final _chatControllerProvider = Provider.autoDispose(( + ref, +) { + final c = TextEditingController(); + ref.onDispose(c.dispose); + return c; +}); +final _chatMessagesProvider = StateProvider.autoDispose>( + (_) => const [], +); + +@UseCase(name: 'comment', type: GlassInput) +Widget buildGlassInputCommentUseCase(BuildContext context) { + return Center( + child: Container( + constraints: BoxConstraints( + maxWidth: context.knobs.double.slider( + label: 'width', + initialValue: 210, + min: 160, + max: 400, + divisions: 24, + ), + ), + child: GlassInput.comment( + hintText: context.knobs.string( + label: 'hint', + initialValue: 'Add a comment...', + ), + leadingWidgets: [ + if (context.knobs.boolean(label: 'show_avatar', initialValue: true)) + const CircleAvatar(radius: 10), + ], + actionWidgets: [ + if (context.knobs.boolean( + label: 'show_action_icon', + initialValue: true, + )) + AppIcons.smiley(), + ], + ), + ), + ); +} + +@UseCase(name: 'search', type: GlassInput) +Widget buildGlassInputSearchUseCase(BuildContext context) { + return Center( + child: SizedBox( + width: context.knobs.double.slider( + label: 'width', + initialValue: 280, + min: 160, + max: 400, + divisions: 24, + ), + child: GlassInput.search( + hintText: context.knobs.string( + label: 'hint', + initialValue: 'Search...', + ), + leadingWidgets: [ + const Icon(Icons.search, size: 18, color: Colors.white70), + ], + actionWidgets: [ + if (context.knobs.boolean(label: 'show_clear', initialValue: true)) + GestureDetector( + onTap: () => print('Clear pressed'), + child: const Icon(Icons.close, size: 16, color: Colors.white70), + ), + ], + ), + ), + ); +} + +@UseCase(name: 'chat_interactive', type: GlassInput) +Widget buildGlassInputChatInteractiveUseCase(BuildContext context) { + return ProviderScope( + child: Center( + child: _ChatDemo( + showSend: context.knobs.boolean(label: 'show_send', initialValue: true), + placeholder: context.knobs.string( + label: 'hint', + initialValue: 'Message...', + ), + ), + ), + ); +} + +class _ChatDemo extends ConsumerWidget { + const _ChatDemo({required this.showSend, required this.placeholder}); + final bool showSend; + final String placeholder; + @override + Widget build(BuildContext context, WidgetRef ref) { + final controller = ref.watch(_chatControllerProvider); + final messages = ref.watch(_chatMessagesProvider); + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 160, + width: 320, + child: DecoratedBox( + decoration: BoxDecoration( + color: Colors.white.withAlpha(20), + border: Border.all(color: Colors.white.withAlpha(40)), + borderRadius: BorderRadius.circular(12), + ), + child: ListView.builder( + reverse: true, + padding: const EdgeInsets.all(8), + itemCount: messages.length, + itemBuilder: (context, index) { + final msg = messages[messages.length - 1 - index]; + return Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: DecoratedBox( + decoration: BoxDecoration( + color: Colors.white.withAlpha(30), + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Text( + msg, + style: const TextStyle( + fontSize: 11, + color: Colors.white, + ), + ), + ), + ), + ), + ); + }, + ), + ), + ), + const SizedBox(height: 16), + SizedBox( + width: 320, + child: GlassInput.chat( + controller: controller, + hintText: placeholder, + leadingWidgets: const [ + Icon(Icons.chat_bubble_outline, size: 18, color: Colors.white70), + ], + onSendMessage: showSend + ? () { + final text = controller.text.trim(); + if (text.isEmpty) return; + ref.read(_chatMessagesProvider.notifier).state = [ + ...messages, + text, + ]; + controller.clear(); + } + : null, + ), + ), + ], + ); + } +} diff --git a/widgetbook/lib/molecules/post_tile.dart b/widgetbook/lib/molecules/post_tile.dart new file mode 100644 index 00000000..fcdf7665 --- /dev/null +++ b/widgetbook/lib/molecules/post_tile.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/post_tile.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +const _demoThumbnail = 'https://picsum.photos/400/600'; + +@UseCase(name: 'default', type: PostTile) +Widget buildPostTileUseCase(BuildContext context) { + return Center( + child: SizedBox( + width: context.knobs.double.slider( + label: 'width', + initialValue: 150, + min: 100, + max: 300, + ), + height: context.knobs.double.slider( + label: 'height', + initialValue: 200, + min: 150, + max: 400, + ), + child: PostTile( + thumbnailUrl: context.knobs.string( + label: 'thumbnailUrl', + initialValue: _demoThumbnail, + ), + views: context.knobs.int.slider( + label: 'views', + initialValue: 1239, + min: 0, + max: 100000, + ), + seen: context.knobs.boolean(label: 'seen', initialValue: false), + nsfwBlur: context.knobs.boolean(label: 'nsfwBlur', initialValue: false), + onTap: () => print('PostTile tapped'), + ), + ), + ); +} + +@UseCase(name: 'seen', type: PostTile) +Widget buildPostTileSeenUseCase(BuildContext context) { + return Center( + child: SizedBox( + width: 150, + height: 200, + child: PostTile( + thumbnailUrl: _demoThumbnail, + views: context.knobs.int.slider( + label: 'views', + initialValue: 5420, + min: 0, + max: 100000, + ), + seen: true, + nsfwBlur: false, + onTap: () => print('Seen PostTile tapped'), + ), + ), + ); +} + +@UseCase(name: 'high_views', type: PostTile) +Widget buildPostTileHighViewsUseCase(BuildContext context) { + return Center( + child: SizedBox( + width: 150, + height: 200, + child: PostTile( + thumbnailUrl: _demoThumbnail, + views: context.knobs.int.input(label: 'views', initialValue: 1234567), + seen: context.knobs.boolean(label: 'seen', initialValue: false), + nsfwBlur: context.knobs.boolean(label: 'nsfwBlur', initialValue: false), + onTap: () => print('High views PostTile tapped'), + ), + ), + ); +} + +@UseCase(name: 'grid', type: PostTile) +Widget buildPostTileGridUseCase(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 8, + mainAxisSpacing: 8, + childAspectRatio: 0.75, + ), + itemCount: 12, + itemBuilder: (context, index) { + return PostTile( + thumbnailUrl: 'https://picsum.photos/400/600?random=$index', + views: (index + 1) * 1000, + seen: index % 3 == 0, + nsfwBlur: index % 5 == 0, + onTap: () => print('Grid PostTile $index tapped'), + ); + }, + ), + ); +} diff --git a/widgetbook/lib/molecules/story_circle.dart b/widgetbook/lib/molecules/story_circle.dart new file mode 100644 index 00000000..b95c8479 --- /dev/null +++ b/widgetbook/lib/molecules/story_circle.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/story_circle.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +const _demoImage = 'https://picsum.photos/200/200'; + +@UseCase(name: 'story', type: StoryCircle) +Widget buildStoryCircleStoryUseCase(BuildContext context) { + return Center( + child: StoryCircle.story( + userName: context.knobs.string(label: 'user', initialValue: 'alice'), + imageUrl: _demoImage, + ), + ); +} + +@UseCase(name: 'live', type: StoryCircle) +Widget buildStoryCircleLiveUseCase(BuildContext context) { + return Center( + child: StoryCircle.live( + userName: context.knobs.string(label: 'user', initialValue: 'streamer'), + imageUrl: _demoImage, + live: context.knobs.string(label: 'badge_text', initialValue: 'LIVE'), + ), + ); +} + +@UseCase(name: 'close_friends', type: StoryCircle) +Widget buildStoryCircleCloseFriendsUseCase(BuildContext context) { + return Center( + child: StoryCircle.cf( + userName: context.knobs.string(label: 'user', initialValue: 'buddy'), + imageUrl: _demoImage, + ), + ); +} + +@UseCase(name: 'create', type: StoryCircle) +Widget buildStoryCircleCreateUseCase(BuildContext context) { + return Center( + child: StoryCircle.create( + userName: context.knobs.string(label: 'user', initialValue: 'You'), + imageUrl: _demoImage, + ), + ); +} diff --git a/widgetbook/lib/molecules/suggested_profile.dart b/widgetbook/lib/molecules/suggested_profile.dart new file mode 100644 index 00000000..0d4da60d --- /dev/null +++ b/widgetbook/lib/molecules/suggested_profile.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/suggested_profile.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +const _demoImage = 'https://picsum.photos/200/200'; + +@UseCase(name: 'follow_card', type: SuggestedProfile) +Widget buildSuggestedProfileFollowCardUseCase(BuildContext context) { + final isFollowing = context.knobs.boolean( + label: 'is_following', + initialValue: false, + ); + return Center( + child: SuggestedProfile( + imageUrl: _demoImage, + userName: context.knobs.string( + label: 'user_name', + initialValue: 'Jane Doe', + ), + userHandle: context.knobs.string( + label: 'user_handle', + initialValue: '@janedoe', + ), + isFollowing: isFollowing, + onFollow: () => print('Follow'), + onUnfollow: () => print('Unfollow'), + ), + ); +} diff --git a/widgetbook/lib/organisms/bottom_nav_bar.dart b/widgetbook/lib/organisms/bottom_nav_bar.dart new file mode 100644 index 00000000..ee452207 --- /dev/null +++ b/widgetbook/lib/organisms/bottom_nav_bar.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/organisms/bottom_nav_bar.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +@UseCase(name: 'default', type: SparkBottomNavBar) +Widget buildSparkBottomNavBarUseCase(BuildContext context) { + final initialIndex = context.knobs.int.slider( + label: 'initialIndex', + initialValue: 0, + min: 0, + max: 4, + divisions: 4, + ); + + final avatarUrl = context.knobs.string( + label: 'avatarUrl', + initialValue: + 'https://picsum.photos/100/100?random=${DateTime.now().second % 10}', + ); + + final showImageBg = context.knobs.boolean( + label: 'imageBackground', + initialValue: false, + ); + + Widget background; + if (showImageBg) { + background = Image.network( + avatarUrl, + fit: BoxFit.cover, + errorBuilder: (c, e, s) => Container(color: Colors.grey.shade800), + ); + } else { + background = Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [Color(0xFF111214), Color(0xFF000000)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ); + } + + int selected = initialIndex; + + return StatefulBuilder( + builder: (ctx, setState) { + return Scaffold( + body: Stack( + children: [ + Positioned.fill(child: background), + Positioned.fill( + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + constraints: const BoxConstraints(maxWidth: 450), + child: SparkBottomNavBar( + currentIndex: selected, + onTap: (i) => setState(() => selected = i), + userAvatar: NetworkImage(avatarUrl), + ), + ), + ), + ), + ], + ), + ); + }, + ); +} diff --git a/widgetbook/lib/organisms/side_action_bar.dart b/widgetbook/lib/organisms/side_action_bar.dart new file mode 100644 index 00000000..a6731eb9 --- /dev/null +++ b/widgetbook/lib/organisms/side_action_bar.dart @@ -0,0 +1,394 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/organisms/side_action_bar.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +@UseCase(name: 'default', type: SparkSideActionBar) +Widget buildSparkSideActionBarUseCase(BuildContext context) { + final likeCount = context.knobs.string( + label: 'likeCount', + initialValue: '456k', + ); + final commentCount = context.knobs.string( + label: 'commentCount', + initialValue: '2.4k', + ); + final curateCount = context.knobs.string( + label: 'curateCount', + initialValue: '129', + ); + final shareCount = context.knobs.string( + label: 'shareCount', + initialValue: '98', + ); + final isLiked = context.knobs.boolean(label: 'isLiked', initialValue: true); + final isCurated = context.knobs.boolean( + label: 'isCurated', + initialValue: false, + ); + + return _ScaffoldedBackground( + child: SparkSideActionBar( + likeCount: likeCount, + commentCount: commentCount, + curateCount: curateCount, + shareCount: shareCount, + isLiked: isLiked, + isCurated: isCurated, + onLike: () => print('Like tapped (current: $isLiked)'), + onComment: () => print('Comment tapped'), + onCurate: () => print('Curate tapped (current: $isCurated)'), + onShare: () => print('Share tapped'), + ), + ); +} + +@UseCase(name: 'empty_counts', type: SparkSideActionBar) +Widget buildSparkSideActionBarEmptyCountsUseCase(BuildContext context) { + final isLiked = context.knobs.boolean(label: 'isLiked', initialValue: false); + final isCurated = context.knobs.boolean( + label: 'isCurated', + initialValue: false, + ); + + return _ScaffoldedBackground( + child: SparkSideActionBar( + likeCount: '', + commentCount: '', + curateCount: '', + shareCount: '', + isLiked: isLiked, + isCurated: isCurated, + onLike: () => print('Like tapped'), + onComment: () => print('Comment tapped'), + onCurate: () => print('Curate tapped'), + onShare: () => print('Share tapped'), + ), + ); +} + +@UseCase(name: 'interactive_stateful', type: SparkSideActionBar) +Widget buildSparkSideActionBarInteractiveStatefulUseCase(BuildContext context) { + final startLiked = context.knobs.boolean( + label: 'startLiked', + initialValue: false, + ); + final startCurated = context.knobs.boolean( + label: 'startCurated', + initialValue: false, + ); + final likeCountStart = context.knobs.int.slider( + label: 'likeStart', + initialValue: 120, + min: 0, + max: 5000, + divisions: 50, + ); + final commentCountStart = context.knobs.int.slider( + label: 'commentStart', + initialValue: 30, + min: 0, + max: 5000, + divisions: 50, + ); + final curateCountStart = context.knobs.int.slider( + label: 'curateStart', + initialValue: 12, + min: 0, + max: 5000, + divisions: 50, + ); + final shareCountStart = context.knobs.int.slider( + label: 'shareStart', + initialValue: 8, + min: 0, + max: 5000, + divisions: 50, + ); + + return StatefulBuilder( + builder: (ctx, setState) { + var liked = startLiked; + var curated = startCurated; + var likeCount = likeCountStart; + var curateCount = curateCountStart; + + return _ScaffoldedBackground( + child: SparkSideActionBar( + likeCount: likeCount.toString(), + commentCount: commentCountStart.toString(), + curateCount: curateCount.toString(), + shareCount: shareCountStart.toString(), + isLiked: liked, + isCurated: curated, + onLike: () { + setState(() { + liked = !liked; + likeCount += liked ? 1 : -1; + }); + print('Like toggled -> $liked (count: $likeCount)'); + }, + onCurate: () { + setState(() { + curated = !curated; + curateCount += curated ? 1 : -1; + }); + print('Curate toggled -> $curated (count: $curateCount)'); + }, + onComment: () => print('Comment tapped'), + onShare: () => print('Share tapped'), + ), + ); + }, + ); +} + +@UseCase(name: 'dense_spacing', type: SparkSideActionBar) +Widget buildSparkSideActionBarDenseSpacingUseCase(BuildContext context) { + // This variant demonstrates how the bar might look when placed tighter to edges. + final scale = context.knobs.double.slider( + label: 'scale', + initialValue: 0.85, + min: 0.5, + max: 1.2, + divisions: 14, + ); + return Transform.scale( + scale: scale, + child: _ScaffoldedBackground( + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 4), + child: const SparkSideActionBar( + likeCount: '12', + commentCount: '3', + curateCount: '4', + shareCount: '1', + isLiked: true, + isCurated: true, + ), + ), + ); +} + +@UseCase(name: 'curate_popover', type: SparkSideActionBar) +Widget buildSparkSideActionBarCuratePopoverUseCase(BuildContext context) { + final likeCount = context.knobs.int.slider( + label: 'likes', + initialValue: 25, + min: 0, + max: 999, + divisions: 50, + ); + final commentCount = context.knobs.int.slider( + label: 'comments', + initialValue: 8, + min: 0, + max: 500, + divisions: 50, + ); + final shareCount = context.knobs.int.slider( + label: 'shares', + initialValue: 2, + min: 0, + max: 500, + divisions: 50, + ); + + return StatefulBuilder( + builder: (ctx, setState) { + var curated = false; + var curateCount = 5; + return _ScaffoldedBackground( + child: SparkSideActionBar( + likeCount: likeCount.toString(), + commentCount: commentCount.toString(), + curateCount: curateCount.toString(), + shareCount: shareCount.toString(), + isLiked: false, + isCurated: curated, + curateDestinations: [ + CurateDestination( + 'Feed 1', + onSelected: () => print('Feed 1 selected'), + ), + CurateDestination( + 'Feed 2', + onSelected: () => print('Feed 2 selected'), + ), + CurateDestination( + 'Ideas', + onSelected: () => print('Ideas selected'), + ), + ], + onCurate: () { + setState(() { + curated = true; + curateCount += 1; + }); + print('Curated! Total: $curateCount'); + }, + onComment: () => print('Comment tapped'), + onLike: () => print('Like tapped'), + onShare: () => print('Share tapped'), + ), + ); + }, + ); +} + +@UseCase(name: 'with_image_background', type: SparkSideActionBar) +Widget buildSparkSideActionBarWithImageBackgroundUseCase(BuildContext context) { + final imageUrl = context.knobs.string( + label: 'imageUrl', + initialValue: + 'https://picsum.photos/600/1200?random=${DateTime.now().millisecond % 20}', + ); + + final likeCount = context.knobs.string( + label: 'likeCount', + initialValue: '2.4k', + ); + + final commentCount = context.knobs.string( + label: 'commentCount', + initialValue: '156', + ); + + final curateCount = context.knobs.string( + label: 'curateCount', + initialValue: '42', + ); + + final shareCount = context.knobs.string( + label: 'shareCount', + initialValue: '89', + ); + + final isLiked = context.knobs.boolean(label: 'isLiked', initialValue: true); + + final isCurated = context.knobs.boolean( + label: 'isCurated', + initialValue: false, + ); + + return StatefulBuilder( + builder: (ctx, setState) { + var liked = isLiked; + var curated = isCurated; + + return Scaffold( + backgroundColor: Colors.black, + body: Stack( + children: [ + Positioned.fill( + child: Image.network( + imageUrl, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Container( + color: Colors.grey.shade900, + child: const Center( + child: Icon( + Icons.broken_image, + color: Colors.white54, + size: 64, + ), + ), + ); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return Container( + color: Colors.grey.shade900, + child: Center( + child: CircularProgressIndicator( + value: loadingProgress.expectedTotalBytes != null + ? loadingProgress.cumulativeBytesLoaded / + loadingProgress.expectedTotalBytes! + : null, + ), + ), + ); + }, + ), + ), + Positioned( + right: 16, + bottom: 100, + child: SparkSideActionBar( + likeCount: likeCount, + commentCount: commentCount, + curateCount: curateCount, + shareCount: shareCount, + isLiked: liked, + isCurated: curated, + curateDestinations: [ + CurateDestination( + 'Feed 1', + onSelected: () => print('Feed 1 selected'), + ), + CurateDestination( + 'Feed 2', + onSelected: () => print('Feed 2 selected'), + ), + CurateDestination( + 'Feed 3', + onSelected: () => print('Feed 3 selected'), + ), + ], + onLike: () { + setState(() => liked = !liked); + print('Like toggled: $liked'); + }, + onComment: () => print('Comment tapped'), + onCurate: () { + setState(() => curated = true); + print('Curated!'); + }, + onShare: () => print('Share tapped'), + ), + ), + ], + ), + ); + }, + ); +} + +class _ScaffoldedBackground extends StatelessWidget { + const _ScaffoldedBackground({ + required this.child, + this.padding = const EdgeInsets.all(16), + }); + final Widget child; + final EdgeInsets padding; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: SafeArea( + child: Stack( + children: [ + Positioned.fill( + child: DecoratedBox( + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [Color(0xFF0E0F11), Color(0xFF050506)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + ), + Positioned( + bottom: padding.bottom, + right: padding.right, + top: padding.top, + child: Align(alignment: Alignment.centerRight, child: child), + ), + ], + ), + ), + ); + } +} diff --git a/widgetbook/lib/organisms/sticky_profile_tab_bar.dart b/widgetbook/lib/organisms/sticky_profile_tab_bar.dart new file mode 100644 index 00000000..0b3c3bd1 --- /dev/null +++ b/widgetbook/lib/organisms/sticky_profile_tab_bar.dart @@ -0,0 +1,195 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/profile_tab_item.dart'; +import 'package:sparksocial/src/core/design_system/components/molecules/profile_tab_bar.dart'; +import 'package:sparksocial/src/core/design_system/components/organisms/sticky_profile_tab_bar.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; +import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; + +@UseCase(name: 'default', type: StickyProfileTabBar) +Widget buildStickyProfileTabBarUseCase(BuildContext context) { + return _StickyTabBarDemo(); +} + +class _StickyTabBarDemo extends StatefulWidget { + @override + State<_StickyTabBarDemo> createState() => _StickyTabBarDemoState(); +} + +class _StickyTabBarDemoState extends State<_StickyTabBarDemo> { + int _selectedIndex = 0; + + @override + Widget build(BuildContext context) { + return CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Container( + height: 300, + color: Theme.of(context).colorScheme.surfaceContainerHighest, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(FluentIcons.person_24_filled, size: 80), + const SizedBox(height: 16), + Text( + 'Profile Header', + style: Theme.of(context).textTheme.headlineMedium, + ), + const SizedBox(height: 8), + Text( + 'Scroll down to see sticky tab bar', + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + ), + ), + ), + SliverPersistentHeader( + pinned: true, + delegate: StickyProfileTabBar( + child: ProfileTabBar( + selectedIndex: _selectedIndex, + tabs: [ + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _selectedIndex == 0, + onTap: () { + setState(() => _selectedIndex = 0); + print('Videos tab selected'); + }, + ), + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _selectedIndex == 1, + onTap: () { + setState(() => _selectedIndex = 1); + print('Photos tab selected'); + }, + ), + ], + ), + ), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => Container( + height: 100, + margin: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Text( + '${_selectedIndex == 0 ? "Video" : "Photo"} Item ${index + 1}', + style: Theme.of(context).textTheme.bodyLarge, + ), + ), + ), + childCount: 20, + ), + ), + ], + ); + } +} + +@UseCase(name: 'custom_height', type: StickyProfileTabBar) +Widget buildStickyProfileTabBarCustomHeightUseCase(BuildContext context) { + return _StickyCustomHeightDemo(); +} + +class _StickyCustomHeightDemo extends StatefulWidget { + @override + State<_StickyCustomHeightDemo> createState() => + _StickyCustomHeightDemoState(); +} + +class _StickyCustomHeightDemoState extends State<_StickyCustomHeightDemo> { + int _selectedIndex = 0; + + @override + Widget build(BuildContext context) { + return CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Container( + height: 300, + color: Theme.of(context).colorScheme.surfaceContainerHighest, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(FluentIcons.person_24_filled, size: 80), + const SizedBox(height: 16), + Text( + 'Profile Header', + style: Theme.of(context).textTheme.headlineMedium, + ), + const SizedBox(height: 8), + Text( + 'Custom height (70px) sticky tab bar', + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + ), + ), + ), + SliverPersistentHeader( + pinned: true, + delegate: StickyProfileTabBar( + height: 70.0, + child: ProfileTabBar( + selectedIndex: _selectedIndex, + tabs: [ + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _selectedIndex == 0, + onTap: () { + setState(() => _selectedIndex = 0); + print('Videos tab selected'); + }, + ), + ProfileTabItem( + icon: AppIcons.profileTagged(), + filledIcon: AppIcons.profileTagged(), + isSelected: _selectedIndex == 1, + onTap: () { + setState(() => _selectedIndex = 1); + print('Photos tab selected'); + }, + ), + ], + ), + ), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => Container( + height: 100, + margin: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Text( + '${_selectedIndex == 0 ? "Video" : "Photo"} Item ${index + 1}', + style: Theme.of(context).textTheme.bodyLarge, + ), + ), + ), + childCount: 20, + ), + ), + ], + ); + } +} diff --git a/widgetbook/lib/templates/info_bar_template.dart b/widgetbook/lib/templates/info_bar_template.dart new file mode 100644 index 00000000..bcb6a18c --- /dev/null +++ b/widgetbook/lib/templates/info_bar_template.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/templates/info_bar_template.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as wb; + +@wb.UseCase(name: 'default', type: InfoBarTemplate) +Widget buildInfoBarTemplateUseCase(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(16), + child: InfoBarTemplate( + displayName: 'Katie Middow', + handle: 'katiemiddow.sprk.so', + avatarUrl: 'https://picsum.photos/100', + description: "This is my last creation, I'm happy to introduce...", + music: 'The Weeknd - Blinding Lights', + informLabels: const ['Sensitive content'], + showFollowButton: true, + onFollow: () {}, + altAvailable: true, + onAltTap: () {}, + ), + ), + ), + ); +} diff --git a/widgetbook/lib/templates/profile_page_template.dart b/widgetbook/lib/templates/profile_page_template.dart new file mode 100644 index 00000000..ab4963b1 --- /dev/null +++ b/widgetbook/lib/templates/profile_page_template.dart @@ -0,0 +1,427 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:sparksocial/src/core/design_system/templates/profile_page_template.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +@UseCase(name: 'default_tabs', type: ProfilePageTemplate) +Widget buildProfilePageTemplateDefaultTabsUseCase(BuildContext context) { + return _DefaultTabsDemo(); +} + +class _DefaultTabsDemo extends StatefulWidget { + @override + State<_DefaultTabsDemo> createState() => _DefaultTabsDemoState(); +} + +class _DefaultTabsDemoState extends State<_DefaultTabsDemo> { + int _selectedTabIndex = 0; + + @override + Widget build(BuildContext context) { + return ProfilePageTemplate( + displayName: 'Katie Middow', + handle: 'katiemiddow.sprk.so', + postsCount: '5', + followersCount: '3.6k', + followingCount: '230', + avatarUrl: 'https://picsum.photos/200/200', + description: + 'Built different... but mostly out of snacks 🍕\nwww.website.com', + links: ['www.website.com'], + hasStories: true, + isCurrentUser: true, + isEarlySupporter: false, + onAvatarTap: () => print('Avatar tapped'), + onFollowersTap: () => print('Followers tapped'), + onFollowingTap: () => print('Following tapped'), + onEditTap: () => print('Edit profile tapped'), + onEarlySupporterTap: () => print('Early supporter badge tapped'), + onMentionTap: (username) => print('Mention tapped: $username'), + onAddStoryTap: () => print('Add story tapped'), + appBarActions: [ + IconButton( + icon: const Icon(FluentIcons.options_24_regular), + onPressed: () => print('Settings tapped'), + ), + ], + selectedTabIndex: _selectedTabIndex, + onTabChanged: (index) { + setState(() => _selectedTabIndex = index); + final tabNames = ['Grid', 'Curate', 'Likes', 'Tagged']; + print('Tab changed to: ${tabNames[index]}'); + }, + contentWidget: _MockContentWidget( + type: 'grid', + selectedTab: _selectedTabIndex, + ), + onRefresh: () async { + await Future.delayed(const Duration(seconds: 1)); + print('Refreshed'); + }, + tabsWidget: _MockTabsWidget(selectedIndex: 0), + ); + } +} + +@UseCase(name: 'current_user', type: ProfilePageTemplate) +Widget buildProfilePageTemplateCurrentUserUseCase(BuildContext context) { + return ProfilePageTemplate( + displayName: context.knobs.string( + label: 'displayName', + initialValue: 'Katie Middow', + ), + handle: context.knobs.string( + label: 'handle', + initialValue: 'katiemiddow.sprk.so', + ), + postsCount: context.knobs.string(label: 'postsCount', initialValue: '5'), + followersCount: context.knobs.string( + label: 'followersCount', + initialValue: '3.6k', + ), + followingCount: context.knobs.string( + label: 'followingCount', + initialValue: '230', + ), + avatarUrl: context.knobs.stringOrNull( + label: 'avatarUrl', + initialValue: 'https://picsum.photos/200/200', + ), + description: context.knobs.stringOrNull( + label: 'description', + initialValue: + 'Built different... but mostly out of snacks 🍕\nwww.website.com', + ), + links: ['www.website.com'], + hasStories: context.knobs.boolean(label: 'hasStories', initialValue: true), + isCurrentUser: true, + isEarlySupporter: context.knobs.boolean( + label: 'isEarlySupporter', + initialValue: false, + ), + onAvatarTap: () => print('Avatar tapped'), + onFollowersTap: () => print('Followers tapped'), + onFollowingTap: () => print('Following tapped'), + onEditTap: () => print('Edit profile tapped'), + onEarlySupporterTap: () => print('Early supporter badge tapped'), + onMentionTap: (username) => print('Mention tapped: $username'), + onAddStoryTap: () => print('Add story tapped'), + appBarActions: [ + IconButton( + icon: const Icon(FluentIcons.options_24_regular), + onPressed: () => print('Settings tapped'), + ), + ], + tabsWidget: _MockTabsWidget(selectedIndex: 0), + contentWidget: _MockContentWidget(type: 'grid'), + onRefresh: () async { + await Future.delayed(const Duration(seconds: 1)); + print('Refreshed'); + }, + ); +} + +@UseCase(name: 'other_user_not_following', type: ProfilePageTemplate) +Widget buildProfilePageTemplateOtherUserNotFollowingUseCase( + BuildContext context, +) { + return ProfilePageTemplate( + displayName: context.knobs.string( + label: 'displayName', + initialValue: 'John Smith', + ), + handle: context.knobs.string(label: 'handle', initialValue: 'johnsmith'), + postsCount: context.knobs.string(label: 'postsCount', initialValue: '42'), + followersCount: context.knobs.string( + label: 'followersCount', + initialValue: '15.2k', + ), + followingCount: context.knobs.string( + label: 'followingCount', + initialValue: '892', + ), + avatarUrl: context.knobs.stringOrNull( + label: 'avatarUrl', + initialValue: 'https://picsum.photos/200/201', + ), + description: context.knobs.stringOrNull( + label: 'description', + initialValue: + 'Professional photographer 📸\nTravel enthusiast ✈️\nFollow @travelgram for more', + ), + links: ['photography.io'], + hasStories: context.knobs.boolean(label: 'hasStories', initialValue: false), + isCurrentUser: false, + isFollowing: false, + isEarlySupporter: context.knobs.boolean( + label: 'isEarlySupporter', + initialValue: true, + ), + onAvatarTap: () => print('Avatar tapped'), + onFollowersTap: () => print('Followers tapped'), + onFollowingTap: () => print('Following tapped'), + onFollowTap: () => print('Follow tapped'), + onUnfollowTap: () => print('Unfollow tapped'), + onShareTap: () => print('Share tapped'), + onEarlySupporterTap: () => print('Early supporter badge tapped'), + onMentionTap: (username) => print('Mention tapped: $username'), + appBarActions: [ + IconButton( + icon: const Icon(FluentIcons.more_vertical_24_regular), + onPressed: () => print('More options tapped'), + ), + ], + tabsWidget: _MockTabsWidget(selectedIndex: 0), + contentWidget: _MockContentWidget(type: 'grid'), + onRefresh: () async { + await Future.delayed(const Duration(seconds: 1)); + print('Refreshed'); + }, + ); +} + +@UseCase(name: 'other_user_following', type: ProfilePageTemplate) +Widget buildProfilePageTemplateOtherUserFollowingUseCase(BuildContext context) { + return ProfilePageTemplate( + displayName: context.knobs.string( + label: 'displayName', + initialValue: 'Sarah Johnson', + ), + handle: context.knobs.string(label: 'handle', initialValue: 'sarahjohnson'), + postsCount: context.knobs.string(label: 'postsCount', initialValue: '128'), + followersCount: context.knobs.string( + label: 'followersCount', + initialValue: '52.8k', + ), + followingCount: context.knobs.string( + label: 'followingCount', + initialValue: '1.2k', + ), + avatarUrl: context.knobs.stringOrNull( + label: 'avatarUrl', + initialValue: 'https://picsum.photos/200/202', + ), + description: context.knobs.stringOrNull( + label: 'description', + initialValue: + 'Digital artist & designer\n🎨 Creating magic daily\nCommissions open!', + ), + links: ['artportfolio.com', 'shop.art.com'], + hasStories: context.knobs.boolean(label: 'hasStories', initialValue: true), + isCurrentUser: false, + isFollowing: true, + isEarlySupporter: context.knobs.boolean( + label: 'isEarlySupporter', + initialValue: false, + ), + onAvatarTap: () => print('Avatar tapped'), + onFollowersTap: () => print('Followers tapped'), + onFollowingTap: () => print('Following tapped'), + onFollowTap: () => print('Follow tapped'), + onUnfollowTap: () => print('Unfollow tapped'), + onShareTap: () => print('Share tapped'), + onEarlySupporterTap: () => print('Early supporter badge tapped'), + onMentionTap: (username) => print('Mention tapped: $username'), + appBarActions: [ + IconButton( + icon: const Icon(FluentIcons.more_vertical_24_regular), + onPressed: () => print('More options tapped'), + ), + ], + tabsWidget: _MockTabsWidget(selectedIndex: 1), + contentWidget: _MockContentWidget(type: 'grid'), + onRefresh: () async { + await Future.delayed(const Duration(seconds: 1)); + print('Refreshed'); + }, + ); +} + +@UseCase(name: 'minimal_profile', type: ProfilePageTemplate) +Widget buildProfilePageTemplateMinimalProfileUseCase(BuildContext context) { + return ProfilePageTemplate( + displayName: context.knobs.string( + label: 'displayName', + initialValue: 'New User', + ), + handle: context.knobs.string(label: 'handle', initialValue: 'newuser'), + postsCount: context.knobs.string(label: 'postsCount', initialValue: '0'), + followersCount: context.knobs.string( + label: 'followersCount', + initialValue: '0', + ), + followingCount: context.knobs.string( + label: 'followingCount', + initialValue: '0', + ), + hasStories: false, + isCurrentUser: false, + isFollowing: false, + onAvatarTap: () => print('Avatar tapped'), + onFollowersTap: () => print('Followers tapped'), + onFollowingTap: () => print('Following tapped'), + onFollowTap: () => print('Follow tapped'), + onUnfollowTap: () => print('Unfollow tapped'), + appBarActions: [ + IconButton( + icon: const Icon(FluentIcons.more_vertical_24_regular), + onPressed: () => print('More options tapped'), + ), + ], + tabsWidget: _MockTabsWidget(selectedIndex: 0), + contentWidget: _MockContentWidget(type: 'empty'), + onRefresh: () async { + await Future.delayed(const Duration(seconds: 1)); + print('Refreshed'); + }, + ); +} + +class _MockTabsWidget extends StatelessWidget { + const _MockTabsWidget({required this.selectedIndex}); + + final int selectedIndex; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Container( + decoration: BoxDecoration( + color: theme.colorScheme.surface, + border: Border( + top: BorderSide(color: theme.dividerColor, width: 0.5), + bottom: BorderSide(color: theme.dividerColor, width: 0.5), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _MockTabItem( + icon: FluentIcons.video_24_regular, + filledIcon: FluentIcons.video_24_filled, + isSelected: selectedIndex == 0, + ), + _MockTabItem( + icon: FluentIcons.image_24_regular, + filledIcon: FluentIcons.image_24_filled, + isSelected: selectedIndex == 1, + ), + ], + ), + ); + } +} + +class _MockTabItem extends StatelessWidget { + const _MockTabItem({ + required this.icon, + required this.filledIcon, + required this.isSelected, + }); + + final IconData icon; + final IconData filledIcon; + final bool isSelected; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final iconColor = isSelected + ? theme.colorScheme.primary + : theme.colorScheme.onSurfaceVariant; + + return Expanded( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: isSelected + ? theme.colorScheme.primary + : Colors.transparent, + width: 2, + ), + ), + ), + child: Icon(isSelected ? filledIcon : icon, color: iconColor, size: 26), + ), + ); + } +} + +class _MockContentWidget extends StatelessWidget { + const _MockContentWidget({required this.type, this.selectedTab = 0}); + + final String type; + final int selectedTab; + + @override + Widget build(BuildContext context) { + if (type == 'empty') { + final tabNames = ['Grid', 'Curate', 'Likes', 'Tagged']; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + FluentIcons.video_24_regular, + size: 64, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant.withAlpha(128), + ), + const SizedBox(height: 16), + Text( + 'No ${tabNames[selectedTab].toLowerCase()} yet', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ], + ), + ); + } + + return GridView.builder( + padding: const EdgeInsets.all(2), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 2, + mainAxisSpacing: 2, + childAspectRatio: 0.75, + ), + itemCount: 12, + itemBuilder: (context, index) { + return Container( + color: Theme.of(context).colorScheme.surfaceContainerHighest, + child: Stack( + children: [ + Positioned.fill( + child: Image.network( + 'https://picsum.photos/300/400?random=$index', + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) => Container( + color: Theme.of(context).colorScheme.surfaceContainer, + child: const Icon(FluentIcons.image_24_regular), + ), + ), + ), + if (index % 3 == 0) + const Positioned( + top: 8, + right: 8, + child: Icon( + FluentIcons.play_circle_24_filled, + color: Colors.white, + size: 20, + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/widgetbook/lib/tokens/colors.dart b/widgetbook/lib/tokens/colors.dart new file mode 100644 index 00000000..93a1d851 --- /dev/null +++ b/widgetbook/lib/tokens/colors.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; +import 'package:widgetbook_workspace/tokens/colors_preview.dart'; + +@UseCase( + name: 'Default', + type: AppColors, +) +Widget buildAppColorsUseCase(BuildContext context) { + return const Padding( + padding: EdgeInsets.all(24), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ColorPalettePreview( + name: 'Primary', + colors: [ + AppColors.primary50, + AppColors.primary100, + AppColors.primary200, + AppColors.primary300, + AppColors.primary400, + AppColors.primary500, + AppColors.primary600, + AppColors.primary700, + AppColors.primary800, + AppColors.primary900, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Grey', + colors: [ + AppColors.lightGreyButton, + AppColors.grey100, + AppColors.grey200, + AppColors.grey300, + AppColors.grey400, + AppColors.grey500, + AppColors.grey600, + AppColors.grey700, + AppColors.grey800, + AppColors.grey900, + AppColors.greyWhite, + AppColors.greyBlack, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Coral Reef', + colors: [ + AppColors.coralReef50, + AppColors.coralReef100, + AppColors.coralReef200, + AppColors.coralReef300, + AppColors.coralReef400, + AppColors.coralReef500, + AppColors.coralReef600, + AppColors.coralReef700, + AppColors.coralReef800, + AppColors.coralReef900, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Turquoise', + colors: [ + AppColors.turquoise50, + AppColors.turquoise100, + AppColors.turquoise200, + AppColors.turquoise300, + AppColors.turquoise400, + AppColors.turquoise500, + AppColors.turquoise600, + AppColors.turquoise700, + AppColors.turquoise800, + AppColors.turquoise900, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Rajah', + colors: [ + AppColors.rajah50, + AppColors.rajah100, + AppColors.rajah200, + AppColors.rajah300, + AppColors.rajah400, + AppColors.rajah500, + AppColors.rajah600, + AppColors.rajah700, + AppColors.rajah800, + AppColors.rajah900, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Indigo', + colors: [ + AppColors.indigo50, + AppColors.indigo100, + AppColors.indigo200, + AppColors.indigo300, + AppColors.indigo400, + AppColors.indigo500, + AppColors.indigo600, + AppColors.indigo700, + AppColors.indigo800, + AppColors.indigo900, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Blue', + colors: [ + AppColors.blue50, + AppColors.blue100, + AppColors.blue200, + AppColors.blue300, + AppColors.blue400, + AppColors.blue500, + AppColors.blue600, + AppColors.blue700, + AppColors.blue800, + AppColors.blue900, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Red', + colors: [ + AppColors.red50, + AppColors.red100, + AppColors.red200, + AppColors.red300, + AppColors.red400, + AppColors.red500, + AppColors.red600, + AppColors.red700, + AppColors.red800, + AppColors.red900, + ], + ), + SizedBox(height: 24), + ColorPalettePreview( + name: 'Green', + colors: [ + AppColors.green50, + AppColors.green100, + AppColors.green200, + AppColors.green300, + AppColors.green400, + AppColors.green500, + AppColors.green600, + AppColors.green700, + AppColors.green800, + AppColors.green900, + ], + ), + ], + ), + ), + ); +} diff --git a/widgetbook/lib/tokens/colors_preview.dart b/widgetbook/lib/tokens/colors_preview.dart new file mode 100644 index 00000000..6eb841f2 --- /dev/null +++ b/widgetbook/lib/tokens/colors_preview.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +class ColorPalettePreview extends StatelessWidget { + const ColorPalettePreview({ + super.key, + required this.name, + required this.colors, + }); + + final String name; + final List colors; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 20), + ), + const SizedBox(height: 8), + Wrap( + spacing: 8, + runSpacing: 8, + children: [ + for (final color in colors) _ColorShadePreview(color: color), + ], + ), + ], + ); + } +} + +class _ColorShadePreview extends StatelessWidget { + const _ColorShadePreview({required this.color}); + + final Color color; + + @override + Widget build(BuildContext context) { + const size = 56.0; + + return Container( + height: size, + width: size, + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(8), + ), + ); + } +} diff --git a/widgetbook/lib/tokens/typography.dart b/widgetbook/lib/tokens/typography.dart new file mode 100644 index 00000000..1d1cbac6 --- /dev/null +++ b/widgetbook/lib/tokens/typography.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart'; + +import 'typography_preview.dart'; +import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; + +@UseCase(name: 'Default', type: AppTypography) +Widget buildDesignSystemTextStylesUseCase(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(24), + child: Center( + child: ListView( + children: [ + TypographyPreview( + name: 'Display', + styles: { + 'Display XXL Bold': AppTypography.displayXxlBold, + 'Display XXL Medium': AppTypography.displayXxlMedium, + 'Display XXL Light': AppTypography.displayXxlLight, + 'Display XL Bold': AppTypography.displayXlBold, + 'Display XL Medium': AppTypography.displayXlMedium, + 'Display XL Light': AppTypography.displayXlLight, + 'Display Large Bold': AppTypography.displayLargeBold, + 'Display Large Medium': AppTypography.displayLargeMedium, + 'Display Large Thin': AppTypography.displayLargeThin, + 'Display Medium Bold': AppTypography.displayMediumBold, + 'Display Medium Medium': AppTypography.displayMediumMedium, + 'Display Medium Thin': AppTypography.displayMediumThin, + 'Display Small Bold': AppTypography.displaySmallBold, + 'Display Small Medium': AppTypography.displaySmallMedium, + 'Display Small Thin': AppTypography.displaySmallThin, + }, + ), + const SizedBox(height: 24), + TypographyPreview( + name: 'Headline', + styles: { + 'Headline XL Bold': AppTypography.headlineXlBold, + 'Headline XL Medium': AppTypography.headlineXlMedium, + 'Headline XL Thin': AppTypography.headlineXlThin, + 'Headline Large Bold': AppTypography.headlineLargeBold, + 'Headline Large Medium': AppTypography.headlineLargeMedium, + 'Headline Large Thin': AppTypography.headlineLargeThin, + 'Headline Medium Bold': AppTypography.headlineMediumBold, + 'Headline Medium Medium': AppTypography.headlineMediumMedium, + 'Headline Medium Thin': AppTypography.headlineMediumThin, + 'Headline Small Bold': AppTypography.headlineSmallBold, + 'Headline Small Medium': AppTypography.headlineSmallMedium, + 'Headline Small Thin': AppTypography.headlineSmallThin, + }, + ), + const SizedBox(height: 24), + TypographyPreview( + name: 'Text', + styles: { + 'Text XL Bold': AppTypography.textXlBold, + 'Text XL Medium': AppTypography.textXlMedium, + 'Text XL Thin': AppTypography.textXlThin, + 'Text Large Bold': AppTypography.textLargeBold, + 'Text Large Medium': AppTypography.textLargeMedium, + 'Text Large Thin': AppTypography.textLargeThin, + 'Text Medium Bold': AppTypography.textMediumBold, + 'Text Medium Medium': AppTypography.textMediumMedium, + 'Text Medium Thin': AppTypography.textMediumThin, + 'Text Small Bold': AppTypography.textSmallBold, + 'Text Small Medium': AppTypography.textSmallMedium, + 'Text Small Thin': AppTypography.textSmallThin, + 'Text Extra Small Bold': AppTypography.textExtraSmallBold, + 'Text Extra Small Medium': AppTypography.textExtraSmallMedium, + 'Text Extra Small Thin': AppTypography.textExtraSmallThin, + }, + ), + const SizedBox(height: 24), + TypographyPreview( + name: 'Banner', + styles: { + 'Banner L Medium': AppTypography.bannerLMedium, + 'Banner M Medium': AppTypography.bannerMMedium, + }, + ), + const SizedBox(height: 24), + TypographyPreview( + name: 'Meta', + styles: {'Meta Title': AppTypography.metaTitle}, + ), + ], + ), + ), + ); +} diff --git a/widgetbook/lib/tokens/typography_preview.dart b/widgetbook/lib/tokens/typography_preview.dart new file mode 100644 index 00000000..12489982 --- /dev/null +++ b/widgetbook/lib/tokens/typography_preview.dart @@ -0,0 +1,36 @@ +import 'package:flutter/widgets.dart'; + +class TypographyPreview extends StatelessWidget { + const TypographyPreview({ + super.key, + required this.name, + required this.styles, + }); + + final String name; + final Map styles; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Opacity( + opacity: 0.64, + child: Text( + name.toUpperCase(), + style: const TextStyle( + fontSize: 11, + fontWeight: FontWeight.w200, + ), + ), + ), + for (final style in styles.entries) + Text( + style.key, + style: style.value, + ), + ], + ); + } +} \ No newline at end of file diff --git a/widgetbook/lib/widgetbook.dart b/widgetbook/lib/widgetbook.dart new file mode 100644 index 00000000..16e4b699 --- /dev/null +++ b/widgetbook/lib/widgetbook.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; +import 'package:sparksocial/src/core/design_system/theme/app_theme.dart'; + +import 'widgetbook.directories.g.dart'; + +@widgetbook.App() +class WidgetbookApp extends StatelessWidget { + const WidgetbookApp({super.key}); + + @override + Widget build(BuildContext context) { + return Widgetbook.material( + // Use the generated directories variable + directories: directories, + addons: [ + MaterialThemeAddon( + themes: [ + WidgetbookTheme( + name: 'Light', + data: AppTheme.light, + ), + WidgetbookTheme( + name: 'Dark', + data: AppTheme.dark, + ), + ], + ), + ], + ); + } +} \ No newline at end of file diff --git a/widgetbook/lib/widgetbook_usecases_templates.dart b/widgetbook/lib/widgetbook_usecases_templates.dart new file mode 100644 index 00000000..e1d9cd7c --- /dev/null +++ b/widgetbook/lib/widgetbook_usecases_templates.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + +class _BackgroundWrapper extends StatelessWidget { + final Widget? child; + final Widget background; + + const _BackgroundWrapper({this.child, required this.background}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Positioned.fill(child: background), + Align(alignment: Alignment.center, child: child), + ], + ), + ); + } +} + +Widget imageBackground({required BuildContext context, required Widget child}) { + return _BackgroundWrapper( + background: Image.network( + 'https://picsum.photos/800/600?random=${DateTime.now().second % 10}', + fit: BoxFit.cover, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return const Center(child: CircularProgressIndicator()); + }, + errorBuilder: (context, error, stackTrace) { + return Container( + color: Colors.red.shade100, + alignment: Alignment.center, + child: const Text('Failed to load image'), + ); + }, + ), + child: Center(child: child), + ); +} + +Widget gradientBackground({required BuildContext context, required Widget child, required Color startColor, required Color endColor}) { + return _BackgroundWrapper( + background: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [startColor, endColor], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + ), + child: Center(child: child), + ); +} + +Widget solidColorBackground({required BuildContext context, required Widget child, required Color color}) { + return _BackgroundWrapper( + background: Container(color: color), + child: Center(child: child), + ); +} \ No newline at end of file diff --git a/widgetbook/macos/.gitignore b/widgetbook/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/widgetbook/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/widgetbook/macos/Flutter/Flutter-Debug.xcconfig b/widgetbook/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/widgetbook/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/widgetbook/macos/Flutter/Flutter-Release.xcconfig b/widgetbook/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/widgetbook/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/widgetbook/macos/Flutter/GeneratedPluginRegistrant.swift b/widgetbook/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..0ebece5d --- /dev/null +++ b/widgetbook/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,30 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import file_selector_macos +import flutter_secure_storage_macos +import fvp +import package_info_plus +import path_provider_foundation +import shared_preferences_foundation +import sqflite_darwin +import url_launcher_macos +import video_player_avfoundation +import wakelock_plus + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FvpPlugin.register(with: registry.registrar(forPlugin: "FvpPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) +} diff --git a/widgetbook/macos/Podfile b/widgetbook/macos/Podfile new file mode 100644 index 00000000..ff5ddb3b --- /dev/null +++ b/widgetbook/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/widgetbook/macos/Runner.xcodeproj/project.pbxproj b/widgetbook/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..abebbd8d --- /dev/null +++ b/widgetbook/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* widgetbook.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "widgetbook.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* widgetbook.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* widgetbook.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/widgetbook.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/widgetbook"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/widgetbook.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/widgetbook"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/widgetbook.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/widgetbook"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/widgetbook/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/widgetbook/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/widgetbook/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/widgetbook/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/widgetbook/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..4572deb8 --- /dev/null +++ b/widgetbook/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/widgetbook/macos/Runner.xcworkspace/contents.xcworkspacedata b/widgetbook/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/widgetbook/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/widgetbook/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/widgetbook/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/widgetbook/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/widgetbook/macos/Runner/AppDelegate.swift b/widgetbook/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..b3c17614 --- /dev/null +++ b/widgetbook/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/widgetbook/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/widgetbook/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/widgetbook/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/widgetbook/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/widgetbook/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeAS@N?(olHy`uVBq!ia0y~yU||4Z4mJh`hI(1;W(EcZ#^NA%Cx&(BWL`2bFu0^f zc&7RKGH5X{FmNz1wr7GhFfuSONHKr_^8!W&W{@TZMh1ojOfXp%h6T(BHb~*+yRT#! z7#tWpT^vIy7~kCG+#_?f_QlV4`?kMdw0d`kual5MOW8*5#|g~G)~K=Be|E6Aaah8- zuTY4mLNzWTr^lRShRyNlPn#zEsFj)QdF^yhH3)Vq zE3({LYW=@{<^S;K*VevTw{G3u`oBN#RAp81}Lsx%vWME_wa2O>CcY8jc z%bXp!UcSrg(nil>r%v^ts^YLW29BQucO5y*Z!a_J*|A>f=WD*teP44t`d<^b-VEdS z?DjtnuGwLhbHiZsnP+Eb@2z}&ZSCxt-+nyquf80%CgP!Q^`lPpSEr}x&Yt=I%Vq!S z&(rl{U-{nNlqs}Jx0^HhItsZ_7q-wx%z z56g0IZ(F-B;b7CPZvA}`^JmRkm3x2RUOP+6muDx}f0eZ^yK?;a@oceeX;DA~?{97f%gf1qbDFDncbLOd;Wa${Wo)>Y?_UH+kdL4DEv;TEhs41@3P$b>6RZ=3unl0 z$=np1waJ(1cg_WuFwD%sq`;;$>ohtXZzVhVv6W6W= z=11%+H~o3fH(KNV=~*@Q%XM>fm!E!JzEkb~)6AcF*PraR)xH09R?YS0+w<E}m$v(2x)`8{pg)W4h6elIuI z`@POQ{{P8;uYD)i-kGiT`^OopZ4+dq_c&Urote4Z_{ok(XQw~*dQdZ0^SD;NZw3cUgDdg5>Jm$(6ewZ#=5`P=?(z{hUd9C7YlFL!%Q%!J?p!vkqzk zE0#H|K4kaWVzGL|InG(GHaFBK)_r%nECXt`7V_Wt_+ zD}1g?&HdMV^8Sy5&Ft(;g>Ftsj4ksxHrr_3!wqdlxe@w7=hUUu95+E24Lh1Ug_ z)U4;pZl2Qjx@y-OzMs{R|H@9izoPeZ?k&y3>tF2n6Zz-&62<2YCVH|H+Lkt-xBvgg zG1FtC+v-_nZY(BNK9?6LG}Q<=C=@nEsz2*I?$^Sh5TMDp_QLJXuFxmZk4tw-nW}^@ zTGM2ws_x`|;^b*TW@cu0&O?Tu%Ga#fAF@nV|8SLMWz4@H3JnZQ910iCGgWDyIRErL zXJ*WgRui2Z%Yp|7xIf+g+4QGxp9U}2e>GnA+fUz3nOoF;+;8V$XK7i!TlpIg-F$Dz z%eLwuJ0pt~=LLofo*h3qzO*-#>+E>FZug$m0%b;uuGd$8s$z}R{^oxAk?gn76*!Ca9?x;K3-xz_l~-gb340j+W3*>`VGz?f6n`>*%L+ z&3oy;aFv?HPaYfzDRNu_vu5f6e$|EhC+`36zUzvuR_v=U4+U@8CN3*xcfL^85ZvweRou47aPj)_6~K!E>Q&1`D+AST5kI5m?c{ zz{?UaLRt59!s4rZ`GhPJ|U5&u)HP5(9S za{YU^bb8#cjeAx;dV1}rtM9Viyo~P(Zd=UkWMDcfxPWni#qFj!3Ku*R((0$mr?20% zUi-x4=I19@Z@hMrxj9aM`@4Ak$=AxeI(|aKqroAB(enL|zCV9=nsEJTE>Zq5bItN{ zu8QYMYty+SLQJ@3uqZOIiq2RWAYxLV!rfRWHshxK+C%zN|1R5e{a3}#(DyYfKg26r zP|jFky4 zam}oP4hp)BGyewG+3bB-`uf_{rSJaAT_2%hz9igm>7w)IK<83f$OI{QTVh zo&W#+-hR@R`|SMRGK~3qGG?mTb9|Y7z^8TbeJ;OBL5+q3YySGL|KvSy8K`isp~)OjZaw8-iC+0oWAc*^QGngWjvn= zfBL@b$s}bpP(cGqd<(WP#ZP4CwEM9(zxK7EW%wmMMiaIvWx=R{%x=J{@mYk)^pa8&ak%NClL#c&icCV@9xI`e7*nQ z>*eP8_iS{Z2mMQD`EmU78U0M<0I$YK(P=@`8hn%|tUs`()ocHjD+x$?*U%^^z_H^b9> zCCitGjr*0KN5|Lxc-a2kEBSz9CeMfG^V%5pb3Eqw!Sd{l>As&mN*CTU6@L?4`{VTC zKVQ23XEuE{{dxPsdygsdpil?-?u3_v6w|)|DJHwJw_C68+fetnYM$r>QJa?`P6>Wb zmkBLhB*5`S&mjH&gu1`HKPO5~xcz7SH2Jyu-m5>SygwgJh{1iz)~m#=v8 zH2z_I_J%p?-Rh;eP+e&GU6-6WSU+ zx_u2{pWc%Q>XWX9*Y*Sq%Lc@}T~ ze$VH7W(Ecy+J*d;lVWt*U@1l+pr%nhzVhi*?Ry{l%5(TCvm2&0v^6}+cQ2aJaA3}< z0H#7ARwh@G8J}aPU;knHWPRDy(D1*f9z1xkUG=iNh~eWWoCuc*Hr7}C`}utR-*@Hv ze|x_aTOe9jzx2NSJdZ^#O%4-To`rOEO|ksc|3(z+mm{F8h_pY-}mo3J3CmKN$m9TOYnQDv2#TyXX72#Klk77 zy7MmnI{P1AU*ErtA%E7Nv~5p;MVo+wf;eNP-GTi7AKLBz{Jqx9v{PAO`dWuYk=#GD zJtCL;S8*&+eDFW6TC~3Q!2K>!Z965-do$e@9qB}bk5!}W@9*#bf3N=#9~IDDfgS^_uGf2d00g_Q!qA-}7~C{@fjJ zHl6+#r}clk$J6=Ce~V`{PZWijw?KobXkNt<8lMBdHaJ$tr!{ELe{fA3;zFNQfMd<(SC$j(kTXXo=8F<`!lf%jknw-{)Ybn)Z*CA_hNVx9 z&I6Y}OaPf6%7n4Y#6|RW0f~n}tR> z^Pl&3cmp2l#y(v1Q#(vlPs>$%VZ;C5FMGYavmYnR|Gwc`#PCmFRYy1y5vUsb4_x-Q z`FKRL{*!wBC!=!aDfP+Uf;o3EFPOirZ09Mf<)8K!K0fwq>-D(XJN|yV{eIf@-?d9) zjw)`4SEDl}uptXaPvWXJ!$wSU^@OV9Uzp8NhqHskX-`@>f35m~Cl^iMz2waeAe zOXtCVzpBSoSO0fuuamI)e8%|yy14cKy*f|3UlRlsU*LGsQYrZG;2{5>XZio0)!*2b zd;4I!d|iYz)0gvqe;mJC$)h}BB||ww$|>I@Sr#Yl|J&~roxb$+^z{GTA^-ee39xTQ zm?Ut*$Kjm6{_anww9ni8da?Nba$$d)!l-v_7q;B}993?yxn`mOlOvM}1ItPSU4F*@ zje*Bszpwkgo89j3OaFWsY3bkddibADG`!@3$fygN53EW(J#BCH+gn@fjq3mXxyu;K zw5RwsU!j3?;}zCFQ`cP)R$*jeV!88vq4}Eaf7VBDUsw3`YIyz1iy42a4p{j(A(>Uc z^l8!)*ce=^fS#zp8&fkFBcre&O@yy#(I3S@oa8=7DLSo*$&#(J(l>prhKU@5+5(Xr!294eX)%np-g9l6@u zP%Uuf>z-o`*L45CUcx{1+jskAvpFKgU}?^Qp;3wBMCF@GX|tRi9`h2v&KJ{W}8D2Q_W4G#VU*VnEt(= zWxfxTJeyd#w|x4)JLqS=J@$L}K@PEuR`>sDVt^XRn_f@EGrR%Bt z9#8*&(h{Aq3EphwP!Ld2IKQjvw)DLZZS|G!c0R9jQg)aiaQTwh0!D@0hyVKQH+)+E z_pknr2Th7QnIHV0cIyAlzrHRn5efU3XF@{4gR`Gz9hg49_S?<>-EIwaw>}-!(B@@0 zdV??YjBCcz|8w8hJb%$D9`|EK$iMKAjSr?EDnN$DGNvNAnobj@Gn3sK{+rp^#nnIR zRR7cc`~1?spC#QDrZMm`Y`hV%vbo`Z!_vq1CjWbS?f*&B>}!8wj`hDp&0;IoG?*~$ zag$>7tN3(M{r_e$qa}g|>f>S~`MIX`GVn6owD=yZ_0I9s>L1<@x1RssaOd0oI~x)Y z7aQ4K^H-Q6ij)8q7&BQce9uihe`{m%ar5%Gw@hU(a4cB8^Z9khiw3-nCzxtxDg|#$ zU}60JJLT}bssC^1@BcevsrPg{Sw%iEcuzyXVZnNqWy_cE*Is{QpNkapGH_w^n&IvF z(g&uE>(~x&WRcoHm!@3<27A^;DC2oQYxzKKBvNh%8r22_p+nlbY z8X@J-T789H2KD{#O4mn!UjP5s`g+xJ#+J$(JIij=EK|M^*1*=V&E`yx!UMUMoExkE zoPPc9+1mL1{|YT<^tyMnBUfH8vKcM&t|=1w@2QvEC(4Rpyj~q zpuuab#Ib{2UiupQzpJ3snrK;(JFWS~A&!q5IFOvg(a~VT{U9_vw)E;3|N38--(Ti9 z5U!NTIFE6{mW=;L(nafZH}YQJdj8UpBQC*G4F7if#NV=)nIeJ|UnwkX?CkG<{JOsX zpR}}j-j!do=4IcWKf7UW^X|(MZVT2jlrwC3nwZwnP`zPe;`&eeybR6T@0Q)Ze`@Og z&1eC{Q6eBAA@Sp?_PQO95i1ftE!z{qlov!}1`-%)3N+b^%o%9(Ebtk|6~qy0b+r~(Zz z5O6$D-|$iE-=?^~d*9c-KOnyEL#w{${H3pzjvPiVffNKB9dDEvdbmp~+1G9s=;}wzVGYW?;fY0s4qmS7Z@5#Se~7q zUw_%~xXkC>`g=Yc+BYGc>Bsq-mrrtRoEFu<))17x?~KuVIiIw3f3oA3*#CQMA7^f6 z_RT(hny?U(K@03zrQGFfzg+dV|NAAp{^#j-h8VmR+AX`8GDXg zxz7EQUn7pWA?#oN{=eTgu3V{EdsiMj5C)5IkNAY6XU*^b`CX*m@Vm;v_iFvQd3Ams z3#TxdFia`hoH{M@f8&wWfAVi^Sh%m`S;@)vKg$ojj{FX3r?SKR(Ln@+Rs`*BpiE>!MUd0>4&fENq6T>vJ! zlofgz{=a*(`TReB`+pz%x7+{w@%R>R13%M5mJEiDBUj3~e`^2dT5wtF)+LRp|KlgO z|GRs$TuVd(<_`yk#wLz4v(4YPwQ`I9d-v|{ZvGDe2byxG2&FXZF{s|~U_G&@{Pq5@ zfA4oZ?n^zJ_PL*Xg8C*{AB{ty!NH!pC${9GYyJMZzg63{8_Ms!Td+g?+nkd;-&Qk} zGkkeHjbDFz^@I(~9f za$D#u%dg@8Om)}mPYnCF|I1SSy_ppi6~VJ474necNT5T1L&CwP?>+tf_6qrI7C#Pg z>$A8%nfICfY%LaFTcm{|M_h8ad&t3|2A$iYnqTl=O$-QT;t(_)C2z9oyu|IQ0qt-7_e(P`pI`Uu|FnuOmkwmDo!lp!8P`t< zFPs0oTCQR4{phN9Kll48zY%7XV)&Kf+%9tY?$5Ue9<&x+$gufx!8w0w^NBXp`ksM_ zRain=`gc62J5^e7v`e&1z2WHv+wa>mTWZxDm>uTl7A)WKj`2X--c$ddPLIF$;{dyz zfu)hrC-!rncu=C|BP-kbozG^ipI>-P@*2Z~xsQKu%6miO4v3v6WEVlo(`18}5albBn-_XWj{a@c_-${>OOePFV z@?(yO+?gBO{&xLB_RewkY_j4aOyE)ptV7YNjAjpheiMw^Cz5Btt_v`;N#^;}0`>*#gLI%krN?a#m_fG$R zbN=6(ub=3}*PAnJfApSDe51q@O-Dv42B9N5jv?>Ptvzg9UllMR`u}}B_Rh;*0eqWK zVpfnvO-*gz-*4OZ-@Pw-;1#1_Qo=+n&I=3yOV{4qr;|AK|1rzwbBqhV-!0dl5dDAu z734uaP(C@y!uE7)!@qS5|CDx=vi`R@rVT2MTg}p@yKW5IziXdz$<+E*CoFkXW%2M+9^U7@vZ;y!G zI(Ki!mrLI4_Fq@}*VZH?Jou9(9AJf<2qt{~cirRreSN!cHvCUjKnz{gUW{$swlC zFEa$3eYplJKbI!!P3m-r_cgV$1T_D4k2 zHrVMY@-ke#|Kp$Ru65SC-+j5NZ>5UVO=Do(->{GIjduLcQ#(KT7}SR|lwVxH-Sw`f z&0E8P*@4qMszvAaxmRs*&Ii6;kGKDDb$#8}nz-NMjuVmFTPs!^5OkOM*n4$#`0x81 z53WkiQHriTH1kNpOx6qrjnCJ(&+V>P-&%P0TJOr0D;rt4#cGr*LYJZB{`nj}b?=Jj z?{?G^sQSvHxjFQo?i=B@e_Cq13|H^o+x9qX#qFJ-E)3(%llL_bKfbDKrV1a+1vMcw zm=-Ty%pX_t@u>18+lpo91UAe&_c&M(l;JihMjz$4Wmy_k`|;7y-qq`NWx14nVqX=S z;)PPn6tb?{{ccw^Xg0K7tRcL;Lt6c{Xm|r#!=t>}aYbp?Z+w2-y1s8);aSt`ckX*H zS<{W2aIXqwn9Vk~`|+UJJ^#jrgS)dMyq1@8{8!JIRWEtWTLBc5WKsdcCG`^Le}9!dJDmRFRr742^NDZ0zj%_qSwTo>(N_uwUm|>?2DS!~LgSuWWj?-_vX}1u^XW8u-DC5* z$Fq1oI|L#3g#wBg_cr`^6~4bJper%_|J_|}e6Noma!&rE59;MDy%|z$^y>c0k~?LW z+TQHw-MDe%?`La{vLJ_p!-C!ezwiJ5Xa17aHS)+S@u=$`uG`-_a$wCOt_utSS9FDK zqr?C3vxpeCV=6kBXzB)Gl-^=-O+SYG(H9eV_gVcL(a5%{_O(*ix z?!}82=RLi@wmKqnjb75@7FO{Ej0+w}YbaFzn|r3rg;)BxYl&pm^szjv?35%u1{Eh;2!hVTk8Ka^WV1CUfyW* zXx&o#ns*gzIJh@Wns!*XpEp`UeYV*0b+^|}*3EyJy+XeG@-z8avp)ZqGk&`6-8AE@ zm9sWo+Pj?hs#;s_+ZEZHWSE|cOlW8PckbHS=>0l7uj}uPbJ=$HL|K!QtkS8Kb9~oj zGMqTJ^Lj|m@k*#63+iUzGxidmyM}U!V^Q0M*vKQ>%yv*~dy<}37 zW@m#ec6_Ko6l?8+PFzK*ToC1I+Q+HkD>LxOR-Ug_3U#Wem> z@9X+}K0dxUvvf~2NcNbp_`tQhm$&-=PlQDY<)WF}*VVOz{JXz>Q)IN&In5FlKe3fF z4xChwC~T? zUam^~tZR3=xi#_h@pJT|nCeH00yRGh&jr)d2`MI}O-U(>myC1Zmr_b`)jN4uDJVoH9>jizLThHq+ zKRdkrFZ?0v^yJk3snPW()@(|( z&yosznEbThbn4|#TJx9X-;??_NxnQ*dYi$=Pnk!)EuXl2+J%L4*j@KKb%e`cmJ^Y7C(2F z4clx{_|j_Ey4pua5?^P%h`(?DPH*;&0<}(=b8FR>PyHXgc1K{7&SXf9aKgu7 z{h#dl_0_lP%{kBiDtw)Gv`H`f>Bn^aoL%)h{T>%S>fG$NyXME^&;8q@&A-{03zl1y zwY&|#a{HhCmR*t2j`RP23pn%Eyz!ua-KWX!UJLKCG2B+xePcd3XzFyfhEF+qcNf0# z-#&Zazx8$|CSRU?5^0dFyhPU&^#vb9;@QrDf#)=kuz?Ub{e7=R8qe;QxF7@A=={_PxD7|NN@? zn!iq`Kdx)fJHA!#j&IDh9}oC<`(BTYyS&|g?mgeSI~7X&(M>~kwC6uNsrBI7;(Ok9y6ZFwcT{$4 zs#%_TXG`wwotLfF%2)4;o**JLC+F+W=b8UEZWqx0*66VKV#LnE$Hx*iS5=EQOpW<| zNrkUaOg`}tlL>V8>xKMS`Lf&@0 zJGXn5G1R)u`{qCY|2>(=-S#Z^zOE~uyC?1JteLwyr`&p_t>rgGTE zT7UFT*%K~C7J(I84s;jY{vZ2)$M$b2N5cQMCPt)Qk#EzDU-mLg?eyl}=#0ycTmA{N z^cs8Z+0|2Rl$hxrd3{>0xSHtsIVN{Hwlci?F{kyh?}hNcFE9TSe>M644}}H?6~;<| zpZ{-E$u0=DpE&i-;mOuAns#ER{2G*F%dQm$Uy{wZHh|MB_GeNzvATJYHHtkZ09^ODCsLhVaeNBjNHu{pJC z?zD}2R3xAK%*tCbt#EeQ!!w8O^80N0^+$jHlPNo@ZLhs3Zag-({NBp-%vWqL{$Fmw z`DURM@BAgK7PnM&XXVsvdwk~B%45fmv$L_YulF(2OoDW~6k-y-|4WhkAwI1s)TeYG zU--+%({wwFB5R(dsB^!4v@JDP^8XIseyLl(q;ADuDNWX2&gyGm`1W)C?_FtcmuUL6 zC+7=?y~%DYK4T8memsN4c=P+=l}LJ3je3OJgjj`;opm! zcaLShKI(aUf8WuiiQ9jEI4)}OuHR%K%hyx?ZC}sc>Y6-bKkhu;9jUM5 z=Y9QDO5%-A8<$5rNj0h^aYjlgC%ygr|KHTJw>JKIVsFQxAQ0^k&tCEMYB;|q%dX|W z{+q;=^It2pV-7y8s5tFo^2 zUvzlk?RxPPoi2yyM(O-LAGd_A4$GW-iI06-`>xllzQxat=PYF4WspoNpE%{M%DcWL zhkL#CcBTZx{V#VBFWjgB>4C&@zgYe6-Q7LwzxCLB$ln!udd=487Vh))~zvJlQV5!+q>|?cc*neIV*JKM2ySnhS?RfS=v)} z?tZeZUhc2=+6it#GoMIRU3LCwDZ#`gE3Z*Tfu@HDgpwR3oxBtDL#Qslr z$@%&jN|yyYR1K`GeoZ?rSMBpXs9w3@*mF6xq@(A(PI6yhn6M{vlHo1?dE0~cJ~LgP zsT05NPpGGwLkuJd?_i2vdj5a{}Nh%x-E7~sk8L9)KgNwPA5JVQw!9y4t!ze7k&Ov-gW-d)j=Q6bl#WW*c)w; z-g;B`*~yvjelI=$pDXUGxpbQ$i;&2Uf4^S$PkHfW!=h5}zn2q#Pj-Bt+%7Ave#Wzb ztzpgsWtD8}&bE7fUp}4Izuw-~c26KN7CL0MK%4RH=lz~q|8G6N|L*>_)&IrHL=)Rv z@5)=oh8+KU*~%sG#?3H3^JcTNPUUfT9$FM;?!EcyT;a9v&qE(ys(5qWe*g1A^T~O~ zlvOOW(*4Wl-&vzO`$@_6=WiWYIJO8{yxnry&;I9=$#-`%+_Bw$cGj6w&JD^*a<2|% z?y~OsyXGv{{lD+Z`%kUP*_>bx>Af5gxuLlI_kHEsfAtr4y^YTEIimBK@wP`mcNG`TrJ9zv9g$>TCarO32Cm z`)>dL=lQP&3#{k1y^H^UNMy?s8OiRgi8<*PV{UE`Ul+T3+s2fWldg+s?|#At>JBbA z!=!&&^#AYZ+JAfFWp#W0y*hDR>u;de^!95n-qmYM=BxT1{}YepUui{OF6>l zS(dS}aPp>?W_~l88F(2i7r1*|Dihj%)Mp{hR+Sa#pB>sgL#AJ_%0!gw)F!Z`*Ais-&&^wcRXo$&0g*&Zif*PEC_1%?UA z`zCMM9lXQ3hxhu^ul2nL4<7t_&I&qtA>f^``_8-i?O%S@pZfJDTgQ06h0&U+I+EYj zUhcnkTyl%&M(6I+yty}&zV_e#vZ&qh=e5jtCFMJ2f4Wii@5iEJiC>@Zc-_7<`6t(G z`RZNvk0$i!ORTw?H(C2X_w%3O9dnJel^PtxnY6>#*+jpOm=>C&U+Uc3Id?Pnc@y!a zj0(PY?>#CjpY`kZ{eRy+-dmKM3+mJ{vSgXQ{rukc?ftcXekVpP&y0%PvW{U_N2uK2 zZgtal{rBzXg;-S{c^qlQ`8~+2+uPYXvS1OPOv&Zq>-;em$6U<+Nvtm4-lf0M^X2FI z&s}M6UFLneKUdjXdBTDNPo6wk|L*?&_}A0^xizo^E3Q&uS+aMEewBJEVR|}w4Y;>EB_Lt>o=5NPUVi?+X5TCQN9w1yGv4S=_;SZp$Hh_X@+Z|m zGxK>XKF(YlwBxn9>*HfD`M%5S7rStFkLwMuC7KW2ubE|gKP&b^K|0heO{9nrxu!Re<$;+&^f<-=B!y+CtjQCS(?oL4=HI&^cU3r zdq36gf1uX?s;l?c{fWL&+ja5!h0RXi^?%Je8h`23Qp>9km)N~K*>o)P@!Ut-pX$8X zQgh{J-pxA?SG;c5d!BZsH=^zM(^LP`{p1#XlJ7ds!(t?wvFG#L_jA-WU&X!t_tW^{ zyQ}{yd(ssS$TCPOluvAVD={bc>JVv7Hjr;CoHp5Bq_ zqg>~m{;XS(Q*Xkl|7(kG|373HUY6#`Cg7mJ-uU^veSN3O?@51d_N`oKJ?E98QoGW0 zBhPmXC+auf^h>ndD0}o!+dW2w`HyoMognFC5m(OSQ~zu2d*go2-|3^f-zn~CywIlI z413xdS8$f^oKqc^armG73BAQSXC6iI=}!Ked8|rz_R*Dvu77u|+q*2kF!Pqxn`g_f z?_fTi%<1*yanZM`?vQ`e{R^d}Gmg5j6bVJ_D0ujaSK6#X+(4E4-NFNHx@R=oRaP^} zSayH5-5~4a{QL5qtMUJTU4LC|`V*X76fR6XAh-8z{JKB(m)|wk|C9JCenKmHGkdxe z)1TEUhVQ(ubzeH^Cgdri)t7hrS$y2_yOUcN9NPK%#;09#_;!D8y7tz@_i~wiUd_7= zyM6o*uVrCZ-IE-yvreumuKbrhF@Y>t7nTncsVqdpso!*;w^zNFI zn>Z9Ev>#{{kF!vGnI(I9^=XUB4bD?r&*`vj7Fock;QjW)mK^tja*_NWE0@n(#m~>b zU#}+g86>F&tlq1${>SevUw+=dbe8%5tpkzw>$7<>HivxoY=)f$kfF5sj{E@^C7l43 zcl|X&qN(O~vVB6!^&YRguHA31XD)BH{-!oOw<+^{YCElxHGw9!H?WZ^EX@k z0&Eg5-`TU{aN_CmS$3*Z|AShkg}=^$Iw1j4jmrHtMZIN-(|BGhs=ZimlDaa>&2rVV z{i%QV@84WD#anM@%c=T*w>xA&A<`;Z;koXIy+ZB3?I&azI%}i$`xuuqs)!XmJhsM6f2C1mP1V8w%&T8~&X;T9 znBtl6@6XTlQ+H2SMHKvR>YDInp|S?=GFFZcVhs#aWYll=83@lSzgO8^bcWv(JPj%m z0UAQtzVo}?e`D8@?3Pd7OTz!()nj<~;f$3gPlVZ*;}_b3J=8X9td$YVI`pn!PS1;9 zduytE<1b&!P5xQ%xVU}y*~cqlX8l_7<>&Kl|MQ+k$TcQ$@bL1+{`m2@KRfM9zymp@ zI}f#FZgn%tDU07>6kyhE4b5SnDGKU{^}2S8t@Tp0T?C$A)!5k(_jCXAQ|oM ze_T-C8fBL!&QNZ_YxiGrVZBYS$>yHRy8YHN>ipaGK!~Adc^-Sx3%?>u$E~a_7Z0r3)mZ#Ni94D7= zo>1^*rrUG<_TK0jE@^LC7T&hVwdLL&Yp?S@&*ojhjZg1N-s=8I-1%vLQrG36>#d0_ zr?d**?R+k$S-JhNPejDEM^o+Y%Vd7O+wxD=sd(|_J^SbXeUrWw)EN7jHt`C046REk zq4u9}?SuKE=jtZr#5nE!m0y4ENeJ89lI(<{`$(b)~)%maXJRvz}#jP06~DaFvW zNtN&E;k%Zv)aMj5<;mY;3Rsitk_VbOjA7Y!TKnI-X?Fkp)xNIUU$%5Yyz<%~udmj> z=WEE*f4QyOI%Qs{S7{mB$<`-Ib5H(y{BGL%>mg^3JN4S1Iv#uPlSt~`1*tlEbC)0f zCcY)-#unD1+y8SvZK;?0A+C0$gyoc`fuZ5X7dMjouU7TQWxZKHr*&n*x=aR*b8cV% z*IoCwerxhG^9guL`@(ys+e^;>UuKf`yFBr()LiS>w%cbu=}Ojbi9aVWc|(YH@9{H> zj%1#`E!MTEPgh#xoMk3w)QYoPI4uwFjQsUyzQxIv8PaNLiUD4Ym7kx(6*#xq?^2^2p>;ATD{Xg$@|9^=6uh*A< zrCfbquVyQ)@J1s+wDNAuyAA7Zypv8keY@z~v%KB&^yHsj*313>t9jB7_vF)%)m5NL_$g`YIo`Du+^6{B<~*f59R;6^yV}Z z29fOGo96=UA9X0d@}9028?oliL}_qkw1(x&w*S>nxBY*9Y2T-O)=lvWve$1d?76M7 zTiN0G%4a#&a$&`o;Po& z#{4%EwZOf^c}!71_y1om8TRjQYwlmAo6Zbx*;fU#o|pIC{y6ja{oJ}qF>$BU(hp1J z>!)trp<{R3?(L`7%bu^hpEoz}+0KvbYnO-r+xn?qX#FqlM~PBQp~4a|JByZHHU27) zS|8$oTTqn(|q<7ao)kTe0M+Hdider`u`Ulq2{` zYM%Ma&r#&RU~w`{2;8g=iBDL5=Ux5#XEN*l{H~k$W?H>ydHdu$OnH<3ol2SX@`+%0 z#LY=M%a<+u7FR=dOQSt0c3>%h7+*B3^SGbwnFLM8X|C18`_M~lM=*lg{ z1r~LCU#++Ixp$ah?uQRTC;2KfEdzhmi_DE&D!paXkHc}?mwcbz_dUHYR&3YjM||y5 zeSiPCueJT}=PmztY+BRqP|132O{B5r&g+Mp|7IrsIc(MIe~ih5A%*9i_qqMTXL_=k z8*Chs_vTl+feSn>jSaC{e{VgvpS=8U`KQgZ7XDFsdA0s;;-=jUYaAB@ixfV~-ZX1k z-5ed6SplE^&r4j*<2m(gud!DD(zT~&mtHCTdwOT#%MG*TWv`k4*_)rbd0Ug+|2nH< zf-krmANN`3U3_%3`|hST*|I~+cE2{7vw(q@fivlwz|{ZU@zdwJZ9f~pU$_a906AH{ zdCmXt8~Obwe^KVu7bc)Z$Y!e-J?~>VDwsTL`n)yE?OXo6`1{y!k^UR4z0-WJha3Or zY>7@V=Z%hg{(6J;`B?Q=8|-7v_bJY-yuNGUtwzA~Wpk|8-uP8_Ca7W>C<+_Jq~iQ|-0d=?k5-X13mv ziA&ovH|69c)tuRna;1wv>v&bvHf;U6YQJuz-P`@K@BVH*c}+7iYHGdrIo{i;>wP}2 z@tO8qELACe=ewC(j%61{N4<55zCP_`S#7kw#+4mgKCNH>%R27<&*SWjEWe@_+{}@? z%XGoHzxqdE`|n#C>kk#Tob&$oq3^*vk!{Xbrt8I8&56I}AqnazDEKx`Uvg=E?LY3| zpVtrF(x1Q+weP)f*~2bAzwg5#_@cbAv9a-}b@{sz{@`~7`#(R4s#|B2eqR3D)9o+gH2BZXm|lC$ zLlA6bE~u3;|IWAg6{q&EzYy0NpVf6u;KA&agBm8Z>*He^aopX#gqfBqD^|98ISTeWZ~DDWG{@2UQtXX|rg{-PU+hnL+<(i1u9Gq| zZJ8A`EPc0er8ocEl)3ZEWhGmaONZ;bj~~)Vo3>ozwA;y9%ht;8ef$4!(bM^-{wwnT zQ*Jn*$hedF!H&1Lx8GKD=a($Iu|Z(f98i0k{oenh+vgtQ?zjDRW0#FZvex`H&{9{5 z>DKfAj62`%7vTTHt+n9u=_heN%iEj7x~d9Mv>5ij=92nCaCMDkbs6O+0-s4M~ zc0Mg`-`(pyef!tlEB{1W?aG_;HK*46O8DQqYW~0D4Ueu|^7@bg6Nil01nXH}85Xw7 zS(nJpI~kD2B(t@6@%+gj&h#n1Kf8vXmsfYjW)@)q&}9@csa=Qvwgxp^y2PrmzgOVP)9+<%FJHdgb;qbUr7luA z6$BXfbCs#!~mh5KOaoBU(@k^hze;%LgW4wCDnw(klqUFjh zy7%n(`QiD}*QDx#}DDvE;4xY20)*Jo4jvfqOe_ zEDqnBdox@@1T^!xqU(U!%g^=mZ9c3QnOeWyOl!Z>yQy{M7He}K{}Z@X5S5uKyB=gq zXUz}ouWujmcw6UG1;jjFYxn=Ox@9fTr$i|xjx%Brn^HW3m)%G_<`jKGw!A&pF42qW z4&wx&oHH5e`~I9w`+Q?Y;RY#ioqdjJ_c!^fTmLt!?*5d&JQHl0XV~gJyK?zGkIhey z2{Sw0JoTc}?0eoT)On=huUM2?#vZ@6+2GZ$=1qrS%_VU+&|HzD!!8D%(@AA7IHM2q zxhH;}Id21l`^Of?WVhw0)4?N#Yw&5>LM><-gz&At4o?sR9?Oj~x6nPG2vdfS@QDd4oj z#Px#t|GWR0o!bAyq^B5kckNeQK0B!Wt^0`ZuVE|r*9W)Z+-V{lTb-l{PnFiu94|ZdB6Y9z3Qv=zs|G!Uv8e0FhA!@7h_f`9C z87|Ddrq`ACe5ZZWyMpDXa<;#GvT;weobUZ(YlZH4OX})%n`g!BnzwsReaz#_{oj7> zkIefWZ-bU4QvfO8&x&Gcgs)NwB7iG zEW@YIr@<$LEI7e*d+GWA%$J_mdq>87z0Mb0U%RC2#b1t-_G`Z^5B>N(eeu*S^+hX> zZ(Z~@(rRge_Wg5DBAUgfw+1S0w7F>|w(Iq|$yWb=hnZ!o`vv_hkCkv^Xslqm#Zd6! zf#d&&25~8Crp{pCW#|k%*5^^q_4~5NtKi_^HyRr)BSF=iM?7d~K|TE6{F~Aty(KWVJrzarsj{M1b= z{#3tI+3v|DKKb|KcV-1U4)0Biy8J@T?)2of=?kAZ=l}lyV3pd`|8eGAuaz4P=rCq7 z%qUR1k$7U}kpwxW5R=aV{Qkk^J-ha>Hs~=tbOY~TDH6V5_rL0P{nK@SvVDW<8aM5F zd*3X=k$9Q({rAhoL_P({o}7muPs*n++Y)7p;Y>h|HRb)!Ylri ze@SL!5qJ@|;9|y(a)uVy2XgZcO-rn5VlrV+>A2|{Qf9Yc^^Fa!TTh-mxlr#>QXn|T zPhs6-_rK`&{*DS8{URA*sry3@EP2mWFlqKr#x*^u+1Z(ucZ$?@ z3hKu72DdN16*(`bvi8A!^=l_{|0l=%^e_4?AP%Y^S6qKRd3V{{BL3+1bfYP=8F(3X zUOYcX`bTlVa>fJxhb)*l6ei3+;QeXKf8Vw2|4M@&p3*;V7_{wHV)oTYUPi-3-J81R z3P!b>oU%%dJf<6c>AqxnaB1@MXU@O>yuSQz<)7(KrCsd=HI_H*VNJ+7KhJhrrL{>^ z#$`@p&<5A!4}2#pty}i66+CO5DLXCQ44mJ)n65pq?~eKTe%Yp}Nz*QM-pXnhN(=mX z-D!vD%@VGu@oU1&l6{TT?{zl0+{nE%Z8_&k(BiGQuhXA|DeAEZa0pGXW>{AC=0;+> zeC!dvM8|GpU1dfo2BRiE&tqjwytzBn&NIvq-(&+>{beLnk$S)6ZQagK|JStqy4d_> zp<@1)sQ*#R)BoN6dpU=vz&7{Bp-qo}onH9(*U8tvlV6&tD$B>+T_bCLF86=?Hje*- z4hp`EnG6vh4sq*m@jg_)BWJtLXCa{n;tGlOavUVG}ohJk`R;`uW_cHP2=wIQ|XXm0tg^l2dKAcZgoLQ0it2lPwQ5STEO{ znQpwV`daYM{zpfRI20z#IdEyI_uGJs#G;A9!O*gE*QDLXSDwDAPp+t#Va*_}jzuwQ8ry7{Z`+4Jz zxlay>>Ao$|p52-$dPL{;QG2~~5zxfd>E#wrv!5TaVG;0fchJk(CAhpcqU3Utg-b&^ zL(73D1~+djy1BV!F*7sgOqVfZ@KkDWsONrjul_~m|MOda{n;&AXY25~VhUIIOp&dR z^27iB{rms2Mtk-ww?D2O#%teqR9}-Z?RAWNxj1{))}vMb?Lk`_71$fog6G=_{otG} zx5GeqvhV|OMa$DJNwen7n)F`#)oe<7Uo@hDD|?E zTl9~kYd)=ix+$@K*<_u~N1rZzuJXjMTy1)h!HS%)eM`7RRPAcd-M{;K#UJ%lKN}7O z0sjXN4mOuX^c215n$D43s(N7RvvoU!VsG5#%-OMS`^f@!hehXH+8CHPwuoN1{m=a5 zWl$-z_QCoeuXo68$lawIe(b{DU-_+<+!+4PWyqX*b?X)r9i7F?XQyk=_VWf$)#uH6 zx8d8*>$m^y{Pcd6K@S5{CC86l3{NJqUi!jWz}~>G(j2(@O?J?`4?dTQ*co_@jiq=% zb^J@t7tH_Veq6)+8uZjK-Te#+veRfzb~m^H0>>*;-@v zCSL8;4#~)vxsRkL8}FXI^wa((yZ?cmk$j9SL7?%aPsi`QG)=#$mcfG}R0F;9?8V2 z!F#U@Tkn34KwqYgq#@~>x3@Y{r~Pc|Nn+l^%Gh{d;U&cw;=Vj#o66Sa|0jl*}|f^ z_zBlW%Sjrmk1dq{y!rhSzs+|4kH4G@S{=v0#402qbLIQQmbyt6Hf?U_dJ-7xG@D{S z&9K^BT)^%i_h(5b1JhrH4STOX-+%kmez^s!tEMGw|D8Rf?0)^~J+I2o%C5Urem>qz z_Wjq##~$*XpKQD{I{eb}{o(P~KptS3lg@DFO6euf&WOdJhF!?YlIfde4>`?aoUqP( zqjH0TJXgm2|G%G}`fpr)_f>Fu$EvVD%~=nwNnD6jy(jcdd3p4LRqMjGRX7!2&l11i zp>S_&-imDnXHuT8J1+t%TKpL+*%;VY*qA#w+%jQcS@6WxGmhDV+2Nja;}=1P1wl;K zOD@&#|MK&{tN7Ia?`Cm&olsq#Qg+q;ZP)&nJEq=T^>bOMnRW5D3p(mcH$PwxGhO*d znnRI^LnLT{uQVAi7#MOsC{gqxgqw^ij90s910JFFKGWS)cP;gyPs)! zy3W7MeNVhhv!>Rr{Sp1tzS}75(BS!POaBoF?Xp-VCQCwV(ztW zuTl5r9!Rffzvp&wX59DkA#iq6iIxKj>#8}QC zVtab(d3jz2*4sxeU%vcFsNq+@!A-7Zpy8n)&KH+K9of5fAI|G834M?=tNzZi=}J5+ z7DgQn`aD1MX4P7r=?8D=tX*R!Xa0WM%P*nzzrX|V;gh}!I4JNlR&JXqckE5TG%$IN$gf`TYS+6BN0+j{tT2q` zIm)$F@Bmi|FH`383xDP;x$I{&`N!Q)I}Yzvv(uPZTT!~X?9Pt4&fle!UxV88H#vFu z`Clte^lt=>bJQoFxuyB-&CTG+)(ja8C+c@kU}h1}nAz~{=Y5s+zq+G;UVpSp)V%zL z#+pxAk5l>HDmH|%{omp1Z)Fmmov^ZL<{vYL0|5W$Is=S4Uw^Gk>U5+~T`uBUC`DM-xvumzO zGyl1-+-`Yk!MC6PU))N|-MEeE1E}Wo(o=|Kcv7ck=PI;-ae+tlFaE zyKBx2jZ9n@7y|b6Ix#zZ+}1g#Rxrrx45V>XR6Q9Mg>ZWs0dR0vbCS>^}Ja{-YlG^STnd+!XFSLG$X!kYCN8uH`PZ z(CAy_znM*id-0R-`QO&_|5<##UPKo(h+xFYb7HyA&$sP+E-?h0S!)w@CTF5Hr~r*; zti5`__S2UCx|}v|6 zlO8;bEJh*|+8JK8p0#K{&Qp9d-t!_uz?`>ht=($h-`jin5^IAsL)Yfm6P!#OA}$X^ zSAGFGH|eHiXKUEZ%Z0Mr0;cQUJn`91ts?w$Jv5Bk(2<4$+|RFf>fR~UKoPL0do zdp;*hH}bE07Fxef_ArM+fNo>v&n;deB|FxHC3*)*fs)9=FS-nu7!EiyaBqt}!NK2pTVJp(N2ZFm^ z%O=m-`uOX~`WjH~>EiO(do2Fr_x|uLPmbz}fl4;BTMP>GCpM*azX7#Sc5?37QoidO z>&wsc)1Kbvy1q)fI{bfb)KjPDSG@gCUt0HL_I$PIt8NU+Ti^FjwbYTBYW07u_Ux^~ z>MQ@WOB%{Dvix#7z&F1(@WvvMNuWH`8D>}Z=Egx;2G-kZDeR0apFn*^(87=OC4vfT z`;X>`hDiHs@7?pbRQu1nf~cRXb}iqPDfw1sTX3a&%0cVvyjR6~Z%SpJ6xL_rPzcCi z(RNkFI_5BkJaMX~Vrn zr}yhfG5k7s{nU!Y-R~#f`}W^%=O_QC``=Ux|8!?)T*1`b++5btvy1EWQXL1-7IVQx z^S1``@L&FG-z3?s(BN>C6`YReKbu;we1&VaT!(e&y_}yxtzj1Gm+$rW{W-npQ~t>) zvsep<=t%B=l$z|{oBv`dv5TuU|v0ItFYRO&+&b_UV4HK3Yv`#?F?$7rXP=h7M-ZY zM6EtK+h|qYyeVR`AC(#$SXs85|6luS%YPoN|EHerfAV1cj;S-R^F3`yb4N}UdW`17u^YiobJjXlQLqTck5?9WB zUqk|L;o6wXFTO`JT!W$lfQn z2DSz>3(GUB`g=ddEs(k6Da6Q9BywZt`wLV5r>mZMm8_Zh)c1dm&FU|g{f@8u5p8vE zN1sRHTT2G9TSlI3&mvuKE2wL)KYKYn?*6u2k%h zWv>>7ef#=b=-W*F(trJzpWFAezvNK3kj_-XsBw>NIjE`KQl2W7(>y_zMZm-Nf$Pq< z|Klnj%n$qb`B%u=NAInwrq(aq%9TBBYW-@3=i5_bJ5$=%=18sHUlUw(8$6Bddgsh^ z9jlGt%^oUh2li%m27Z&7Sng+-f6wOookh<*Izjt7H5N5|`?){<*PrL1Kescl-Om*6 zvU*45C#^q00ovJjDjuy_zAki|sqpnM(AKU0lb2a+HIfGn{U#(N9Iy>x3St07;Q_aT z%?`{Bs}CA5afAdW^xymTKIZ3jW9GFwQ8V0T-aWNq>0^84jW08o%nzSacJ=-{HV%Pwb z&8aAWk5>M4U+0}=aIZDPr~3*|7#LY5iQm|lzU!MqU+urOE@6__3d?Ui3s>B-`fprh zQO461t5(;VZ>c$D|_aIzcw3ihhXux;*^fcfabX?_^#rDc1Tujh*{+mh_bT@7L<*&i}Ud|390M zi&u0PPg}3~Kks>Hy&gAcKe5At1{)TG0xRLqpn*60-v_3+ySd#^Yc%q4VQ4hs+M~1n z$L{*i`)-M?{F8lD^L>A)-&?J%t(DKUFMf$`-K2fBwZVT&!%sIez2}?cV~(!=_vtRz zl0F6|4h4bmhEr)VJEvR&HT=}PPfp7abWn(HTzlzxeE#q2+W*5omPs?_M2YR(v_&iO z;df@KPd?lS7P4O2CwyS~9Q*L867wg-znBf)X?SN%cqgxyqJV<}H{+)3}v6iZnIUIaS) z{&PF`ztq%FuIip`udlBCG(Y@TY`Vol(M#)Iw5MMFx^C9auz&BDoUgyJEZqv^b*&2% z{9pK_JyCKqjPydSx?V4}1jw70TwSBJi_6ujzMcdvg zHsm=wh^1~d(OJ{9bebbLjJl6)NdeW>j4VO|4;p4MB;C=-VCc}EeyQpbYeU$kDLI{D zj4YQ#!9%b6?LM5hGfP?Md)}%(Em&q?1UrKBDyHncf*Ffc6@*kJen*OvP4$;o27K5vrwrgd;q!o8m!d(W(8 z`gQtc8LNj8|Fc*9m*?-Ruai9X+%x#k+b=)$4=+>d2S-vY*9C?Psu8EUuRlF3%b=+& zY|F%-5C6e}13N=V$w(D^-2v{i>Hgmmlr3IWGGAbmT=}b<=Eh z-@>XXkJA(~Sp-&0IMB${F8?(&|1ds7_68~$wPv~*x-V~YW=MBQ@22R-p*J0mve74 z{C#X@n|H(OR`lIHkB@~;`O3C5VEfw4Yt#CIf9jtyQC|7q3E zVhY-BIU^#) zWl9HVuEW5sZ%OH^XS(nC-1{0>LG`x{>z8f+eT$y{uUz?uy|!sNo9@haTNXW0z8fUh z6|4Q%cxwI3DegBvdl+lp_T2gYo!ZOK{!i^S10R9|jpd^L!_~gIVFbuLB#X5%UPV)hsvm z=k=~_q2KO!l}Bji%-rzP)Azc~&df-;$zA(3KHd1T6(Rq@qpjXyP$39;s5^b ze`1vC*KbOkqZ>_3$nw{ITVBdeo%T>D7+Akw7&e+_#IZZ4l#lxubH+X9E ztS)FQnSqhzS8xMc!@oQ4rbsce2ylp2L~8x5y1jq@r}f$_p;4} zZK`%G0uBqB8P+qtVVH6_M~b1yp?uPo&zk8%&7f0}>X@RV*Z-=%R{r$b7=}wmgL)0_18oT zK3^@_>}S31eaDrb`LQ?G%(d`*YQGM;lQ+b>fvq7a$KQ7PBhcKy6SW6le@+ko%X;_Q z`?OP9jb^&v_D^|NSotp5C8!{esrLf2S7g_K7+?YuU2=N)PS1O2@Ld|GFK^U^Xv3 z?(+}660P<3zO4`cSNR}bUGo`eQ0OJs2dM)kwU3YZF+0eZUIXQ8EhW(Mk8S_U!vC#3 z^j6Grz1RGwM=$a3)_VJFYu4eitM{{63_7N8XTH-^pX~AFanR5GFIDn>`?E~;0A*4+ z)(YN){szr8e#{PBD_lTxgi{!YRkN?SG?>?qBim^OE!b-+uXd{%N(> zB2etkV2EWnl=5k|AG1T(}m&>9t?)U(!2Ne&Ew1{;lW#pVfZx`F(k!3?qxciRcDBhRXcL zoi8sl7+h}wotNs63hEpEx7hwyeCeXMVSh@MZ&sw5&xqa-mbiHj^MRVu-?z&TIGJZx z@|~X!9t2pT8TWPi^D+hSuCB%+khlBZy6AztJ&(2Qt$oSU|CTR*%YS_w_6@XAY5B&O zz)ut1ZazD*a<&)un)zV|H}7LU@U^U+KUM4g|K>>xZ(lRX_CCJy&-2}?9q+-DXTEQmbZy7e$8lfF+xgG> z{@Z{1-GgKA^4QC(UU=Zl+Yz4*sC$1N{|8G6tAN=&b zR_(vld;WdYQSAzOcxKa`Y18&^ntyd$##ZYazU;;epK8A^*z|Rkz1IKAe9lXtBbjb- ze-JqE&93sy(wjE?rQpM*jf5_+|I3{J-*0OD>AtWXYZVX7U3NH3bIZ%f)>-TRrcO{`^CL5Lw4$_OK zih}yHW{U3r?W^DaOFbESx6&|GB6EiHjBgdaZ@2mWPm-3lzhxZvwyb%hiuC0MfoTSp&6t!8bHC_# zhR&QCxp{x#`|r>8sVl$hz20f@{a*f>sg?Jt-+#6YjNIryr`U zf9{vR-S_6fQB5CLk;oM`f&z>n8KjoPhe71jL!MpNyzwx=BzdK}qs6W3S92f&~mWu<+E5Qpa4z_Wt zbU_B46h1KT|M8sj|G7>5e!DMko5P_|^rL-C`Ugj|^|$xGl%I5T!Y)fb_G8um`d@9S zR|?bsY2tQtNM~4L?sLmw`n?$^lt9kQ@Od!x~1inDX-EdJZe zSpP4$^TOz-g@eNUN}h@KPh6v&r8BZ;>_7AJkAOqT1|F{`=i0v?2}o}6|6BXv$gVm6 zPdwKBsH6ZgbhRtUMALh()^cFI4vCa94h~A8^_zgX_2T5s8HJ|8v9FriaI@n%gDA-U>2wLkG*Y?c2Y$+iYyS z%;J#5tW*pNm<4={dw%{8dGJSk>vCant8&-U_A`s;I^VjmJCEnok4HlPYu4{S_@bNr z%aWq}gq#28etQ;w&i*|Y#Kave-`?Hby?4ho{pC+*F+`jz3|;Tyz!KKruMx zY1inI*}G`ZhS>WrMRH$FIe26D`MLQe*Xjfgygt93@e7B-_19L%OYRFZTYT`Z{&&|w zLkr}0B?Tr~;R`Gd#~oDtK81|Q$F(D{AFA;0-@x3(#Mx%}}t7egLrMtUEjVeEWexAvU^?J`99eT zmVvb&rtyK&`isd8e2i}H4K;uJ>7Xk+!-k6?wjm1Gy@@Y3HWSm&yj?Mdj;OG3*dpG94xw~+7s_?0d@QIu6 zZ~tt0{#x8A*$F45|I0ZB*dAXt-L8LX!ukJik3aqM{bbB8knxOrxiZ>=%M*T$1aK5nn5V{?em44UlXQ@u{}#73Pe1YVeR0lGZ%~4A zabN*u*j@Z!rv@?={Imb~B~8rgf5D|6%cgy_li9v%Muza~)xGxu=0QH z?ZbwNH>TI^`T76F)@Of|7r~5jSy0Y2i{XXrPLVE9p;E&X@$LT#-QWCk>$fcVeBNTN z#r*Soe$Lvp{^8pNy&UaZR{oANn|?x+;pgpth9X9IEpu;1S<_|2d8RSyg<&3t{jk|%e@RKJVMBENkLoVK39 zz*WNhQ{s*Gx>pO%*}apW^R1ux|CZMxM#XLeyDf*G zmrEX>S6};Tz4xL?s!*4n1-aDHdMhY9H2QJw$@8{|c7TN77o z14Xz3lhOrMMqh>!&)`j<$XcM-D4u)%zq+^GSNDk}kM>-C_IQnX$&5w5&c=;(>v(4L zB%fcffN$5w$D!?++V7q`n)g4Mz2rf>x`V0O0T+t)#I1?N9rUVzy~pQdfQhIeEhgmTT9p{kVTdsXTdQ&ULParBZ&S zZY(Yd7daBn+xz|g|M1w(ld~h=cPRG#x11^dPhVXm4<+safdD=JSXYBoXyWY5I z&JHPsZ=dSx@BgR}>|b{*W4~tA11sI%`bleGm9@mI1~rB@ImVabjDiu7OzUS}{yzg; zGzi@Dbgp@1(5GpbKgUPyL)p&?BerD;CnR`e-`+U4|GiPj<3;ZRSN*;p@$LUX;i7-L z)wMf8?gj-lFDR%F2L^$IT8#0{&*Pi^KhG6f@Ft1V`O4>yo62gRU6!+$QSxWz_2sgf zFCX2mz2)LQU-9#AE=#$(o}?FTpX+ajzP@=|@9L)i5;dy9pfGoFVA-XxfU`kQ!>bKc zA%N z{N8{0-k*5I=k=la)nB8*MkY9NWH2Q-vU#O-HE`&#Grs%DfB(;A%jV#)XEQdQyP%T5 zo^!-?cG^wbRXd&b%Pu&1us%7Ut|%cxNoM!9vIht3-~P<^4t(nhDzR8x7RZCLZ~Nvg zpbEm_Ti4ug|8M*_VE>??F3GRG&wlP}S4X$q;z#e@DD&&p78ZLpXTrOei?UWE@5%le z@vZ;zKmNESssC+xS6>0?2Nk2*OtTm=TK#)L<}Z+HoSt+3zk2TZ`ickh%TGw8NB9=~ z-|EzEUs_$Q%p$;ceE-w)H+vYrp5=VplAUucW$Q7G?SJ2UAFKYievi+&`s!Je!0iDg z1*X3O7g!wZ=PY$)aY<<9+_TZL>hu4m)*ZjfSa!SYKe4U+q~esR@4uS&&#wL#{D4LJ zkBUP^@$4^^YCqPkzP>q`{mGy04-uKloY9xzi*L*?P<7qK@a>O%()?eGKlh(ItofNw z=`v3+%aggDx7@2Gjp{|6_kB%2!N?}fQ*odDfA7^xJ+a?oW*Z*L`u}^~*3|#vr+?-j z4$KAl)q%w&frDulgGAG=lCB1hH7t$ObI;dL{M>)8dil)Bj6A`O&dcXNTy*2Ex&6Ms z%j1>_K1-hUKPl5*G4zvN@~*XIZ+`BVt^W7)&vsX6P7-3-wr$&|ogb#Yc+*r8boo2C zQGih}i%Y^rP)_3e^ZR1OP5b}f7b_nt2&{6gmelLITYJN@@-=^IvO~?|^M&sZ^Q~{L zO5}UIZ;z);{=fV6SF6fms{hS?5G)Oo)zd zGD|rBfA6+8|2N$GbN%45UC`__L59(nLB(9f$b-ctVIt?A%5O2>K3u+h&VH_O+sg0# zWlB%3whDVjcFXw9scnAzbA!Le^V{{$j`C%)JHMK3Zg`;Tv(t}1-(!@Y*UPC-1y#_X za$HH^0?PrVo=G_(jDisyOcCGCoBuC3=ESa3sy^!*liAyNjt`s?C#N!2W_;tZycV~; z-~3>U?f-~x^-qM}O5_~!&jsaeP=nZ%>6g6iR>6t3N(xNeo($~&YCp}qIJ^G6&Gym* zzgir3i=TXE_tPQ#;_bhl_atKO|5?GWSZC1pBeOa-!=J zTbLB4PMjbMGS8b~{;$Kc|35c(TPGpA$@PUmF0ZWHGkqudUt0|CGcj1OIk zZ&bPtxx~Wk8*fE z|G-OwLxD>+pDwxY`!)Zp{nn(1$7wyU zms950vl@05fHpkF7YSWpIk2d2&KogCL5UtvUQIjwuioO`XZsn7qN0Z-OYGh(5tXfL z>G9_ZHwZXG7 zl@Fw$EqL$GF1_;=INW2Ppp*stD3;9XTLAkrwQE5{%@xH zTfXsXJ}9#aFbYN#G0kF#_{13Y9aN<#7M$|?9lwP6|BDxw6Iob~MYh>k_1p3P+_jAJ z!`lA>+6+$V^2tw+pFX~P?Yz0S(s}Ju^8c-$@Y!B^iWjV`>I79HoovCef{cP4&Jgzn z`v2yaJ)z_^heJavc%J2*Wc}Hz87&kquuHG_CVsrD&;Ihhb9;WUZd3l;n4Np`|Iu5s zEc>UPf|)oIWa3P>;95aO!54E5Xs73#|9@ZS*rxv*K9}&k)M$I^6|O9>@9X=^KlL|F zczp7s?kZz#{`tRtA1Ji^zgc3X4>*DxSf+sjZdz%|ReeE$#%nBbn?Mu-Gf^Izkk`TvE7<*nL%E?4%jWuIj6-^LKJ z|Im*MI?jI+tF8qkoVU08s{XuQOm%8!1K4Q?vOq;-R?p@tO(vy)MuzWymcROQ_+@jk zKf8SFr@|$LR}1;vb;JIAm(ZF1=kr9wy1e{)e$LfHK9eK|an^Z!Z~DKWfUsK#z_?xBUz*@9~l zNvrMo{#@SlKXOWl8nhk0+8s1zVE*jYMvjgK<%ZP%{kLZSceVI%-ul-)&M$=}XRjB> zhL-R#TK!*f%;K=6ueI*C$<}cO$EPmT|6KUy=kewLN^b36zGw$H6dO1?7&tP57rbK@ z6lk2P`r*{f;+yL8BYB?BZ)QoCpI$EX+_Gh{*soZR0}pr~J`un5$Y^%o%hqrEf4x0^ zee>$A&+lIh34tbOmj;$CObsfa?$H{N#y`RJ-=6*d*}H6AnE8$sbNg(Uv{m~2-el0X zW!+B}r*!-HU-=D(|NNY^YxTq9*S&R5e=n`6xtq7>_m`FS{Vs*jvOu7*p+Sv-Nx=)$ z{c5}Gl4sm`A0O+r-PH2l1g^=m zdOoXed-LBpJo|k8c4g&ENU^1~p@zkTaYIe=D!I-Ejx!1$7QF?veiz>VBR2T&vo`XF44lV{5!AgU!i=@WlHg$ z?pI<@=jQX;RXA1u>%O7k4-3KsbH=p{H_p0%+9=*04AuYSH>du$mnk@JKgZgl=HAKA zg-PH27WQwBNi1dhIlInb+kBDxzrx?2d^hX&T7Uky?ek=hnEx+<<`7ULm6d50!wLq^ zP!|UlvDpmw{v@COZ~x`NpLV{w8El@<4(fm9+t;se_R(dH`GJHv@oeUIUe9NGzwA51 zw7-wf?w?c7x4{V<6^$aCIk~yM|Fr!s?hD=GDa^3i;?=9o9BTv`_kI7<{{M7q<^uk? zcJsqSwmBUZUAubcX8UhHDg_=~xXt*7h2_2Q{BX9%Le&rZZU2YItup_g+A~EToR}xD zHE!LyRqOxOrHOC4A{KHsh)QOZ2D5}sWbpglU;9A*U-;tBY{wF3RdNLO^VvB+dHm>q zACLRaU$V^yF7)kxFZ{lF)#H8VrD|R*;rsKM2UZj^3a;>T5N5a6>3{BGw(%RhXZ|DEY=a+O#k^S0;zzdbJcmu?s|6KtMC6=-a3YrO8p#EbB;xm$u2FH8QU z{$JQy@ZiCjiwn6=&zu*2u8M26;DdX0R=+ulpP4zVwD`Ay-G0X^i+?NHo&V);w*7xx z|FW@2#S0P^ zG;nMIbs@z*TnPc29r3N-_P_nBA7|~W+|~Q|q(4cdpRj4!k!D%CSnAhZR>plVm+Ry) zI?T%d8!W|b^>0h3;@j_v;1SgJjsN0dPS(+AT)S4+&Pz9gf7BFCP@(|_fEeml3R-Xbhi-|CHP?u!K*`BKHMx<*Fye-%BZY!LY?-azB$4^=ab zJy-&t_=)?oYpv)}J_{)h+iem%>Ak6C?@ zlw73rTH##H{PvpIzd{Q>pI7}S!Edi7v%GHYtZQu2r*gD5^H=}-xYB;^H~X_envkO5 zsM?0Td)NNW>EvCg#vmjuFjJXH$zb*Y?euf0{kEHbZ>hJ6&GBXDQCxrFXOirc-xZOy zPuh(l!XFy21WEU+eTzxxciS!>f4(n%S^AR1cS_))D@MT%*M#@?_TJu@;+gy+y4dA z-e#Q3UEFJZbEG`ff*qa?!VHEly|!_5IHH`}+Ox$9eVl3;*Q@Jt^48 z^R@QQ_HY|RCJ7C`Wv<1`>tzlFS^ZCxd8w#>FWzMCOQYH6wu}GczXcvs?3wTh+LCr) zNfNri;^4Duk}i|dg&7A{m))}e_UHcr%l`$NUZ`KXnB?KQ=J1w7tcni&RXKS#qyKIC zv#`o@^Woo{PRQx}-hbHd_w>*4F7VLsaG1~NlOJNrH~~DD6j90ab6$NksOx<1B$JHQ zU)OVXr#UvR;5#j{%st`Lv->`u&)FTnxSr+3yrX#*3>7s&%(*dm1)UiNnC2sKVs`>^Zn*Lt4if1^FzwMt%buF#qPlw-8Y{=c?iY zQHGbjTh$mYNef4+FlmD(E95uY{%Y%@pGR`cy*yuvE&W@{q(xo5>^bNEzuopc{#?Ci)GB3g<-DN>)Yab` zc(v*X#GF%t6)(S>+w_0x>pxnhH}=|n|NXm>A#)v9!PQ9%oU0|;+(e%ypZ}k`?fL&5 z-~P1km;#!BU=)l{WQt;(a4#X7)uAd`soN!CDaW45Yxn-#p7&oo=luS4tf~*`c`Zzw=R%Donhb2{-rO`(xg+J>%>#ITLlpgnj+XFUkHt zKAq3*(}%+*IbRExR3?J@CFL&X>?dk~dJ>F+5rs^*m?qrgUGTN@Wv}PW&8bz>PALgy zcrdX4v;Ed{?~nPB?GLsoBglmrTwSltY`cinS4I+ z+2IG)!X{aV^_*m>JQtWdvLpU-&c3D&o#3}9u@p3EL1ws zzIf87`_pgCtFL+W{u6W6=XgI)RY-}Zq`;&J>VtVLR*ZH@@Z{WMbnmnN^ZJu)GwvDf zPR&gDIIHUPd+rFujT6+2=A_90;{3)}`B zs=#$-_Z zU_#oVXLsIpeFM#+sz3P?eq?DD+-sd6uO%@n6}u!va_q?fRi*o%KmDVBdV<(D=021A zACz@wvuNbl6sXD8x9pj5d<*~1=l^r3XWiWY9MNAp@CelLebh5mN3^k3vBCU*(LeFD z9nYj+#ZQlZd*S4B>AJShtbF0kv5l-f#$PHIw*Fpw8CtgUU(^6k)q@nZg)8m53JuQ|Oqu=eedpaY zrQIj?7_A1))mp!eXa6@<5ZaIek9Z1#Mm&3`<%l-6fQA{=bIn<(-cS=Ar9+saI4uZyL4zl?? z>vHH~iMzkW_W!qM|0}smb;TL~m)ZCC?|%L{_^si4xA%X3|Ipceesfp(+?exv_6wN* zrxik5>mXMpfn1f;JAI94;}cNgR=)9B|GE9njhR^iH>GRmzklrewd5`zpS^5NOV95b zKdv*EY8U?e^Zn+$|IHCh3*d8y4lL6^HT1L$gR7!~FJ>P&z3ut`#NvPP6F%QJ|CRT( z*EYrKYsK#KzMoD+w`~8*z_hv0^0WF!tv>r(avN;_zu%tv|JG-IDWvhzUeI`HuFF+< z!55teyth49rqUbu=JdrKPU76XJaLYzSMir zEY{wi^N)Ky1tkLTq(ir-gD^w4W!|PJ7Bn;n%L zFE#xweWt7f zp48+F#je6{al60&J8B<$`djk<3E(C`gaT;9bHTw$E0qjH7;9enFaOK$y1y;1+CbKR zcHf^xAB#0*7o2oq(4P6iwW_2v?RnYZvia^ou9Z5;9qDCY^^-mJT&Vf~=3;(s+W8w? zO7&BF=dTYISuRrl-e~=by4g0TaF&*%{X>5qa*Pvg_oUdn>}W?-zbm_fdXE zVfp=XpL6xwmGwcxB(#r?}_8S~|yep}*Xvx0BlXY{m1lKA+#1biyzv z%i;Dn*Q(0;g*rXrSNkWiJGh4T@QJ@Htd!A~H+r|KR7&@iU8&KVkVK6${5GdDCOodc z{WSaL{}PY>3yM}tT^(4&nj8LA=^nE<=_M%9a-jRimHBhO{omuu^ulYh!_BUk_aC0~ zpXIh_sd>lt)9CZ*Pp92pPx?6T|7rdcKlPKZg#MfT>`(o_-RYbEfBJP!!?f_hgZ_G~xpd!l#!b~1&--mQZVa;g&$2jx z#U&vSG>94K?pN0BkixY7*1Z4zw`N;g{-5Y*E@1!l+I=}cb^ep*0zaHzV|ULXcD=7! ztz`Dnx9hSe|J$@?Rpay7=j)Gu{Q73q=_h}}Q?G5g_pEH%-&^Hoo7Ll_dxP$7{8VN6 zjVDrU+06TDImzkLdxLW`S*%Zd30eAsbH#C2V~M_^$N$`>FI?|Gcd}gNy>kpX(z|}H zxcA53LKD>Z-vBDrH#n;wc2$rAReYKM?eBc>cl!9nvxt-N(Q#*ubsvKZ=gA!Z*>WaD zZdZGl$>-IK6a0QAg?HzCx$9(K_;XL7-^cfV!#*;;{i)w}x$s?N@jv;xEal&R?$!VH zR?6hJ?OW5mWBO@}!+KA`CpotMlP_J`R;bmQc43djEw`YB%;77lr%1mvpDJ2<;Zt7I z=lY2LvlCxt{{OG=y#B|-N5LO%2-(el_Hf6U z^=uCk>v?WA8l3%e#rd0fnNnQI)Th69MSy0ptv;ML?i4+~>Hq)J_x`k>v;Pt*x%$Go zP1OrJ*94edUdZ=v^J2cXHS(rkjvbf~H`V|9nc0ude)#xO?C#PPvpFQnmM?UeBwwK= zQ~u4&8nh6JdxoYri%SA{UPrOr*R9(@2Gn8D`91x!JbQtA&`-DdzyFJ0J*a>9V0-

$e#+&mks>|8!lgGariG| zKTqO>#)sqb^?&{>bZ(#bX1>T&@C1MZ#}_HaKQa&2|NFA`-J+?w>o^nETislcbMX90 zhJaJmwq?iMUzycL7e`rsEuMA%;rT6x9(=mz#5U^-|EypBw_E+h1fuqTaX)o~d&i0w zZML~D=jUo%u5V3T%w*-Yl2@!|(VPDNM^7?*Fg$Ku?ze+Ke)qYzmk%}cF4C`6yfB^P z&u9DppX=sJ*o)3kzP(^t`u>dRpk3K7vD{3 zLErN1kIS%yZ(6iNrBmkVlFWMJ+#iefPl>93vw2fhMKQy_xq4+j%+EGIEq=4i z`&hT~-B6wI}4mbq~`r#fv%nGcV8h-K_ntWcT+z z-3&EWP+`drDlFya)ctzt(IfBrzcPF%7*#3I4coy6H ze}+Ne-3SK`D112e`Fz>^KQGqr=I)CQn^wG{b#-jv9<}b;OAF$kDVnW1$sKZAP0QP+=}f=k_*k4i==@r{Cq=+=eRA@}^;0h{@i?}xD)ZHTSvyJTeJ|E8w3^G86{yB1 zds_UKL3fb)d^Uwt|BPVSy3K$4-WK{c{AE{Psinoza-cz>;KPH1^Jj$oym-XecBxxv z&UR3e-9BMmPqIJ5X=mg7|6i8d&;6MD<`#Hb#mRv~M5*B4&h#By=hrT`{(s|Pko`Ip zjTL{6Rn4dg^o>zjY?ooaUFYql2|LfIOX*EY<(%DksjKQmlb#w&k@`oc=zrE+j&^jqlDzrKE!2EqPO0L!a-o{z} z^J@0oYb+-m#gtjtm>O-Xzx}EC{_buC>jKN$&ab$)vM1GaD|-4ee7PU^IG&UBu*)0fHWysb7? z747!dPo%s!{Oq@LuBS6UgTaHgeOtb{%nw|cbz7sh*{E#uxlI4~FL&4MUsZO^u#)X; zj|ST#jc>{2Pnx+zFRW1i=<|GtbFWJAS-ArhRV+B&ZWQl|O7Mj(fB2|K#mE z%zw2qM*d(HivAJRvFhYnzx6*V411=##VK&JPbyDie!9TpEJH-KlgQucuL2ieGdev* zqB-~V4v)0ouOB{SPF7lbe3|0hMJk%gXJw8Z+ON`cnIUpHtDMq`t6qDa9J~8Qozbr1 zsnlA|367ddEWczMK?UoA^MdJxTkrB6obxtJXWwLyYbU?B_I~#NAHlEqWGoEc%P;-; z{a37KFeHGd8G$x}#HmrH=C`k__|DJg^`RlBj`FI>)$tXa zwK6wbmpbuOV~97$7kQ?Bn@=YKCyUzqI)Eme=KtUWZA;~2-qTP$Pb5J3ys*+1^W0k| z->(Gw=SCgq-vw!kJ8(SV*z-l)zx;db&)x5)YEOIWf9CmI$-~{gTJK9{7hZOn<|=Gq=Aq`&KS zeA)5(g&n>sa$;>)$W(K{S%-orA423@z z`z0!#e#s@7ncH+PZeqwbU5rlfM}A%a3igGK~o>yEx&1Lo=h+ zmX$q)mlXV19Yi;6@@$w?byB_7e5OU5;E#Rw`_I0$U$C7yL`IIY#X(--L44xBBRA9M z_xe<9i_Uub#Bpn>BxuWoWP$LxI4Q+#>K>B+|GuyP-?33x8&df@Ezo0$E4()|(YL{T zj!D$?y4_PRam&88JC-PUvTVuC)jtF7+;;ydt?^^6{gVcZ%$ye@$KCylXZN!5ul=E3 z_9d}4Il~S|L?h> zUv#JS$YYfQck_y}c4;u51T8xiWZIW@b4T)VzCSDt()N+3>|$?d-jZh7^*?uk`Qta+ zSJ-go#J%Kf+NWUs_siwGSFT(U4vPd0X@NRrja7mc&&A`O%-iv+{BE|t#LDYSRQG;S zn!c@jZu->4dtc8NUwDt{)24lAyc>DuMYJ#5`0BLkR;{hwZzR{RSf8@f;P{-i@+U4V z>#^dlULD-bsCC6#F!|z>$e#$9teUDkPCZmPIH z*KMEfW5;%^ZS(rOB=<-A8eQqR;iVGVWp>~AyOiuNsW87!z9-XufqVZ&*N}Bm>K~_? ztmQ5_$ou_$j?IgIpO5F4R)641HiU+3~GC9 zJx^8a;e5bu|Knh=TR1!wv!a%S&>-KG%GWl$u=l6%JumAF7Sj*|)hQr_l1Ot#dg;ZRf63xE0BAtN82toIdZf*8W|aCO@BOT~_=4 z9?@MrGV?ZmZtB!q-CbtAt?akUxjQeUubjGhUo5Lpt4M24=uU4 zz-Q@9Hp9phvGca2zx(3PRP$l;>a7L|#to<4IJPi0E}vib>$r9KyCX~u7Oj_M1vQlO zH7jysL1jWL)2==P8%?g4nak&zJxRazZq?y_XtnCVq0@0de_rjZ-_Po+vtzTF9vn(B z-xB$GW52lm>hMP^pQ>(qp|9y;`P(D6{+Myu+X~h;-wvN^vNIzRyvlqITs^kb@A8y$ z9^Epnc5)X#Et+5c$Fo@X#szf^;pJ;I{N@_%QqnDX+3Gk?{mGqjGntbAUxT;57Huqj zq+_ah!H*?x|KD%9?0hmF>I@Q#KA5B}&nO4g2jw6A7Jp1paJBzYQoirU{M&mfKl2B( zXMuZ#Ee!%0VvKu~K4jMkJy&F`QB0JfHpH~8}rPY*e z_T}37bmeuOrTRgy)#Yc4njO4st{J<**Q?Um#MEuK+asM<%B@EAkL6`I+CQ1_^BlkK zpQQ6oEO}3@{l9UY_8vtwQ3?6n{dYIsUC&u?_HN#NMqM5W!He;V7eraouC0qb{k`bX z8lQ5NgPXT%b832&f>uJv&i4EML1lx<(~HOKp5I?-xxeo3uXL-q&~@!C2QE215Y@N6 zymsHCx$nf?wf769n1=rI?K=@+ney{!_fD z%5tuizv{1Dvi8_A+f1qTy16Q+TTU7)WD0d;b?&&bL^dx8K1e`!u5XO zoN3i?U|sBPxp^~Z9*ms%kA=Z#ce%o@7_%d;$JqF0*!l?=H=w%+}oe@c==p! z$9a&PnXpo+;GVZ%dHm<~95t6uE*347GuXH_&d_Zp8&|y_3(Mg(bNx6}{DS`PU~ppV z>V117>wf%^gq*mN+fV22JUqYG`TraBrF#;+*caT;Ett9al2TpamW=8DRtrvi5Fskf z|4B)9b$sjgyj4qLUrKL$6L-`+WZ&+>Gk*_?mj5zkJhm#sQ-`I+!CK(Q#s0c4=g-^y z*6FIxv6y?=wj`zKgUw$}@wcEg9xs$`m^$5@+@Q{Lj`~BL7#d?t8 zHUTDIW#o>L^tt_WZ*mLDgkPz0E&ry-?Kvi;+YbrR8g`GjqMHQzXwatLjce1-o;=0tKlS$C$qduuH=mQ0m~FB*skK2ML!HU|Zpr1m_x!>P zuKo-PBL1GA7Tl_80iEo@QZsdfjV0I1HeTsx^QvC0oFB4rY6PTp+~RPWV@~}$$-KYM z>$c|z9k4pex+>}P`yaF84u`#vX1wZgk@eoT-m1$we;b#zs?QB-e_M88(JaZrTSDD^ z7CVEUODW0P4B#3EsJYD&%Sgo+TwrIOcJ zetZax5@x8#5N3MocHsY>7YBs>Z44j(eRRdUyk+xpm0NdKoxG`kOA*wAR!opCI9>l| zi2-Z;Mt?uQbH7U&%1j+FnR5DhYd%LD-#B;W*4__~vi=6U-P)FLZ{pXR*EU8T_n5)Vb>)BJ?i_=_4yO4s zyB>DEd(`4EGcd>D;4c>c#Y|tTTvtj`NS6^sbDlYaSK{eKR0JmD$RI^TwmTfB1>6evN_J2d^sXdju4lDbAoMI;FoAws8 z1?jEB#!7h`$u;d?o@i#zFS+EI_x|4A`&-!{OD#YvqnQ}jaDI4e|J%1buEI6pplUbw z?~m{7C!I(Mo9#Ml?}ETVJc zy&B`Hywp0QwIS2Ct+vvBx8d0|{VQ&(0uJ3vy0!9u^q=#Ldb@w+?Uhwvb<0(}pu%+j z*R}0+yHZb!{k~oQX^G8K&)GdHo6A7s^ks@Scge@SdeFIN=|fM3|Fe2;&j0g7{reU< zKe-mrU@GW{6%zV}ow%JR|Fzp0(B_C7y5_AlR&(5n0R@~+;$Q#Si2bEmrABwYPDVyd^rBLDqjyl8R%%sZ9&!TNYYm zsI!GEG`-cEvpq5K!0LBJm)-l!lGI`q6wlh}EnTh+T|y?nbXKuoTfFcC>-ulf@6M|0>x=&F z)Q(=<=&zsf=KT?K`(G-qSx+2i@)tYQYfIPMlC8V_)cXAD42CybYNtFkDKnBcHho;Y zEOA+maJqQryY+@`&oo=7D@C?`4|){Jdu!si@;{)>@}0Nu>|+)d)${-@v#RCT^WhM; z`JAd(D+BnD%@#V{x|3^J^ zWl~gtbhc!j9*91l`w}z|u*-aoMU*L%e$oP+OF6dTS2wis9ow|=VPE0F<+T$`cN@-= zl~3upxaPi-HCu9e;)F|k>x!0`toE9@gLU<)qFUL4(C}LY$3GhIUt)C%Tzhp({#Spd zn6j&Pql6O}_gvLwS*7^lMsmOHj>5;svdaHfu9_5OJ|Xk9AZRpL@B?dNrP7VbEjH;_ z4{@3q89g$~y;Tz2$lnP|3?)2`+~@62*M1k?|Mr}e=D%MF+(vN+9M)Y-9SLMJHk!umx)L2>^lsRf%ddFAQWo30Ow|*_U?Qwh1 z%P*W7MCS5*JK~vs_1Pbv+i%uxzxV6#D!HqQkdSp+;LP#o zk^Y=#a=U-UzAIHfqR!Z*mz3EUw&Zd~)irkgNna8l-?Yniz8kh;t^dpAxrQ$~m=kXE z>9L%B_rASOYvQI4dM_JJn;)JQ`XX$ew)wFOtSfz`jZQJAHY=`(S?JMP)4gNS z+w;F?Gu71fTHCBOWt4LF7xNZnjQ?T(u6~xy>*M{w7q4kgd!9M#(o(MI_?~EChT1}j zPbvjPORTMeZ~nQy@7vaoKYv#GhCjd12|nKqw3YM&clx|X|Gp*fe|B%rsr8%>%;S~> z*_CX2*}qosU~+oQg|Zyix-~r?ZwanG!!A?oAd|7|!TPVMt1_m%`{ABCOI%}`OW4Xw zsh;aO`__3rT$I%j()oCukonii+g8so)!CPL*ztS3UES*2yW`h$Ugrut9&-| zc3WFpf!8ut`;?b_JyxZ^4sG8CJu|q}bE-PKzs#JFGXA3fRtJ89hUjXi7X?8l&jgrK zIbuF++I%Pe@5|`Bul*%X%Ab73y2fW?FYjx4n=JQhr2^fg>( zXP9N~bj@CS)mrUt`}(-$o(q&H+64c z)B0`gCmH@*9oSj_YkB>y?e&+!!N-C#DsH$Ua6sk2+WB?u)|*ewVmSLCQNQi#o0W&T zRljJgPMdsctzEb0i37K{UG=UtxwFieMZrJnnT~K*K=h^=>G);P3=-zJ(pGQYZ%|Hm^n$z;biv#%HO zDmR~#&?%KFxe>YRfByR~)0bSlv5R+7NP}bKOxY5t{pYrovQOR;t7+iXGhgDSTEDZ_ z=C@YCxe>geepuJlD2WY;Pf|972vq$0`8@wj-2dajqFXYU8q$9UHKr*XTgln*&%)>1 zlLwtGXHG<)>TKA#e12WjdgeF%kC#JEPwk(RXM2_hmDgaJTKfage>s zHu}RtdFjj?)9=$a2K~?3ykBZae?xL-#HZo@t#roAlLOn?3@e|JHf={EQ3J-R|Ha`k^c zwwvYO>tSX1yz9tki_)9VR`v)sA9s_A{&m|J)Fv{1AX)D+i7esmAbm^`M11^=D(Z6h&TM81NzSc$$7w;H7)}&BPu@-ny4@Pnzw@ zfd>(9j?Ya}R{O?cUJ0&1qI&T)ki}iv$79Cev~t$Q4{;T&wvu_ubOd?XTMu_I|iH!Bye**`QzR zQ{(&nbbrsP-BWdap-6X~#F2}OeP!OXIK0#Hos%o|v}>(#Nu*#CQ=7wV>y&NwkJoZ& zec_dhz9qkO@6T>iM!mgW*-T&9YF*#Dv(!BNU;F=;{kon=?K@xfUOkJNm=_U$ z8b2L!uXAKC)wr-fbgOujcE0p^hLR2yixrDnoYdt$>z5w87VtJ{#;cy=5mU{0{ zIA0K!7SwlfL5k?&Ek4Kcez89F`&zeXd(PYf`5$Lw^KzK7=Vb~rc}q9S|9#9{M3eMW+c%3Ks;XK*Q4z8m*=Y8_d3RwjC z*IunF`oE?6TYX+pe(hoXU82XgZoB3h&+BuNqmfOp;{NY@-;b)#uPHh#k403BqnkRTi4uRk;6_T70t6WYI>umAUX=j-+R|83-Zrg|OLES7Qu zjW56c|HHTZVBu0z#)6NVT2=LnrYLfxyuI~8yEpmi+b+>ROPC!MPH243{jFjD?$hx* zGXkgiUgJ@D$t4xWc5j=p_*?}Ux7Pe)>{}l%W&ADdyh{DizTA7eau3!1n6>-v!Hp~T zoek{dZ1htyFf-d$_xjq}HJ(9T!B%%C`c3t3@JrLWzZKMc*Da~Kd|a6Q;>qY)^Ky!} z-zhr1P}#jN=Z){KE_hd5qH+4%&q?Lyr|y5P=cC5B;H;J4mf-t*FK2JOWHDiT>gMoF zizUfw2~5ZJq>j7@T-b=eaoEmi`;TV-yAE8M#qcN0qU?obmg|ar=Fh@9*u^`BNFy zEOu4nn=n)5lDB2g)Z%#+67(Z^XLxRH=6Eop;Q9N1AFJzaoGmB4{UH{*ZU6VZ?_&!O z^P1Z{c?zG&gOnAZgq`c0aDJX`{r_j?`+x3ApI`f}qdaO$GH=7;y63YP$`&zHW-u{m zd^xyGo#EF51(78Ogj+_$vk?p{KtofH`(QDKCHgzQV$u& zaDeumK`vaY{NVnt?eB%>|2U$zpCiGQ_tDA@om=uQF#9#QB1mUHvV8J94Vz8}?(Y9ScIGA~Ci`=5o9VLMs6QSe$q6?Fl(`xk zT^@94ud6uY&-7sX-!-mXuY^xoxNX_`RT0#9KHNNMX^Ownrv+ut*804=&tmZV>iW9U z*#CT<(1{8h#;hF0Gf=@d;_Wg0Wv$Od58`bGCpN!{h z_{uV&4?4z;2sQ=R2P>D)+x2Wla$n-y#B4r4wuqT)!-K-JzJndOxOt<4*0&{_Hs{(f zRu&~09sso=e(8&SSe^Y{;!)XP$2s{eDm{?Cs1KmDd`S$ywYTkUHc^0sfu{e9#+ zG-AtH^N2GBsZsi)sN`e=J|T74Q+HXt=9%N z$fP=L^au4W=gZA_^Te^tqI1W`7A9Z+1Dn1XpSLmIoPB+rbfyNZ;DQ>{(jc&cy%E#} zHP64bW#uE!M<#s>>{%zc*`z3O9>w&X;QjLq#Cdk*%Q{WP+&v9T%nbW;8Q=h^qZEGw^;g^#s>vl1vO8dq`1*wy^F zfA8zM^1FWyaqFL{P!;*NpiF-jPr$=?(To3HI~-h*TOjb@Bx_dsgEu^~PZsX2|Nn32 z>h=4o&M$OsuQRf64uP&UhW33y=MynCTEE}(dDYIHme<6VYhb@7UH`wn^`0vDs5gY~of1we zgKi?~eP40hI`78DWOlClH+w$w|I1L*o+a`jR_hnzA%&bOrUn1|h0-rr9B%75d0TRa zlbkf;gN{||ffYaahMvv3Z>h^!JJ#y=rH*5=o~=Doc= z|9Ncv9T%1J>I@2x&z)rSVakv;VEMvwph4DP^18XDk3BOq{VzC_zrSZ⪙}wt!=@B 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 literal 0 HcmV?d00001 diff --git a/widgetbook/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/widgetbook/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+7>k44ofy`glX=O&z~GV^ z;hE;^%b>-;z`()4*q+J20#d@jz#zo{0?Z2-8JNK$j0_A5nBcMv3z!jXkV20>mU0FL z(OI4@jv*C{Z)2+qWRA|vUt1Q=e|pl_2Qt>jB=)N;p25v1UA!}fW9p6-Tni^HdeSyjz~WlDU|`_NdDD(0ZDe4NiitUM#OTQ5k4iS$DP3N!$86Sr&G@-zP(eA4@Z_G#e-l@=2{c-$8UE_2=?=kVgq>(|!1v#zfC$IQ;Rt{}00-MV#lyi$)l zf(-V!Y%j}?Bf%GVs6?i*S^Ceev7OnmY=CNAvf5bmQG~_wTo;v-^z&`5Lyj->d)sH}Z+; zqAS~e9;o)2FZH9HPj(e+W4>QX!@tclEg955a!fnBd9M-+i~WY|>+3QZ{!cyg?D`FUO~vcif7Oxgdi zvzCR(H$SeGjBu2RAm$|HlC1Y-w?TF@s=$m!Wt5eA!e+3CJko4 zH{M%+?AMj;zkeQ%do5XaAZyKm9VR79S?_Q;6g)jOwZ7Yzt7=i*31#*M$4F=A!?Fqo zr|LgA#!?`hBvrPoj@kXmEt@{u*Rl0B69nutySpL|-HeVb*8RM-W~Vg6^!KqsLZPa8 zH|AE(sJMQq?fRMP3!gD0nS2&rY^q_Z)u^md_w{OcI`g0ND{NkT-Btg}ze9eTn`^j= zUg2hy$fg{>$jE7#{IA3>cXc0WV^s{a^n9>ce@|F^$82ZbgC`xEWtUEls9UA4D3{rp`5=AsY_5j?z1q!5p1v2C7;`_*+{bcj>e&Wq zUV)bDJ9TFFoJx;QU-)f%!n63ERhAcKE{o)-`ahey>Cq~wtCr9Dq;GUD`0rX1kY-p8L2sSsUgqJGVq}zS)W(i387^ z1^ABt*|JvbfbXq8y7F#ES#SKwVO#b0w^*CWhvH1-#*?Dk?^R`UBr7iK+Z`szU>0@d z%9Rkd<%<_guV2pa@7c8(FG53p&tz%kyC3`6X^|nj*?k}GY0VFNrOk`%4;cQ)adu_c z^2_{wjd8rISk8i5{~jCbM!eEJv+!{G@#-0A|CTvIR$XOb=!#h%zQD{`1w>k@LXMZqALShtHIE?*DOZ(S(R8>09$fgmXBB z{f|HR94X3p;n$&w%bElmig%q25B&YI#qr+bGyC};=zkIT!NRW1sQTe&&nAWk->X>_ z8G_yxxBD|4XY@C@@N9kSt?!r4nD=;|WPDP*ipfFo^B#sd2fyiE-8cDdY`gwH6S>Q` zVjn71zHSmP82?#v?^wq?1rEHsT+Rgy;xY3dno8U_q~0xe=Q9e zZxn@u8JDr7?~b{BJHN9l?(nyDUB9-kj^^81&u>=wY45r7X8Ui<>tef*W@qCo$MG@7 z;8xA@BbI^x@7#;E*4KEo+IH=aCljW2h6pm0Iq5#OHu1%3gSH-n-RY4YTdkzDnMznfD|x@>Qf@ir6%To_~MkZrt0t$aHopt1iQwpDg!Z zOsL1T$BE8ixbQ50^TwaYX6C4Kq+QjYzwmIm{kHPukAlwk ziL zi;{ah>yWqY=N-M*Srr*VewVp#pL?c;?}p9qpE6taZ95#UFx$rM&ZcSK_b_~@{rC9B zJ=6U+3b|}7Q`zRHsygg{DYWIM%x=SqD29yB=Kf4SLVmyAaQOMw??2rVil%;F!yxcS zSM5V+nyqAp`RAW@_YbcxDQ?|+tzVth!TK2Mhn;&@bM1OEPxMF5>$pD|kAt@ToMdnG zbq>P^iR+IeUVZg{@MWFok1ao0>I)P1T%G*Gr|Oj^CN8SV|%zAtoQsqZr{}RMtb02r+x(thorrMYpK1xVWcg!% zcFc}y{5xN&;e5Z#nbjpqP2b-7Je#|R>p*11pP6>&Cgd%XmQ-%!a(w?;V*2IMy4h@X zS0sNN&t9)SUFLLou z#m$GCA9YI$C&=v&-M#MAx|Q4+-sZQ8)Ej5p%oc0^sA-n|wf}qHts1^VHUgi&?%)zT zKf&)`!WYFF&Mg-XsJ}hMbl`u*L3VZJ3%om|oHnp|TQtqq3wXQ!_?hxu=kj0nbX(u+ z>*z~-Z05g-T|2RWtIk*B=kG?#%aYK8u?R22Gd%XC=_t-^SsYuqk?leMi`h0`4E>!rer&oZlz#fq$I_3&mLK0% z?TamOYZs3C9C-ZlmH(F0I{sWRs$X{0!Tt5^4L^DL;$Loy?dZ;z?d#~^v%9UZPozos zucu-{q?QFsz15lXX=^^~>j!L|FQspk$8w;}_gLEI$;+ibWd2|&cev}%&$?xO;YWk^ z;H~w?-zzVQtv~LtsJF$vuu#UyK<8}Z$7O!|eoBfJ&)r{`7;xd4^+Mt-{yWVSd89Eeu;uM{xCieIk3VX5DA**te%Y z8kq9lt~hO!e^mT**G;_=F1y@+cLRQ>eem2dvm);J2lvmMJm$PNuNeGLz3|>dWZzkT zUXSxDI2uIb&%Ay5^_TLEKffP*D6GEjvBprJ(_~s8M+To;j*N5FZ+?BxRkc6=gm{Ls z9Jri(?b^>RKif99u-xP@VNVEO_LIecU30#Jyl(D4+koH2+CNWay<$yeJfNOrbG$Wd z&F7~<{!BS+^IT@1PKmWtI4i@WX3BVaOFr|#hpY8JES)DaKXjE2Ls;*V%{^xS@0BYj z-8l46IaVk|`-AG;O?>M$S=1MBTHN2yKRf=!Y@4E*mqDqF2iQ7hPJel8{*`K#CwCP7 zg-$yv?V`NGP3g?jX9o)wTT69z8L!`~>814dnEUdSxJZUQM_6w?k+zc*;7=; ztzoNEchTyqThVkLK|m_2>1}V~ zLE}aqp`5o)`=?bVdp$7y@X&eA|F_wT9>4f#cz)j{JB4?5erX#TSme~4SzW1p)6e_$ z6hVflhSbeWN!&8#|9E`ZHY+SSrTRg`!{sBt^8K3NlDRgzT@U zM`4e^gDQEGgS*!1cb4)0X30C3rNPZ$HF3RvPtDhmf5&zneRNUv11C?&%*N|^3pf1U zdfoMTwXW2IIe$f%xEK~cxFobvWXbe%-@2~~G|jWqvE3u7va)Zb@uw3PoiApXJX(=7 zPkZeQSpjQ1*7*#tE0Z$$I2)=H|L41uzm{h#6Z*1)ttQ5pIjWX>d6B%#;nLah0=3M} z&(!u7thKS6%BmpNE!x6xfj7c#w}hQz#D^0*3@<$UzOOFei;V458<_>~l~q0{e#zJn z;o^K$DKF7!iGppl(M#bi^S?h4n)oPB@sk^0&$Ccg1~p?dqhC9=7q|TV9HC?vBQK^} zRLU^>e))$9Fa9}qyVclmT<~^ITB4(qbV6OHA>Ea8-#3AOZ?ff&yn3Ko_-;?RjI;T( z$WVq1VQwd8j|DS|=09lf{jq+PK-0T$zK(U@qmCB1c1p~Oo5eJbBidJ%DWAnYl)Y7d z&P(yta+L>-y^naPTuPVOK6%e71{F4T_PxrV{M=StUugN``p&;f*DB+9!lor|dwgH+ z#S1A}+nY-yE2b^~qLp{b#`NG@{=Y$AzC62cC?hBLtZ%A{FQ01eDkX-f!*}oAoo7;$ z>E1cJggMOQO6T%xYXyuKzIvNxb6fGpvk6*84d;!H*?!>s_wL~HPy1YsJb81?(`a&j z^;#u{9F=|f_xEkywpR2&@9ew`0sGk6y(_l;IB#CIIgWY$f!PP9AAb5*e5X}||AmVy z*R-Y@3;X%cx2xsr_1IZ*hi@(Yu(}MoIzH#f{zkl`*ymb6bTi-v&?Q4B~wDl+YKUZ0rUv}BoT-UDPfdjkM zo{kqU9<+6_J&1TLt{>NvsQk0nfR@S;=$#ji$+l=W9##>KiA3n@` zuFBW_#nhC)&lhrDduZdB9-e2yc*e-^q2B@(M`gpy@}i6h(K$9%A08aM|FUwLXw8m7 z*S!^Gho2uQIjlBeX7?UH))*C8r?h}o_pb=QomDxj*}8a(|A&L@@&dx|E?R8*yJ9)3 zsQLu{fP_;5*&CnTk>+ckzNtW~#bR4?ef5gaJKH{&UR<8fTO6Yqz$<>M$2?~FrZmR~ zye;d`t`zwHuX%mfOVOn#n{@skWxH_l)TvYF51Y()zg)r~yI(lqZ>m81iDT|o*4Fc9 zn`U2|BFONIC4R@kxEKeWEe(5TK4-A=Uvq(7LV5GdV~etwZpg7F{8+hs-Y?d^j_3Io zXJ@8NKT$hl(ZlKSbw8gUVF~=j(C5BBi|NJ&6J}FcSy}!oSFhfEy2E^b(lyHqSFe68 z@%24he&GYFi|SYZq&pc5t0b(Xn{RK+{cU)UZ`)=?`zQ05FC5r=-sba}{R`6fbv%fU zQe~eYvil-KP2YcqS#rLnd(N*nGckFSuu#6}bfd7kUrqkKJ(asJWQ#Al^Edbt;~g%B z`HPt&8zZ<)zntiiH2x=5Y5$~yIpX_&sb}T3Vaan}Oq$Jm<&@Wh$sy)y4d*v1Tggn> zb&prt%%(^8QQDKg6PWoJzFgCd-c}>78GlxoIrV+~B+pR0i4Kk)dw##$UAV^ifBMZ$ zsr8XDF)`*7+5V#*UPKEzP{>#lUEy5{XbuxUAxGD6Pan5$3 zsU5{(YooqO{$Q!zVE5Ho%<{tJ%bW8rFZ0zt@OWoOXvdSC(ZYT1lMk*H)|fwiWeL|# zqZxe>rB6;w)W3fH`hR90r?qRIEPo~QAn5&#jmfvAq^19JOEsw1t@!q|D!%e&`Z5J+ zHHU4Qvd&g27w1}+{}U8`P$?kSkQvc4e`;{j-v<+zAKc|Id8t3I;!)@C{GCsyUEg^B z&{DaB)3fRiJ+M}BT`6VinAOkl)3U>RTi)GYt-;Iv-X5s?dQm6qsOC)(o8Q6d=jQzU zIN9HBr_i3=Tpx>$WV!5XQO@7IbnC^CY0{UYe70$_D)t!7YAv#z_V(W1->06Qp8lWp z8}GDf)28Vil0NG1Wc}pZpDBJT*e7u?*f-y3GZuSqYHq&2@OJL@+LrCrAs_GDO-`A& zyXMl(;4n&I0vahe>IOqHJP%HQARjXE|O_?%f zinD>%18bJV{|eHs7Ih~sOGRA>ig`W#p0~qh6|c(yI}#W_8_u~U+aN3d;`Qs-wsn6h zj(>Z5+nP`QnEBgDuPd6)oJf^jyhrUrl(ffYIhEwi_ckna{C3d8al*t0#p)9SrwN8i zJ~h_3k44ofy`glX=O&z~GV^ z;hE;^%b>-;z`()4*q+J20#d@jz#zo{0?Z2-8JNK$j0_A5nBcMk3z!jXkV2Et!cPng zj76RV);&M{-U)@^};P@J-as?O3u$l7L#kXB!1IF&zg( zh83rU=AWx~@Dy-kzNX+jV}aVs1v5CF*8KW9f8pa(@@+>Z+e?Ps``f*aWes~8gY~XA z)9?S6e8y;c_t&@S2P0>+Dn?9{jOEn!Xkd*MIr9J8?8d}HXX|;sH_no6jgUwRH8456 zHBsUNZ$|Ouuk}3Z>;EJcFlF_H99t`y!qvu@9``@J;;ZZm$rm~Dk!o!}%l{eK{QTDM zIJ>`7k>#@V47P|4W5Yi`&Ywz9J$1t1`?2`8$MOG-B0d-!SDa2N=hPASf7s?ITgY>@ zvqv_(duQMFRKL#nPv!rqioP%Hnbq5(6|EB38iFLaI<6(8bv*rZXhZeYw6-5@ygc#y z|GP|NFKTe?^v)a04tkGZx^prw85kH`QX@Rm ze0>?T7#J8h7#Q0#8CXC{7#J9&7(jq|0V4x5ScH**VF43NmXTorGlC6LnEp!2lYzl( zg{O;SNCo5DTJ}3Kp*#P*sngvn$fP-;r9of`3(FKG1>XtXD;Qb!iiqw|@M1c_x=umq zsJ2E^jO!oeX{$w?r)niE{B{y@*$+IrUP_7Zi!IWwe; z(|k@Z@thoW`}Xb2wzjsq&TTxNTeoiAdSFR(baeELvI7l_dHd$hox5&s(?a{6?DCQl z3m)O-J#%touCHFby1UZq?%lg0@J@UWVd;a{+2uRca zRQ}*i>-_A){ZGFx8C*(J~Zj0n}v&R<| z{^xyh)tA3=xV9nx{h?Ow-S?~C@0~YQJN%no%{UQL!=8V3rg8ew z)$8}|;yklJn&)2Szn{;m<13$vCUQA_`J`vjwSUj`wYn}r+j$+1o;B;3UB<;S|JjMY ziwd@-udYnneBQ45&y9`A{EQ3dPxM>9{A%&yt?xc6F+BTVHsjF$=&e~-llkp_Jh(Ie z|DWe`t>5iPp3m=`p^>J*BCJ2_zXBbX?~6CH?Dsah zdMQYXkPIsBYBMCL#vN!W5-Cwp_i8-20+amk=j?>{=qiwgRF{$J>-7fm`@%VP9 zC;9)suCK4X)Nc1>;qrwSW(Pgaz3|FZf+<2(insNXPfd5G59h!9D=Pw5n%}E9eA`QM z$DV(tpY@J}8jBifDU}Kf1S|ZS_IBItb)u*CdIm4^spObzaI#~)pX&lG4u>}t^*1-A z9-mk7sIy+yq97sM)|Wdgl<9*|z0{++-xJ;CEFV0Zo&RsX?)E#M#036#topJ|Y!yd^ zz=L^$IXu>1pG@|@m;d9#L;l2i$MOb~2cD6CuScaYsD0e6WdAJkEkpSW%ja`G8;R)u z4wpAu+o%-K!LV%64Rs`H~(Pq@;)?acSvdV9ZI z`gmjOcO{Fr3$z|CIjY5^s@O2K>9F1Jo9F+1y_r7$Y26Dsn;6Xp&W}@hB=2ke5p7!S zbdlB7E7s$O-beYG4+qy?`1GDX^>i}p#;eYPD+*Z*L>El@kbZ%)WYMZaEFOP8h3sW@ zD!IC@#q4{_%desQ5#c?I9~r*pS-fadi7NeCf-hlur22ftaaJ0 z7qunBSi&(_i?Q|cQwat$zmk}uldAXGKk{dvh`a8l$@G_FOWmi*^J^H`Z}`+UcnbeD z6fWpgQfgfEsq2KG{k31W^Y?ze_O|f;?dPA8UUVy6Siq5R{6XISzi;#VEgm#5`=|wo zM)~Xt5ZWiOfAx>U4?DNbExYydAKTmP+-XV=x*3-3-EZ?^K{H!o<%C~)en(r)GSt&1 zr7&DFNMz7$m#fm~|57I?Q<#&ad#y>N@s`5^(dawt=h{>nEoCrbxU|Sqx$}yVC))wG zjg5ND2lniL`+5HVKOZJ4yZb$+@Huy^ zZClcGdH)}GCwgda6>wePCU~RxysiAfzf+&-IWF{ED7o5n`k^&qlg{3e{rS-EGrQTk z-S2j7+|gV=Uxn+Mkw{~dD}#3Y;=Elim+k#_w>;j6F<5+p$JEIQ42Mp(Fm8F&ZgI>0 z*Tw$0sUF-Q(~k)r@C`SA_@+CYOJOg^+lXvOA)bb*;*ZLY{^!=)k-#$TZ{NmiT4y5! zS17YAV7bp{@3M)x?!>VeL60S@oyH7z-d!&Ha?xFWzQ^k=0h_&B~Dmf8RN-R}CgJD<-p*5_Bed!ZtF_Q&3b>qP{d!}di!;gDaLYr$jq zp;LX{jhBbz|9!Z;Z{yX?Y620Pcb?z*X=_~i)3kf>f%mRI|9&*=QTQ4qWye49za3_8 zers@h{+4KA?RqhthypIX{eNZsc=8+=?{T}VnKF}QcS`?<%!9K3)>^!(-Z6Dr#ql?z`br1yQ$L@D2>cJ2J-_Hr#E+*PnFkDa*m_7X zNUNBnFk5Zs@?3Dt=*O0XwE7#J`c6{~-L=rl{tf#=UMXESoJdq3tWIlXfEJgbvY-X@PX2}X2J{D10t)g0Gp zZvQrEi%lxfc=pG*ETeQ=X2Zn$Icj=GZf5t}ep6sp$mRMwBQU8{{UAexTh;cvW!Xoq zo*z$IyEiS&kV)is{eyEqAItt+dvZ;N;qyP@yNl~?&(A;lVcHzVFAT?%+I5zn(Yu>s zyn$`GE=y~1=iR3Je%}2OhL4_161>QAO`yWw`g#58b8i3KW`6!%s&kI@kF*|lVQCtN z`d^OTs6?hoJL6*?eVEL)r105(-{=1e9i;r_=6sIl-T1$k_ha9mk5|swPd9uk^K;{s z>j_Ewmv4P3>}S!qzd==~foIXYjE{S6r7#2)ZdbJUYGN=?D_d`>lEcRTS{i?*<*t)| zB+sz1UhUbR+k9J%1j4v7*SuWrJKIc1@|20g3yo_=Dw|a#7^E+3x*k{ka{W)PSD{;0 ze)uh~^L6bS~kB^TpSNET{ z=5)Pid3dU1!MXp=0{`z=3H^58wrsAp!=JMTpS<5cnl$I+4x=8ShMs>(-cxSm=$YRz z2uhsJn6vlmwU-wcyK6IVXe>EmbNB6Df#2a*FP_-1dhMs?xBSa2N&9d1Mi|{+xpu9t zAm;%w<_X_+^fdH3E?(BP{MJdO0~7zxvQqxHt>l)a{1N+wCp+fHvz4*`?X^(%NQP{W!|YZyA!2t@|cNbmF;u&pVLmUY|FT0 zS?~D#U~`pm#50GiR^?ks43(nt=6Q2;JrDEmUiN+QjrzNDeg*wFIcNV(kvd0t?Jy>f z*=n+^u4_-+H%r{b+hCF0S{-`j6PvHkqvsRvm79f@PxjYbY=8Zy<@4}I@BeEY?~zQ_ zWB$f|Ps{Hw};`+`<%Z8G~IdRTd{apC0iEs9od zGcF`?9r(>yY%+!S@oxE^v`drjm`OH-s7$?kMd5u`v_nJjzttPI*QciMQLbMTKYRJz z!-Y$}-;tg2!*;`t^%5qnj2;_A`7)asJzS5Lg)mL9+mamoX1`!k{hcHE%eT#p(fk(Q zF){vVUHue8)(1BwF9r1V{Yegcmfg%a!?Z}cLDgY(uK{+k);bLu%o>dZK%t~l!Z zXU^x~H{p-?|Eq1D-n1e5DW`ux+6rAZg{y^$0YnSi+>um5z z`=k5o>OVzcO3lmOraEjhW6hi9VtH{wZbO91zu5}kW*?FN?jdXLGc$Wn$&>yr?TlmJ z9=r)to#`}%(dF&;MITen{SWiGT|GI1Nro+Vzt*3wvfMZp4~8YauP1HxWt*_t#?M?; z>D&{=8x8t%KG#bp?f;(8zxLw(J2huZY%cu{o%?zEAJZnr0?7*|mQ_Z!+NHNs7}iK@ z&y_MrXz*jydZXF*XV0$c(mAjHs4WePu;2egHsaOngQfq}Y%aZSch{`5uvTVyeCyS5dm!$Ao2`4g4U=Y$= z&h~Nb4lkLXo`3R>nLJ;=!^zc1Ay~4}@;~dYlgl}RwhGSSNOWRd6&jfq8BGOtfueLQFW?ds{` zJCCi7aVpgonq<*p&a!PG>yi4IzZc8;tX&qw!lRn7G_rNscGnq|@s959?S70-yBFGD zxcj8}?cQzm>$F?`HM2DT^Qwwjtne-P_Il<0>@&FHCf~Bn?`GWa(o*fg=4FwLCcU#m zp8YwxllO8o2=+}{vowjfnqhh;|6|H=#Bv_Fa`2{-#Y8!-HgOFpo;aPxv2|C7)B ztX!qfRqNK7EUi2D^KCbanSXM<8BT6l)aSkMMm=*!{lul8|HNfHN|1|r^?0S7?9aU~ zj(wl!x4ioCXwR+CaXz@&8Dnk<67O_o>Z=7Gfd$P#yo9~j2$RBI5`1ILkzfk?A z_z7MNCm-eRHCgxhb9j~KpG21Qy-M?#4!t^LxxeeL+ySAgP)-HK1(P+>YQ?{O`_Fy5 z+S}%mwA-9*uYEz;CTDTX-#?+889VuZ6vtk7coW~*Yc1tnd0;_rhe_ zd?SYLzb7aDe-&=*UgfR&FX-`a)5S86@>_45Z?>(<-!H$Y_xW<313~lm^-r8{{_}%P zz2=b^uRC6=-|2Q2|MT8>W%-eK%}rC6w+k6etTvg-7;-P1)pAe&#Q9wNcdDNI$!)ai zfO5{4??QIn4_EH{YTq2ka|+{;E4?cJk6pK-dnNrP9eDnp^0l+MVQl|s&VBC=!;ph#7fq?r{C56= zWqr(rz*!}8)Ie5Gezc_>hvvQ&ws9;e_6Jwce?MQ>0IK%(bnJVgdBLk^{#$< zJXNmF{`ypwhtrulue2Bc;|_hJ&$???$7&%5-xB9~)g61kyGOjLmcCvwaYsewZh^>p zo!{#;7Vp23E#UUAd&-ZuF^v^DWd8X| z_8uRTE3z#PN~;+>|6WK8P}csq{KorrpC5;P*7)_&vpMsh|9tLx=bm)=?nOd&r$ryhx5?Itzc@H=$L>W7KL@itxV(4H=Wy>g z`mG-#OBL((9y`5U`RZy7rc(?y0)dm0UB`brD_oUZ zo(Jmu46}G$U}t8#Qj@oFSvo^e?{wcs<(zUN`F-Dx+GXUM&-$qO?fjjCeK-8me&iZC z&#&cAlil-`yS9IVfzy-&O1CzCIVo=_Y3}0w-(dn1lhDp8iv@31RiB=-e@gbAQ!7nM zN-B@Ud&#NrOt#25_tW!_`J*Y1jpRK~tZClHk)VpZ9Oxi4L&czsqCE z1_N`yi5#v?OC{o~W32Vf10Q{7RbP}IY{c*{=KA)6CD;AW^marim`r})Tb{t=&%k-e ze}XJu>-})U=i3XHT%Y?{xPP5fnuObe#KgSKU2Y#t?maiv;GS2yfGOl?o%{u_4_RJp zA6~86SJ5#)e!1ek>CPYOYM=gnq4{lozUOWKjsJH~Xu0-7V1NAGBj=;tKc2tos{AC0 z&8lfr#^E{hm&;83!Mw0r=E4-KhT3CG=1x}MV)>)*l#xowcgI&29rNUO+1%sWntuIf zZp>p>&lhe2_UlbQE1TKd=l?xb%b%6M@lRXw?$4%H&-K}YpL|$0g<*kt5ueQLGPAGS zEWhu&{Ps)AN(;WEz8)JTG35;xV_t2xc)nlCyY~IhjNdog7VKjE`FyK&(2_kOton74 zJ;&$F51;w^L_9< z*XutsKCfr^Sp8Zs%sl_jhcLGGX_NWa8>xTnm%p@SevZKc(H0ZiS?&Gjeb}`Q7!+MH zcw}UJGUjn=`sDLjXMV2NPd=A_P5(+PUum_`m$ZYH|F3Vn8`*iEIfQ4uuO+KN;bN5n zhGopQwYleHyLTtdUO08P_t`uHw}1cdT;%&0{IHz)+E4Kut(aHI-iKdFiA{6XbXt-W zxaXnG(~6B+e~JW-zs;y(b8uKG{6j*e(eDMzJHryDrwwQMC2qC~1qbW{H5Ion{7|j0 z{cZhAt==DdStLWgYw-5X3Ew8L?sM_|=5s%p1J_$Dc)6URNul%GiQG%)I3F8XF@EIV z{Ir>G)8R{1hpjdh*GV7o-#EYeck{GgOa9%nV*OeD_^9I_ozpt~)_;C*y9u|wQjcmV z?~&_T$9~3Hfpg9--yaKwJ||D@56kf{n;2*L{J*|;l6~j@-vYm{|H$}#w#;SKiufg7 zQtzhA|FL+!KS|5I?yn8ALf6^op7e9(Lz}DLO%0q?|9M;plhG7p3&`KjG?`O|&2z!-?N@j1cAD!D z!JoSB<0gye%WudVd}_a{9W=vpt0Je8TXC^Ox23(mrPfDlzw~tVy4p+oJY9|*>X#A8 zGunQCTbK6&zXwY`mQ|>1|Nd$FFSV#02a-%h>h@ea9E6Jw4&n|N=k^zS*|@h^(v zqVL8Am3nqK^(^F6cI%lm{fOen;_CMib3eB`Mt(*E2Xch0ycxl3=oZRYoN?Tri1V_Y8HpK^rPCrIq$(_8 zm^39rs6ENv{olr_neK9bJTLkv@hsTAJNlRP`iWmZH8GyDl)2qj{cDA=M*Zds8Up`! z3jEF$`2Xo^?YWuf%dOu_76041b%tv`F)aQn$jL6 zVZ%y@qqhEiTsrsu_UuWM7=#iTzUnc0@CWjL2=rn1YxZjhatxX5^yKu0xmS;!@PD-b z&r!YSXMOKB#+1pP4DLw1y56{vCt`X78BQJ1@+*UteX+M42wyg`^#`7(*`=5XJT+E#3{KiWX%dHsZI@~B( zpwKVWVeb`k?BT?FXMF8Cdu&;KSBdj`Fmzt7)E< zC6;>`an5q4>T<{M*K_RKJw@Duybic5W2iL< zl#1;yTp?_6;sPfR`=aN0`RzY;UiqGS=BIcrpV~hKp1raTY8R&8RexZlpWm{e=YhPb z*5j}7kEgb5kPOP?{p9K(*`Tkpw6bXN+2ad^J)G4yFuT-AEB~*a^Er90y~i7Vj` z*6{@t6q<9pW)ub3)p<%z7q3`#=sf@2TOYk!7)@pg8Lart$1H4+#^iX>>)Z1=|0jua zckY*PbmNS7_GB=X>OSjKDEaKT<^QESj(PKcJJPypZcUCc!*}VNC8-BCeJ56XEsqt-B{rHOx%CQfiUKvN-ked;iGB$qF+zErx769JNe3~ znYo+?ax=okpZJ)nDjt~lzvRr%>8ablw=qhHrHMu9%rjstwhGYceR94+_Cm)e@t%^E z{sAj%Z;LUX_?;(JDSE(7eDaU|eWm|W?Y@7jK7E?`mUPA*_s-)Mi-aZGUph=N(P{b^ zW%zu5(E4|3GNq|Gh7C3Xvs~FHTz_E{zvAtFmg0XmkIlKSzdESnvi{ze&(C_RG_Ez2 zeZb{DVPZ)#s4;p%z9r=CFZDwVA?yNgnIFuVpY%WIvB!Gzr2=!W-~TOVI?sIW9`R(R zN&BmpgdeSI)HT~JIHkeTpoD8ev(g2}jsJ6UK7EXSE}q2glf!aEbo$R7ml-XN@tzWA zUc%G$x2kbDV_na=B~uzYbIvoFPtI3!>yT2{7W$tm@LN3hoc($K3yYYkbXfOK$~FC-^K2FK2lt;xQ!S>3vwif=3*?wy zc<51U>qZ&5$CDPvWGis`#QsvtGxK_~d19K`(z^l689yqsAKkZk*_$WM>Yo-}EPMXS z+`4dcfCUTBvk3tzQF@b;K6bSlD=XIQ3a*I!dgb!D>*BhFx6Ia*?JN1S?@L%RXQSIC z#sG$nPkSSqHkEBYy1vQM-7l}u?AsP=^E2-cou4RrDCO6TcMHNqyMuM+{1gjWy!v$H z-|71;PK)amcK^NQyngp@WZZs;LaK9n906$s^tFKyF33b+;3@X z+ZhuZE_q^>l>lQZL*oS%=?^d8M$cLAfAWu1h@sQhYilBE+S-qPRIZtJQ1kez^m(Pz znttr9{P6eA@3_*sy8FdFtJKn1q`cT0<~CUQi2QWW;FK|3$tvEn&HDP8*IHG#4K{Nt zztVV^H)ny5!Kd{#za-OtE-IJMJ?|kjFL2L;gV*nF(D(Vz;U_pLbwww0?)hObj9SR=soYZ{4XW+zezR0Vji{q>s4Z;|OYZ+G8ap_$?(yUslS^IWS&{rms5N|^L5cD)Q1SjT_+&#_mFkNF0j zPF}vnVtW4lIERY5v*w)__3wP)R;oF+@WRGd=lv~Di=}kfFBf!SoWgSC%WfmPPya+; zu+){k|L=1T5AXEnx6$PSawz2p8I~!)cr0e^qV)o z4caHrT=%!|#Y?u2_HWlT-0*jM(D$>T;IIAbhhGkfyYK#dX?E!g$2;5`tPV&lulse_ zk6U`-vSor7wbMZzKI_pIiJYwip5 zExW=QW3lt>(vvH64Ks{PI6udqoml_RNuXS9m4G$pJf8!5rBCplHfY>a8>@4|pl0#0 z=U*cA8#(`+5QS_@8$*bGVcG1pNkaw;rz_J}38t z{r$&(uKKh1Q@5Jw^Bj-<^kERZ+w+ircK>OXJ15R)CVz@#{Kk2wyOwE{ut0^^CP(8~ zRaFh+A|GW@z;n-Zk8jaUEspq_s9_DxHB zPU+9p;g8>+`+GO$Ajh4L_n(UCJq%`_kSd^e&{*&Ecg;-UPd5MmUB6>vSO4ao-|AN^ zH36T#AF^w3nRZTSB7?#FK(+_>&#V5NRJS8}!f%#a9vucMe+$i##Juha@=7dRGuNgbs-3J=qxTA74dzgx_pk0JKbgPX!28DumjA||Yj4dg zPn$RM^=Darj(y_S>%KQ~e=Xe1^zX9yi5-bIIqv9`{EF4LEVo%<)u^y%&%YgB_Q#v| zCKm2fKg2L8%V*AkD@AcCN$(`~WVM&I+xtazMSk6_J~!0p)8v+q_eDR&TF(xi#`z_& z<$Y#uVb!gVTOI}*y4ASwoAG>cd2rpP*{ZR+WWIwz!CyrQ6W_v<&1v;}ykfVNGQ3;P zz!s2cYr2=6@gnC3jgRFEg>Ss+yEM<^X88Blj`C~j9`&D#60m<6!Sa)5>7?$IeTID> z_TD@$`_lHO*l!`*i=VZ&2sSyO}pQ!_mnjw*aVudrx6Xyo|E z?)Uq$i#B(JUd}iwu)yzuv4z)}mp{u3=Q~Vq|5YT*(0c!t`u`_us=06djn~VPvL6rj_;3mL~2aUD&NPcrf|J`se!92T@TuINKKK4AY;p>Olh4-`h&UIO+%PzKJ6h0uT9j2mW3Yu)Fvdqw@upK#oH>66vbc7-E^VRU8cyR+ju!0w2pG^<~L*dx;AoiS|7`bxjamF3X1;( zR$JY-FPvqpu=?Y4Kg}@a^9*tld;hOKv&-hld*2)K_oXLQ-f!Vpo@iAd-X~=K`fHMe z&i{js!W}dC8MWBr*^UVP1I>3n+*f|Da=CcaSyt66-iwcQ9N5_Y_Sv6b-qr5Es=O5c z>{);DZ^-Z3U$K9AKYpGZkbfg`bKEi4#bAq*}Cw; zi{IDx|66L+aAUWARNJ0euREB_%HG+O>ZhAr=dShn+0w7~t>@R9lFKKKC;aNXZO$`q z3d^0}EDMA)wnaZRjM&#Z)i{#vORL9+)mOg#m(n`B)qZctzVADq&x^kMe(ky?f(pV5 zR0?cMnAC(jynd|Fw>D0%5qj3Dyr`s3ulFGbkFn81yT;8MbAR~#VG1;k)o(jkB*-(- zK(vv~h;4$XRjwh!%lk3P|33ED=d9bXZk7!j%L?HgFN>>pSV}UNXPmn<)3Ni@q0N>T z*Q-1}d1UVt5y_G!7QdavW_?2T@j+!@Wq$sAKL2@wX2%qsRL$J&2N{+eN@K2ier|5J zw_nvg-K9lR*ZG)^%WPU*{Qjl|Om>p8pQ3+u|h$N#dGy7Bc!a{osK0r&sArZOz4Ub4S>qxb^;?AhgB4Y#g3D=ZeC z@#@c`C$@799jzEc*3Z{_DD;Sb<+hS-@gnyP4qsOI?Nihy*=Eh=s(#__0dwxX|Ns5= zPg=mERL8Hy=8$TY>%p+5t3)?);v@&nX16g)iSzDfMW z3?BuCBd7M}8ZxY$`6X8Wo7wk2UzXd)DlleUXJa}pyR-fCWj^)>##JqJmqrghcm0=3VPep~ zcw3D*q4nnm#k}TumCt7S<#6i#*?Ch)d+o)?&JD9$`>ZO&pYJpNR@k|(f0%x=NTphBsQdd%z0f48BmNCT3r~Pn0Vt1slwpq8 zl;ZiFTYt}o5Z13(mrN6QF!Rq#`TK`={#%lH&SU;&W*xH*jip}u9?G3(N}aEA?$)P^ zJJwg~w?3WBSyL#sPNv;&fuKn9=jZ3^Tf9>#bj^J{Ys zUv6w?zufLK(BX4%#L+V}llwf=X84=?^y+1#+2gze43tzCM;t)@U1FfVYtn)YrPIZ)+;S6C8V$Z zJ*B-X0^Uf|gLZSyrF&`Kj=mJLSRN{-8x+oavwQz`QIXU>7c zcN_Ld&Ny>GN_m4N>jbaM=R6q-${!y(wQl$OeZQl2T-9Lm?PoAMQOmu{zVDw(#YCnx zXMg)1$n|2-Y5zI-WPs$2zH|n;a7l~GPfrvlFxB0?cW>}AJpTQ`uf==UYzs0DXUP(1 zEPZ|L@5>X){c~E2jbuJrKA)ayZ^Yd9C(OP6$@{M7TXLn>i#U8-CM+#))o=UlM!X|W zRPt`7S^Jd&k~zMdn_>9a>&~CYmzZ9qc`;n$jNjmq#C2fP9v%m&+dGS%o;r72zP@Hz zh)1sL0!e|2uUEs@*Zg|9T#+N+K(fK|x%$}%^KDZbE-}nxnqke%t~7z`;6Y(^Kbb$5 zy!C6VUtCzo?!~lKw9(C#;drgM-(0J&Dn5-n@3=3Om-l0|5cTl+;~v@R%NQ|DlXb(y zLqDw+vfQjWXZbv)QNHVmj7P81g$o>iejK;AV^_A{Us~zGy@Ydh_P@FXYD-yCZZ6xR zD8#s2A@dD)#=%-f%{%S?E;O>sRV-51ySyrpMT)8M_xt_-xu?h1{d98vcsy`^&w(hKzrz0=UcH-Oc=V zKjdP5s=DZJ3;&ZIES${bY0R)$-Z#x*yS40rO&+fnw#!8^sTt(IUb{U^EkSA7yIn2} zR_pBF?EQYvJn4!0#o{mGoDGZYpZ}Bj>-nWq(C$=GuV>4n^xM;nJU^s3*i1aJn=xg! zK{(qErwfdEmA6_rh4*o6mvUX8C&=*8-mvJ&iPh|UGCMe}^n~`wd|4PR(XjH5_Y}?v z9Fxs1Io!JQ;lQ!U+(JALCv36)ez*L7{G%TqrWULYWO>EM_($!T{-z`QCAa7++2<XOBgaWq~Col{-E5s(p|1HMNy>L-`TLDCtl{HL$2$BX#xj0_va@_ z{f@3VJiG8tct^ZjZ6brrAEDb{pSSyOm0)-s-|MS^Vzb&y>Qy6kq7%*;J z`mr*hfzu*J>Bv;i?~gtl>9cUMiBnp&mg5Q+)7-gpxj_qmyVK9ju@rwElX69z%^}*Y zPVleguggzr-%GAf`B%lMKQrjF_e84z`Gf6Vj&Ukl-`N8!Uudx!&VO}4*GYE!-Ll($ z?XqPzw(dAN&75atAj_&=hxhjXf1Y1$_j%@do7U{TW{%HY*slk z$35?p|DRg6{eInSFQk9Jt%m0>5fU& zcMtR1@2ULo;2{2${H2R%t zXS=tS{f*w5-QOQ{>DuirIs8R0eqW7o#}4UPKjj3f_``b@&V4_0*SzLO0ekIR1O6|i z`s@Qn)(t=Pl=s|tr2cW{ zasm4}>n0XG-K+Mt>QBR2tIKcuohQ~YEQ{fJZ9;Ip8)bx)q1NmBLQy7ym#C-X4H zIT_!7Ijw!`!f1}rJ2lhYJLbQ4dh$qpTg%01HV;bfF7quvEB$%#x}T@2v@)*E&8uu# z;XC`x0q-wglBJC2J$blQQ1>{4gxax^?)kT_IyM~fc$|LO|BvsXrSkWmDo$+Qsk-k* z$Gp?wpO(kpo#FPQ;jGz(x8Ex|@4UaOKlh1j%4}KPLLd9m+s+62ANbhsdK!Bt&bmj^ zV4e9LAAQ}$@posr{mwZ1?Sk(6M`E*i9PT)pS%)5avFzdQ>py;0K7O&=mZga!;7@Bt zBy*wo=GG5;Gna@?+P>%d+Pf#@*WWZN{C)Gw=g;ZOyY^o{TW**p^D)>ulI0J_rPu23 zw=~~bv(-E%N-6WnUd1U~ox| z@J#ddWzb?^VBlb2Y|mt10V!c%V31+}0pG~#A0PZ*Fk^zlqu$waK7Tx}yb!gO z@^x7kwCFNK4O`}a$v@3J%isk==6j{ZK@HtUZI*~fKgr>hda~jBZOy0os+uc=PqUpcPd<@< z`>)ovirmZHAI-d6=Vw$L@&0wvQa_5vNh;Ey;Bm6e)58bYGJR)utrI(&JFiTtK=s0d zXHT#Euef($t-sg~3I1x+n2c`=oZ@B~Z0NGOJn8I?TijghOA^i1yx6F)Zro+q`XWpK)lwY>NxMI>Ly`cL63m<7TvY(dyJkNISth*C9Z?J9V{W-u5r;YFPIlZn2LxawpH@OscSybn*QDL2pC+kVJmG(2bn!LYi9h%K$ ztl^;`6!Kv9^$*7Ld_?19Lw~>QV71$wwW!*tv0_f&{F0JATiz7!E`6iJG)H{u_E$F- z>~eApU)=VpNc3#U9=Y}31GZ|<_?hldpzpy|8`YxY@tiG4RK)SEkeM`7KzS&T&|OSxe-;<-E>n3Hxuw zEL-_ed&i#m7_>v>OF(UKZjHhl+Im%Jy?tgBy33MnD z5Ufda{6B-0k=5~wt?;DFOuL`t{90*mu&`l?YEECyJ?roP&TmgYcW2hTck}#=FW>$A z_Wa!FtD(#N=KcyRpC5cvBF?3OLx54qfu(~%P=RTbGa3f;PX`Zr9s0`+oI4xLnV!!r zkJC>&XZ!t*)WPZd|2&-)f2h5>s_M*#4+e+kJb(S`_4@ZWvsSN_`QO4REK`1FhGCzz zfx(5#*RMbS^XvC-*?S&0Zr^@=t{O`kGVXdqVHc z3ta3rvsc=@$?x#%J6iebaT{LT+>$B$$n?J5N9(7;=BLB^Lk>^i=(xXO%HhJLIuq_r zl>Zp?{%})k+s$p5{5)Uvx~r=~ca&CS%zI@e_$mL>lam_LBR8dVvRSU1eXdVNN~-9`VcqGc z4>vbApIhI>Ja75K@c7!R3nTYbeEh&}|HJWk|M$~%>z~}KT=u41;Aey1J%4vS>-b-t z4f0IqnxBZD{IJe(fxDfI?T-a7jzxP;I(fv3(nafX`Kd}9r;UhdN^3!d`BYQd+1T|Qg zUO)L;?{n{?eP`i^^gm0!Kbg-hrV~+lH8eceiE}HXLK~BvhzTE8;M;?(3m64@{O2Xl z4YTF?uzmmEwa<6GUMH=p+pKwM?=Le>tB|_(lleV=Dg+soE1QQSF}$Sn0MkpwAKSjD-1~C- z{=aXkUj!N~+j%av?AW^}gJFyK`z1Rqzp92+@~2(<|9bzw*CI1hYnSxgp0CAT&rPxXHu%ll7L^*!Ek>3i^M7r}bnfv_}eoDwabE1{#N1o}YF( zq}^xx?Z#0fan95HTg@Hr8q|1PW@E|fTE<&x*!_&d;;Z7dEfWj>-jo0P!hLc|%>UDq z-h6rH>FEfnnojUBeUkm%o>NwGMR)t1Pw5`2_f76D>1cCsTh+p{3oe4Xcj-UMSbngwviER!!GQs{H%nGF*%7$w+>u#=H z{rvCy`v3Pf>Aw4a>c`Evi906D07d15T9#{_iUqeO``cAcJ(I3=S>Q!Y>qUkaKC)K| zrgIwawg2;wzkG&C<|W-lKfb^0u{bjor0aqiOWP5F9|u4I-Y&s(c+;XzXXf1IeRhjy zDXrpv7TYbb;$iQ}T2Rrm|FWNTtfKL+{*1u76mPI6wU|Dq_&0v9`};cn|85S8BPW~Q zu3t9GDXack?DWOWrXu^_?7d(9<6--J<*xsK);Tw_s)3Tq73B{b=G0ZR%<nHE^ zJ$Ey?-}YF}{=eV&AFX(+KCgo5)O_A6V)i^NJ4zX@Z*W~*-!5AwG2!bU`)P0NuI$n| zITPgB3E3=hlZx5-_WgL&9Y0Bt@eJ>UIEK>V*d1#)&&xGjyV9}v&&D=i(O!&`GVG~QQ1qk8T98RzfCw5 zR=+*e`m{Gohr=n3JzI*No^saP^O!vCipYT?{3evSF%26b^zW5}UgNx_*>zT$lKz0HTu%rt&};wF>rrl&l6W#kJKCR{Fwtn|aTt0Z23MeXA6b*Kyot6$>!e(0v@kQNVG4)#Jo%tEcssJk@=t$^L!jeM{D9nYtv%qYWG`?hDEj5+0=7 z^mzN;NdJNS9B~0z2WwVd2I<~{f3rRvulRp6eg59R+ivImUZWx_s%NNxdU$+?2 z5^GH3;Nj(s)jZ6!oO5oTe9t`wKb{<>nEc5VZv8SI7qz|rdM*0HzwFcVWLP(On zu&sRG=ef1@KMu>w{d;cz|Kzp$4z2}^5BP)Te)|9K`~Llh#iDZ_o-z68e@Ft9L>L5L zh%hCw$b6Ci|55&QYU%;`Ocs;%tWpg3BvyX9zP5Jzt-RfD=LrY#e)l^X0M($uR9joy z{{Q#>|Gy{u+kU-rKee>s9P5Maw-<+HFqkwg;_upg_pDW*2+}NY} zH`|u;Jv3Rcb9~9!dNs`b%xv@b?3h+rWrz3SE(zfvlN4}SmOIN zk()PMzW<_`&+3KcMwy-a_kUe*0a9LSGZ|@qh-H_r`S51{pQrlWt4}j0a%3FVUw_m~ zr+hm<;|pen?dj8F%U)W4I-y*zbE>{1Ddi-zzhl(g@aA#R`GxIrRt;_QIF|16FLg+J zlCxZa%gOrlnW(r5hB=<~n=ap%PQCNrev_KQQ$T~9}#V7Sy zre8Sg%#ii->$w?*i%YHqy7yW>Xkh-Qvi5)8F_q{2#z(>B>Ik3)Y;p{4g zE1QaW7*;;DyZPbyr**4x#ioIbcVNll$l3Sv+5Q=JwN?9B9K_4+1~{01Ww;Xc|9$oS z-@o+tez`O^W%qsWEPp0jNV2&Q%Hg5!@PGFGKhH#q5-!O9`}5qMKa~5v>220>Z~lh6 zzw|wqPA|J#dOdpAE6?;qXkKS*G)z8L<9v=wLZ6*&q2n4}*Q=7eUtGCfh%qyiwsF0+ zeY4^4FTMSLKJ7iqF(YV6S4w0DsJ?PhkYkenae&?Kf1CN9g|F3E%9ntC~QLEa4J1+i8UpYMOaJpW(G z^0nLV{faRcfK3{K~ zbxt!TKmxd{%i(<^yPU>tra!S(jPtI@H8`#3&?w?}hjODIeA~W-t@O88*X*@9J5%wvO9-?p=j-%NoW4a8&`dKvDi3@Uj$aX_cW~Glh(IA z`r9-4q8XEwPU!1R@7b6agkP)pCR=`|uzfq9TM@XqBG9O$u;J~t+jVg~j1mmrVi?{A z>NyE!r)sQXT%cP&WxdL7o3AH3>*Lo=oh1ixiUN}y$CvNl_kZnB?mIBa;RXL6u9bfR zzbq2tdFpiZVAt#YZ@1mvRtricQ+`wmGAd0FXjGgjX8OBT(YX4dTDx$X=fl?Q=Q%4i zDoq#j3d`@VIXmO`71l|L=l7~lIb&)3LGtlcKNd0lxIY^g_gTFK9#UAYW&ZhCu_7_ca=uHsM6~A zVZ?EA*B!p~E;U&lae z5#xd#i*oiB-7C)g^W)?EOAfnS8aR$PCj@MB-x(V9@4Nopl(uB8?G={C{Y5=1*;9mf z?Ue09;27jijy;M9k+i~jWA+nRE0!^ixEm+IEbi2t9+%xAIS!d?bfV}=j6Uh=E| z`?~kr*7ddZzvX40d9ZXfGl=}l{oHnj_w(!Bf48=9mdxGM@x<-o>IrAxb9EIj@0^sb zySA<~i}9?j@v-S=+?P)|v*Vw}CDZ5LT`xF%W*9tN5*}CS%GWe ze*V2z*81C&7oq1tt$GGfxTl`^&v$*s{$9Q*$<|k=K3lp@xBIsIk{!*D?$jK55;~pj z%-3-7hxN^z_3575|IgTWV&_leRG%D{6wL?I)aO+^vPewOXYVSNgTH@|ve&b!Hm_3QKg`<>z!m2_>aK6xw1l>6DQ&!_H)wi*7v zT&7=m=6?Tj-`=hN|Mxea{htrbw>i~5 zD>1n`GMxIaC;54Q>B9t#r}IN3-H-DAZ2igAzA$szcC#nSpSd_s%~pFkqyCA^tj=>k zS~x&evHaWDuP=8tT$tXvYRMvBW5=ftuJ5k<`)iWUQwzn!zs8n=FRWM=Y|pE!J8>rV zk?phhY%cpd6u-{3u6*;`;AiW?Of`o^pIA8<_5~mNHuG_r_RNc}zlF@1P1QdxcI&nB z>0y}5zM$X9Z%Mvh+Qce`En75#-`o9uqbzOpRenWdNhgC~MxR5Z$TidRJTrGsKXFf; z@zm+Fo}RaVw(?94myjxt-19DQ--$gF6cjG5=~VsvQZnRUTt&L(8{_#u&zvjrnDC9s zWaU*I&wDY`7D+HfX%+-7yTqwJXM^wON0Xa41Q=Zz?*1!I+4g_0(X;rz4Hxc*^<{Br zoDbWT_=(F|*v+jbLg}*;(|i|pf4!N)OP-!D{g-&*y-u%=x_!p_z27dyFszcXPc``v#<4_!ZH?y&m!u6{wNt+?vk+5T64 z8&tAhyiwGC(z;`MdR0G*b^pX^|3lt=c-|TA#%wqxW-dp@dX^I_wp=`-6~x~l#jtd$ zcKEcEPsgekIXY%3U8v=lvh?Q8;f#@#COfmQz{LgnZ{r%K**mRmTg<`MurIA(E|=A>7mGK3&7W9h9`#pd zLcO?BgW><3m)_QIKlAOlRek!6{j2^~C)M3bQtR%qI|7Q)S!pv@JBrMlK2;$3-|>@t z^)jFH+se!y^IN~!kZH6gN1EZLh{>W5R|AGECo1f#Q-2?eySXP(oOcPRtES8(@p=C5 zq?>p4EV%TRpUeH_>F5@5%|kK=te&m<{E8{ML|ARTfyvn;!AIq1hKrt#+;mv}_@CJe z=e+%Kea|yf_T24v%Q8Y96<&zn*2Y_qR@(&l+#dGk%U{8*woKv{m`+gkY;vlo^Z&j`MYaV)%?p?j0=cl}NYw|xcwaTxjKOVU4J4Zv> zJmjm-R++PMbI*ux=dfj1!4gwY4eCbCySUiBm^*=8=$|r^GDpa^@4B;hcC)9>{qM2k z_Hzy2+SPX^GJf|EQjTOe{$PbcWuw}H6@F}IABA=q{M3AVaM2(8UD@*GKY|^&9_;)3 zHeX)#Xn?YVJbP(z4FlA!O8c1m8r#(O`pA= zE*iH)!hVEUe|LF`1}zoN^(uWjE~+QW89mC0p6(USL9&rdn~_R=T*;?}?tv-umi zuJ}#9GCyrz;Av@<-#&r=miud;oVd?1r029U)9$z1Zm+X`yCpbriv6nv9Bd6yNqvF^ z2N>B4xF6W;i=DDlm1Du}|6x5p_4&(J&F2zK6Is~)OXY;IPh94O8&6jYAKKOU$v$e^_tew(nU*HR&5Zfi zcJScALmKrV{()AjKJ3PEqikJ>MA^YGMki6X%}fYM47$;GZ&6Y!^e?kNCeiH}6E=y=~9M6Y!^E<|2*y z59OB>WbLQ+cNKHxA=EH9-a;C3fudYS^c{}$$R?EfBYw`>c21@*(tMhWqzm!+o}v@ zHSUvlXY2UHEy!eZ-dyoy-P6sgmJz%D`p-M{wl>$N>)rIuh8L#o_d@P=y6c=-Ji{|% zi@;0~y(Iw*@=sqx?yITnpL5GZHN|R@V55^F!_)fZIq$8b%YJmq|xl+b=%z z?P?X?i#q-6bO>RYV^|;gy#D>Ag4cik{>bKUh~E>xV{JmH=dX*)MDw0Y9x>L5m5_Vz zmF*_)x6PMV{%QW8RdnZ^_4_?vZ){BdIOFx=b$NQ-u_DX|GJn3`|Nq||7LDosimiR! z47>h5KQZHf?V>-;+rIN2j<04obm5lCH*o{r*6h#UJ}aL$sJyx9=f^Cubv7HWyidOL zN&bL|L0oKS!yDEOwOf}<_P5$e?L4aVo~xDGE$8 zk8|2^aD8m}<~=Vw{- z6>X}1oi4rjIfsFvB7|w(yt8Jv*MR1I zW{2keoX;U5%&1Xc^85bWgl+rfjRJlI{IPxH7W%J3aAC;D?CV!`^rxQmmit>!aWqpx z?T_qc?d{(~ZC*$z+cK;#lw?ShTYAQ6dO0)0fkjMJOOig^w%P0vY@jqjfU)Q2V~_hc zH*K%i)|367zbxWz2R&7Wf41zR8Ot%-?MAyktH0f z8Dw5_+cG4vAaQ_%lww{pOg!g}-i&?RwRSAAz+tDUhYL~p-MuH5?RhX0dO&(!Pe z{`>bq(hh|LUFI{ka+RhGAMQPBKmGAA!-VeB4B9h3)H4bkNVMC2a>oC+x>BF>SzXSG zAst&h)7;b>rU_%`3t>jn#B$?yAS`6q1VJn*=$7HQ)0 zde?sguFZ-YS&sNVKYCjKOy$MDO0|b(YyLMsG2?&X?!q(o+3nb>6$~;jsZ_s3a*Q-t)P*jFJCSN0(>7OoNB- zB_dy$_a*k=VZLw?u>ir{D_-rgIbb89nRItB>h3%3Ex*>dRH$*;}>+&msw!y{8KCQu6zl6Av)V2^UsruZ)(Go7xgyrmc)5%a+?AnHfF@v0QRdAHJ!J^9;xoo~WScLk4mZ z9B!>~7kgNG;J5G7`Crw0KV4M}m^SUd>G_}QKW`U}h&`mY@8a|r(dr0|v{MuJE&uFs ze?!5^>6sMqH^I={-^ehi<=V_)nYkVj`d75UBbGv>k{(?@^kw3dX@toQc{dFSu)J$ zSbx3MHqE?ag9cl}Lji{XQ{#1)LCr5V$_n@xKP+xP1n6xjZBeQHKH ze}k0tto3gnh3tP^xnw;r=U-hH2Q|h;{VN52Ei;(bqr;q&ICZkAAV)u_srho_;do;` z$F+CTG8Z4SKK)aWVyuN;|w}0K|=PT<915#(@xi2taV^C)-`@MKh@2ADL z>$l0gw07_N(p$WBwd>kVD?jyHaRxjs(N1|fd)w-tH*1#n=*|R{vNE~#(qg}&`x|a8 zUVDD!QOhSc8CI-jnaLbben08XiFq6*3Jg!{r}q3@eA`}sx>lVj%b^pzscX9KdmFYt z6rAez`Ep6H>(Bb4e!F)cmN#6;m1de6+E9A)Y1ntLL5z}24^$3Vxl~;CW4Z9Q|K`7d ze+Dd{id+N##HAK#r|Hi!Ih3=Q`R>1rpT*VpO(v-Jui)U}=fAy6ZTl(tr+Ph%3f{(V zygH+nFHvXODA@36zxTH9dt>{)^j2@Zoz}7XN2uR+>FswCFRxtK$XS2m-t@cw5+^Fh zatof=`iWi7)qr7+7pO4gZ4k42new)mLFDCHeV&=t$$dYYwWqAqvUneJiT~=l|10L) z)>VHJTob45{kQM_+Vee6XVhQGQnnTR;Ie>&je+Z0@RGBVHrZW`Go2Y`|B3nhW3yIKgqVqJ}xXx z0vbJx0ZabQY}V>2oa@fu{_CD*^1tnsGB2e=twR6JeG%2Km975b`!wZR`%T*0zrSVq zcIL8lqmr)W`Q3~GuiGXnGW79O*{|pE6=c+SBRx;v==&)(`&D}$Z@9i?)sL@seCtwjooJNv(_KW+s_{afDk>3Pt8F=pRyg#rh( zV>(tFcm;oBl+bYL-5@a2g(3Ohi*NM{s+Q!-Jne6KIeqcnu6W1Z#eYKIm7QF3`*+aK z?6ntFnbtZkFz|j}Rb6e#xxw_j$Ms^@)Aj3oe(VlC_9v8c)ok;EIdTkwQM?m1J{|WI zZne)y_c|^A`pwZ@L%a2E{zT%<#-nvgellkUbKbQ2&PKO+pt|W#pCj=YH2iTt2&a-c+@H-dnwS82A{kTv(v4$u!mQzhd$ENmWnz_jyJgx;4vBD}K(GTg(FL zx!RW#&d7WJJ@({h_7$&&6V|~TIa{xWO*U2yU`pire2SNkPwl6kdcy?I?luO#&pVUv zO?dOxe$k)FT6xyB%jK?E2s4Df3;W6hF4rDT+~-=|+7&m?Z||X%k7t!LGu&UgYhJ?@ zL8Zg%oET31&(it2`PiS!Yzsn9UGesN`^!CMk{p96%cVb`-s)8Uo`3Rf?cPz0x5eBV&aDub&h{WyK?nWN$%-?f>71pGsTz+9N)+CeOUfV3wKJtSy<7 zOa3m`J-zPI+xj^@KZAcR@74Lam7DP!!xrw$XU;59Jq%O+>(AGm?LLj)?8%fZNBP@s zg}j)exS*I}Qv%ByyKO0U8`*dNm6kJM6KLd9JRsM=$9O)+x*yhw?f&#VXoBa|vP)k) z1y@a7dAZ5Mal@7OGc;BEeyXnxS@zz7$%rLjhVOH(;0b;9q9O|693jX4oPNd^`6@hk z%2gqUc(sc&XN5)opUc3OdWo|^%U{Iu(UOmk_s{qFaoFmA;orF~NBphYgc~zBP6#xZ z$aWQOWM3fh^+b@11H-A0X*VCf&$GOAy>{gz?@NE@tE`Qlr}91P#*xVX^Ht)l-}Y_V z`~Ksm!}8`oHwG@8&ym8+D8+Dd1-sWpHI{-6{MUZkKe}~K{HF8I)t|zg75XB~=3Bg+ zysS{WZg2l7b56Ds*=;g!imkqX>*un5+39dwU;*O=vlTM~mxBUY#`5a>#G6l!`|teO z>OR$0*Dmlg>)vfYCTrE1wmmxWfi36#X~X{(7Yum?Go+bJ7;dqd8oyFuvbd4{t~<4O zw#>`d`!0oC%luSyTJoFSx<~BwC)Rh_=S6-iJNDtjREF<=Wh3C&754hDqiNr z3^jF*0-*#yt*#^?#w~x=i$2YN|MvaTC6hI57tArKjWV6O#9w!Num{-^Z)RBxRK z_Fw|P!|erWZg1TnrOtumZT2Z2jaVL?;CMP;Y`w+L>{)(V|No|*`Trtz=ehXTO?rYS zn3?XdEAVf1kyKW0xcP6!2lLye&+@ll$*q6F6T>-0oTt$*Zr3;aE*`DwDJEubeKLQ_ z>k9un#$U4Q%eIg&!j0Dy4p=g*JvcR{(?N^FVPULr!IFHT*7hx{p5@rxVoqpZ8Z<+| z=fbDzOeV_>Y}pU4=v4ujs?!>jk(0_x#*8#Ym#u-qT1Az^54G6UtX>jcw@>EWhNH| zZP3y=FW-PZ7mf!Z`)@xt4=I&Hul7d2#-K zi_)VeM;#p07{!*|?q+i^oOg1aF6*wp`L&5BY_zI>uNG>SUg|0>wkPZZ&+P5ubB%xc zD{Z+GXOh{LIQKti@Wr?D)xtk1G5vIMP-EQodTO?%LCw@?K11USQKo=@<)?!7TZ{K^ z`D40%%l!aTtts`(V{?BlkM-MMlvsWLamtzb?!SI19w|_oV9%1l@MQftjg1NodG%ZV z0Z_-`R(%qytC6zST)<`9_>QqCYM^e_yXSWL}iqlI&yY z*EbqH+s}Ud&*CJXDy0eRAo~|i(@5q8H4pVR|CL|a_j9-CjNkjF88o?zF8NfnTQFj& z+bZinFL%@n9gCWmX7g=g-v53}@4vGGjplI(G}Ke0cQxDzWc;}uuhtjc9O{N&u3rj`MCzbOtYOIq^ZQox# z{mS`o{?SUI>s~E8YtLyv_lNlO_GzB6_IA2(t%Khqie#a zX)We>kT8Gs#&h?hUR~!3Tqv>d(=5#sVNc$k-mEp{9Aif|ON;L9ErqI|KW55&{=Syq zO`wrU@qi@*>#8$KVyt)nm7fUO-<~pgewoIzvL}Ko=N(b%T>a&3%^?Z18~4QT{)>5@ zuk3CwsG-L+hdJQRuCui#Pc8aWxa9p??#to-wk_KJHG(?F&9G)M1ao&pVrc0Jpv__<;0-h83DSz)3JwGQiO|DSb+v*pUC zrs?vt&$4?xD=GV}eW#?;L4j!wiv$P1a;Jk4%Z0b~b2aK^Ue5lOs$KV0ncx2DjIw`; zKUFi|?*7c7b(?4A+xlDYWImTCAFEb+(9WRF_)GC{0cdCkJX|!t=yd#1uFFbcxBPbA zdOLrbAcOPq(;O0(m$nD1rtWiT;3yGdtZ`4tuU~&HYmU;2 zL+(*eSLVsoz4f}B^>qLAo}crNDA(Q&oqJ|^1IG!K1BcekTg(`6fZfF3wdvD*?c{&o zPw>@e#;*Ev)wes}`p1%s-Vf7XgdF?xJEeVp*_4(_fyN{yg~<$0SBLh1GW09M=}Ql+ ztlRw52V?<;KQkSqTazi~tC(|+aJ{`CHm&**dQOf*Z@O0X_UO*uZ}*QK())k!>fXP{KZfkj zXqYsMgGJ$hX9ME{gD#FAiVb=HXD@wPAI|hNe|u5x(dX0C&0B7J$vT(>C^k>MH4jX<*pQg``8?CyZGRrB1^$T=+kJF>V!`*xhX0e71^m1{;{s^0u>}iP@e0Qsk0!0U z%CX?7{qv)nX6`L;`Kjz5-FUG7wD-sGq)&hE2maHDKgAkyM`Z5HOP`L<_}{|FyAU*K zxLWXm9m86;8Gnj98NS>#J`tO$9LAFPd7c7c45_*%Q}n2*Xy!*J>x0+9ev`m zH_NSNhVP6S{O8W7x^qlPU3tIM=;8Z?9o~P7LXIq3WTji5xooxI1rtXOCjF=O!D+we zYYG3ecqY%}FiD_sieLi2!>NWzvHJusEUo))HuLTL_d#Y8?|BECdkU#bz5dhx)C$ss z^5AYX+xs@N^Y!`mVun8(6MZ;X44%~=?{Abvit%eM3PrbyYinyH^ z?*6m5!T$QsZowa0wtwBau}r&u&a3i8GB3TK<}Y@!7kt6PG&^_O%^T;Q%&A+~YRGV@ zy-nt?K*Oi~pO-#y|MlzR`Jx@${zNC{RY?X(d_HdVf1}M+{nP!dsme?{T^iUN^j5De zc6#h_|7Ot!|0#R_TC3;ovRr*B+}!tF-qZfLhPlU29JIUiN#6hIe6=f2Tv<9CL>Z+R zYDAor89`(z58#u(9`;JU+m_+ntnLFRY|yUkAefUg1+h1M9YhB z>sN32v+z$MN6G2b?cZ|irJin2-17IuxBoM?{Ha`$FQqY=T~L9kj^hHu2j{kjrYv(x z{~0~AS3fjy-_|3R-+j$6T^`nOH5%Ra{!?=ziFNVP_e*aHZrkhg**-CA{lZWEth&O2j7kE6j8Y7OjIY&- zay~Ve{&SW8yk4`$+j{$|ukYnvUw@vtO6JYy&dius%PYWT+gFYY3>mh^cAjCp`)~W{ zm390lC+@q@?YeKv*7s93yS9ejK2#1 zvEERE|L32oY#WcuoJ}?Be9C36XW#pJE6D24$ySaX0t*-)FfF;A|B?65$~sr;8}3v0 zUR$qKTWV^P8(!Kcet#|7uQQsvzn{waKSAnbx99A`3;r0YrBlKGpUW;44$Q z(E2oU`RdQw!YplPcl0^FNio$k+`Kj=rdFnG@@9FvO}10(c|)p#Kr5$TO?WmvapLhm z(K}1mhxeKXGZ?3w`Tr$z@1?i%^`F*9mkO_t3;cKX)QeW{%^O@!$unur;cW4quqE>2 ztmEN~6^D;ZvdqkyFX{UCzKn6u5w`|5hnyE(pp^#Y9^3yn8$F9Z!mazaOp@{JmkT;S zchr}J_xxPF?Udc4jGy=aUYf8ovaR(^viU5{(`g^yP0}t4ylhz$)D(R4$fSd@3s!ue z^io>=F%Lr~zniSsmMR)d1R>{xT^J+`Cp8FD~{x`ECYTa6c z2ixD9_P@OJsr}RW%Mcp*^c60q7$4nEy$``d6=3dL}d`$C8 zYfscPKVHV{EFm{TxQTP2aIuN{5pf>36gkFk3@Q7%qO=w4A|hUew@ll=?UShCezE;h zOkUHku(l;e^+xx$&X9@BgJ3SXY_*1}E*7-9_RV8go%(Mt4k41Nn zSlC2wtACfiegFN%hdxXZT);TNXhCICd*1)oPan@aUi!~8RbSq(rr_?{Ut6Zu+^G5* zoL235`d!M*57W2j{kKjzBR|{W=G}jZ8#COVUzsg%GjFrWypIVD-gi&MM*q*2oUrn~ zv4F}2#!GMe-_Bq8r#T=g<`%~V1`p|rb3QbGIv%ut&$(~qBKvAezs_FI6@RxZr1@Fz zo-6Cu&E4Pk^Lg$z`(uCdOL~9ae){Qib>aip)m=fc`m+KO6B@L0j)}h7_1|Mv&MPIS zdp9x{cNI3A;k0yXYu&+|;<3SVniP`>Lr}AkeUHJj{+oBUr`P1y=RRG{-Ewt(-lYDz z8B)dCY3aq_wiOa4T?=;^MubdKNm+36YOk{U zoGk`YWz(NC>(*=iw^(898^n^qpyFzf{?c&aY0FFHFPEM1jx%r5FM91R#>F*#*VNtD z{(R56xl-nA(VfDQlXJGZ$FD2@g#=HLJPx6hCo2Xp7`P<);s4os@E@`ZKAb2ISa$>!R z<+q7%YyBroi=DUad+Vq9%A5Z_4?F&6_SEaER(-qfZ~X9s&eoS*pL6yF?)qzZdw%l2 z+*K-Rk2@K78T=!ilfo(VICxUw_}@zHeFIrmb7N=kVu9nM#=7|GO%AS90-{ zxBO4*r}zB4zd_+w&i@@2s;d@@7_oA{Htg2zv)i30`6m7@yORHH`*vOFm!Dc0zB8T( zuT`B?_Uzf-wDp{|D{H=FHC5DfY<;@U2HmHB8%@uloTCMMerSaz>i6T-6F<`sX@ zME++j3(_+ltyr;>tuReSu%n%Ux1nOkQ=_X5YxM0(zfZbZz3A#k;b+;;mTmNk?_O2; zq)9^a$U6*}hvSJHDsqh-6@_o9b8q?x0 z{yEgla?g8;y;{lB%$4(vpXs0aUnTju|Juv<{d48r3JtzKei~i4k5fx9^CW}aDet># zk+UO(tIoQYy*+((L%?Pu!+jDQ7Z^0$Y~A!&{Um>H$gwlZ-E)SsVC%imnXip(wi`aU z6K$!rcUK43@4_uNwj9Z>-|&_vAf?w^>GiftPwX?d?~8eRm+xu)XYRw#tg`d}8%Sux znf2*@Z5Py9!f@-I-(sF$Z(2@DCI4IgPVYSX@jr(TxXvROA?f8`$A?W6t$maIvV zT;_5r{3GAwWsS$yX{6q85Yb~eDSR^M>@l&Gk>@rqNq=$q^5@c5$sq4VfV>x0>!!!s z)6nnx(zHGAT`r4D+Ki1XtITtrE=}}wx$AHDF8#!eJh|h4@+WiFKb>%GZtv8$-w*p` z=D4m*tjmm&?fawHuN!>F=J2$q4w9eOzhO?auPiK1wNknu#gf6Wh3$Gw;n5>YlvDf; zG+G%NgkLh}%C2AX^>ep@^&Z2}9}^^vX5YSf&)nU8+oGrS%X@ytx0n7ioWRjNw|D!m z!^*E0UGceE>e{}yRVHEL1m6{JCS2e5sir1{>-ZmMMz=+MN)F5m7Jo=rFFwQB5OljV zrmmXlP5+)>m;b%+mwREn{N#+hd)IzGzHg0cchMi99cRW7XH)-8NUyms}=0!)X zIrQPC@3BAjdaE5jeW|&!_~`CDrv^3$^Q&c(H+?&Kxxw(XdFl@J1Ahg}?we~SEqd|t z(x%_H=BXO1xtj@1`*m0Aw*CFqx3$Wvo><&a%ln$myY!fcY_~-xtQJTnVesQB&Tz z^nlWpV*ZKgkA5Do6R?~mY}6!Dd$)(7nqk+@Z_KColo_5+@t<1DbZOrnyK@|y55KMc z5qyPrV%O%YE9{D&ZTZvtGyeCT4Lbv){@u72zL7h)U^m~POWComzR}0!owOG3>iA(E zcex@|K?4e_W!Q8+qZB0-LVl?=HK4^DmmW1%l(xZoaWKhLbU zO;P#B*X7^0z5e!ipYU~&m)DNo`&TLb+5PnYs5PJYcb??mu=TaF&b6rhWp~?rZ#yja zxst2UAto@rciH7lis8JQRUK@ewa6S-uFZ{jabAP4Q)v)5l)d@Wz=>rAf67OE@# z7blr$-}Z^*`ZZHB=jZjs$9L~ha$r_iZ+e|^r=d*2uXjaLHsna>Xfth>Uvx83YgJv$ zSG#PzzAt~bX#C%k`@Wj}*q_w7^*8eB*Rq#BzS122_t?Y7KNlQHm@>;|(sp_Mo}cse z+zjq9$GI%v;P?=z=cK!BBhQZ?vZ}Y)s?TzIEDE?4!E%1hfzs}-+uVm{S z^GbYcm&g1>mJEiJ9Yve8q}rJKCUrJepDt)9o0}GT&7f#+*sj0*(+%(L>HV49Zh!aQ z_DIXiE0&v7SQIq{PS}=jm_fC%dx;Mmk;eW+`f7;BA-_5_0W` zi~oU4BbkQI#>#zV6FKYWPc6MuIqPh%Z{51-hW~Gio96#qoVTTPb>56$o4#&dw)ya( z4(6j{ z@-n9Snjh!b^Xt{>>|&j|xi5a^?Td7kl#=7yIcmS*0(P&lU=q3axy*V9k}> zB|PGfrvEE7diI|)lGo{}Jl}D>C0<{@zEG)aHDpL(ak%Ba$EuZ~joD7~?o0NZX>a|O z-aY>HqDv{u66&be|S|f^4s(H+Z|oMrUw0D*!EAdt=IE_ zjpHS@ms6(i@-hfc`(5vN?dRtZd)JnA>`d>DA8S^TcWgCeSi-I#-yt61HAlAK&6K#$ z+jKW&vb<5h`)|4b+p|}#{yPT#GqI)6(xa#J)?5GHn{wuV@uENOg)8SvOWpgepy15V`Z5=^jKP_~@xI6WRVfA9 zf(?QNB}W#wT%N-2{wrx){k(7At{eWB-?Qap&MLc0iE?jvKY7l2Z>WBN+y6s$=O_2H z#Fno@r<8qCzjSnoJW&@q_Q!upUVYwsX-+>OaSl-STN-roy{&#g>C^QZ5lS7kOdG5m zqLbcg95tEwwtkI-eC6wJ``@i}Oh2<=j?} z$M@1?l`C~Sr$<yhg}KL8DqiRbUr}N3`O=1k zLffaESik4D$M*lrQzpxQ@%gC4bhpnTv5lc?i`nKC{Hi?-|Fa&>Vd(i;?-M59lk4y9 ztaY`;@c-loW~?E>(q0?wVv#o5;hka>^l{vmP<4CDR+;U7x&c+L<`v-@y~VlqUZ=V|i)q z?B&X}7jOM-O&~lmgY||Oj-n(*6;yBE>{M5ER?J72267Ik1vikqz zzOQ~ex%t_upEvHAb1Z$ZV}oaQG1H`3Cr%hV-R6J8h(*~@h`Y|rU+1fJvDC3Y!D2Nk z-oH8=@&r%pW(=slo+^}(r@b(m)!m<=jroxj7RE`!(KJE^PB~*=gJ3QYa$;qC4M?o`vg|E%bRbPuM zKlpN2TbTK8%eLsQ;FLr1+w#vwpZgL1u>Wls??)ka+Ow_v_JF1o*pVKgXcCPdrzZd)ZwF9_P zKb?|#^libd$KhD z+a$yP$tm)UAOB`c7FQujc~$wP7bAOE{3tG zxu?Y@hdLWQ?Nv`&w&jn#TJpa)-|`ze8C?ztHy+|)^w{20$8E!X>Oc*szH~o*WS{Mt z+~&ZIH|~9ZvhrutsaEw*_47E^{|WT_Ex!EN6%(fUY2x2FD|YVkces1#r$Ogz!}6oc zPX<-4>^4e1^Iv$A$dps}S#9z=9T=Ee4H<4Q3k00D>^@X*;O3^>57JK=6k{$wO_={V zr8++H-Tc|yy8q{QeER?MPl0ZIXj&n6$CqE-hnQD0&#`1w%AYGJ(CWz%W$NQJ;n$>$ zp9fAKPrue`@+{?Rt$(CRe6KYr3t>Kf`&Tukm)zThq0d7H&J#r!?DlwS{I{f#I|My#E_5 zrNlO!cB%g-@Id7N&o#;Kj3*M7s)%qFGu_))o4@baA6Ma5${N^QYEe>I z?EBAp4gU+LoT<0z{}Q_5g;3)S4w0h_63+x2-lR8h3M(|^{m)K4^WQ1EIzBqF(e&Nj z#KcWKlaF<;KYRRJ^~EfSX&mR`#fy$Rc#4!;IDP(Hq`3MN_rKsLA^U|bp1o%kJ$$Q! zL7j1%;F}GRg`y4-OFX8FF`b*SU*=`?%Wh@&UrvcDjY7=*>Q?>8QI%-#pX*k6E77s; z4Cf5>Vx~4{6&^>SDWS1*#Mj5V{;ZGN_I>V&=Gs>q9{K(TW!rDb_e|WsF_^S=uxKiQ zocYA#e!R|&h}+@uqSJ5pPS)*dH(9r2Q-U8u55s;-#s}*wmniC2?BG=|`8{8E_MZ

V=YXX2-Z#;ltacXvmP$=uofzvEsW+7Xv&sQ#e!)f|TPKMZR2 zX586RVDH;kV^{8f?%Vf6-H9#=x-1zCOIlTaibye*{Ek;o{%1egu)ca_{2V9egAbRl zy=P&w=hBjc{!c$W>NhyUSs`f6);0Uu(`nVyN`BAZSlyZYFO$*7ZY5}i!OBCPX)X%4 zITDy;zJ1&8aqQ3JxNS|X_AgoGzUg!B-|*>y#>4Pyyy`|wA!#R8|2!mc!<+A$rQft) zh3)%QOiylE>(a2AA*wUa=ibwzS-F#DI2lAf6mZ!7|NOia@z3R#PKfLB6O9wGi`$a< zX=CNhy7e`JZM95slPnn%r*ZuHxFP!Ahve$}#>-C5u%G_xr{l2#r3qS0t&&V0qM}C1 zOic_?|Lp%o-~4l4``_)~X3Sh&yx|f{qZWSo&o7tx!IAHjHlMw3^E?I}!Ip_4PlJj| zCziEs`Lo|*^O4}cix@nkK%2)8NifV|neo9h;gc21h504TZ$5la4*WMe$2ZhHw0?0) z!P|J-&>hxKpSrHyv-eSy?6RVj-KtIc?iQ{Amv0uGn{^@EZ|co|i=#`$HqMp&>(an+ z1++qRLuT;j&DXP+E^FstQD~UMLd#B`pCZ5|BA@54)_-r*w8(O5dDQxV+4J9iU(_r0Y-z*c4;M-TPeodKRXlmauzpj* z-2a`MuH@(Je z|LmLgzCXIous-xyKugulI$rNbTK3ze+tn*>)V%qv@n?$r4U>20Cdo1K*@SfqHmEjz z+d6s8=l@@N>f~N#H#^n86L{d}aC6nB75CTVc=~5rwK44aTmSL9?|#YNocQ>J4EOA| zIwc1dt7cGH9pIsKl|O8cvaRyUOzf8{Q}Y`WWj)ehnB4lOz! znUC2vf9SJ5vuLUI+3WIE2j`UEv`w4fUS_g7?pV4EqaV|m1lEo03e8g|F;D!J>htT* z_3tzJbLaL6CcJjLJ)ccv+oS%~N2a<9-85Mn-W`8BGHUlRo!$TIHrKpmQ}=LVI@2!~ zow2X(>EE=syCzzSd-+f2c*5GKWNP;L9`l0xi}u)9Pcd%hNJzSMvPj@;y{idR$jmBH z&A05A&z`S+ugZKVozV7lc7b3k*`JPD2jiw7!(Onme2#BYz^d-l{?m#w1nR!v%) zmhrjddG_fmXZR&^EoWb3Kc>ByVbP>HCpSK6WIubz^|aKAEk5zP-dh%*)R&uDY5hX{ zfh)_WR)%&4qloywfB$~%?laaK(*Roum+|=0I zTPfJM1mxh)zrUICush6L#JDE!Qq7-B>VdaTT|UeFJy1XPKL646{}kkwnr5H*)Gjy4 z@c-A+6s_*)wqBtRhmVWR;I8|m(9Zly;IZ#D!3lB=hrY}aU#1|#bmCX`WciUV(EzV^hFoh}!+liE`G8<(t)O7jYl zU{)~h2%2z6!64vO;WUnY`JW$HG6r(XxLUG(46}R1cG0YR^VI!s`Ms`huA3WakiIT* zQ_)uEWkm6CDDQ>wNRc#U^5Ljj*d)A9z-TEPQ$ zjL+W$8@caS``OpHilNrHTj1gHl*1c1f<8DFn!S&Ue6{`2ME5h7!mrOz^kk{rqJC&u zbNuPI;`~xP>@jM^OnN_$DyQ*I=U@_wlXOk^^yK7ZBdw^Ejah$@qw0tVx~V+ zVk1&a_Rg1{)-OJH?T6g`;%lwfxF7o?etz$1otPb4gjAVUHMI*S#P7H~UpDXe>)?>2 zeG0`)`~EFvpEHkj_Ov>s39Kw_Pfs<;WS$6+U|tZTC%!D`(u#;r9`cN5ICm8MxBL7) zy6QX23+5MPk3E={uBtKF`#bLN;vL_XpZ?bV@Z#>gxshehW7BS~GIffZx=d?DE{npl znQP8w?EC*a{EWEX&eLn|Z_we8e8X1ef$H>diAz>Ft0%@+ zJg_YOX}Uknzd<~L=QRhD4ATpaH)p1Bq_8teFwVcT`@D=sG1H{DRUdMmE>A41T)nA% z^*@U}a}59A&NJ`cxP3p@(sc%J0{8FeV_dxM$W38p$7M_6icF3~H_iWj;PbQ7)9+`u zwKZ8(6sAfDddM?M=K0OfY`56NzQFl_@$Em#4G$agPtIxJ&lSz>T(I_7PJL8|O5l%e zJhm2B->=(!_SDr)d)IStvDz>Cpja7Nb$sO=>)UMI*A3Ym6c2^0%(+%tcSO5Zm#Jq} zthmLK$6f!oAE^1s{=J~ofmflb!=VVY_kyQb`@s`_W=j`$hIIBhyVB?X^k}JNTJT2e zl~Gk)qh`!3vra{Zr~5x8Mn2zvB8$dSFJmy*|}r>?)Q34?B%||7> zWi?f6Bi$P&Gi;7?p3=`z!oYZj^T(+*lYU;fHr0|bAh9<~NA}Pog(W0RqV=C@5|Pw z;+a>kc_Q{@R@&r>x)1-K&CdV#qi&v(1(Rs4i-HlT>HHv)VdCp~oKX!7RZM;pA2uvr z<>qiJ(!u{xJ6rLr>5Ko!*PPIajj+6WKJ#UGFGEJ$&tkph)$ujTTzjP$-KSRQ%B@^= zn0>3k1Wj|!BdOvix|*)1@>@LlvE5PWeEk>Kn`S?*C$Z$LXua&r64lEP&bUP?@sm1} zrCWl}ehEh7-)A1q{yKAq*tY3?TMp;cC#@)0@;>(a4Au27X6!$^(W*OMbn}jFf(vwO zd>_8yTwp%yn4x?@vn{jC@+6iUtsDM|3dKKN|K?%cw|nVlkJ{HC$$3=Jz{~yDML~qA zaKHb;8IwCWO0=0~NL0LAQ}=n@$&1rCwBl|ZDu3zP>vukO|2>_ZAHy~$z4UT_7$#B? zS{y#rRAjqwQ~fQK^<2-sh+KK0m1Jq7a?gx!%W;N1TKix9Z(y>jY}0sYEuq#aQXWi z^Y#-$j_#RZ-YdQCz1=3olJkD|n{SqBKmVvs5}mSP>f#^nDM!wpP}$eDEHC87ITgD^ z!z7oU4{NskS}m#Ze${Q|$1>;6pR((_evH4EY2Rmi{#ivk4er0Nm|)<`4Q^%hn2H`` zDA=bLq<(e14|n#wHJuJVEN&-58rJWZo6Q?V_uP8bE}3w8O)i5R0r|s98zy8$s(}6EeNXWgOoTmN3tHmYi;|J?n#&rfQ zue2C9v@Vj@`x;gk@b9Yk=FO9{V-;&!8l$GTaM68&_6MYY^i%y?*`rAIg?fcondKug|UOyDWQ=nZa zdR13$>FPsd-_kyIPa>+E(V=Ttrt7_HM{nCHV4@c ztHalSTdm(F+;~Q@;bB8J-wX5qJ5#fJ8|Im2pWPIlXPg~&GHCy*XKVLbnD!rF-v6&b zOk~-go2R5MPTk-oqtyP(E6rnyoyh*hUz|0f+W9NCzTEZY`}!H@<7<{j?r$t+y2Vnt zaPvgY=kF97%Iq(#d^kIuS;17`Lsh;bo-XfQh2=9oDlt_$ zADAhuaGP!Y#8y{xJz1Y68Vl7IHp`a(W!wBmZ{~;P)xVwHtv?!Nz1PUuIo;sG;%xc4 zr482uw@9gdaWb*=NnmO#_)^LPKxnUZ~D&cBDv zXEO}rDg+xXI11z&ELLnaJG-Ie^pX#q8EYpz@nhK|&>&dwZQtK#3py{pDYW_UuKnK5 z`x`Fm?0ly7`Bl@YgLZ!N#1eD&*KuBcaO#JhhPL8`zX89bkMmgU_Y&Xl{nOd`dge>7 ztbz;j7H<329N7^1C@$ggJ_ExKdrrSIb#`veJhHR<#BVWWgO{3*V&zvpN8?!WFHs$2hDonril&zXlkK`DOy;y30!@=tf9 zuDM-qzW45|8@2i~8L2c&w(rfPghRjXO`bq+9ji%YxMAH6fytif8 z`fHX!V$+-dvFrTG*Rfu9W+`fCc*atbw%@M!Mw;T(Nir{Ye_8eV>?_wre_S`NR9cg9 z`IXpyAv+zf`o}i{)Bd(xOk2F=Tj)<_1&s>_POo)nmB`GhWL4wq3z3tHWKl0U>LmB~ z>LQyNS&ms*T{p~OkbDDdlUA0>JINyw~ z!pBeKZ_!MCyKu|1gQuS@_qy@yt%N|>>HGJ5+%K<+p00POckz7HVt!lMS>6kHCfq+N zlX}%;hE>nvmi>iK|Jrz2m^`}cyQAo-myO*oj+L{$1G(z1qFqx3`f?;1T@zxnU#`AX?N@oJwez2c*OH@|pxeA=F}r0MrNi$#|H zc(CeHNcfA;Lbi{E8+rGHUVFtR{ZlDMf+2Wu2*sXIJNlmnWxwP%yMgJa=I?g zXvnaI{lIiJeZf{kh6~IMmJF4Q^NNHT4M3fE5ksbXwmZ*X*}F#CeAd$KXAD=z#k|q@ zwrNX=dG9;pY;)=CYo6Kir@wFL;h(;C!^7?GwOND~bqP%jTYbNC{jyAt9L%J6L{T)1D3aVB$s{DjB5cjbHe zoo+0@SvfzoUF{wFoXcKIZv5j|p#I=a7yU}gIK5YqJ(~Nr*L}Wx4-xwV7tc<*b52XkeEXxa`__MKrtD8j z+WzNmW%IM>OTr&mExjrpFFWM(rA&PCcTT|xxzE2AdYxGL`Q+z3hAa2}&zm?OS z6`v;rF)2;3W4fXK!1(vKnaOHv%ulDRyx(O|gM%#JI6tC^wp2ToQ-nMFsUEH_D$-j%41LpBI zSRI(I7i*=$#-Psl?AgV|3kn5aOkY}a-|F?0=6iaHj8KY@T0eKn@dM{$O{TkZYTt`}=jB|is5U1$e8%w;O6RAUpJ!v3 z!1Ci<{>Mj0-KM1%C@;vdji0j2mE+6lU;m2xY_HTjp1a%ZSweRFkJ>5w|32OHx0mN| z`;EwUe^aN-(+{nA64M{e3hek|)-QPOW6ccVf{XIvGra5m89Zk>(!3#H<&!frkIu+f zYxVkU_*%lP(wsrWV!4x;Zq$)l1`)wst?mg^*1WfW*};6avVG6GO)dgm7x#UMyPGxV z@7JQG8-m?G-L|p}auVOT{u2A#v?T4?)j5f$lBVCCy7j%T7;BxMpWvU9XZIURn-!Hd z=m*3KY|Oj6D|JS`TKF7y&0-GGgA6P7e%Igs=hLk-iaw1U4%~tbf(?7$*zY@-t_UnnAX%?y!VZ{Biv)KB7(^?26A_ zes*ZSjmFL64@HceC#6a;T5?rHmP#%-HS=}5;(NA+CjRmto$B)zFfQmeo=A@@3)5vKT5FZT}qN z))z_ZPg~Dq)Wg97Y6VVC^*bQWUpH4$;H|j(&z~Q|UE?1|e*Ura1ON5)%X}{$@H5`h zxvFmc7qgkiwEatSrR?j2Z)qKTx!pGN-}AQnMaLcN6}YAJ_MW+sE9UQb*{-fS}eJoASs6FIgpG0w@ZKUdg3>+$z0->f$ayDu`!FPNPC^y&vzSGF>> zZTn|AJ4?-LxI<;mao^V#7`wx5@> z^v3A7aW`A2RQjdLv2*v8KKLgKhVESudQ@I*ZW`yUWncEO98O!h<)3}+ z{o-fp=70N&nWR=P4N$aTcLG^cQj8iTw zw|X0l)gPQNpM8E$CcClK8J()i*>m(IV}76Q(zJ+JvFK|`qmRRrKOffr>soYSVvr@v zv&>Y%uDH$ztM;E-Tom1D@pW7M4DI#5P5XtmebAj1{*9p`=eX?LyXIdr1I)L(p54qC zQ2Bq2|B1`~_O@T{6rcZVynU&6bSuR!?Q0&3?Z|p07df z+O;An-MWOk3w%t^%xyfs#%am=lPqn%dh7qpQYleHL7>ZQ)Pv1~!&hSO{%J;$-6W!$^--iaY2{z`r zG1xMypDbvYC%fQR#NAofdO0WUYv4VZE$PuSUq0~a{IcKXA6Bxx;C?SIFS4$Z<>Hm2 zS5ue$7Fku96xg&*>qpj1;ev0m|4r3rQ+h?D4dUltA;YE~S zU#i+^6E?$0<>^};7j`;u3m%x$5N!V??eod&`Rc_?F_I5;v#yFR_%Ts+Q&{1jBNwLI ztm`O~+h=2Aw4Nn2=zGVMud_wNEkmd7Kl}a4&Ho0|q|L`n-nEe$~q@cUMg*n3NL|zbg9tX|B@V zuh~7jJko!^{@HWK)L6((<8|$+=)1onuE$QzXbG#GD#tK&;WVy`UP0VzD$ebG9{KsJ z_PeJ?9K`i1_x?SbU$?lL;l|c?!M}fMq~7CYV2#&K;h1a^SNrwq@lTBQOI4WOx-%3r z+137uKD+&X=uI<=K9*mPel9EJSQS#n?_k=vEd2WPeix12U5;DIWM0f(_EF^k%l?Ua z^|SqDEARHsEk4?x+r0nV3!CDf`tncbG`Lk1i3aISpRNGJjS_s#b^ zdcx}LrkraZj`y7KFzj$p1BI;c|IZGezm~rd^0ceHX)F1zx(OZ&)+cEJJs&| z^Js2?MqPOLe&6*r588H4@w;n~=^)%0*LihqY7plKPQEis6n&>YUs+Uk;HZ7|jN5G2 z4bDw>SNs1r%#ZO(EW=iDhE|8EzeB5^anCGgc4%y0J=Lh>Ft2%nkit9AQS1T@4V!a6 zsPmc6uRra_7&29(_NEla*6#RN@y2{B`CS{nlzsBZWa_AO`{llg%fs5~$wEPuyVvC_ z?$x~Qs;+35z#HQCr~F>!^UIrf0!n%2G5vkIgymk+v%3rzf-+MrL|ZBuR)??uH`NVv zD(wMzMj6$bYwq`x_9+)LeQ{;l`u4le+l3$AnrypoTx%*&QuXtv>AknNDsN=oEjhPW ze`DWwZT3>tsa03MrpPpiUJAXObo+t6y~+8Q%D3y!?)oZSYhh^7&2gvVaqs%Bm@I|^ zS7+sZN=eyhqHH93kl{ktiqO6}oCYewX7A)R)oNWDK=oBHi=q01)%kaCe&JM%Th%7{ zK7nEBdi%ZY*|8qaXWv`YEMBtX%Gx`vzva#N+h@D8O{gjaX{2JR!x2Ej7D0sHgCehr?ct=H3K*AyE^Y|P=$A>3NwRflb6=% zX$PJjm#co`f6p~dLr{S!j^hBwkCrbiGW(xj^V{;d^>Wz0U13gtnaqmUs%+I?zHH;; zrayUAd&9RYu5~*QT0b@8$+kzuxBi#?G&#$W$ozX5Ox}PX|LyCW0=RjmS^pfPod$lM|B$;dGwV87#VrkV+y|Q zK70M%wqn((dsEkYM^=6lFgdC1C$-^9$*)D`Cznlfus=U*$Fz);CGnnFk~d~veIaeT zuPDRCd0wy0zRxGRpGn*A@vma4m{Oo@b(8bw>G*%2e*gUZeDQ9#>5N&r>Fy_HOq!Ck z>~xUPo~$1SXE;{=`Z#$qqxbT8Rj;Cd{ra_SN;T+C!xonX+qYjoGi&4Gn?;AEioaj> zc3zg{*S3DyzBOl8US4+L&ckcB*|*Ml<(YMGo4eLtK6lQ#y za$xo6XwxZkI7;{!bp&lbf?JtyLdvIX_`7N4eSa_OxW5Hg-%md$yDoFqvS253=I8tN zdEPtV&3xtSlZz@B)Yr=9{GNJy<>vV&_PhR>$H*>dNI5Z8xk0}E)ym}|4_9AuH_ZxN zHCu7z;qD+7W`?C#xmNNr{`oxrzs!`U4f}cdSv5Nu1UCpCNOOEHQ@+A7^_p4PhR>T; zTIGJd?*B8puC(bz@4mlg6V=vS3bFe8@qTG$RCvLKTxNcOYBsjQmHpP$=Po~+ZNKOK zl=cstkEe>VED@}Hd*A>=R(NUmE&;>DwdMP!xEeDAC}u6?jjj9nbal!k-d(vBpdHlA zjBkWL{GVI6%kjzz3bDLJds21|GaYjeD{CtgxhS@N>^qcSiOGVFaGm3pL_cLug-Ja z+P3!AISx6a>qsm>JM z@cxTzir;~#;_vp;cP72g{}_7Yw8Yof5*I4gpLclwhGpA+sr9+F{TfdNPJPvB7ZZ}1 zl$PMxXvz59X7`;p23zi(nX^mwIZMQil0()eCR@JENbcKNbaho|hKpFL}wrJ@_Q40DCFuhw*5U}kXm(D#}@_0W3%Fs3j6zpk&3t^IUTT|T;3yj@&S zfvHeHV`|me#^3K!%yeUtFTw5@u8i=x1nSzNh1M;K|n2XYVdrvOr~W z9jmlRZtXPXay!X|yX|=`58MkDn_r_iV;QG{{>$g;_1&)h*t&j}`Mb@*EmKr{ znHgXHi~srW`~Lr4HyH&^-H&66SP{o?{<$qL!|gN7PY>|3@qS~JP~BhnqgU3t>`$wB z+>XPZ>T^rF??A546JS&l=xA7@^!wTVKd1NK(b;`!otV>~YbW^I&m1&6yu{%~P3G;| zL!0)72mYG2#pprS_a5Wo;5Non@jp+6Pn&Z3sp#9*X*&fOl^j?)9OMLdyjaxzPWUOm z>>~TzpU(S5o@sS4E)ZSB#-PP*zx>k@@dY~GmU`hzpjILHF4a8(5&P@@PBy<^V;uEo z+oyKBi(>oDEcQ-%uC=Cvts$4iLbSuTQE%syNxzFjjYXi>-`whJkWu;0JV!%Yay27E zc=fca92vV~)}Gkl!PXF!x{Wd5HLE~(-rHHG*>%^s1Wrzd-0AYEzad8^-0t_A&GPj> zpH44b6JI?!kzqyO$$H1tsv46R7fel(W-#UUJ69q%B~|u*Ai|M3EGe(=cW|OEk<`%GrD;niTIi5df*4>?v^<|Z+9p{ptBwB~iZh&MDCAm@%W)$2-}*&g88XCszcJkiyQ3C)d*{n_yWjl^ z`?tDR6?{36K%%c=@9>R9QgTs{{Pd{L_-??UC3x!oPut&b zHqY*}ez)WJhO5aBvnI2G?_d;YJi!rD^>XR-4#9xS!iNrI8gz00Wt>Xv?*)37}C`11Xp5}?APgF*0xA4{8ycub`1@AgOA)ft`gS1<;6 zlyqe=WK8GP;!V!!=U`?-Lp z|Nn0J^xnU<{NJl1bH455 z-}$}h{LT4O-~9f)cI)-H>i6gE%Kz8B-hS=gZoTUNO~Lu^8828`{+!EDR5U9|QtWg` zgjPJ~6q}bzCcCYP+4*U`zs18AdAE5ij2sROOst9mpAYP_dcWuMI&SF&>;KdWchCEI zebJtIf2RvSuw-}_;uiRKNmVby3$B~llc%UJ=g!pk4{VtB<680SKR-X$OImR<2{bUU zaJf7W7c?5e8IKfAmH`hi7}F#V1Ix01T8MIkKR@C^4|LW|DxFJOPPY$4=k)d zy{jegy)#3l_*rMhNkt7(i@)FBk$Zbv-_6bG`I6>&cb-;C2eN^U*y^ib$NB&M^w_eS z>mP5lFJ%(_biKu1SBfnl((1SUrmu6mgcvV`eko`;R<=plKFTcj)|H~Orq}m~COfZw z{d-bz8OYmQo(>ED&)0q=on9XxV)3c<_21Xx0V3=N5@pW6@sVYyu3P&n@lNgcyY`|I zLM#dlj2u_^8&$sKKYm|bzwP<^b4h>a)J!$jyd>c8%cY^PLgIikBkxDg6W@%_+Z6wN zxqQCe^{Ep;)+hw*W_eV)Uq80;>D2w57xwq;6FdKFdPv+{C)f77kvv=f1B&iRcW9z9^-_3N@z;OPhv(-^v#;Iw z@O!EKB&q-5EDp{LWei-8SwvDf6xQX27geZRiyxSmcshN4?X{|(Pp8|9%eP0|+bYTh z@rg)dUteGT^zHzPYt^ z_19b3>;L}TSNpq6Rxf2+I|GXXL*qg94_AWy@BaICJHK99zvlG4=XYP9Z~K?4%=SN_ z|A1V#3A@74+2&s!E@ZTH<<-^IjT3V>d2p;GxdfE>1te~K_qQZA$ozxs% zkSlJf2q^w<{kZ4YB_zG_X0QvBxDG5RDa!lG4l7(XJ=>U z{z-lFcbmQar{$%sbAL>aTe--W$>;ptU5D)EiD<09@Yt14+H;$W$I8@qcXoO|x_yzq z!dV3zEj+wTAH}Xu6_2m^So={=T)O`IzuX^F&l~@1<^KD-Yv=LTHG)eeE8gt4RN(1$ zea|i-=>7CA!`xk`W+%lRnD0N^>}}r#PjHeeXyH7v`CqpFt{02uznJ=NuJJ$FZ`U{f zi+aOi@#X#Te_YvrN>6q$$jtaL(T(wm>Z<4OH5%$|J}G=ZJHs&f;;*l-<+e)&iL_qTVI?|$C@@qCQBOv7J?H>_0_4)!9JjK4lsyqsk#b$?=B zw>xuu)Yh!4_HXac*$;M&!3`FZXZFR<&af_a@6YSL{@3cu{JrU?6;E*g<^T4OZ|7e_ z&JDj*CmJt!$ms3Qv*yH)X(d08ipSrPN%oWXpJkF6_BAbn8JzF``YtHm_J6<2js2!} zpI@)Yo%gZ)eEjz!U9V}si&_76GZ%bl{a(}1?9G3!)RL))>Cwvu*^dhr1Keqq#ss{`uO&%?C z8BSlxE{U8jyuh91@nOemw_d5O6~Df`tPj(hZW=fN5=6`n4;J^^{W`jIdfYFk=f(fb z{u%vw_t(4Xj{WZ)^2h9Vs#!2__P9)KeE+h&XoB#DnxCKcemwVb`m?jMzaKw)_Uz+H z+XBF8=z#&}i^F#QHXo1VZogA>dexC1%Z2~l`5it}rXlCW{^ixb66F%#=Dw55eJlI( zfc(arKR!Ct+C}tp@bw?<=ZIQ$-Ck!AgKzS&p3JCSB`^CQPd;SdWdtd=WYidIFMVG& zJ8#$Tx#jnMmYtra`|9iN=j-q7tNuS}<;U_H_Pvkfo=v=R{h3+O*V3@RT{yuF(3Q?mTPPQ`FueIOH$eY`XhV4gnyiI-_EvClqKcQ zX4`s8CW-%c|7;|fUP#WE!_eLrlxds0@R7lhCkHM?=kMKW{EU5%Q2&ZEIayg!Q^TAf zMTs2emi_<#{pLROL;qGAtF8+J18;|?i(|-!MCaT0_EzsU{>Syx`i=kj{q9?SYwu{k zefm}F+BCmDmJ@}a3L4s3WOxJOoSDuhAMeYxdAH-SRDA8%tCh>=mfg~AU3$C|l*?Z* zH&(29-yEI4_p7|plmD@2zD$3(KJCxd*Vh-VXn2)zDPHQ+`PVC4MJI6xFuwTvUZIyI zL;L>;9sW$sd%m%K6GC79d_MpGlBG+ZZvVLI)Xd)A-s5sX6PZA%NkE|STk7d)x;vgs z@}Bqa$K(EJr9b(P*WcTF{P*RPb)du`Q7`z$x#;{h{@EhCR#j>WDcqgN;La?=I^j(h zOUpfx&rDMNw%=|XyB=4ad+*B1;QT&lw3P^T@LiVA+yD35{@6Vgg{QBrjlMhkdy2he zl_i7R>+d)IUE_4|}tlNFdQ2rqQL{#}Ig#BafAruqwvr8bxyie7)@`>N%< z(q=h_7M=}eV&rgGV8Qap)h>Sj$79m<;`5{H&Gv1(C6)hUb71)T`)&94)>$(~sXte! zJ$L{6y+;SE&ls2Xe>0e^dFRd&z>YPg1X3 zU48wLK)u%GxcXb4`(H`aJHE)?B>4Ju*_HeL2mZWa(U3||cQ|&ZuVFD`A792?8CKoi z$?E=j7C)a%mX@#o^Ktcgi^o0tdE6To&SY?IVqkgIePDWg-OeWu+vV%tOmvsKDZKDs z$G`X9z597-E2$Y3h-)-RTY0YT#i0}9956dSuG%sSj zrMFM(M#ZB}bu*h^FBXd*lWF|<@yG$gQs3Um%?vDDjtRH7<#L0r)Tyt3xAXarx~8mHI!h}o!q0>{c$mj$(Vca`?vExjJQetpEoMY_j++@37A zzh|d2sQx@yzCPZWu}t8_SN;Q2w_lWMSjK&GNu^iS#>DLlw?CY|MfpMLRK-S(^%hKz zkM~d4(T&)UaH#Zpths)i&Jp!?))p2<4xUJ+s{DGJ)Bm5?e!sK0|J#=QTU$;ZyS=wU zx>WMVl@GTCCzQxm{bjCLn!ACmK)f~QR*dT3DGf___Vm`i;)u9z<<9fQ!sLj1+o_Lk z2ipoCA2YT2aDdsqV|vOTS0A}Qi&uCzF|a5U9N~NsxbMYV`=1w_`E@HFwu*l_5vQs4 z>*R;q4Yz+(PnzGmUzXvyYHWCrV%^rqE+_7*{Bpb%@YOlkWTIliwn=e0S5!aCFit%w zdBTb**3ZSpGNA8#(zNvR^KAdztA4*X<<^!=^CQZwlar)DWoV6Jc{SzNd>-YUyWs-cX=b82UJ;g;nGIK-& zo8&)<99$^gD8%9L-~;ComVKtH!`IinoS8oF=ikfz_J8XIJ9Snsm(Ty`-CH;B;r5B= zrD~aH@@ENs_5Auc>)nKELME$#(tye?Bb--Epq=PX6u8 zxVo$*ccaU1*q#4y`^D)C%iHeX-od+l_2Yvd%44TChUQFQE7RXHPc`9PWnV+}FS9Qz zKW;akuP44@#u8R(&F>B+YQx(`{q~{KWotpUgp!K&Udco zWLy2EJ9li%sy94QWN7@Qu%Pfa$My9$Hzpr{zgYbL{?%b?Z*59BIqB}{>H7J9|9n1w zJ9$%~Wt-^j$EvngiPBF)ZY6l%>PY9U&w8`jE&lZ-vpd_qEpPdF|9oP=zgq&lr_S9t zsmOB1-t?N;1G6`GEm_J~F73J%SGj%iwz;pYW)xL?Uuy7gRdiSVpS~BYQ@*Ahnh|qD zB45?!)tk-dMmP)CGfaAOQO%7*$Fv1kCkOAnzpGrGB7p!JFwZx z{CfNF#`_mB`#Sjh-}dqMz3triQ#Skhy1ze~1 zTAJKvxonN)-Xxda^n7*0tL^&z8h*+%>5t=A3dr17qGUcZMqcvYBz> zFJC4d&Yfw+Sh?%f&O5hLmfjBES?VpD7ZyHq(y6(tUdGK=znuH&S}UT)Ozmr`Qc!N@<6`{LQeA5u$$cJ-EC zo1y()uHJO!cHdj`Zmr+;B4DrIu1TM~rrmuxwac>pQf_frFiYburG&*d?s}%aw#Z+Z zyLNd{Re3kh)@#eztgi+iUjHfU=a$|*e~&Jkx}zdM=he@E3Nc$;us(QACylX!2}mNQlJd`>S} z-p#x3bWrm8O(ypzzxy?9mr!2#CC#g`Z8AwLtM0b6-$*R7kYsvUx>+ytZrh#INqU=^ zC+K>Aj*R`e$F+TFk?Q*Gahh**w$F=wUbOw8jS!Qo!i02{&8eC9s^*16M(H`PQ+ZiB z>D>3wWw{aIzc0-Vx|@1J(WgQBy}&+;T8k}TtfHo$d8M~n?XAj_wbvh}oQ|EQetFZH zb$ce=T0L!7ba<}xDMf=2&Mzr4pRX-Xt=x4gCeK!X{<_nbS6gx?&Ae6~cj@HsV!23X zmK`UrT{!yc@WN%+O;=mbKecAw+3f3APsPl;cJfta<aG) z+0|ZpGUWTNd()ohzBW^t8*{!gg;)4NTl8V^_5AJg%I97-dOa=cR#n)t*SjunJ$EwK zBHs7gwz#ctHQOE53cOgWxHe2*cYB^D+cn+Gn?lxavs90q$HQw6UEe;|eEOHI zDtKD>@!jw8=DtpO`u(QbZMI5|D?*J|eti43WA|;f-RqX``95>)^P-fw!Vi{3KNsII z-*5f){gdxqd%gVdB1sOBNe=nEW%;i~g_P8J!5uhoe~@96IW)pyg(=g2{^}mRL!W;t SmN76eFnGH9xvXk44ofy`glX=O&z~GV^ z;hE;^%b>-;z`()4*q+J20#d@jz#zo{0?Z2-8JNK$j0_A5nBcMw3z!jXkV3aWrwt4Y z93q}Bjv*C{Z=|mBZEQn{dA3`CzRFxDXT3D6z+925OH)7n5yyT z<5Y<+?yhwcB$7>9JbL;im_IQK&pUQv@zSN+Oun!>2?}foh|*d5`;+zNy_+{rpSk<( zxtz?$^Par9Q=R^9@AKd9EWaDh6-re(?9kT8!z{`6Z$D2(P^(<8oBQH-PA^1WXuPn! zz+l3y<&ro5v(r)IXW1f>3yXH1V4wJ+_f76>u&7n z9aj!8r%76BCf*jhGynR}&zC;0OLKPEu~yUP__}tU4R;zDa?}pI|9IgSr`;^en9Jru zdreY=JTf+|TFlkR8YX&2>ou3~-vTqXIEHQ6)f1jA-1@lYOF-6xossu8M0RyC+B8_%!{evU6b6aQSfrlxj#)eZLT@vPhR_gpXB9(H!QOGB>eYPlyyeLv?v{Fd}& z=|MHaUoqzl_sitjf8V#IVY;vPiPcUD4-ei;sd!R8&-qO9Tz|E=hWN&b^UK8#Y|dRL zd_eiMw`_iXDFfX!1vxgC!b$q+xDa< zH{XUQ9GY#v>b<&+alyngABOjDx0`OfecQjH@WYLV4@1nK>mA#}ptr7%#U!x zy%Wdq{M?tDa?0nITNR%ve({Ipedf!qtqEI_Ra#cw&^TB-O)O)IxWRUT{qwy}2{ImE z=kh^K-RxoKxw8vgC7YkWUHj(S_6H{MCM_>rs&noc7)W>i&@#HR{9^XwyR7HGS#ljw z+VN?J%=~>T6CW5=G&Yx4a4(th{>X{?FnM&JCj89Ven|=Pf+ytCFx%-oNZE2 zzQ6wBu}(YLJ)QQC3%3htF;!hXo?w6Rw8YwrmUUI4-g9~O2@BtApQ?DP`{^XdxLu-4 z%LI~+@SI|)sN+9jXrCHkwea`@)nBd-E(|4Y%YD%k#Hi2DfW#uAXZD<3+TmHY4L2zT4s%Uyc}@ znIOOz74y|7Wu2_OU$1HDmXyzotJeMYuHUx4E`(*n+`d-N8y_}IpC{QUs~jcV`)QqF zQ*ugnq-E^t+yxwW7OYeDIG=mZUp;HK?00QbgUa`NJ zFyTX;;ys3^#||yryQe8iD@&uv*-yaRea3%gUY+3$IPu(8^WEz&JLbpRX)QD4=b1j+bK3kK{}idUa+_2e + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/widgetbook/macos/Runner/Configs/AppInfo.xcconfig b/widgetbook/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..cfd68e6e --- /dev/null +++ b/widgetbook/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = widgetbook + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.widgetbook + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/widgetbook/macos/Runner/Configs/Debug.xcconfig b/widgetbook/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/widgetbook/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/widgetbook/macos/Runner/Configs/Release.xcconfig b/widgetbook/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/widgetbook/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/widgetbook/macos/Runner/Configs/Warnings.xcconfig b/widgetbook/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/widgetbook/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/widgetbook/macos/Runner/DebugProfile.entitlements b/widgetbook/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/widgetbook/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/widgetbook/macos/Runner/Info.plist b/widgetbook/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/widgetbook/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/widgetbook/macos/Runner/MainFlutterWindow.swift b/widgetbook/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..3cc05eb2 --- /dev/null +++ b/widgetbook/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/widgetbook/macos/Runner/Release.entitlements b/widgetbook/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/widgetbook/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/widgetbook/macos/RunnerTests/RunnerTests.swift b/widgetbook/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..61f3bd1f --- /dev/null +++ b/widgetbook/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/widgetbook/pubspec.yaml b/widgetbook/pubspec.yaml new file mode 100644 index 00000000..33262010 --- /dev/null +++ b/widgetbook/pubspec.yaml @@ -0,0 +1,39 @@ +name: widgetbook_workspace +description: "A new Flutter project." +publish_to: "none" +version: 0.1.0 + +environment: + sdk: ^3.8.1 +resolution: workspace + +dependencies: + flutter: + sdk: flutter + widgetbook: ^3.14.0 + widgetbook_annotation: ^3.6.0 + sparksocial: + path: ../ + fonts: + path: ../fonts + assets: + path: ../assets + flutter_riverpod: ^2.6.1 + fluentui_system_icons: ^1.1.273 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 + widgetbook_generator: ^3.14.0 + build_runner: ^2.5.4 + +flutter: + uses-material-design: true + fonts: + - family: Fraunces + fonts: + - asset: packages/fonts/Fraunces-Variable.ttf + - family: SN Pro + fonts: + - asset: packages/fonts/SNPro-Variable.ttf diff --git a/widgetbook/web/favicon.png b/widgetbook/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`$AH z5n0T@pr;JNj1^1m%NQ6KBQrxHN+NuHtdjF{^%7I^lT!66atjzhz^1~gBDWwnwIorY zA~z?m*s8)-39P~@uhG~7qCqZhc3d|4;4lG&j~$oK zA@xWG2F9zNE{-7;ld7wO#(qnZWJZzI2E3_xA*Lsx!2?73+ET^w%+}I@67GR zPL~gKB+lnDthp%7_f?t4uW8c8|3WP+WgZ_FE&TA=jOG3EO9#GP7O}Aw)>E_$k#Ij{ zy7GD-^V?e9l7~+mufGc|5hy!fsr=)zztlt_?dh+%eqZG?+EVFvYJGT3%B4l+c?Nxv zA961J%WD)5K5(#z=Uq!-q}j6RjfU+9tC!e#p8CvEH~sU+6WhDDJxnp0o^W94eWCU1 zQd#DyR^MO$Yr>MKOsyrcjGjlI&9nHBnS0EEGw0Y$CX2WHmGZe!`~O@#c5SN5zDu26 zDI4BKt!FtLvCi9OcFDt_gv}BORd*bZl^1SM*A_yFxrSX8ds2x$lS21HT;^ zTCIz7I(nCKmV|Unv7TVUR`#dH$H;AN(TuMbbG%<%3CMZUe|J|QuJuIw1-!H;WNWB?$;ib zdFQ+9g^uhz>as0SX1QKp$Jx0PS=bUhTs~c2!d=hEU?gX@B64~UD6e?B`njxgN@xNA DfL3B_ literal 0 HcmV?d00001 diff --git a/widgetbook/web/icons/Icon-192.png b/widgetbook/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 L>gTe~DWM4f2kRIC literal 0 HcmV?d00001 diff --git a/widgetbook/web/icons/Icon-512.png b/widgetbook/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/widgetbook/web/icons/Icon-maskable-192.png b/widgetbook/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 F695xY89M*~ literal 0 HcmV?d00001 diff --git a/widgetbook/web/index.html b/widgetbook/web/index.html new file mode 100644 index 00000000..4ffb9573 --- /dev/null +++ b/widgetbook/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + widgetbook + + + + + + diff --git a/widgetbook/web/manifest.json b/widgetbook/web/manifest.json new file mode 100644 index 00000000..6bd71b6c --- /dev/null +++ b/widgetbook/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "widgetbook", + "short_name": "widgetbook", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +}

y_uhUqwLR%$*pFW?72VBUg9j9 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 z z*KDRgC!_CV`*-*=l^FA1+rPxjEXB2G_2pbS@c^+?)0F!EJesAJ%Fbw4%cXE}yWtCQ zqhH%=l6ECr{ooo>P zYeBwNpr7q2>4jfBxuQROx!bWmW;*9ZPt)gDxIebluo}G2yKVN)?u9s;P00_BcYdI; zm2T$7lP6E+MqId)Z}EF)xb&Q#Ei0BORay(axNF{7)|a%Q_M?2Q*G9GjbLyu~sM9dN zaXkDcxc0i$bfDhib;$P?m2VpMD@|I7#nUOPAk_= z=d`EOzSq5&trvNJnMl=2z1&v|*US%&{iWjjTRQVF`(uOp6KnPe*0;9#OzFGHSD3_n z^nbv#le6Yde&;-Y_hnz%OU(VeiTbIa8vV`P-R0BoKig#T)6?P9o7~%<-iW^y0EMBz zhSD8J?Mwb8>o5AOKELMEg!#6=BW3q3QG)cPycrrHJ%Ii{QMa$LXzZT-e)XX}a_820 zz2G-L@mnHVY_spu2sVeM>_3jB>0dIFdvb-d%lF^H`dQm=>;G*m+Ft2=?L(Su#AB@@ zvA+xEur$0XH)peZ+qKX`}