mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-01-15 23:08:40 +00:00
451 lines
24 KiB
Dart
451 lines
24 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:lottie/lottie.dart';
|
||
|
||
// animations from: https://googlefonts.github.io/noto-emoji-animation/
|
||
// from https://github.com/eitanliu/emoji_regex/tree/master
|
||
|
||
RegExp emojiRegex() => RegExp(
|
||
r'[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC3\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC08\uDC26](?:\u200D\u2B1B)?|[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)');
|
||
|
||
bool isEmoji(String character) {
|
||
final matches = emojiRegex().allMatches(character);
|
||
if (matches.length == 1) {
|
||
final match = matches.first;
|
||
return match.start == 0 && match.end == character.length;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
class EmojiAnimation extends StatelessWidget {
|
||
final String emoji;
|
||
static final Map<String, String> animatedIcons = {
|
||
"❤": "red_heart.json",
|
||
"😂": "joy.json",
|
||
"🔥": "fire.json",
|
||
"💪": "muscle.json",
|
||
"😭": "loudly-crying.json",
|
||
"🤯": "mind-blown.json",
|
||
"❤️🔥": "red_heart_fire.json",
|
||
"😀": "smile.json",
|
||
"😃": "smile-with-big-eyes.json",
|
||
"😄": "grin.json",
|
||
"😁": "grinning.json",
|
||
"😆": "laughing.json",
|
||
"😅": "grin-sweat.json",
|
||
"🤣": "rofl.json",
|
||
"😉": "wink.json",
|
||
"😗": "kissing.json",
|
||
"😙": "kissing-smiling-eyes.json",
|
||
"😚": "kissing-closed-eyes.json",
|
||
"😘": "kissing-heart.json",
|
||
"🥰": "heart-face.json",
|
||
"😍": "heart-eyes.json",
|
||
"🤩": "star-struck.json",
|
||
"🥳": "partying-face.json",
|
||
"🙃": "upside-down-face.json",
|
||
"🙂": "slightly-happy.json",
|
||
"🥲": "happy-cry.json",
|
||
"😊": "blush.json",
|
||
"😌": "relieved.json",
|
||
"😏": "smirk.json",
|
||
"🤤": "drool.json",
|
||
"😋": "yum.json",
|
||
"😛": "stuck-out-tongue.json",
|
||
"😝": "squinting-tongue.json",
|
||
"😜": "winky-tongue.json",
|
||
"🤪": "zany-face.json",
|
||
"🥴": "woozy.json",
|
||
"😔": "pensive.json",
|
||
"🥺": "pleading.json",
|
||
"😬": "grimacing.json",
|
||
"😑": "expressionless.json",
|
||
"😐": "neutral-face.json",
|
||
"😶": "mouth-none.json",
|
||
"🤐": "zipper-face.json",
|
||
"🤔": "thinking-face.json",
|
||
"🤫": "shushing-face.json",
|
||
"🤭": "smiling-eyes-with-hand-over-mouth.json",
|
||
"🥱": "yawn.json",
|
||
"🤗": "hug-face.json",
|
||
"😱": "screaming.json",
|
||
"🤨": "raised-eyebrow.json",
|
||
"🧐": "monocle.json",
|
||
"😒": "unamused.json",
|
||
"🙄": "rolling-eyes.json",
|
||
"😤": "triumph.json",
|
||
"😠": "angry.json",
|
||
"😡": "rage.json",
|
||
"🤬": "cursing.json",
|
||
"😞": "sad.json",
|
||
"😓": "sweat.json",
|
||
"😟": "worried.json",
|
||
"😥": "concerned.json",
|
||
"😢": "cry.json",
|
||
"🙁": "frown.json",
|
||
"😕": "slightly-frowning.json",
|
||
"😰": "anxious-with-sweat.json",
|
||
"😨": "scared.json",
|
||
"😧": "anguished.json",
|
||
"😦": "gasp.json",
|
||
"😮": "mouth-open.json",
|
||
"😯": "surprised.json",
|
||
"😲": "astonished.json",
|
||
"😳": "flushed.json",
|
||
"😖": "scrunched-mouth.json",
|
||
"😣": "scrunched-eyes.json",
|
||
"😩": "weary.json",
|
||
"😫": "distraught.json",
|
||
"😵": "x-eyes.json",
|
||
"🥶": "cold-face.json",
|
||
"🥵": "hot-face.json",
|
||
"🤢": "sick.json",
|
||
"🤮": "vomit.json",
|
||
"😴": "sleep.json",
|
||
"😪": "sleepy.json",
|
||
"🤧": "sneeze.json",
|
||
"🤒": "thermometer-face.json",
|
||
"🤕": "bandage-face.json",
|
||
"😷": "mask.json",
|
||
"🤥": "liar.json",
|
||
"😇": "halo.json",
|
||
"🤠": "cowboy.json",
|
||
"🤑": "money-face.json",
|
||
"🤓": "nerd-face.json",
|
||
"😎": "sunglasses-face.json",
|
||
"🥸": "disguise.json",
|
||
"🤡": "clown.json",
|
||
"💩": "poop.json",
|
||
"😈": "imp-smile.json",
|
||
"👿": "imp-frown.json",
|
||
"👻": "ghost.json",
|
||
"💀": "skull.json",
|
||
"⛄": "snowman.json",
|
||
"🎃": "jack-o-lantern.json",
|
||
"🤖": "robot.json",
|
||
"👽": "alien.json",
|
||
"👾": "alien-monster.json",
|
||
"🌞": "sun-with-face.json",
|
||
"🌛": "moon-face-first-quarter.json",
|
||
"🌜": "moon-face-last-quarter.json",
|
||
"😺": "smiley-cat.json",
|
||
"😸": "smile-cat.json",
|
||
"😹": "joy-cat.json",
|
||
"😻": "heart-eyes-cat.json",
|
||
"😼": "smirk-cat.json",
|
||
"😽": "kissing-cat.json",
|
||
"🙀": "scream-cat.json",
|
||
"😿": "crying-cat-face.json",
|
||
"😾": "pouting-cat.json",
|
||
"🙈": "see-no-evil-monkey.json",
|
||
"🙉": "hear-no-evil-monkey.json",
|
||
"🙊": "speak-no-evil-monkey.json",
|
||
"🌟": "glowing-star.json",
|
||
"✨": "sparkles.json",
|
||
"⚡": "electricity.json",
|
||
"💥": "collision.json",
|
||
"💯": "100.json",
|
||
"🎉": "party-popper.json",
|
||
"🎊": "confetti-ball.json",
|
||
"🧡": "orange-heart.json",
|
||
"💛": "yellow-heart.json",
|
||
"💚": "green-heart.json",
|
||
"💙": "blue-heart.json",
|
||
"💜": "purple-heart.json",
|
||
"🤎": "brown-heart.json",
|
||
"🖤": "black-heart.json",
|
||
"🤍": "white-heart.json",
|
||
"💘": "cupid.json",
|
||
"💝": "gift-heart.json",
|
||
"💖": "sparkling-heart.json",
|
||
"💗": "heart-grow.json",
|
||
"💓": "beating-heart.json",
|
||
"💞": "revolving-hearts.json",
|
||
"💕": "two-hearts.json",
|
||
"💌": "love-letter.json",
|
||
"💟": "heart-box.json",
|
||
"💔": "broken-heart.json",
|
||
"💋": "kiss.json",
|
||
"👣": "footprints.json",
|
||
"🫀": "anatomical-heart.json",
|
||
"🩸": "blood.json",
|
||
"🦠": "microbe.json",
|
||
"👀": "eyes.json",
|
||
"👃": "nose.json",
|
||
"👂": "ear.json",
|
||
"🦻": "hearing-aid.json",
|
||
"🦶": "foot.json",
|
||
"🦵": "leg.json",
|
||
"🦿": "leg-mechanical.json",
|
||
"🦾": "arm-mechanical.json",
|
||
"👏": "clap.json",
|
||
"👍": "thumbs-up.json",
|
||
"👎": "thumbs-down.json",
|
||
"🙌": "raising-hands.json",
|
||
"👐": "open-hands.json",
|
||
"🤲": "palms-up.json",
|
||
"🤜": "fist-rightwards.json",
|
||
"🤛": "fist-leftwards.json",
|
||
"✊": "raised-fist.json",
|
||
"👊": "fist.json",
|
||
"👋": "wave.json",
|
||
"🤚": "back-hand.json",
|
||
"✋": "raised-hand.json",
|
||
"🖖": "vulcan.json",
|
||
"🤘": "metal.json",
|
||
"🤞": "crossed-fingers.json",
|
||
"🤙": "call-me-hand.json",
|
||
"🤌": "pinched-fingers.json",
|
||
"🤏": "pinch.json",
|
||
"👌": "ok.json",
|
||
"👉": "point-right.json",
|
||
"👈": "point-left.json",
|
||
"👆": "point-up.json",
|
||
"👇": "point-down.json",
|
||
"🖕": "middle-finger.json",
|
||
"🤳": "selfie.json",
|
||
"🙏": "folded-hands.json",
|
||
"💅": "nail-care.json",
|
||
"🤝": "handshake.json",
|
||
"💃": "dancer-woman.json",
|
||
"💐": "bouquet.json",
|
||
"🌹": "rose.json",
|
||
"🥀": "wilted-flower.json",
|
||
"🍂": "fallen-leaf.json",
|
||
"🌱": "plant.json",
|
||
"🍃": "leaves.json",
|
||
"🍀": "luck.json",
|
||
"🌋": "volcano.json",
|
||
"🌅": "sunrise.json",
|
||
"🌄": "sunrise-over-mountains.json",
|
||
"🌈": "rainbow.json",
|
||
"🌊": "ocean.json",
|
||
"💧": "droplet.json",
|
||
"🌍": "globe-showing-Europe-Africa.json",
|
||
"🌎": "globe-showing-Americas.json",
|
||
"🌏": "globe-showing-Asia-Australia.json",
|
||
"🐮": "cow-face.json",
|
||
"🦄": "unicorn.json",
|
||
"🦎": "lizard.json",
|
||
"🐉": "dragon.json",
|
||
"🦖": "t-rex.json",
|
||
"🦕": "dinosaur.json",
|
||
"🐢": "turtle.json",
|
||
"🐊": "crocodile.json",
|
||
"🐍": "snake.json",
|
||
"🐸": "frog.json",
|
||
"🐇": "rabbit.json",
|
||
"🐀": "rat.json",
|
||
"🐩": "poodle.json",
|
||
"🐕": "dog.json",
|
||
"🦮": "guide-dog.json",
|
||
"🐖": "pig.json",
|
||
"🐎": "racehorse.json",
|
||
"🐂": "ox.json",
|
||
"🐐": "goat.json",
|
||
"🦘": "kangaroo.json",
|
||
"🐅": "tiger.json",
|
||
"🐒": "monkey.json",
|
||
"🦍": "gorilla.json",
|
||
"🦧": "orangutan.json",
|
||
"🦦": "otter.json",
|
||
"🦇": "bat.json",
|
||
"🐦": "bird.json",
|
||
"🐓": "rooster.json",
|
||
"🐣": "hatching-chick.json",
|
||
"🐤": "baby-chick.json",
|
||
"🐥": "hatched-chick.json",
|
||
"🦅": "eagle.json",
|
||
"🦉": "owl.json",
|
||
"🦚": "peacock.json",
|
||
"🦭": "seal.json",
|
||
"🦈": "shark.json",
|
||
"🐬": "dolphin.json",
|
||
"🐳": "whale.json",
|
||
"🐟": "fish.json",
|
||
"🐡": "blowfish.json",
|
||
"🦞": "lobster.json",
|
||
"🦀": "crab.json",
|
||
"🐙": "octopus.json",
|
||
"🦂": "scorpion.json",
|
||
"🐌": "snail.json",
|
||
"🐜": "ant.json",
|
||
"🦟": "mosquito.json",
|
||
"🪳": "cockroach.json",
|
||
"🪰": "fly.json",
|
||
"🐝": "bee.json",
|
||
"🐞": "lady-bug.json",
|
||
"🦋": "butterfly.json",
|
||
"🐛": "bug.json",
|
||
"🪱": "worm.json",
|
||
"🐾": "paw prints.json",
|
||
"🍅": "tomato.json",
|
||
"🍳": "cooking.json",
|
||
"🌯": "burrito.json",
|
||
"🍝": "spaghetti.json",
|
||
"🍜": "steaming-bowl.json",
|
||
"🍿": "popcorn.json",
|
||
"☕": "hot-beverage.json",
|
||
"🍻": "clinking-beer-mugs.json",
|
||
"🥂": "clinking-glasses.json",
|
||
"🍾": "bottle-with-popping-cork.json",
|
||
"🍷": "wine-glass.json",
|
||
"🍹": "tropical-drink.json",
|
||
"🚧": "construction.json",
|
||
"🚨": "police-car-light.json",
|
||
"🚲": "bicycle.json",
|
||
"🚗": "automobile.json",
|
||
"🚕": "taxi.json",
|
||
"🚌": "bus.json",
|
||
"⛵": "sailboat.json",
|
||
"🛶": "canoe.json",
|
||
"🛸": "flying-saucer.json",
|
||
"🚀": "rocket.json",
|
||
"🛫": "airplane-departure.json",
|
||
"🛬": "airplane-arrival.json",
|
||
"🎢": "roller-coaster.json",
|
||
"🎡": "ferris-wheel.json",
|
||
"🎈": "balloon.json",
|
||
"🎂": "birthday-cake.json",
|
||
"🎁": "wrapped-gift.json",
|
||
"🎆": "fireworks.json",
|
||
"🪅": "piñata.json",
|
||
"🥇": "gold-medal.json",
|
||
"🥈": "silver-medal.json",
|
||
"🥉": "bronze-medal.json",
|
||
"🏆": "trophy.json",
|
||
"⚽": "soccer-ball.json",
|
||
"⚾": "baseball.json",
|
||
"🥎": "softball.json",
|
||
"🎾": "tennis.json",
|
||
"🏸": "badminton.json",
|
||
"🥍": "lacrosse.json",
|
||
"🏏": "cricket-game.json",
|
||
"🏑": "field-hockey.json",
|
||
"🏒": "ice-hockey.json",
|
||
"🛼": "roller-skates.json",
|
||
"🩰": "ballet-shoes.json",
|
||
"🛹": "skateboard.json",
|
||
"⛳": "flag-in-hole.json",
|
||
"🎯": "direct-hit.json",
|
||
"🥏": "flying-disc.json",
|
||
"🪃": "boomerang.json",
|
||
"🪁": "kite.json",
|
||
"🎣": "fishing-pole.json",
|
||
"🥋": "martial-arts-uniform.json",
|
||
"🎱": "8-ball.json",
|
||
"🏓": "ping-pong.json",
|
||
"🎳": "bowling.json",
|
||
"🎲": "die.json",
|
||
"🎰": "slot-machine.json",
|
||
"🪄": "wand.json",
|
||
"📸": "camera-flash.json",
|
||
"🎷": "saxophone.json",
|
||
"🎺": "trumpet.json",
|
||
"🎻": "violin.json",
|
||
"🥁": "drum.json",
|
||
"🎬": "clapper.json",
|
||
"🔋": "battery-full.json",
|
||
"🪙": "coin.json",
|
||
"💸": "money-with-wings.json",
|
||
"💎": "gem-stone.json",
|
||
"💡": "light-bulb.json",
|
||
"🎓": "graduation-cap.json",
|
||
"💍": "ring.json",
|
||
"⏰": "alarm-clock.json",
|
||
"🔔": "bell.json",
|
||
"🔮": "crystal-ball.json",
|
||
"💣": "bomb.json",
|
||
"🪤": "mouse-trap.json",
|
||
"🔒": "locked.json",
|
||
"♈": "Aries.json",
|
||
"♉": "Taurus.json",
|
||
"♊": "Gemini.json",
|
||
"♋": "Cancer.json",
|
||
"♌": "Leo.json",
|
||
"♍": "Virgo.json",
|
||
"♎": "Libra.json",
|
||
"♏": "Scorpio.json",
|
||
"♐": "Sagittarius.json",
|
||
"♑": "Capricorn.json",
|
||
"♒": "Aquarius.json",
|
||
"♓": "Pisces.json",
|
||
"⛎": "Ophiuchus.json",
|
||
"❗": "exclamation.json",
|
||
"❓": "question.json",
|
||
"❌": "cross-mark.json",
|
||
"🆘": "sos.json",
|
||
"📴": "phone-off.json",
|
||
"✅": "check-mark.json",
|
||
"🆕": "new.json",
|
||
"🆓": "free.json",
|
||
"🆙": "up!.json",
|
||
"🆒": "cool.json",
|
||
"🚮": "litter.json",
|
||
"🎶": "musical-notes.json",
|
||
"➕": "plus-sign.json",
|
||
"🏁": "chequered-flag.json",
|
||
"🚩": "triangular-flag.json",
|
||
"🏴": "black-flag.json",
|
||
};
|
||
|
||
const EmojiAnimation({super.key, required this.emoji});
|
||
|
||
static bool supported(String emoji) {
|
||
if (emoji.length > 4) return false;
|
||
return animatedIcons.containsKey(emoji) || isEmoji(emoji);
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
// List of emojis and their corresponding Lottie file names
|
||
|
||
// Check if the emoji has a corresponding Lottie animation
|
||
if (animatedIcons.containsKey(emoji)) {
|
||
return Lottie.asset("assets/animated_icons/${animatedIcons[emoji]}");
|
||
} else if (isEmoji(emoji)) {
|
||
return Text(
|
||
emoji,
|
||
style: TextStyle(fontSize: 60),
|
||
);
|
||
} else {
|
||
return Text(
|
||
emoji,
|
||
style: TextStyle(fontSize: 15),
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
class EmojiAnimationFlying extends StatelessWidget {
|
||
final String emoji;
|
||
final Duration duration;
|
||
final double startPosition;
|
||
final int size;
|
||
|
||
const EmojiAnimationFlying({
|
||
super.key,
|
||
required this.emoji,
|
||
required this.duration,
|
||
required this.startPosition,
|
||
required this.size,
|
||
});
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return TweenAnimationBuilder<double>(
|
||
tween: Tween<double>(
|
||
begin: startPosition, end: 1), // Adjust end value as needed
|
||
duration: duration,
|
||
curve: Curves.linearToEaseOut,
|
||
builder: (context, value, child) {
|
||
return Padding(
|
||
padding: EdgeInsets.only(bottom: 20 * value),
|
||
child: SizedBox(
|
||
width: size + 30 * value,
|
||
child: EmojiAnimation(emoji: emoji),
|
||
),
|
||
);
|
||
},
|
||
);
|
||
}
|
||
}
|