Streamlined system messages

This commit is contained in:
Josh Perez 2021-08-26 16:51:55 -04:00 committed by GitHub
parent 1973224adb
commit 2b08cbfdfe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
57 changed files with 864 additions and 937 deletions

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.839434 2.707452-1.414668-1.414666c-.187528-.187471-.441836-.292786-.706999-.292786-.265165 0-.519472.105315-.707.292786l-8.99666704 8.996667c-.128353.128783-.219165.290125-.262667.466667l-.741333 2.961333c-.014087.055917-.013428.114533.001914.170119s.044842.106242.085617.147017.09143.070274.147017.085615c.055586.015343.114201.016003.170119.001915l2.963333-.741334c.176542-.043501.337883-.134313.466667-.262665l9.00000004-8.996667c.186765-.188234.291123-.44294.2901301-.708104-.0010081-.265166-.1072831-.519077-.2954631-.705897zm-9.70400104 9.703333-1.885333.471335.471333-1.882 6.51466704-6.515333 1.414666 1.414666zm7.22199904-7.221999-1.413999-1.414 1.774667-1.774666 1.414 1.413999z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 812 B

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.839434 4.121453-1.650001 1.649999-2.828667-2.828666 1.650001-1.65c.187528-.187471.441835-.292786.707-.292786.265163 0 .519471.105315.706999.292786l1.414668 1.414666c.187471.187528.292785.441837.292785.707001 0 .265163-.105314.519472-.292785.707zm-12.08800104 6.632666-.741333 2.963334c-.014087.055917-.013428.114533.001914.170119s.044842.106242.085617.147017.09143.070274.147017.085615c.055586.015343.114201.016003.170119.001915l2.963333-.741334c.176542-.043501.337883-.134313.466667-.262665l6.63933204-6.639334-2.83066604-2.828667-6.639333 6.639334c-.128039.128229-.218829.28884-.262667.464666z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 720 B

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.99999 1.66666c1.25262 0 2.47711.37145 3.51861 1.06736 1.0415.69592 1.8533 1.68505 2.3326 2.84232.4794 1.15726.6048 2.43068.3604 3.65923-.2443 1.22853-.8475 2.35703-1.7333 3.24273-.8857.8858-2.0142 1.489-3.24273 1.7333-1.22855.2444-2.50197.119-3.65924-.3604-1.15726-.4793-2.1464-1.2911-2.84231-2.3326-.69592-1.0415-1.06736-2.26599-1.06736-3.5186.00194-1.67911.66982-3.28889 1.85713-4.4762s2.7971-1.8552 4.4762-1.85714zm0-.999996c-1.45039 0-2.86822.430096-4.07418 1.235886-1.20596.8058-2.14589 1.95111-2.70093 3.2911-.555046 1.33999-.700271 2.81448-.417312 4.23701.282962 1.42254.981392 2.72924 2.006972 3.75474 1.02559 1.0256 2.33226 1.7241 3.75479 2.007 1.42253.283 2.89702.1378 4.23697-.4173 1.34-.555 2.4853-1.495 3.2911-2.7009.8058-1.206 1.2359-2.62381 1.2359-4.0742 0-1.94492-.7726-3.81019-2.1479-5.18545-1.3752-1.37527-3.24049-2.147886-5.18541-2.147886zm0 4.999996c.26522 0 .51957-.10535.70711-.29289s.29289-.44189.29289-.70711c.00015-.16451-.0403-.32652-.11775-.47166s-.18951-.26894-.32626-.36041c-.13674-.09146-.29394-.14778-.45765-.16396-.16372-.01618-.3289.00829-.4809.07123-.152.06293-.28612.1624-.39048.28958-.10436.12717-.17573.27813-.20779.4395-.03205.16136-.0238.32813.02402.48554s.13375.30059.25015.41685c.09126.09489.20113.16992.32273.22039.12159.05047.2523.07531.38393.07294zm.66667 5.33334v-4.33334h-2.33333v1h1.33333v3.33334h-1.66667v1h4v-1z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +1 @@
<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="m12 1a11 11 0 1 0 11 11 11 11 0 0 0 -11-11zm-1.06 4.939a1.5 1.5 0 0 1 2.56 1.061 1.5 1.5 0 0 1 -2.56 1.06 1.5 1.5 0 0 1 0-2.121zm4.06 12.061h-6v-1.5h2.5v-5h-2v-1.5h3.5v6.5h2z"/></svg>
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.99999.666664c-1.45039 0-2.86822.430096-4.07418 1.235886-1.20596.8058-2.14589 1.95111-2.70093 3.2911-.555046 1.33999-.700271 2.81448-.417312 4.23701.282962 1.42254.981392 2.72924 2.006972 3.75474 1.02559 1.0256 2.33226 1.7241 3.75479 2.007 1.42253.283 2.89702.1378 4.23697-.4173 1.34-.555 2.4853-1.495 3.2911-2.7009.8058-1.206 1.2359-2.62381 1.2359-4.0742 0-1.94492-.7726-3.81019-2.1479-5.18545-1.3752-1.37527-3.24049-2.147886-5.18541-2.147886zm-.70666 3.292666c.13989-.13971.31805-.23483.51198-.27332s.39491-.01863.57756.05707c.18264.07569.33875.20383.44859.36822s.16849.35765.16853.55536c-.00017.19766-.05891.39083-.16881.55511-.10989.16429-.266.29233-.44862.36794-.18262.07562-.38355.09542-.57741.05691-.19387-.03851-.37197-.13361-.51182-.27329-.18747-.18753-.29279-.44184-.29279-.707s.10532-.51947.29279-.707zm2.70666 8.04067h-4v-1h1.66667v-3.33334h-1.33333v-1h2.33333v4.33334h1.33333z" fill="#000"/></svg>

Before

Width:  |  Height:  |  Size: 275 B

After

Width:  |  Height:  |  Size: 1016 B

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 10.5v3.5h-1v-3.5zm5-7.5h-4c-.530433 0-1.039141.210713-1.414214.585787-.375072.375072-.585786.88378-.585786 1.414213v2.5h1v-2.5c0-.265217.105357-.51957.292893-.707107.187537-.187536.441891-.292893.707107-.292893h4c.265217 0 .51957.105357.707107.292893.187536.187537.292893.44189.292893.707107v9h1v-9c0-.530433-.210714-1.039141-.585787-1.414213-.375072-.375074-.88378-.585787-1.414213-.585787zm-3.043 2.979-.7.71 1.414 1.411.7.4h-7.371v1h7.375l-.7.4-1.423 1.411.705.71 3.043-3.021z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 603 B

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><mask id="a" fill="#fff"><path d="m2 0c-1.104569 0-2 .895431-2 2v3.5h4.371l-.7-.399996-1.414-1.411.7-.71 3.043 3.020996-3.043 3.021004-.705-.71 1.423-1.411001.7-.400003h-4.375v4.5h8v-9c0-1.104569-.895431-2-2-2z" fill="#fff" fill-rule="evenodd"/></mask><g fill="#000" fill-rule="evenodd" transform="translate(2 3)"><g transform="translate(3)"><path d="m2 0c-1.104569 0-2 .895431-2 2v3.5h4.371l-.7-.399996-1.414-1.411.7-.71 3.043 3.020996-3.043 3.021004-.705-.71 1.423-1.411001.7-.400003h-4.375v4.5h8v-9c0-1.104569-.895431-2-2-2z"/><path d="m0 5.500004h-1v1h1zm4.371 0v1h3.765567l-3.269428-1.868243zm-.7-.4-.706356.707857.094413.094212.115804.066174zm-1.414-1.411-.712104-.702074-.697853.707823.703601.702108zm.7-.71.704536-.709667-.71213-.706982-.70451.714575zm3.043 3.021.704537.709667.714836-.709667-.714836-.709668zm-3.043 3.021-.709601.704604.704537.709534.7096-.704471zm-.705-.71-.704106-.710095-.710593.7046.705098.710099zm1.423-1.411001-.496138-.868243-.114403.065373-.093565.092776zm.7-.399999.496139.868243 3.269428-1.868243h-3.765567zm-4.375 0v-1h-1v1zm0 4.499996h-1v1h1zm8 0v1h1v-1zm-7-9c0-.552284.447715-1 1-1v-2c-1.656854 0-3 1.343145-3 3zm0 3.5v-3.5h-2v3.5zm3.371-.999996h-4.371v2h4.371zm-1.196139 1.468243.700001.4.992277-1.736486-.700001-.4zm-1.624217-1.571386 1.414 1.411 1.412711-1.415714-1.413999-1.411zm.694252-2.119931-.7.71 1.424208 1.404148.7-.71zm4.459641 3.013406-3.043001-3.020999-1.409073 1.419334 3.043 3.021zm-3.043001 4.440335 3.043001-3.021-1.409074-1.419335-3.043 3.021001zm-2.119137-.715063.705.71 1.419202-1.409208-.705-.71zm1.428495-2.825699-1.423 1.411 1.408212 1.420189 1.423001-1.411zm.907967-.558148-.699999.399999.992277 1.736487.7-.4zm-3.878861 1.868243h4.375v-2h-4.375zm1 3.5v-4.5h-2v4.5zm7-1.000004h-8v2h8zm-1-8v9h2v-9zm-1-1c.552285 0 1 .447716 1 1h2c0-1.656855-1.343146-3-3-3zm-4 0h4v-2h-4z" mask="url(#a)"/></g><path d="m0 5.5h3v1h-3z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12.54.94c-.2754461-.11879507-.5953589-.05955195-.81.15-1.1149688 1.15260967-2.628075 1.83583255-4.23 1.91h-6.25c-.69035594 0-1.25.55964406-1.25 1.25v3.5c0 .69035594.55964406 1.25 1.25 1.25h.75v3.25c.00538581.4119621.33803794.7446142.75.75h1.5c.41196206-.0053858.74461419-.3380379.75-.75v-3.25h2.5c1.601925.07416745 3.1150312.75739033 4.23 1.91.1384594.1364429.3256201.212027.52.21.0997799.0003107.1985351-.0201214.29-.06.2781085-.116604.4593304-.3884368.46-.69v-8.74c-.0006696-.30156323-.1818915-.57339601-.46-.69zm-11.29 7.06c-.13807119 0-.25-.11192881-.25-.25v-3.5c0-.13807119.11192881-.25.25-.25h2.75v4zm2.75 4h-1v-3h1zm8-2.2c-1.240143-1.11294874-2.83441453-1.75065734-4.5-1.8h-2.5v-4h2.5c1.66558547-.04934266 3.259857-.68705126 4.5-1.8z" transform="translate(2 1)"/></svg>

After

Width:  |  Height:  |  Size: 869 B

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.25 3h3.75v9.25c-.00538581.4119621-.33803794.7446142-.75.75h-.5c-.41196206-.0053858-.74461419-.3380379-.75-.75v-3.25h-1.75c-.69035594 0-1.25-.55964406-1.25-1.25v-3.5c0-.69035594.55964406-1.25 1.25-1.25zm11.29-2.06c-.2754461-.11879507-.5953589-.05955195-.81.15-1.1149688 1.15260967-2.628075 1.83583255-4.23 1.91h-1.5v6h1.5c1.601925.07416745 3.1150312.75739033 4.23 1.91.1384594.1364429.3256201.212027.52.2100397.0997799.000271.1985351-.0201611.29-.0600397.2781085-.116604.4593304-.3884368.46-.69v-8.74c-.0006696-.30156323-.1818915-.57339601-.46-.69z" transform="translate(2 1)"/></svg>

After

Width:  |  Height:  |  Size: 678 B

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12.964932 8.421051c.415879-.458721.692655-1.032725.796298-1.651437.103644-.618711.029637-1.255159-.212922-1.831091-.242559-.575931-.643096-1.06624-1.152362-1.410641-.509268-.344402-1.105066-.527882-1.714138-.527882-.609073 0-1.204871.18348-1.714139.527882-.509266.344401-.909803.83471-1.152362 1.410641-.242559.575932-.316566 1.21238-.212923 1.831091.103644.618712.38042 1.192716.796299 1.651437-.770768.181094-1.459155.626347-1.95265 1.262985-.493497.636638-.762917 1.42701-.764225 2.241938v1.074026h.9375v-1.074026c.000826-.697424.269949-1.366038.74834-1.859191.47839-.493153 1.126989-.770582 1.803535-.771434h3.021249c.676546.000852 1.325145.278281 1.803535.771434.478391.493153.747514 1.161767.748341 1.859191v1.074026h.9375v-1.074026c-.00131-.814928-.270729-1.6053-.764225-2.241938s-1.181883-1.081891-1.952651-1.262985zm-2.283124.068939c-.432647 0-.855578-.132254-1.215311-.380037-.359732-.247783-.64011-.599967-.805676-1.012015-.165566-.412049-.208886-.865455-.124481-1.302883s.292744-.839232.598672-1.1546c.305927-.315368.695702-.530137 1.120035-.617146.424333-.087011.864167-.042354 1.263881.128322.399713.170677.741354.459706.98172.83054.240365.370833.36866.806816.36866 1.252813 0 .598065-.230468 1.171635-.640705 1.59453-.410235.422895-.966634.660476-1.546795.660476zm-5.024964-3.257751.707107.707106-3.53553 3.53553.000006.000007-.707107.707107h-.00001l-.707106-.70711-1.414204-1.414211.707107-.707107 1.414207 1.414208z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.68196 3c-.512766 0-1.014017.154922-1.440367.445174-.426349.290253-.758649.702801-.954876 1.185474-.196227.482672-.247569 1.013792-.147533 1.526195s.346956.983074.709537 1.352496c.36258.369422.824536.621001 1.327449.722925.502915.101923 1.024199.049612 1.497933-.150318.473735-.199929.878642-.538498 1.16352-.972892.284877-.434394.43693-.945103.43693-1.467544 0-.700572-.273147-1.37245-.759352-1.867829-.486206-.49538-1.145643-.773681-1.833241-.773681zm2.621482 5.303397c-.343416.352279-.751837.631861-1.201745.822648-.449909.190786-.932416.289006-1.419737.289006-.48732 0-.969827-.09822-1.419735-.289006-.449908-.190787-.858331-.470369-1.201746-.822648-.692402.23982-1.293911.694155-1.720386 1.299454-.426474.605299-.656582 1.331283-.658133 2.076395v.566038c0 .200163.078042.392129.216958.533666s.327326.22105.523783.22105h8.518519c.196457 0 .384867-.079513.523783-.22105s.216957-.333503.216957-.533666v-.566038c-.001551-.745112-.231658-1.471096-.658132-2.076395-.426475-.605299-1.027984-1.059634-1.720386-1.299454zm-7.646598-3.071158.707107.707106-3.53553 3.53553.000006.000007-.707107.707107h-.00001l-.707106-.70711-1.414204-1.414211.707107-.707107 1.414207 1.414208z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 3)"><path d="m12.283125 5.421051c.415879-.458721.692655-1.032725.796298-1.651437.103643-.618711.029636-1.255159-.212922-1.831091-.242559-.575931-.643096-1.06624-1.152363-1.410641-.509267-.344402-1.105065-.527882-1.714138-.527882s-1.204871.18348-1.714138.527882c-.509267.344401-.909803.83471-1.152362 1.410641-.242559.575932-.316567 1.21238-.212923 1.831091.103643.618712.38042 1.192716.796298 1.651437-.770767.181094-1.459154.626347-1.95265 1.262985s-.762916 1.42701-.764225 2.241938v1.074026h.9375v-1.074026c.000827-.697424.26995-1.366038.74834-1.859191s1.126989-.770582 1.803535-.771434h3.02125c.676546.000852 1.325144.278281 1.803534.771434.478391.493153.747514 1.161767.748341 1.859191v1.074026h.9375v-1.074026c-.001309-.814928-.270728-1.6053-.764225-2.241938-.493496-.636638-1.181883-1.081891-1.95265-1.262985zm-2.283125.068939c-.432647 0-.855577-.132254-1.21531-.380037s-.64011-.599967-.805676-1.012015c-.165567-.412049-.208887-.865455-.124482-1.302883s.292745-.839232.598672-1.1546.695702-.530137 1.120036-.617146c.424333-.087011.864167-.042354 1.26388.128322.399713.170677.741355.459706.98172.83054.240366.370833.36866.806816.36866 1.252813 0 .598065-.230468 1.171635-.640704 1.59453s-.966635.660476-1.546796.660476z"/><path d="m5 3.8h-1.8v-1.8h-.4v1.8h-1.8v.4h1.8v1.8h.4v-1.8h1.8z"/><path d="m5 3.8h.25v-.25h-.25zm-1.8 0h-.25v.25h.25zm0-1.8h.25v-.25h-.25zm-.4 0v-.25h-.25v.25zm0 1.8v.25h.25v-.25zm-1.8 0v-.25h-.25v.25zm0 .4h-.25v.25h.25zm1.8 0h.25v-.25h-.25zm0 1.8h-.25v.25h.25zm.4 0v.25h.25v-.25zm0-1.8v-.25h-.25v.25zm1.8 0v.25h.25v-.25zm0-.65h-1.8v.5h1.8zm-1.55.25v-1.8h-.5v1.8zm-.25-2.05h-.4v.5h.4zm-.65.25v1.8h.5v-1.8zm.25 1.55h-1.8v.5h1.8zm-2.05.25v.4h.5v-.4zm.25.65h1.8v-.5h-1.8zm1.55-.25v1.8h.5v-1.8zm.25 2.05h.4v-.5h-.4zm.65-.25v-1.8h-.5v1.8zm-.25-1.55h1.8v-.5h-1.8zm2.05-.25v-.4h-.5v.4z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 3)"><path d="m10 0c-.512766 0-1.014017.154922-1.440367.445174-.42635.290253-.758649.702801-.954876 1.185474-.196227.482672-.247569 1.013792-.147533 1.526195.100035.512403.346956.983074.709537 1.352496.36258.369422.824536.621001 1.32745.722925.502913.101923 1.024197.049612 1.497932-.150318.473734-.199929.878642-.538498 1.16352-.972892.284877-.434394.43693-.945103.43693-1.467544 0-.700572-.273147-1.37245-.759353-1.867829-.486205-.49538-1.145641-.773681-1.83324-.773681zm2.621482 5.303397c-.343416.352279-.751837.631861-1.201746.822648-.449908.190786-.932415.289006-1.419736.289006-.48732 0-.969827-.09822-1.419735-.289006-.449909-.190787-.85833-.470369-1.201746-.822648-.692402.23982-1.293911.694155-1.720386 1.299454-.426474.605299-.656582 1.331283-.658133 2.076395v.566038c0 .200163.078042.392129.216958.533666s.327326.22105.523783.22105h8.518519c.196457 0 .384867-.079513.523783-.22105s.216957-.333503.216957-.533666v-.566038c-.001551-.745112-.231658-1.471096-.658133-2.076395-.426474-.605299-1.027983-1.059634-1.720385-1.299454z"/><path d="m5 3.8h-1.8v-1.8h-.4v1.8h-1.8v.4h1.8v1.8h.4v-1.8h1.8z"/><path d="m5 3.8h.25v-.25h-.25zm-1.8 0h-.25v.25h.25zm0-1.8h.25v-.25h-.25zm-.4 0v-.25h-.25v.25zm0 1.8v.25h.25v-.25zm-1.8 0v-.25h-.25v.25zm0 .4h-.25v.25h.25zm1.8 0h.25v-.25h-.25zm0 1.8h-.25v.25h.25zm.4 0v.25h.25v-.25zm0-1.8v-.25h-.25v.25zm1.8 0v.25h.25v-.25zm0-.65h-1.8v.5h1.8zm-1.55.25v-1.8h-.5v1.8zm-.25-2.05h-.4v.5h.4zm-.65.25v1.8h.5v-1.8zm.25 1.55h-1.8v.5h1.8zm-2.05.25v.4h.5v-.4zm.25.65h1.8v-.5h-1.8zm1.55-.25v1.8h.5v-1.8zm.25 2.05h.4v-.5h-.4zm.65-.25v-1.8h-.5v1.8zm-.25-1.55h1.8v-.5h-1.8zm2.05-.25v-.4h-.5v.4z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(1 3)"><path d="m11.283125 5.421051c.415879-.458721.692655-1.032725.796298-1.651437.103643-.618711.029636-1.255159-.212922-1.831091-.242559-.575931-.643096-1.06624-1.152363-1.410641-.509267-.344402-1.105065-.527882-1.714138-.527882s-1.204871.18348-1.714138.527882c-.509267.344401-.909803.83471-1.152362 1.410641-.242559.575932-.316567 1.21238-.212923 1.831091.103643.618712.38042 1.192716.796298 1.651437-.770767.181094-1.459154.626347-1.95265 1.262985s-.762916 1.42701-.764225 2.241938v1.074026h.9375v-1.074026c.000827-.697424.26995-1.366038.74834-1.859191s1.126989-.770582 1.803535-.771434h3.02125c.676546.000852 1.325144.278281 1.803534.771434.478391.493153.747514 1.161767.748341 1.859191v1.074026h.9375v-1.074026c-.001309-.814928-.270728-1.6053-.764225-2.241938-.493496-.636638-1.181883-1.081891-1.95265-1.262985zm-2.283125.068939c-.432647 0-.855577-.132254-1.21531-.380037s-.64011-.599967-.805676-1.012015c-.165567-.412049-.208887-.865455-.124482-1.302883s.292745-.839232.598672-1.1546.695702-.530137 1.120036-.617146c.424333-.087011.864167-.042354 1.26388.128322.399713.170677.741355.459706.98172.83054.240366.370833.36866.806816.36866 1.252813 0 .598065-.230468 1.171635-.640704 1.59453s-.966635.660476-1.546796.660476z"/><path d="m3.5556367 5.2727893-1.2727926-1.2727926 1.2727926-1.2727926-.2828428-.2828428-1.2727926 1.2727926-1.2727926-1.2727926-.2828428.2828428 1.2727926 1.2727926-1.2727926 1.2727926.2828428.2828428 1.2727926-1.2727926 1.2727926 1.2727926z"/><path d="m3.55563641 5.27278959.17677675.17677675.17677675-.17677675-.17677675-.17677675zm-1.2727926-1.2727926-.17677675-.17677675-.17677675.17677675.17677675.17677675zm1.2727933-1.2727933.17677675.17677675.17677675-.17677675-.17677675-.17677675zm-.2828428-.2828428.17677675-.17677675-.17677675-.17677675-.17677675.17677675zm-1.2727933 1.2727933-.17677675.17677675.17677675.17677675.17677675-.17677675zm-1.2727926-1.2727926.17677675-.17677675-.17677675-.17677675-.17677675.17677675zm-.2828421.2828421-.17677675-.17677675-.17677675.17677675.17677675.17677675zm1.2727926 1.2727926.17677675.17677675.17677675-.17677675-.17677675-.17677675zm-1.2727926 1.2727926-.17677675-.17677675-.17677675.17677675.17677675.17677675zm.2828428.2828428-.17677675.17677675.17677675.17677675.17677675-.17677675zm1.2727926-1.2727926.17677675-.17677675-.17677675-.17677675-.17677675.17677675zm1.2727926 1.2727926-.17677675.17677675.17677675.17677675.17677675-.17677675zm.45961885-.45961885-1.2727926-1.2727926-.3535535.3535535 1.2727926 1.2727926zm-1.2727926-.9192391 1.2727933-1.2727933-.3535535-.3535535-1.2727933 1.2727933zm1.2727933-1.6263468-.2828428-.2828428-.3535535.3535535.2828428.2828428zm-.6363963-.2828428-1.2727933 1.2727933.3535535.3535535 1.2727933-1.2727933zm-.9192398 1.2727933-1.2727926-1.2727926-.3535535.3535535 1.2727926 1.2727926zm-1.6263461-1.2727926-.2828421.2828421.3535535.3535535.2828421-.2828421zm-.2828421.6363956 1.2727926 1.2727926.3535535-.3535535-1.2727926-1.2727926zm1.2727926.9192391-1.2727926 1.2727926.3535535.3535535 1.2727926-1.2727926zm-1.2727926 1.6263461.2828428.2828428.3535535-.3535535-.2828428-.2828428zm.6363963.2828428 1.2727926-1.2727926-.3535535-.3535535-1.2727926 1.2727926zm.9192391-1.2727926 1.2727926 1.2727926.3535535-.3535535-1.2727926-1.2727926zm1.6263461 1.2727926.2828421-.2828421-.3535535-.3535535-.2828421.2828421z"/></g></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(1 3)"><path d="m9 0c-.512766 0-1.014017.154922-1.440367.445174-.42635.290253-.758649.702801-.954876 1.185474-.196227.482672-.247569 1.013792-.147533 1.526195.100035.512403.346956.983074.709537 1.352496.36258.369422.824536.621001 1.32745.722925.502913.101923 1.024197.049612 1.497932-.150318.473734-.199929.878642-.538498 1.16352-.972892.284877-.434394.43693-.945103.43693-1.467544 0-.700572-.273147-1.37245-.759353-1.867829-.486205-.49538-1.145641-.773681-1.83324-.773681zm2.621482 5.303397c-.343416.352279-.751837.631861-1.201746.822648-.449908.190786-.932415.289006-1.419736.289006-.48732 0-.969827-.09822-1.419735-.289006-.449909-.190787-.85833-.470369-1.201746-.822648-.692402.23982-1.293911.694155-1.720386 1.299454-.426474.605299-.656582 1.331283-.658133 2.076395v.566038c0 .200163.078042.392129.216958.533666s.327326.22105.523783.22105h8.518519c.196457 0 .384867-.079513.523783-.22105s.216957-.333503.216957-.533666v-.566038c-.001551-.745112-.231658-1.471096-.658133-2.076395-.426474-.605299-1.027983-1.059634-1.720385-1.299454z"/><path d="m3.5556357 5.2727893-1.2727926-1.2727926 1.2727926-1.2727926-.2828428-.2828428-1.2727926 1.2727926-1.2727926-1.2727926-.2828428.2828428 1.2727926 1.2727926-1.2727926 1.2727926.2828428.2828428 1.2727926-1.2727926 1.2727926 1.2727926z"/><path d="m3.55563641 5.27278959.17677675.17677675.17677675-.17677675-.17677675-.17677675zm-1.2727926-1.2727926-.17677675-.17677675-.17677675.17677675.17677675.17677675zm1.2727933-1.2727933.17677675.17677675.17677675-.17677675-.17677675-.17677675zm-.2828428-.2828428.17677675-.17677675-.17677675-.17677675-.17677675.17677675zm-1.2727933 1.2727933-.17677675.17677675.17677675.17677675.17677675-.17677675zm-1.2727926-1.2727926.17677675-.17677675-.17677675-.17677675-.17677675.17677675zm-.2828421.2828421-.17677675-.17677675-.17677675.17677675.17677675.17677675zm1.2727926 1.2727926.17677675.17677675.17677675-.17677675-.17677675-.17677675zm-1.2727926 1.2727926-.17677675-.17677675-.17677675.17677675.17677675.17677675zm.2828428.2828428-.17677675.17677675.17677675.17677675.17677675-.17677675zm1.2727926-1.2727926.17677675-.17677675-.17677675-.17677675-.17677675.17677675zm1.2727926 1.2727926-.17677675.17677675.17677675.17677675.17677675-.17677675zm.45961885-.45961885-1.2727926-1.2727926-.3535535.3535535 1.2727926 1.2727926zm-1.2727926-.9192391 1.2727933-1.2727933-.3535535-.3535535-1.2727933 1.2727933zm1.2727933-1.6263468-.2828428-.2828428-.3535535.3535535.2828428.2828428zm-.6363963-.2828428-1.2727933 1.2727933.3535535.3535535 1.2727933-1.2727933zm-.9192398 1.2727933-1.2727926-1.2727926-.3535535.3535535 1.2727926 1.2727926zm-1.6263461-1.2727926-.2828421.2828421.3535535.3535535.2828421-.2828421zm-.2828421.6363956 1.2727926 1.2727926.3535535-.3535535-1.2727926-1.2727926zm1.2727926.9192391-1.2727926 1.2727926.3535535.3535535 1.2727926-1.2727926zm-1.2727926 1.6263461.2828428.2828428.3535535-.3535535-.2828428-.2828428zm.6363963.2828428 1.2727926-1.2727926-.3535535-.3535535-1.2727926 1.2727926zm.9192391-1.2727926 1.2727926 1.2727926.3535535-.3535535-1.2727926-1.2727926zm1.6263461 1.2727926.2828421-.2828421-.3535535-.3535535-.2828421.2828421z"/></g></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 3)"><path d="m12.283125 5.421051c.415879-.458721.692655-1.032725.796298-1.651437.103643-.618711.029636-1.255159-.212922-1.831091-.242559-.575931-.643096-1.06624-1.152363-1.410641-.509267-.344402-1.105065-.527882-1.714138-.527882s-1.204871.18348-1.714138.527882c-.509267.344401-.909803.83471-1.152362 1.410641-.242559.575932-.316567 1.21238-.212923 1.831091.103643.618712.38042 1.192716.796298 1.651437-.770767.181094-1.459154.626347-1.95265 1.262985s-.762916 1.42701-.764225 2.241938v1.074026h.9375v-1.074026c.000827-.697424.26995-1.366038.74834-1.859191s1.126989-.770582 1.803535-.771434h3.02125c.676546.000852 1.325144.278281 1.803534.771434.478391.493153.747514 1.161767.748341 1.859191v1.074026h.9375v-1.074026c-.001309-.814928-.270728-1.6053-.764225-2.241938-.493496-.636638-1.181883-1.081891-1.95265-1.262985zm-2.283125.068939c-.432647 0-.855577-.132254-1.21531-.380037s-.64011-.599967-.805676-1.012015c-.165567-.412049-.208887-.865455-.124482-1.302883s.292745-.839232.598672-1.1546.695702-.530137 1.120036-.617146c.424333-.087011.864167-.042354 1.26388.128322.399713.170677.741355.459706.98172.83054.240366.370833.36866.806816.36866 1.252813 0 .598065-.230468 1.171635-.640704 1.59453s-.966635.660476-1.546796.660476z"/><path d="m4.5 3.800003h-1.575v.25h-.35v-.25h-1.575v.5h1.575v-.25h.35v.25h1.575z"/><path d="m4.5 3.800003h.25v-.25h-.25zm-1.575 0v-.25h-.25v.25zm-.35 0h.25v-.25h-.25zm-1.575 0v-.25h-.25v.25zm0 .5h-.25v.25h.25zm1.575 0v.25h.25v-.25zm.35 0h-.25v.25h.25zm1.575 0v.25h.25v-.25zm0-.75h-1.575v.5h1.575zm-1.825.25v.25h.5v-.25zm.25 0h-.35v.5h.35zm-.1.25v-.25h-.5v.25zm-.25-.5h-1.575v.5h1.575zm-1.825.25v.5h.5v-.5zm.25.75h1.575v-.5h-1.575zm1.825-.25v-.25h-.5v.25zm-.15-.25v.25h.5v-.25zm.25.5h1.575v-.5h-1.575zm1.825-.25v-.5h-.5v.5z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 3)"><path d="m10 0c-.512766 0-1.014017.154922-1.440367.445174-.42635.290253-.758649.702801-.954876 1.185474-.196227.482672-.247569 1.013792-.147533 1.526195.100035.512403.346956.983074.709537 1.352496.36258.369422.824536.621001 1.32745.722925.502913.101923 1.024197.049612 1.497932-.150318.473734-.199929.878642-.538498 1.16352-.972892.284877-.434394.43693-.945103.43693-1.467544 0-.700572-.273147-1.37245-.759353-1.867829-.486205-.49538-1.145641-.773681-1.83324-.773681zm2.621482 5.303397c-.343416.352279-.751837.631861-1.201746.822648-.449908.190786-.932415.289006-1.419736.289006-.48732 0-.969827-.09822-1.419735-.289006-.449909-.190787-.85833-.470369-1.201746-.822648-.692402.23982-1.293911.694155-1.720386 1.299454-.426474.605299-.656582 1.331283-.658133 2.076395v.566038c0 .200163.078042.392129.216958.533666s.327326.22105.523783.22105h8.518519c.196457 0 .384867-.079513.523783-.22105s.216957-.333503.216957-.533666v-.566038c-.001551-.745112-.231658-1.471096-.658133-2.076395-.426474-.605299-1.027983-1.059634-1.720385-1.299454z"/><path d="m4.5 3.800003h-1.575v.25h-.35v-.25h-1.575v.5h1.575v-.25h.35v.25h1.575z"/><path d="m4.5 3.800003h.25v-.25h-.25zm-1.575 0v-.25h-.25v.25zm-.35 0h.25v-.25h-.25zm-1.575 0v-.25h-.25v.25zm0 .5h-.25v.25h.25zm1.575 0v.25h.25v-.25zm.35 0h-.25v.25h.25zm1.575 0v.25h.25v-.25zm0-.75h-1.575v.5h1.575zm-1.825.25v.25h.5v-.25zm.25 0h-.35v.5h.35zm-.1.25v-.25h-.5v.25zm-.25-.5h-1.575v.5h1.575zm-1.825.25v.5h.5v-.5zm.25.75h1.575v-.5h-1.575zm1.825-.25v-.25h-.5v.25zm-.15-.25v.25h.5v-.25zm.25.5h1.575v-.5h-1.575zm1.825-.25v-.5h-.5v.5z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.31 15c-.56019-.0107-1.11458-.1155-1.64002-.31-1.67292-.6445-3.1922-1.6324-4.45989-2.9001-1.26768-1.2677-2.25562-2.78698-2.90011-4.4599-.24257-.52971-.349479-1.11147-.311072-1.69282.038412-.58134.220922-1.14398.531072-1.63718.31152-.43101.72804-.77523 1.21-1 .36454-.19623.78816-.2527 1.19137-.1588s.7583.33171.99863.6688l1.29 1.77c.23097.33114.33575.73402.2954 1.13573-.04036.4017-.22318.77569-.5154 1.05427l-.57.53c-.01298.01731-.02.03836-.02.06s.00702.04269.02.06c.33636.4732.71095.91803 1.12 1.33.41357.42333.8618.8113 1.34 1.16.01731.013.03837.02.06.02.02164 0 .0427-.007.06-.02.17-.19.31-.35.52-.57.27859-.29221.65257-.47504 1.05428-.51539.40171-.04036.80454.06443 1.13574.29539l1.84 1.29c.3298.2342.5647.579.662.9717.0972.3927.0504.8072-.132 1.1683-.248.4967-.6243.9179-1.09 1.22-.4949.3474-1.0854.5326-1.69.53zm-8.00002-10.46c-.22163.37026-.34282.79193-.35159 1.22336s.09519.85769.30159 1.23664c.5867 1.53649 1.49342 2.93066 2.66001 4.09 1.15739 1.1618 2.54797 2.065 4.07999 2.65.38117.1986.8074.2947 1.23692.2789.4295-.0158.8475-.1429 1.2131-.3689.3115-.2141.56-.5075.72-.85.0864-.1492.1138-.3254.0768-.4939-.037-.1684-.1358-.3168-.2768-.4161l-1.83-1.29c-.1322-.0937-.29345-.1371-.45478-.1224s-.31213.0864-.42524.2024l-.5.55c-.17594.2117-.42607.3482-.69928.3816-.27322.0335-.54889-.0386-.77072-.2016-.51279-.3812-.99739-.799-1.45-1.25-.45103-.45261-.86878-.9372-1.24999-1.45-.1636-.22341-.23604-.50071-.20261-.77559s.17022-.52673.3826-.70441l.55-.49c.11597-.11311.18775-.2639.20242-.42523s-.02874-.3226-.12242-.45477l-1.28999-1.86c-.09033-.13704-.22848-.2355-.38749-.27618s-.32748-.02065-.47252.05618c-.36294.15823-.6746.41448-.9.74zm12.50002-2.69-.7-.7-4.11002 4.14v-3.29h-1v5h5.00002v-1h-3.29z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.12999 2.52c.2728-.14019.58713-.17692.88491-.10339.29777.07353.55888.25233.73509.50339l1.38 2c.17376.2435.25601.54051.23222.83871-.02378.29819-.15206.57842-.36222.79129-.23.22-.39.37-.6.54-.07094.04883-.13128.11146-.17744.18416-.04615.0727-.07716.15397-.09116.23893-.01401.08496-.01072.17188.00966.25555.02037.08366.05743.16235.10894.23136.39584.51581.82687 1.00364 1.29 1.46.4724.46493.97699.896 1.51 1.29.13218.0918.29408.1304.45346.1082.15938-.0223.30453-.1037.40654-.2282.17-.21.32-.37.54-.6.21026-.21988.49247-.35697.79531-.38634.3028-.02936.6061.05096.8547.22634l2 1.38c.251.1762.4299.4373.5034.7351s.0368.6121-.1034.8849c-.2234.4693-.5688.8699-1 1.16-.4612.2957-.9916.466-1.5388.494-.5471.0281-1.09216-.087-1.58121-.334-1.72436-.6593-3.29005-1.6753-4.59457-2.9815-1.30452-1.30624-2.31845-2.87327-2.97543-4.5985-.24257-.49162-.35262-1.03804-.3193-1.58523s.20887-1.07621.5093-1.53477c.2858-.41618.67531-.75054 1.13-.97zm11.72001-.67-.7-.7-4.15001 4.14v-3.29h-1v5h5.00001v-1h-3.29z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.31 15c-.56019-.0107-1.11458-.1155-1.64002-.31-1.67292-.6445-3.1922-1.6324-4.45989-2.9001-1.26768-1.2677-2.25562-2.78698-2.90011-4.4599-.24257-.52971-.349479-1.11147-.311072-1.69282.038412-.58134.220922-1.14399.531072-1.63718.31152-.43101.72804-.77524 1.21-1 .36454-.19623.78816-.2527 1.19137-.1588s.7583.33171.99863.6688l1.29 1.77c.23097.33114.33575.73402.2954 1.13572-.04036.40171-.22318.7757-.5154 1.05428l-.57.53c-.01298.01731-.02.03836-.02.06s.00702.04269.02.06c.33636.4732.71095.91803 1.12 1.33.41357.42333.8618.8113 1.34 1.16.01731.013.03837.02.06.02.02164 0 .0427-.007.06-.02.17-.19.31-.35.52-.57.27859-.29221.65257-.47504 1.05428-.51539.40171-.04036.80454.06443 1.13574.29539l1.84 1.29c.3298.2342.5647.579.662.9717.0972.3927.0504.8072-.132 1.1683-.248.4967-.6243.9179-1.09 1.22-.4949.3474-1.0854.5326-1.69.53zm-8.00002-10.46c-.22163.37025-.34282.79193-.35159 1.22336s.09519.85769.30159 1.23664c.5867 1.53649 1.49342 2.93066 2.66001 4.09 1.15739 1.1618 2.54797 2.065 4.07999 2.65.38117.1986.8074.2947 1.23692.2789.4295-.0158.8475-.1429 1.2131-.3689.3115-.2141.56-.5076.72-.85.0864-.1492.1138-.3254.0768-.4939-.037-.1684-.1358-.3168-.2768-.4161l-1.83-1.29c-.1322-.0937-.29345-.1371-.45478-.1224s-.31213.0864-.42524.2024l-.5.55c-.17594.2117-.42607.3482-.69928.3816-.27322.0335-.54889-.0386-.77072-.2016-.51279-.3812-.99739-.799-1.45-1.25-.45103-.45261-.86878-.9372-1.24999-1.45-.1636-.22341-.23604-.50071-.20261-.77559s.17022-.52673.3826-.70441l.55-.49c.11597-.11311.18775-.2639.20242-.42524.01467-.16133-.02874-.32259-.12242-.45476l-1.28999-1.86c-.09033-.13704-.22848-.2355-.38749-.27618s-.32748-.02065-.47252.05618c-.36294.15822-.6746.41448-.9.74zm6.69-2.54v1h3.29002l-4.14002 4.15.70001.7 4.15001-4.14v3.29h1v-5z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 2v5h-1v-3.29l-4.14999 4.14-.7-.7 4.13999-4.15h-3.28999v-1zm-11.99999 1.49c-.2957.46123-.46599.99161-.49404 1.53877-.02806.54716.08707 1.09217.33404 1.58123.65807 1.72621 1.67354 3.29385 2.97985 4.6001 1.3063 1.3064 2.87394 2.3218 4.60015 2.9799.48783.237 1.02859.3441 1.56999.3108.5413-.0333 1.0649-.2058 1.52-.5008.4313-.2901.7766-.6907 1-1.16.1402-.2728.1769-.5871.1034-.8849s-.2523-.5589-.5034-.7351l-2-1.38c-.2494-.17813-.5548-.26005-.8599-.23065-.30512.02941-.58929.16816-.80009.39065-.22.23-.37.39-.54.6-.10201.1245-.24716.2059-.40654.2282-.15938.0222-.32128-.0164-.45346-.1082-.53203-.3844-1.03659-.80539-1.51-1.26-.46313-.45636-.89416-.94419-1.29-1.46-.09178-.13218-.1304-.29409-.10816-.45346.02224-.15938.1037-.30453.22816-.40654.21-.17.37-.32.6-.54.23318-.21279.37875-.5048.40833-.8191.02958-.31429-.05895-.62834-.24833-.8809l-1.38-2c-.17621-.25106-.43732-.42987-.73509-.50339-.29778-.07353-.61211-.0368-.88491.10339-.45709.22501-.84684.56647-1.13.99z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.31 15c-.56019-.0107-1.11458-.1155-1.64002-.31-1.67214-.646-3.19115-1.6337-4.45999-2.9-1.26378-1.2709-2.25112-2.78933-2.90001-4.46001-.24257-.52971-.349479-1.11147-.311072-1.69281.038412-.58135.220922-1.14399.531072-1.63719.31152-.431.72804-.77523 1.21-1 .36454-.19623.78816-.25269 1.19137-.1588.40321.0939.7583.33171.99863.6688l1.29 1.77c.23097.33114.33575.73402.2954 1.13573-.04036.4017-.22318.77569-.5154 1.05427l-.57.53c-.01298.01731-.02.03837-.02.06 0 .02164.00702.04269.02.06.33636.47321.71095.91803 1.12 1.33.41357.42333.8618.81131 1.34 1.16001h.12c.17-.2.31-.35.52-.57.27859-.29222.65257-.47505 1.05428-.5154s.80454.06443 1.13574.29539l1.84 1.29001c.3298.2342.5647.579.662.9717.0972.3927.0504.8072-.132 1.1683-.248.4967-.6243.9179-1.09 1.22-.4949.3474-1.0854.5326-1.69.53zm-6.76002-11.27001c-.10425-.00185-.20733.0222-.3.07-.36294.15823-.6746.41448-.9.74-.22783.36674-.35598.7866-.37176 1.21805-.01579.43145.08134.85955.28176 1.24195.5867 1.53649 1.49342 2.93066 2.66001 4.09001 1.15739 1.1618 2.54797 2.065 4.07999 2.65.38117.1986.8074.2947 1.23692.2789.4295-.0158.8475-.1429 1.2131-.3689.3115-.2141.56-.5076.72-.85.0864-.1492.1138-.3254.0768-.4939-.037-.1684-.1358-.3169-.2768-.4161l-1.83-1.29c-.1322-.0937-.29345-.1371-.45478-.1224-.16133.0146-.31213.0864-.42524.2024l-.5.55c-.17594.2117-.42607.3482-.69928.3816-.27322.0335-.54889-.0386-.77072-.2016-.51279-.3812-.99739-.799-1.45-1.25-.45103-.45261-.86878-.93721-1.24999-1.45001-.16298-.22182-.2351-.49749-.20165-.77071.03346-.27321.16997-.52334.38164-.69929l.55-.5c.11597-.11311.18775-.2639.20242-.42523s-.02874-.3226-.12242-.45477l-1.28999-1.86c-.06459-.0869-.14927-.15686-.24679-.20388-.09753-.04702-.205-.06971-.31322-.06612zm10.80002-1.38-.7-.7-2.15 2.14-2.15001-2.14-.70001.7 2.14002 2.15-2.14002 2.15.70001.7 2.15001-2.14 2.15 2.14.7-.7-2.14-2.15z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.12999 2.51999c.2728-.14019.58713-.17691.88491-.10339.29777.07353.55888.25234.73509.50339l1.38 2c.17376.2435.25601.54052.23222.83871-.02378.29819-.15206.57842-.36222.79129-.23.22-.39.37-.6.54-.07094.04883-.13128.11147-.17744.18416-.04615.0727-.07716.15397-.09116.23893-.01401.08497-.01072.17188.00966.25555.02037.08366.05743.16236.10894.23136.39584.51581.82687 1.00364 1.29 1.46.4724.46494.97699.89601 1.51 1.29001.13218.0918.29408.1304.45346.1082.15938-.0223.30453-.1037.40654-.2282.17-.21.32-.37.54-.6.21026-.21989.49247-.35698.79531-.38635.3028-.02936.6061.05096.8547.22634l2 1.38001c.251.1762.4299.4373.5034.7351s.0368.6121-.1034.8849c-.2234.4693-.5688.8699-1 1.16-.4612.2957-.9916.466-1.5388.494-.5471.0281-1.09216-.087-1.58121-.334-1.72436-.6593-3.29005-1.6753-4.59457-2.9815-1.30452-1.30625-2.31845-2.87328-2.97543-4.59851-.24257-.49162-.35262-1.03803-.3193-1.58523.03332-.54719.20887-1.07621.5093-1.53477.2858-.41618.67531-.75054 1.13-.97zm11.22001-.17-.7-.7-2.15 2.14-2.15001-2.14-.70001.7 2.14002 2.15-2.14002 2.15.70001.7 2.15001-2.14 2.15 2.14.7-.7-2.14-2.15z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.6667.33333h-7.33336c-.79565 0-1.55872.31607-2.12132.87868-.56261.56261-.87868 1.32567-.87868 2.12132v7.33337c0 .7956.31607 1.5587.87868 2.1213.5626.5626 1.32567.8787 2.12132.8787h7.33336c.7956 0 1.5587-.3161 2.1213-.8787s.8787-1.3257.8787-2.1213v-7.33337c0-.79565-.3161-1.55871-.8787-2.12132s-1.3257-.87868-2.1213-.87868zm-7.33336 1h7.33336c.5304 0 1.0391.21072 1.4142.58579s.5858.88378.5858 1.41421v4.5l-.414-.62133-2.586-2.586-2.00003 2-2.66667-2.66667-3.25266 3.25267-.414.62133v-4.5c0-.53043.21071-1.03914.58578-1.41421.37508-.37507.88378-.58579 1.41422-.58579zm7.33336 11.33337h-7.33336c-.53044 0-1.03914-.2107-1.41422-.5858-.37507-.3751-.58578-.8838-.58578-1.4142v-1.626l3.66666-3.6667 3.98 3.9793.7067-.70663-1.3127-1.31334 1.2927-1.29266 3 3.00003v1.626c0 .5304-.2107 1.0391-.5858 1.4142s-.8838.5858-1.4142.5858z" transform="translate(1 1)"/></svg>

After

Width:  |  Height:  |  Size: 952 B

View File

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.6667.33333h-7.33337c-.79565 0-1.55871.31607-2.12132.87868s-.87868 1.32567-.87868 2.12132v7.33337c0 .7956.31607 1.5587.87868 2.1213s1.32567.8787 2.12132.8787h7.33337c.7956 0 1.5587-.3161 2.1213-.8787s.8787-1.3257.8787-2.1213v-7.33337c0-.79565-.3161-1.55871-.8787-2.12132s-1.3257-.87868-2.1213-.87868zm2 7.5-.414-.62133-2.586-2.586-1.52804 1.52867 1.57534 1.57866-.4713.47134-4.2427-4.24534-3.25267 3.25267-.414.62133v-4.5c0-.53043.21071-1.03914.58578-1.41421.37508-.37507.88379-.58579 1.41422-.58579h7.33337c.5304 0 1.0391.21072 1.4142.58579.375.37507.5858.88378.5858 1.41421z" transform="translate(1 1)"/></svg>

After

Width:  |  Height:  |  Size: 707 B

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.23 4.16c-.2276-.09696-.4791-.12306-.7217-.07489-.2426.04816-.465.16836-.6383.34489l-1.87 1.86v-1.54c-.0026-.46332-.1878-.90691-.5155-1.23454-.3276-.32762-.77118-.51283-1.2345-.51546h-6.5c-.46332.00263-.90691.18784-1.23454.51546-.32762.32763-.51283.77122-.51546 1.23454v6.5c.00263.4633.18784.9069.51546 1.2345.32763.3277.77122.5129 1.23454.5155h6.5c.46332-.0026.9069-.1878 1.2345-.5155.3277-.3276.5129-.7712.5155-1.2345v-1.54l1.87 1.86c.1146.1172.2515.2103.4026.2739.1512.0635.3135.0962.4774.0961.1652.0006.3288-.0334.48-.1.2289-.0923.4248-.2513.5621-.4564s.2098-.4468.2079-.6936v-5.38c.0019-.24681-.0706-.48848-.2079-.69357s-.3332-.36413-.5621-.45643zm-4.23 7.09c-.00259.1981-.08244.3874-.22253.5275-.1401.1401-.32936.2199-.52747.2225h-6.5c-.19811-.0026-.38737-.0824-.52747-.2225-.14009-.1401-.21994-.3294-.22253-.5275v-6.5c.00259-.19811.08244-.38737.22253-.52747.1401-.14009.32936-.21994.52747-.22253h6.5c.19811.00259.38737.08244.52747.22253.14009.1401.21994.32936.22253.52747zm4-.56c.0002.0488-.0139.0966-.0406.1374-.0266.0409-.0647.0731-.1094.0926-.0465.0198-.0977.0256-.1474.0167-.0498-.0089-.0958-.0321-.1326-.0667l-2.57-2.58v-.58l2.57-2.58c.0418-.02672.0904-.04091.14-.04091s.0982.01419.14.04091c.0447.01952.0828.05169.1094.09256.0267.04087.0408.08865.0406.13744zm-9.29-.69h3.29v1h-5v-5h1v3.29l4.15-4.14.7.7z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 3h-6c-.53043 0-1.03914.21071-1.41421.58579-.37508.37507-.58579.88378-.58579 1.41421v6c0 .5304.21071 1.0391.58579 1.4142.37507.3751.88378.5858 1.41421.5858h6c.53043 0 1.0391-.2107 1.4142-.5858s.5858-.8838.5858-1.4142v-6c0-.53043-.2107-1.03914-.5858-1.41421-.3751-.37508-.88377-.58579-1.4142-.58579zm-1 7v1h-5v-5h1v3.29l4.15-4.14.7.7-4.14 4.15zm7-4.69v5.38c-.0001.1482-.0442.2931-.1266.4163s-.1995.2193-.3365.276c-.1369.0567-.2876.0715-.433.0427-.1454-.0289-.279-.1002-.3839-.205l-1.72-1.72v-3l1.72-1.72c.1049-.10476.2385-.17608.3839-.20497.1454-.02888.2961-.01403.433.04268.137.05671.2541.15274.3365.27596.0824.12321.1265.26809.1266.41633z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 766 B

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.23 4.16c-.2276-.09696-.4791-.12306-.7217-.07489-.2426.04816-.465.16836-.6383.34489l-1.87 1.86v-1.54c-.0026-.46332-.1878-.90691-.5155-1.23454-.3276-.32762-.77118-.51283-1.2345-.51546h-6.5c-.46332.00263-.90691.18784-1.23454.51546-.32762.32763-.51283.77122-.51546 1.23454v6.5c.00263.4633.18784.9069.51546 1.2345.32763.3277.77122.5129 1.23454.5155h6.5c.46332-.0026.9069-.1878 1.2345-.5155.3277-.3276.5129-.7712.5155-1.2345v-1.54l1.87 1.86c.1146.1172.2515.2103.4026.2739.1512.0635.3135.0962.4774.0961.1652.0006.3288-.0334.48-.1.2289-.0923.4248-.2513.5621-.4564s.2098-.4468.2079-.6936v-5.38c.0019-.24681-.0706-.48848-.2079-.69357s-.3332-.36413-.5621-.45643zm-4.23 7.09c-.00259.1981-.08244.3874-.22253.5275-.1401.1401-.32936.2199-.52747.2225h-6.5c-.19811-.0026-.38737-.0824-.52747-.2225-.14009-.1401-.21994-.3294-.22253-.5275v-6.5c.00259-.19811.08244-.38737.22253-.52747.1401-.14009.32936-.21994.52747-.22253h6.5c.19811.00259.38737.08244.52747.22253.14009.1401.21994.32936.22253.52747zm4-.56c.0002.0488-.0139.0966-.0406.1374-.0266.0409-.0647.0731-.1094.0926-.0465.0198-.0977.0256-.1474.0167-.0498-.0089-.0958-.0321-.1326-.0667l-2.57-2.58v-.58l2.57-2.58c.0418-.02672.0904-.04091.14-.04091s.0982.01419.14.04091c.0447.01952.0828.05169.1094.09256.0267.04087.0408.08865.0406.13744zm-5-5.69v5h-1v-3.29l-4.15 4.14-.7-.7 4.14-4.15h-3.29v-1z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 3h-6c-.53043 0-1.03914.21071-1.41421.58579-.37508.37507-.58579.88378-.58579 1.41421v6c0 .5304.21071 1.0391.58579 1.4142.37507.3751.88378.5858 1.41421.5858h6c.53043 0 1.0391-.2107 1.4142-.5858s.5858-.8838.5858-1.4142v-6c0-.53043-.2107-1.03914-.5858-1.41421-.3751-.37508-.88377-.58579-1.4142-.58579zm0 7h-1v-3.29l-4.15 4.14-.7-.7 4.14-4.15h-3.29v-1h5zm6-4.69v5.38c-.0001.1482-.0442.2931-.1266.4163s-.1995.2193-.3365.276c-.1369.0567-.2876.0715-.433.0427-.1454-.0289-.279-.1002-.3839-.205l-1.72-1.72v-3l1.72-1.72c.1049-.10476.2385-.17608.3839-.20497.1454-.02888.2961-.01403.433.04268.137.05671.2541.15274.3365.27596.0824.12321.1265.26809.1266.41633z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 773 B

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.23 4.16c-.2276-.09696-.4791-.12306-.7217-.07489-.2426.04816-.465.16836-.6383.34489l-1.87 1.86v-1.54c-.0026-.46332-.1878-.90691-.5155-1.23454-.3276-.32762-.77118-.51283-1.2345-.51546h-6.5c-.46332.00263-.90691.18784-1.23454.51546-.32762.32763-.51283.77122-.51546 1.23454v6.5c.00263.4633.18784.9069.51546 1.2345.32763.3277.77122.5129 1.23454.5155h6.5c.46332-.0026.9069-.1878 1.2345-.5155.3277-.3276.5129-.7712.5155-1.2345v-1.54l1.87 1.86c.1146.1172.2515.2103.4026.2739.1512.0635.3135.0962.4774.0961.1652.0006.3288-.0334.48-.1.2289-.0923.4248-.2513.5621-.4564s.2098-.4468.2079-.6936v-5.38c.0019-.24681-.0706-.48848-.2079-.69357s-.3332-.36413-.5621-.45643zm-4.23 7.09c-.00259.1981-.08244.3874-.22253.5275-.1401.1401-.32936.2199-.52747.2225h-6.5c-.19811-.0026-.38737-.0824-.52747-.2225-.14009-.1401-.21994-.3294-.22253-.5275v-6.5c.00259-.19811.08244-.38737.22253-.52747.1401-.14009.32936-.21994.52747-.22253h6.5c.19811.00259.38737.08244.52747.22253.14009.1401.21994.32936.22253.52747zm4-.56c.0002.0488-.0139.0966-.0406.1374-.0266.0409-.0647.0731-.1094.0926-.0465.0198-.0977.0256-.1474.0167-.0498-.0089-.0958-.0321-.1326-.0667l-2.57-2.58v-.58l2.57-2.58c.0418-.02672.0904-.04091.14-.04091s.0982.01419.14.04091c.0447.01952.0828.05169.1094.09256.0267.04087.0408.08865.0406.13744zm-7.29-2.69 2.14 2.15-.7.7-2.15-2.14-2.15 2.14-.7-.7 2.14-2.15-2.14-2.15.7-.7 2.15 2.14 2.15-2.14.7.7z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 3h-6c-.53043 0-1.03914.21071-1.41421.58579-.37508.37507-.58579.88378-.58579 1.41421v6c0 .5304.21071 1.0391.58579 1.4142.37507.3751.88378.5858 1.41421.5858h6c.53043 0 1.0391-.2107 1.4142-.5858s.5858-.8838.5858-1.4142v-6c0-.53043-.2107-1.03914-.5858-1.41421-.3751-.37508-.88377-.58579-1.4142-.58579zm-.15 7.15-.7.7-2.15-2.14-2.15 2.14-.7-.7 2.14-2.15-2.14-2.15.7-.7 2.15 2.14 2.15-2.14.7.7-2.14 2.15zm6.15-4.84v5.38c-.0001.1482-.0442.2931-.1266.4163s-.1995.2193-.3365.276c-.1369.0567-.2876.0715-.433.0427-.1454-.0289-.279-.1002-.3839-.205l-1.72-1.72v-3l1.72-1.72c.1049-.10476.2385-.17608.3839-.20497.1454-.02888.2961-.01403.433.04268.137.05671.2541.15274.3365.27596.0824.12321.1265.26809.1266.41633z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 825 B

View File

@ -405,6 +405,7 @@ try {
window.ReactDOM = require('react-dom');
window.moment = require('moment');
window.PQueue = require('p-queue').default;
window.sharp = require('sharp');
const Signal = require('./js/modules/signal');
const i18n = require('./js/modules/i18n');

View File

@ -2074,22 +2074,6 @@ $timer-icons: '55', '50', '45', '40', '35', '30', '25', '20', '15', '10', '05',
// Module: Group Notification
.module-group-notification {
margin-left: 1em;
margin-right: 1em;
margin-top: 5px;
margin-bottom: 5px;
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-25;
}
}
.module-group-notification__change {
margin-top: 2px;
margin-bottom: 2px;
@ -2099,369 +2083,10 @@ $timer-icons: '55', '50', '45', '40', '35', '30', '25', '20', '15', '10', '05',
font-weight: bold;
}
// Module: Reset Session Notification
.module-reset-session-notification {
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-25;
}
}
// Module: Safety Number Notification
.module-safety-number-notification {
text-align: center;
}
.module-safety-number-notification__icon {
height: 24px;
width: 24px;
margin-left: auto;
margin-right: auto;
margin-bottom: 7px;
@include light-theme {
@include color-svg(
'../images/icons/v2/safety-number-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/safety-number-solid-24.svg',
$color-gray-25
);
}
}
.module-safety-number-notification__text {
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-25;
}
}
.module-safety-number-notification__contact {
font-weight: bold;
}
.module-safety-number-notification__button {
@include button-reset;
@include font-body-2-bold;
margin-top: 5px;
display: inline-block;
padding: 12px;
border-radius: 4px;
color: $color-ultramarine;
@include light-theme {
background-color: $color-gray-02;
}
@include keyboard-mode {
&:focus {
background-color: $color-gray-15;
}
}
@include dark-theme {
background-color: $color-gray-75;
}
@include dark-keyboard-mode {
&:focus {
background-color: $color-gray-60;
}
}
}
.module-message-calling--notification {
.module-message__metadata__date {
@include light-theme {
color: $color-gray-90;
}
@include dark-theme {
color: $color-gray-05;
}
}
&__button {
@include button-reset;
@include button-small;
@include button-green;
@include font-body-1-bold;
display: block;
margin: 0.5rem auto 0 auto;
}
}
.module-safety-number__bold-name {
font-weight: bold;
}
.module-message-calling {
&--audio {
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-05;
}
}
&--audio__icon {
height: 24px;
margin-bottom: 4px;
margin-left: auto;
margin-right: auto;
width: 24px;
@include light-theme {
@include color-svg(
'../images/icons/v2/phone-right-outline-24.svg',
$color-gray-75
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/phone-right-outline-24.svg',
$color-gray-15
);
}
}
&--video {
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-05;
}
}
&--video__icon {
height: 24px;
margin-bottom: 4px;
margin-left: auto;
margin-right: auto;
width: 24px;
@include light-theme {
@include color-svg(
'../images/icons/v2/video-outline-24.svg',
$color-gray-75
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/video-outline-24.svg',
$color-gray-15
);
}
}
}
.module-message-unsynced {
padding-bottom: 24px;
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-25;
}
}
.module-message-unsynced__icon {
height: 24px;
margin-bottom: 4px;
margin-left: auto;
margin-right: auto;
width: 24px;
@include light-theme {
@include color-svg(
'../images/icons/v2/info-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg('../images/icons/v2/info-solid-24.svg', $color-gray-25);
}
}
// Module: Verification Notification
.module-verification-notification {
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-25;
}
}
.module-verification-notification__contact {
font-weight: bold;
}
.module-verification-notification__icon--mark-verified {
height: 24px;
width: 24px;
margin-left: auto;
margin-right: auto;
margin-bottom: 4px;
@include light-theme {
@include color-svg('../images/icons/v2/check-24.svg', $color-gray-60);
}
@include dark-theme {
@include color-svg('../images/icons/v2/check-24.svg', $color-gray-25);
}
}
.module-verification-notification__icon--mark-not-verified {
height: 24px;
width: 24px;
margin-left: auto;
margin-right: auto;
margin-bottom: 7px;
@include light-theme {
@include color-svg(
'../images/icons/v2/safety-number-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/safety-number-solid-24.svg',
$color-gray-25
);
}
}
// Module: Timer Notification
// Module: Universal Timer Notification
.module-timer-notification,
.module-universal-timer-notification {
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-05;
}
&__icon-container {
margin-left: auto;
margin-right: auto;
display: inline-flex;
flex-direction: row;
align-items: center;
margin-bottom: 8px;
}
&__icon {
height: 20px;
width: 20px;
display: inline-block;
opacity: 0.6;
@include light-theme {
@include color-svg(
'../images/icons/v2/timer-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/timer-solid-16.svg',
$color-gray-05
);
}
&--disabled {
@include light-theme {
@include color-svg(
'../images/icons/v2/timer-disabled-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/timer-disabled-solid-16.svg',
$color-gray-05
);
}
}
}
&__icon-label {
margin-left: 4px;
// Didn't seem centered otherwise
margin-top: 1px;
opacity: 0.8;
}
}
// Module: Change Number Notification
.module-change-number-notification {
@include font-body-2;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-05;
}
&__icon {
height: 16px;
width: 16px;
display: inline-block;
margin-right: 8px;
@include light-theme {
@include color-svg(
'../images/icons/v2/phone-right-outline-24.svg',
$color-gray-75
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/phone-right-solid-24.svg',
$color-gray-15
);
}
}
}
// Module: Error Boundary
.module-error-boundary-notification {
@ -8202,85 +7827,6 @@ button.module-image__border-overlay:focus {
@include emoji-size(66px);
}
// Module: Unsupported Message
.module-unsupported-message {
text-align: center;
}
.module-unsupported-message__icon {
height: 24px;
width: 24px;
margin-left: auto;
margin-right: auto;
margin-bottom: 7px;
@include light-theme {
@include color-svg(
'../images/icons/v2/error-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg('../images/icons/v2/error-solid-24.svg', $color-gray-25);
}
}
.module-unsupported-message__icon--can-process {
@include light-theme {
@include color-svg(
'../images/icons/v2/check-circle-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/check-circle-solid-24.svg',
$color-gray-25
);
}
}
.module-unsupported-message__text {
max-width: 396px;
margin-left: auto;
margin-right: auto;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-25;
}
}
.module-unsupported-message__contact {
font-weight: bold;
}
.module-unsupported-message__button {
@include button-reset;
margin-top: 5px;
display: inline-block;
@include font-body-1-bold;
padding: 12px;
border-radius: 4px;
@include light-theme {
color: $color-ultramarine;
background-color: $color-gray-02;
}
@include dark-theme {
color: $color-ultramarine-light;
background-color: $color-gray-75;
}
}
// Module: Countdown
.module-countdown {
@ -8952,45 +8498,6 @@ button.module-image__border-overlay:focus {
padding-right: 0px;
}
// Module: Profile Change Notification
.module-profile-change-notification {
@include font-body-1;
margin-left: 2em;
margin-right: 2em;
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-05;
}
}
.module-profile-change-notification--icon {
@include light-theme {
@include color-svg(
'../images/icons/v2/profile-outline-20.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/profile-outline-20.svg',
$color-gray-05
);
}
height: 20px;
width: 20px;
margin-left: auto;
margin-right: auto;
}
/* Calling: Device Selection */
.module-calling-device-selection {
@ -9066,105 +8573,6 @@ button.module-image__border-overlay:focus {
}
}
// Module: GroupV2 Change
.module-group-v2-change {
@include font-body-1;
margin-left: 2em;
margin-right: 2em;
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-05;
}
}
.module-group-v2-change--icon {
@include light-theme {
@include color-svg(
'../images/icons/v2/group-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/group-outline-24.svg',
$color-gray-05
);
}
height: 20px;
width: 20px;
margin-left: auto;
margin-right: auto;
}
.module-group-v2-change--button-container {
margin-top: 10px;
}
// Module: GV1 Migration
.module-group-v1-migration {
@include font-body-1;
margin-left: 2em;
margin-right: 2em;
text-align: center;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-05;
}
}
.module-group-v1-migration--icon {
@include light-theme {
@include color-svg(
'../images/icons/v2/group-outline-24.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/group-outline-24.svg',
$color-gray-05
);
}
height: 20px;
width: 20px;
margin-left: auto;
margin-right: auto;
}
.module-group-v1-migration--text {
margin-top: 8px;
margin-bottom: 8px;
}
.module-group-v1-migration--button {
@include button-reset;
@include font-body-2-bold;
border-radius: 4px;
padding: 8px;
padding-left: 40px;
padding-right: 40px;
@include button-light-blue-text;
}
// Module: GroupV1 Disabled Actions
.module-group-v1-disabled-actions {
@ -9765,99 +9173,6 @@ $contact-modal-padding: 18px;
}
}
// Module: Chat Session Refreshed Notification
.module-chat-session-refreshed-notification {
@include font-body-2;
display: flex;
flex-direction: column;
align-items: center;
}
.module-chat-session-refreshed-notification__first-line {
margin-bottom: 12px;
display: flex;
flex-direction: row;
align-items: center;
margin-left: auto;
margin-right: auto;
}
.module-chat-session-refreshed-notification__icon {
height: 16px;
width: 16px;
display: inline-block;
margin-right: 8px;
@include light-theme {
@include color-svg('../images/icons/v2/refresh-16.svg', $color-gray-60);
}
@include dark-theme {
@include color-svg('../images/icons/v2/refresh-16.svg', $color-gray-25);
}
}
.module-chat-session-refreshed-notification__button {
@include button-reset;
@include button-light-blue-text;
@include button-small;
@include font-body-2;
padding: 5px 12px;
}
// Module: Delivery Issue Notification
.module-delivery-issue-notification {
@include font-body-2;
display: flex;
flex-direction: column;
align-items: center;
}
.module-delivery-issue-notification__first-line {
margin-bottom: 12px;
display: flex;
flex-direction: row;
align-items: center;
margin-left: auto;
margin-right: auto;
@include light-theme {
color: $color-gray-60;
}
@include dark-theme {
color: $color-gray-25;
}
}
.module-delivery-issue-notification__icon {
height: 14px;
width: 14px;
display: inline-block;
margin-right: 8px;
@include light-theme {
@include color-svg(
'../images/icons/v2/error-outline-12.svg',
$color-gray-60
);
}
@include dark-theme {
@include color-svg(
'../images/icons/v2/error-outline-12.svg',
$color-gray-25
);
}
}
.module-delivery-issue-notification__button {
@include button-reset;
@include button-light-blue-text;
@include button-small;
@include font-body-2;
padding: 5px 12px;
}
// Module: Chat Session Refreshed Dialog
.module-chat-session-refreshed-dialog {

View File

@ -156,4 +156,36 @@
@include hover-and-active-states($background-color, $color-white);
}
}
&--system-message {
@include rounded-corners;
@include light-theme {
$color: $color-ultramarine;
$background-color: $color-gray-02;
color: $color;
background: $background-color;
&:disabled {
color: fade-out($color, 0.4);
background: fade-out($background-color, 0.6);
}
@include hover-and-active-states($background-color, $color-black);
}
@include dark-theme {
$color: $color-white;
$background-color: $color-gray-65;
color: $color;
background: $background-color;
&:disabled {
color: fade-out($color, 0.4);
background: fade-out($background-color, 0.6);
}
@include hover-and-active-states($background-color, $color-white);
}
}
}

View File

@ -0,0 +1,277 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
@mixin system-message-icon($light, $dark) {
@include light-theme {
-webkit-mask: url($light) no-repeat center;
-webkit-mask-size: 100%;
}
@include dark-theme {
-webkit-mask: url($dark) no-repeat center;
-webkit-mask-size: 100%;
}
}
.SystemMessage {
@include font-body-2;
align-items: center;
display: flex;
flex-direction: row;
justify-content: center;
text-align: center;
@include light-theme {
color: $color-black;
}
@include dark-theme {
color: $color-gray-25;
}
&--multiline {
flex-direction: column;
}
&__line {
align-items: center;
display: flex;
&:not(:first-child) {
margin-top: 12px;
}
}
&__text {
max-width: 400px;
}
&__icon {
height: 16px;
flex: 0 0 16px;
margin-right: 8px;
width: 16px;
vertical-align: middle;
@include light-theme {
background-color: $color-black;
}
@include dark-theme {
background-color: $color-gray-25;
}
&--audio-incoming {
@include system-message-icon(
'../images/icons/v2/phone-incoming-16.svg',
'../images/icons/v2/phone-incoming-solid-16.svg'
);
}
&--audio-missed {
@include system-message-icon(
'../images/icons/v2/phone-x-16.svg',
'../images/icons/v2/phone-x-solid-16.svg'
);
}
&--audio-outgoing {
@include system-message-icon(
'../images/icons/v2/phone-outgoing-16.svg',
'../images/icons/v2/phone-outgoing-solid-16.svg'
);
}
&--group {
@include system-message-icon(
'../images/icons/v2/group-outline-24.svg',
'../images/icons/v2/group-solid-24.svg'
);
}
&--group-access {
@include system-message-icon(
'../images/icons/v2/megaphone-16.svg',
'../images/icons/v2/megaphone-solid-16.svg'
);
}
&--group-add {
@include system-message-icon(
'../images/icons/v2/member-added-16.svg',
'../images/icons/v2/member-added-solid-16.svg'
);
}
&--group-approved {
@include system-message-icon(
'../images/icons/v2/member-accepted-16.svg',
'../images/icons/v2/member-accepted-solid-16.svg'
);
}
&--group-avatar {
@include system-message-icon(
'../images/icons/v2/photo-16.svg',
'../images/icons/v2/photo-solid-16.svg'
);
}
&--group-decline {
@include system-message-icon(
'../images/icons/v2/member-declined-16.svg',
'../images/icons/v2/member-declined-solid-16.svg'
);
}
&--group-edit {
@include system-message-icon(
'../images/icons/v2/edit-16.svg',
'../images/icons/v2/edit-solid-16.svg'
);
}
&--group-leave {
@include system-message-icon(
'../images/icons/v2/leave-16.svg',
'../images/icons/v2/leave-solid-16.svg'
);
}
&--group-remove {
@include system-message-icon(
'../images/icons/v2/member-remove-16.svg',
'../images/icons/v2/member-remove-solid-16.svg'
);
}
&--info {
@include system-message-icon(
'../images/icons/v2/info-16.svg',
'../images/icons/v2/info-solid-24.svg'
);
}
&--phone {
@include system-message-icon(
'../images/icons/v2/phone-right-outline-24.svg',
'../images/icons/v2/phone-right-solid-24.svg'
);
}
&--profile {
@include system-message-icon(
'../images/icons/v2/profile-outline-20.svg',
'../images/icons/v2/profile-outline-20.svg'
);
}
&--safety-number {
@include system-message-icon(
'../images/icons/v2/safety-number-outline-24.svg',
'../images/icons/v2/safety-number-solid-24.svg'
);
}
&--session-refresh {
@include system-message-icon(
'../images/icons/v2/refresh-16.svg',
'../images/icons/v2/refresh-16.svg'
);
}
&--timer {
@include system-message-icon(
'../images/icons/v2/timer-outline-24.svg',
'../images/icons/v2/timer-solid-16.svg'
);
}
&--timer-disabled {
@include system-message-icon(
'../images/icons/v2/timer-disabled-outline-24.svg',
'../images/icons/v2/timer-disabled-solid-16.svg'
);
}
&--unsupported {
@include system-message-icon(
'../images/icons/v2/error-outline-24.svg',
'../images/icons/v2/error-solid-24.svg'
);
&--can-process {
@include system-message-icon(
'../images/icons/v2/check-circle-outline-24.svg',
'../images/icons/v2/check-circle-solid-24.svg'
);
}
}
&--unsynced {
@include system-message-icon(
'../images/icons/v2/info-outline-24.svg',
'../images/icons/v2/info-solid-24.svg'
);
}
&--verified {
@include system-message-icon(
'../images/icons/v2/check-24.svg',
'../images/icons/v2/check-24.svg'
);
}
&--verified-not {
@include system-message-icon(
'../images/icons/v2/safety-number-outline-24.svg',
'../images/icons/v2/safety-number-solid-24.svg'
);
}
&--video {
@include system-message-icon(
'../images/icons/v2/video-outline-24.svg',
'../images/icons/v2/video-outline-24.svg'
);
}
&--video-incoming {
@include system-message-icon(
'../images/icons/v2/video-incoming-16.svg',
'../images/icons/v2/video-incoming-solid-16.svg'
);
}
&--video-missed {
@include system-message-icon(
'../images/icons/v2/video-x-16.svg',
'../images/icons/v2/video-x-solid-16.svg'
);
}
&--video-outgoing {
@include system-message-icon(
'../images/icons/v2/video-outgoing-16.svg',
'../images/icons/v2/video-outgoing-solid-16.svg'
);
}
&--warning {
@include system-message-icon(
'../images/icons/v2/error-outline-12.svg',
'../images/icons/v2/error-outline-12.svg'
);
}
}
&--error {
color: $color-accent-red;
.SystemMessage__icon {
background: $color-accent-red;
}
}
img.emoji {
// The negative bottom margin offset doesn't play well with align-items center
margin-bottom: 0;
}
}

View File

@ -76,6 +76,7 @@
@import './components/SearchResultsLoadingFakeRow.scss';
@import './components/Select.scss';
@import './components/Slider.scss';
@import './components/SystemMessage.scss';
@import './components/Tabs.scss';
@import './components/TimelineWarning.scss';
@import './components/TimelineWarnings.scss';

View File

@ -11,20 +11,21 @@ const story = storiesOf('Components/Button', module);
story.add('Kitchen sink', () => (
<>
{[ButtonSize.Medium, ButtonSize.Small].map(size => (
<React.Fragment key={size}>
{[
ButtonVariant.Primary,
ButtonVariant.Secondary,
ButtonVariant.SecondaryAffirmative,
ButtonVariant.SecondaryDestructive,
ButtonVariant.Destructive,
ButtonVariant.Calling,
].map(variant => (
<React.Fragment key={variant}>
{[
ButtonVariant.Primary,
ButtonVariant.Secondary,
ButtonVariant.SecondaryAffirmative,
ButtonVariant.SecondaryDestructive,
ButtonVariant.Destructive,
ButtonVariant.Calling,
ButtonVariant.SystemMessage,
].map(variant => (
<React.Fragment key={variant}>
{[ButtonSize.Medium, ButtonSize.Small].map(size => (
<React.Fragment key={size}>
<p>
<Button onClick={action('onClick')} size={size} variant={variant}>
Hello world
{variant}
</Button>
</p>
<p>
@ -34,7 +35,7 @@ story.add('Kitchen sink', () => (
size={size}
variant={variant}
>
Hello world
{variant}
</Button>
</p>
</React.Fragment>

View File

@ -12,12 +12,13 @@ export enum ButtonSize {
}
export enum ButtonVariant {
Primary,
Secondary,
SecondaryAffirmative,
SecondaryDestructive,
Destructive,
Calling,
Primary = 'Primary',
Secondary = 'Secondary',
SecondaryAffirmative = 'SecondaryAffirmative',
SecondaryDestructive = 'SecondaryDestructive',
Destructive = 'Destructive',
Calling = 'Calling',
SystemMessage = 'SystemMessage',
}
type PropsType = {
@ -68,6 +69,7 @@ const VARIANT_CLASS_NAMES = new Map<ButtonVariant, string>([
],
[ButtonVariant.Destructive, 'module-Button--destructive'],
[ButtonVariant.Calling, 'module-Button--calling'],
[ButtonVariant.SystemMessage, 'module-Button--system-message'],
]);
export const Button = React.forwardRef<HTMLButtonElement, PropsType>(

View File

@ -2,13 +2,17 @@
// SPDX-License-Identifier: AGPL-3.0-only
import React, { useState, useEffect } from 'react';
import classNames from 'classnames';
import Measure from 'react-measure';
import { noop } from 'lodash';
import { Button, ButtonSize, ButtonVariant } from '../Button';
import { Timestamp } from './Timestamp';
import { LocalizerType } from '../../types/Util';
import { CallMode } from '../../types/Calling';
import {
CallingNotificationType,
getCallingIcon,
getCallingNotificationText,
} from '../../util/callingNotification';
import { usePrevious } from '../../util/hooks';
@ -48,16 +52,18 @@ export const CallingNotification: React.FC<PropsType> = React.memo(props => {
}
}, [height, previousHeight, conversationId, messageId, messageSizeChanged]);
let hasButton = false;
let timestamp: number;
let callType: 'audio' | 'video';
let wasMissed = false;
switch (props.callMode) {
case CallMode.Direct:
timestamp = props.acceptedTime || props.endedTime;
callType = props.wasVideoCall ? 'video' : 'audio';
wasMissed =
props.wasIncoming && !props.acceptedTime && !props.wasDeclined;
break;
case CallMode.Group:
hasButton = !props.ended;
timestamp = props.startedTime;
callType = 'video';
break;
default:
window.log.error(
@ -66,6 +72,8 @@ export const CallingNotification: React.FC<PropsType> = React.memo(props => {
return null;
}
const icon = getCallingIcon(props);
return (
<Measure
bounds
@ -79,24 +87,33 @@ export const CallingNotification: React.FC<PropsType> = React.memo(props => {
>
{({ measureRef }) => (
<div
className={`module-message-calling--notification module-message-calling--${callType}`}
className={classNames('SystemMessage', 'SystemMessage--multiline', {
'SystemMessage--error': wasMissed,
})}
ref={measureRef}
>
<div className={`module-message-calling--${callType}__icon`} />
{getCallingNotificationText(props, i18n)}
<div>
<Timestamp
i18n={i18n}
timestamp={timestamp}
extended
direction="outgoing"
withImageNoCaption={false}
withSticker={false}
withTapToViewExpired={false}
module="module-message__metadata__date"
<div className="SystemMessage__line">
<div
className={`SystemMessage__icon SystemMessage__icon--${icon}`}
/>
<div>
{getCallingNotificationText(props, i18n)} &middot;{' '}
<Timestamp
direction="outgoing"
extended
i18n={i18n}
timestamp={timestamp}
withImageNoCaption={false}
withSticker={false}
withTapToViewExpired={false}
/>
</div>
</div>
<CallingNotificationButton {...props} />
{hasButton ? (
<div className="SystemMessage__line">
<CallingNotificationButton {...props} />
</div>
) : null}
</div>
)}
</Measure>
@ -120,7 +137,7 @@ function CallingNotificationButton(props: PropsType) {
let buttonText: string;
let disabledTooltipText: undefined | string;
let onClick: undefined | (() => void);
let onClick: () => void;
if (activeCallConversationId) {
if (activeCallConversationId === conversationId) {
buttonText = i18n('calling__return');
@ -130,6 +147,7 @@ function CallingNotificationButton(props: PropsType) {
disabledTooltipText = i18n(
'calling__call-notification__button__in-another-call-tooltip'
);
onClick = noop;
}
} else if (deviceCount >= maxDevices) {
buttonText = i18n('calling__call-is-full');
@ -137,6 +155,7 @@ function CallingNotificationButton(props: PropsType) {
'calling__call-notification__button__call-full-tooltip',
[String(deviceCount)]
);
onClick = noop;
} else {
buttonText = i18n('calling__join');
onClick = () => {
@ -145,14 +164,14 @@ function CallingNotificationButton(props: PropsType) {
}
const button = (
<button
className="module-message-calling--notification__button"
<Button
disabled={Boolean(disabledTooltipText)}
onClick={onClick}
type="button"
size={ButtonSize.Small}
variant={ButtonVariant.SystemMessage}
>
{buttonText}
</button>
</Button>
);
if (disabledTooltipText) {

View File

@ -21,14 +21,12 @@ export type PropsHousekeeping = {
export type Props = PropsData & PropsHousekeeping;
const CSS_MODULE = 'module-change-number-notification';
export const ChangeNumberNotification: React.FC<Props> = props => {
const { i18n, sender, timestamp } = props;
return (
<div className={CSS_MODULE}>
<span className={`${CSS_MODULE}__icon`} />
<div className="SystemMessage">
<span className="SystemMessage__icon SystemMessage__icon--phone" />
<Intl
id="ChangeNumber--notification"
components={{

View File

@ -5,6 +5,7 @@ import React, { useCallback, useState, ReactElement } from 'react';
import { LocalizerType } from '../../types/Util';
import { Button, ButtonSize, ButtonVariant } from '../Button';
import { ChatSessionRefreshedDialog } from './ChatSessionRefreshedDialog';
type PropsHousekeepingType = {
@ -36,18 +37,20 @@ export function ChatSessionRefreshedNotification(
}, [contactSupport, setIsDialogOpen]);
return (
<div className="module-chat-session-refreshed-notification">
<div className="module-chat-session-refreshed-notification__first-line">
<span className="module-chat-session-refreshed-notification__icon" />
<div className="SystemMessage SystemMessage--multiline">
<div className="SystemMessage__line">
<span className="SystemMessage__icon SystemMessage__icon--session-refresh" />
{i18n('ChatRefresh--notification')}
</div>
<button
type="button"
onClick={openDialog}
className="module-chat-session-refreshed-notification__button"
>
{i18n('ChatRefresh--learnMore')}
</button>
<div className="SystemMessage__line">
<Button
onClick={openDialog}
size={ButtonSize.Small}
variant={ButtonVariant.SystemMessage}
>
{i18n('ChatRefresh--learnMore')}
</Button>
</div>
{isDialogOpen ? (
<ChatSessionRefreshedDialog
onClose={closeDialog}

View File

@ -3,6 +3,7 @@
import React, { useCallback, useState, ReactElement } from 'react';
import { Button, ButtonSize, ButtonVariant } from '../Button';
import { ConversationType } from '../../state/ducks/conversations';
import { LocalizerType } from '../../types/Util';
import { Intl } from '../Intl';
@ -45,9 +46,9 @@ export function DeliveryIssueNotification(
}
return (
<div className="module-delivery-issue-notification">
<div className="module-delivery-issue-notification__first-line">
<span className="module-delivery-issue-notification__icon" />
<div className="SystemMessage SystemMessage--multiline">
<div className="SystemMessage__line">
<span className="SystemMessage__icon SystemMessage__icon--info" />
<Intl
id="DeliveryIssue--notification"
components={{
@ -56,13 +57,15 @@ export function DeliveryIssueNotification(
i18n={i18n}
/>
</div>
<button
type="button"
onClick={openDialog}
className="module-delivery-issue-notification__button"
>
{i18n('DeliveryIssue--learnMore')}
</button>
<div className="SystemMessage__line">
<Button
onClick={openDialog}
size={ButtonSize.Small}
variant={ButtonVariant.SystemMessage}
>
{i18n('DeliveryIssue--learnMore')}
</Button>
</div>
{isDialogOpen ? (
<DeliveryIssueDialog
i18n={i18n}

View File

@ -157,19 +157,21 @@ export class GroupNotification extends React.Component<Props> {
);
return (
<div className="module-group-notification">
{isLeftOnly ? null : (
<>
{fromLabel}
<br />
</>
)}
{(changes || []).map((change, i) => (
// eslint-disable-next-line react/no-array-index-key
<div key={i} className="module-group-notification__change">
{this.renderChange(change, from)}
</div>
))}
<div className="SystemMessage">
<div>
{isLeftOnly ? null : (
<>
{fromLabel}
<br />
</>
)}
{(changes || []).map((change, i) => (
// eslint-disable-next-line react/no-array-index-key
<div key={i} className="module-group-notification__change">
{this.renderChange(change, from)}
</div>
))}
</div>
</div>
);
}

View File

@ -3,6 +3,7 @@
import * as React from 'react';
import { Button, ButtonSize, ButtonVariant } from '../Button';
import { LocalizerType } from '../../types/Util';
import { ConversationType } from '../../state/ducks/conversations';
import { Intl } from '../Intl';
@ -34,28 +35,40 @@ export function GroupV1Migration(props: PropsType): React.ReactElement {
}, [setShowingDialog]);
return (
<div className="module-group-v1-migration">
<div className="module-group-v1-migration--icon" />
<div className="module-group-v1-migration--text">
{i18n('GroupV1--Migration--was-upgraded')}
</div>
{areWeInvited ? (
<div className="module-group-v1-migration--text">
{i18n('GroupV1--Migration--invited--you')}
<div className="SystemMessage SystemMessage--multiline">
<div className="SystemMessage__line">
<div className="SystemMessage__icon SystemMessage__icon--group" />
<div>
<div>{i18n('GroupV1--Migration--was-upgraded')}</div>
<div>
{areWeInvited ? (
i18n('GroupV1--Migration--invited--you')
) : (
<>
{renderUsers(
invitedMembers,
i18n,
'GroupV1--Migration--invited'
)}
{renderUsers(
droppedMembers,
i18n,
'GroupV1--Migration--removed'
)}
</>
)}
</div>
</div>
) : (
<>
{renderUsers(invitedMembers, i18n, 'GroupV1--Migration--invited')}
{renderUsers(droppedMembers, i18n, 'GroupV1--Migration--removed')}
</>
)}
<button
type="button"
className="module-group-v1-migration--button"
onClick={showDialog}
>
{i18n('GroupV1--Migration--learn-more')}
</button>
</div>
<div className="SystemMessage__line">
<Button
onClick={showDialog}
size={ButtonSize.Small}
variant={ButtonVariant.SystemMessage}
>
{i18n('GroupV1--Migration--learn-more')}
</Button>
</div>
{showingDialog ? (
<GroupV1MigrationDialog
areWeInvited={areWeInvited}

View File

@ -55,10 +55,19 @@ storiesOf('Components/Conversation/GroupV2Change', module)
type: 'avatar',
removed: false,
},
{
type: 'description',
description:
'This is a long description.\n\nWe need a dialog to view it all!\n\nIt has a link to https://example.com',
},
{
type: 'member-add',
conversationId: OUR_ID,
},
{
type: 'description',
description: 'Another description',
},
{
type: 'member-privilege',
conversationId: OUR_ID,

View File

@ -2,6 +2,8 @@
// SPDX-License-Identifier: AGPL-3.0-only
import React, { ReactElement, useState } from 'react';
import classNames from 'classnames';
import { get } from 'lodash';
import { ReplacementValuesType } from '../../types/I18N';
import { FullJSXType, Intl } from '../Intl';
@ -9,7 +11,7 @@ import { LocalizerType } from '../../types/Util';
import { GroupDescriptionText } from '../GroupDescriptionText';
import { Button, ButtonSize, ButtonVariant } from '../Button';
import { GroupV2ChangeType, GroupV2DescriptionChangeType } from '../../groups';
import { GroupV2ChangeType, GroupV2ChangeDetailType } from '../../groups';
import { renderChange, SmartContactRendererType } from '../../groupChange';
import { Modal } from '../Modal';
@ -35,53 +37,141 @@ function renderStringToIntl(
return <Intl id={id} i18n={i18n} components={components} />;
}
export function GroupV2Change(props: PropsType): ReactElement {
const { change, groupName, i18n, ourConversationId, renderContact } = props;
type GroupIconType =
| 'group'
| 'group-access'
| 'group-add'
| 'group-approved'
| 'group-avatar'
| 'group-decline'
| 'group-edit'
| 'group-leave'
| 'group-remove';
const [
isGroupDescriptionDialogOpen,
setIsGroupDescriptionDialogOpen,
] = useState<boolean>(false);
const changeToIconMap = new Map<string, GroupIconType>([
['access-attributes', 'group-access'],
['access-invite-link', 'group-access'],
['access-members', 'group-access'],
['admin-approval-add-one', 'group-add'],
['admin-approval-remove-one', 'group-decline'],
['announcements-only', 'group-access'],
['avatar', 'group-avatar'],
['description', 'group-edit'],
['group-link-add', 'group-access'],
['group-link-remove', 'group-access'],
['group-link-reset', 'group-access'],
['member-add', 'group-add'],
['member-add-from-admin-approval', 'group-approved'],
['member-add-from-invite', 'group-add'],
['member-add-from-link', 'group-add'],
['member-privilege', 'group-access'],
['member-remove', 'group-remove'],
['pending-add-many', 'group-add'],
['pending-add-one', 'group-add'],
['pending-remove-many', 'group-decline'],
['pending-remove-one', 'group-decline'],
['title', 'group-edit'],
]);
const newGroupDescription = change.details.find(
(item): item is GroupV2DescriptionChangeType =>
Boolean(item.type === 'description' && item.description)
)?.description;
function getIcon(
detail: GroupV2ChangeDetailType,
fromId?: string
): GroupIconType {
const changeType = detail.type;
let possibleIcon = changeToIconMap.get(changeType);
const isSameId = fromId === get(detail, 'conversationId', null);
if (isSameId) {
if (changeType === 'member-remove') {
possibleIcon = 'group-leave';
}
if (changeType === 'member-add-from-invite') {
possibleIcon = 'group-approved';
}
}
return possibleIcon || 'group';
}
function GroupV2Detail({
detail,
i18n,
fromId,
onButtonClick,
text,
}: {
detail: GroupV2ChangeDetailType;
i18n: LocalizerType;
fromId?: string;
onButtonClick: (x: string) => unknown;
text: FullJSXType;
}): JSX.Element {
const icon = getIcon(detail, fromId);
const newGroupDescription =
detail.type === 'description' && get(detail, 'description');
return (
<div className="module-group-v2-change">
<div className="module-group-v2-change--icon" />
{renderChange(change, {
i18n,
ourConversationId,
renderContact,
renderString: renderStringToIntl,
}).map((item: FullJSXType, index: number) => (
// Difficult to find a unique key for this type
// eslint-disable-next-line react/no-array-index-key
<div key={index}>{item}</div>
))}
<div
className={classNames('SystemMessage', {
'SystemMessage--multiline': Boolean(newGroupDescription),
})}
>
<div className="SystemMessage__line">
<div className={`SystemMessage__icon SystemMessage__icon--${icon}`} />
<div className="SystemMessage__text">{text}</div>
</div>
{newGroupDescription ? (
<div className="module-group-v2-change--button-container">
<div className="SystemMessage__line">
<Button
onClick={() => onButtonClick(newGroupDescription)}
size={ButtonSize.Small}
variant={ButtonVariant.SecondaryAffirmative}
onClick={() => setIsGroupDescriptionDialogOpen(true)}
variant={ButtonVariant.SystemMessage}
>
{i18n('view')}
</Button>
</div>
) : null}
{newGroupDescription && isGroupDescriptionDialogOpen ? (
</div>
);
}
export function GroupV2Change(props: PropsType): ReactElement {
const { change, groupName, i18n, ourConversationId, renderContact } = props;
const [groupDescription, setGroupDescription] = useState<
string | undefined
>();
return (
<>
{renderChange(change, {
i18n,
ourConversationId,
renderContact,
renderString: renderStringToIntl,
}).map((text: FullJSXType, index: number) => (
<GroupV2Detail
detail={change.details[index]}
fromId={change.from}
i18n={i18n}
// Difficult to find a unique key for this type
// eslint-disable-next-line react/no-array-index-key
key={index}
onButtonClick={nextGroupDescription =>
setGroupDescription(nextGroupDescription)
}
text={text}
/>
))}
{groupDescription ? (
<Modal
hasXButton
i18n={i18n}
title={groupName}
onClose={() => setIsGroupDescriptionDialogOpen(false)}
onClose={() => setGroupDescription(undefined)}
>
<GroupDescriptionText text={newGroupDescription} />
<GroupDescriptionText text={groupDescription} />
</Modal>
) : null}
</div>
</>
);
}

View File

@ -22,8 +22,8 @@ export function ProfileChangeNotification(props: PropsType): JSX.Element {
const message = getStringForProfileChange(change, changedContact, i18n);
return (
<div className="module-profile-change-notification">
<div className="module-profile-change-notification--icon" />
<div className="SystemMessage">
<div className="SystemMessage__icon SystemMessage__icon--profile" />
<Emojify text={message} />
</div>
);

View File

@ -10,7 +10,5 @@ export type Props = {
};
export const ResetSessionNotification = ({ i18n }: Props): JSX.Element => (
<div className="module-reset-session-notification">
{i18n('sessionEnded')}
</div>
<div className="SystemMessage">{i18n('sessionEnded')}</div>
);

View File

@ -3,6 +3,7 @@
import React from 'react';
import { Button, ButtonSize, ButtonVariant } from '../Button';
import { ContactName } from './ContactName';
import { Intl } from '../Intl';
import { LocalizerType } from '../../types/Util';
@ -41,38 +42,42 @@ export const SafetyNumberNotification = ({
: 'safetyNumberChanged';
return (
<div className="module-safety-number-notification">
<div className="module-safety-number-notification__icon" />
<div className="module-safety-number-notification__text">
<Intl
id={changeKey}
components={[
<span
key="external-1"
className="module-safety-number-notification__contact"
>
<ContactName
name={contact.name}
profileName={contact.profileName}
phoneNumber={contact.phoneNumber}
title={contact.title}
module="module-safety-number-notification__contact"
i18n={i18n}
/>
</span>,
]}
i18n={i18n}
/>
<div className="SystemMessage SystemMessage--multiline">
<div className="SystemMessage__line">
<div className="SystemMessage__icon SystemMessage__icon--safety-number" />
<span>
<Intl
id={changeKey}
components={[
<span
key="external-1"
className="module-safety-number-notification__contact"
>
<ContactName
name={contact.name}
profileName={contact.profileName}
phoneNumber={contact.phoneNumber}
title={contact.title}
module="module-safety-number-notification__contact"
i18n={i18n}
/>
</span>,
]}
i18n={i18n}
/>
</span>
</div>
<div className="SystemMessage__line">
<Button
onClick={() => {
showIdentity(contact.id);
}}
size={ButtonSize.Small}
variant={ButtonVariant.SystemMessage}
>
{i18n('verifyNewNumber')}
</Button>
</div>
<button
type="button"
onClick={() => {
showIdentity(contact.id);
}}
className="module-safety-number-notification__button"
>
{i18n('verifyNewNumber')}
</button>
</div>
);
};

View File

@ -118,19 +118,26 @@ storiesOf('Components/Conversation/TimelineItem', module)
type: 'fromOther',
},
},
{
type: 'universalTimerNotification',
data: null,
},
{
type: 'chatSessionRefreshed',
},
{
type: 'safetyNumberNotification',
data: {
isGroup: false,
contact: getDefaultConversation(),
},
},
{
type: 'deliveryIssue',
data: {
sender: getDefaultConversation(),
},
},
{
type: 'universalTimerNotification',
data: null,
},
{
type: 'changeNumberNotification',
data: {
@ -255,7 +262,7 @@ storiesOf('Components/Conversation/TimelineItem', module)
{
type: 'callHistory',
data: {
// missed (neither accepted nor declined) outgoing audio
// unanswered (neither accepted nor declined) outgoing audio
callMode: CallMode.Direct,
wasDeclined: false,
wasIncoming: false,
@ -266,7 +273,7 @@ storiesOf('Components/Conversation/TimelineItem', module)
{
type: 'callHistory',
data: {
// missed (neither accepted nor declined) outgoing video
// unanswered (neither accepted nor declined) outgoing video
callMode: CallMode.Direct,
wasDeclined: false,
wasIncoming: false,
@ -390,6 +397,71 @@ storiesOf('Components/Conversation/TimelineItem', module)
startedTime: Date.now(),
},
},
{
type: 'linkNotification',
data: null,
},
{
type: 'profileChange',
data: {
change: {
type: 'name',
oldName: 'Fred',
newName: 'John',
},
changedContact: getDefaultConversation(),
},
},
{
type: 'resetSessionNotification',
data: null,
},
{
type: 'unsupportedMessage',
data: {
canProcessNow: true,
contact: getDefaultConversation(),
},
},
{
type: 'unsupportedMessage',
data: {
canProcessNow: false,
contact: getDefaultConversation(),
},
},
{
type: 'verificationNotification',
data: {
type: 'markVerified',
isLocal: false,
contact: getDefaultConversation(),
},
},
{
type: 'verificationNotification',
data: {
type: 'markVerified',
isLocal: true,
contact: getDefaultConversation(),
},
},
{
type: 'verificationNotification',
data: {
type: 'markNotVerified',
isLocal: false,
contact: getDefaultConversation(),
},
},
{
type: 'verificationNotification',
data: {
type: 'markNotVerified',
isLocal: true,
contact: getDefaultConversation(),
},
},
];
return (

View File

@ -246,8 +246,8 @@ export class TimelineItem extends React.PureComponent<PropsType> {
);
} else if (item.type === 'linkNotification') {
notification = (
<div className="module-message-unsynced">
<div className="module-message-unsynced__icon" />
<div className="SystemMessage">
<div className="SystemMessage__icon SystemMessage__icon--unsynced" />
{i18n('messageHistoryUnsynced')}
</div>
);

View File

@ -95,17 +95,15 @@ export const TimerNotification: FunctionComponent<Props> = props => {
}
return (
<div className="module-timer-notification">
<div className="module-timer-notification__icon-container">
<div
className={classNames(
'module-timer-notification__icon',
disabled ? 'module-timer-notification__icon--disabled' : null
)}
/>
<div className="module-timer-notification__icon-label">{timespan}</div>
</div>
<div className="module-timer-notification__message">{message}</div>
<div className="SystemMessage">
<div
className={classNames(
'SystemMessage__icon',
'SystemMessage__icon--timer',
disabled ? 'SystemMessage__icon--timer-disabled' : null
)}
/>
<div>{message}</div>
</div>
);
};

View File

@ -11,8 +11,6 @@ export type Props = {
expireTimer: number;
};
const CSS_MODULE = 'module-universal-timer-notification';
export const UniversalTimerNotification: React.FC<Props> = props => {
const { i18n, expireTimer } = props;
@ -23,15 +21,14 @@ export const UniversalTimerNotification: React.FC<Props> = props => {
const timeValue = expirationTimer.format(i18n, expireTimer);
return (
<div className={CSS_MODULE}>
<div className={`${CSS_MODULE}__icon-container`}>
<div className={`${CSS_MODULE}__icon`} />
<div className={`${CSS_MODULE}__icon-label`}>{timeValue}</div>
</div>
<div className={`${CSS_MODULE}__message`}>
{i18n('UniversalTimerNotification__text', {
timeValue,
})}
<div className="SystemMessage">
<div className="SystemMessage__icon SystemMessage__icon--timer" />
<div className="SystemMessage__text">
<div>
{i18n('UniversalTimerNotification__text', {
timeValue,
})}
</div>
</div>
</div>
);

View File

@ -4,6 +4,7 @@
import React from 'react';
import classNames from 'classnames';
import { Button, ButtonSize, ButtonVariant } from '../Button';
import { ContactName } from './ContactName';
import { Intl } from '../Intl';
import { LocalizerType } from '../../types/Util';
@ -49,44 +50,51 @@ export const UnsupportedMessage = ({
const stringId = isMe ? meStringId : otherStringId;
return (
<div className="module-unsupported-message">
<div
className={classNames(
'module-unsupported-message__icon',
canProcessNow ? 'module-unsupported-message__icon--can-process' : null
)}
/>
<div className="module-unsupported-message__text">
<Intl
id={stringId}
components={[
<span
key="external-1"
className="module-unsupported-message__contact"
>
<ContactName
name={contact.name}
profileName={contact.profileName}
phoneNumber={contact.phoneNumber}
title={contact.title}
module="module-unsupported-message__contact"
i18n={i18n}
/>
</span>,
]}
i18n={i18n}
<div className="SystemMessage SystemMessage--multiline">
<div className="SystemMessage__line SystemMessage__text">
<div
className={classNames(
'SystemMessage__icon',
'SystemMessage__icon--unsupported',
{
'SystemMessage__icon--unsupported--can-process': canProcessNow,
}
)}
/>
<span>
<Intl
id={stringId}
components={[
<span
key="external-1"
className="module-unsupported-message__contact"
>
<ContactName
name={contact.name}
profileName={contact.profileName}
phoneNumber={contact.phoneNumber}
title={contact.title}
module="module-unsupported-message__contact"
i18n={i18n}
/>
</span>,
]}
i18n={i18n}
/>
</span>
</div>
{canProcessNow ? null : (
<button
type="button"
onClick={() => {
downloadNewVersion();
}}
className="module-unsupported-message__button"
>
{i18n('Message--update-signal')}
</button>
<div className="SystemMessage__line">
<Button
onClick={() => {
downloadNewVersion();
}}
size={ButtonSize.Small}
variant={ButtonVariant.SystemMessage}
>
{i18n('Message--update-signal')}
</Button>
</div>
)}
</div>
);

View File

@ -52,32 +52,33 @@ export class VerificationNotification extends React.Component<Props> {
const id = this.getStringId();
return (
<Intl
id={id}
components={[
<ContactName
key="external-1"
name={contact.name}
profileName={contact.profileName}
phoneNumber={contact.phoneNumber}
title={contact.title}
module="module-verification-notification__contact"
i18n={i18n}
/>,
]}
i18n={i18n}
/>
<div className="SystemMessage__text">
<Intl
id={id}
components={[
<ContactName
key="external-1"
name={contact.name}
profileName={contact.profileName}
phoneNumber={contact.phoneNumber}
title={contact.title}
module="module-verification-notification__contact"
i18n={i18n}
/>,
]}
i18n={i18n}
/>
</div>
);
}
public render(): JSX.Element {
const { type } = this.props;
const suffix =
type === 'markVerified' ? 'mark-verified' : 'mark-not-verified';
const suffix = type === 'markVerified' ? 'verified' : 'verified-not';
return (
<div className="module-verification-notification">
<div className={`module-verification-notification__icon--${suffix}`} />
<div className="SystemMessage">
<div className={`SystemMessage__icon SystemMessage__icon--${suffix}`} />
{this.renderContents()}
</div>
);

View File

@ -110,3 +110,53 @@ export function getCallingNotificationText(
return '';
}
}
type CallingIconType =
| 'audio-incoming'
| 'audio-missed'
| 'audio-outgoing'
| 'phone'
| 'video'
| 'video-incoming'
| 'video-missed'
| 'video-outgoing';
function getDirectCallingIcon({
wasIncoming,
wasVideoCall,
acceptedTime,
}: DirectCallNotificationType): CallingIconType {
const wasAccepted = Boolean(acceptedTime);
// video
if (wasVideoCall) {
if (wasAccepted) {
return wasIncoming ? 'video-incoming' : 'video-outgoing';
}
return 'video-missed';
}
if (wasAccepted) {
return wasIncoming ? 'audio-incoming' : 'audio-outgoing';
}
return 'audio-missed';
}
export function getCallingIcon(
notification: CallingNotificationType
): CallingIconType {
switch (notification.callMode) {
case CallMode.Direct:
return getDirectCallingIcon(notification);
case CallMode.Group:
return 'video';
default:
window.log.error(
`getCallingNotificationText: missing case ${missingCaseError(
notification
)}`
);
return 'phone';
}
}

View File

@ -1,7 +1,6 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import sharp from 'sharp';
import loadImage from 'blueimp-load-image';
import { MIMEType, IMAGE_JPEG } from '../types/MIME';
@ -107,7 +106,9 @@ async function stripImageFileEXIFData(
type: MIMEType
): Promise<Blob> {
const arrayBuffer = await file.arrayBuffer();
const xArrayBuffer = await sharp(new Uint8Array(arrayBuffer)).toBuffer();
const xArrayBuffer = await window
.sharp(new Uint8Array(arrayBuffer))
.toBuffer();
return new Blob([xArrayBuffer], { type });
}

2
ts/window.d.ts vendored
View File

@ -7,6 +7,7 @@ import { DeepPartial, Store } from 'redux';
import * as Backbone from 'backbone';
import * as Underscore from 'underscore';
import moment from 'moment';
import sharp from 'sharp';
import PQueue from 'p-queue/dist';
import { Attributes, ComponentClass, FunctionComponent, Ref } from 'react';
import { imageToBlurHash } from './util/imageToBlurHash';
@ -161,6 +162,7 @@ declare global {
_: typeof Underscore;
$: typeof jQuery;
sharp: typeof sharp;
moment: typeof moment;
imageToBlurHash: typeof imageToBlurHash;
loadImage: any;