Web Component Libraries: FAST
FAST is a new and innovative web component library and design system from Microsoft. It features statically typed template literals and a flexible reactivity model.
Installation
npm i -S @apollo-elements/fast
yarn add @apollo-elements/fast
pnpm add @apollo-elements/fast
@apollo-elements/fast
base classes extend from FASTElement
, with all it's ergonomics and reactivity.
import type { Binding, ViewTemplate } from '@microsoft/fast-element'
import { FASTElement, customElement, html, ref, when, repeat } from '@microsoft/fast-element';
import { ApolloQueryBehavior, ApolloMutationBehavior } from '@apollo-elements/fast';
import { ProfileQuery } from './Profile.query.graphql.js';
import { CountriesQuery } from './Countries.query.graphql.js';
import { UpdateProfileMutation } from './UpdateProfile.mutation.graphql.js';
import { client } from './client.js';
import { styles } from './user-profile.css.js';
const name = 'user-profile';
const getCountry: Binding<UserProfile> = x => x.profile.data?.profile?.country.countryCode ?? '';
const getFlag: Binding<UserProfile> = x => x.profile.data?.profile?.country.emoji ?? '';
const getName: Binding<UserProfile> = x => x.profile.data?.profile?.name ?? 'New User';
const hasProfile: Binding<UserProfile> = x => !!x.profile.data?.profile;
const onClickSave: Binding<UserProfile> = x => x.onClickSave();
const getCountries: Binding<UserProfile> = x => Array.from(x.countries.data?.countries ?? []);
const template: ViewTemplate<UserProfile> = html`
<fast-card>
<p>Hello, ${getName} ${getFlag}</p>
<fast-text-field ${ref('nameInput')}
appearance="filled"
placeholder="Username">Name</fast-text-field>
<label for="country">Country</label>
<fast-combobox autocomplete="both" ${ref('countryInput')}
id="country"
value="${getCountry}">${repeat(getCountries, html`
<fast-option value="${x => x.countryCode}">${x => x.name}
<span slot="start">${x => x.emoji}</span>
</fast-option>`)}
</fast-combobox>
<fast-button @click="${onClickSave}">Save</fast-button>
</fast-card>
`;
@customElement({ name, template, styles })
class UserProfile extends FASTElement {
countryInput: HTMLSelectElement;
nameInput: HTMLInputElement;
countries = new ApolloQueryBehavior(this, CountriesQuery, { client });
profile = new ApolloQueryBehavior(this, ProfileQuery, { client });
update = new ApolloMutationBehavior(this, UpdateProfileMutation, {
client,
update(cache, result) {
const profile = result.data.updateProfile;
cache.writeQuery({
query: ProfileQuery,
data: { profile },
});
}
});
onClickSave() {
this.update.mutate({
variables: {
input: {
name: this.nameInput.value,
country: this.countryInput.options[this.countryInput.selectedIndex]?.value ?? null,
},
},
});
}
}
import { css } from '@microsoft/fast-element';
export const styles = css`
fast-card {
display: grid;
padding: 10px;
gap: 10px;
align-content: start;
}
fast-text-field {
width: auto;
}
`;
<script type="module" src="https://unpkg.com/@microsoft/fast-components"></script>
<script type="module" src="Profile.js"></script>
<fast-design-system-provider use-defaults>
<user-profile></user-profile>
</fast-design-system-provider>
body {
display: grid;
background-color: #111;
color: white;
font-family: "Open Sans", Arial, Helvetica, sans-serif;
place-items: center center;
height: 100vh;
}
fast-design-system-provider {
height: 100%;
}
import type { Profile } from './client.js';
import type { TypedDocumentNode } from '@apollo/client/core';
import { gql } from '@apollo/client/core';
export const ProfileQuery: TypedDocumentNode<{ profile: Profile }> = gql`
query ProfileQuery {
countries { countryCode name emoji }
profile {
name
country {
countryCode
name
emoji
}
}
}
`;
import type { Country } from './client.js';
import type { TypedDocumentNode } from '@apollo/client/core';
import { gql } from '@apollo/client/core';
export const CountriesQuery: TypedDocumentNode<{ countries: Country[] }> = gql`
query CountriesQuery {
countries { countryCode name emoji }
}
`;
import type { Profile, ProfileInput } from './client.js';
import type { TypedDocumentNode } from '@apollo/client/core';
import { gql } from '@apollo/client/core';
export const UpdateProfileMutation: TypedDocumentNode<
{ updateProfile: Profile },
{ input: ProfileInput }
> = gql`
mutation UpdateProfileMutation($input: ProfileInput) {
updateProfile(input: $input) {
name
country {
countryCode
name
emoji
}
}
}
`;
import type { NormalizedCacheObject } from '@apollo/client/core';
import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client/core';
import { SchemaLink } from '@apollo/client/link/schema';
import { makeExecutableSchema } from '@graphql-tools/schema';
import countries from './countries.js'
export interface Country {
countryCode: string;
name: string;
emoji: string
}
export interface Profile {
name: string;
country: Country;
};
const typeDefs = `
type Country {
countryCode: String
name: String
emoji: String
}
type Profile {
name: String
country: Country
}
type Query {
countries: [Country]
profile: Profile
}
input ProfileInput {
name: String
country: String
}
type Mutation {
updateProfile(input: ProfileInput): Profile
}
`;
declare global { interface Window { __APOLLO_CLIENT__?: ApolloClient<NormalizedCacheObject>; } }
let PROFILE = null;
export const client = new ApolloClient({
cache: new InMemoryCache(),
link: new SchemaLink({
schema: makeExecutableSchema({
typeDefs,
resolvers: {
Profile: {
country({ country }) {
return {
countryCode: country,
...countries[country],
};
},
},
Query: {
countries(): Country[] {
return Object
.entries(countries)
.map(([countryCode, v]) =>
({ ...v, countryCode }));
},
profile(): Profile {
return PROFILE;
},
},
Mutation: {
updateProfile(_, { input }) {
PROFILE = input;
return PROFILE;
}
}
}
}),
}),
});
export default {"AD":{"emoji":"๐ฆ๐ฉ","name":"Andorra"},"AE":{"emoji":"๐ฆ๐ช","name":"United Arab Emirates"},"AF":{"emoji":"๐ฆ๐ซ","name":"Afghanistan"},"AG":{"emoji":"๐ฆ๐ฌ","name":"Antigua and Barbuda"},"AI":{"emoji":"๐ฆ๐ฎ","name":"Anguilla"},"AL":{"emoji":"๐ฆ๐ฑ","name":"Albania"},"AM":{"emoji":"๐ฆ๐ฒ","name":"Armenia"},"AO":{"emoji":"๐ฆ๐ด","name":"Angola"},"AQ":{"emoji":"๐ฆ๐ถ","name":"Antarctica"},"AR":{"emoji":"๐ฆ๐ท","name":"Argentina"},"AS":{"emoji":"๐ฆ๐ธ","name":"American Samoa"},"AT":{"emoji":"๐ฆ๐น","name":"Austria"},"AU":{"emoji":"๐ฆ๐บ","name":"Australia"},"AW":{"emoji":"๐ฆ๐ผ","name":"Aruba"},"AX":{"emoji":"๐ฆ๐ฝ","name":"ร
land Islands"},"AZ":{"emoji":"๐ฆ๐ฟ","name":"Azerbaijan"},"BA":{"emoji":"๐ง๐ฆ","name":"Bosnia and Herzegovina"},"BB":{"emoji":"๐ง๐ง","name":"Barbados"},"BD":{"emoji":"๐ง๐ฉ","name":"Bangladesh"},"BE":{"emoji":"๐ง๐ช","name":"Belgium"},"BF":{"emoji":"๐ง๐ซ","name":"Burkina Faso"},"BG":{"emoji":"๐ง๐ฌ","name":"Bulgaria"},"BH":{"emoji":"๐ง๐ญ","name":"Bahrain"},"BI":{"emoji":"๐ง๐ฎ","name":"Burundi"},"BJ":{"emoji":"๐ง๐ฏ","name":"Benin"},"BM":{"emoji":"๐ง๐ฒ","name":"Bermuda"},"BN":{"emoji":"๐ง๐ณ","name":"Brunei"},"BO":{"emoji":"๐ง๐ด","name":"Bolivia"},"BR":{"emoji":"๐ง๐ท","name":"Brazil"},"BS":{"emoji":"๐ง๐ธ","name":"Bahamas"},"BT":{"emoji":"๐ง๐น","name":"Bhutan"},"BV":{"emoji":"๐ง๐ป","name":"Bouvet Island"},"BW":{"emoji":"๐ง๐ผ","name":"Botswana"},"BY":{"emoji":"๐ง๐พ","name":"Belarus"},"BZ":{"emoji":"๐ง๐ฟ","name":"Belize"},"CA":{"emoji":"๐จ๐ฆ","name":"Canada"},"CC":{"emoji":"๐จ๐จ","name":"Cocos (Keeling) Islands"},"CD":{"emoji":"๐จ๐ฉ","name":"DR Congo"},"CF":{"emoji":"๐จ๐ซ","name":"Central African Republic"},"CG":{"emoji":"๐จ๐ฌ","name":"Republic of the Congo"},"CH":{"emoji":"๐จ๐ญ","name":"Switzerland"},"CI":{"emoji":"๐จ๐ฎ","name":"Ivory Coast"},"CK":{"emoji":"๐จ๐ฐ","name":"Cook Islands"},"CL":{"emoji":"๐จ๐ฑ","name":"Chile"},"CM":{"emoji":"๐จ๐ฒ","name":"Cameroon"},"CN":{"emoji":"๐จ๐ณ","name":"China"},"CO":{"emoji":"๐จ๐ด","name":"Colombia"},"CR":{"emoji":"๐จ๐ท","name":"Costa Rica"},"CU":{"emoji":"๐จ๐บ","name":"Cuba"},"CV":{"emoji":"๐จ๐ป","name":"Cape Verde"},"CX":{"emoji":"๐จ๐ฝ","name":"Christmas Island"},"CY":{"emoji":"๐จ๐พ","name":"Cyprus"},"CZ":{"emoji":"๐จ๐ฟ","name":"Czechia"},"DE":{"emoji":"๐ฉ๐ช","name":"Germany"},"DJ":{"emoji":"๐ฉ๐ฏ","name":"Djibouti"},"DK":{"emoji":"๐ฉ๐ฐ","name":"Denmark"},"DM":{"emoji":"๐ฉ๐ฒ","name":"Dominica"},"DO":{"emoji":"๐ฉ๐ด","name":"Dominican Republic"},"DZ":{"emoji":"๐ฉ๐ฟ","name":"Algeria"},"EC":{"emoji":"๐ช๐จ","name":"Ecuador"},"EE":{"emoji":"๐ช๐ช","name":"Estonia"},"EG":{"emoji":"๐ช๐ฌ","name":"Egypt"},"EH":{"emoji":"๐ช๐ญ","name":"Western Sahara"},"ER":{"emoji":"๐ช๐ท","name":"Eritrea"},"ES":{"emoji":"๐ช๐ธ","name":"Spain"},"ET":{"emoji":"๐ช๐น","name":"Ethiopia"},"FI":{"emoji":"๐ซ๐ฎ","name":"Finland"},"FJ":{"emoji":"๐ซ๐ฏ","name":"Fiji"},"FK":{"emoji":"๐ซ๐ฐ","name":"Falkland Islands"},"FM":{"emoji":"๐ซ๐ฒ","name":"Micronesia"},"FO":{"emoji":"๐ซ๐ด","name":"Faroe Islands"},"FR":{"emoji":"๐ซ๐ท","name":"France"},"GA":{"emoji":"๐ฌ๐ฆ","name":"Gabon"},"GB":{"emoji":"๐ฌ๐ง","name":"United Kingdom"},"GD":{"emoji":"๐ฌ๐ฉ","name":"Grenada"},"GE":{"emoji":"๐ฌ๐ช","name":"Georgia"},"GF":{"emoji":"๐ฌ๐ซ","name":"French Guiana"},"GG":{"emoji":"๐ฌ๐ฌ","name":"Guernsey"},"GH":{"emoji":"๐ฌ๐ญ","name":"Ghana"},"GI":{"emoji":"๐ฌ๐ฎ","name":"Gibraltar"},"GL":{"emoji":"๐ฌ๐ฑ","name":"Greenland"},"GM":{"emoji":"๐ฌ๐ฒ","name":"Gambia"},"GN":{"emoji":"๐ฌ๐ณ","name":"Guinea"},"GP":{"emoji":"๐ฌ๐ต","name":"Guadeloupe"},"GQ":{"emoji":"๐ฌ๐ถ","name":"Equatorial Guinea"},"GR":{"emoji":"๐ฌ๐ท","name":"Greece"},"GS":{"emoji":"๐ฌ๐ธ","name":"South Georgia"},"GT":{"emoji":"๐ฌ๐น","name":"Guatemala"},"GU":{"emoji":"๐ฌ๐บ","name":"Guam"},"GW":{"emoji":"๐ฌ๐ผ","name":"Guinea-Bissau"},"GY":{"emoji":"๐ฌ๐พ","name":"Guyana"},"HK":{"emoji":"๐ญ๐ฐ","name":"Hong Kong"},"HM":{"emoji":"๐ญ๐ฒ","name":"Heard Island and McDonald Islands"},"HN":{"emoji":"๐ญ๐ณ","name":"Honduras"},"HR":{"emoji":"๐ญ๐ท","name":"Croatia"},"HT":{"emoji":"๐ญ๐น","name":"Haiti"},"HU":{"emoji":"๐ญ๐บ","name":"Hungary"},"ID":{"emoji":"๐ฎ๐ฉ","name":"Indonesia"},"IE":{"emoji":"๐ฎ๐ช","name":"Ireland"},"IL":{"emoji":"๐ฎ๐ฑ","name":"Israel"},"IM":{"emoji":"๐ฎ๐ฒ","name":"Isle of Man"},"IN":{"emoji":"๐ฎ๐ณ","name":"India"},"IO":{"emoji":"๐ฎ๐ด","name":"British Indian Ocean Territory"},"IQ":{"emoji":"๐ฎ๐ถ","name":"Iraq"},"IR":{"emoji":"๐ฎ๐ท","name":"Iran"},"IS":{"emoji":"๐ฎ๐ธ","name":"Iceland"},"IT":{"emoji":"๐ฎ๐น","name":"Italy"},"JE":{"emoji":"๐ฏ๐ช","name":"Jersey"},"JM":{"emoji":"๐ฏ๐ฒ","name":"Jamaica"},"JO":{"emoji":"๐ฏ๐ด","name":"Jordan"},"JP":{"emoji":"๐ฏ๐ต","name":"Japan"},"KE":{"emoji":"๐ฐ๐ช","name":"Kenya"},"KG":{"emoji":"๐ฐ๐ฌ","name":"Kyrgyzstan"},"KH":{"emoji":"๐ฐ๐ญ","name":"Cambodia"},"KI":{"emoji":"๐ฐ๐ฎ","name":"Kiribati"},"KM":{"emoji":"๐ฐ๐ฒ","name":"Comoros"},"KN":{"emoji":"๐ฐ๐ณ","name":"Saint Kitts and Nevis"},"KP":{"emoji":"๐ฐ๐ต","name":"North Korea"},"KR":{"emoji":"๐ฐ๐ท","name":"South Korea"},"KW":{"emoji":"๐ฐ๐ผ","name":"Kuwait"},"KY":{"emoji":"๐ฐ๐พ","name":"Cayman Islands"},"KZ":{"emoji":"๐ฐ๐ฟ","name":"Kazakhstan"},"LA":{"emoji":"๐ฑ๐ฆ","name":"Laos"},"LB":{"emoji":"๐ฑ๐ง","name":"Lebanon"},"LC":{"emoji":"๐ฑ๐จ","name":"Saint Lucia"},"LI":{"emoji":"๐ฑ๐ฎ","name":"Liechtenstein"},"LK":{"emoji":"๐ฑ๐ฐ","name":"Sri Lanka"},"LR":{"emoji":"๐ฑ๐ท","name":"Liberia"},"LS":{"emoji":"๐ฑ๐ธ","name":"Lesotho"},"LT":{"emoji":"๐ฑ๐น","name":"Lithuania"},"LU":{"emoji":"๐ฑ๐บ","name":"Luxembourg"},"LV":{"emoji":"๐ฑ๐ป","name":"Latvia"},"LY":{"emoji":"๐ฑ๐พ","name":"Libya"},"MA":{"emoji":"๐ฒ๐ฆ","name":"Morocco"},"MC":{"emoji":"๐ฒ๐จ","name":"Monaco"},"MD":{"emoji":"๐ฒ๐ฉ","name":"Moldova"},"ME":{"emoji":"๐ฒ๐ช","name":"Montenegro"},"MG":{"emoji":"๐ฒ๐ฌ","name":"Madagascar"},"MH":{"emoji":"๐ฒ๐ญ","name":"Marshall Islands"},"MK":{"emoji":"๐ฒ๐ฐ","name":"North Macedonia"},"ML":{"emoji":"๐ฒ๐ฑ","name":"Mali"},"MM":{"emoji":"๐ฒ๐ฒ","name":"Myanmar"},"MN":{"emoji":"๐ฒ๐ณ","name":"Mongolia"},"MO":{"emoji":"๐ฒ๐ด","name":"Macau"},"MP":{"emoji":"๐ฒ๐ต","name":"Northern Mariana Islands"},"MQ":{"emoji":"๐ฒ๐ถ","name":"Martinique"},"MR":{"emoji":"๐ฒ๐ท","name":"Mauritania"},"MS":{"emoji":"๐ฒ๐ธ","name":"Montserrat"},"MT":{"emoji":"๐ฒ๐น","name":"Malta"},"MU":{"emoji":"๐ฒ๐บ","name":"Mauritius"},"MV":{"emoji":"๐ฒ๐ป","name":"Maldives"},"MW":{"emoji":"๐ฒ๐ผ","name":"Malawi"},"MX":{"emoji":"๐ฒ๐ฝ","name":"Mexico"},"MY":{"emoji":"๐ฒ๐พ","name":"Malaysia"},"MZ":{"emoji":"๐ฒ๐ฟ","name":"Mozambique"},"NA":{"emoji":"๐ณ๐ฆ","name":"Namibia"},"NC":{"emoji":"๐ณ๐จ","name":"New Caledonia"},"NE":{"emoji":"๐ณ๐ช","name":"Niger"},"NF":{"emoji":"๐ณ๐ซ","name":"Norfolk Island"},"NG":{"emoji":"๐ณ๐ฌ","name":"Nigeria"},"NI":{"emoji":"๐ณ๐ฎ","name":"Nicaragua"},"NL":{"emoji":"๐ณ๐ฑ","name":"Netherlands"},"NO":{"emoji":"๐ณ๐ด","name":"Norway"},"NP":{"emoji":"๐ณ๐ต","name":"Nepal"},"NR":{"emoji":"๐ณ๐ท","name":"Nauru"},"NU":{"emoji":"๐ณ๐บ","name":"Niue"},"NZ":{"emoji":"๐ณ๐ฟ","name":"New Zealand"},"OM":{"emoji":"๐ด๐ฒ","name":"Oman"},"PA":{"emoji":"๐ต๐ฆ","name":"Panama"},"PE":{"emoji":"๐ต๐ช","name":"Peru"},"PF":{"emoji":"๐ต๐ซ","name":"French Polynesia"},"PG":{"emoji":"๐ต๐ฌ","name":"Papua New Guinea"},"PH":{"emoji":"๐ต๐ญ","name":"Philippines"},"PK":{"emoji":"๐ต๐ฐ","name":"Pakistan"},"PL":{"emoji":"๐ต๐ฑ","name":"Poland"},"PM":{"emoji":"๐ต๐ฒ","name":"Saint Pierre and Miquelon"},"PN":{"emoji":"๐ต๐ณ","name":"Pitcairn Islands"},"PR":{"emoji":"๐ต๐ท","name":"Puerto Rico"},"PS":{"emoji":"๐ต๐ธ","name":"Palestine"},"PT":{"emoji":"๐ต๐น","name":"Portugal"},"PW":{"emoji":"๐ต๐ผ","name":"Palau"},"PY":{"emoji":"๐ต๐พ","name":"Paraguay"},"QA":{"emoji":"๐ถ๐ฆ","name":"Qatar"},"RE":{"emoji":"๐ท๐ช","name":"Rรฉunion"},"RO":{"emoji":"๐ท๐ด","name":"Romania"},"RS":{"emoji":"๐ท๐ธ","name":"Serbia"},"RU":{"emoji":"๐ท๐บ","name":"Russia"},"RW":{"emoji":"๐ท๐ผ","name":"Rwanda"},"SA":{"emoji":"๐ธ๐ฆ","name":"Saudi Arabia"},"SB":{"emoji":"๐ธ๐ง","name":"Solomon Islands"},"SC":{"emoji":"๐ธ๐จ","name":"Seychelles"},"SD":{"emoji":"๐ธ๐ฉ","name":"Sudan"},"SE":{"emoji":"๐ธ๐ช","name":"Sweden"},"SG":{"emoji":"๐ธ๐ฌ","name":"Singapore"},"SH":{"emoji":"๐ธ๐ญ","name":"Saint Helena, Ascension and Tristan da Cunha"},"SI":{"emoji":"๐ธ๐ฎ","name":"Slovenia"},"SJ":{"emoji":"๐ธ๐ฏ","name":"Svalbard and Jan Mayen"},"SK":{"emoji":"๐ธ๐ฐ","name":"Slovakia"},"SL":{"emoji":"๐ธ๐ฑ","name":"Sierra Leone"},"SM":{"emoji":"๐ธ๐ฒ","name":"San Marino"},"SN":{"emoji":"๐ธ๐ณ","name":"Senegal"},"SO":{"emoji":"๐ธ๐ด","name":"Somalia"},"SR":{"emoji":"๐ธ๐ท","name":"Suriname"},"ST":{"emoji":"๐ธ๐น","name":"Sรฃo Tomรฉ and Prรญncipe"},"SV":{"emoji":"๐ธ๐ป","name":"El Salvador"},"SY":{"emoji":"๐ธ๐พ","name":"Syria"},"SZ":{"emoji":"๐ธ๐ฟ","name":"Eswatini"},"TC":{"emoji":"๐น๐จ","name":"Turks and Caicos Islands"},"TD":{"emoji":"๐น๐ฉ","name":"Chad"},"TF":{"emoji":"๐น๐ซ","name":"French Southern and Antarctic Lands"},"TG":{"emoji":"๐น๐ฌ","name":"Togo"},"TH":{"emoji":"๐น๐ญ","name":"Thailand"},"TJ":{"emoji":"๐น๐ฏ","name":"Tajikistan"},"TK":{"emoji":"๐น๐ฐ","name":"Tokelau"},"TL":{"emoji":"๐น๐ฑ","name":"Timor-Leste"},"TM":{"emoji":"๐น๐ฒ","name":"Turkmenistan"},"TN":{"emoji":"๐น๐ณ","name":"Tunisia"},"TO":{"emoji":"๐น๐ด","name":"Tonga"},"TR":{"emoji":"๐น๐ท","name":"Turkey"},"TT":{"emoji":"๐น๐น","name":"Trinidad and Tobago"},"TV":{"emoji":"๐น๐ป","name":"Tuvalu"},"TW":{"emoji":"๐น๐ผ","name":"Taiwan"},"TZ":{"emoji":"๐น๐ฟ","name":"Tanzania"},"UA":{"emoji":"๐บ๐ฆ","name":"Ukraine"},"UG":{"emoji":"๐บ๐ฌ","name":"Uganda"},"UM":{"emoji":"๐บ๐ฒ","name":"United States Minor Outlying Islands"},"US":{"emoji":"๐บ๐ธ","name":"United States"},"UY":{"emoji":"๐บ๐พ","name":"Uruguay"},"UZ":{"emoji":"๐บ๐ฟ","name":"Uzbekistan"},"VA":{"emoji":"๐ป๐ฆ","name":"Vatican City"},"VC":{"emoji":"๐ป๐จ","name":"Saint Vincent and the Grenadines"},"VE":{"emoji":"๐ป๐ช","name":"Venezuela"},"VG":{"emoji":"๐ป๐ฌ","name":"British Virgin Islands"},"VI":{"emoji":"๐ป๐ฎ","name":"United States Virgin Islands"},"VN":{"emoji":"๐ป๐ณ","name":"Vietnam"},"VU":{"emoji":"๐ป๐บ","name":"Vanuatu"},"WF":{"emoji":"๐ผ๐ซ","name":"Wallis and Futuna"},"WS":{"emoji":"๐ผ๐ธ","name":"Samoa"},"XK":{"emoji":"๐ฝ๐ฐ","name":"Kosovo"},"YE":{"emoji":"๐พ๐ช","name":"Yemen"},"YT":{"emoji":"๐พ๐น","name":"Mayotte"},"ZA":{"emoji":"๐ฟ๐ฆ","name":"South Africa"},"ZM":{"emoji":"๐ฟ๐ฒ","name":"Zambia"},"ZW":{"emoji":"๐ฟ๐ผ","name":"Zimbabwe"}}