Added particle effects for premium promo pages.

This commit is contained in:
23rd
2026-08-21 08:11:30 +03:00
parent 7cf6cd6f54
commit bf159672c2
25 changed files with 967 additions and 0 deletions

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M61.143472,13 C64.1104735,13 66.6250598,13.5509586 68.687231,14.6528759 C70.7494022,15.7547931 72.3170732,17.3440969 73.3902439,19.4207871 C74.4002869,21.375319 74.9350156,23.7240423 74.9944299,26.4669569 L75,26.9858729 L75,50.1579213 C75,53.1246216 74.4634146,55.6516145 73.3902439,57.7389001 C72.3170732,59.8261857 70.7494022,61.4154894 68.687231,62.5068113 C66.746364,63.5339378 64.4047417,64.0683251 61.6623642,64.1099733 L61.143472,64.1120081 L41.2898135,64.1120081 L30.3687231,74.0610494 C29.6322334,74.7391524 29.0062171,75.2318365 28.4906743,75.5391019 C27.9751315,75.8463673 27.4122429,76 26.8020086,76 C25.9392635,76 25.2659015,75.7139253 24.7819225,75.141776 C24.3419417,74.6216402 24.1019521,73.9351311 24.0619538,73.0822485 L24.0559541,72.8213925 L24.0559541,64.1120081 L22.7618364,64.1120081 C19.8579627,64.1120081 17.3802009,63.5663471 15.3285509,62.4750252 C13.276901,61.3837033 11.70923,59.7996973 10.625538,57.7230071 C9.6055926,55.7684751 9.06562149,53.4197518 9.0056247,50.6768372 L9,50.1579213 L9,26.9858729 C9,24.0191726 9.53658537,21.4921796 10.6097561,19.404894 C11.6829268,17.3176085 13.2505978,15.7283047 15.312769,14.6369828 C17.253636,13.6098564 19.5952583,13.0660835 22.3376358,13.0056643 L22.856528,13 L61.143472,13 Z M55.9353261,25.324399 C54.5584886,23.9365009 52.355685,23.8858646 50.9185879,25.1732799 L50.7621424,25.3218325 L41.9571318,34.1787135 L33.4158776,25.5862426 L33.2594321,25.4376901 C31.822335,24.1502748 29.6195314,24.200911 28.2426939,25.5888091 C26.8658564,26.9767072 26.8177446,29.1950687 28.0975744,30.6410148 L28.2452424,30.7984153 L36.7815932,39.3864811 L28.2452424,47.9749351 L28.0975744,48.1323356 C26.8177446,49.5782816 26.8658564,51.7966432 28.2426939,53.1845413 C29.6195314,54.5724394 31.822335,54.6230756 33.2594321,53.3356603 L33.4158776,53.1871077 L41.9571318,44.5931963 L50.7621424,53.4515179 L50.9185879,53.6000705 C52.355685,54.8874858 54.5584886,54.8368495 55.9353261,53.4489514 C57.3121636,52.0610533 57.3602754,49.8426918 56.0804456,48.3967458 L55.9327776,48.2393452 L47.1326703,39.3864811 L55.9327776,30.5340052 L56.0804456,30.3766046 C57.3602754,28.9306586 57.3121636,26.7122971 55.9353261,25.324399 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Filled / Page / page_bold</title>
<g id="Filled-/-Page-/-page_bold" stroke="none" fill="none" fill-rule="nonzero">
<path d="M43.776,34.608 C46.6506667,34.9066667 48.9186667,35.8306667 50.58,37.38 C52.2413333,38.9293333 53.072,41.16 53.072,44.072 C53.072,46.4613333 52.484,48.552 51.308,50.344 C50.132,52.136 48.4706667,53.5266667 46.324,54.516 C44.1773333,55.5053333 41.648,56 38.736,56 L21.936,56 L21.936,51.632 L24.232,51.072 C24.904,50.9226667 25.3426667,50.7173333 25.548,50.456 C25.7533333,50.1946667 25.856,49.6906667 25.856,48.944 L25.856,22.736 C25.856,21.9893333 25.7533333,21.4853333 25.548,21.224 C25.3426667,20.9626667 24.904,20.7573333 24.232,20.608 L21.936,20.048 L21.936,15.68 L37.392,15.68 C41.76,15.68 44.9986667,16.3986667 47.108,17.836 C49.2173333,19.2733333 50.272,21.5413333 50.272,24.64 C50.272,27.104 49.6653333,29.232 48.452,31.024 C47.2386667,32.816 45.68,34.0106667 43.776,34.608 Z M42.992,26.936 C42.992,24.6586667 42.432,23.1 41.312,22.26 C40.192,21.42 38.3813333,21 35.88,21 L32.632,21 L32.632,32.704 L36.776,32.704 C38.9786667,32.704 40.5653333,32.2653333 41.536,31.388 C42.5066667,30.5106667 42.992,29.0266667 42.992,26.936 Z M38.288,50.68 C43.2906667,50.68 45.792,48.5333333 45.792,44.24 C45.792,42.112 45.148,40.5253333 43.86,39.48 C42.572,38.4346667 40.6213333,37.912 38.008,37.912 L32.632,37.912 L32.632,50.68 L38.288,50.68 Z" id="Shape" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M42,9 C61.3299662,9 77,23.165701 77,40.6399787 C77,58.1142565 61.3299662,72.2799575 42,72.2799575 C37.2499676,72.2799575 32.7209412,71.4245579 28.5911353,69.8748646 C27.4157602,70.8188233 25.9648118,71.7148963 24.2394289,72.5628279 C19.5747416,74.8552672 14.8404686,75.5304804 10.0366097,74.5884673 L10.0362692,74.5902197 C9.30857148,74.4488259 8.83327827,73.7442881 8.97467207,73.0165904 C9.01023833,72.8335449 9.08344713,72.6604328 9.18909361,72.5080032 L9.27467608,72.3980251 C12.4063063,68.7692384 13.9597999,64.4854862 13.935157,59.5467684 C9.57842009,54.2721381 7,47.7282627 7,40.6399787 C7,23.165701 22.6700338,9 42,9 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 760 B

View File

@@ -0,0 +1 @@
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M50.9333333,4 C60.3589931,4 68,11.6410069 68,21.0666667 L68,50.9333333 C68,60.3589931 60.3589931,68 50.9333333,68 L21.0666667,68 C11.6410069,68 4,60.3589931 4,50.9333333 L4,21.0666667 C4,11.6410069 11.6410069,4 21.0666667,4 L50.9333333,4 Z M54.2085467,23.1103432 C52.8866091,21.8076634 50.7433246,21.8076634 49.4213869,23.1103432 L31.0221541,46.1814073 L22.5786131,37.8611959 C21.2566754,36.558516 19.1133909,36.558516 17.7914533,37.8611959 C16.4695156,39.1638758 16.4695156,41.2759372 17.7914533,42.5786171 L28.4520911,53.0839523 C29.8719501,54.483127 32.1739963,54.483127 33.5938553,53.0839523 L54.2085467,27.8277644 C55.5304844,26.5250845 55.5304844,24.4130231 54.2085467,23.1103432 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 821 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Filled / Page / page_code</title>
<g id="Filled-/-Page-/-page_code" stroke="none" fill="none" fill-rule="nonzero">
<path d="M53.8496071,24.500056 L63.6715762,34.2634806 C64.7087604,35.2944827 64.7041788,36.9740446 63.6613852,37.9993728 L53.3910383,48.097704 C52.4065176,49.0657351 50.8236616,49.0523677 49.8556305,48.0678471 C48.8875993,47.0833264 48.9009667,45.5004704 49.8854874,44.5324392 L58.444092,36.1171807 L50.3246573,28.0461424 C49.3454326,27.0727544 49.340701,25.489849 50.314089,24.5106243 C51.287477,23.5313996 52.8703824,23.526668 53.8496071,24.500056 Z M19.1503929,24.500056 L9.32842381,34.2634806 C8.29123957,35.2944827 8.2958212,36.9740446 9.33861485,37.9993728 L19.6089617,48.097704 C20.5934824,49.0657351 22.1763384,49.0523677 23.1443695,48.0678471 C24.1124007,47.0833264 24.0990333,45.5004704 23.1145126,44.5324392 L14.555908,36.1171807 L22.6753427,28.0461424 C23.6545674,27.0727544 23.659299,25.489849 22.685911,24.5106243 C21.712523,23.5313996 20.1296176,23.526668 19.1503929,24.500056 Z M43.5010092,13.6127403 C44.8194563,14.0226946 45.5559353,15.4238407 45.1459811,16.7422878 L32.7084936,56.7422878 C32.2985394,58.0607349 30.8973932,58.7972139 29.5789461,58.3872597 C28.260499,57.9773054 27.52402,56.5761593 27.9339742,55.2577122 L40.3714617,15.2577122 C40.7814159,13.9392651 42.1825621,13.2027861 43.5010092,13.6127403 Z" id="Shape" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M18.4000512,71 L67.5999488,71 C72.7914537,71 77,66.7914537 77,61.5999488 L77,31.7125512 C77,26.5210463 72.7914537,22.3125 67.5999488,22.3125 L46.9526944,22.3125 C46.3313075,22.3125 45.7352135,22.0663936 45.2948159,21.6280198 L38.3192192,14.6844802 C37.8788216,14.2461064 37.2827276,14 36.6613407,14 L18.4000512,14 C13.2085463,14 9,18.2085463 9,23.4000512 L9,61.5999488 C9,66.7914537 13.2085463,71 18.4000512,71 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 546 B

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M11,52.9637892 C11,56.0893873 11.5951492,58.9419702 12.7854476,61.5215379 C13.9757459,64.1011057 15.5996131,66.1661512 17.6570489,67.7166743 C19.7144848,69.2671975 22.0483515,70.0424591 24.6586492,70.0424591 L30.046584,70.0424591 C27.2835912,67.9827332 25.2437613,65.4515323 23.9270945,62.4488565 C22.6104277,59.4461808 21.9846737,56.1880852 22.0498324,52.6745699 C22.0708938,50.0999125 22.372911,47.7636523 22.9558841,45.6657894 C23.5388572,43.5679265 24.2663806,41.6969214 25.1384543,40.0527744 C26.010528,38.4086273 26.9196238,36.9888011 27.8657415,35.7932959 L23.4838178,35.7932959 C21.1223079,35.7932959 19.0028397,36.5544811 17.125413,38.0768517 C15.2479863,39.5992222 13.7577275,41.6606667 12.6546365,44.2611853 C11.5515455,46.8617038 11,49.7625718 11,52.9637892 Z M26.3419161,52.7374223 C26.2810354,55.6014627 26.7982739,58.2589412 27.8936314,60.709858 C28.9889889,63.1607747 30.5812639,65.2960381 32.6704564,67.1156481 C34.7596489,68.9352582 37.2735249,70.3596674 40.2120843,71.3888756 C43.1506437,72.4180839 46.4325204,72.9431634 50.0577145,72.9641142 L54.327585,72.9955404 C56.3537578,73.0164912 58.1061324,72.9636232 59.5847087,72.8369363 C61.0632851,72.7102494 62.2369647,72.5306944 63.1057476,72.2982715 C64.3733808,71.9718972 65.509298,71.3998421 66.5134991,70.582106 C67.5177002,69.7643699 68.0198008,68.6101116 68.0198008,67.1193309 C68.0198008,66.5346725 67.9528321,66.0213778 67.8188948,65.5794468 C67.6849574,65.1375158 67.515808,64.7374864 67.3114466,64.3793586 C67.0728604,63.9826027 67.1309438,63.7128611 67.4856968,63.5701338 C68.4617612,63.1586469 69.295332,62.5085991 69.9864093,61.6199904 C70.6774866,60.7313816 71.0230253,59.6669008 71.0230253,58.4265477 C71.0230253,57.0379022 70.6669559,55.8694038 69.9548172,54.9210526 C69.6211256,54.4696282 69.7098139,54.095951 70.220882,53.8000209 C70.9261099,53.3796954 71.4971537,52.751826 71.9340133,51.9164127 C72.3708728,51.0809994 72.5893026,50.1514711 72.5893026,49.1278279 C72.5893026,48.4181194 72.4782366,47.7130758 72.2561046,47.0126969 C72.0339727,46.3123181 71.7228233,45.7663696 71.3226567,45.3748515 C70.9297299,45.0141048 70.9591829,44.6392818 71.4110158,44.2503825 C71.9036552,43.8382409 72.2916458,43.2826354 72.5749875,42.583566 C72.8583292,41.8844966 73,41.0930309 73,40.2091688 C73,38.6669933 72.4651555,37.3544581 71.3954666,36.2715634 C70.3257777,35.1886687 68.9998142,34.6472214 67.4175763,34.6472214 L56.4057531,34.6472214 C55.0528871,34.6472214 53.9596686,34.3200288 53.1260977,33.6656435 C52.2925269,33.0112582 51.8757414,32.133616 51.8757414,31.0327167 C51.8757414,30.0041631 52.1414771,28.7881981 52.6729485,27.3848216 C53.2044198,25.9814451 53.8160232,24.4864906 54.5077587,22.8999583 C55.1994942,21.3134259 55.8069017,19.7344227 56.3299814,18.1629487 C56.8530611,16.5914747 57.114601,15.1137065 57.114601,13.729644 C57.114601,12.2434464 56.6928793,11.0836229 55.8494359,10.2501738 C55.0059925,9.41672459 53.9471634,9 52.6729485,9 C51.5553777,9 50.6559077,9.35444505 49.9745384,10.0633351 C49.2931691,10.7722252 48.6413351,11.7321158 48.0190365,12.9430068 C45.7009658,17.4418646 43.1196275,21.5416751 40.2750217,25.2424382 C37.4304159,28.9432013 34.8164983,32.3496711 32.4332688,35.4618476 C31.0777701,37.2603432 29.9569085,39.0180011 29.0706842,40.7348212 C28.1844598,42.4516414 27.5139503,44.2749343 27.0591556,46.2046997 C26.6043609,48.1344652 26.3652811,50.3120394 26.3419161,52.7374223 Z" fill="#FFFFFF" fill-rule="nonzero"/></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Filled / Page / page_numbered</title>
<g id="Filled-/-Page-/-page_numbered" stroke="none" fill="none" fill-rule="evenodd" stroke-width="1">
<g id="Group-2" transform="translate(10, 12)" fill="#FFFFFF">
<path d="M52,14 C52,15.3807119 50.8807119,16.5 49.5,16.5 L22.28,16.5 C20.8992881,16.5 19.78,15.3807119 19.78,14 C19.78,12.6192881 20.8992881,11.5 22.28,11.5 L49.5,11.5 C50.8807119,11.5 52,12.6192881 52,14 Z M52,34 C52,35.3807119 50.8807119,36.5 49.5,36.5 L22.28,36.5 C20.8992881,36.5 19.78,35.3807119 19.78,34 C19.78,32.6192881 20.8992881,31.5 22.28,31.5 L49.5,31.5 C50.8807119,31.5 52,32.6192881 52,34 Z M4.45998038,10.2072961 L5.21044922,9.76660156 L5.23095703,9.76660156 L5.23095703,17.8774414 C5.23095703,19.3334961 6,20.1538086 7.37402344,20.1538086 C8.73779297,20.1538086 9.49658203,19.34375 9.49658203,17.8774414 L9.49658203,8.46435547 C9.49658203,6.90576172 8.51220703,5.90087891 6.99462891,5.90087891 C6.14355469,5.90087891 5.20019531,6.18798828 4.31835938,6.72119141 L2.87255859,7.59277344 C2.15478516,8.0234375 1.78564453,8.56689453 1.78564453,9.19238281 C1.78564453,10.0332031 2.38037109,10.6279297 3.22119141,10.6279297 C3.59406072,10.6279297 3.89913562,10.5262381 4.45998038,10.2072961 Z M5.11506746,31.2129454 L5.24658203,31.0537109 C5.79003906,30.3769531 6.23095703,30.1308594 6.84619141,30.1308594 C7.64599609,30.1308594 8.19970703,30.6435547 8.19970703,31.4023438 C8.19970703,32.0791016 7.72802734,32.7353516 6.66162109,33.7402344 L3.52392578,36.6933594 C2.26269531,37.8725586 1.82177734,38.5493164 1.82177734,39.3081055 C1.82177734,40.3129883 2.59082031,41 3.71875,41 L10.8657227,41 C12.0756836,41 12.793457,40.3847656 12.793457,39.3491211 C12.793457,38.3134766 12.0551758,37.6777344 10.8657227,37.6777344 L7.43066406,37.6777344 L7.43066406,37.5136719 L9.85058594,35.3603516 C11.480957,33.9145508 12.2807617,32.4790039 12.2807617,30.9716797 C12.2807617,28.5620117 10.0556641,26.7675781 7.07177734,26.7675781 C4.2109375,26.7675781 1.80126953,28.53125 1.80126953,30.5307617 C1.80126953,31.4433594 2.49853516,32.0996094 3.48291016,32.0996094 C4.12084961,32.0996094 4.55543736,31.8697335 5.11506746,31.2129454 L5.11506746,31.2129454 Z" id="Shape" fill-rule="nonzero"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Filled / Page / page_equation</title>
<g id="Filled-/-Page-/-page_equation" stroke="none" fill="none" fill-rule="nonzero">
<path d="M49,8.55 C56.9805146,8.55 63.45,15.0194854 63.45,23 L63.45,49 C63.45,56.9805146 56.9805146,63.45 49,63.45 L23,63.45 C15.0194854,63.45 8.55,56.9805146 8.55,49 L8.55,23 C8.55,15.0194854 15.0194854,8.55 23,8.55 L49,8.55 Z M23,13.45 C17.7256806,13.45 13.45,17.7256806 13.45,23 L13.45,49 C13.45,54.2743194 17.7256806,58.55 23,58.55 L49,58.55 C54.2743194,58.55 58.55,54.2743194 58.55,49 L58.55,23 C58.55,17.7256806 54.2743194,13.45 49,13.45 L23,13.45 Z M23.7089844,48.4505495 L23.7136639,48.2519188 C23.7514414,47.5140747 24.0392269,47.0061538 25.3311434,45.3076923 L33.6737492,35.9230769 L25.3795661,26.8021978 C24.3142676,25.4835165 23.8784637,24.6263736 23.8784637,23.7472527 C23.8784637,22.010989 25.1616641,21 27.3406837,21 L45.8278362,21 C47.4499953,21 48.5879277,22.010989 48.5879277,23.4615385 C48.5879277,24.9120879 47.4499953,25.9010989 45.8278362,25.9010989 L32.2555835,25.9010989 L32.2555835,26.1428571 L38.7097056,32.9340659 C39.7507927,34.2307692 40.0897513,34.9340659 40.0897513,35.7252747 C40.0897513,36.4945055 39.7992154,37.1318681 38.8791849,38.3186813 L32.0134702,45.8351648 L32.0134702,46.0989011 L45.9004702,46.0989011 C47.5952632,46.0989011 48.7089844,47.0879121 48.7089844,48.5604396 C48.7089844,50.032967 47.5952632,51 45.8762589,51 L27.2438384,51 C25.0406075,51 23.7089844,50.032967 23.7089844,48.4505495 Z" id="Shape" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M39.3075319,56.1425976 C40.3374448,57.0123862 40.8886286,57.6462393 40.9610834,58.0441571 L41.4029163,60.4349708 L41.7309691,62.1566284 L42.0364321,63.7085143 L42.2507049,64.7610159 L42.5166358,66.015801 L42.759977,67.1008144 L42.9276583,67.8031616 L43.0826329,68.4100122 C43.4976508,73.0534071 42.3252062,77.2876497 39.0015336,77.8674577 C38.8860082,77.8876109 38.7700913,77.9031125 38.6539271,77.9139433 L38.0058003,77.9743726 C34.5487503,78.296697 31.3185774,75.5542465 29.9310824,71.1188527 C29.7054975,70.7614629 29.484981,70.4089085 29.2695328,70.0611893 L28.6383934,69.0325375 L28.3342275,68.5290909 L28.3342275,68.5290909 L27.7487034,67.5439565 C27.558597,67.2204136 27.373559,66.901706 27.1935894,66.5878336 L26.6688857,65.6607223 L26.4179376,65.208046 L26.4179376,65.208046 L25.9388492,64.3244521 L25.7107088,63.8935344 L25.7107088,63.8935344 L25.2772356,63.0534579 C24.2315655,60.9895309 23.4709909,59.1975875 22.9955118,57.6776276 C22.8888022,57.3365099 23.2371418,56.8248332 24.0405304,56.1425976 L39.3075319,56.1425976 Z M18.1621162,6.60264911 L18.2987613,6.74755969 L74.5104404,69.918919 C75.7544289,71.3169282 75.6295704,73.4586904 74.2315613,74.7026788 C72.8834811,75.9022391 70.8438244,75.8289813 69.5844466,74.5687102 L69.4478016,74.4237997 L13.2361224,11.2524403 C11.992134,9.85443118 12.1169924,7.71266899 13.5150016,6.46868056 C14.8630818,5.26912029 16.9027385,5.34237809 18.1621162,6.60264911 Z M70.8565997,12.4017361 C71.598978,13.3976208 72,14.6065695 72,15.8487094 L72,59.2851068 C72,59.4626162 71.9919807,59.6382527 71.9762847,59.8116736 L38.783,22.6278573 L43.6621199,22.6279139 C46.1463999,22.6279139 48.5642972,21.8258698 50.5560665,20.3411133 L62.7855848,11.2246678 C65.3393725,9.32095706 68.9528889,9.84794848 70.8565997,12.4017361 Z M17.8216914,23.2385982 L43.289,51.7711171 L21.5348837,51.7711171 C15.1643434,51.7711171 10,46.6067737 10,40.2362334 L10,34.1627976 C10,29.0913332 13.2728743,24.7842895 17.8216914,23.2385982 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M38.9729122,77 L45.0621813,77 C45.9910621,77 46.7792035,76.7356752 47.4266053,76.2070257 C48.0740071,75.6783761 48.4980534,74.9623594 48.6987443,74.0589756 L50.3914569,66.8909484 C50.9847563,66.6916994 53.2863044,65.7691219 53.814169,65.5084531 L60.0821955,69.3680335 C60.8385334,69.844403 61.6343514,70.0435606 62.4696496,69.9655062 C63.3049478,69.8874518 64.0375244,69.5343789 64.6673795,68.9062877 L68.9389154,64.6315748 C69.5921661,64.00129 69.956718,63.2562086 70.0325711,62.3963305 C70.1084243,61.5364524 69.8849774,60.7295855 69.3622306,59.9757298 L65.5414268,53.7416135 C65.8038968,53.1950499 66.7128548,50.9619991 66.8886878,50.3920374 L74.0943686,48.7029911 C75.0163039,48.5022797 75.7310596,48.0781902 76.2386357,47.4307225 C76.7462119,46.7832547 77,45.9950331 77,45.0660577 L77,39.0814597 C77,38.1758823 76.7462119,37.3992683 76.2386357,36.7516178 C75.7310596,36.1039672 75.0163039,35.6786895 74.0943686,35.4757846 L66.9270713,33.758222 C66.730036,33.1228188 65.8320447,30.8568646 65.6116138,30.3735487 L69.4357076,24.0593673 C69.9376177,23.27992 70.155307,22.477166 70.0887756,21.6511054 C70.0222442,20.8250448 69.6612564,20.0875494 69.0058124,19.4386193 L64.6607995,15.1600677 C64.0097421,14.5626864 63.2980022,14.2137265 62.5255799,14.113188 C61.7531575,14.0126496 60.978359,14.1853929 60.2011844,14.6314181 L53.814169,18.5683218 C53.3075067,18.3244703 51.027892,17.4029895 50.3947469,17.1825361 L48.6987443,9.90921768 C48.4980534,9.00583384 48.0740071,8.29511827 47.4266053,7.77707096 C46.7792035,7.25902365 45.9910621,7 45.0621813,7 L38.9729122,7 C38.0440314,7 37.25589,7.25957205 36.6084882,7.77871614 C35.9610864,8.29786023 35.5370401,9.00912419 35.3363492,9.91250803 L33.6118331,17.1123419 C33.0185338,17.3327954 30.6818921,18.2681687 30.1540275,18.5332247 L23.8021056,14.6314181 C23.0227377,14.1853929 22.2473908,14.0126496 21.4760651,14.113188 C20.7047394,14.2137265 19.9924512,14.5650628 19.3392005,15.1671968 L14.9974777,19.4386193 C14.3420336,20.0875494 13.9810459,20.8250448 13.9145144,21.6511054 C13.847983,22.477166 14.0656724,23.27992 14.5675824,24.0593673 L18.3916763,30.3735487 C18.1712453,30.8568646 17.2721573,33.1228188 17.0729287,33.758222 L9.90892142,35.4757846 C8.98442726,35.6786895 8.26848349,36.1039672 7.76109009,36.7516178 C7.2536967,37.3992683 7,38.1758823 7,39.0814597 L7,45.0660577 C7,45.9950331 7.2536967,46.7832547 7.76109009,47.4307225 C8.26848349,48.0781902 8.98442726,48.5022797 9.90892142,48.7029911 L17.1464057,50.3920374 C17.3010364,50.9619991 18.1982965,53.1950499 18.4585732,53.7416135 L14.6377694,59.9757298 C14.1150226,60.7295855 13.8921241,61.5364524 13.9690739,62.3963305 C14.0460237,63.2562086 14.4100272,64.00129 15.0610846,64.6315748 L19.3359105,68.9062877 C19.9657656,69.5343789 20.6983422,69.8874518 21.5336404,69.9655062 C22.3689386,70.0435606 23.1647566,69.844403 23.9210945,69.3680335 L30.189121,65.5084531 C30.7169856,65.7691219 33.0185338,66.6916994 33.6118331,66.8909484 L35.3363492,74.0589756 C35.5370401,74.9623594 35.9610864,75.6783761 36.6084882,76.2070257 C37.25589,76.7356752 38.0440314,77 38.9729122,77 Z M42.0156276,53.655516 C39.874559,53.655516 37.9195591,53.1254955 36.1506278,52.0654545 C34.3816966,51.0054134 32.9730219,49.5907458 31.9246038,47.8214515 C30.8761858,46.0521573 30.3519768,44.0957701 30.3519768,41.9522899 C30.3519768,39.8322078 30.8761858,37.8928208 31.9246038,36.1341288 C32.9730219,34.3754368 34.3816966,32.9666186 36.1506278,31.9076743 C37.9195591,30.8487301 39.874559,30.3192579 42.0156276,30.3192579 C44.159255,30.3192579 46.1102338,30.8487301 47.8685639,31.9076743 C49.626894,32.9666186 51.0354773,34.3754368 52.0943138,36.1341288 C53.1531502,37.8928208 53.6825684,39.8322078 53.6825684,41.9522899 C53.6825684,44.0957701 53.1531502,46.0521573 52.0943138,47.8214515 C51.0354773,49.5907458 49.626894,51.0054134 47.8685639,52.0654545 C46.1102338,53.1254955 44.159255,53.655516 42.0156276,53.655516 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M42,9 C60.2253967,9 75,23.7746033 75,42 C75,60.2253967 60.2253967,75 42,75 C23.7746033,75 9,60.2253967 9,42 C9,23.7746033 23.7746033,9 42,9 Z M56.060747,51.3650987 C54.0697695,52.4475571 48.9384635,56.1174654 41.7123344,56.1174654 C34.8011278,56.1174654 29.6514825,52.9690854 27.5227694,51.6802178 C26.7955317,51.2398986 26.6162667,51.7087628 26.9059078,52.2200045 C28.2636235,54.6164913 32.7376013,60.2223032 41.7109758,60.2223032 C50.9556696,60.2223032 55.623501,54.5431051 56.7206597,52.1342321 C56.9156468,51.706127 56.6245177,51.0585867 56.060747,51.3650987 Z M54.2507831,29.3319526 C47.4584749,30.1625826 43.6491633,32.1544314 41.7124069,32.1544314 C39.7756504,32.1544314 33.8986657,29.3319526 28.5464586,29.3319526 C23.1942514,29.3319526 21.6199574,29.4482918 15.9750056,29.3319526 C13.6327254,29.2836796 14.2417971,31.0581422 15.0481408,32.1544314 C15.5520299,32.8395093 16.6768372,38.3612596 19.0808922,42.5076923 C21.4849473,46.654125 25.5743414,46.4346877 28.5464586,46.6486455 C41.010541,47.545914 39.074857,35.0263939 41.7124069,35.0263939 C44.3499568,35.0263939 43.2701521,47.8308037 55.7585524,46.6486455 C61.7256719,46.083795 63.085901,45.0125671 64.8976337,41.5136268 C66.7093664,38.0146865 68.3896846,32.6650676 68.7527982,32.1544314 C69.4481689,31.1765515 69.7513259,29.3319526 67.8618474,29.3319526 C65.8200121,29.3319526 61.0430913,28.5013226 54.2507831,29.3319526 Z M20.6922514,32.8508918 C23.0169493,32.1638057 24.0693941,32.262582 29.3520977,32.8508918 C34.6348012,33.4392015 36.1552946,34.753259 36.9510014,34.753259 C37.7467083,34.753259 37.2247775,36.8464796 36.4290706,36.8464796 C36.1789913,36.8464796 35.7835337,36.7531237 35.2150619,36.6098517 L34.8876618,36.527014 C33.6230626,36.2070392 31.646308,35.718992 28.7363112,35.4103896 C24.1067709,34.9194312 22.1935753,35.4103896 20.6922514,35.4103896 C19.1909274,35.4103896 18.3675534,33.5379778 20.6922514,32.8508918 Z M63.4806298,32.8508918 C65.8053277,33.5379778 64.9819538,35.4103896 63.4806298,35.4103896 C61.9793058,35.4103896 60.0661103,34.9194312 55.4365699,35.4103896 C52.5265731,35.718992 50.5498185,36.2070392 49.2852193,36.527014 L48.9578193,36.6098517 C48.3893475,36.7531237 47.9938899,36.8464796 47.7438106,36.8464796 C46.9481037,36.8464796 46.4261728,34.753259 47.2218797,34.753259 C48.0175866,34.753259 49.5380799,33.4392015 54.8207835,32.8508918 C60.1034871,32.262582 61.1559319,32.1638057 63.4806298,32.8508918 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M42,9 C60.2253967,9 75,23.7746033 75,42 C75,60.2253967 60.2253967,75 42,75 C23.7746033,75 9,60.2253967 9,42 C9,23.7746033 23.7746033,9 42,9 Z M42,48.7660261 C26.9066713,48.7660261 19.1380415,43.5418292 19.1244835,46.4670263 C19.1190611,47.7008238 19.2328906,51.2726262 21.3606333,55.2621267 C24.2775327,60.7312897 30.5745106,66.779044 41.8406871,66.779044 C53.4039032,66.779044 59.5624444,60.8283195 62.3621799,55.2621267 C64.2800737,51.4491355 64.37138,47.7832401 64.5408146,46.4670263 C64.9575893,43.2294077 57.0933287,48.7660261 42,48.7660261 Z M22.7003695,47.6372626 C28.9424063,49.8423294 35.3153313,50.9448628 41.8191446,50.9448628 C47.9983513,50.9448628 54.3957487,49.9496382 61.0113367,47.9591892 C61.6238518,47.7754231 62.2690413,48.1235932 62.4522373,48.7362788 C62.5191225,48.9599716 62.516821,49.1986591 62.4451696,49.4208716 L61.5908611,52.085686 C61.3056152,52.970519 60.6020275,53.6577444 59.7101829,53.9202494 C53.7273987,55.6926682 47.7637192,56.5788776 41.8191446,56.5788776 C35.9748738,56.5788776 30.0244686,55.7223222 23.9679288,54.0092115 C22.8951803,53.7060206 22.1281041,52.7625865 22.0491658,51.6506142 L21.8157259,48.302979 C21.7916294,47.9383528 22.0678429,47.6233708 22.4324812,47.5994591 C22.5234251,47.5934954 22.6146205,47.6063843 22.7003695,47.6372626 Z M32.5722442,30.5578706 C28.4492519,30.5578706 26.8131873,34.1019574 27.6640502,41.190131 C27.6778456,41.3000496 27.7456039,41.3958654 27.8447134,41.4453598 C27.9848231,41.5153293 28.1508126,41.4765879 28.2467849,41.3611533 L28.2884924,41.2971931 L28.444953,40.99433 C29.8491113,38.3166823 31.224875,36.9778585 32.5722442,36.9778585 C33.9634639,36.9778585 35.3244107,38.4052452 36.654524,41.2602876 C36.7026516,41.3605979 36.7979774,41.4299992 36.9082212,41.4449902 C37.0666353,41.4665314 37.2140842,41.3721363 37.2649637,41.2269153 L37.2806072,41.1617557 L37.3293767,40.7929014 C38.2031951,33.9695476 36.6174842,30.5578706 32.5722442,30.5578706 Z M51.09856,30.5578706 C46.9755677,30.5578706 45.3395031,34.1019574 46.190366,41.190131 C46.2041613,41.3000496 46.2719197,41.3958654 46.3710292,41.4453598 C46.5111389,41.5153293 46.6771284,41.4765879 46.7731007,41.3611533 L46.8148081,41.2971931 C48.2734797,38.417691 49.7012882,36.9778585 51.09856,36.9778585 C52.4897797,36.9778585 53.8507265,38.4052452 55.1808398,41.2602876 C55.2289674,41.3605979 55.3242931,41.4299992 55.434537,41.4449902 C55.592951,41.4665314 55.7404,41.3721363 55.7912795,41.2269153 L55.806923,41.1617557 L55.8556925,40.7929014 C56.7295109,33.9695476 55.1438,30.5578706 51.09856,30.5578706 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1 @@
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M33.9367985,56.083055 L21.7503342,63.3925338 C19.8505861,64.5320086 17.3868093,63.9156853 16.2473345,62.0159372 C15.7137164,61.1262817 15.5455436,60.0644802 15.7781259,59.0534705 L18.9640288,45.2047011 C19.2960447,43.7614644 18.8058198,42.2527074 17.6889001,41.2802585 L6.97134809,31.9489955 C5.30058877,30.4943448 5.12539813,27.9606993 6.58004885,26.28994 C7.26126443,25.5075204 8.21912942,25.0194638 9.25252868,24.9282435 L23.4079892,23.6787121 C24.8831874,23.5484934 26.1666127,22.6160303 26.7463194,21.2532733 L32.3089723,8.1767567 C33.1761343,6.13825837 35.5316374,5.18870268 37.5701357,6.0558647 C38.5247682,6.46195826 39.2849342,7.22212421 39.6910277,8.1767567 L45.2536806,21.2532733 C45.8333873,22.6160303 47.1168126,23.5484934 48.5920108,23.6787121 L62.7474713,24.9282435 C64.9541662,25.123033 66.5851379,27.0698207 66.3903484,29.2765156 C66.2991281,30.3099149 65.8110716,31.2677799 65.0286519,31.9489955 L54.3110999,41.2802585 C53.1941802,42.2527074 52.7039553,43.7614644 53.0359712,45.2047011 L56.2218741,59.0534705 C56.7185246,61.2123553 55.3710173,63.365092 53.2121325,63.8617425 C52.2011228,64.0943248 51.1393213,63.9261519 50.2496658,63.3925338 L38.0632015,56.083055 C36.7932005,55.3213045 35.2067995,55.3213045 33.9367985,56.083055 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Filled / Page / page_superscript</title>
<g id="Filled-/-Page-/-page_superscript" stroke="none" fill="none" fill-rule="nonzero">
<path d="M22.9872808,53.6011203 L30.5501619,42.3368159 L30.8390219,42.3368159 L38.611983,53.6011203 C40.0037632,55.5567288 40.5814832,56 41.7631834,56 C43.5226037,56 44.7830838,54.8787845 44.7830838,53.3142978 C44.7830838,52.584204 44.4942238,51.9062597 43.7326837,50.8632686 L34.4103824,38.1127017 L43.6539037,24.8927889 C44.4679638,23.7715734 44.7043038,23.1718535 44.7043038,22.4939092 C44.7043038,20.9294225 43.5226037,19.7821322 41.8157034,19.7821322 C40.6340033,19.7821322 39.9775032,20.3036278 38.743283,22.1810119 L31.206662,33.7060641 L30.9178019,33.7060641 L23.3024009,22.1810119 C21.9894007,20.277553 21.3591606,19.7821322 20.1512004,19.7821322 C18.3917802,19.7821322 17.15756,20.9033477 17.15756,22.4939092 C17.15756,23.224003 17.4464201,23.9019473 18.1817002,24.9188636 L27.1626214,37.7998044 L18.0766601,50.8893434 C17.28886,52.0105588 17,52.6102788 17,53.3142978 C17,54.8527097 18.2079602,56 19.9148604,56 C21.0703006,56 21.6742806,55.530654 22.9872808,53.6011203 Z M56.5128233,19.9180017 L51.1135469,25.4347353 C49.620331,26.8877651 49.1275697,27.6587605 49.1275697,28.5483706 C49.1275697,29.7938247 50.0832279,30.6093007 51.5316473,30.6093007 L61.745244,30.6093007 C63.1488669,30.6093007 64,29.8827858 64,28.6818121 C64,27.4660116 63.1339348,26.7246699 61.745244,26.7246699 L55.5334659,26.7246699 L55.5334659,26.5170942 L59.7891312,22.2469657 C62.2828017,19.8153648 63.2981885,17.9768372 63.2981885,15.8862535 C63.2981885,12.4909083 60.2968246,10 56.1904809,10 C52.1140015,10 48.9782481,12.5798693 48.9782481,15.3376606 C48.9782481,16.4645001 49.7995169,17.2651492 50.9791574,17.2651492 C51.8452226,17.2651492 52.4126447,16.8796514 53.0696597,15.8714267 C53.7266747,14.5518383 54.6524685,13.9142844 55.921702,13.9142844 C57.4895787,13.9142844 58.549762,14.8928556 58.549762,16.3458854 C58.549762,17.4163829 57.9433297,18.4333555 56.5128233,19.9180017 Z" id="Shape" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Filled / Page / page_table</title>
<g id="Filled-/-Page-/-page_table" stroke="none" fill="none" fill-rule="nonzero">
<path d="M49.7751479,11.65 C56.720047,11.65 62.35,17.279953 62.35,24.2248521 L62.35,47.7751479 C62.35,54.720047 56.720047,60.35 49.7751479,60.35 L22.2248521,60.35 C15.279953,60.35 9.65,54.720047 9.65,47.7751479 L9.65,24.2248521 C9.65,17.279953 15.279953,11.65 22.2248521,11.65 L49.7751479,11.65 Z M37.781,45.746 L37.781,55.65 L49.7751479,55.65 C54.1243086,55.65 57.65,52.1243086 57.65,47.7751479 L57.649,45.746 L37.781,45.746 Z M14.349,45.746 L14.35,47.7751479 C14.35,52.1243086 17.8756914,55.65 22.2248521,55.65 L33.081,55.65 L33.081,45.746 L14.349,45.746 Z M37.781,30.409 L37.781,41.046 L57.649,41.046 L57.649,30.409 L37.781,30.409 Z M14.349,30.409 L14.349,41.046 L33.081,41.046 L33.081,30.409 L14.349,30.409 Z M37.781,16.35 L37.781,25.709 L57.649,25.709 L57.65,24.2248521 C57.65,19.8756914 54.1243086,16.35 49.7751479,16.35 L37.781,16.35 Z M22.2248521,16.35 C17.8756914,16.35 14.35,19.8756914 14.35,24.2248521 L14.349,25.709 L33.081,25.709 L33.081,16.35 L22.2248521,16.35 Z" id="Shape" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M49.1645052,13 C51.6074177,13 53.8736366,14.2734931 55.1439678,16.3601364 L65.0858707,32.690684 C66.3233511,34.7233666 66.3233511,37.2766334 65.0858707,39.309316 L55.1439678,55.6398636 C53.8736366,57.7265069 51.6074177,59 49.1645052,59 L17.4551738,59 C11.128656,59 6,53.871344 6,47.5448262 L6,24.4551738 C6,18.128656 11.128656,13 17.4551738,13 L49.1645052,13 Z M49.0718486,31.5374839 C46.4355279,31.5374839 44.2983677,33.6827862 44.2983677,36.3291506 C44.2983677,38.975515 46.4355279,41.1208173 49.0718486,41.1208173 C51.7081692,41.1208173 53.8453294,38.975515 53.8453294,36.3291506 C53.8453294,33.6827862 51.7081692,31.5374839 49.0718486,31.5374839 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 785 B

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M41.4165856,78.6439732 C46.3027463,78.6439732 50.9065409,77.7047991 55.2279695,75.8264509 C59.5493981,73.9481027 63.3552016,71.3638393 66.6453802,68.0736607 C69.9355588,64.7834821 72.5136838,60.983817 74.3797552,56.6746652 C76.2458266,52.3655134 77.1788624,47.7555804 77.1788624,42.8448661 C77.1788624,37.9587054 76.2396882,33.3549107 74.36134,29.0334821 C72.4829918,24.7120536 69.8987284,20.9001116 66.6085499,17.5976562 C63.3183713,14.2952009 59.5125677,11.7170759 55.1911391,9.86328125 C50.8697106,8.00948661 46.2659159,7.08258929 41.3797552,7.08258929 C36.4935945,7.08258929 31.8959382,8.00948661 27.5867865,9.86328125 C23.2776347,11.7170759 19.4718311,14.2952009 16.1693757,17.5976562 C12.8669204,20.9001116 10.282657,24.7120536 8.41658557,29.0334821 C6.55051414,33.3549107 5.61747843,37.9587054 5.61747843,42.8448661 C5.61747843,47.7555804 6.55665253,52.3655134 8.43500075,56.6746652 C10.313349,60.983817 12.8976124,64.7834821 16.1877909,68.0736607 C19.4779695,71.3638393 23.2776347,73.9481027 27.5867865,75.8264509 C31.8959382,77.7047991 36.5058713,78.6439732 41.4165856,78.6439732 Z M41.3797552,73.0457589 C38.7525231,73.0457589 36.1375677,72.6897321 33.5348891,71.9776786 C30.9322106,71.265625 28.470715,70.2466518 26.1504025,68.9207589 C23.83009,67.5948661 21.7737284,65.9866071 19.9813177,64.0959821 C21.282657,62.1071429 23.0075454,60.406808 25.1559829,58.9949777 C27.3044204,57.5831473 29.7597775,56.5027902 32.5220543,55.7539062 C35.2843311,55.0050223 38.2368981,54.6305804 41.3797552,54.6305804 C44.4980588,54.6305804 47.4322106,54.9988839 50.1822106,55.7354911 C52.9322106,56.4720982 55.3875677,57.546317 57.548282,58.9581473 C59.7089963,60.3699777 61.4400231,62.0825893 62.7413624,64.0959821 C60.9735052,65.9866071 58.9294204,67.5948661 56.6091079,68.9207589 C54.2887954,70.2466518 51.8272999,71.265625 49.2246213,71.9776786 C46.6219427,72.6897321 44.0069874,73.0457589 41.3797552,73.0457589 Z M41.3797552,48.7008929 C39.1208266,48.6763393 37.0828802,48.0809152 35.2659159,46.9146205 C33.4489516,45.7483259 32.0064293,44.1768973 30.938349,42.2003348 C29.8702686,40.2237723 29.3362284,37.9709821 29.3362284,35.4419643 C29.3362284,33.0848214 29.8702686,30.9241071 30.938349,28.9598214 C32.0064293,26.9955357 33.45509,25.4241071 35.2843311,24.2455357 C37.1135722,23.0669643 39.1453802,22.4776786 41.3797552,22.4776786 C43.6141302,22.4776786 45.6397999,23.0669643 47.4567641,24.2455357 C49.2737284,25.4241071 50.7223891,26.9955357 51.8027463,28.9598214 C52.8831034,30.9241071 53.423282,33.0848214 53.423282,35.4419643 C53.423282,37.9709821 52.8892418,40.2360491 51.8211615,42.2371652 C50.7530811,44.2382812 49.3105588,45.8219866 47.4935945,46.9882812 C45.6766302,48.1545759 43.6386838,48.7254464 41.3797552,48.7008929 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M58.5,9 C67.6126984,9 75,16.3873016 75,25.5 L75,58.5 C75,67.6126984 67.6126984,75 58.5,75 L25.5,75 C16.3873016,75 9,67.6126984 9,58.5 L9,25.5 C9,16.3873016 16.3873016,9 25.5,9 L58.5,9 Z M37.2857143,23.7794819 C34.7544092,23.7794819 32.6890677,25.7745093 32.5762797,28.2779744 L32.5714286,28.4937676 L32.5714286,55.5062324 C32.5714286,56.6090759 32.9580765,57.6770167 33.6640997,58.5242446 C35.2803926,60.4637961 38.1246017,60.7766823 40.1192778,59.274044 L40.3037265,59.127847 L56.5112053,45.6216146 C56.7302455,45.4390811 56.9322743,45.2370523 57.1148078,45.0180122 C58.7311007,43.0784606 58.5259674,40.2244558 56.6882669,38.5334469 L56.5112053,38.3783854 L40.3037265,24.872153 C39.4564986,24.1661298 38.3885578,23.7794819 37.2857143,23.7794819 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 881 B

View File

@@ -0,0 +1 @@
<svg width="84px" height="84px" viewBox="0 0 84 84" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M14.1787212,68 L46.9037753,68 C50.0934706,68 52.5824329,67.1163035 54.3706623,65.3489105 C56.1588916,63.5815175 57.0530062,61.0876669 57.0530062,57.8673587 L57.0530062,27.1027728 C57.0530062,23.902377 56.208381,21.4184825 54.5191305,19.6510895 C52.8298801,17.8836965 50.3807466,17 47.17173,17 L14.1787212,17 C11.0869878,17 8.61760095,17.8836965 6.77056057,19.6510895 C4.92352019,21.4184825 4,23.9035786 4,27.1063776 L4,57.962629 C4,61.1832805 4.89411466,63.6613385 6.68234397,65.3968031 C8.47057328,67.1322677 10.9693657,68 14.1787212,68 Z M61.4048557,52.0965527 L72.2750731,61.618949 C72.8679293,62.1225943 73.4750222,62.525047 74.0963518,62.8263071 C74.7176815,63.1275673 75.3322317,63.2781974 75.9400025,63.2781974 C77.1430024,63.2781974 78.1204186,62.8697367 78.8722512,62.0528152 C79.6240837,61.2358937 80,60.1701537 80,58.855595 L80,26.2206212 C80,24.9060626 79.6240837,23.8404083 78.8722512,23.0236585 C78.1204186,22.2069087 77.1430024,21.7985338 75.9400025,21.7985338 C75.3298589,21.7985338 74.7152239,21.9495931 74.0960976,22.2517115 C73.4769713,22.55383 72.8699631,22.9558535 72.2750731,23.4577822 L61.4048557,32.95031 L61.4048557,52.0965527 Z" fill="#FFFFFF"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -28,6 +28,26 @@
<file alias="icons/settings/star.svg">../../icons/settings/star.svg</file>
<file alias="icons/settings/starmini.svg">../../icons/settings/starmini.svg</file>
<file alias="icons/settings/premium_dollar.svg">../../icons/settings/premium_dollar.svg</file>
<file alias="icons/premium/folder.svg">../../icons/premium/folder.svg</file>
<file alias="icons/premium/bubble.svg">../../icons/premium/bubble.svg</file>
<file alias="icons/premium/settings.svg">../../icons/premium/settings.svg</file>
<file alias="icons/premium/smile1.svg">../../icons/premium/smile1.svg</file>
<file alias="icons/premium/smile2.svg">../../icons/premium/smile2.svg</file>
<file alias="icons/premium/like.svg">../../icons/premium/like.svg</file>
<file alias="icons/premium/adsbubble.svg">../../icons/premium/adsbubble.svg</file>
<file alias="icons/premium/noads.svg">../../icons/premium/noads.svg</file>
<file alias="icons/premium/video.svg">../../icons/premium/video.svg</file>
<file alias="icons/premium/video2.svg">../../icons/premium/video2.svg</file>
<file alias="icons/premium/user.svg">../../icons/premium/user.svg</file>
<file alias="icons/premium/tag.svg">../../icons/premium/tag.svg</file>
<file alias="icons/premium/check.svg">../../icons/premium/check.svg</file>
<file alias="icons/premium/star.svg">../../icons/premium/star.svg</file>
<file alias="icons/premium/list.svg">../../icons/premium/list.svg</file>
<file alias="icons/premium/math.svg">../../icons/premium/math.svg</file>
<file alias="icons/premium/table.svg">../../icons/premium/table.svg</file>
<file alias="icons/premium/superscript.svg">../../icons/premium/superscript.svg</file>
<file alias="icons/premium/bold.svg">../../icons/premium/bold.svg</file>
<file alias="icons/premium/code.svg">../../icons/premium/code.svg</file>
<file alias="icons/tray/monochrome.svg">../../icons/tray_monochrome.svg</file>
<file alias="icons/tray/monochrome_attention.svg">../../icons/tray_monochrome_attention.svg</file>
<file alias="icons/tray/monochrome_mute.svg">../../icons/tray_monochrome_mute.svg</file>

View File

@@ -129,6 +129,20 @@ premiumDotPadding: margins(4px, 4px, 4px, 4px);
premiumDotsMargin: margins(0px, 5px, 0px, 6px);
premiumVideoWidth: 182px;
premiumPromoParticlesInset: 30px;
premiumPromoParticlesDeviceSkip: 10px;
premiumPromoIconSmall: 14px;
premiumPromoIconMedium: 15px;
premiumPromoIconLarge: 16px;
premiumPromoIconWide: 18px;
premiumPromoStarSmall: 4px;
premiumPromoStarMedium: 10px;
premiumPromoStarLarge: 12px;
premiumPromoMatrixCell: 16px;
premiumPromoSpeedInset: 100px;
premiumPromoSpeedLine: 30px;
premiumPromoHelloFont: font(24px bold);
// Graphics.
defaultPremiumBubble: PremiumBubble {

View File

@@ -0,0 +1,832 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "ui/effects/premium_promo_particles.h"
#include "ui/effects/animation_value.h"
#include "ui/effects/drifting_particles.h"
#include "ui/painter.h"
#include "ui/rect.h"
#include "styles/style_premium.h"
#include <QtCore/QtMath>
#include <QtSvg/QSvgRenderer>
namespace Ui::Premium {
namespace {
constexpr auto kBrightAlpha = 90;
constexpr auto kIconAlpha = 30;
constexpr auto kBrightParticleAlpha = 255;
constexpr auto kIconParticleAlpha = 120;
constexpr auto kMinLifeTime = crl::time(2000);
constexpr auto kRandLifeTime = 1000;
constexpr auto kSpeedDivider = 660.;
constexpr auto kSpeedBase = 4.;
constexpr auto kMinDelta = crl::time(4);
constexpr auto kMaxDelta = crl::time(50);
constexpr auto kDistributionTries = 10;
constexpr auto kIconParticlesCount = 40;
constexpr auto kStarParticlesCount = 400;
constexpr auto kSpeedLinesCount = 200;
constexpr auto kHelloWordsCount = 25;
constexpr auto kStarsRectFactor = 0.4;
constexpr auto kStarsCornerFactor = 0.98;
constexpr auto kStarsSpeedScale = 4.;
constexpr auto kStarsBlurRadius = 2;
constexpr auto kMatrixGlyphsCount = 16;
constexpr auto kMatrixStepTime = crl::time(50);
constexpr auto kMatrixMinLength = 4;
constexpr auto kMatrixRandLength = 6;
constexpr auto kMatrixSpawnChance = 4;
constexpr auto kMatrixMinAlpha = 0.2;
constexpr auto kMatrixSwapTime = crl::time(150);
constexpr auto kMatrixRandSwapTime = 300;
constexpr auto kSpeedLineAlpha = 80;
constexpr auto kSpeedLineScale = 150.;
constexpr auto kSpeedLineMinScale = 0.02;
constexpr auto kHelloMinDuration = crl::time(2250);
constexpr auto kHelloRandDuration = 2250;
constexpr auto kHelloMinScale = 0.6;
constexpr auto kHelloRandScale = 0.45;
constexpr auto kHelloLongScale = 0.6;
constexpr auto kHelloMediumScale = 0.75;
constexpr auto kHelloLongLength = 7;
constexpr auto kHelloMediumLength = 5;
constexpr auto kVerticalFactor = 0.1;
constexpr auto kHelloOversample = 2;
constexpr auto kSpeedTimestamps = std::array{
kSpeedLineMinScale, 1., 1., 1., 1., 1., 1., 1., 1., kSpeedLineMinScale,
};
[[nodiscard]] const std::vector<QString> &HelloWords() {
static const auto result = std::vector<QString>{
u"Hello"_q, u"Привіт"_q, u"Привет"_q, u"Bonjour"_q, u"Hola"_q,
u"Ciao"_q, u"Olá"_q, u"여보세요"_q, u"你好"_q, u"Salve"_q,
u"Sveiki"_q, u"Halo"_q, u"გამარჯობა"_q, u"Hallå"_q, u"Salam"_q,
u"Tere"_q, u"Dia dhuit"_q, u"こんにちは"_q, u"Сайн уу"_q,
u"Bongu"_q, u"Ahoj"_q, u"γεια"_q, u"Zdravo"_q, u"नमस्ते"_q,
u"Habari"_q, u"Hallo"_q, u"ជំរាបសួរ"_q, u"مرحبًا"_q, u"ನಮಸ್ಕಾರ"_q,
u"Салам"_q, u"Silav li wir"_q, u"سڵاو"_q, u"Kif inti"_q,
u"Talofa"_q, u"Thobela"_q, u"हॅलो"_q, u"ሰላም"_q, u"Здраво"_q,
u"ഹലോ"_q, u"ہیلو"_q, u"ꯍꯦꯜꯂꯣ"_q, u"Alô"_q, u"வணக்கம்"_q,
u"Mhoro"_q, u"Moni"_q, u"Alo"_q, u"สวัสดี"_q, u"Salom"_q,
u"Բարեւ"_q,
};
return result;
}
[[nodiscard]] QImage CreateFrame(int size) {
const auto ratio = style::DevicePixelRatio();
auto result = QImage(
Size(size) * ratio,
QImage::Format_ARGB32_Premultiplied);
result.setDevicePixelRatio(ratio);
result.fill(Qt::transparent);
return result;
}
[[nodiscard]] QImage RenderIconSprite(
const QString &path,
int size,
QColor color) {
auto result = CreateFrame(size);
const auto full = Rect(Size(float64(size)));
auto renderer = QSvgRenderer(path);
auto p = QPainter(&result);
renderer.render(&p, full);
p.setCompositionMode(QPainter::CompositionMode_SourceIn);
p.fillRect(full, color);
p.end();
return result;
}
struct SpriteConfig {
QString path;
int size = 0;
bool randomRotate = false;
bool bright = false;
};
[[nodiscard]] DriftingSprite MakeSprite(
const SpriteConfig &sprite,
float64 corner,
bool roundEffect,
bool blur) {
const auto color = anim::with_alpha(
Qt::white,
(sprite.bright ? kBrightAlpha : kIconAlpha) / 255.);
return {
.image = (sprite.path.isEmpty()
? FourPointStarImage({
.size = sprite.size,
.corner = corner,
.cornerRadius = roundEffect ? (sprite.size / 5.) : 0.,
.blurRadius = blur ? kStarsBlurRadius : 0,
.color = color,
})
: RenderIconSprite(sprite.path, sprite.size, color)),
.maxAlpha = (sprite.bright
? kBrightParticleAlpha
: kIconParticleAlpha),
.randomRotate = sprite.randomRotate,
};
}
class StarParticles final : public PromoParticlesPainter {
public:
struct Config {
std::vector<SpriteConfig> sprites;
int count = kIconParticlesCount;
float64 corner = kStarsCornerFactor;
float64 speedScale = kStarsSpeedScale;
bool orbit = false;
bool blur = false;
bool roundEffect = true;
bool checkBounds = false;
bool aroundDevice = true;
};
explicit StarParticles(Config config);
void setGeometry(QRect outer, QRect device) override;
void paint(QPainter &p) override;
private:
const bool _aroundDevice = false;
DriftingParticles _particles;
};
StarParticles::StarParticles(Config config)
: _aroundDevice(config.aroundDevice)
, _particles([&] {
auto sprites = std::vector<DriftingSprite>();
sprites.reserve(config.sprites.size());
for (const auto &sprite : config.sprites) {
sprites.push_back(MakeSprite(
sprite,
config.corner,
config.roundEffect,
config.blur));
}
return DriftingParticles::Config{
.sprites = std::move(sprites),
.count = config.count,
.speed = style::ConvertScaleExact(kSpeedBase) * config.speedScale,
.orbit = config.orbit,
.checkBounds = config.checkBounds,
.spawnInCircle = config.aroundDevice,
.spread = !config.aroundDevice,
};
}()) {
}
void StarParticles::setGeometry(QRect outer, QRect device) {
const auto field = [&] {
if (!_aroundDevice) {
const auto inset = float64(st::premiumPromoParticlesInset);
return QRectF(outer).marginsRemoved(Margins(inset));
}
const auto half = base::SafeRound(device.width() * kStarsRectFactor);
const auto center = rect::center(device);
return Rect(center.x() - half, center.y() - half, Size(half * 2.));
}();
const auto skip = float64(st::premiumPromoParticlesDeviceSkip);
_particles.setGeometry(
field,
outer,
QRectF(device).marginsRemoved(Margins(skip)));
}
void StarParticles::paint(QPainter &p) {
_particles.paint(p);
}
class MatrixParticles final : public PromoParticlesPainter {
public:
MatrixParticles();
void setGeometry(QRect outer, QRect device) override;
void paint(QPainter &p) override;
private:
struct Drop {
int y = 0;
int length = 0;
crl::time time = 0;
};
struct Glyph {
int index = 0;
int nextIndex = 0;
crl::time nextTime = 0;
};
void resetDrop(Drop &drop, crl::time now);
void resetGlyph(Glyph &glyph, crl::time now);
void paintGlyph(
QPainter &p,
Glyph &glyph,
QPointF position,
crl::time now,
float64 alpha);
const int _cell = 0;
std::vector<QImage> _glyphs;
std::vector<std::vector<Drop>> _columns;
std::vector<std::vector<Glyph>> _cells;
QRect _outer;
QRectF _exclude;
ParticlesRandom _random;
};
MatrixParticles::MatrixParticles()
: _cell(st::premiumPromoMatrixCell) {
const auto font = style::font(
_cell,
style::FontFlag::Bold,
st::normalFont->family());
_glyphs.reserve(kMatrixGlyphsCount);
for (auto i = 0; i != kMatrixGlyphsCount; ++i) {
const auto text = QString(
QChar((i < 10) ? ('0' + i) : ('A' + (i - 10))));
auto image = CreateFrame(_cell);
auto p = QPainter(&image);
p.setFont(font);
p.setPen(anim::with_alpha(Qt::white, kIconAlpha / 255.));
p.drawText(
QPointF((_cell - font->width(text)) / 2., _cell),
text);
p.end();
_glyphs.push_back(std::move(image));
}
}
void MatrixParticles::setGeometry(QRect outer, QRect device) {
_outer = outer;
const auto skip = float64(st::premiumPromoMatrixCell);
_exclude = QRectF(device).marginsRemoved(Margins(skip));
const auto now = crl::now();
const auto nx = (_cell > 0) ? (outer.width() / _cell) : 0;
const auto ny = (_cell > 0) ? (outer.height() / _cell) : 0;
if (nx <= 0 || ny <= 0) {
_columns.clear();
_cells.clear();
return;
}
_columns.assign(nx + 1, std::vector<Drop>());
_cells.assign(nx + 1, std::vector<Glyph>(ny + 1));
for (auto x = 0; x != nx + 1; ++x) {
auto drop = Drop();
resetDrop(drop, now);
drop.y = _random.index(ny);
_columns[x].push_back(drop);
for (auto &glyph : _cells[x]) {
resetGlyph(glyph, now);
glyph.index = _random.index(kMatrixGlyphsCount);
}
}
}
void MatrixParticles::resetDrop(Drop &drop, crl::time now) {
drop.y = 0;
drop.time = now;
drop.length = kMatrixMinLength + _random.index(kMatrixRandLength);
}
void MatrixParticles::resetGlyph(Glyph &glyph, crl::time now) {
glyph.index = glyph.nextIndex;
glyph.nextIndex = _random.index(kMatrixGlyphsCount);
glyph.nextTime = now + kMatrixSwapTime + _random.index(
kMatrixRandSwapTime);
}
void MatrixParticles::paintGlyph(
QPainter &p,
Glyph &glyph,
QPointF position,
crl::time now,
float64 alpha) {
const auto left = glyph.nextTime - now;
if (left >= kMatrixSwapTime) {
p.setOpacity(alpha);
p.drawImage(position, _glyphs[glyph.index]);
return;
}
const auto progress = std::clamp(
1. - (left / float64(kMatrixSwapTime)),
0.,
1.);
p.setOpacity(alpha * (1. - progress));
p.drawImage(position, _glyphs[glyph.index]);
p.setOpacity(alpha * progress);
p.drawImage(position, _glyphs[glyph.nextIndex]);
if (progress >= 1.) {
resetGlyph(glyph, now);
}
}
void MatrixParticles::paint(QPainter &p) {
if (_columns.empty()) {
return;
}
const auto now = crl::now();
const auto nx = int(_columns.size()) - 1;
const auto ny = int(_cells.front().size()) - 1;
const auto opacity = p.opacity();
for (auto x = 0; x != nx + 1; ++x) {
auto &drops = _columns[x];
for (auto i = 0; i != int(drops.size()); ++i) {
auto &drop = drops[i];
if (now - drop.time > kMatrixStepTime) {
++drop.y;
drop.time = now;
if (drop.y - drop.length >= ny) {
if (drops.size() == 1) {
resetDrop(drop, now);
} else {
drops.erase(drops.begin() + i);
--i;
continue;
}
}
if (drop.y > drop.length
&& i == int(drops.size()) - 1
&& _random.chance(kMatrixSpawnChance)) {
auto added = Drop();
resetDrop(added, now);
drops.push_back(added);
}
}
const auto bottom = drops[i].y;
const auto length = drops[i].length;
const auto till = std::min(bottom, ny + 1);
for (auto y = std::max(0, bottom - length); y < till; ++y) {
const auto position = QPointF(_cell * x, _cell * y);
if (_exclude.contains(position)) {
continue;
}
const auto alpha = std::clamp(
kMatrixMinAlpha
+ (1. - kMatrixMinAlpha)
* (1. - (bottom - y) / float64(length - 1)),
0.,
1.);
paintGlyph(p, _cells[x][y], position, now, opacity * alpha);
}
}
}
p.setOpacity(opacity);
}
class SpeedLineParticles final : public PromoParticlesPainter {
public:
SpeedLineParticles() = default;
void setGeometry(QRect outer, QRect device) override;
void setVideoProgress(float64 progress) override;
void paint(QPainter &p) override;
private:
struct Particle {
crl::time lifeTime = 0;
float64 x = 0.;
float64 y = 0.;
float64 vecX = 0.;
float64 vecY = 0.;
};
void generate(Particle &particle, crl::time now, bool reset);
std::vector<Particle> _particles = std::vector<Particle>(
kSpeedLinesCount);
std::vector<QLineF> _lines;
QRectF _rect;
QRectF _screen;
crl::time _lastTime = 0;
float64 _speedScale = kSpeedLineScale;
ParticlesRandom _random;
};
void SpeedLineParticles::setGeometry(QRect outer, QRect device) {
const auto inset = float64(st::premiumPromoSpeedInset);
_screen = outer;
_rect = QRectF(outer).marginsRemoved(
Margins(inset)
).translated(0, outer.height() * kVerticalFactor);
const auto now = crl::now();
for (auto &particle : _particles) {
generate(particle, now, true);
}
}
void SpeedLineParticles::setVideoProgress(float64 progress) {
const auto count = int(kSpeedTimestamps.size());
const auto step = 1. / (count - 1);
const auto clamped = std::clamp(progress, 0., 1.);
const auto from = std::min(int(clamped / step), count - 1);
const auto till = from + 1;
const auto inner = (clamped - from * step) / step;
const auto video = (till < count)
? (kSpeedTimestamps[from] * (1. - inner)
+ kSpeedTimestamps[till] * inner)
: kSpeedTimestamps[from];
_speedScale = kSpeedLineScale * video;
}
void SpeedLineParticles::generate(
Particle &particle,
crl::time now,
bool reset) {
particle.lifeTime = now + kMinLifeTime + _random.index(kRandLifeTime);
const auto &from = reset ? _screen : _rect;
particle.x = _random.value(from.left(), from.right());
particle.y = _random.value(from.top(), from.bottom());
const auto center = rect::center(_rect);
const auto angle = std::atan2(
particle.x - center.x(),
particle.y - center.y());
particle.vecX = std::sin(angle);
particle.vecY = std::cos(angle);
}
void SpeedLineParticles::paint(QPainter &p) {
if (_rect.isEmpty()) {
return;
}
const auto now = crl::now();
const auto delta = float64(
std::clamp(now - _lastTime, kMinDelta, kMaxDelta));
_lastTime = now;
const auto speed = style::ConvertScaleExact(kSpeedBase)
* (delta / kSpeedDivider)
* _speedScale;
const auto length = float64(st::premiumPromoSpeedLine);
_lines.clear();
_lines.reserve(_particles.size());
for (auto &particle : _particles) {
_lines.push_back(QLineF(
particle.x,
particle.y,
particle.x + length * particle.vecX,
particle.y + length * particle.vecY));
particle.x += particle.vecX * speed;
particle.y += particle.vecY * speed;
if (now > particle.lifeTime
|| !_screen.contains(particle.x, particle.y)) {
generate(particle, now, false);
}
}
auto hq = PainterHighQualityEnabler(p);
p.setPen(anim::with_alpha(Qt::white, kSpeedLineAlpha / 255.));
p.drawLines(_lines.data(), int(_lines.size()));
}
class HelloParticles final : public PromoParticlesPainter {
public:
HelloParticles() = default;
void setGeometry(QRect outer, QRect device) override;
void paint(QPainter &p) override;
private:
struct Particle {
QString word;
float64 x = 0.;
float64 y = 0.;
float64 scale = 1.;
crl::time bornTime = 0;
crl::time duration = 0;
int alpha = 0;
bool set = false;
};
void generate(Particle &particle, int index, crl::time now, bool reset);
[[nodiscard]] const QImage &lookupWord(const QString &word);
[[nodiscard]] QSizeF wordSize(const QString &word);
std::vector<Particle> _particles = std::vector<Particle>(
kHelloWordsCount);
base::flat_map<QString, QImage> _words;
QRectF _rect;
ParticlesRandom _random;
};
const QImage &HelloParticles::lookupWord(const QString &word) {
const auto i = _words.find(word);
if (i != end(_words)) {
return i->second;
}
const auto &base = st::premiumPromoHelloFont;
const auto font = style::font(
base->size() * kHelloOversample,
base->flags(),
base->family());
const auto width = std::max(font->width(word), 1);
const auto height = std::max(font->height, 1);
auto image = QImage(
QSize(width, height) * style::DevicePixelRatio(),
QImage::Format_ARGB32_Premultiplied);
image.setDevicePixelRatio(style::DevicePixelRatio() * kHelloOversample);
image.fill(Qt::transparent);
auto p = QPainter(&image);
auto hq = PainterHighQualityEnabler(p);
p.scale(1. / kHelloOversample, 1. / kHelloOversample);
p.setFont(font);
p.setPen(Qt::white);
p.drawText(QPointF(0, font->ascent), word);
p.end();
return _words.emplace(word, std::move(image)).first->second;
}
QSizeF HelloParticles::wordSize(const QString &word) {
const auto &image = lookupWord(word);
return QSizeF(image.size()) / image.devicePixelRatio();
}
void HelloParticles::setGeometry(QRect outer, QRect device) {
const auto inset = outer.height() * kVerticalFactor;
_rect = QRectF(outer).marginsRemoved(QMarginsF(0, inset, 0, inset));
const auto now = crl::now();
auto index = 0;
for (auto &particle : _particles) {
generate(particle, index++, now, true);
}
}
void HelloParticles::generate(
Particle &particle,
int index,
crl::time now,
bool reset) {
const auto &words = HelloWords();
particle.word = words[_random.index(int(words.size()))];
particle.duration = kHelloMinDuration + _random.index(
kHelloRandDuration);
particle.scale = _random.value(
kHelloMinScale,
kHelloMinScale + kHelloRandScale);
if (particle.word.size() > kHelloLongLength) {
particle.scale *= kHelloLongScale;
} else if (particle.word.size() > kHelloMediumLength) {
particle.scale *= kHelloMediumScale;
}
const auto size = wordSize(particle.word);
const auto center = rect::center(_rect);
auto minX = _rect.left() + size.width() / 4.;
auto maxX = rect::right(_rect) - size.width() / 4.;
if (!(index % 2)) {
maxX = center.x() - size.width() / 2.;
} else {
minX = center.x() + size.width() / 2.;
}
if (maxX <= minX) {
maxX = minX + 1.;
}
auto bestDistance = 0.;
auto best = QPointF(
_random.value(minX, maxX),
_random.value(_rect.top(), _rect.bottom()));
for (auto i = 0; i != kDistributionTries; ++i) {
const auto candidate = QPointF(
_random.value(minX, maxX),
_random.value(_rect.top(), _rect.bottom()));
auto minDistance = std::numeric_limits<float64>::max();
for (const auto &other : _particles) {
if (!other.set) {
continue;
}
const auto width = wordSize(other.word).width() * other.scale;
const auto dx = std::min(
std::abs(other.x + width * 1.1 - candidate.x()),
std::abs(other.x - candidate.x()));
const auto dy = other.y - candidate.y();
minDistance = std::min(minDistance, dx * dx + dy * dy);
}
if (minDistance > bestDistance) {
bestDistance = minDistance;
best = candidate;
}
}
particle.x = best.x();
particle.y = best.y();
particle.alpha = int(base::SafeRound(
_random.value(0.5, 1.) * kBrightParticleAlpha));
particle.bornTime = now - (reset
? crl::time(_random.value() * 0.9 * particle.duration)
: 0);
particle.set = true;
}
void HelloParticles::paint(QPainter &p) {
if (_rect.isEmpty()) {
return;
}
const auto now = crl::now();
auto hq = PainterHighQualityEnabler(p);
const auto opacity = p.opacity();
auto index = 0;
for (auto &particle : _particles) {
const auto &image = lookupWord(particle.word);
const auto size = QSizeF(image.size()) / image.devicePixelRatio();
const auto progress = std::clamp(
(now - particle.bornTime) / float64(particle.duration),
0.,
1.);
const auto shift = progress - 0.5;
const auto wave = 1. - 4. * shift * shift;
const auto scale = particle.scale * (0.7 + 0.4 * wave);
p.save();
p.translate(particle.x, particle.y);
p.scale(scale, scale);
p.setOpacity(opacity * (particle.alpha / 255.) * wave);
p.drawImage(
QRectF(
-size.width() / 2.,
-size.height() / 2.,
size.width(),
size.height()),
image);
p.restore();
if (progress >= 1.) {
generate(particle, index, now, false);
}
++index;
}
p.setOpacity(opacity);
}
[[nodiscard]] std::vector<SpriteConfig> IconSprites(
std::vector<QString> names,
std::vector<int> sizes,
bool randomRotate) {
Expects(names.size() == sizes.size());
auto result = std::vector<SpriteConfig>();
result.reserve(names.size());
for (auto i = 0; i != int(names.size()); ++i) {
result.push_back({
.path = u":/gui/icons/premium/%1.svg"_q.arg(names[i]),
.size = sizes[i],
.randomRotate = randomRotate,
});
}
return result;
}
[[nodiscard]] std::vector<int> DefaultIconSizes() {
return {
st::premiumPromoIconSmall,
st::premiumPromoIconLarge,
st::premiumPromoIconMedium,
};
}
[[nodiscard]] std::vector<int> WideIconSizes() {
return {
st::premiumPromoIconSmall,
st::premiumPromoIconWide,
st::premiumPromoIconWide,
};
}
[[nodiscard]] std::unique_ptr<PromoParticlesPainter> MakeIcons(
std::vector<QString> names,
std::vector<int> sizes,
bool randomRotate = true,
bool orbit = false) {
return std::make_unique<StarParticles>(StarParticles::Config{
.sprites = IconSprites(
std::move(names),
std::move(sizes),
randomRotate),
.orbit = orbit,
.aroundDevice = false,
});
}
[[nodiscard]] std::unique_ptr<PromoParticlesPainter> MakeStars() {
return std::make_unique<StarParticles>(StarParticles::Config{
.sprites = {
{ .size = st::premiumPromoStarSmall, .bright = true },
{ .size = st::premiumPromoStarLarge, .bright = true },
{ .size = st::premiumPromoStarMedium, .bright = true },
},
.count = kStarParticlesCount,
.orbit = true,
.blur = true,
.roundEffect = false,
.checkBounds = true,
});
}
[[nodiscard]] std::unique_ptr<PromoParticlesPainter> MakeProfileBadge() {
const auto star = u":/gui/icons/settings/star.svg"_q;
return std::make_unique<StarParticles>(StarParticles::Config{
.sprites = {
{ .size = st::premiumPromoIconSmall, .bright = true },
{
.path = star,
.size = st::premiumPromoIconLarge,
.randomRotate = true,
.bright = true,
},
{
.path = star,
.size = st::premiumPromoIconMedium,
.randomRotate = true,
.bright = true,
},
},
.aroundDevice = false,
});
}
} // namespace
std::unique_ptr<PromoParticlesPainter> MakePromoParticles(
PromoParticles type) {
switch (type) {
case PromoParticles::Stars:
return MakeStars();
case PromoParticles::Matrix:
return std::make_unique<MatrixParticles>();
case PromoParticles::SpeedLines:
return std::make_unique<SpeedLineParticles>();
case PromoParticles::Hello:
return std::make_unique<HelloParticles>();
case PromoParticles::ChatManagement:
return MakeIcons(
{ u"folder"_q, u"bubble"_q, u"settings"_q },
DefaultIconSizes());
case PromoParticles::Emoji:
return MakeIcons(
{ u"smile1"_q, u"smile2"_q, u"like"_q },
DefaultIconSizes());
case PromoParticles::Ads:
return MakeIcons(
{ u"adsbubble"_q, u"like"_q, u"noads"_q },
WideIconSizes());
case PromoParticles::Userpics:
return MakeIcons(
{ u"video2"_q, u"video"_q, u"user"_q },
DefaultIconSizes());
case PromoParticles::Tags:
return MakeIcons(
{ u"tag"_q, u"check"_q, u"star"_q },
WideIconSizes());
case PromoParticles::Formatting:
return MakeIcons({
u"list"_q,
u"math"_q,
u"table"_q,
u"superscript"_q,
u"bold"_q,
u"code"_q,
}, {
st::premiumPromoIconSmall,
st::premiumPromoIconWide,
st::premiumPromoIconWide,
st::premiumPromoIconWide,
st::premiumPromoIconWide,
st::premiumPromoIconWide,
}, false, true);
case PromoParticles::ProfileBadge:
return MakeProfileBadge();
}
Unexpected("Type in Ui::Premium::MakePromoParticles.");
}
} // namespace Ui::Premium

View File

@@ -0,0 +1,41 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
namespace Ui::Premium {
enum class PromoParticles : uchar {
Stars,
Matrix,
SpeedLines,
Hello,
ChatManagement,
Emoji,
Ads,
Userpics,
Tags,
Formatting,
ProfileBadge,
};
class PromoParticlesPainter {
public:
virtual ~PromoParticlesPainter() = default;
virtual void setGeometry(QRect outer, QRect device) = 0;
virtual void setVideoProgress(float64 progress) {
}
virtual void paint(QPainter &p) = 0;
};
[[nodiscard]] std::unique_ptr<PromoParticlesPainter> MakePromoParticles(
PromoParticles type);
} // namespace Ui::Premium

View File

@@ -561,6 +561,8 @@ PRIVATE
ui/effects/premium_diamond_renderer.h
ui/effects/premium_graphics.cpp
ui/effects/premium_graphics.h
ui/effects/premium_promo_particles.cpp
ui/effects/premium_promo_particles.h
ui/effects/premium_star.cpp
ui/effects/premium_star.h
ui/effects/premium_star_model.cpp