Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Core Branding] Fix Compose Bar Text Alignment #13645

Merged
merged 14 commits into from
Jan 13, 2023
Merged

Conversation

grgia
Copy link
Contributor

@grgia grgia commented Dec 15, 2022

Fixes alignment of compose text to match this photo:
image

Current Branch:
image

Details

Fixed Issues

$ #13595
$ #14006

Tests

  • Verify that no errors appear in the JS console
  • Go to LHN, verify the space between avatar and username is 12px
  • Go to a Chat
    • Verify the space between avatar and username in header is 12px
    • Verify the space between avatar and chat is 12px
  • Send 2+ Chats, verify the beginning of the text is aligned across all lines
  • Verify that compose bar is 40px tall in total, including the border

Offline tests

QA Steps

  • Verify that no errors appear in the JS console
  • Same as tests

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android / native
    • Android / Chrome
    • iOS / native
    • iOS / Safari
    • MacOS / Chrome / Safari
    • MacOS / Desktop
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots/Videos

Web image
Mobile Web - Chrome image image
Mobile Web - Safari image image
Desktop image
iOS image image
Android image image

@grgia grgia requested a review from shawnborton December 15, 2022 22:28
@grgia grgia self-assigned this Dec 15, 2022
@shawnborton
Copy link
Contributor

Tested on web but looks like we are off by just a teeny bit:
image

@shawnborton
Copy link
Contributor

shawnborton commented Dec 16, 2022

What are your thoughts on trying to get the little right border of the plus icon to line up with the right edge of the avatar above?

@grgia
Copy link
Contributor Author

grgia commented Dec 16, 2022

How do you get the pixel overlay? Super helpful! I added 1px to the right margin

@grgia
Copy link
Contributor Author

grgia commented Dec 16, 2022

Oop just saw your comment, I agree with lining up the divider line with the edge of the avatar

@grgia
Copy link
Contributor Author

grgia commented Dec 16, 2022

Just so I'm clear, we want the right edge of the divider line to line up with the blue line, and then the left edge of the text (not including the '|' indicator) to align along the red line?

@grgia
Copy link
Contributor Author

grgia commented Dec 16, 2022

image

@grgia grgia changed the title Fix Compose Bar Text Alignment [Core Branding] Fix Compose Bar Text Alignment Dec 16, 2022
@shawnborton
Copy link
Contributor

Nice, this is looking pretty good! For even more alignment, I think we can make the "+" button it's own button and make it 32x32 (like the send button). Then make it have a margin right of 3px and then the border line comes right after that. This way the + is perfectly centered with the avatars above it. Something like this (added red to make it super obvious):

image

Thoughts?

@shawnborton
Copy link
Contributor

One thing I am noticing too is that we might need to add 1 or 2 more px to the roundness of the overall compose bar. From the screenshots, it looks like it doesn't quite make a perfect pill shape:
image

@grgia
Copy link
Contributor Author

grgia commented Dec 20, 2022

Yes, I agree with both of these suggestions! I'll get these in. One clarification- if we make the "+" button similar to the send button, the circular border (red in your pic) would still be transparent right?

@shawnborton
Copy link
Contributor

That's correct, let's still keep it transparent.

@grgia
Copy link
Contributor Author

grgia commented Dec 21, 2022

Here's an update!
imageimage

@grgia
Copy link
Contributor Author

grgia commented Dec 21, 2022

Screenshot 2022-12-20 at 6 56 44 PM

Should I align the center of the expand icon with the plus or does this look good?

@shawnborton
Copy link
Contributor

This is looking good! I like the idea of center aligning the expand icon.

So then the remaining item is the border radius of the compose box. I didn't realize it was actually 42px tall:
image

And not 40px, which is what I think I would have expected it to be. We could either adjust it so that it rests at 40px, or just bump up the border radius to at least 21px.

My preference would be to have it at 40px because that is a standard UI component size we use elsewhere, like the size of avatars. Thoughts?

@shawnborton
Copy link
Contributor

One easy approach is to just make sure the child elements inside the compose box wrapper are 38px tall and not 40px tall. So that this way we account for the 2px worth of border (1px top, 1px bottom, etc) we have.
image

@grgia
Copy link
Contributor Author

grgia commented Dec 21, 2022

40px height + aligned expand
Screenshot 2022-12-20 at 7 31 52 PM
image

I think because the compose bar is made up of three pieces, changing border radius right now from 0 to 100 looks like this:

Screen.Recording.2022-12-20.at.7.33.31.PM.mov

@shawnborton
Copy link
Contributor

Nice, thanks for handling those. I think the issue with making the border radius anything greater than exactly half of the resting point of the compose bar height is that the corners will look too rounded when we expand the compose box. So, hence why we want 20px and hence why 20px wasn't quite cutting it when the compose box was actually 42px.

So yeah, if we can get the compose box to start at 40px and then use 20px for border radius, we should be good to go.

@grgia
Copy link
Contributor Author

grgia commented Dec 21, 2022

That makes sense! Here's where I left off last night
image
image

@shawnborton
Copy link
Contributor

Nice! Can you code inspect to see the height of the outermost wrapper of the compose box? The wrapper that we apply the border to.

@grgia
Copy link
Contributor Author

grgia commented Dec 22, 2022

image

image

@shawnborton
Copy link
Contributor

Lovely, looks great! Do you have the latest version of main merged in? My eagle eye tells me that's the old version of the send icon hehe

@grgia
Copy link
Contributor Author

grgia commented Jan 10, 2023

Updated screenshots with 12px
image

image

@grgia grgia marked this pull request as ready for review January 10, 2023 23:44
@grgia grgia requested a review from a team as a code owner January 10, 2023 23:44
@melvin-bot melvin-bot bot requested review from jasperhuangg and sobitneupane and removed request for a team January 10, 2023 23:45
@melvin-bot
Copy link

melvin-bot bot commented Jan 10, 2023

@sobitneupane @jasperhuangg One of you needs to copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

Copy link
Contributor

@jasperhuangg jasperhuangg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few small concerns, overall lookin good!

@@ -637,7 +639,7 @@ class ReportActionCompose extends React.Component {
</>
)}
</AttachmentPicker>
<View style={styles.textInputComposeSpacing}>
<View style={[styles.textInputComposeSpacing, styles.pl6]}>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add the paddingLeft styles directly to textInputComposeSpacing.

Comment on lines 353 to 356
pl6: {
paddingLeft: 6,
},

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't really need these if we follow my suggestion above, also since the paddingLeft styles aren't being used anywhere else.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm also curious how this one might work with utilities/spacing.js in that the number after the pl typically denotes a multiplier which multiplies our default spacing unit of four:

image

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, using those naming conventions pl6 definitely isn't accurate here, it doesn't mean paddingLeft: 6px rather paddingLeft: 24px, which is why I also wanted to get rid of that class

@@ -1739,13 +1750,13 @@ const styles = {
},

emptyAvatar: {
marginRight: variables.componentSizeNormal - 24,
marginRight: variables.componentSizeNormal - 26,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any chance we could add a comment explaining where 26 is coming from?

height: variables.avatarSizeNormal,
width: variables.avatarSizeNormal,
},

emptyAvatarSmall: {
marginRight: variables.componentSizeNormal - 28,
marginRight: variables.componentSizeNormal - 30,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same, where is 30 coming from?

Copy link
Contributor

@sobitneupane sobitneupane left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Go to LHN, verify the space between avatar and username is 12px
Go to a Chat
Verify the space between avatar and username in header is 12px
Verify the space between avatar and chat is 12px

@grgia Space between avatar and username is 14px in all the above cases.

Screenshot 2023-01-11 at 12 50 43

@grgia
Copy link
Contributor Author

grgia commented Jan 12, 2023

Everything should be 12px now! Also, I removed that padding variable and moved dependencies into the variables folder. Should be good for re-review!

image

image

image

image

Copy link
Contributor

@sobitneupane sobitneupane left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Screenshots/Videos

Web Screenshot 2023-01-12 at 10 10 00 Screenshot 2023-01-12 at 10 15 32 Screenshot 2023-01-12 at 10 21 49
Mobile Web - Chrome Screenshot 2023-01-12 at 12 00 17 Screenshot 2023-01-12 at 12 02 49 Screenshot 2023-01-12 at 12 02 24
Mobile Web - Safari Screenshot 2023-01-12 at 11 06 53 Screenshot 2023-01-12 at 11 17 27 Screenshot 2023-01-12 at 11 15 56
Desktop Screenshot 2023-01-12 at 10 58 10 Screenshot 2023-01-12 at 10 57 55 Screenshot 2023-01-12 at 11 00 58 Screenshot 2023-01-12 at 10 58 20
iOS Screenshot 2023-01-12 at 11 24 35
Android Screenshot 2023-01-12 at 11 55 19

Copy link
Contributor

@sobitneupane sobitneupane left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified tests pass on all platforms & I tested again on:
    • Android / native
    • Android / Chrome
    • iOS / native
    • iOS / Safari
    • MacOS / Chrome / Safari
    • MacOS / Desktop
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

@shawnborton
Copy link
Contributor

Looks great to me! I smacked the "Ready to build" label thinking it might trigger some testable builds? Will keep an eye there. Otherwise feel free to merge this one.

@shawnborton
Copy link
Contributor

I'm gonna go ahead and merge this one, not sure why the builds didn't work but 🤷

@shawnborton shawnborton merged commit 0fa7b83 into main Jan 13, 2023
@shawnborton shawnborton deleted the georgia-composeFix branch January 13, 2023 14:51
@github-actions
Copy link
Contributor

Performance Comparison Report 📊

Significant Changes To Duration

There are no entries

Meaningless Changes To Duration

Show entries
Name Duration
App start regularAppStart 0.020 ms → 0.015 ms (-0.006 ms, -28.3%) 🟢
App start nativeLaunch 18.903 ms → 18.613 ms (-0.290 ms, -1.5%)
Open Search Page TTI 605.833 ms → 604.020 ms (-1.813 ms, ±0.0%)
App start runJsBundle 185.938 ms → 183.968 ms (-1.970 ms, -1.1%)
App start TTI 668.335 ms → 661.620 ms (-6.715 ms, -1.0%)
Show details
Name Duration
App start regularAppStart Baseline
Mean: 0.020 ms
Stdev: 0.001 ms (7.3%)
Runs: 0.0176189998164773 0.017943999962881207 0.01827000011689961 0.0183100001886487 0.018432999961078167 0.018554999958723783 0.018595000030472875 0.019124000100418925 0.019164999946951866 0.019694000016897917 0.020018999930471182 0.020100999856367707 0.020141999935731292 0.020304000005126 0.020589999854564667 0.020751999923959374 0.02083300007507205 0.02087399992160499 0.02115899999625981 0.0213620001450181 0.021444000070914626 0.02148500015027821 0.02168800006620586 0.021769999992102385 0.021891999989748 0.021972999908030033 0.022095000138506293 0.023314999882131815

Current
Mean: 0.015 ms
Stdev: 0.001 ms (9.0%)
Runs: 0.012653999961912632 0.012736000120639801 0.012776999734342098 0.013142999727278948 0.013183000031858683 0.013225000351667404 0.013306000269949436 0.013346000108867884 0.013549999799579382 0.013671000022441149 0.013672000262886286 0.013794000260531902 0.014119999948889017 0.014160000253468752 0.014283000025898218 0.014485999941825867 0.014649000018835068 0.0147299999371171 0.014771000016480684 0.014811000321060419 0.014932999853044748 0.015217999927699566 0.015381000004708767 0.015420999843627214 0.015420999843627214 0.015746999997645617 0.0157880000770092 0.015868999995291233 0.016724000219255686 0.01749700028449297 0.01766000036150217
App start nativeLaunch Baseline
Mean: 18.903 ms
Stdev: 1.467 ms (7.8%)
Runs: 17 17 17 17 17 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 20 20 20 20 20 21 21 22 23

Current
Mean: 18.613 ms
Stdev: 1.262 ms (6.8%)
Runs: 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20 20 21 21 22
Open Search Page TTI Baseline
Mean: 605.833 ms
Stdev: 23.837 ms (3.9%)
Runs: 564.3120529996231 571.3031830000691 572.2372240000404 572.709472999908 575.7013750001788 578.4221600000747 580.4387210002169 588.406739000231 589.844197999686 591.9235439999029 592.8148199999705 594.4541829999071 599.0958659998141 599.1684570000507 602.8850110000931 603.4734300002456 607.8509120000526 608.8466389998794 608.8740650000982 609.0625 610.5288489996456 611.2573650004342 612.524536000099 616.660034999717 617.4707440002821 618.3153889998794 633.8584800004028 636.073527000146 636.4914959999733 638.3171390001662 642.9301350000314 647.3265790003352 658.9129640003666

Current
Mean: 604.020 ms
Stdev: 25.965 ms (4.3%)
Runs: 565.1185719999485 566.2569169998169 571.9227700000629 574.3295090002939 575.3705649999902 575.7470700000413 579.9060879996978 581.5137119996361 581.5404050000943 581.7794189997949 584.9643149999902 585.4089359999634 593.1506750001572 596.0641279998235 596.7248139996082 598.900309999939 603.4108079997823 605.6494550001808 606.9531660000794 607.3592530000024 609.4530030000024 609.9501959998161 616.1488439999521 616.4948729998432 626.4216310000047 627.9268800001591 628.5262040002272 634.4814869998954 636.0851239999756 638.1665449999273 642.8459070003591 642.913126999978 671.1877040001564
App start runJsBundle Baseline
Mean: 185.938 ms
Stdev: 25.967 ms (14.0%)
Runs: 157 157 158 160 160 161 163 163 165 170 173 173 175 176 178 179 179 179 180 185 186 189 193 196 200 208 213 213 226 233 248 254

Current
Mean: 183.968 ms
Stdev: 18.998 ms (10.3%)
Runs: 155 157 161 163 166 169 171 172 172 173 174 175 175 176 176 177 177 181 185 188 190 195 196 199 200 201 202 206 208 227 236
App start TTI Baseline
Mean: 668.335 ms
Stdev: 33.248 ms (5.0%)
Runs: 609.7235570000485 618.9024529999588 619.8435460000765 626.8397460000124 627.1174649999011 630.2538809999824 641.1379819998983 641.4149090000428 641.9378980000038 644.8593250000849 645.54248799989 645.9767779998947 660.0798289999366 661.3363000000827 663.1142579999287 668.0487289999146 671.3689759999979 673.5107199999038 673.6331589999609 679.2828909999225 681.2707899999805 688.5514080000576 689.4938119999133 689.8484640000388 689.9621780000161 698.451659000013 705.3645120000001 706.3018479999155 710.1449829998892 717.6153420000337 729.3374320000876 736.4553559999913

Current
Mean: 661.620 ms
Stdev: 28.203 ms (4.3%)
Runs: 621.9672819999978 625.2398430001922 627.5188870001584 629.464999999851 629.5920620001853 631.9462469997816 632.8006380000152 633.3949259999208 637.0337430001236 638.5773189999163 639.5098810000345 640.9078460000455 644.9062640001066 652.1424870002083 655.1230430002324 659.8756639999337 660.4545029997826 663.7772599998862 667.4711460000835 673.0673839999363 678.2783530000597 684.6519630001858 687.9886079998687 691.3034129999578 692.1390209998935 693.4665700001642 697.3461099998094 698.5188799998723 700.3660300001502 703.4139439999126 717.9811649997719

@OSBotify
Copy link
Contributor

🚀 Deployed to staging by @shawnborton in version: 1.2.54-1 🚀

platform result
🤖 android 🤖 success ✅
🖥 desktop 🖥 success ✅
🍎 iOS 🍎 success ✅
🕸 web 🕸 success ✅

@OSBotify
Copy link
Contributor

🚀 Deployed to production by @AndrewGable in version: 1.2.54-2 🚀

platform result
🤖 android 🤖 success ✅
🖥 desktop 🖥 success ✅
🍎 iOS 🍎 success ✅
🕸 web 🕸 success ✅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants