your personal website on atproto - mirror blento.app

Merge branch 'main' of https://github.com/unbedenklich/blento

+10807 -1984
+5 -1
.claude/settings.local.json
··· 4 4 "Bash(pnpm check:*)", 5 5 "mcp__ide__getDiagnostics", 6 6 "mcp__plugin_svelte_svelte__svelte-autofixer", 7 - "mcp__plugin_svelte_svelte__list-sections" 7 + "mcp__plugin_svelte_svelte__list-sections", 8 + "Bash(pkill:*)", 9 + "Bash(timeout 8 pnpm dev:*)", 10 + "Bash(git checkout:*)", 11 + "Bash(npx svelte-kit:*)" 8 12 ] 9 13 } 10 14 }
+5 -1
docs/CardIdeas.md
··· 45 45 - [x] latest ratings 46 46 - lists 47 47 - smokesignal.events (https://pdsls.dev/at://did:plc:xbtmt2zjwlrfegqvch7fboei/events.smokesignal.calendar.event/3ltn2qrxf3626) 48 - - statusphere.xyz 48 + - statusphere.xyz (https://googlefonts.github.io/noto-emoji-animation/, https://gist.github.com/sanjacob/a0ccdf6d88f15bf158d8895090722d14) 49 49 - goals.garden 50 50 - flashes.blue (https://pdsls.dev/at://did:plc:aytgljyikzbtgrnac2u4ccft/blue.flashes.actor.portfolio, https://app.flashes.blue/profile/j4ck.xyz) 51 51 - room: flo-bit.dev/room ··· 66 66 - memory 67 67 - pinball esque 68 68 - 2048 69 + 70 + ## various 71 + 72 + - eyes tracking cursor (https://blento.app/jumpcity.blacksky.app)
+1 -1
src/lib/cards/BaseCard/BaseCard.svelte
··· 40 40 bind:this={ref} 41 41 draggable={isEditing} 42 42 class={[ 43 - 'card group selection:bg-accent-600/50 focus-within:outline-accent-500 @container/card absolute z-0 rounded-3xl outline-offset-2 transition-all duration-200 focus-within:outline-2 isolate', 43 + 'card group/card selection:bg-accent-600/50 focus-within:outline-accent-500 @container/card absolute z-0 rounded-3xl outline-offset-2 transition-all duration-200 focus-within:outline-2 isolate', 44 44 color ? (colors[color] ?? colors.accent) : colors.base, 45 45 color !== 'accent' && item.color !== 'base' && item.color !== 'transparent' ? color : '', 46 46 showOutline ? 'outline-2' : '',
+5 -5
src/lib/cards/BaseCard/BaseEditingCard.svelte
··· 183 183 {@render children?.()} 184 184 185 185 {#snippet controls()} 186 - <!-- class="bg-base-100 border-base-200 dark:bg-base-800 dark:border-base-700 absolute -top-3 -left-3 hidden cursor-pointer items-center justify-center rounded-full border p-2 shadow-lg group-focus-within:inline-flex group-hover:inline-flex" --> 186 + <!-- class="bg-base-100 border-base-200 dark:bg-base-800 dark:border-base-700 absolute -top-3 -left-3 hidden cursor-pointer items-center justify-center rounded-full border p-2 shadow-lg group-focus-within:inline-flex group-hover/card:inline-flex" --> 187 187 {#if canEdit()} 188 188 {#if changeOptions.length > 0} 189 189 <div 190 190 class={[ 191 - 'absolute -top-3 -right-3 hidden group-focus-within:inline-flex group-hover:inline-flex', 191 + 'absolute -top-3 -right-3 hidden group-focus-within:inline-flex group-hover/card:inline-flex', 192 192 changePopoverOpen ? 'inline-flex' : '' 193 193 ]} 194 194 > ··· 236 236 onclick={() => { 237 237 ondelete(); 238 238 }} 239 - class="absolute -top-3 -left-3 hidden group-focus-within:inline-flex group-hover:inline-flex" 239 + class="absolute -top-3 -left-3 hidden group-focus-within:inline-flex group-hover/card:inline-flex" 240 240 > 241 241 <svg 242 242 xmlns="http://www.w3.org/2000/svg" ··· 257 257 258 258 <div 259 259 class={[ 260 - 'absolute -bottom-7 w-full items-center justify-center text-xs group-focus-within:inline-flex group-hover:inline-flex', 260 + 'absolute -bottom-7 w-full items-center justify-center text-xs group-focus-within:inline-flex group-hover/card:inline-flex', 261 261 colorPopoverOpen || settingsPopoverOpen ? 'inline-flex' : 'hidden' 262 262 ]} 263 263 > ··· 396 396 397 397 <div 398 398 onpointerdown={handleResizeStart} 399 - class="bg-base-300/70 dark:bg-base-900/70 pointer-events-auto absolute right-0.5 bottom-0.5 hidden cursor-se-resize rounded-md rounded-br-3xl p-1 group-hover:block" 399 + class="bg-base-300/70 dark:bg-base-900/70 pointer-events-auto absolute right-0.5 bottom-0.5 hidden cursor-se-resize rounded-md rounded-br-3xl p-1 group-hover/card:block" 400 400 > 401 401 <svg 402 402 xmlns="http://www.w3.org/2000/svg"
+58
src/lib/cards/FluidTextCard/EditingFluidTextCard.svelte
··· 1 + <script lang="ts"> 2 + import type { Item } from '$lib/types'; 3 + import type { ContentComponentProps } from '../types'; 4 + import FluidTextCard from './FluidTextCard.svelte'; 5 + 6 + let { item = $bindable<Item>() }: ContentComponentProps = $props(); 7 + 8 + let isEditing = $state(false); 9 + let inputElement: HTMLInputElement | null = $state(null); 10 + 11 + function handleClick() { 12 + if (isEditing) return; 13 + isEditing = true; 14 + requestAnimationFrame(() => { 15 + inputElement?.focus(); 16 + inputElement?.select(); 17 + }); 18 + } 19 + 20 + function handleBlur() { 21 + isEditing = false; 22 + } 23 + 24 + function handleKeydown(e: KeyboardEvent) { 25 + if (e.key === 'Enter' || e.key === 'Escape') { 26 + isEditing = false; 27 + } 28 + } 29 + </script> 30 + 31 + <!-- svelte-ignore a11y_no_static_element_interactions --> 32 + <!-- svelte-ignore a11y_click_events_have_key_events --> 33 + <div 34 + class="relative h-full w-full cursor-text transition-colors duration-150 {isEditing ? 'ring-2 ring-white/30' : ''}" 35 + onclick={handleClick} 36 + > 37 + <FluidTextCard {item} /> 38 + 39 + {#if isEditing} 40 + <!-- svelte-ignore a11y_autofocus --> 41 + <!-- svelte-ignore a11y_no_static_element_interactions --> 42 + <!-- svelte-ignore a11y_click_events_have_key_events --> 43 + <div 44 + class="absolute inset-0 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm" 45 + onclick={(e) => e.stopPropagation()} 46 + > 47 + <input 48 + bind:this={inputElement} 49 + bind:value={item.cardData.text} 50 + onblur={handleBlur} 51 + onkeydown={handleKeydown} 52 + class="w-full max-w-md rounded-md border border-white/20 bg-white/10 px-4 py-3 text-center text-2xl font-bold text-white outline-none transition-colors focus:border-white/40 focus:bg-white/20" 53 + placeholder="Enter text" 54 + autofocus 55 + /> 56 + </div> 57 + {/if} 58 + </div>
+174 -70
src/lib/cards/FluidTextCard/FluidTextCard.svelte
··· 1 1 <script lang="ts"> 2 2 import type { ContentComponentProps } from '../types'; 3 3 import { onMount, onDestroy, tick } from 'svelte'; 4 - import ditheringTextureUrl from './text_effect_fluid-main/LDR_LLL1_0.png'; 4 + import ditheringTextureUrl from './LDR_LLL1_0.png'; 5 5 6 6 let { item }: ContentComponentProps = $props(); 7 7 ··· 10 10 let maskCanvas: HTMLCanvasElement; 11 11 let animationId: number; 12 12 let splatIntervalId: ReturnType<typeof setInterval>; 13 + let maskDrawRaf = 0; 14 + let maskReady = false; 13 15 let isInitialized = $state(false); 14 16 let resizeObserver: ResizeObserver | null = null; 15 17 16 18 // Get text from card data 17 19 const text = $derived((item.cardData?.text as string) || 'hello'); 18 - const fontWeight = $derived((item.cardData?.fontWeight as string) || '900'); 19 - const fontFamily = $derived((item.cardData?.fontFamily as string) || 'Arial'); 20 - const fontSize = $derived((item.cardData?.fontSize as number) || 0.33); 20 + const fontWeight = '900'; 21 + const fontFamily = 'Arial'; 22 + const fontSize = $derived(parseFloat(item.cardData?.fontSize) || 0.33); 21 23 22 24 // Draw text mask on overlay canvas 23 25 function drawOverlayCanvas() { 24 26 if (!maskCanvas || !container) return; 25 27 26 - const rect = container.getBoundingClientRect(); 27 - if (rect.width === 0 || rect.height === 0) return; 28 + const width = container.clientWidth; 29 + const height = container.clientHeight; 30 + if (width === 0 || height === 0) return; 28 31 29 32 const dpr = window.devicePixelRatio || 1; 30 33 31 - maskCanvas.width = rect.width * dpr; 32 - maskCanvas.height = rect.height * dpr; 34 + maskCanvas.width = width * dpr; 35 + maskCanvas.height = height * dpr; 33 36 34 37 const ctx = maskCanvas.getContext('2d')!; 38 + ctx.setTransform(1, 0, 0, 1, 0, 0); 39 + ctx.globalCompositeOperation = 'source-over'; 40 + ctx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); 35 41 ctx.scale(dpr, dpr); 36 42 37 43 ctx.fillStyle = 'black'; 38 - ctx.fillRect(0, 0, rect.width, rect.height); 44 + ctx.fillRect(0, 0, width, height); 39 45 40 - const textFontSize = Math.round(rect.width * fontSize); 41 - ctx.font = fontWeight + ' ' + textFontSize + 'px ' + fontFamily; 46 + // Font size as percentage of container width 47 + const textFontSize = Math.round(width * fontSize); 48 + ctx.font = `${fontWeight} ${textFontSize}px ${fontFamily}`; 42 49 43 50 ctx.strokeStyle = 'rgba(255, 255, 255, 0.3)'; 44 51 ctx.lineWidth = 2; 45 - ctx.textBaseline = 'middle'; 46 52 ctx.textAlign = 'center'; 47 53 48 - ctx.strokeText(text, rect.width / 2, rect.height / 2); 54 + const metrics = ctx.measureText(text); 55 + let textY = height / 2; 56 + if ( 57 + metrics.actualBoundingBoxAscent !== undefined && 58 + metrics.actualBoundingBoxDescent !== undefined 59 + ) { 60 + ctx.textBaseline = 'alphabetic'; 61 + textY = (height + metrics.actualBoundingBoxAscent - metrics.actualBoundingBoxDescent) / 2; 62 + } else { 63 + ctx.textBaseline = 'middle'; 64 + } 65 + 66 + ctx.strokeText(text, width / 2, textY); 49 67 ctx.globalCompositeOperation = 'destination-out'; 50 - ctx.fillText(text, rect.width / 2, rect.height / 2); 68 + ctx.fillText(text, width / 2, textY); 69 + ctx.globalCompositeOperation = 'source-over'; 70 + maskReady = true; 71 + } 72 + 73 + function scheduleMaskDraw() { 74 + const width = container?.clientWidth ?? 0; 75 + const height = container?.clientHeight ?? 0; 76 + if (width > 0 && height > 0) { 77 + drawOverlayCanvas(); 78 + return; 79 + } 80 + if (maskDrawRaf) return; 81 + maskDrawRaf = requestAnimationFrame(() => { 82 + maskDrawRaf = 0; 83 + const nextWidth = container?.clientWidth ?? 0; 84 + const nextHeight = container?.clientHeight ?? 0; 85 + if (nextWidth === 0 || nextHeight === 0) { 86 + scheduleMaskDraw(); 87 + return; 88 + } 89 + drawOverlayCanvas(); 90 + }); 51 91 } 52 92 53 93 // Redraw overlay when text settings change (only after initialization) 54 94 $effect(() => { 55 95 // Access all reactive values to track them 56 96 text; 57 - fontWeight; 58 - fontFamily; 59 97 fontSize; 60 98 // Only redraw if already initialized 61 99 if (isInitialized) { 62 - drawOverlayCanvas(); 100 + scheduleMaskDraw(); 63 101 } 64 102 }); 65 103 66 104 onMount(async () => { 67 105 // Wait for layout to settle 68 106 await tick(); 69 - initFluidSimulation(); 107 + // Wait for a frame to ensure dimensions are set 108 + requestAnimationFrame(() => { 109 + initFluidSimulation(); 110 + }); 111 + 112 + if (document.fonts?.ready) { 113 + document.fonts.ready.then(() => { 114 + if (isInitialized) scheduleMaskDraw(); 115 + }); 116 + } 70 117 }); 71 118 72 119 onDestroy(() => { 73 120 if (animationId) cancelAnimationFrame(animationId); 74 121 if (splatIntervalId) clearInterval(splatIntervalId); 122 + if (maskDrawRaf) cancelAnimationFrame(maskDrawRaf); 75 123 if (resizeObserver) resizeObserver.disconnect(); 76 124 }); 77 125 78 126 function initFluidSimulation() { 79 127 if (!fluidCanvas || !maskCanvas || !container) return; 80 128 81 - drawOverlayCanvas(); 129 + maskReady = false; 130 + scheduleMaskDraw(); 82 131 83 132 // Simulation config 84 133 const config = { ··· 123 172 deltaY: 0, 124 173 down: false, 125 174 moved: false, 126 - color: [30, 0, 300] as [number, number, number] 175 + color: [0, 0, 0] as [number, number, number] 127 176 }; 128 177 } 129 178 ··· 163 212 if (!gl) return { gl: null, ext: { supportLinearFiltering: false } as any }; 164 213 165 214 let halfFloat: any; 166 - let supportLinearFiltering: any; 215 + let supportLinearFiltering = false; 167 216 if (isWebGL2) { 168 217 gl.getExtension('EXT_color_buffer_float'); 169 - supportLinearFiltering = gl.getExtension('OES_texture_float_linear'); 218 + supportLinearFiltering = !!gl.getExtension('OES_texture_float_linear'); 170 219 } else { 171 220 halfFloat = gl.getExtension('OES_texture_half_float'); 172 - supportLinearFiltering = gl.getExtension('OES_texture_half_float_linear'); 221 + supportLinearFiltering = !!gl.getExtension('OES_texture_half_float_linear'); 173 222 } 174 223 175 224 gl.clearColor(0.0, 0.0, 0.0, 1.0); 176 225 177 - const halfFloatTexType = isWebGL2 ? gl.HALF_FLOAT : halfFloat?.HALF_FLOAT_OES; 226 + let halfFloatTexType = isWebGL2 ? gl.HALF_FLOAT : halfFloat?.HALF_FLOAT_OES; 227 + let fallbackToUnsignedByte = false; 228 + if (!halfFloatTexType) { 229 + halfFloatTexType = gl.UNSIGNED_BYTE; 230 + supportLinearFiltering = true; 231 + fallbackToUnsignedByte = true; 232 + } 178 233 let formatRGBA: any; 179 234 let formatRG: any; 180 235 let formatR: any; 181 236 182 237 if (isWebGL2) { 183 - formatRGBA = getSupportedFormat(gl, gl.RGBA16F, gl.RGBA, halfFloatTexType); 184 - formatRG = getSupportedFormat(gl, gl.RG16F, gl.RG, halfFloatTexType); 185 - formatR = getSupportedFormat(gl, gl.R16F, gl.RED, halfFloatTexType); 238 + if (fallbackToUnsignedByte) { 239 + formatRGBA = { internalFormat: gl.RGBA8, format: gl.RGBA }; 240 + formatRG = { internalFormat: gl.RGBA8, format: gl.RGBA }; 241 + formatR = { internalFormat: gl.RGBA8, format: gl.RGBA }; 242 + } else { 243 + formatRGBA = getSupportedFormat(gl, gl.RGBA16F, gl.RGBA, halfFloatTexType); 244 + formatRG = getSupportedFormat(gl, gl.RG16F, gl.RG, halfFloatTexType); 245 + formatR = getSupportedFormat(gl, gl.R16F, gl.RED, halfFloatTexType); 246 + if (!formatRGBA) formatRGBA = { internalFormat: gl.RGBA8, format: gl.RGBA }; 247 + if (!formatRG) formatRG = { internalFormat: gl.RGBA8, format: gl.RGBA }; 248 + if (!formatR) formatR = { internalFormat: gl.RGBA8, format: gl.RGBA }; 249 + } 186 250 } else { 187 - formatRGBA = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType); 188 - formatRG = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType); 189 - formatR = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType); 251 + formatRGBA = { internalFormat: gl.RGBA, format: gl.RGBA }; 252 + formatRG = { internalFormat: gl.RGBA, format: gl.RGBA }; 253 + formatR = { internalFormat: gl.RGBA, format: gl.RGBA }; 254 + if (!fallbackToUnsignedByte) { 255 + formatRGBA = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType) ?? formatRGBA; 256 + formatRG = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType) ?? formatRG; 257 + formatR = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType) ?? formatR; 258 + } 190 259 } 191 260 192 261 return { ··· 226 295 format: number, 227 296 type: number 228 297 ) { 298 + if (!type) return false; 229 299 const texture = gl.createTexture(); 230 300 gl.bindTexture(gl.TEXTURE_2D, texture); 231 301 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); ··· 729 799 730 800 // Setup blit 731 801 gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); 732 - gl.bufferData( 733 - gl.ARRAY_BUFFER, 734 - new Float32Array([-1, -1, -1, 1, 1, 1, 1, -1]), 735 - gl.STATIC_DRAW 736 - ); 802 + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, -1, 1, 1, 1, 1, -1]), gl.STATIC_DRAW); 737 803 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer()); 738 - gl.bufferData( 739 - gl.ELEMENT_ARRAY_BUFFER, 740 - new Uint16Array([0, 1, 2, 0, 2, 3]), 741 - gl.STATIC_DRAW 742 - ); 804 + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 0, 2, 3]), gl.STATIC_DRAW); 743 805 gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); 744 806 gl.enableVertexAttribArray(0); 745 807 ··· 1029 1091 texType, 1030 1092 gl.NEAREST 1031 1093 ); 1032 - curl = createFBO(simRes.width, simRes.height, r.internalFormat, r.format, texType, gl.NEAREST); 1094 + curl = createFBO( 1095 + simRes.width, 1096 + simRes.height, 1097 + r.internalFormat, 1098 + r.format, 1099 + texType, 1100 + gl.NEAREST 1101 + ); 1033 1102 pressure = createDoubleFBO( 1034 1103 simRes.width, 1035 1104 simRes.height, ··· 1049 1118 const filtering = ext.supportLinearFiltering ? gl.LINEAR : gl.NEAREST; 1050 1119 1051 1120 sunrays = createFBO(res.width, res.height, r.internalFormat, r.format, texType, filtering); 1052 - sunraysTemp = createFBO(res.width, res.height, r.internalFormat, r.format, texType, filtering); 1121 + sunraysTemp = createFBO( 1122 + res.width, 1123 + res.height, 1124 + r.internalFormat, 1125 + r.format, 1126 + texType, 1127 + filtering 1128 + ); 1053 1129 } 1054 1130 1055 1131 function updateKeywords() { ··· 1070 1146 if (fluidCanvas.width !== width || fluidCanvas.height !== height) { 1071 1147 fluidCanvas.width = width; 1072 1148 fluidCanvas.height = height; 1073 - drawOverlayCanvas(); 1149 + scheduleMaskDraw(); 1074 1150 return true; 1075 1151 } 1076 1152 return false; ··· 1128 1204 return radius; 1129 1205 } 1130 1206 1131 - function splat(x: number, y: number, dx: number, dy: number, color: { r: number; g: number; b: number }) { 1207 + function splat( 1208 + x: number, 1209 + y: number, 1210 + dx: number, 1211 + dy: number, 1212 + color: { r: number; g: number; b: number } 1213 + ) { 1132 1214 splatProgram.bind(); 1133 1215 gl.uniform1i(splatProgram.uniforms.uTarget, velocity.read.attach(0)); 1134 1216 gl.uniform1f(splatProgram.uniforms.aspectRatio, fluidCanvas.width / fluidCanvas.height); ··· 1151 1233 color.g *= 10.0; 1152 1234 color.b *= 10.0; 1153 1235 const x = Math.random(); 1154 - const y = Math.random() < 0.5 ? 0.8 : 0.2; 1155 - const dx = 100 * (Math.random() - 0.5); 1156 - const dy = 1000 * (Math.random() - 0.5); 1236 + const y = Math.random() < 0.5 ? 0.95 : 0.05; 1237 + const dx = 300 * (Math.random() - 0.5); 1238 + const dy = 3000 * (Math.random() - 0.5); 1157 1239 splat(x, y, dx, dy, color); 1158 1240 } 1159 1241 } 1160 1242 1161 1243 function splatPointer(pointer: Pointer) { 1162 - const dx = pointer.deltaX * config.SPLAT_FORCE * 5; 1163 - const dy = pointer.deltaY * config.SPLAT_FORCE * 5; 1244 + const dx = pointer.deltaX * config.SPLAT_FORCE * 12; 1245 + const dy = pointer.deltaY * config.SPLAT_FORCE * 12; 1164 1246 splat(pointer.texcoordX, pointer.texcoordY, dx, dy, { 1165 1247 r: pointer.color[0], 1166 1248 g: pointer.color[1], ··· 1328 1410 colorUpdateTimer = wrap(colorUpdateTimer, 0, 1); 1329 1411 pointers.forEach((p) => { 1330 1412 const c = generateColor(); 1331 - p.color = [c.r * 255, c.g * 255, c.b * 255]; 1413 + p.color = [c.r, c.g, c.b]; 1332 1414 }); 1333 1415 } 1334 1416 } ··· 1355 1437 function update() { 1356 1438 const dt = calcDeltaTime() * (config.RENDER_SPEED ?? 1.0); 1357 1439 if (resizeCanvas()) initFramebuffers(); 1440 + if (!maskReady) { 1441 + scheduleMaskDraw(); 1442 + gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); 1443 + gl.clearColor(0.0, 0.0, 0.0, 1.0); 1444 + gl.clear(gl.COLOR_BUFFER_BIT); 1445 + animationId = requestAnimationFrame(update); 1446 + return; 1447 + } 1358 1448 updateColors(dt); 1359 1449 applyInputs(); 1360 1450 if (!config.PAUSED) step(dt); ··· 1395 1485 pointer.deltaX = 0; 1396 1486 pointer.deltaY = 0; 1397 1487 const c = generateColor(); 1398 - pointer.color = [c.r * 255, c.g * 255, c.b * 255]; 1488 + pointer.color = [c.r, c.g, c.b]; 1399 1489 } 1400 1490 1401 1491 function updatePointerMoveData(pointer: Pointer, posX: number, posY: number) { ··· 1412 1502 pointer.down = false; 1413 1503 } 1414 1504 1415 - // Event handlers 1416 - fluidCanvas.addEventListener('mouseenter', (e) => { 1505 + // Event handlers - use container so events work over both canvases 1506 + container.addEventListener('mouseenter', (e) => { 1417 1507 // Create a small burst when mouse enters the card 1418 - const posX = scaleByPixelRatio(e.offsetX); 1419 - const posY = scaleByPixelRatio(e.offsetY); 1508 + const rect = container.getBoundingClientRect(); 1509 + const posX = scaleByPixelRatio(e.clientX - rect.left); 1510 + const posY = scaleByPixelRatio(e.clientY - rect.top); 1420 1511 const x = posX / fluidCanvas.width; 1421 1512 const y = 1.0 - posY / fluidCanvas.height; 1422 1513 const color = generateColor(); ··· 1426 1517 splat(x, y, 300 * (Math.random() - 0.5), 300 * (Math.random() - 0.5), color); 1427 1518 }); 1428 1519 1429 - fluidCanvas.addEventListener('mousedown', (e) => { 1430 - const posX = scaleByPixelRatio(e.offsetX); 1431 - const posY = scaleByPixelRatio(e.offsetY); 1520 + container.addEventListener('mousedown', (e) => { 1521 + const rect = container.getBoundingClientRect(); 1522 + const posX = scaleByPixelRatio(e.clientX - rect.left); 1523 + const posY = scaleByPixelRatio(e.clientY - rect.top); 1432 1524 let pointer = pointers.find((p) => p.id === -1); 1433 1525 if (!pointer) pointer = PointerPrototype(); 1434 1526 updatePointerDownData(pointer, -1, posX, posY); 1435 1527 }); 1436 1528 1437 - fluidCanvas.addEventListener('mousemove', (e) => { 1529 + container.addEventListener('mousemove', (e) => { 1438 1530 const pointer = pointers[0]; 1439 - const posX = scaleByPixelRatio(e.offsetX); 1440 - const posY = scaleByPixelRatio(e.offsetY); 1531 + const rect = container.getBoundingClientRect(); 1532 + const posX = scaleByPixelRatio(e.clientX - rect.left); 1533 + const posY = scaleByPixelRatio(e.clientY - rect.top); 1441 1534 updatePointerMoveData(pointer, posX, posY); 1442 1535 // Always create swish effect on hover 1443 1536 if (pointer.moved) { 1444 1537 pointer.moved = false; 1445 1538 // Generate a new color for visual interest 1446 1539 const c = generateColor(); 1447 - pointer.color = [c.r * 255, c.g * 255, c.b * 255]; 1448 - splatPointer(pointer); 1540 + pointer.color = [c.r, c.g, c.b]; 1541 + splat( 1542 + pointer.texcoordX, 1543 + pointer.texcoordY, 1544 + pointer.deltaX * config.SPLAT_FORCE * 12, 1545 + pointer.deltaY * config.SPLAT_FORCE * 12, 1546 + { 1547 + r: pointer.color[0], 1548 + g: pointer.color[1], 1549 + b: pointer.color[2] 1550 + } 1551 + ); 1449 1552 } 1450 1553 }); 1451 1554 1452 - fluidCanvas.addEventListener('mouseup', () => { 1555 + container.addEventListener('mouseup', () => { 1453 1556 updatePointerUpData(pointers[0]); 1454 1557 }); 1455 1558 1456 - fluidCanvas.addEventListener('touchstart', (e) => { 1559 + container.addEventListener('touchstart', (e) => { 1457 1560 e.preventDefault(); 1458 1561 const touches = e.targetTouches; 1459 1562 while (touches.length >= pointers.length) pointers.push(PointerPrototype()); 1460 1563 for (let i = 0; i < touches.length; i++) { 1461 - const rect = fluidCanvas.getBoundingClientRect(); 1564 + const rect = container.getBoundingClientRect(); 1462 1565 const posX = scaleByPixelRatio(touches[i].clientX - rect.left); 1463 1566 const posY = scaleByPixelRatio(touches[i].clientY - rect.top); 1464 1567 updatePointerDownData(pointers[i + 1], touches[i].identifier, posX, posY); 1465 1568 } 1466 1569 }); 1467 1570 1468 - fluidCanvas.addEventListener('touchmove', (e) => { 1571 + container.addEventListener('touchmove', (e) => { 1469 1572 e.preventDefault(); 1470 1573 const touches = e.targetTouches; 1471 1574 for (let i = 0; i < touches.length; i++) { 1472 1575 const pointer = pointers[i + 1]; 1473 1576 if (!pointer.down) continue; 1474 - const rect = fluidCanvas.getBoundingClientRect(); 1577 + const rect = container.getBoundingClientRect(); 1475 1578 const posX = scaleByPixelRatio(touches[i].clientX - rect.left); 1476 1579 const posY = scaleByPixelRatio(touches[i].clientY - rect.top); 1477 1580 updatePointerMoveData(pointer, posX, posY); 1478 1581 } 1479 1582 }); 1480 1583 1481 - fluidCanvas.addEventListener('touchend', (e) => { 1584 + container.addEventListener('touchend', (e) => { 1482 1585 const touches = e.changedTouches; 1483 1586 for (let i = 0; i < touches.length; i++) { 1484 1587 const pointer = pointers.find((p) => p.id === touches[i].identifier); ··· 1500 1603 // Resize observer - also triggers initial draw 1501 1604 resizeObserver = new ResizeObserver(() => { 1502 1605 resizeCanvas(); 1503 - drawOverlayCanvas(); 1606 + maskReady = false; 1607 + scheduleMaskDraw(); 1504 1608 }); 1505 1609 resizeObserver.observe(container); 1506 1610
+18 -109
src/lib/cards/FluidTextCard/FluidTextCardSettings.svelte
··· 1 1 <script lang="ts"> 2 2 import type { Item } from '$lib/types'; 3 3 import type { ContentComponentProps } from '../types'; 4 - import { ToggleGroup, ToggleGroupItem, Button, Input, Label } from '@foxui/core'; 4 + import { Input, Label } from '@foxui/core'; 5 5 6 6 let { item = $bindable<Item>() }: ContentComponentProps = $props(); 7 7 8 - const fontWeights = ['400', '500', '600', '700', '800', '900'] as const; 9 - const fontFamilies = [ 10 - 'Arial', 11 - 'Helvetica', 12 - 'Georgia', 13 - 'Times New Roman', 14 - 'Courier New', 15 - 'monospace' 16 - ] as const; 8 + // Initialize fontSize if not set 9 + if (item.cardData.fontSize === undefined) { 10 + item.cardData.fontSize = 0.33; 11 + } 17 12 18 - const classes = 'size-8 min-w-8 text-xs cursor-pointer'; 13 + const displayPercent = $derived(Math.round((parseFloat(item.cardData.fontSize) as number) * 100)); 19 14 </script> 20 15 21 16 <div class="flex flex-col gap-3"> 22 17 <div> 23 18 <Label class="mb-1 text-xs">Text</Label> 24 - <Input 25 - bind:value={item.cardData.text} 26 - placeholder="Enter text" 27 - class="w-full" 28 - /> 29 - </div> 30 - 31 - <div> 32 - <Label class="mb-1 text-xs">Font Weight</Label> 33 - <ToggleGroup 34 - type="single" 35 - bind:value={ 36 - () => item.cardData.fontWeight ?? '900', 37 - (value) => { 38 - if (!value) return; 39 - item.cardData.fontWeight = value; 40 - } 41 - } 42 - > 43 - {#each fontWeights as weight (weight)} 44 - <ToggleGroupItem size="sm" value={weight} class={classes}> 45 - {weight} 46 - </ToggleGroupItem> 47 - {/each} 48 - </ToggleGroup> 19 + <Input bind:value={item.cardData.text} placeholder="Enter text" class="w-full" /> 49 20 </div> 50 21 51 22 <div> 52 - <Label class="mb-1 text-xs">Font Family</Label> 53 - <select 54 - class="w-full rounded-md border border-base-200 bg-base-50 px-2 py-1.5 text-sm dark:border-base-800 dark:bg-base-900" 55 - value={item.cardData.fontFamily ?? 'Arial'} 56 - onchange={(e) => { 57 - item.cardData.fontFamily = e.currentTarget.value; 23 + <Label class="mb-1 text-xs">Font Size ({displayPercent}%)</Label> 24 + <input 25 + type="range" 26 + min="0.1" 27 + max="0.8" 28 + step="0.01" 29 + value={parseFloat(item.cardData.fontSize) ?? 0.33} 30 + oninput={(e) => { 31 + item.cardData.fontSize = e.currentTarget.value.toString(); 58 32 }} 59 - > 60 - {#each fontFamilies as font (font)} 61 - <option value={font}>{font}</option> 62 - {/each} 63 - </select> 64 - </div> 65 - 66 - <div> 67 - <Label class="mb-1 text-xs">Font Size ({Math.round((item.cardData.fontSize ?? 0.33) * 100)}%)</Label> 68 - <div class="flex items-center gap-2"> 69 - <Button 70 - variant="ghost" 71 - size="sm" 72 - onclick={() => { 73 - item.cardData.fontSize = Math.max((item.cardData.fontSize ?? 0.33) - 0.05, 0.1); 74 - }} 75 - disabled={(item.cardData.fontSize ?? 0.33) <= 0.1} 76 - > 77 - <svg 78 - xmlns="http://www.w3.org/2000/svg" 79 - width="16" 80 - height="16" 81 - viewBox="0 0 24 24" 82 - fill="none" 83 - stroke="currentColor" 84 - stroke-width="2" 85 - stroke-linecap="round" 86 - stroke-linejoin="round" 87 - > 88 - <path d="M5 12h14" /> 89 - </svg> 90 - </Button> 91 - <input 92 - type="range" 93 - min="0.1" 94 - max="0.8" 95 - step="0.01" 96 - value={item.cardData.fontSize ?? 0.33} 97 - oninput={(e) => { 98 - item.cardData.fontSize = parseFloat(e.currentTarget.value); 99 - }} 100 - class="h-2 w-full cursor-pointer appearance-none rounded-lg bg-base-200 dark:bg-base-700" 101 - /> 102 - <Button 103 - variant="ghost" 104 - size="sm" 105 - onclick={() => { 106 - item.cardData.fontSize = Math.min((item.cardData.fontSize ?? 0.33) + 0.05, 0.8); 107 - }} 108 - disabled={(item.cardData.fontSize ?? 0.33) >= 0.8} 109 - > 110 - <svg 111 - xmlns="http://www.w3.org/2000/svg" 112 - width="16" 113 - height="16" 114 - viewBox="0 0 24 24" 115 - fill="none" 116 - stroke="currentColor" 117 - stroke-width="2" 118 - stroke-linecap="round" 119 - stroke-linejoin="round" 120 - > 121 - <path d="M5 12h14" /> 122 - <path d="M12 5v14" /> 123 - </svg> 124 - </Button> 125 - </div> 33 + class="bg-base-200 dark:bg-base-700 h-2 w-full cursor-pointer appearance-none rounded-lg" 34 + /> 126 35 </div> 127 36 </div>
+9 -10
src/lib/cards/FluidTextCard/index.ts
··· 1 1 import type { CardDefinition } from '../types'; 2 2 import CreateFluidTextCardModal from './CreateFluidTextCardModal.svelte'; 3 + import EditingFluidTextCard from './EditingFluidTextCard.svelte'; 3 4 import FluidTextCard from './FluidTextCard.svelte'; 4 5 import FluidTextCardSettings from './FluidTextCardSettings.svelte'; 5 6 6 7 export const FluidTextCardDefinition = { 7 8 type: 'fluid-text', 8 9 contentComponent: FluidTextCard, 10 + editingContentComponent: EditingFluidTextCard, 9 11 createNew: (card) => { 10 12 card.cardType = 'fluid-text'; 11 13 card.cardData = { 12 - text: '', 13 - fontWeight: '900', 14 - fontFamily: 'Arial', 15 - fontSize: 0.33 14 + text: '' 16 15 }; 17 - card.w = 4; 18 - card.h = 2; 19 - card.mobileW = 4; 20 - card.mobileH = 2; 16 + card.w = 8; 17 + card.h = 3; 18 + card.mobileW = 8; 19 + card.mobileH = 4; 21 20 }, 22 21 creationModalComponent: CreateFluidTextCardModal, 23 22 settingsComponent: FluidTextCardSettings, 24 23 sidebarButtonText: 'Fluid Text', 25 24 defaultColor: 'transparent', 26 - minW: 2, 27 - minH: 2 25 + allowSetColor: false, 26 + minW: 2 28 27 } as CardDefinition & { type: 'fluid-text' };
-2
src/lib/cards/FluidTextCard/text_effect_fluid-main/.gitignore
··· 1 - /.DS_Store 2 - /.vite
src/lib/cards/FluidTextCard/text_effect_fluid-main/LDR_LLL1_0.png src/lib/cards/FluidTextCard/LDR_LLL1_0.png
-7
src/lib/cards/FluidTextCard/text_effect_fluid-main/LICENSE
··· 1 - Copyright 2024 flo-bit 2 - 3 - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 - 5 - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 - 7 - THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-71
src/lib/cards/FluidTextCard/text_effect_fluid-main/Readme.md
··· 1 - # Text effect: Fluid Simulation demo 2 - 3 - [Live demo](https://flo-bit.github.io/text_effect_fluid/) (currently sometimes breaks on first open, just reload once or twice) 4 - 5 - [![cover](cover.png)](https://flo-bit.github.io/text_effect_fluid/) 6 - 7 - Inspired by the current (Jan 2024) version of [the lumalabs homepage](https://lumalabs.ai/) (obviously, their effect looks *way* better, than my quick and dirty version): 8 - 9 - ![lumalabs](luma.png) 10 - 11 - Adjusted version of this awesome [WebGL Fluid Simulation](https://github.com/PavelDoGreat/WebGL-Fluid-Simulation). 12 - 13 - ## How it works 14 - 15 - I wrote a short [blog post](https://flobit.substack.com/p/how-i-recreated-this-awesome-text) about my approach. 16 - 17 - ## Usage 18 - 19 - - Add `script.js` and `LDR_LLL1_0.png` to your project 20 - 21 - - Add this to your html 22 - 23 - ```html 24 - <div id="canvasContainer"> 25 - <canvas></canvas> 26 - <canvas id="maskCanvas"> </canvas> 27 - </div> 28 - 29 - <script src="./script.js"></script> 30 - ``` 31 - 32 - - Add this styling 33 - 34 - ```css 35 - html, 36 - body { 37 - overflow: hidden; 38 - background-color: #000; 39 - } 40 - 41 - body { 42 - margin: 0; 43 - } 44 - 45 - #canvasContainer { 46 - position: relative; 47 - width: 100vw; 48 - height: 100vh; 49 - } 50 - 51 - canvas { 52 - width: 100%; 53 - height: 100%; 54 - position: absolute; 55 - } 56 - ``` 57 - 58 - 59 - ## License 60 - 61 - MIT License 62 - 63 - ``` 64 - Copyright 2024 flo-bit 65 - 66 - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 67 - 68 - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 69 - 70 - THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 71 - ```
src/lib/cards/FluidTextCard/text_effect_fluid-main/cover.png

This is a binary file and will not be displayed.

-46
src/lib/cards/FluidTextCard/text_effect_fluid-main/index.html
··· 1 - <!doctype html> 2 - <html lang="en" class="bg-black"> 3 - 4 - <head> 5 - <meta charset="utf-8" /> 6 - <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 - 8 - <title>fluid text effect</title> 9 - 10 - <style> 11 - html, 12 - body { 13 - overflow: hidden; 14 - background-color: #000; 15 - } 16 - 17 - body { 18 - margin: 0; 19 - } 20 - 21 - #canvasContainer { 22 - position: relative; 23 - width: 100vw; 24 - height: 100vh; 25 - } 26 - 27 - canvas { 28 - width: 100%; 29 - height: 100%; 30 - position: absolute; 31 - } 32 - </style> 33 - 34 - </head> 35 - 36 - <body> 37 - <!-- <input id="name"></input> --> 38 - <div id="canvasContainer"> 39 - <canvas></canvas> 40 - <canvas id="maskCanvas"> </canvas> 41 - </div> 42 - 43 - <script src="./script.js"></script> 44 - </body> 45 - 46 - </html>
src/lib/cards/FluidTextCard/text_effect_fluid-main/luma.png

This is a binary file and will not be displayed.

-1641
src/lib/cards/FluidTextCard/text_effect_fluid-main/script.js
··· 1 - /* 2 - MIT License 3 - 4 - Copyright (c) 2017 Pavel Dobryakov 5 - 6 - Permission is hereby granted, free of charge, to any person obtaining a copy 7 - of this software and associated documentation files (the "Software"), to deal 8 - in the Software without restriction, including without limitation the rights 9 - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 - copies of the Software, and to permit persons to whom the Software is 11 - furnished to do so, subject to the following conditions: 12 - 13 - The above copyright notice and this permission notice shall be included in all 14 - copies or substantial portions of the Software. 15 - 16 - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 - SOFTWARE. 23 - */ 24 - 25 - 'use strict'; 26 - 27 - const overlayConfig = { 28 - text: 'flo-bit', 29 - fontWidth: '900', 30 - font: 'Arial', 31 - fontSize: 1/3, // percentage to canvas width 32 - } 33 - 34 - // overlay canvas 35 - 36 - function resizeOverlayCanvas() { 37 - let overlayCanvas = document.getElementById('maskCanvas'); 38 - let container = document.getElementById('canvasContainer'); 39 - 40 - overlayCanvas.width = container.offsetWidth; 41 - overlayCanvas.height = container.offsetHeight; 42 - 43 - let ctx = overlayCanvas.getContext('2d'); 44 - 45 - let dpr = window.devicePixelRatio || 1; 46 - let rect = overlayCanvas.getBoundingClientRect(); 47 - 48 - overlayCanvas.width = rect.width * dpr; 49 - overlayCanvas.height = rect.height * dpr; 50 - ctx.scale(dpr, dpr); 51 - 52 - ctx.fillStyle = 'black'; 53 - ctx.fillRect(0, 0, overlayCanvas.width, overlayCanvas.height); 54 - 55 - let fontSize = Math.round(rect.width * overlayConfig.fontSize); 56 - ctx.font = overlayConfig.fontWidth + ' ' + fontSize + 'px ' + overlayConfig.font; 57 - 58 - ctx.strokeStyle = 'rgba(255, 255, 255, 0.3)'; 59 - ctx.lineWidth = 2; 60 - 61 - ctx.textBaseline = 'middle'; 62 - ctx.textAlign = 'center'; 63 - 64 - ctx.strokeText(overlayConfig.text, rect.width / 2, rect.height / 2); 65 - 66 - ctx.globalCompositeOperation = 'destination-out'; 67 - ctx.fillText(overlayConfig.text, rect.width / 2, rect.height / 2); 68 - } 69 - 70 - // const input = document.getElementById('name'); 71 - 72 - // // on change 73 - // input.addEventListener('change', function() { 74 - // overlayConfig.text = input.value; 75 - // resizeOverlayCanvas(); 76 - // }); 77 - 78 - 79 - // Initial resize 80 - resizeOverlayCanvas(); 81 - 82 - // Resize canvas on window resize 83 - window.addEventListener('resize', resizeOverlayCanvas); 84 - 85 - 86 - // Simulation section 87 - 88 - const canvas = document.getElementsByTagName('canvas')[0]; 89 - resizeCanvas(); 90 - 91 - let config = { 92 - SIM_RESOLUTION: 128, 93 - DYE_RESOLUTION: 1024, 94 - CAPTURE_RESOLUTION: 512, 95 - DENSITY_DISSIPATION: 1.0, 96 - VELOCITY_DISSIPATION: 0.1, 97 - PRESSURE: 0.8, 98 - PRESSURE_ITERATIONS: 20, 99 - CURL: 30, 100 - SPLAT_RADIUS: 0.25, 101 - SPLAT_FORCE: 1000, 102 - SHADING: true, 103 - COLORFUL: true, 104 - COLOR_UPDATE_SPEED: 10, 105 - PAUSED: false, 106 - BACK_COLOR: { r: 0, g: 0, b: 0 }, 107 - TRANSPARENT: false, 108 - BLOOM: false, 109 - BLOOM_ITERATIONS: 8, 110 - BLOOM_RESOLUTION: 256, 111 - BLOOM_INTENSITY: 0.8, 112 - BLOOM_THRESHOLD: 0.8, 113 - BLOOM_SOFT_KNEE: 0.7, 114 - SUNRAYS: true, 115 - SUNRAYS_RESOLUTION: 196, 116 - SUNRAYS_WEIGHT: 1.0, 117 - START_HUE: 0.5, 118 - END_HUE: 1.0, 119 - RENDER_SPEED: 0.4 120 - }; 121 - 122 - function PointerPrototype() { 123 - this.id = -1; 124 - this.texcoordX = 0; 125 - this.texcoordY = 0; 126 - this.prevTexcoordX = 0; 127 - this.prevTexcoordY = 0; 128 - this.deltaX = 0; 129 - this.deltaY = 0; 130 - this.down = false; 131 - this.moved = false; 132 - this.color = [30, 0, 300]; 133 - } 134 - 135 - let pointers = []; 136 - let splatStack = []; 137 - pointers.push(new PointerPrototype()); 138 - 139 - const { gl, ext } = getWebGLContext(canvas); 140 - 141 - if (isMobile()) { 142 - config.DYE_RESOLUTION = 512; 143 - } 144 - if (!ext.supportLinearFiltering) { 145 - config.DYE_RESOLUTION = 512; 146 - config.SHADING = false; 147 - config.BLOOM = false; 148 - config.SUNRAYS = false; 149 - } 150 - 151 - function getWebGLContext(canvas) { 152 - const params = { 153 - alpha: true, 154 - depth: false, 155 - stencil: true, 156 - antialias: false, 157 - preserveDrawingBuffer: false 158 - }; 159 - 160 - 161 - let gl = canvas.getContext('webgl2', params); 162 - const isWebGL2 = !!gl; 163 - if (!isWebGL2) 164 - gl = canvas.getContext('webgl', params) || canvas.getContext('experimental-webgl', params); 165 - 166 - let halfFloat; 167 - let supportLinearFiltering; 168 - if (isWebGL2) { 169 - gl.getExtension('EXT_color_buffer_float'); 170 - supportLinearFiltering = gl.getExtension('OES_texture_float_linear'); 171 - } else { 172 - halfFloat = gl.getExtension('OES_texture_half_float'); 173 - supportLinearFiltering = gl.getExtension('OES_texture_half_float_linear'); 174 - } 175 - 176 - gl.clearColor(0.0, 0.0, 0.0, 1.0); 177 - 178 - const halfFloatTexType = isWebGL2 ? gl.HALF_FLOAT : halfFloat.HALF_FLOAT_OES; 179 - let formatRGBA; 180 - let formatRG; 181 - let formatR; 182 - 183 - if (isWebGL2) { 184 - formatRGBA = getSupportedFormat(gl, gl.RGBA16F, gl.RGBA, halfFloatTexType); 185 - formatRG = getSupportedFormat(gl, gl.RG16F, gl.RG, halfFloatTexType); 186 - formatR = getSupportedFormat(gl, gl.R16F, gl.RED, halfFloatTexType); 187 - } else { 188 - formatRGBA = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType); 189 - formatRG = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType); 190 - formatR = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType); 191 - } 192 - 193 - return { 194 - gl, 195 - ext: { 196 - formatRGBA, 197 - formatRG, 198 - formatR, 199 - halfFloatTexType, 200 - supportLinearFiltering 201 - } 202 - }; 203 - } 204 - 205 - function getSupportedFormat(gl, internalFormat, format, type) { 206 - if (!supportRenderTextureFormat(gl, internalFormat, format, type)) { 207 - switch (internalFormat) { 208 - case gl.R16F: 209 - return getSupportedFormat(gl, gl.RG16F, gl.RG, type); 210 - case gl.RG16F: 211 - return getSupportedFormat(gl, gl.RGBA16F, gl.RGBA, type); 212 - default: 213 - return null; 214 - } 215 - } 216 - 217 - return { 218 - internalFormat, 219 - format 220 - }; 221 - } 222 - 223 - function supportRenderTextureFormat(gl, internalFormat, format, type) { 224 - let texture = gl.createTexture(); 225 - gl.bindTexture(gl.TEXTURE_2D, texture); 226 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 227 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 228 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 229 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 230 - gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 4, 4, 0, format, type, null); 231 - 232 - let fbo = gl.createFramebuffer(); 233 - gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); 234 - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); 235 - 236 - let status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); 237 - return status == gl.FRAMEBUFFER_COMPLETE; 238 - } 239 - 240 - function isMobile() { 241 - return /Mobi|Android/i.test(navigator.userAgent); 242 - } 243 - 244 - class Material { 245 - constructor(vertexShader, fragmentShaderSource) { 246 - this.vertexShader = vertexShader; 247 - this.fragmentShaderSource = fragmentShaderSource; 248 - this.programs = []; 249 - this.activeProgram = null; 250 - this.uniforms = []; 251 - } 252 - 253 - setKeywords(keywords) { 254 - let hash = 0; 255 - for (let i = 0; i < keywords.length; i++) hash += hashCode(keywords[i]); 256 - 257 - let program = this.programs[hash]; 258 - if (program == null) { 259 - let fragmentShader = compileShader(gl.FRAGMENT_SHADER, this.fragmentShaderSource, keywords); 260 - program = createProgram(this.vertexShader, fragmentShader); 261 - this.programs[hash] = program; 262 - } 263 - 264 - if (program == this.activeProgram) return; 265 - 266 - this.uniforms = getUniforms(program); 267 - this.activeProgram = program; 268 - } 269 - 270 - bind() { 271 - gl.useProgram(this.activeProgram); 272 - } 273 - } 274 - 275 - class Program { 276 - constructor(vertexShader, fragmentShader) { 277 - this.uniforms = {}; 278 - this.program = createProgram(vertexShader, fragmentShader); 279 - this.uniforms = getUniforms(this.program); 280 - } 281 - 282 - bind() { 283 - gl.useProgram(this.program); 284 - } 285 - } 286 - 287 - function createProgram(vertexShader, fragmentShader) { 288 - let program = gl.createProgram(); 289 - gl.attachShader(program, vertexShader); 290 - gl.attachShader(program, fragmentShader); 291 - gl.linkProgram(program); 292 - 293 - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) 294 - console.trace(gl.getProgramInfoLog(program)); 295 - 296 - return program; 297 - } 298 - 299 - function getUniforms(program) { 300 - let uniforms = []; 301 - let uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); 302 - for (let i = 0; i < uniformCount; i++) { 303 - let uniformName = gl.getActiveUniform(program, i).name; 304 - uniforms[uniformName] = gl.getUniformLocation(program, uniformName); 305 - } 306 - return uniforms; 307 - } 308 - 309 - function compileShader(type, source, keywords) { 310 - source = addKeywords(source, keywords); 311 - 312 - const shader = gl.createShader(type); 313 - gl.shaderSource(shader, source); 314 - gl.compileShader(shader); 315 - 316 - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) console.trace(gl.getShaderInfoLog(shader)); 317 - 318 - return shader; 319 - } 320 - 321 - function addKeywords(source, keywords) { 322 - if (keywords == null) return source; 323 - let keywordsString = ''; 324 - keywords.forEach((keyword) => { 325 - keywordsString += '#define ' + keyword + '\n'; 326 - }); 327 - return keywordsString + source; 328 - } 329 - 330 - const baseVertexShader = compileShader( 331 - gl.VERTEX_SHADER, 332 - ` 333 - precision highp float; 334 - 335 - attribute vec2 aPosition; 336 - varying vec2 vUv; 337 - varying vec2 vL; 338 - varying vec2 vR; 339 - varying vec2 vT; 340 - varying vec2 vB; 341 - uniform vec2 texelSize; 342 - 343 - void main () { 344 - vUv = aPosition * 0.5 + 0.5; 345 - vL = vUv - vec2(texelSize.x, 0.0); 346 - vR = vUv + vec2(texelSize.x, 0.0); 347 - vT = vUv + vec2(0.0, texelSize.y); 348 - vB = vUv - vec2(0.0, texelSize.y); 349 - gl_Position = vec4(aPosition, 0.0, 1.0); 350 - } 351 - ` 352 - ); 353 - 354 - const blurVertexShader = compileShader( 355 - gl.VERTEX_SHADER, 356 - ` 357 - precision highp float; 358 - 359 - attribute vec2 aPosition; 360 - varying vec2 vUv; 361 - varying vec2 vL; 362 - varying vec2 vR; 363 - uniform vec2 texelSize; 364 - 365 - void main () { 366 - vUv = aPosition * 0.5 + 0.5; 367 - float offset = 1.33333333; 368 - vL = vUv - texelSize * offset; 369 - vR = vUv + texelSize * offset; 370 - gl_Position = vec4(aPosition, 0.0, 1.0); 371 - } 372 - ` 373 - ); 374 - 375 - const blurShader = compileShader( 376 - gl.FRAGMENT_SHADER, 377 - ` 378 - precision mediump float; 379 - precision mediump sampler2D; 380 - 381 - varying vec2 vUv; 382 - varying vec2 vL; 383 - varying vec2 vR; 384 - uniform sampler2D uTexture; 385 - 386 - void main () { 387 - vec4 sum = texture2D(uTexture, vUv) * 0.29411764; 388 - sum += texture2D(uTexture, vL) * 0.35294117; 389 - sum += texture2D(uTexture, vR) * 0.35294117; 390 - gl_FragColor = sum; 391 - } 392 - ` 393 - ); 394 - 395 - const copyShader = compileShader( 396 - gl.FRAGMENT_SHADER, 397 - ` 398 - precision mediump float; 399 - precision mediump sampler2D; 400 - 401 - varying highp vec2 vUv; 402 - uniform sampler2D uTexture; 403 - 404 - void main () { 405 - gl_FragColor = texture2D(uTexture, vUv); 406 - } 407 - ` 408 - ); 409 - 410 - const clearShader = compileShader( 411 - gl.FRAGMENT_SHADER, 412 - ` 413 - precision mediump float; 414 - precision mediump sampler2D; 415 - 416 - varying highp vec2 vUv; 417 - uniform sampler2D uTexture; 418 - uniform float value; 419 - 420 - void main () { 421 - gl_FragColor = value * texture2D(uTexture, vUv); 422 - } 423 - ` 424 - ); 425 - 426 - const colorShader = compileShader( 427 - gl.FRAGMENT_SHADER, 428 - ` 429 - precision mediump float; 430 - 431 - uniform vec4 color; 432 - 433 - void main () { 434 - gl_FragColor = color; 435 - } 436 - ` 437 - ); 438 - 439 - const checkerboardShader = compileShader( 440 - gl.FRAGMENT_SHADER, 441 - ` 442 - precision highp float; 443 - precision highp sampler2D; 444 - 445 - varying vec2 vUv; 446 - uniform sampler2D uTexture; 447 - uniform float aspectRatio; 448 - 449 - #define SCALE 25.0 450 - 451 - void main () { 452 - vec2 uv = floor(vUv * SCALE * vec2(aspectRatio, 1.0)); 453 - float v = mod(uv.x + uv.y, 2.0); 454 - v = v * 0.1 + 0.8; 455 - gl_FragColor = vec4(vec3(v), 1.0); 456 - } 457 - ` 458 - ); 459 - 460 - const displayShaderSource = ` 461 - precision highp float; 462 - precision highp sampler2D; 463 - 464 - varying vec2 vUv; 465 - varying vec2 vL; 466 - varying vec2 vR; 467 - varying vec2 vT; 468 - varying vec2 vB; 469 - uniform sampler2D uTexture; 470 - uniform sampler2D uBloom; 471 - uniform sampler2D uSunrays; 472 - uniform sampler2D uDithering; 473 - uniform vec2 ditherScale; 474 - uniform vec2 texelSize; 475 - 476 - vec3 linearToGamma (vec3 color) { 477 - color = max(color, vec3(0)); 478 - return max(1.055 * pow(color, vec3(0.416666667)) - 0.055, vec3(0)); 479 - } 480 - 481 - void main () { 482 - vec3 c = texture2D(uTexture, vUv).rgb; 483 - 484 - #ifdef SHADING 485 - vec3 lc = texture2D(uTexture, vL).rgb; 486 - vec3 rc = texture2D(uTexture, vR).rgb; 487 - vec3 tc = texture2D(uTexture, vT).rgb; 488 - vec3 bc = texture2D(uTexture, vB).rgb; 489 - 490 - float dx = length(rc) - length(lc); 491 - float dy = length(tc) - length(bc); 492 - 493 - vec3 n = normalize(vec3(dx, dy, length(texelSize))); 494 - vec3 l = vec3(0.0, 0.0, 1.0); 495 - 496 - float diffuse = clamp(dot(n, l) + 0.7, 0.7, 1.0); 497 - c *= diffuse; 498 - #endif 499 - 500 - #ifdef BLOOM 501 - vec3 bloom = texture2D(uBloom, vUv).rgb; 502 - #endif 503 - 504 - #ifdef SUNRAYS 505 - float sunrays = texture2D(uSunrays, vUv).r; 506 - c *= sunrays; 507 - #ifdef BLOOM 508 - bloom *= sunrays; 509 - #endif 510 - #endif 511 - 512 - #ifdef BLOOM 513 - float noise = texture2D(uDithering, vUv * ditherScale).r; 514 - noise = noise * 2.0 - 1.0; 515 - bloom += noise / 255.0; 516 - bloom = linearToGamma(bloom); 517 - c += bloom; 518 - #endif 519 - 520 - float a = max(c.r, max(c.g, c.b)); 521 - gl_FragColor = vec4(c, a); 522 - } 523 - `; 524 - 525 - const bloomPrefilterShader = compileShader( 526 - gl.FRAGMENT_SHADER, 527 - ` 528 - precision mediump float; 529 - precision mediump sampler2D; 530 - 531 - varying vec2 vUv; 532 - uniform sampler2D uTexture; 533 - uniform vec3 curve; 534 - uniform float threshold; 535 - 536 - void main () { 537 - vec3 c = texture2D(uTexture, vUv).rgb; 538 - float br = max(c.r, max(c.g, c.b)); 539 - float rq = clamp(br - curve.x, 0.0, curve.y); 540 - rq = curve.z * rq * rq; 541 - c *= max(rq, br - threshold) / max(br, 0.0001); 542 - gl_FragColor = vec4(c, 0.0); 543 - } 544 - ` 545 - ); 546 - 547 - const bloomBlurShader = compileShader( 548 - gl.FRAGMENT_SHADER, 549 - ` 550 - precision mediump float; 551 - precision mediump sampler2D; 552 - 553 - varying vec2 vL; 554 - varying vec2 vR; 555 - varying vec2 vT; 556 - varying vec2 vB; 557 - uniform sampler2D uTexture; 558 - 559 - void main () { 560 - vec4 sum = vec4(0.0); 561 - sum += texture2D(uTexture, vL); 562 - sum += texture2D(uTexture, vR); 563 - sum += texture2D(uTexture, vT); 564 - sum += texture2D(uTexture, vB); 565 - sum *= 0.25; 566 - gl_FragColor = sum; 567 - } 568 - ` 569 - ); 570 - 571 - const bloomFinalShader = compileShader( 572 - gl.FRAGMENT_SHADER, 573 - ` 574 - precision mediump float; 575 - precision mediump sampler2D; 576 - 577 - varying vec2 vL; 578 - varying vec2 vR; 579 - varying vec2 vT; 580 - varying vec2 vB; 581 - uniform sampler2D uTexture; 582 - uniform float intensity; 583 - 584 - void main () { 585 - vec4 sum = vec4(0.0); 586 - sum += texture2D(uTexture, vL); 587 - sum += texture2D(uTexture, vR); 588 - sum += texture2D(uTexture, vT); 589 - sum += texture2D(uTexture, vB); 590 - sum *= 0.25; 591 - gl_FragColor = sum * intensity; 592 - } 593 - ` 594 - ); 595 - 596 - const sunraysMaskShader = compileShader( 597 - gl.FRAGMENT_SHADER, 598 - ` 599 - precision highp float; 600 - precision highp sampler2D; 601 - 602 - varying vec2 vUv; 603 - uniform sampler2D uTexture; 604 - 605 - void main () { 606 - vec4 c = texture2D(uTexture, vUv); 607 - float br = max(c.r, max(c.g, c.b)); 608 - c.a = 1.0 - min(max(br * 20.0, 0.0), 0.8); 609 - gl_FragColor = c; 610 - } 611 - ` 612 - ); 613 - 614 - const sunraysShader = compileShader( 615 - gl.FRAGMENT_SHADER, 616 - ` 617 - precision highp float; 618 - precision highp sampler2D; 619 - 620 - varying vec2 vUv; 621 - uniform sampler2D uTexture; 622 - uniform float weight; 623 - 624 - #define ITERATIONS 16 625 - 626 - void main () { 627 - float Density = 0.3; 628 - float Decay = 0.95; 629 - float Exposure = 0.7; 630 - 631 - vec2 coord = vUv; 632 - vec2 dir = vUv - 0.5; 633 - 634 - dir *= 1.0 / float(ITERATIONS) * Density; 635 - float illuminationDecay = 1.0; 636 - 637 - float color = texture2D(uTexture, vUv).a; 638 - 639 - for (int i = 0; i < ITERATIONS; i++) 640 - { 641 - coord -= dir; 642 - float col = texture2D(uTexture, coord).a; 643 - color += col * illuminationDecay * weight; 644 - illuminationDecay *= Decay; 645 - } 646 - 647 - gl_FragColor = vec4(color * Exposure, 0.0, 0.0, 1.0); 648 - } 649 - ` 650 - ); 651 - 652 - const splatShader = compileShader( 653 - gl.FRAGMENT_SHADER, 654 - ` 655 - precision highp float; 656 - precision highp sampler2D; 657 - 658 - varying vec2 vUv; 659 - uniform sampler2D uTarget; 660 - uniform float aspectRatio; 661 - uniform vec3 color; 662 - uniform vec2 point; 663 - uniform float radius; 664 - 665 - void main () { 666 - vec2 p = vUv - point.xy; 667 - p.x *= aspectRatio; 668 - vec3 splat = exp(-dot(p, p) / radius) * color; 669 - vec3 base = texture2D(uTarget, vUv).xyz; 670 - gl_FragColor = vec4(base + splat, 1.0); 671 - } 672 - ` 673 - ); 674 - 675 - const advectionShader = compileShader( 676 - gl.FRAGMENT_SHADER, 677 - ` 678 - precision highp float; 679 - precision highp sampler2D; 680 - 681 - varying vec2 vUv; 682 - uniform sampler2D uVelocity; 683 - uniform sampler2D uSource; 684 - uniform vec2 texelSize; 685 - uniform vec2 dyeTexelSize; 686 - uniform float dt; 687 - uniform float dissipation; 688 - 689 - vec4 bilerp (sampler2D sam, vec2 uv, vec2 tsize) { 690 - vec2 st = uv / tsize - 0.5; 691 - 692 - vec2 iuv = floor(st); 693 - vec2 fuv = fract(st); 694 - 695 - vec4 a = texture2D(sam, (iuv + vec2(0.5, 0.5)) * tsize); 696 - vec4 b = texture2D(sam, (iuv + vec2(1.5, 0.5)) * tsize); 697 - vec4 c = texture2D(sam, (iuv + vec2(0.5, 1.5)) * tsize); 698 - vec4 d = texture2D(sam, (iuv + vec2(1.5, 1.5)) * tsize); 699 - 700 - return mix(mix(a, b, fuv.x), mix(c, d, fuv.x), fuv.y); 701 - } 702 - 703 - void main () { 704 - #ifdef MANUAL_FILTERING 705 - vec2 coord = vUv - dt * bilerp(uVelocity, vUv, texelSize).xy * texelSize; 706 - vec4 result = bilerp(uSource, coord, dyeTexelSize); 707 - #else 708 - vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; 709 - vec4 result = texture2D(uSource, coord); 710 - #endif 711 - float decay = 1.0 + dissipation * dt; 712 - gl_FragColor = result / decay; 713 - }`, 714 - ext.supportLinearFiltering ? null : ['MANUAL_FILTERING'] 715 - ); 716 - 717 - const divergenceShader = compileShader( 718 - gl.FRAGMENT_SHADER, 719 - ` 720 - precision mediump float; 721 - precision mediump sampler2D; 722 - 723 - varying highp vec2 vUv; 724 - varying highp vec2 vL; 725 - varying highp vec2 vR; 726 - varying highp vec2 vT; 727 - varying highp vec2 vB; 728 - uniform sampler2D uVelocity; 729 - 730 - void main () { 731 - float L = texture2D(uVelocity, vL).x; 732 - float R = texture2D(uVelocity, vR).x; 733 - float T = texture2D(uVelocity, vT).y; 734 - float B = texture2D(uVelocity, vB).y; 735 - 736 - vec2 C = texture2D(uVelocity, vUv).xy; 737 - if (vL.x < 0.0) { L = -C.x; } 738 - if (vR.x > 1.0) { R = -C.x; } 739 - if (vT.y > 1.0) { T = -C.y; } 740 - if (vB.y < 0.0) { B = -C.y; } 741 - 742 - float div = 0.5 * (R - L + T - B); 743 - gl_FragColor = vec4(div, 0.0, 0.0, 1.0); 744 - } 745 - ` 746 - ); 747 - 748 - const curlShader = compileShader( 749 - gl.FRAGMENT_SHADER, 750 - ` 751 - precision mediump float; 752 - precision mediump sampler2D; 753 - 754 - varying highp vec2 vUv; 755 - varying highp vec2 vL; 756 - varying highp vec2 vR; 757 - varying highp vec2 vT; 758 - varying highp vec2 vB; 759 - uniform sampler2D uVelocity; 760 - 761 - void main () { 762 - float L = texture2D(uVelocity, vL).y; 763 - float R = texture2D(uVelocity, vR).y; 764 - float T = texture2D(uVelocity, vT).x; 765 - float B = texture2D(uVelocity, vB).x; 766 - float vorticity = R - L - T + B; 767 - gl_FragColor = vec4(0.5 * vorticity, 0.0, 0.0, 1.0); 768 - } 769 - ` 770 - ); 771 - 772 - const vorticityShader = compileShader( 773 - gl.FRAGMENT_SHADER, 774 - ` 775 - precision highp float; 776 - precision highp sampler2D; 777 - 778 - varying vec2 vUv; 779 - varying vec2 vL; 780 - varying vec2 vR; 781 - varying vec2 vT; 782 - varying vec2 vB; 783 - uniform sampler2D uVelocity; 784 - uniform sampler2D uCurl; 785 - uniform float curl; 786 - uniform float dt; 787 - 788 - void main () { 789 - float L = texture2D(uCurl, vL).x; 790 - float R = texture2D(uCurl, vR).x; 791 - float T = texture2D(uCurl, vT).x; 792 - float B = texture2D(uCurl, vB).x; 793 - float C = texture2D(uCurl, vUv).x; 794 - 795 - vec2 force = 0.5 * vec2(abs(T) - abs(B), abs(R) - abs(L)); 796 - force /= length(force) + 0.0001; 797 - force *= curl * C; 798 - force.y *= -1.0; 799 - 800 - vec2 velocity = texture2D(uVelocity, vUv).xy; 801 - velocity += force * dt; 802 - velocity = min(max(velocity, -1000.0), 1000.0); 803 - gl_FragColor = vec4(velocity, 0.0, 1.0); 804 - } 805 - ` 806 - ); 807 - 808 - const pressureShader = compileShader( 809 - gl.FRAGMENT_SHADER, 810 - ` 811 - precision mediump float; 812 - precision mediump sampler2D; 813 - 814 - varying highp vec2 vUv; 815 - varying highp vec2 vL; 816 - varying highp vec2 vR; 817 - varying highp vec2 vT; 818 - varying highp vec2 vB; 819 - uniform sampler2D uPressure; 820 - uniform sampler2D uDivergence; 821 - 822 - void main () { 823 - float L = texture2D(uPressure, vL).x; 824 - float R = texture2D(uPressure, vR).x; 825 - float T = texture2D(uPressure, vT).x; 826 - float B = texture2D(uPressure, vB).x; 827 - float C = texture2D(uPressure, vUv).x; 828 - float divergence = texture2D(uDivergence, vUv).x; 829 - float pressure = (L + R + B + T - divergence) * 0.25; 830 - gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0); 831 - } 832 - ` 833 - ); 834 - 835 - const gradientSubtractShader = compileShader( 836 - gl.FRAGMENT_SHADER, 837 - ` 838 - precision mediump float; 839 - precision mediump sampler2D; 840 - 841 - varying highp vec2 vUv; 842 - varying highp vec2 vL; 843 - varying highp vec2 vR; 844 - varying highp vec2 vT; 845 - varying highp vec2 vB; 846 - uniform sampler2D uPressure; 847 - uniform sampler2D uVelocity; 848 - 849 - void main () { 850 - float L = texture2D(uPressure, vL).x; 851 - float R = texture2D(uPressure, vR).x; 852 - float T = texture2D(uPressure, vT).x; 853 - float B = texture2D(uPressure, vB).x; 854 - vec2 velocity = texture2D(uVelocity, vUv).xy; 855 - velocity.xy -= vec2(R - L, T - B); 856 - gl_FragColor = vec4(velocity, 0.0, 1.0); 857 - } 858 - ` 859 - ); 860 - 861 - const blit = (() => { 862 - gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); 863 - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, -1, 1, 1, 1, 1, -1]), gl.STATIC_DRAW); 864 - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer()); 865 - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 0, 2, 3]), gl.STATIC_DRAW); 866 - gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); 867 - gl.enableVertexAttribArray(0); 868 - 869 - return (target, clear = false) => { 870 - if (target == null) { 871 - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); 872 - gl.bindFramebuffer(gl.FRAMEBUFFER, null); 873 - } else { 874 - gl.viewport(0, 0, target.width, target.height); 875 - gl.bindFramebuffer(gl.FRAMEBUFFER, target.fbo); 876 - } 877 - if (clear) { 878 - gl.clearColor(0.0, 0.0, 0.0, 1.0); 879 - gl.clear(gl.COLOR_BUFFER_BIT); 880 - } 881 - // CHECK_FRAMEBUFFER_STATUS(); 882 - gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0); 883 - }; 884 - })(); 885 - 886 - function CHECK_FRAMEBUFFER_STATUS() { 887 - let status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); 888 - if (status != gl.FRAMEBUFFER_COMPLETE) console.trace('Framebuffer error: ' + status); 889 - } 890 - 891 - let dye; 892 - let velocity; 893 - let divergence; 894 - let curl; 895 - let pressure; 896 - let bloom; 897 - let bloomFramebuffers = []; 898 - let sunrays; 899 - let sunraysTemp; 900 - 901 - let ditheringTexture = createTextureAsync('LDR_LLL1_0.png'); 902 - 903 - const blurProgram = new Program(blurVertexShader, blurShader); 904 - const copyProgram = new Program(baseVertexShader, copyShader); 905 - const clearProgram = new Program(baseVertexShader, clearShader); 906 - const colorProgram = new Program(baseVertexShader, colorShader); 907 - const checkerboardProgram = new Program(baseVertexShader, checkerboardShader); 908 - const bloomPrefilterProgram = new Program(baseVertexShader, bloomPrefilterShader); 909 - const bloomBlurProgram = new Program(baseVertexShader, bloomBlurShader); 910 - const bloomFinalProgram = new Program(baseVertexShader, bloomFinalShader); 911 - const sunraysMaskProgram = new Program(baseVertexShader, sunraysMaskShader); 912 - const sunraysProgram = new Program(baseVertexShader, sunraysShader); 913 - const splatProgram = new Program(baseVertexShader, splatShader); 914 - const advectionProgram = new Program(baseVertexShader, advectionShader); 915 - const divergenceProgram = new Program(baseVertexShader, divergenceShader); 916 - const curlProgram = new Program(baseVertexShader, curlShader); 917 - const vorticityProgram = new Program(baseVertexShader, vorticityShader); 918 - const pressureProgram = new Program(baseVertexShader, pressureShader); 919 - const gradienSubtractProgram = new Program(baseVertexShader, gradientSubtractShader); 920 - 921 - const displayMaterial = new Material(baseVertexShader, displayShaderSource); 922 - 923 - function initFramebuffers() { 924 - let simRes = getResolution(config.SIM_RESOLUTION); 925 - let dyeRes = getResolution(config.DYE_RESOLUTION); 926 - 927 - const texType = ext.halfFloatTexType; 928 - const rgba = ext.formatRGBA; 929 - const rg = ext.formatRG; 930 - const r = ext.formatR; 931 - const filtering = ext.supportLinearFiltering ? gl.LINEAR : gl.NEAREST; 932 - 933 - gl.disable(gl.BLEND); 934 - 935 - if (dye == null) 936 - dye = createDoubleFBO( 937 - dyeRes.width, 938 - dyeRes.height, 939 - rgba.internalFormat, 940 - rgba.format, 941 - texType, 942 - filtering 943 - ); 944 - else 945 - dye = resizeDoubleFBO( 946 - dye, 947 - dyeRes.width, 948 - dyeRes.height, 949 - rgba.internalFormat, 950 - rgba.format, 951 - texType, 952 - filtering 953 - ); 954 - 955 - if (velocity == null) 956 - velocity = createDoubleFBO( 957 - simRes.width, 958 - simRes.height, 959 - rg.internalFormat, 960 - rg.format, 961 - texType, 962 - filtering 963 - ); 964 - else 965 - velocity = resizeDoubleFBO( 966 - velocity, 967 - simRes.width, 968 - simRes.height, 969 - rg.internalFormat, 970 - rg.format, 971 - texType, 972 - filtering 973 - ); 974 - 975 - divergence = createFBO( 976 - simRes.width, 977 - simRes.height, 978 - r.internalFormat, 979 - r.format, 980 - texType, 981 - gl.NEAREST 982 - ); 983 - curl = createFBO(simRes.width, simRes.height, r.internalFormat, r.format, texType, gl.NEAREST); 984 - pressure = createDoubleFBO( 985 - simRes.width, 986 - simRes.height, 987 - r.internalFormat, 988 - r.format, 989 - texType, 990 - gl.NEAREST 991 - ); 992 - 993 - initBloomFramebuffers(); 994 - initSunraysFramebuffers(); 995 - } 996 - 997 - function initBloomFramebuffers() { 998 - let res = getResolution(config.BLOOM_RESOLUTION); 999 - 1000 - const texType = ext.halfFloatTexType; 1001 - const rgba = ext.formatRGBA; 1002 - const filtering = ext.supportLinearFiltering ? gl.LINEAR : gl.NEAREST; 1003 - 1004 - bloom = createFBO(res.width, res.height, rgba.internalFormat, rgba.format, texType, filtering); 1005 - 1006 - bloomFramebuffers.length = 0; 1007 - for (let i = 0; i < config.BLOOM_ITERATIONS; i++) { 1008 - let width = res.width >> (i + 1); 1009 - let height = res.height >> (i + 1); 1010 - 1011 - if (width < 2 || height < 2) break; 1012 - 1013 - let fbo = createFBO(width, height, rgba.internalFormat, rgba.format, texType, filtering); 1014 - bloomFramebuffers.push(fbo); 1015 - } 1016 - } 1017 - 1018 - function initSunraysFramebuffers() { 1019 - let res = getResolution(config.SUNRAYS_RESOLUTION); 1020 - 1021 - const texType = ext.halfFloatTexType; 1022 - const r = ext.formatR; 1023 - const filtering = ext.supportLinearFiltering ? gl.LINEAR : gl.NEAREST; 1024 - 1025 - sunrays = createFBO(res.width, res.height, r.internalFormat, r.format, texType, filtering); 1026 - sunraysTemp = createFBO(res.width, res.height, r.internalFormat, r.format, texType, filtering); 1027 - } 1028 - 1029 - function createFBO(w, h, internalFormat, format, type, param) { 1030 - gl.activeTexture(gl.TEXTURE0); 1031 - let texture = gl.createTexture(); 1032 - gl.bindTexture(gl.TEXTURE_2D, texture); 1033 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, param); 1034 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, param); 1035 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 1036 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 1037 - gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, w, h, 0, format, type, null); 1038 - 1039 - let fbo = gl.createFramebuffer(); 1040 - gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); 1041 - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); 1042 - gl.viewport(0, 0, w, h); 1043 - gl.clear(gl.COLOR_BUFFER_BIT); 1044 - 1045 - let texelSizeX = 1.0 / w; 1046 - let texelSizeY = 1.0 / h; 1047 - 1048 - return { 1049 - texture, 1050 - fbo, 1051 - width: w, 1052 - height: h, 1053 - texelSizeX, 1054 - texelSizeY, 1055 - attach(id) { 1056 - gl.activeTexture(gl.TEXTURE0 + id); 1057 - gl.bindTexture(gl.TEXTURE_2D, texture); 1058 - return id; 1059 - } 1060 - }; 1061 - } 1062 - 1063 - function createDoubleFBO(w, h, internalFormat, format, type, param) { 1064 - let fbo1 = createFBO(w, h, internalFormat, format, type, param); 1065 - let fbo2 = createFBO(w, h, internalFormat, format, type, param); 1066 - 1067 - return { 1068 - width: w, 1069 - height: h, 1070 - texelSizeX: fbo1.texelSizeX, 1071 - texelSizeY: fbo1.texelSizeY, 1072 - get read() { 1073 - return fbo1; 1074 - }, 1075 - set read(value) { 1076 - fbo1 = value; 1077 - }, 1078 - get write() { 1079 - return fbo2; 1080 - }, 1081 - set write(value) { 1082 - fbo2 = value; 1083 - }, 1084 - swap() { 1085 - let temp = fbo1; 1086 - fbo1 = fbo2; 1087 - fbo2 = temp; 1088 - } 1089 - }; 1090 - } 1091 - 1092 - function resizeFBO(target, w, h, internalFormat, format, type, param) { 1093 - let newFBO = createFBO(w, h, internalFormat, format, type, param); 1094 - copyProgram.bind(); 1095 - gl.uniform1i(copyProgram.uniforms.uTexture, target.attach(0)); 1096 - blit(newFBO); 1097 - return newFBO; 1098 - } 1099 - 1100 - function resizeDoubleFBO(target, w, h, internalFormat, format, type, param) { 1101 - if (target.width == w && target.height == h) return target; 1102 - target.read = resizeFBO(target.read, w, h, internalFormat, format, type, param); 1103 - target.write = createFBO(w, h, internalFormat, format, type, param); 1104 - target.width = w; 1105 - target.height = h; 1106 - target.texelSizeX = 1.0 / w; 1107 - target.texelSizeY = 1.0 / h; 1108 - return target; 1109 - } 1110 - 1111 - function createTextureAsync(url) { 1112 - let texture = gl.createTexture(); 1113 - gl.bindTexture(gl.TEXTURE_2D, texture); 1114 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); 1115 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); 1116 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); 1117 - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); 1118 - gl.texImage2D( 1119 - gl.TEXTURE_2D, 1120 - 0, 1121 - gl.RGB, 1122 - 1, 1123 - 1, 1124 - 0, 1125 - gl.RGB, 1126 - gl.UNSIGNED_BYTE, 1127 - new Uint8Array([255, 255, 255]) 1128 - ); 1129 - 1130 - let obj = { 1131 - texture, 1132 - width: 1, 1133 - height: 1, 1134 - attach(id) { 1135 - gl.activeTexture(gl.TEXTURE0 + id); 1136 - gl.bindTexture(gl.TEXTURE_2D, texture); 1137 - return id; 1138 - } 1139 - }; 1140 - 1141 - let image = new Image(); 1142 - image.onload = () => { 1143 - obj.width = image.width; 1144 - obj.height = image.height; 1145 - gl.bindTexture(gl.TEXTURE_2D, texture); 1146 - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image); 1147 - }; 1148 - image.src = url; 1149 - 1150 - return obj; 1151 - } 1152 - 1153 - function updateKeywords() { 1154 - let displayKeywords = []; 1155 - if (config.SHADING) displayKeywords.push('SHADING'); 1156 - if (config.BLOOM) displayKeywords.push('BLOOM'); 1157 - if (config.SUNRAYS) displayKeywords.push('SUNRAYS'); 1158 - displayMaterial.setKeywords(displayKeywords); 1159 - } 1160 - 1161 - updateKeywords(); 1162 - initFramebuffers(); 1163 - multipleSplats(25); 1164 - 1165 - let lastUpdateTime = Date.now(); 1166 - let colorUpdateTimer = 0.0; 1167 - update(); 1168 - 1169 - function update() { 1170 - const dt = calcDeltaTime() * (config.RENDER_SPEED ?? 1.0); 1171 - if (resizeCanvas()) initFramebuffers(); 1172 - updateColors(dt); 1173 - applyInputs(); 1174 - if (!config.PAUSED) step(dt); 1175 - render(null); 1176 - requestAnimationFrame(update); 1177 - } 1178 - 1179 - function calcDeltaTime() { 1180 - let now = Date.now(); 1181 - let dt = (now - lastUpdateTime) / 1000; 1182 - dt = Math.min(dt, 0.016666); 1183 - lastUpdateTime = now; 1184 - return dt; 1185 - } 1186 - 1187 - function resizeCanvas() { 1188 - let width = scaleByPixelRatio(canvas.clientWidth); 1189 - let height = scaleByPixelRatio(canvas.clientHeight); 1190 - if (canvas.width != width || canvas.height != height) { 1191 - canvas.width = width; 1192 - canvas.height = height; 1193 - return true; 1194 - } 1195 - return false; 1196 - } 1197 - 1198 - function updateColors(dt) { 1199 - if (!config.COLORFUL) return; 1200 - 1201 - colorUpdateTimer += dt * config.COLOR_UPDATE_SPEED; 1202 - if (colorUpdateTimer >= 1) { 1203 - colorUpdateTimer = wrap(colorUpdateTimer, 0, 1); 1204 - pointers.forEach((p) => { 1205 - p.color = generateColor(); 1206 - }); 1207 - } 1208 - } 1209 - 1210 - function applyInputs() { 1211 - if (splatStack.length > 0) multipleSplats(splatStack.pop()); 1212 - 1213 - pointers.forEach((p) => { 1214 - if (p.moved) { 1215 - p.moved = false; 1216 - splatPointer(p); 1217 - } 1218 - }); 1219 - } 1220 - 1221 - function step(dt) { 1222 - gl.disable(gl.BLEND); 1223 - 1224 - curlProgram.bind(); 1225 - gl.uniform2f(curlProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY); 1226 - gl.uniform1i(curlProgram.uniforms.uVelocity, velocity.read.attach(0)); 1227 - blit(curl); 1228 - 1229 - vorticityProgram.bind(); 1230 - gl.uniform2f(vorticityProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY); 1231 - gl.uniform1i(vorticityProgram.uniforms.uVelocity, velocity.read.attach(0)); 1232 - gl.uniform1i(vorticityProgram.uniforms.uCurl, curl.attach(1)); 1233 - gl.uniform1f(vorticityProgram.uniforms.curl, config.CURL); 1234 - gl.uniform1f(vorticityProgram.uniforms.dt, dt); 1235 - blit(velocity.write); 1236 - velocity.swap(); 1237 - 1238 - divergenceProgram.bind(); 1239 - gl.uniform2f(divergenceProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY); 1240 - gl.uniform1i(divergenceProgram.uniforms.uVelocity, velocity.read.attach(0)); 1241 - blit(divergence); 1242 - 1243 - clearProgram.bind(); 1244 - gl.uniform1i(clearProgram.uniforms.uTexture, pressure.read.attach(0)); 1245 - gl.uniform1f(clearProgram.uniforms.value, config.PRESSURE); 1246 - blit(pressure.write); 1247 - pressure.swap(); 1248 - 1249 - pressureProgram.bind(); 1250 - gl.uniform2f(pressureProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY); 1251 - gl.uniform1i(pressureProgram.uniforms.uDivergence, divergence.attach(0)); 1252 - for (let i = 0; i < config.PRESSURE_ITERATIONS; i++) { 1253 - gl.uniform1i(pressureProgram.uniforms.uPressure, pressure.read.attach(1)); 1254 - blit(pressure.write); 1255 - pressure.swap(); 1256 - } 1257 - 1258 - gradienSubtractProgram.bind(); 1259 - gl.uniform2f(gradienSubtractProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY); 1260 - gl.uniform1i(gradienSubtractProgram.uniforms.uPressure, pressure.read.attach(0)); 1261 - gl.uniform1i(gradienSubtractProgram.uniforms.uVelocity, velocity.read.attach(1)); 1262 - blit(velocity.write); 1263 - velocity.swap(); 1264 - 1265 - advectionProgram.bind(); 1266 - gl.uniform2f(advectionProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY); 1267 - if (!ext.supportLinearFiltering) 1268 - gl.uniform2f(advectionProgram.uniforms.dyeTexelSize, velocity.texelSizeX, velocity.texelSizeY); 1269 - let velocityId = velocity.read.attach(0); 1270 - gl.uniform1i(advectionProgram.uniforms.uVelocity, velocityId); 1271 - gl.uniform1i(advectionProgram.uniforms.uSource, velocityId); 1272 - gl.uniform1f(advectionProgram.uniforms.dt, dt); 1273 - gl.uniform1f(advectionProgram.uniforms.dissipation, config.VELOCITY_DISSIPATION); 1274 - blit(velocity.write); 1275 - velocity.swap(); 1276 - 1277 - if (!ext.supportLinearFiltering) 1278 - gl.uniform2f(advectionProgram.uniforms.dyeTexelSize, dye.texelSizeX, dye.texelSizeY); 1279 - gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.read.attach(0)); 1280 - gl.uniform1i(advectionProgram.uniforms.uSource, dye.read.attach(1)); 1281 - gl.uniform1f(advectionProgram.uniforms.dissipation, config.DENSITY_DISSIPATION); 1282 - blit(dye.write); 1283 - dye.swap(); 1284 - } 1285 - 1286 - function render(target) { 1287 - if (config.BLOOM) applyBloom(dye.read, bloom); 1288 - if (config.SUNRAYS) { 1289 - applySunrays(dye.read, dye.write, sunrays); 1290 - blur(sunrays, sunraysTemp, 1); 1291 - } 1292 - 1293 - if (target == null || !config.TRANSPARENT) { 1294 - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); 1295 - gl.enable(gl.BLEND); 1296 - } else { 1297 - gl.disable(gl.BLEND); 1298 - } 1299 - 1300 - if (!config.TRANSPARENT) drawColor(target, normalizeColor(config.BACK_COLOR)); 1301 - if (target == null && config.TRANSPARENT) drawCheckerboard(target); 1302 - drawDisplay(target); 1303 - } 1304 - 1305 - function drawColor(target, color) { 1306 - colorProgram.bind(); 1307 - gl.uniform4f(colorProgram.uniforms.color, color.r, color.g, color.b, 1); 1308 - blit(target); 1309 - } 1310 - 1311 - function drawCheckerboard(target) { 1312 - checkerboardProgram.bind(); 1313 - gl.uniform1f(checkerboardProgram.uniforms.aspectRatio, canvas.width / canvas.height); 1314 - blit(target); 1315 - } 1316 - 1317 - function drawDisplay(target) { 1318 - let width = target == null ? gl.drawingBufferWidth : target.width; 1319 - let height = target == null ? gl.drawingBufferHeight : target.height; 1320 - 1321 - displayMaterial.bind(); 1322 - if (config.SHADING) gl.uniform2f(displayMaterial.uniforms.texelSize, 1.0 / width, 1.0 / height); 1323 - gl.uniform1i(displayMaterial.uniforms.uTexture, dye.read.attach(0)); 1324 - if (config.BLOOM) { 1325 - gl.uniform1i(displayMaterial.uniforms.uBloom, bloom.attach(1)); 1326 - gl.uniform1i(displayMaterial.uniforms.uDithering, ditheringTexture.attach(2)); 1327 - let scale = getTextureScale(ditheringTexture, width, height); 1328 - gl.uniform2f(displayMaterial.uniforms.ditherScale, scale.x, scale.y); 1329 - } 1330 - if (config.SUNRAYS) gl.uniform1i(displayMaterial.uniforms.uSunrays, sunrays.attach(3)); 1331 - blit(target); 1332 - } 1333 - 1334 - function applyBloom(source, destination) { 1335 - if (bloomFramebuffers.length < 2) return; 1336 - 1337 - let last = destination; 1338 - 1339 - gl.disable(gl.BLEND); 1340 - bloomPrefilterProgram.bind(); 1341 - let knee = config.BLOOM_THRESHOLD * config.BLOOM_SOFT_KNEE + 0.0001; 1342 - let curve0 = config.BLOOM_THRESHOLD - knee; 1343 - let curve1 = knee * 2; 1344 - let curve2 = 0.25 / knee; 1345 - gl.uniform3f(bloomPrefilterProgram.uniforms.curve, curve0, curve1, curve2); 1346 - gl.uniform1f(bloomPrefilterProgram.uniforms.threshold, config.BLOOM_THRESHOLD); 1347 - gl.uniform1i(bloomPrefilterProgram.uniforms.uTexture, source.attach(0)); 1348 - blit(last); 1349 - 1350 - bloomBlurProgram.bind(); 1351 - for (let i = 0; i < bloomFramebuffers.length; i++) { 1352 - let dest = bloomFramebuffers[i]; 1353 - gl.uniform2f(bloomBlurProgram.uniforms.texelSize, last.texelSizeX, last.texelSizeY); 1354 - gl.uniform1i(bloomBlurProgram.uniforms.uTexture, last.attach(0)); 1355 - blit(dest); 1356 - last = dest; 1357 - } 1358 - 1359 - gl.blendFunc(gl.ONE, gl.ONE); 1360 - gl.enable(gl.BLEND); 1361 - 1362 - for (let i = bloomFramebuffers.length - 2; i >= 0; i--) { 1363 - let baseTex = bloomFramebuffers[i]; 1364 - gl.uniform2f(bloomBlurProgram.uniforms.texelSize, last.texelSizeX, last.texelSizeY); 1365 - gl.uniform1i(bloomBlurProgram.uniforms.uTexture, last.attach(0)); 1366 - gl.viewport(0, 0, baseTex.width, baseTex.height); 1367 - blit(baseTex); 1368 - last = baseTex; 1369 - } 1370 - 1371 - gl.disable(gl.BLEND); 1372 - bloomFinalProgram.bind(); 1373 - gl.uniform2f(bloomFinalProgram.uniforms.texelSize, last.texelSizeX, last.texelSizeY); 1374 - gl.uniform1i(bloomFinalProgram.uniforms.uTexture, last.attach(0)); 1375 - gl.uniform1f(bloomFinalProgram.uniforms.intensity, config.BLOOM_INTENSITY); 1376 - blit(destination); 1377 - } 1378 - 1379 - function applySunrays(source, mask, destination) { 1380 - gl.disable(gl.BLEND); 1381 - sunraysMaskProgram.bind(); 1382 - gl.uniform1i(sunraysMaskProgram.uniforms.uTexture, source.attach(0)); 1383 - blit(mask); 1384 - 1385 - sunraysProgram.bind(); 1386 - gl.uniform1f(sunraysProgram.uniforms.weight, config.SUNRAYS_WEIGHT); 1387 - gl.uniform1i(sunraysProgram.uniforms.uTexture, mask.attach(0)); 1388 - blit(destination); 1389 - } 1390 - 1391 - function blur(target, temp, iterations) { 1392 - blurProgram.bind(); 1393 - for (let i = 0; i < iterations; i++) { 1394 - gl.uniform2f(blurProgram.uniforms.texelSize, target.texelSizeX, 0.0); 1395 - gl.uniform1i(blurProgram.uniforms.uTexture, target.attach(0)); 1396 - blit(temp); 1397 - 1398 - gl.uniform2f(blurProgram.uniforms.texelSize, 0.0, target.texelSizeY); 1399 - gl.uniform1i(blurProgram.uniforms.uTexture, temp.attach(0)); 1400 - blit(target); 1401 - } 1402 - } 1403 - 1404 - function splatPointer(pointer) { 1405 - let dx = pointer.deltaX * config.SPLAT_FORCE * 5; 1406 - let dy = pointer.deltaY * config.SPLAT_FORCE * 5; 1407 - splat(pointer.texcoordX, pointer.texcoordY, dx, dy, pointer.color); 1408 - } 1409 - 1410 - function multipleSplats(amount) { 1411 - for (let i = 0; i < amount; i++) { 1412 - const color = generateColor(); 1413 - color.r *= 10.0; 1414 - color.g *= 10.0; 1415 - color.b *= 10.0; 1416 - const x = Math.random(); 1417 - const y = Math.random() < 0.5 ? 0.8 : 0.2; 1418 - const dx = 100 * (Math.random() - 0.5); 1419 - const dy = 1000 * (Math.random() - 0.5); 1420 - splat(x, y, dx, dy, color); 1421 - } 1422 - } 1423 - 1424 - function splat(x, y, dx, dy, color) { 1425 - splatProgram.bind(); 1426 - gl.uniform1i(splatProgram.uniforms.uTarget, velocity.read.attach(0)); 1427 - gl.uniform1f(splatProgram.uniforms.aspectRatio, canvas.width / canvas.height); 1428 - gl.uniform2f(splatProgram.uniforms.point, x, y); 1429 - gl.uniform3f(splatProgram.uniforms.color, dx, dy, 0.0); 1430 - gl.uniform1f(splatProgram.uniforms.radius, correctRadius(config.SPLAT_RADIUS / 100.0)); 1431 - blit(velocity.write); 1432 - velocity.swap(); 1433 - 1434 - gl.uniform1i(splatProgram.uniforms.uTarget, dye.read.attach(0)); 1435 - gl.uniform3f(splatProgram.uniforms.color, color.r, color.g, color.b); 1436 - blit(dye.write); 1437 - dye.swap(); 1438 - } 1439 - 1440 - function correctRadius(radius) { 1441 - let aspectRatio = canvas.width / canvas.height; 1442 - if (aspectRatio > 1) radius *= aspectRatio; 1443 - return radius; 1444 - } 1445 - 1446 - canvas.addEventListener('mousedown', (e) => { 1447 - let posX = scaleByPixelRatio(e.offsetX); 1448 - let posY = scaleByPixelRatio(e.offsetY); 1449 - let pointer = pointers.find((p) => p.id == -1); 1450 - if (pointer == null) pointer = new PointerPrototype(); 1451 - updatePointerDownData(pointer, -1, posX, posY); 1452 - }); 1453 - 1454 - document.body.addEventListener('mousemove', (e) => { 1455 - let pointer = pointers[0]; 1456 - // if (!pointer.down) return; 1457 - let posX = scaleByPixelRatio(e.offsetX); 1458 - let posY = scaleByPixelRatio(e.offsetY); 1459 - updatePointerMoveData(pointer, posX, posY); 1460 - }); 1461 - 1462 - window.addEventListener('mouseup', () => { 1463 - updatePointerUpData(pointers[0]); 1464 - }); 1465 - 1466 - document.body.addEventListener('touchstart', (e) => { 1467 - e.preventDefault(); 1468 - const touches = e.targetTouches; 1469 - while (touches.length >= pointers.length) pointers.push(new PointerPrototype()); 1470 - for (let i = 0; i < touches.length; i++) { 1471 - let posX = scaleByPixelRatio(touches[i].pageX); 1472 - let posY = scaleByPixelRatio(touches[i].pageY); 1473 - updatePointerDownData(pointers[i + 1], touches[i].identifier, posX, posY); 1474 - } 1475 - }); 1476 - 1477 - document.body.addEventListener( 1478 - 'touchmove', 1479 - (e) => { 1480 - e.preventDefault(); 1481 - const touches = e.targetTouches; 1482 - for (let i = 0; i < touches.length; i++) { 1483 - let pointer = pointers[i + 1]; 1484 - if (!pointer.down) continue; 1485 - let posX = scaleByPixelRatio(touches[i].pageX); 1486 - let posY = scaleByPixelRatio(touches[i].pageY); 1487 - updatePointerMoveData(pointer, posX, posY); 1488 - } 1489 - }, 1490 - false 1491 - ); 1492 - 1493 - document.body.addEventListener('touchend', (e) => { 1494 - const touches = e.changedTouches; 1495 - for (const element of touches) { 1496 - let pointer = pointers.find((p) => p.id == element.identifier); 1497 - if (pointer == null) continue; 1498 - updatePointerUpData(pointer); 1499 - } 1500 - }); 1501 - 1502 - // window.addEventListener('keydown', (e) => { 1503 - // if (e.code === 'KeyP') config.PAUSED = !config.PAUSED; 1504 - // if (e.key === ' ') splatStack.push(parseInt(Math.random() * 20) + 5); 1505 - // }); 1506 - 1507 - function updatePointerDownData(pointer, id, posX, posY) { 1508 - pointer.id = id; 1509 - pointer.down = true; 1510 - pointer.moved = false; 1511 - pointer.texcoordX = posX / canvas.width; 1512 - pointer.texcoordY = 1.0 - posY / canvas.height; 1513 - pointer.prevTexcoordX = pointer.texcoordX; 1514 - pointer.prevTexcoordY = pointer.texcoordY; 1515 - pointer.deltaX = 0; 1516 - pointer.deltaY = 0; 1517 - pointer.color = generateColor(); 1518 - } 1519 - 1520 - function updatePointerMoveData(pointer, posX, posY) { 1521 - pointer.prevTexcoordX = pointer.texcoordX; 1522 - pointer.prevTexcoordY = pointer.texcoordY; 1523 - pointer.texcoordX = posX / canvas.width; 1524 - pointer.texcoordY = 1.0 - posY / canvas.height; 1525 - pointer.deltaX = correctDeltaX(pointer.texcoordX - pointer.prevTexcoordX); 1526 - pointer.deltaY = correctDeltaY(pointer.texcoordY - pointer.prevTexcoordY); 1527 - pointer.moved = Math.abs(pointer.deltaX) > 0 || Math.abs(pointer.deltaY) > 0; 1528 - } 1529 - 1530 - function updatePointerUpData(pointer) { 1531 - pointer.down = false; 1532 - } 1533 - 1534 - function correctDeltaX(delta) { 1535 - let aspectRatio = canvas.width / canvas.height; 1536 - if (aspectRatio < 1) delta *= aspectRatio; 1537 - return delta; 1538 - } 1539 - 1540 - function correctDeltaY(delta) { 1541 - let aspectRatio = canvas.width / canvas.height; 1542 - if (aspectRatio > 1) delta /= aspectRatio; 1543 - return delta; 1544 - } 1545 - 1546 - function generateColor() { 1547 - let c = HSVtoRGB(Math.random() * (config.END_HUE - config.START_HUE) + config.START_HUE, 1.0, 1.0); 1548 - c.r *= 0.15; 1549 - c.g *= 0.15; 1550 - c.b *= 0.15; 1551 - return c; 1552 - } 1553 - 1554 - function HSVtoRGB(h, s, v) { 1555 - let r, g, b, i, f, p, q, t; 1556 - i = Math.floor(h * 6); 1557 - f = h * 6 - i; 1558 - p = v * (1 - s); 1559 - q = v * (1 - f * s); 1560 - t = v * (1 - (1 - f) * s); 1561 - 1562 - switch (i % 6) { 1563 - case 0: 1564 - (r = v), (g = t), (b = p); 1565 - break; 1566 - case 1: 1567 - (r = q), (g = v), (b = p); 1568 - break; 1569 - case 2: 1570 - (r = p), (g = v), (b = t); 1571 - break; 1572 - case 3: 1573 - (r = p), (g = q), (b = v); 1574 - break; 1575 - case 4: 1576 - (r = t), (g = p), (b = v); 1577 - break; 1578 - case 5: 1579 - (r = v), (g = p), (b = q); 1580 - break; 1581 - } 1582 - 1583 - return { 1584 - r, 1585 - g, 1586 - b 1587 - }; 1588 - } 1589 - 1590 - function normalizeColor(input) { 1591 - let output = { 1592 - r: input.r / 255, 1593 - g: input.g / 255, 1594 - b: input.b / 255 1595 - }; 1596 - return output; 1597 - } 1598 - 1599 - function wrap(value, min, max) { 1600 - let range = max - min; 1601 - if (range == 0) return min; 1602 - return ((value - min) % range) + min; 1603 - } 1604 - 1605 - function getResolution(resolution) { 1606 - let aspectRatio = gl.drawingBufferWidth / gl.drawingBufferHeight; 1607 - if (aspectRatio < 1) aspectRatio = 1.0 / aspectRatio; 1608 - 1609 - let min = Math.round(resolution); 1610 - let max = Math.round(resolution * aspectRatio); 1611 - 1612 - if (gl.drawingBufferWidth > gl.drawingBufferHeight) return { width: max, height: min }; 1613 - else return { width: min, height: max }; 1614 - } 1615 - 1616 - function getTextureScale(texture, width, height) { 1617 - return { 1618 - x: width / texture.width, 1619 - y: height / texture.height 1620 - }; 1621 - } 1622 - 1623 - function scaleByPixelRatio(input) { 1624 - let pixelRatio = window.devicePixelRatio || 1; 1625 - return Math.floor(input * pixelRatio); 1626 - } 1627 - 1628 - function hashCode(s) { 1629 - if (s.length == 0) return 0; 1630 - let hash = 0; 1631 - for (let i = 0; i < s.length; i++) { 1632 - hash = (hash << 5) - hash + s.charCodeAt(i); 1633 - hash |= 0; // Convert to 32bit integer 1634 - } 1635 - return hash; 1636 - } 1637 - 1638 - 1639 - setInterval(() => { 1640 - multipleSplats(5); 1641 - }, 500)
+21 -14
src/lib/cards/PopfeedReviews/PopfeedReviewsCard.svelte
··· 31 31 32 32 <div class="z-10 flex h-full gap-4 overflow-x-scroll p-4"> 33 33 {#each feed ?? [] as review} 34 - <a 35 - rel="noopener noreferrer" 36 - target="_blank" 37 - class="flex" 38 - href="https://popfeed.social/review/{review.uri}" 39 - > 40 - <div 41 - class="relative flex aspect-[2/3] h-full flex-col items-center justify-end overflow-hidden rounded-xl p-1" 34 + {#if review.value.rating !== undefined && review.value.posterUrl} 35 + <a 36 + rel="noopener noreferrer" 37 + target="_blank" 38 + class="flex" 39 + href="https://popfeed.social/review/{review.uri}" 42 40 > 43 - <img src={review.value.posterUrl} alt="" class="absolute inset-0 -z-10" /> 44 41 <div 45 - class="from-base-900/80 absolute right-0 bottom-0 left-0 h-1/3 bg-gradient-to-t via-transparent" 46 - ></div> 42 + class="relative flex aspect-[2/3] h-full flex-col items-center justify-end overflow-hidden rounded-xl p-1" 43 + > 44 + <img 45 + src={review.value.posterUrl} 46 + alt="" 47 + class="bg-base-200 absolute inset-0 -z-10 h-full w-full object-cover" 48 + /> 49 + 50 + <div 51 + class="from-base-900/80 absolute right-0 bottom-0 left-0 h-1/3 bg-gradient-to-t via-transparent" 52 + ></div> 47 53 48 - <Rating class="z-10 text-lg" rating={review.value.rating} /> 49 - </div> 50 - </a> 54 + <Rating class="z-10 text-lg" rating={review.value.rating} /> 55 + </div> 56 + </a> 57 + {/if} 51 58 {/each} 52 59 </div>
+86
src/lib/cards/StatusphereCard/EditStatusphereCard.svelte
··· 1 + <script lang="ts"> 2 + import type { Item } from '$lib/types'; 3 + import { onMount } from 'svelte'; 4 + import { getAdditionalUserData, getDidContext, getHandleContext } from '$lib/website/context'; 5 + import { CardDefinitionsByType } from '..'; 6 + import { PopoverEmojiPicker } from '@foxui/social'; 7 + 8 + import icons from './icons.json'; 9 + import { emojiToNotoAnimatedWebp } from '.'; 10 + import PlainTextEditor from '../utils/PlainTextEditor.svelte'; 11 + import { cn } from '@foxui/core'; 12 + 13 + let { item }: { item: Item } = $props(); 14 + 15 + const data = getAdditionalUserData(); 16 + // svelte-ignore state_referenced_locally 17 + let record = $state(data[item.cardType] as any); 18 + 19 + let did = getDidContext(); 20 + let handle = getHandleContext(); 21 + 22 + onMount(async () => { 23 + if (!record) { 24 + record = (await CardDefinitionsByType[item.cardType]?.loadData?.([], { 25 + did, 26 + handle 27 + })) as any; 28 + 29 + data[item.cardType] = record; 30 + } 31 + }); 32 + 33 + let showPopover = $state(false); 34 + </script> 35 + 36 + <div class="flex h-full w-full items-center justify-center p-4"> 37 + <PopoverEmojiPicker 38 + bind:open={showPopover} 39 + onpicked={(emoji) => { 40 + record ??= { 41 + value: {} 42 + }; 43 + 44 + record.value.status = emoji.unicode; 45 + 46 + item.cardData.hasUpdate = true; 47 + item.cardData.emoji = emoji.unicode; 48 + 49 + showPopover = false; 50 + }} 51 + > 52 + {#snippet child({ props })} 53 + {@const animated = emojiToNotoAnimatedWebp(record?.value?.status)} 54 + 55 + <button {...props} class="z-20 h-full max-h-40 w-full max-w-40"> 56 + {#if animated} 57 + <img 58 + src={animated} 59 + alt="" 60 + class="hover:bg-base-500/10 h-full max-h-40 w-full max-w-40 rounded-2xl object-contain" 61 + /> 62 + {:else if record?.value?.status} 63 + <div class="text-9xl"> 64 + {record.value.status} 65 + </div> 66 + {:else} 67 + <div>Click here to set a status</div> 68 + {/if} 69 + </button> 70 + {/snippet} 71 + </PopoverEmojiPicker> 72 + 73 + <div 74 + class={cn( 75 + 'bg-base-200/30 dark:bg-base-900/30 absolute top-2 right-2 left-2 z-30 rounded-lg p-1 backdrop-blur-md', 76 + !item.cardData.title && 'hidden group-hover/card:block' 77 + )} 78 + > 79 + <PlainTextEditor 80 + class="text-base-900 dark:text-base-50 text-md line-clamp-1 font-bold" 81 + key="title" 82 + bind:item 83 + placeholder="I'm feeling..." 84 + /> 85 + </div> 86 + </div>
+24
src/lib/cards/StatusphereCard/SettingsStatusphereCard.svelte
··· 1 + <script lang="ts"> 2 + import type { Item } from '$lib/types'; 3 + import { getAdditionalUserData } from '$lib/website/context'; 4 + import { EmojiPicker } from '@foxui/social'; 5 + import { emojiToNotoAnimatedWebp } from '.'; 6 + 7 + let { item }: { item: Item } = $props(); 8 + 9 + const data = getAdditionalUserData(); 10 + // svelte-ignore state_referenced_locally 11 + let record = $state(data[item.cardType] as any); 12 + 13 + let animated = $derived(emojiToNotoAnimatedWebp(record.value.status)); 14 + </script> 15 + 16 + <EmojiPicker 17 + onpicked={(emoji) => { 18 + record.value.status = emoji.unicode; 19 + data[item.cardType] = { value: { status: emoji.unicode } }; 20 + 21 + item.cardData.hasUpdate = true; 22 + item.cardData.emoji = emoji.unicode; 23 + }} 24 + />
+35
src/lib/cards/StatusphereCard/StatusphereCard.svelte
··· 1 + <script lang="ts"> 2 + import type { Item } from '$lib/types'; 3 + import { getAdditionalUserData } from '$lib/website/context'; 4 + import { emojiToNotoAnimatedWebp } from '.'; 5 + 6 + import icons from './icons.json'; 7 + 8 + let { item }: { item: Item } = $props(); 9 + 10 + const data = getAdditionalUserData(); 11 + // svelte-ignore state_referenced_locally 12 + let record = $state(data[item.cardType] as any); 13 + 14 + let animated = $derived(emojiToNotoAnimatedWebp(record?.value?.status)); 15 + </script> 16 + 17 + <div class="flex h-full w-full items-center justify-center p-4"> 18 + {#if animated} 19 + <img src={animated} alt="" class="h-full max-h-40 w-full object-contain" /> 20 + {:else if record?.value?.status} 21 + <div class="text-9xl"> 22 + {record?.value?.status} 23 + </div> 24 + {:else} 25 + No status yet 26 + {/if} 27 + 28 + {#if item.cardData.title} 29 + <div 30 + class="text-base-900 dark:text-base-50 text-md bg-base-200/30 dark:bg-base-900/30 absolute top-2 right-2 left-2 z-30 line-clamp-1 rounded-lg p-1 font-bold backdrop-blur-md" 31 + > 32 + {item.cardData.title} 33 + </div> 34 + {/if} 35 + </div>
+10259
src/lib/cards/StatusphereCard/icons.json
··· 1 + { 2 + "host": "", 3 + "asset_url_pattern": "", 4 + "families": [ 5 + "Animated Emoji" 6 + ], 7 + "icons": [ 8 + { 9 + "name": "emoji_u1f600", 10 + "version": 1, 11 + "popularity": 720, 12 + "codepoint": "1f600", 13 + "unsupported_families": [], 14 + "categories": [ 15 + "Smileys and emotions" 16 + ], 17 + "tags": [ 18 + ":smile:" 19 + ], 20 + "sizes_px": [] 21 + }, 22 + { 23 + "name": "emoji_u1f603", 24 + "version": 1, 25 + "popularity": 719, 26 + "codepoint": "1f603", 27 + "unsupported_families": [], 28 + "categories": [ 29 + "Smileys and emotions" 30 + ], 31 + "tags": [ 32 + ":smile-with-big-eyes:" 33 + ], 34 + "sizes_px": [] 35 + }, 36 + { 37 + "name": "emoji_u1f604", 38 + "version": 1, 39 + "popularity": 718, 40 + "codepoint": "1f604", 41 + "unsupported_families": [], 42 + "categories": [ 43 + "Smileys and emotions" 44 + ], 45 + "tags": [ 46 + ":grin:" 47 + ], 48 + "sizes_px": [] 49 + }, 50 + { 51 + "name": "emoji_u1f601", 52 + "version": 1, 53 + "popularity": 717, 54 + "codepoint": "1f601", 55 + "unsupported_families": [], 56 + "categories": [ 57 + "Smileys and emotions" 58 + ], 59 + "tags": [ 60 + ":grinning:" 61 + ], 62 + "sizes_px": [] 63 + }, 64 + { 65 + "name": "emoji_u1f606", 66 + "version": 1, 67 + "popularity": 716, 68 + "codepoint": "1f606", 69 + "unsupported_families": [], 70 + "categories": [ 71 + "Smileys and emotions" 72 + ], 73 + "tags": [ 74 + ":laughing:" 75 + ], 76 + "sizes_px": [] 77 + }, 78 + { 79 + "name": "emoji_u1f605", 80 + "version": 1, 81 + "popularity": 715, 82 + "codepoint": "1f605", 83 + "unsupported_families": [], 84 + "categories": [ 85 + "Smileys and emotions" 86 + ], 87 + "tags": [ 88 + ":grin-sweat:" 89 + ], 90 + "sizes_px": [] 91 + }, 92 + { 93 + "name": "emoji_u1f602", 94 + "version": 1, 95 + "popularity": 714, 96 + "codepoint": "1f602", 97 + "unsupported_families": [], 98 + "categories": [ 99 + "Smileys and emotions" 100 + ], 101 + "tags": [ 102 + ":joy:" 103 + ], 104 + "sizes_px": [] 105 + }, 106 + { 107 + "name": "emoji_u1f923", 108 + "version": 1, 109 + "popularity": 713, 110 + "codepoint": "1f923", 111 + "unsupported_families": [], 112 + "categories": [ 113 + "Smileys and emotions" 114 + ], 115 + "tags": [ 116 + ":rofl:" 117 + ], 118 + "sizes_px": [] 119 + }, 120 + { 121 + "name": "emoji_u1f62d", 122 + "version": 1, 123 + "popularity": 712, 124 + "codepoint": "1f62d", 125 + "unsupported_families": [], 126 + "categories": [ 127 + "Smileys and emotions" 128 + ], 129 + "tags": [ 130 + ":loudly-crying:" 131 + ], 132 + "sizes_px": [] 133 + }, 134 + { 135 + "name": "emoji_u1f609", 136 + "version": 1, 137 + "popularity": 711, 138 + "codepoint": "1f609", 139 + "unsupported_families": [], 140 + "categories": [ 141 + "Smileys and emotions" 142 + ], 143 + "tags": [ 144 + ":wink:" 145 + ], 146 + "sizes_px": [] 147 + }, 148 + { 149 + "name": "emoji_u1f617", 150 + "version": 1, 151 + "popularity": 710, 152 + "codepoint": "1f617", 153 + "unsupported_families": [], 154 + "categories": [ 155 + "Smileys and emotions" 156 + ], 157 + "tags": [ 158 + ":kissing:" 159 + ], 160 + "sizes_px": [] 161 + }, 162 + { 163 + "name": "emoji_u1f619", 164 + "version": 1, 165 + "popularity": 709, 166 + "codepoint": "1f619", 167 + "unsupported_families": [], 168 + "categories": [ 169 + "Smileys and emotions" 170 + ], 171 + "tags": [ 172 + ":kissing-smiling-eyes:" 173 + ], 174 + "sizes_px": [] 175 + }, 176 + { 177 + "name": "emoji_u1f61a", 178 + "version": 1, 179 + "popularity": 708, 180 + "codepoint": "1f61a", 181 + "unsupported_families": [], 182 + "categories": [ 183 + "Smileys and emotions" 184 + ], 185 + "tags": [ 186 + ":kissing-closed-eyes:" 187 + ], 188 + "sizes_px": [] 189 + }, 190 + { 191 + "name": "emoji_u1f618", 192 + "version": 1, 193 + "popularity": 707, 194 + "codepoint": "1f618", 195 + "unsupported_families": [], 196 + "categories": [ 197 + "Smileys and emotions" 198 + ], 199 + "tags": [ 200 + ":kissing-heart:" 201 + ], 202 + "sizes_px": [] 203 + }, 204 + { 205 + "name": "emoji_u1f970", 206 + "version": 1, 207 + "popularity": 706, 208 + "codepoint": "1f970", 209 + "unsupported_families": [], 210 + "categories": [ 211 + "Smileys and emotions" 212 + ], 213 + "tags": [ 214 + ":heart-face:", 215 + ":3-hearts:" 216 + ], 217 + "sizes_px": [] 218 + }, 219 + { 220 + "name": "emoji_u1f60d", 221 + "version": 1, 222 + "popularity": 705, 223 + "codepoint": "1f60d", 224 + "unsupported_families": [], 225 + "categories": [ 226 + "Smileys and emotions" 227 + ], 228 + "tags": [ 229 + ":heart-eyes:" 230 + ], 231 + "sizes_px": [] 232 + }, 233 + { 234 + "name": "emoji_u1f929", 235 + "version": 1, 236 + "popularity": 704, 237 + "codepoint": "1f929", 238 + "unsupported_families": [], 239 + "categories": [ 240 + "Smileys and emotions" 241 + ], 242 + "tags": [ 243 + ":star-struck:" 244 + ], 245 + "sizes_px": [] 246 + }, 247 + { 248 + "name": "emoji_u1f973", 249 + "version": 1, 250 + "popularity": 703, 251 + "codepoint": "1f973", 252 + "unsupported_families": [], 253 + "categories": [ 254 + "Smileys and emotions" 255 + ], 256 + "tags": [ 257 + ":partying-face:" 258 + ], 259 + "sizes_px": [] 260 + }, 261 + { 262 + "name": "emoji_u1fae0", 263 + "version": 1, 264 + "popularity": 702, 265 + "codepoint": "1fae0", 266 + "unsupported_families": [], 267 + "categories": [ 268 + "Smileys and emotions" 269 + ], 270 + "tags": [ 271 + ":melting:" 272 + ], 273 + "sizes_px": [] 274 + }, 275 + { 276 + "name": "emoji_u1f643", 277 + "version": 1, 278 + "popularity": 701, 279 + "codepoint": "1f643", 280 + "unsupported_families": [], 281 + "categories": [ 282 + "Smileys and emotions" 283 + ], 284 + "tags": [ 285 + ":upside-down-face:" 286 + ], 287 + "sizes_px": [] 288 + }, 289 + { 290 + "name": "emoji_u1f642", 291 + "version": 1, 292 + "popularity": 700, 293 + "codepoint": "1f642", 294 + "unsupported_families": [], 295 + "categories": [ 296 + "Smileys and emotions" 297 + ], 298 + "tags": [ 299 + ":slightly-happy:" 300 + ], 301 + "sizes_px": [] 302 + }, 303 + { 304 + "name": "emoji_u1f972", 305 + "version": 1, 306 + "popularity": 699, 307 + "codepoint": "1f972", 308 + "unsupported_families": [], 309 + "categories": [ 310 + "Smileys and emotions" 311 + ], 312 + "tags": [ 313 + ":happy-cry:" 314 + ], 315 + "sizes_px": [] 316 + }, 317 + { 318 + "name": "emoji_u1f979", 319 + "version": 1, 320 + "popularity": 698, 321 + "codepoint": "1f979", 322 + "unsupported_families": [], 323 + "categories": [ 324 + "Smileys and emotions" 325 + ], 326 + "tags": [ 327 + ":holding-back-tears:" 328 + ], 329 + "sizes_px": [] 330 + }, 331 + { 332 + "name": "emoji_u1f60a", 333 + "version": 1, 334 + "popularity": 697, 335 + "codepoint": "1f60a", 336 + "unsupported_families": [], 337 + "categories": [ 338 + "Smileys and emotions" 339 + ], 340 + "tags": [ 341 + ":blush:" 342 + ], 343 + "sizes_px": [] 344 + }, 345 + { 346 + "name": "emoji_u263a_fe0f", 347 + "version": 1, 348 + "popularity": 696, 349 + "codepoint": "263a_fe0f", 350 + "unsupported_families": [], 351 + "categories": [ 352 + "Smileys and emotions" 353 + ], 354 + "tags": [ 355 + ":warm-smile:" 356 + ], 357 + "sizes_px": [] 358 + }, 359 + { 360 + "name": "emoji_u1f60c", 361 + "version": 1, 362 + "popularity": 695, 363 + "codepoint": "1f60c", 364 + "unsupported_families": [], 365 + "categories": [ 366 + "Smileys and emotions" 367 + ], 368 + "tags": [ 369 + ":relieved:" 370 + ], 371 + "sizes_px": [] 372 + }, 373 + { 374 + "name": "emoji_u1f642_200d_2195_fe0f", 375 + "version": 1, 376 + "popularity": 694, 377 + "codepoint": "1f642_200d_2195_fe0f", 378 + "unsupported_families": [], 379 + "categories": [ 380 + "Smileys and emotions" 381 + ], 382 + "tags": [ 383 + ":head-nod:" 384 + ], 385 + "sizes_px": [] 386 + }, 387 + { 388 + "name": "emoji_u1f642_200d_2194_fe0f", 389 + "version": 1, 390 + "popularity": 693, 391 + "codepoint": "1f642_200d_2194_fe0f", 392 + "unsupported_families": [], 393 + "categories": [ 394 + "Smileys and emotions" 395 + ], 396 + "tags": [ 397 + ":head-shake:" 398 + ], 399 + "sizes_px": [] 400 + }, 401 + { 402 + "name": "emoji_u1f60f", 403 + "version": 1, 404 + "popularity": 692, 405 + "codepoint": "1f60f", 406 + "unsupported_families": [], 407 + "categories": [ 408 + "Smileys and emotions" 409 + ], 410 + "tags": [ 411 + ":smirk:" 412 + ], 413 + "sizes_px": [] 414 + }, 415 + { 416 + "name": "emoji_u1f924", 417 + "version": 1, 418 + "popularity": 691, 419 + "codepoint": "1f924", 420 + "unsupported_families": [], 421 + "categories": [ 422 + "Smileys and emotions" 423 + ], 424 + "tags": [ 425 + ":drool:" 426 + ], 427 + "sizes_px": [] 428 + }, 429 + { 430 + "name": "emoji_u1f60b", 431 + "version": 1, 432 + "popularity": 690, 433 + "codepoint": "1f60b", 434 + "unsupported_families": [], 435 + "categories": [ 436 + "Smileys and emotions" 437 + ], 438 + "tags": [ 439 + ":yum:" 440 + ], 441 + "sizes_px": [] 442 + }, 443 + { 444 + "name": "emoji_u1f61b", 445 + "version": 1, 446 + "popularity": 689, 447 + "codepoint": "1f61b", 448 + "unsupported_families": [], 449 + "categories": [ 450 + "Smileys and emotions" 451 + ], 452 + "tags": [ 453 + ":stuck-out-tongue:" 454 + ], 455 + "sizes_px": [] 456 + }, 457 + { 458 + "name": "emoji_u1f61d", 459 + "version": 1, 460 + "popularity": 688, 461 + "codepoint": "1f61d", 462 + "unsupported_families": [], 463 + "categories": [ 464 + "Smileys and emotions" 465 + ], 466 + "tags": [ 467 + ":squinting-tongue:" 468 + ], 469 + "sizes_px": [] 470 + }, 471 + { 472 + "name": "emoji_u1f61c", 473 + "version": 1, 474 + "popularity": 687, 475 + "codepoint": "1f61c", 476 + "unsupported_families": [], 477 + "categories": [ 478 + "Smileys and emotions" 479 + ], 480 + "tags": [ 481 + ":winky-tongue:" 482 + ], 483 + "sizes_px": [] 484 + }, 485 + { 486 + "name": "emoji_u1f92a", 487 + "version": 1, 488 + "popularity": 686, 489 + "codepoint": "1f92a", 490 + "unsupported_families": [], 491 + "categories": [ 492 + "Smileys and emotions" 493 + ], 494 + "tags": [ 495 + ":zany-face:" 496 + ], 497 + "sizes_px": [] 498 + }, 499 + { 500 + "name": "emoji_u1f974", 501 + "version": 1, 502 + "popularity": 685, 503 + "codepoint": "1f974", 504 + "unsupported_families": [], 505 + "categories": [ 506 + "Smileys and emotions" 507 + ], 508 + "tags": [ 509 + ":woozy:" 510 + ], 511 + "sizes_px": [] 512 + }, 513 + { 514 + "name": "emoji_u1f614", 515 + "version": 1, 516 + "popularity": 684, 517 + "codepoint": "1f614", 518 + "unsupported_families": [], 519 + "categories": [ 520 + "Smileys and emotions" 521 + ], 522 + "tags": [ 523 + ":pensive:" 524 + ], 525 + "sizes_px": [] 526 + }, 527 + { 528 + "name": "emoji_u1f97a", 529 + "version": 1, 530 + "popularity": 683, 531 + "codepoint": "1f97a", 532 + "unsupported_families": [], 533 + "categories": [ 534 + "Smileys and emotions" 535 + ], 536 + "tags": [ 537 + ":pleading:" 538 + ], 539 + "sizes_px": [] 540 + }, 541 + { 542 + "name": "emoji_u1f62c", 543 + "version": 1, 544 + "popularity": 682, 545 + "codepoint": "1f62c", 546 + "unsupported_families": [], 547 + "categories": [ 548 + "Smileys and emotions" 549 + ], 550 + "tags": [ 551 + ":grimacing:" 552 + ], 553 + "sizes_px": [] 554 + }, 555 + { 556 + "name": "emoji_u1f611", 557 + "version": 1, 558 + "popularity": 681, 559 + "codepoint": "1f611", 560 + "unsupported_families": [], 561 + "categories": [ 562 + "Smileys and emotions" 563 + ], 564 + "tags": [ 565 + ":expressionless:" 566 + ], 567 + "sizes_px": [] 568 + }, 569 + { 570 + "name": "emoji_u1f610", 571 + "version": 1, 572 + "popularity": 680, 573 + "codepoint": "1f610", 574 + "unsupported_families": [], 575 + "categories": [ 576 + "Smileys and emotions" 577 + ], 578 + "tags": [ 579 + ":neutral-face:" 580 + ], 581 + "sizes_px": [] 582 + }, 583 + { 584 + "name": "emoji_u1f636", 585 + "version": 1, 586 + "popularity": 679, 587 + "codepoint": "1f636", 588 + "unsupported_families": [], 589 + "categories": [ 590 + "Smileys and emotions" 591 + ], 592 + "tags": [ 593 + ":mouth-none:" 594 + ], 595 + "sizes_px": [] 596 + }, 597 + { 598 + "name": "emoji_u1f636_200d_1f32b_fe0f", 599 + "version": 1, 600 + "popularity": 678, 601 + "codepoint": "1f636_200d_1f32b_fe0f", 602 + "unsupported_families": [], 603 + "categories": [ 604 + "Smileys and emotions" 605 + ], 606 + "tags": [ 607 + ":face-in-clouds:", 608 + ":lost:" 609 + ], 610 + "sizes_px": [] 611 + }, 612 + { 613 + "name": "emoji_u1fae5", 614 + "version": 1, 615 + "popularity": 677, 616 + "codepoint": "1fae5", 617 + "unsupported_families": [], 618 + "categories": [ 619 + "Smileys and emotions" 620 + ], 621 + "tags": [ 622 + ":dotted-line-face:", 623 + ":invisible:" 624 + ], 625 + "sizes_px": [] 626 + }, 627 + { 628 + "name": "emoji_u1f910", 629 + "version": 1, 630 + "popularity": 676, 631 + "codepoint": "1f910", 632 + "unsupported_families": [], 633 + "categories": [ 634 + "Smileys and emotions" 635 + ], 636 + "tags": [ 637 + ":zipper-face:" 638 + ], 639 + "sizes_px": [] 640 + }, 641 + { 642 + "name": "emoji_u1fae1", 643 + "version": 1, 644 + "popularity": 675, 645 + "codepoint": "1fae1", 646 + "unsupported_families": [], 647 + "categories": [ 648 + "Smileys and emotions" 649 + ], 650 + "tags": [ 651 + ":salute:" 652 + ], 653 + "sizes_px": [] 654 + }, 655 + { 656 + "name": "emoji_u1f914", 657 + "version": 1, 658 + "popularity": 674, 659 + "codepoint": "1f914", 660 + "unsupported_families": [], 661 + "categories": [ 662 + "Smileys and emotions" 663 + ], 664 + "tags": [ 665 + ":thinking-face:" 666 + ], 667 + "sizes_px": [] 668 + }, 669 + { 670 + "name": "emoji_u1f92b", 671 + "version": 1, 672 + "popularity": 673, 673 + "codepoint": "1f92b", 674 + "unsupported_families": [], 675 + "categories": [ 676 + "Smileys and emotions" 677 + ], 678 + "tags": [ 679 + ":shushing-face:" 680 + ], 681 + "sizes_px": [] 682 + }, 683 + { 684 + "name": "emoji_u1fae2", 685 + "version": 1, 686 + "popularity": 672, 687 + "codepoint": "1fae2", 688 + "unsupported_families": [], 689 + "categories": [ 690 + "Smileys and emotions" 691 + ], 692 + "tags": [ 693 + ":hand-over-mouth:" 694 + ], 695 + "sizes_px": [] 696 + }, 697 + { 698 + "name": "emoji_u1f92d", 699 + "version": 1, 700 + "popularity": 671, 701 + "codepoint": "1f92d", 702 + "unsupported_families": [], 703 + "categories": [ 704 + "Smileys and emotions" 705 + ], 706 + "tags": [ 707 + ":smiling-eyes-with-hand-over-mouth:", 708 + ":chuckling:" 709 + ], 710 + "sizes_px": [] 711 + }, 712 + { 713 + "name": "emoji_u1f971", 714 + "version": 1, 715 + "popularity": 670, 716 + "codepoint": "1f971", 717 + "unsupported_families": [], 718 + "categories": [ 719 + "Smileys and emotions" 720 + ], 721 + "tags": [ 722 + ":yawn:" 723 + ], 724 + "sizes_px": [] 725 + }, 726 + { 727 + "name": "emoji_u1f917", 728 + "version": 1, 729 + "popularity": 669, 730 + "codepoint": "1f917", 731 + "unsupported_families": [], 732 + "categories": [ 733 + "Smileys and emotions" 734 + ], 735 + "tags": [ 736 + ":hug-face:" 737 + ], 738 + "sizes_px": [] 739 + }, 740 + { 741 + "name": "emoji_u1fae3", 742 + "version": 1, 743 + "popularity": 668, 744 + "codepoint": "1fae3", 745 + "unsupported_families": [], 746 + "categories": [ 747 + "Smileys and emotions" 748 + ], 749 + "tags": [ 750 + ":peeking:" 751 + ], 752 + "sizes_px": [] 753 + }, 754 + { 755 + "name": "emoji_u1f631", 756 + "version": 1, 757 + "popularity": 667, 758 + "codepoint": "1f631", 759 + "unsupported_families": [], 760 + "categories": [ 761 + "Smileys and emotions" 762 + ], 763 + "tags": [ 764 + ":screaming:" 765 + ], 766 + "sizes_px": [] 767 + }, 768 + { 769 + "name": "emoji_u1f928", 770 + "version": 1, 771 + "popularity": 666, 772 + "codepoint": "1f928", 773 + "unsupported_families": [], 774 + "categories": [ 775 + "Smileys and emotions" 776 + ], 777 + "tags": [ 778 + ":raised-eyebrow:" 779 + ], 780 + "sizes_px": [] 781 + }, 782 + { 783 + "name": "emoji_u1f9d0", 784 + "version": 1, 785 + "popularity": 665, 786 + "codepoint": "1f9d0", 787 + "unsupported_families": [], 788 + "categories": [ 789 + "Smileys and emotions" 790 + ], 791 + "tags": [ 792 + ":monocle:" 793 + ], 794 + "sizes_px": [] 795 + }, 796 + { 797 + "name": "emoji_u1f612", 798 + "version": 1, 799 + "popularity": 664, 800 + "codepoint": "1f612", 801 + "unsupported_families": [], 802 + "categories": [ 803 + "Smileys and emotions" 804 + ], 805 + "tags": [ 806 + ":unamused:" 807 + ], 808 + "sizes_px": [] 809 + }, 810 + { 811 + "name": "emoji_u1f644", 812 + "version": 1, 813 + "popularity": 663, 814 + "codepoint": "1f644", 815 + "unsupported_families": [], 816 + "categories": [ 817 + "Smileys and emotions" 818 + ], 819 + "tags": [ 820 + ":rolling-eyes:" 821 + ], 822 + "sizes_px": [] 823 + }, 824 + { 825 + "name": "emoji_u1f62e_200d_1f4a8", 826 + "version": 1, 827 + "popularity": 662, 828 + "codepoint": "1f62e_200d_1f4a8", 829 + "unsupported_families": [], 830 + "categories": [ 831 + "Smileys and emotions" 832 + ], 833 + "tags": [ 834 + ":exhale:" 835 + ], 836 + "sizes_px": [] 837 + }, 838 + { 839 + "name": "emoji_u1f624", 840 + "version": 1, 841 + "popularity": 661, 842 + "codepoint": "1f624", 843 + "unsupported_families": [], 844 + "categories": [ 845 + "Smileys and emotions" 846 + ], 847 + "tags": [ 848 + ":triumph:" 849 + ], 850 + "sizes_px": [] 851 + }, 852 + { 853 + "name": "emoji_u1f620", 854 + "version": 1, 855 + "popularity": 660, 856 + "codepoint": "1f620", 857 + "unsupported_families": [], 858 + "categories": [ 859 + "Smileys and emotions" 860 + ], 861 + "tags": [ 862 + ":angry:" 863 + ], 864 + "sizes_px": [] 865 + }, 866 + { 867 + "name": "emoji_u1f621", 868 + "version": 1, 869 + "popularity": 659, 870 + "codepoint": "1f621", 871 + "unsupported_families": [], 872 + "categories": [ 873 + "Smileys and emotions" 874 + ], 875 + "tags": [ 876 + ":rage:" 877 + ], 878 + "sizes_px": [] 879 + }, 880 + { 881 + "name": "emoji_u1f92c", 882 + "version": 1, 883 + "popularity": 658, 884 + "codepoint": "1f92c", 885 + "unsupported_families": [], 886 + "categories": [ 887 + "Smileys and emotions" 888 + ], 889 + "tags": [ 890 + ":cursing:" 891 + ], 892 + "sizes_px": [] 893 + }, 894 + { 895 + "name": "emoji_u1f61e", 896 + "version": 1, 897 + "popularity": 657, 898 + "codepoint": "1f61e", 899 + "unsupported_families": [], 900 + "categories": [ 901 + "Smileys and emotions" 902 + ], 903 + "tags": [ 904 + ":sad:" 905 + ], 906 + "sizes_px": [] 907 + }, 908 + { 909 + "name": "emoji_u1f613", 910 + "version": 1, 911 + "popularity": 656, 912 + "codepoint": "1f613", 913 + "unsupported_families": [], 914 + "categories": [ 915 + "Smileys and emotions" 916 + ], 917 + "tags": [ 918 + ":sweat:", 919 + ":downcast:" 920 + ], 921 + "sizes_px": [] 922 + }, 923 + { 924 + "name": "emoji_u1f61f", 925 + "version": 1, 926 + "popularity": 655, 927 + "codepoint": "1f61f", 928 + "unsupported_families": [], 929 + "categories": [ 930 + "Smileys and emotions" 931 + ], 932 + "tags": [ 933 + ":worried:" 934 + ], 935 + "sizes_px": [] 936 + }, 937 + { 938 + "name": "emoji_u1f625", 939 + "version": 1, 940 + "popularity": 654, 941 + "codepoint": "1f625", 942 + "unsupported_families": [], 943 + "categories": [ 944 + "Smileys and emotions" 945 + ], 946 + "tags": [ 947 + ":concerned:" 948 + ], 949 + "sizes_px": [] 950 + }, 951 + { 952 + "name": "emoji_u1f622", 953 + "version": 1, 954 + "popularity": 653, 955 + "codepoint": "1f622", 956 + "unsupported_families": [], 957 + "categories": [ 958 + "Smileys and emotions" 959 + ], 960 + "tags": [ 961 + ":cry:" 962 + ], 963 + "sizes_px": [] 964 + }, 965 + { 966 + "name": "emoji_u2639_fe0f", 967 + "version": 1, 968 + "popularity": 652, 969 + "codepoint": "2639_fe0f", 970 + "unsupported_families": [], 971 + "categories": [ 972 + "Smileys and emotions" 973 + ], 974 + "tags": [ 975 + ":big-frown:" 976 + ], 977 + "sizes_px": [] 978 + }, 979 + { 980 + "name": "emoji_u1f641", 981 + "version": 1, 982 + "popularity": 651, 983 + "codepoint": "1f641", 984 + "unsupported_families": [], 985 + "categories": [ 986 + "Smileys and emotions" 987 + ], 988 + "tags": [ 989 + ":frown:" 990 + ], 991 + "sizes_px": [] 992 + }, 993 + { 994 + "name": "emoji_u1fae4", 995 + "version": 1, 996 + "popularity": 650, 997 + "codepoint": "1fae4", 998 + "unsupported_families": [], 999 + "categories": [ 1000 + "Smileys and emotions" 1001 + ], 1002 + "tags": [ 1003 + ":diagonal-mouth:" 1004 + ], 1005 + "sizes_px": [] 1006 + }, 1007 + { 1008 + "name": "emoji_u1f615", 1009 + "version": 1, 1010 + "popularity": 649, 1011 + "codepoint": "1f615", 1012 + "unsupported_families": [], 1013 + "categories": [ 1014 + "Smileys and emotions" 1015 + ], 1016 + "tags": [ 1017 + ":slightly-frowning:" 1018 + ], 1019 + "sizes_px": [] 1020 + }, 1021 + { 1022 + "name": "emoji_u1f630", 1023 + "version": 1, 1024 + "popularity": 648, 1025 + "codepoint": "1f630", 1026 + "unsupported_families": [], 1027 + "categories": [ 1028 + "Smileys and emotions" 1029 + ], 1030 + "tags": [ 1031 + ":anxious-with-sweat:" 1032 + ], 1033 + "sizes_px": [] 1034 + }, 1035 + { 1036 + "name": "emoji_u1f628", 1037 + "version": 1, 1038 + "popularity": 647, 1039 + "codepoint": "1f628", 1040 + "unsupported_families": [], 1041 + "categories": [ 1042 + "Smileys and emotions" 1043 + ], 1044 + "tags": [ 1045 + ":scared:" 1046 + ], 1047 + "sizes_px": [] 1048 + }, 1049 + { 1050 + "name": "emoji_u1f627", 1051 + "version": 1, 1052 + "popularity": 646, 1053 + "codepoint": "1f627", 1054 + "unsupported_families": [], 1055 + "categories": [ 1056 + "Smileys and emotions" 1057 + ], 1058 + "tags": [ 1059 + ":anguished:" 1060 + ], 1061 + "sizes_px": [] 1062 + }, 1063 + { 1064 + "name": "emoji_u1f626", 1065 + "version": 1, 1066 + "popularity": 645, 1067 + "codepoint": "1f626", 1068 + "unsupported_families": [], 1069 + "categories": [ 1070 + "Smileys and emotions" 1071 + ], 1072 + "tags": [ 1073 + ":gasp:" 1074 + ], 1075 + "sizes_px": [] 1076 + }, 1077 + { 1078 + "name": "emoji_u1f62e", 1079 + "version": 1, 1080 + "popularity": 644, 1081 + "codepoint": "1f62e", 1082 + "unsupported_families": [], 1083 + "categories": [ 1084 + "Smileys and emotions" 1085 + ], 1086 + "tags": [ 1087 + ":mouth-open:" 1088 + ], 1089 + "sizes_px": [] 1090 + }, 1091 + { 1092 + "name": "emoji_u1f62f", 1093 + "version": 1, 1094 + "popularity": 643, 1095 + "codepoint": "1f62f", 1096 + "unsupported_families": [], 1097 + "categories": [ 1098 + "Smileys and emotions" 1099 + ], 1100 + "tags": [ 1101 + ":surprised:", 1102 + ":hushed:" 1103 + ], 1104 + "sizes_px": [] 1105 + }, 1106 + { 1107 + "name": "emoji_u1f632", 1108 + "version": 1, 1109 + "popularity": 642, 1110 + "codepoint": "1f632", 1111 + "unsupported_families": [], 1112 + "categories": [ 1113 + "Smileys and emotions" 1114 + ], 1115 + "tags": [ 1116 + ":astonished:" 1117 + ], 1118 + "sizes_px": [] 1119 + }, 1120 + { 1121 + "name": "emoji_u1f633", 1122 + "version": 1, 1123 + "popularity": 641, 1124 + "codepoint": "1f633", 1125 + "unsupported_families": [], 1126 + "categories": [ 1127 + "Smileys and emotions" 1128 + ], 1129 + "tags": [ 1130 + ":flushed:" 1131 + ], 1132 + "sizes_px": [] 1133 + }, 1134 + { 1135 + "name": "emoji_u1f92f", 1136 + "version": 1, 1137 + "popularity": 640, 1138 + "codepoint": "1f92f", 1139 + "unsupported_families": [], 1140 + "categories": [ 1141 + "Smileys and emotions" 1142 + ], 1143 + "tags": [ 1144 + ":mind-blown:", 1145 + ":exploding-head:" 1146 + ], 1147 + "sizes_px": [] 1148 + }, 1149 + { 1150 + "name": "emoji_u1f616", 1151 + "version": 1, 1152 + "popularity": 639, 1153 + "codepoint": "1f616", 1154 + "unsupported_families": [], 1155 + "categories": [ 1156 + "Smileys and emotions" 1157 + ], 1158 + "tags": [ 1159 + ":scrunched-mouth:", 1160 + ":confounded:", 1161 + ":zigzag-mouth:" 1162 + ], 1163 + "sizes_px": [] 1164 + }, 1165 + { 1166 + "name": "emoji_u1f623", 1167 + "version": 1, 1168 + "popularity": 638, 1169 + "codepoint": "1f623", 1170 + "unsupported_families": [], 1171 + "categories": [ 1172 + "Smileys and emotions" 1173 + ], 1174 + "tags": [ 1175 + ":scrunched-eyes:", 1176 + ":persevering:" 1177 + ], 1178 + "sizes_px": [] 1179 + }, 1180 + { 1181 + "name": "emoji_u1f629", 1182 + "version": 1, 1183 + "popularity": 637, 1184 + "codepoint": "1f629", 1185 + "unsupported_families": [], 1186 + "categories": [ 1187 + "Smileys and emotions" 1188 + ], 1189 + "tags": [ 1190 + ":weary:" 1191 + ], 1192 + "sizes_px": [] 1193 + }, 1194 + { 1195 + "name": "emoji_u1f62b", 1196 + "version": 1, 1197 + "popularity": 636, 1198 + "codepoint": "1f62b", 1199 + "unsupported_families": [], 1200 + "categories": [ 1201 + "Smileys and emotions" 1202 + ], 1203 + "tags": [ 1204 + ":distraught:" 1205 + ], 1206 + "sizes_px": [] 1207 + }, 1208 + { 1209 + "name": "emoji_u1f635", 1210 + "version": 1, 1211 + "popularity": 635, 1212 + "codepoint": "1f635", 1213 + "unsupported_families": [], 1214 + "categories": [ 1215 + "Smileys and emotions" 1216 + ], 1217 + "tags": [ 1218 + ":x-eyes:" 1219 + ], 1220 + "sizes_px": [] 1221 + }, 1222 + { 1223 + "name": "emoji_u1f635_200d_1f4ab", 1224 + "version": 1, 1225 + "popularity": 634, 1226 + "codepoint": "1f635_200d_1f4ab", 1227 + "unsupported_families": [], 1228 + "categories": [ 1229 + "Smileys and emotions" 1230 + ], 1231 + "tags": [ 1232 + ":dizzy-face:" 1233 + ], 1234 + "sizes_px": [] 1235 + }, 1236 + { 1237 + "name": "emoji_u1fae8", 1238 + "version": 1, 1239 + "popularity": 633, 1240 + "codepoint": "1fae8", 1241 + "unsupported_families": [], 1242 + "categories": [ 1243 + "Smileys and emotions" 1244 + ], 1245 + "tags": [ 1246 + ":shaking-face:" 1247 + ], 1248 + "sizes_px": [] 1249 + }, 1250 + { 1251 + "name": "emoji_u1f976", 1252 + "version": 1, 1253 + "popularity": 632, 1254 + "codepoint": "1f976", 1255 + "unsupported_families": [], 1256 + "categories": [ 1257 + "Smileys and emotions" 1258 + ], 1259 + "tags": [ 1260 + ":cold-face:" 1261 + ], 1262 + "sizes_px": [] 1263 + }, 1264 + { 1265 + "name": "emoji_u1f975", 1266 + "version": 1, 1267 + "popularity": 631, 1268 + "codepoint": "1f975", 1269 + "unsupported_families": [], 1270 + "categories": [ 1271 + "Smileys and emotions" 1272 + ], 1273 + "tags": [ 1274 + ":hot-face:", 1275 + ":sweat-face:" 1276 + ], 1277 + "sizes_px": [] 1278 + }, 1279 + { 1280 + "name": "emoji_u1f922", 1281 + "version": 1, 1282 + "popularity": 630, 1283 + "codepoint": "1f922", 1284 + "unsupported_families": [], 1285 + "categories": [ 1286 + "Smileys and emotions" 1287 + ], 1288 + "tags": [ 1289 + ":sick:", 1290 + ":nauseated:" 1291 + ], 1292 + "sizes_px": [] 1293 + }, 1294 + { 1295 + "name": "emoji_u1f92e", 1296 + "version": 1, 1297 + "popularity": 629, 1298 + "codepoint": "1f92e", 1299 + "unsupported_families": [], 1300 + "categories": [ 1301 + "Smileys and emotions" 1302 + ], 1303 + "tags": [ 1304 + ":vomit:" 1305 + ], 1306 + "sizes_px": [] 1307 + }, 1308 + { 1309 + "name": "emoji_u1fae9", 1310 + "version": 1, 1311 + "popularity": 628, 1312 + "codepoint": "1fae9", 1313 + "unsupported_families": [], 1314 + "categories": [ 1315 + "Smileys and emotions" 1316 + ], 1317 + "tags": [ 1318 + ":tired:", 1319 + ":bags-under-eyes:" 1320 + ], 1321 + "sizes_px": [] 1322 + }, 1323 + { 1324 + "name": "emoji_u1f634", 1325 + "version": 1, 1326 + "popularity": 627, 1327 + "codepoint": "1f634", 1328 + "unsupported_families": [], 1329 + "categories": [ 1330 + "Smileys and emotions" 1331 + ], 1332 + "tags": [ 1333 + ":sleep:" 1334 + ], 1335 + "sizes_px": [] 1336 + }, 1337 + { 1338 + "name": "emoji_u1f62a", 1339 + "version": 1, 1340 + "popularity": 626, 1341 + "codepoint": "1f62a", 1342 + "unsupported_families": [], 1343 + "categories": [ 1344 + "Smileys and emotions" 1345 + ], 1346 + "tags": [ 1347 + ":sleepy:" 1348 + ], 1349 + "sizes_px": [] 1350 + }, 1351 + { 1352 + "name": "emoji_u1f927", 1353 + "version": 1, 1354 + "popularity": 625, 1355 + "codepoint": "1f927", 1356 + "unsupported_families": [], 1357 + "categories": [ 1358 + "Smileys and emotions" 1359 + ], 1360 + "tags": [ 1361 + ":sneeze:" 1362 + ], 1363 + "sizes_px": [] 1364 + }, 1365 + { 1366 + "name": "emoji_u1f912", 1367 + "version": 1, 1368 + "popularity": 624, 1369 + "codepoint": "1f912", 1370 + "unsupported_families": [], 1371 + "categories": [ 1372 + "Smileys and emotions" 1373 + ], 1374 + "tags": [ 1375 + ":thermometer-face:" 1376 + ], 1377 + "sizes_px": [] 1378 + }, 1379 + { 1380 + "name": "emoji_u1f915", 1381 + "version": 1, 1382 + "popularity": 623, 1383 + "codepoint": "1f915", 1384 + "unsupported_families": [], 1385 + "categories": [ 1386 + "Smileys and emotions" 1387 + ], 1388 + "tags": [ 1389 + ":bandage-face:" 1390 + ], 1391 + "sizes_px": [] 1392 + }, 1393 + { 1394 + "name": "emoji_u1f637", 1395 + "version": 1, 1396 + "popularity": 622, 1397 + "codepoint": "1f637", 1398 + "unsupported_families": [], 1399 + "categories": [ 1400 + "Smileys and emotions" 1401 + ], 1402 + "tags": [ 1403 + ":mask:" 1404 + ], 1405 + "sizes_px": [] 1406 + }, 1407 + { 1408 + "name": "emoji_u1f925", 1409 + "version": 1, 1410 + "popularity": 621, 1411 + "codepoint": "1f925", 1412 + "unsupported_families": [], 1413 + "categories": [ 1414 + "Smileys and emotions" 1415 + ], 1416 + "tags": [ 1417 + ":liar:" 1418 + ], 1419 + "sizes_px": [] 1420 + }, 1421 + { 1422 + "name": "emoji_u1f607", 1423 + "version": 1, 1424 + "popularity": 620, 1425 + "codepoint": "1f607", 1426 + "unsupported_families": [], 1427 + "categories": [ 1428 + "Smileys and emotions" 1429 + ], 1430 + "tags": [ 1431 + ":halo:", 1432 + ":innocent:" 1433 + ], 1434 + "sizes_px": [] 1435 + }, 1436 + { 1437 + "name": "emoji_u1f920", 1438 + "version": 1, 1439 + "popularity": 619, 1440 + "codepoint": "1f920", 1441 + "unsupported_families": [], 1442 + "categories": [ 1443 + "Smileys and emotions" 1444 + ], 1445 + "tags": [ 1446 + ":cowboy:" 1447 + ], 1448 + "sizes_px": [] 1449 + }, 1450 + { 1451 + "name": "emoji_u1f911", 1452 + "version": 1, 1453 + "popularity": 618, 1454 + "codepoint": "1f911", 1455 + "unsupported_families": [], 1456 + "categories": [ 1457 + "Smileys and emotions" 1458 + ], 1459 + "tags": [ 1460 + ":money-face:" 1461 + ], 1462 + "sizes_px": [] 1463 + }, 1464 + { 1465 + "name": "emoji_u1f913", 1466 + "version": 1, 1467 + "popularity": 617, 1468 + "codepoint": "1f913", 1469 + "unsupported_families": [], 1470 + "categories": [ 1471 + "Smileys and emotions" 1472 + ], 1473 + "tags": [ 1474 + ":nerd-face:" 1475 + ], 1476 + "sizes_px": [] 1477 + }, 1478 + { 1479 + "name": "emoji_u1f60e", 1480 + "version": 1, 1481 + "popularity": 616, 1482 + "codepoint": "1f60e", 1483 + "unsupported_families": [], 1484 + "categories": [ 1485 + "Smileys and emotions" 1486 + ], 1487 + "tags": [ 1488 + ":sunglasses-face:" 1489 + ], 1490 + "sizes_px": [] 1491 + }, 1492 + { 1493 + "name": "emoji_u1f978", 1494 + "version": 1, 1495 + "popularity": 615, 1496 + "codepoint": "1f978", 1497 + "unsupported_families": [], 1498 + "categories": [ 1499 + "Smileys and emotions" 1500 + ], 1501 + "tags": [ 1502 + ":disguise:" 1503 + ], 1504 + "sizes_px": [] 1505 + }, 1506 + { 1507 + "name": "emoji_u1f921", 1508 + "version": 1, 1509 + "popularity": 614, 1510 + "codepoint": "1f921", 1511 + "unsupported_families": [], 1512 + "categories": [ 1513 + "Smileys and emotions" 1514 + ], 1515 + "tags": [ 1516 + ":clown:" 1517 + ], 1518 + "sizes_px": [] 1519 + }, 1520 + { 1521 + "name": "emoji_u1f4a9", 1522 + "version": 1, 1523 + "popularity": 613, 1524 + "codepoint": "1f4a9", 1525 + "unsupported_families": [], 1526 + "categories": [ 1527 + "Smileys and emotions" 1528 + ], 1529 + "tags": [ 1530 + ":poop:" 1531 + ], 1532 + "sizes_px": [] 1533 + }, 1534 + { 1535 + "name": "emoji_u1f608", 1536 + "version": 1, 1537 + "popularity": 612, 1538 + "codepoint": "1f608", 1539 + "unsupported_families": [], 1540 + "categories": [ 1541 + "Smileys and emotions" 1542 + ], 1543 + "tags": [ 1544 + ":imp-smile:" 1545 + ], 1546 + "sizes_px": [] 1547 + }, 1548 + { 1549 + "name": "emoji_u1f47f", 1550 + "version": 1, 1551 + "popularity": 611, 1552 + "codepoint": "1f47f", 1553 + "unsupported_families": [], 1554 + "categories": [ 1555 + "Smileys and emotions" 1556 + ], 1557 + "tags": [ 1558 + ":imp-frown:" 1559 + ], 1560 + "sizes_px": [] 1561 + }, 1562 + { 1563 + "name": "emoji_u1f47b", 1564 + "version": 1, 1565 + "popularity": 610, 1566 + "codepoint": "1f47b", 1567 + "unsupported_families": [], 1568 + "categories": [ 1569 + "Smileys and emotions" 1570 + ], 1571 + "tags": [ 1572 + ":ghost:" 1573 + ], 1574 + "sizes_px": [] 1575 + }, 1576 + { 1577 + "name": "emoji_u1f480", 1578 + "version": 1, 1579 + "popularity": 609, 1580 + "codepoint": "1f480", 1581 + "unsupported_families": [], 1582 + "categories": [ 1583 + "Smileys and emotions" 1584 + ], 1585 + "tags": [ 1586 + ":skull:" 1587 + ], 1588 + "sizes_px": [] 1589 + }, 1590 + { 1591 + "name": "emoji_u2603_fe0f", 1592 + "version": 1, 1593 + "popularity": 608, 1594 + "codepoint": "2603_fe0f", 1595 + "unsupported_families": [], 1596 + "categories": [ 1597 + "Smileys and emotions" 1598 + ], 1599 + "tags": [ 1600 + ":snowman-with-snow:" 1601 + ], 1602 + "sizes_px": [] 1603 + }, 1604 + { 1605 + "name": "emoji_u26c4", 1606 + "version": 1, 1607 + "popularity": 607, 1608 + "codepoint": "26c4", 1609 + "unsupported_families": [], 1610 + "categories": [ 1611 + "Smileys and emotions" 1612 + ], 1613 + "tags": [ 1614 + ":snowman:" 1615 + ], 1616 + "sizes_px": [] 1617 + }, 1618 + { 1619 + "name": "emoji_u1f383", 1620 + "version": 1, 1621 + "popularity": 606, 1622 + "codepoint": "1f383", 1623 + "unsupported_families": [], 1624 + "categories": [ 1625 + "Smileys and emotions" 1626 + ], 1627 + "tags": [ 1628 + ":jack-o-lantern:" 1629 + ], 1630 + "sizes_px": [] 1631 + }, 1632 + { 1633 + "name": "emoji_u1f916", 1634 + "version": 1, 1635 + "popularity": 605, 1636 + "codepoint": "1f916", 1637 + "unsupported_families": [], 1638 + "categories": [ 1639 + "Smileys and emotions" 1640 + ], 1641 + "tags": [ 1642 + ":robot:" 1643 + ], 1644 + "sizes_px": [] 1645 + }, 1646 + { 1647 + "name": "emoji_u1f47d", 1648 + "version": 1, 1649 + "popularity": 604, 1650 + "codepoint": "1f47d", 1651 + "unsupported_families": [], 1652 + "categories": [ 1653 + "Smileys and emotions" 1654 + ], 1655 + "tags": [ 1656 + ":alien:" 1657 + ], 1658 + "sizes_px": [] 1659 + }, 1660 + { 1661 + "name": "emoji_u1f47e", 1662 + "version": 1, 1663 + "popularity": 603, 1664 + "codepoint": "1f47e", 1665 + "unsupported_families": [], 1666 + "categories": [ 1667 + "Smileys and emotions" 1668 + ], 1669 + "tags": [ 1670 + ":alien-monster:" 1671 + ], 1672 + "sizes_px": [] 1673 + }, 1674 + { 1675 + "name": "emoji_u1f31e", 1676 + "version": 1, 1677 + "popularity": 602, 1678 + "codepoint": "1f31e", 1679 + "unsupported_families": [], 1680 + "categories": [ 1681 + "Smileys and emotions" 1682 + ], 1683 + "tags": [ 1684 + ":sun-with-face:" 1685 + ], 1686 + "sizes_px": [] 1687 + }, 1688 + { 1689 + "name": "emoji_u1f31b", 1690 + "version": 1, 1691 + "popularity": 601, 1692 + "codepoint": "1f31b", 1693 + "unsupported_families": [], 1694 + "categories": [ 1695 + "Smileys and emotions" 1696 + ], 1697 + "tags": [ 1698 + ":moon-face-first-quarter:" 1699 + ], 1700 + "sizes_px": [] 1701 + }, 1702 + { 1703 + "name": "emoji_u1f31c", 1704 + "version": 1, 1705 + "popularity": 600, 1706 + "codepoint": "1f31c", 1707 + "unsupported_families": [], 1708 + "categories": [ 1709 + "Smileys and emotions" 1710 + ], 1711 + "tags": [ 1712 + ":moon-face-last-quarter:" 1713 + ], 1714 + "sizes_px": [] 1715 + }, 1716 + { 1717 + "name": "emoji_u1f63a", 1718 + "version": 1, 1719 + "popularity": 599, 1720 + "codepoint": "1f63a", 1721 + "unsupported_families": [], 1722 + "categories": [ 1723 + "Smileys and emotions" 1724 + ], 1725 + "tags": [ 1726 + ":smiley-cat:" 1727 + ], 1728 + "sizes_px": [] 1729 + }, 1730 + { 1731 + "name": "emoji_u1f638", 1732 + "version": 1, 1733 + "popularity": 598, 1734 + "codepoint": "1f638", 1735 + "unsupported_families": [], 1736 + "categories": [ 1737 + "Smileys and emotions" 1738 + ], 1739 + "tags": [ 1740 + ":smile-cat:" 1741 + ], 1742 + "sizes_px": [] 1743 + }, 1744 + { 1745 + "name": "emoji_u1f639", 1746 + "version": 1, 1747 + "popularity": 597, 1748 + "codepoint": "1f639", 1749 + "unsupported_families": [], 1750 + "categories": [ 1751 + "Smileys and emotions" 1752 + ], 1753 + "tags": [ 1754 + ":joy-cat:" 1755 + ], 1756 + "sizes_px": [] 1757 + }, 1758 + { 1759 + "name": "emoji_u1f63b", 1760 + "version": 1, 1761 + "popularity": 596, 1762 + "codepoint": "1f63b", 1763 + "unsupported_families": [], 1764 + "categories": [ 1765 + "Smileys and emotions" 1766 + ], 1767 + "tags": [ 1768 + ":heart-eyes-cat:" 1769 + ], 1770 + "sizes_px": [] 1771 + }, 1772 + { 1773 + "name": "emoji_u1f63c", 1774 + "version": 1, 1775 + "popularity": 595, 1776 + "codepoint": "1f63c", 1777 + "unsupported_families": [], 1778 + "categories": [ 1779 + "Smileys and emotions" 1780 + ], 1781 + "tags": [ 1782 + ":smirk-cat:" 1783 + ], 1784 + "sizes_px": [] 1785 + }, 1786 + { 1787 + "name": "emoji_u1f63d", 1788 + "version": 1, 1789 + "popularity": 594, 1790 + "codepoint": "1f63d", 1791 + "unsupported_families": [], 1792 + "categories": [ 1793 + "Smileys and emotions" 1794 + ], 1795 + "tags": [ 1796 + ":kissing-cat:" 1797 + ], 1798 + "sizes_px": [] 1799 + }, 1800 + { 1801 + "name": "emoji_u1f640", 1802 + "version": 1, 1803 + "popularity": 593, 1804 + "codepoint": "1f640", 1805 + "unsupported_families": [], 1806 + "categories": [ 1807 + "Smileys and emotions" 1808 + ], 1809 + "tags": [ 1810 + ":scream-cat:" 1811 + ], 1812 + "sizes_px": [] 1813 + }, 1814 + { 1815 + "name": "emoji_u1f63f", 1816 + "version": 1, 1817 + "popularity": 592, 1818 + "codepoint": "1f63f", 1819 + "unsupported_families": [], 1820 + "categories": [ 1821 + "Smileys and emotions" 1822 + ], 1823 + "tags": [ 1824 + ":crying-cat-face:" 1825 + ], 1826 + "sizes_px": [] 1827 + }, 1828 + { 1829 + "name": "emoji_u1f63e", 1830 + "version": 1, 1831 + "popularity": 591, 1832 + "codepoint": "1f63e", 1833 + "unsupported_families": [], 1834 + "categories": [ 1835 + "Smileys and emotions" 1836 + ], 1837 + "tags": [ 1838 + ":pouting-cat:" 1839 + ], 1840 + "sizes_px": [] 1841 + }, 1842 + { 1843 + "name": "emoji_u1f648", 1844 + "version": 1, 1845 + "popularity": 590, 1846 + "codepoint": "1f648", 1847 + "unsupported_families": [], 1848 + "categories": [ 1849 + "Smileys and emotions" 1850 + ], 1851 + "tags": [ 1852 + ":see-no-evil-monkey:" 1853 + ], 1854 + "sizes_px": [] 1855 + }, 1856 + { 1857 + "name": "emoji_u1f649", 1858 + "version": 1, 1859 + "popularity": 589, 1860 + "codepoint": "1f649", 1861 + "unsupported_families": [], 1862 + "categories": [ 1863 + "Smileys and emotions" 1864 + ], 1865 + "tags": [ 1866 + ":hear-no-evil-monkey:" 1867 + ], 1868 + "sizes_px": [] 1869 + }, 1870 + { 1871 + "name": "emoji_u1f64a", 1872 + "version": 1, 1873 + "popularity": 588, 1874 + "codepoint": "1f64a", 1875 + "unsupported_families": [], 1876 + "categories": [ 1877 + "Smileys and emotions" 1878 + ], 1879 + "tags": [ 1880 + ":speak-no-evil-monkey:" 1881 + ], 1882 + "sizes_px": [] 1883 + }, 1884 + { 1885 + "name": "emoji_u1f31f", 1886 + "version": 1, 1887 + "popularity": 587, 1888 + "codepoint": "1f31f", 1889 + "unsupported_families": [], 1890 + "categories": [ 1891 + "Smileys and emotions" 1892 + ], 1893 + "tags": [ 1894 + ":glowing-star:" 1895 + ], 1896 + "sizes_px": [] 1897 + }, 1898 + { 1899 + "name": "emoji_u2728", 1900 + "version": 1, 1901 + "popularity": 586, 1902 + "codepoint": "2728", 1903 + "unsupported_families": [], 1904 + "categories": [ 1905 + "Smileys and emotions" 1906 + ], 1907 + "tags": [ 1908 + ":sparkles:" 1909 + ], 1910 + "sizes_px": [] 1911 + }, 1912 + { 1913 + "name": "emoji_u26a1", 1914 + "version": 1, 1915 + "popularity": 585, 1916 + "codepoint": "26a1", 1917 + "unsupported_families": [], 1918 + "categories": [ 1919 + "Smileys and emotions" 1920 + ], 1921 + "tags": [ 1922 + ":electricity:", 1923 + ":zap:", 1924 + ":lightning:" 1925 + ], 1926 + "sizes_px": [] 1927 + }, 1928 + { 1929 + "name": "emoji_u1f4a5", 1930 + "version": 1, 1931 + "popularity": 584, 1932 + "codepoint": "1f4a5", 1933 + "unsupported_families": [], 1934 + "categories": [ 1935 + "Smileys and emotions" 1936 + ], 1937 + "tags": [ 1938 + ":collision:" 1939 + ], 1940 + "sizes_px": [] 1941 + }, 1942 + { 1943 + "name": "emoji_u1f525", 1944 + "version": 1, 1945 + "popularity": 583, 1946 + "codepoint": "1f525", 1947 + "unsupported_families": [], 1948 + "categories": [ 1949 + "Smileys and emotions" 1950 + ], 1951 + "tags": [ 1952 + ":fire:", 1953 + ":burn:", 1954 + ":lit:" 1955 + ], 1956 + "sizes_px": [] 1957 + }, 1958 + { 1959 + "name": "emoji_u1f4af", 1960 + "version": 1, 1961 + "popularity": 582, 1962 + "codepoint": "1f4af", 1963 + "unsupported_families": [], 1964 + "categories": [ 1965 + "Smileys and emotions" 1966 + ], 1967 + "tags": [ 1968 + ":100:", 1969 + ":one-hundred:", 1970 + ":hundred:", 1971 + ":points:" 1972 + ], 1973 + "sizes_px": [] 1974 + }, 1975 + { 1976 + "name": "emoji_u1f389", 1977 + "version": 1, 1978 + "popularity": 581, 1979 + "codepoint": "1f389", 1980 + "unsupported_families": [], 1981 + "categories": [ 1982 + "Smileys and emotions" 1983 + ], 1984 + "tags": [ 1985 + ":party-popper:" 1986 + ], 1987 + "sizes_px": [] 1988 + }, 1989 + { 1990 + "name": "emoji_u1f38a", 1991 + "version": 1, 1992 + "popularity": 580, 1993 + "codepoint": "1f38a", 1994 + "unsupported_families": [], 1995 + "categories": [ 1996 + "Smileys and emotions" 1997 + ], 1998 + "tags": [ 1999 + ":confetti-ball:" 2000 + ], 2001 + "sizes_px": [] 2002 + }, 2003 + { 2004 + "name": "emoji_u2764_fe0f", 2005 + "version": 1, 2006 + "popularity": 579, 2007 + "codepoint": "2764_fe0f", 2008 + "unsupported_families": [], 2009 + "categories": [ 2010 + "Smileys and emotions" 2011 + ], 2012 + "tags": [ 2013 + ":red-heart:" 2014 + ], 2015 + "sizes_px": [] 2016 + }, 2017 + { 2018 + "name": "emoji_u1f9e1", 2019 + "version": 1, 2020 + "popularity": 578, 2021 + "codepoint": "1f9e1", 2022 + "unsupported_families": [], 2023 + "categories": [ 2024 + "Smileys and emotions" 2025 + ], 2026 + "tags": [ 2027 + ":orange-heart:" 2028 + ], 2029 + "sizes_px": [] 2030 + }, 2031 + { 2032 + "name": "emoji_u1f49b", 2033 + "version": 1, 2034 + "popularity": 577, 2035 + "codepoint": "1f49b", 2036 + "unsupported_families": [], 2037 + "categories": [ 2038 + "Smileys and emotions" 2039 + ], 2040 + "tags": [ 2041 + ":yellow-heart:" 2042 + ], 2043 + "sizes_px": [] 2044 + }, 2045 + { 2046 + "name": "emoji_u1f49a", 2047 + "version": 1, 2048 + "popularity": 576, 2049 + "codepoint": "1f49a", 2050 + "unsupported_families": [], 2051 + "categories": [ 2052 + "Smileys and emotions" 2053 + ], 2054 + "tags": [ 2055 + ":green-heart:" 2056 + ], 2057 + "sizes_px": [] 2058 + }, 2059 + { 2060 + "name": "emoji_u1fa75", 2061 + "version": 1, 2062 + "popularity": 575, 2063 + "codepoint": "1fa75", 2064 + "unsupported_families": [], 2065 + "categories": [ 2066 + "Smileys and emotions" 2067 + ], 2068 + "tags": [ 2069 + ":light-blue-heart:" 2070 + ], 2071 + "sizes_px": [] 2072 + }, 2073 + { 2074 + "name": "emoji_u1f499", 2075 + "version": 1, 2076 + "popularity": 574, 2077 + "codepoint": "1f499", 2078 + "unsupported_families": [], 2079 + "categories": [ 2080 + "Smileys and emotions" 2081 + ], 2082 + "tags": [ 2083 + ":blue-heart:" 2084 + ], 2085 + "sizes_px": [] 2086 + }, 2087 + { 2088 + "name": "emoji_u1f49c", 2089 + "version": 1, 2090 + "popularity": 573, 2091 + "codepoint": "1f49c", 2092 + "unsupported_families": [], 2093 + "categories": [ 2094 + "Smileys and emotions" 2095 + ], 2096 + "tags": [ 2097 + ":purple-heart:" 2098 + ], 2099 + "sizes_px": [] 2100 + }, 2101 + { 2102 + "name": "emoji_u1f90e", 2103 + "version": 1, 2104 + "popularity": 572, 2105 + "codepoint": "1f90e", 2106 + "unsupported_families": [], 2107 + "categories": [ 2108 + "Smileys and emotions" 2109 + ], 2110 + "tags": [ 2111 + ":brown-heart:" 2112 + ], 2113 + "sizes_px": [] 2114 + }, 2115 + { 2116 + "name": "emoji_u1f5a4", 2117 + "version": 1, 2118 + "popularity": 571, 2119 + "codepoint": "1f5a4", 2120 + "unsupported_families": [], 2121 + "categories": [ 2122 + "Smileys and emotions" 2123 + ], 2124 + "tags": [ 2125 + ":black-heart:" 2126 + ], 2127 + "sizes_px": [] 2128 + }, 2129 + { 2130 + "name": "emoji_u1fa76", 2131 + "version": 1, 2132 + "popularity": 570, 2133 + "codepoint": "1fa76", 2134 + "unsupported_families": [], 2135 + "categories": [ 2136 + "Smileys and emotions" 2137 + ], 2138 + "tags": [ 2139 + ":grey-heart:" 2140 + ], 2141 + "sizes_px": [] 2142 + }, 2143 + { 2144 + "name": "emoji_u1f90d", 2145 + "version": 1, 2146 + "popularity": 569, 2147 + "codepoint": "1f90d", 2148 + "unsupported_families": [], 2149 + "categories": [ 2150 + "Smileys and emotions" 2151 + ], 2152 + "tags": [ 2153 + ":white-heart:" 2154 + ], 2155 + "sizes_px": [] 2156 + }, 2157 + { 2158 + "name": "emoji_u1fa77", 2159 + "version": 1, 2160 + "popularity": 568, 2161 + "codepoint": "1fa77", 2162 + "unsupported_families": [], 2163 + "categories": [ 2164 + "Smileys and emotions" 2165 + ], 2166 + "tags": [ 2167 + ":pink-heart:" 2168 + ], 2169 + "sizes_px": [] 2170 + }, 2171 + { 2172 + "name": "emoji_u1f498", 2173 + "version": 1, 2174 + "popularity": 567, 2175 + "codepoint": "1f498", 2176 + "unsupported_families": [], 2177 + "categories": [ 2178 + "Smileys and emotions" 2179 + ], 2180 + "tags": [ 2181 + ":cupid:" 2182 + ], 2183 + "sizes_px": [] 2184 + }, 2185 + { 2186 + "name": "emoji_u1f49d", 2187 + "version": 1, 2188 + "popularity": 566, 2189 + "codepoint": "1f49d", 2190 + "unsupported_families": [], 2191 + "categories": [ 2192 + "Smileys and emotions" 2193 + ], 2194 + "tags": [ 2195 + ":gift-heart:" 2196 + ], 2197 + "sizes_px": [] 2198 + }, 2199 + { 2200 + "name": "emoji_u1f496", 2201 + "version": 1, 2202 + "popularity": 565, 2203 + "codepoint": "1f496", 2204 + "unsupported_families": [], 2205 + "categories": [ 2206 + "Smileys and emotions" 2207 + ], 2208 + "tags": [ 2209 + ":sparkling-heart:" 2210 + ], 2211 + "sizes_px": [] 2212 + }, 2213 + { 2214 + "name": "emoji_u1f497", 2215 + "version": 1, 2216 + "popularity": 564, 2217 + "codepoint": "1f497", 2218 + "unsupported_families": [], 2219 + "categories": [ 2220 + "Smileys and emotions" 2221 + ], 2222 + "tags": [ 2223 + ":heart-grow:" 2224 + ], 2225 + "sizes_px": [] 2226 + }, 2227 + { 2228 + "name": "emoji_u1f493", 2229 + "version": 1, 2230 + "popularity": 563, 2231 + "codepoint": "1f493", 2232 + "unsupported_families": [], 2233 + "categories": [ 2234 + "Smileys and emotions" 2235 + ], 2236 + "tags": [ 2237 + ":beating-heart:" 2238 + ], 2239 + "sizes_px": [] 2240 + }, 2241 + { 2242 + "name": "emoji_u1f49e", 2243 + "version": 1, 2244 + "popularity": 562, 2245 + "codepoint": "1f49e", 2246 + "unsupported_families": [], 2247 + "categories": [ 2248 + "Smileys and emotions" 2249 + ], 2250 + "tags": [ 2251 + ":revolving-hearts:" 2252 + ], 2253 + "sizes_px": [] 2254 + }, 2255 + { 2256 + "name": "emoji_u1f495", 2257 + "version": 1, 2258 + "popularity": 561, 2259 + "codepoint": "1f495", 2260 + "unsupported_families": [], 2261 + "categories": [ 2262 + "Smileys and emotions" 2263 + ], 2264 + "tags": [ 2265 + ":two-hearts:" 2266 + ], 2267 + "sizes_px": [] 2268 + }, 2269 + { 2270 + "name": "emoji_u1f48c", 2271 + "version": 1, 2272 + "popularity": 560, 2273 + "codepoint": "1f48c", 2274 + "unsupported_families": [], 2275 + "categories": [ 2276 + "Smileys and emotions" 2277 + ], 2278 + "tags": [ 2279 + ":love-letter:" 2280 + ], 2281 + "sizes_px": [] 2282 + }, 2283 + { 2284 + "name": "emoji_u1f49f", 2285 + "version": 1, 2286 + "popularity": 559, 2287 + "codepoint": "1f49f", 2288 + "unsupported_families": [], 2289 + "categories": [ 2290 + "Smileys and emotions" 2291 + ], 2292 + "tags": [ 2293 + ":heart-box:" 2294 + ], 2295 + "sizes_px": [] 2296 + }, 2297 + { 2298 + "name": "emoji_u2763_fe0f", 2299 + "version": 1, 2300 + "popularity": 558, 2301 + "codepoint": "2763_fe0f", 2302 + "unsupported_families": [], 2303 + "categories": [ 2304 + "Smileys and emotions" 2305 + ], 2306 + "tags": [ 2307 + ":heart-exclamation-point:" 2308 + ], 2309 + "sizes_px": [] 2310 + }, 2311 + { 2312 + "name": "emoji_u2764_fe0f_200d_1fa79", 2313 + "version": 1, 2314 + "popularity": 557, 2315 + "codepoint": "2764_fe0f_200d_1fa79", 2316 + "unsupported_families": [], 2317 + "categories": [ 2318 + "Smileys and emotions" 2319 + ], 2320 + "tags": [ 2321 + ":bandaged-heart:" 2322 + ], 2323 + "sizes_px": [] 2324 + }, 2325 + { 2326 + "name": "emoji_u1f494", 2327 + "version": 1, 2328 + "popularity": 556, 2329 + "codepoint": "1f494", 2330 + "unsupported_families": [], 2331 + "categories": [ 2332 + "Smileys and emotions" 2333 + ], 2334 + "tags": [ 2335 + ":broken-heart:" 2336 + ], 2337 + "sizes_px": [] 2338 + }, 2339 + { 2340 + "name": "emoji_u2764_fe0f_200d_1f525", 2341 + "version": 1, 2342 + "popularity": 555, 2343 + "codepoint": "2764_fe0f_200d_1f525", 2344 + "unsupported_families": [], 2345 + "categories": [ 2346 + "Smileys and emotions" 2347 + ], 2348 + "tags": [ 2349 + ":fire-heart:" 2350 + ], 2351 + "sizes_px": [] 2352 + }, 2353 + { 2354 + "name": "emoji_u1f48b", 2355 + "version": 1, 2356 + "popularity": 554, 2357 + "codepoint": "1f48b", 2358 + "unsupported_families": [], 2359 + "categories": [ 2360 + "Smileys and emotions" 2361 + ], 2362 + "tags": [ 2363 + ":kiss:" 2364 + ], 2365 + "sizes_px": [] 2366 + }, 2367 + { 2368 + "name": "emoji_u1f463", 2369 + "version": 1, 2370 + "popularity": 553, 2371 + "codepoint": "1f463", 2372 + "unsupported_families": [], 2373 + "categories": [ 2374 + "Smileys and emotions" 2375 + ], 2376 + "tags": [ 2377 + ":footprints:" 2378 + ], 2379 + "sizes_px": [] 2380 + }, 2381 + { 2382 + "name": "emoji_u1fac6", 2383 + "version": 1, 2384 + "popularity": 552, 2385 + "codepoint": "1fac6", 2386 + "unsupported_families": [], 2387 + "categories": [ 2388 + "Smileys and emotions" 2389 + ], 2390 + "tags": [ 2391 + ":fingerprint:" 2392 + ], 2393 + "sizes_px": [] 2394 + }, 2395 + { 2396 + "name": "emoji_u1fac0", 2397 + "version": 1, 2398 + "popularity": 551, 2399 + "codepoint": "1fac0", 2400 + "unsupported_families": [], 2401 + "categories": [ 2402 + "Smileys and emotions" 2403 + ], 2404 + "tags": [ 2405 + ":anatomical-heart:" 2406 + ], 2407 + "sizes_px": [] 2408 + }, 2409 + { 2410 + "name": "emoji_u1fa78", 2411 + "version": 1, 2412 + "popularity": 550, 2413 + "codepoint": "1fa78", 2414 + "unsupported_families": [], 2415 + "categories": [ 2416 + "Smileys and emotions" 2417 + ], 2418 + "tags": [ 2419 + ":blood:" 2420 + ], 2421 + "sizes_px": [] 2422 + }, 2423 + { 2424 + "name": "emoji_u1f9a0", 2425 + "version": 1, 2426 + "popularity": 549, 2427 + "codepoint": "1f9a0", 2428 + "unsupported_families": [], 2429 + "categories": [ 2430 + "Smileys and emotions" 2431 + ], 2432 + "tags": [ 2433 + ":microbe:", 2434 + ":virus:" 2435 + ], 2436 + "sizes_px": [] 2437 + }, 2438 + { 2439 + "name": "emoji_u1f440", 2440 + "version": 1, 2441 + "popularity": 548, 2442 + "codepoint": "1f440", 2443 + "unsupported_families": [], 2444 + "categories": [ 2445 + "Smileys and emotions" 2446 + ], 2447 + "tags": [ 2448 + ":eyes:" 2449 + ], 2450 + "sizes_px": [] 2451 + }, 2452 + { 2453 + "name": "emoji_u1f441_fe0f", 2454 + "version": 1, 2455 + "popularity": 547, 2456 + "codepoint": "1f441_fe0f", 2457 + "unsupported_families": [], 2458 + "categories": [ 2459 + "Smileys and emotions" 2460 + ], 2461 + "tags": [ 2462 + ":eye:" 2463 + ], 2464 + "sizes_px": [] 2465 + }, 2466 + { 2467 + "name": "emoji_u1fae6", 2468 + "version": 1, 2469 + "popularity": 546, 2470 + "codepoint": "1fae6", 2471 + "unsupported_families": [], 2472 + "categories": [ 2473 + "Smileys and emotions" 2474 + ], 2475 + "tags": [ 2476 + ":biting-lip:" 2477 + ], 2478 + "sizes_px": [] 2479 + }, 2480 + { 2481 + "name": "emoji_u1f443", 2482 + "version": 1, 2483 + "popularity": 545, 2484 + "codepoint": "1f443", 2485 + "unsupported_families": [], 2486 + "categories": [ 2487 + "Smileys and emotions" 2488 + ], 2489 + "tags": [ 2490 + ":nose:" 2491 + ], 2492 + "sizes_px": [] 2493 + }, 2494 + { 2495 + "name": "emoji_u1f443_1f3fb", 2496 + "version": 1, 2497 + "popularity": 544, 2498 + "codepoint": "1f443_1f3fb", 2499 + "unsupported_families": [], 2500 + "categories": [ 2501 + "Smileys and emotions" 2502 + ], 2503 + "tags": [ 2504 + ":nose:" 2505 + ], 2506 + "sizes_px": [] 2507 + }, 2508 + { 2509 + "name": "emoji_u1f443_1f3fc", 2510 + "version": 1, 2511 + "popularity": 543, 2512 + "codepoint": "1f443_1f3fc", 2513 + "unsupported_families": [], 2514 + "categories": [ 2515 + "Smileys and emotions" 2516 + ], 2517 + "tags": [ 2518 + ":nose:" 2519 + ], 2520 + "sizes_px": [] 2521 + }, 2522 + { 2523 + "name": "emoji_u1f443_1f3fd", 2524 + "version": 1, 2525 + "popularity": 542, 2526 + "codepoint": "1f443_1f3fd", 2527 + "unsupported_families": [], 2528 + "categories": [ 2529 + "Smileys and emotions" 2530 + ], 2531 + "tags": [ 2532 + ":nose:" 2533 + ], 2534 + "sizes_px": [] 2535 + }, 2536 + { 2537 + "name": "emoji_u1f443_1f3fe", 2538 + "version": 1, 2539 + "popularity": 541, 2540 + "codepoint": "1f443_1f3fe", 2541 + "unsupported_families": [], 2542 + "categories": [ 2543 + "Smileys and emotions" 2544 + ], 2545 + "tags": [ 2546 + ":nose:" 2547 + ], 2548 + "sizes_px": [] 2549 + }, 2550 + { 2551 + "name": "emoji_u1f443_1f3ff", 2552 + "version": 1, 2553 + "popularity": 540, 2554 + "codepoint": "1f443_1f3ff", 2555 + "unsupported_families": [], 2556 + "categories": [ 2557 + "Smileys and emotions" 2558 + ], 2559 + "tags": [ 2560 + ":nose:" 2561 + ], 2562 + "sizes_px": [] 2563 + }, 2564 + { 2565 + "name": "emoji_u1f442", 2566 + "version": 1, 2567 + "popularity": 539, 2568 + "codepoint": "1f442", 2569 + "unsupported_families": [], 2570 + "categories": [ 2571 + "Smileys and emotions" 2572 + ], 2573 + "tags": [ 2574 + ":ear:" 2575 + ], 2576 + "sizes_px": [] 2577 + }, 2578 + { 2579 + "name": "emoji_u1f442_1f3fb", 2580 + "version": 1, 2581 + "popularity": 538, 2582 + "codepoint": "1f442_1f3fb", 2583 + "unsupported_families": [], 2584 + "categories": [ 2585 + "Smileys and emotions" 2586 + ], 2587 + "tags": [ 2588 + ":ear:" 2589 + ], 2590 + "sizes_px": [] 2591 + }, 2592 + { 2593 + "name": "emoji_u1f442_1f3fc", 2594 + "version": 1, 2595 + "popularity": 537, 2596 + "codepoint": "1f442_1f3fc", 2597 + "unsupported_families": [], 2598 + "categories": [ 2599 + "Smileys and emotions" 2600 + ], 2601 + "tags": [ 2602 + ":ear:" 2603 + ], 2604 + "sizes_px": [] 2605 + }, 2606 + { 2607 + "name": "emoji_u1f442_1f3fd", 2608 + "version": 1, 2609 + "popularity": 536, 2610 + "codepoint": "1f442_1f3fd", 2611 + "unsupported_families": [], 2612 + "categories": [ 2613 + "Smileys and emotions" 2614 + ], 2615 + "tags": [ 2616 + ":ear:" 2617 + ], 2618 + "sizes_px": [] 2619 + }, 2620 + { 2621 + "name": "emoji_u1f442_1f3fe", 2622 + "version": 1, 2623 + "popularity": 535, 2624 + "codepoint": "1f442_1f3fe", 2625 + "unsupported_families": [], 2626 + "categories": [ 2627 + "Smileys and emotions" 2628 + ], 2629 + "tags": [ 2630 + ":ear:" 2631 + ], 2632 + "sizes_px": [] 2633 + }, 2634 + { 2635 + "name": "emoji_u1f442_1f3ff", 2636 + "version": 1, 2637 + "popularity": 534, 2638 + "codepoint": "1f442_1f3ff", 2639 + "unsupported_families": [], 2640 + "categories": [ 2641 + "Smileys and emotions" 2642 + ], 2643 + "tags": [ 2644 + ":ear:" 2645 + ], 2646 + "sizes_px": [] 2647 + }, 2648 + { 2649 + "name": "emoji_u1f9bb", 2650 + "version": 1, 2651 + "popularity": 533, 2652 + "codepoint": "1f9bb", 2653 + "unsupported_families": [], 2654 + "categories": [ 2655 + "Smileys and emotions" 2656 + ], 2657 + "tags": [ 2658 + ":hearing-aid:" 2659 + ], 2660 + "sizes_px": [] 2661 + }, 2662 + { 2663 + "name": "emoji_u1f9bb_1f3fb", 2664 + "version": 1, 2665 + "popularity": 532, 2666 + "codepoint": "1f9bb_1f3fb", 2667 + "unsupported_families": [], 2668 + "categories": [ 2669 + "Smileys and emotions" 2670 + ], 2671 + "tags": [ 2672 + ":hearing-aid:" 2673 + ], 2674 + "sizes_px": [] 2675 + }, 2676 + { 2677 + "name": "emoji_u1f9bb_1f3fc", 2678 + "version": 1, 2679 + "popularity": 531, 2680 + "codepoint": "1f9bb_1f3fc", 2681 + "unsupported_families": [], 2682 + "categories": [ 2683 + "Smileys and emotions" 2684 + ], 2685 + "tags": [ 2686 + ":hearing-aid:" 2687 + ], 2688 + "sizes_px": [] 2689 + }, 2690 + { 2691 + "name": "emoji_u1f9bb_1f3fd", 2692 + "version": 1, 2693 + "popularity": 530, 2694 + "codepoint": "1f9bb_1f3fd", 2695 + "unsupported_families": [], 2696 + "categories": [ 2697 + "Smileys and emotions" 2698 + ], 2699 + "tags": [ 2700 + ":hearing-aid:" 2701 + ], 2702 + "sizes_px": [] 2703 + }, 2704 + { 2705 + "name": "emoji_u1f9bb_1f3fe", 2706 + "version": 1, 2707 + "popularity": 529, 2708 + "codepoint": "1f9bb_1f3fe", 2709 + "unsupported_families": [], 2710 + "categories": [ 2711 + "Smileys and emotions" 2712 + ], 2713 + "tags": [ 2714 + ":hearing-aid:" 2715 + ], 2716 + "sizes_px": [] 2717 + }, 2718 + { 2719 + "name": "emoji_u1f9bb_1f3ff", 2720 + "version": 1, 2721 + "popularity": 528, 2722 + "codepoint": "1f9bb_1f3ff", 2723 + "unsupported_families": [], 2724 + "categories": [ 2725 + "Smileys and emotions" 2726 + ], 2727 + "tags": [ 2728 + ":hearing-aid:" 2729 + ], 2730 + "sizes_px": [] 2731 + }, 2732 + { 2733 + "name": "emoji_u1f9b6", 2734 + "version": 1, 2735 + "popularity": 527, 2736 + "codepoint": "1f9b6", 2737 + "unsupported_families": [], 2738 + "categories": [ 2739 + "Smileys and emotions" 2740 + ], 2741 + "tags": [ 2742 + ":foot:" 2743 + ], 2744 + "sizes_px": [] 2745 + }, 2746 + { 2747 + "name": "emoji_u1f9b6_1f3fb", 2748 + "version": 1, 2749 + "popularity": 526, 2750 + "codepoint": "1f9b6_1f3fb", 2751 + "unsupported_families": [], 2752 + "categories": [ 2753 + "Smileys and emotions" 2754 + ], 2755 + "tags": [ 2756 + ":foot:" 2757 + ], 2758 + "sizes_px": [] 2759 + }, 2760 + { 2761 + "name": "emoji_u1f9b6_1f3fc", 2762 + "version": 1, 2763 + "popularity": 525, 2764 + "codepoint": "1f9b6_1f3fc", 2765 + "unsupported_families": [], 2766 + "categories": [ 2767 + "Smileys and emotions" 2768 + ], 2769 + "tags": [ 2770 + ":foot:" 2771 + ], 2772 + "sizes_px": [] 2773 + }, 2774 + { 2775 + "name": "emoji_u1f9b6_1f3fd", 2776 + "version": 1, 2777 + "popularity": 524, 2778 + "codepoint": "1f9b6_1f3fd", 2779 + "unsupported_families": [], 2780 + "categories": [ 2781 + "Smileys and emotions" 2782 + ], 2783 + "tags": [ 2784 + ":foot:" 2785 + ], 2786 + "sizes_px": [] 2787 + }, 2788 + { 2789 + "name": "emoji_u1f9b6_1f3fe", 2790 + "version": 1, 2791 + "popularity": 523, 2792 + "codepoint": "1f9b6_1f3fe", 2793 + "unsupported_families": [], 2794 + "categories": [ 2795 + "Smileys and emotions" 2796 + ], 2797 + "tags": [ 2798 + ":foot:" 2799 + ], 2800 + "sizes_px": [] 2801 + }, 2802 + { 2803 + "name": "emoji_u1f9b6_1f3ff", 2804 + "version": 1, 2805 + "popularity": 522, 2806 + "codepoint": "1f9b6_1f3ff", 2807 + "unsupported_families": [], 2808 + "categories": [ 2809 + "Smileys and emotions" 2810 + ], 2811 + "tags": [ 2812 + ":foot:" 2813 + ], 2814 + "sizes_px": [] 2815 + }, 2816 + { 2817 + "name": "emoji_u1f9b5", 2818 + "version": 1, 2819 + "popularity": 521, 2820 + "codepoint": "1f9b5", 2821 + "unsupported_families": [], 2822 + "categories": [ 2823 + "Smileys and emotions" 2824 + ], 2825 + "tags": [ 2826 + ":leg:" 2827 + ], 2828 + "sizes_px": [] 2829 + }, 2830 + { 2831 + "name": "emoji_u1f9b5_1f3fb", 2832 + "version": 1, 2833 + "popularity": 520, 2834 + "codepoint": "1f9b5_1f3fb", 2835 + "unsupported_families": [], 2836 + "categories": [ 2837 + "Smileys and emotions" 2838 + ], 2839 + "tags": [ 2840 + ":leg:" 2841 + ], 2842 + "sizes_px": [] 2843 + }, 2844 + { 2845 + "name": "emoji_u1f9b5_1f3fc", 2846 + "version": 1, 2847 + "popularity": 519, 2848 + "codepoint": "1f9b5_1f3fc", 2849 + "unsupported_families": [], 2850 + "categories": [ 2851 + "Smileys and emotions" 2852 + ], 2853 + "tags": [ 2854 + ":leg:" 2855 + ], 2856 + "sizes_px": [] 2857 + }, 2858 + { 2859 + "name": "emoji_u1f9b5_1f3fd", 2860 + "version": 1, 2861 + "popularity": 518, 2862 + "codepoint": "1f9b5_1f3fd", 2863 + "unsupported_families": [], 2864 + "categories": [ 2865 + "Smileys and emotions" 2866 + ], 2867 + "tags": [ 2868 + ":leg:" 2869 + ], 2870 + "sizes_px": [] 2871 + }, 2872 + { 2873 + "name": "emoji_u1f9b5_1f3fe", 2874 + "version": 1, 2875 + "popularity": 517, 2876 + "codepoint": "1f9b5_1f3fe", 2877 + "unsupported_families": [], 2878 + "categories": [ 2879 + "Smileys and emotions" 2880 + ], 2881 + "tags": [ 2882 + ":leg:" 2883 + ], 2884 + "sizes_px": [] 2885 + }, 2886 + { 2887 + "name": "emoji_u1f9b5_1f3ff", 2888 + "version": 1, 2889 + "popularity": 516, 2890 + "codepoint": "1f9b5_1f3ff", 2891 + "unsupported_families": [], 2892 + "categories": [ 2893 + "Smileys and emotions" 2894 + ], 2895 + "tags": [ 2896 + ":leg:" 2897 + ], 2898 + "sizes_px": [] 2899 + }, 2900 + { 2901 + "name": "emoji_u1f9bf", 2902 + "version": 1, 2903 + "popularity": 515, 2904 + "codepoint": "1f9bf", 2905 + "unsupported_families": [], 2906 + "categories": [ 2907 + "Smileys and emotions" 2908 + ], 2909 + "tags": [ 2910 + ":leg-mechanical:" 2911 + ], 2912 + "sizes_px": [] 2913 + }, 2914 + { 2915 + "name": "emoji_u1f9be", 2916 + "version": 1, 2917 + "popularity": 514, 2918 + "codepoint": "1f9be", 2919 + "unsupported_families": [], 2920 + "categories": [ 2921 + "Smileys and emotions" 2922 + ], 2923 + "tags": [ 2924 + ":arm-mechanical:" 2925 + ], 2926 + "sizes_px": [] 2927 + }, 2928 + { 2929 + "name": "emoji_u1f4aa", 2930 + "version": 1, 2931 + "popularity": 513, 2932 + "codepoint": "1f4aa", 2933 + "unsupported_families": [], 2934 + "categories": [ 2935 + "Smileys and emotions" 2936 + ], 2937 + "tags": [ 2938 + ":muscle:", 2939 + ":flex:", 2940 + ":bicep:", 2941 + ":strong:" 2942 + ], 2943 + "sizes_px": [] 2944 + }, 2945 + { 2946 + "name": "emoji_u1f4aa_1f3fb", 2947 + "version": 1, 2948 + "popularity": 512, 2949 + "codepoint": "1f4aa_1f3fb", 2950 + "unsupported_families": [], 2951 + "categories": [ 2952 + "Smileys and emotions" 2953 + ], 2954 + "tags": [ 2955 + ":muscle:", 2956 + ":flex:", 2957 + ":bicep:", 2958 + ":strong:" 2959 + ], 2960 + "sizes_px": [] 2961 + }, 2962 + { 2963 + "name": "emoji_u1f4aa_1f3fc", 2964 + "version": 1, 2965 + "popularity": 511, 2966 + "codepoint": "1f4aa_1f3fc", 2967 + "unsupported_families": [], 2968 + "categories": [ 2969 + "Smileys and emotions" 2970 + ], 2971 + "tags": [ 2972 + ":muscle:", 2973 + ":flex:", 2974 + ":bicep:", 2975 + ":strong:" 2976 + ], 2977 + "sizes_px": [] 2978 + }, 2979 + { 2980 + "name": "emoji_u1f4aa_1f3fd", 2981 + "version": 1, 2982 + "popularity": 510, 2983 + "codepoint": "1f4aa_1f3fd", 2984 + "unsupported_families": [], 2985 + "categories": [ 2986 + "Smileys and emotions" 2987 + ], 2988 + "tags": [ 2989 + ":muscle:", 2990 + ":flex:", 2991 + ":bicep:", 2992 + ":strong:" 2993 + ], 2994 + "sizes_px": [] 2995 + }, 2996 + { 2997 + "name": "emoji_u1f4aa_1f3fe", 2998 + "version": 1, 2999 + "popularity": 509, 3000 + "codepoint": "1f4aa_1f3fe", 3001 + "unsupported_families": [], 3002 + "categories": [ 3003 + "Smileys and emotions" 3004 + ], 3005 + "tags": [ 3006 + ":muscle:", 3007 + ":flex:", 3008 + ":bicep:", 3009 + ":strong:" 3010 + ], 3011 + "sizes_px": [] 3012 + }, 3013 + { 3014 + "name": "emoji_u1f4aa_1f3ff", 3015 + "version": 1, 3016 + "popularity": 508, 3017 + "codepoint": "1f4aa_1f3ff", 3018 + "unsupported_families": [], 3019 + "categories": [ 3020 + "Smileys and emotions" 3021 + ], 3022 + "tags": [ 3023 + ":muscle:", 3024 + ":flex:", 3025 + ":bicep:", 3026 + ":strong:" 3027 + ], 3028 + "sizes_px": [] 3029 + }, 3030 + { 3031 + "name": "emoji_u1f44f", 3032 + "version": 1, 3033 + "popularity": 507, 3034 + "codepoint": "1f44f", 3035 + "unsupported_families": [], 3036 + "categories": [ 3037 + "Smileys and emotions" 3038 + ], 3039 + "tags": [ 3040 + ":clap:" 3041 + ], 3042 + "sizes_px": [] 3043 + }, 3044 + { 3045 + "name": "emoji_u1f44f_1f3fb", 3046 + "version": 1, 3047 + "popularity": 506, 3048 + "codepoint": "1f44f_1f3fb", 3049 + "unsupported_families": [], 3050 + "categories": [ 3051 + "Smileys and emotions" 3052 + ], 3053 + "tags": [ 3054 + ":clap:" 3055 + ], 3056 + "sizes_px": [] 3057 + }, 3058 + { 3059 + "name": "emoji_u1f44f_1f3fc", 3060 + "version": 1, 3061 + "popularity": 505, 3062 + "codepoint": "1f44f_1f3fc", 3063 + "unsupported_families": [], 3064 + "categories": [ 3065 + "Smileys and emotions" 3066 + ], 3067 + "tags": [ 3068 + ":clap:" 3069 + ], 3070 + "sizes_px": [] 3071 + }, 3072 + { 3073 + "name": "emoji_u1f44f_1f3fd", 3074 + "version": 1, 3075 + "popularity": 504, 3076 + "codepoint": "1f44f_1f3fd", 3077 + "unsupported_families": [], 3078 + "categories": [ 3079 + "Smileys and emotions" 3080 + ], 3081 + "tags": [ 3082 + ":clap:" 3083 + ], 3084 + "sizes_px": [] 3085 + }, 3086 + { 3087 + "name": "emoji_u1f44f_1f3fe", 3088 + "version": 1, 3089 + "popularity": 503, 3090 + "codepoint": "1f44f_1f3fe", 3091 + "unsupported_families": [], 3092 + "categories": [ 3093 + "Smileys and emotions" 3094 + ], 3095 + "tags": [ 3096 + ":clap:" 3097 + ], 3098 + "sizes_px": [] 3099 + }, 3100 + { 3101 + "name": "emoji_u1f44f_1f3ff", 3102 + "version": 1, 3103 + "popularity": 502, 3104 + "codepoint": "1f44f_1f3ff", 3105 + "unsupported_families": [], 3106 + "categories": [ 3107 + "Smileys and emotions" 3108 + ], 3109 + "tags": [ 3110 + ":clap:" 3111 + ], 3112 + "sizes_px": [] 3113 + }, 3114 + { 3115 + "name": "emoji_u1f44d", 3116 + "version": 1, 3117 + "popularity": 501, 3118 + "codepoint": "1f44d", 3119 + "unsupported_families": [], 3120 + "categories": [ 3121 + "Smileys and emotions" 3122 + ], 3123 + "tags": [ 3124 + ":thumbs-up:", 3125 + ":+1:" 3126 + ], 3127 + "sizes_px": [] 3128 + }, 3129 + { 3130 + "name": "emoji_u1f44d_1f3fb", 3131 + "version": 1, 3132 + "popularity": 500, 3133 + "codepoint": "1f44d_1f3fb", 3134 + "unsupported_families": [], 3135 + "categories": [ 3136 + "Smileys and emotions" 3137 + ], 3138 + "tags": [ 3139 + ":thumbs-up:", 3140 + ":+1:" 3141 + ], 3142 + "sizes_px": [] 3143 + }, 3144 + { 3145 + "name": "emoji_u1f44d_1f3fc", 3146 + "version": 1, 3147 + "popularity": 499, 3148 + "codepoint": "1f44d_1f3fc", 3149 + "unsupported_families": [], 3150 + "categories": [ 3151 + "Smileys and emotions" 3152 + ], 3153 + "tags": [ 3154 + ":thumbs-up:", 3155 + ":+1:" 3156 + ], 3157 + "sizes_px": [] 3158 + }, 3159 + { 3160 + "name": "emoji_u1f44d_1f3fd", 3161 + "version": 1, 3162 + "popularity": 498, 3163 + "codepoint": "1f44d_1f3fd", 3164 + "unsupported_families": [], 3165 + "categories": [ 3166 + "Smileys and emotions" 3167 + ], 3168 + "tags": [ 3169 + ":thumbs-up:", 3170 + ":+1:" 3171 + ], 3172 + "sizes_px": [] 3173 + }, 3174 + { 3175 + "name": "emoji_u1f44d_1f3fe", 3176 + "version": 1, 3177 + "popularity": 497, 3178 + "codepoint": "1f44d_1f3fe", 3179 + "unsupported_families": [], 3180 + "categories": [ 3181 + "Smileys and emotions" 3182 + ], 3183 + "tags": [ 3184 + ":thumbs-up:", 3185 + ":+1:" 3186 + ], 3187 + "sizes_px": [] 3188 + }, 3189 + { 3190 + "name": "emoji_u1f44d_1f3ff", 3191 + "version": 1, 3192 + "popularity": 496, 3193 + "codepoint": "1f44d_1f3ff", 3194 + "unsupported_families": [], 3195 + "categories": [ 3196 + "Smileys and emotions" 3197 + ], 3198 + "tags": [ 3199 + ":thumbs-up:", 3200 + ":+1:" 3201 + ], 3202 + "sizes_px": [] 3203 + }, 3204 + { 3205 + "name": "emoji_u1f44e", 3206 + "version": 1, 3207 + "popularity": 495, 3208 + "codepoint": "1f44e", 3209 + "unsupported_families": [], 3210 + "categories": [ 3211 + "Smileys and emotions" 3212 + ], 3213 + "tags": [ 3214 + ":thumbs-down:" 3215 + ], 3216 + "sizes_px": [] 3217 + }, 3218 + { 3219 + "name": "emoji_u1f44e_1f3fb", 3220 + "version": 1, 3221 + "popularity": 494, 3222 + "codepoint": "1f44e_1f3fb", 3223 + "unsupported_families": [], 3224 + "categories": [ 3225 + "Smileys and emotions" 3226 + ], 3227 + "tags": [ 3228 + ":thumbs-down:" 3229 + ], 3230 + "sizes_px": [] 3231 + }, 3232 + { 3233 + "name": "emoji_u1f44e_1f3fc", 3234 + "version": 1, 3235 + "popularity": 493, 3236 + "codepoint": "1f44e_1f3fc", 3237 + "unsupported_families": [], 3238 + "categories": [ 3239 + "Smileys and emotions" 3240 + ], 3241 + "tags": [ 3242 + ":thumbs-down:" 3243 + ], 3244 + "sizes_px": [] 3245 + }, 3246 + { 3247 + "name": "emoji_u1f44e_1f3fd", 3248 + "version": 1, 3249 + "popularity": 492, 3250 + "codepoint": "1f44e_1f3fd", 3251 + "unsupported_families": [], 3252 + "categories": [ 3253 + "Smileys and emotions" 3254 + ], 3255 + "tags": [ 3256 + ":thumbs-down:" 3257 + ], 3258 + "sizes_px": [] 3259 + }, 3260 + { 3261 + "name": "emoji_u1f44e_1f3fe", 3262 + "version": 1, 3263 + "popularity": 491, 3264 + "codepoint": "1f44e_1f3fe", 3265 + "unsupported_families": [], 3266 + "categories": [ 3267 + "Smileys and emotions" 3268 + ], 3269 + "tags": [ 3270 + ":thumbs-down:" 3271 + ], 3272 + "sizes_px": [] 3273 + }, 3274 + { 3275 + "name": "emoji_u1f44e_1f3ff", 3276 + "version": 1, 3277 + "popularity": 490, 3278 + "codepoint": "1f44e_1f3ff", 3279 + "unsupported_families": [], 3280 + "categories": [ 3281 + "Smileys and emotions" 3282 + ], 3283 + "tags": [ 3284 + ":thumbs-down:" 3285 + ], 3286 + "sizes_px": [] 3287 + }, 3288 + { 3289 + "name": "emoji_u1faf6", 3290 + "version": 1, 3291 + "popularity": 489, 3292 + "codepoint": "1faf6", 3293 + "unsupported_families": [], 3294 + "categories": [ 3295 + "Smileys and emotions" 3296 + ], 3297 + "tags": [ 3298 + ":heart-hands:" 3299 + ], 3300 + "sizes_px": [] 3301 + }, 3302 + { 3303 + "name": "emoji_u1faf6_1f3fb", 3304 + "version": 1, 3305 + "popularity": 488, 3306 + "codepoint": "1faf6_1f3fb", 3307 + "unsupported_families": [], 3308 + "categories": [ 3309 + "Smileys and emotions" 3310 + ], 3311 + "tags": [ 3312 + ":heart-hands:" 3313 + ], 3314 + "sizes_px": [] 3315 + }, 3316 + { 3317 + "name": "emoji_u1faf6_1f3fc", 3318 + "version": 1, 3319 + "popularity": 487, 3320 + "codepoint": "1faf6_1f3fc", 3321 + "unsupported_families": [], 3322 + "categories": [ 3323 + "Smileys and emotions" 3324 + ], 3325 + "tags": [ 3326 + ":heart-hands:" 3327 + ], 3328 + "sizes_px": [] 3329 + }, 3330 + { 3331 + "name": "emoji_u1faf6_1f3fd", 3332 + "version": 1, 3333 + "popularity": 486, 3334 + "codepoint": "1faf6_1f3fd", 3335 + "unsupported_families": [], 3336 + "categories": [ 3337 + "Smileys and emotions" 3338 + ], 3339 + "tags": [ 3340 + ":heart-hands:" 3341 + ], 3342 + "sizes_px": [] 3343 + }, 3344 + { 3345 + "name": "emoji_u1faf6_1f3fe", 3346 + "version": 1, 3347 + "popularity": 485, 3348 + "codepoint": "1faf6_1f3fe", 3349 + "unsupported_families": [], 3350 + "categories": [ 3351 + "Smileys and emotions" 3352 + ], 3353 + "tags": [ 3354 + ":heart-hands:" 3355 + ], 3356 + "sizes_px": [] 3357 + }, 3358 + { 3359 + "name": "emoji_u1faf6_1f3ff", 3360 + "version": 1, 3361 + "popularity": 484, 3362 + "codepoint": "1faf6_1f3ff", 3363 + "unsupported_families": [], 3364 + "categories": [ 3365 + "Smileys and emotions" 3366 + ], 3367 + "tags": [ 3368 + ":heart-hands:" 3369 + ], 3370 + "sizes_px": [] 3371 + }, 3372 + { 3373 + "name": "emoji_u1f64c", 3374 + "version": 1, 3375 + "popularity": 483, 3376 + "codepoint": "1f64c", 3377 + "unsupported_families": [], 3378 + "categories": [ 3379 + "Smileys and emotions" 3380 + ], 3381 + "tags": [ 3382 + ":raising-hands:", 3383 + ":hooray:" 3384 + ], 3385 + "sizes_px": [] 3386 + }, 3387 + { 3388 + "name": "emoji_u1f64c_1f3fb", 3389 + "version": 1, 3390 + "popularity": 482, 3391 + "codepoint": "1f64c_1f3fb", 3392 + "unsupported_families": [], 3393 + "categories": [ 3394 + "Smileys and emotions" 3395 + ], 3396 + "tags": [ 3397 + ":raising-hands:", 3398 + ":hooray:" 3399 + ], 3400 + "sizes_px": [] 3401 + }, 3402 + { 3403 + "name": "emoji_u1f64c_1f3fc", 3404 + "version": 1, 3405 + "popularity": 481, 3406 + "codepoint": "1f64c_1f3fc", 3407 + "unsupported_families": [], 3408 + "categories": [ 3409 + "Smileys and emotions" 3410 + ], 3411 + "tags": [ 3412 + ":raising-hands:", 3413 + ":hooray:" 3414 + ], 3415 + "sizes_px": [] 3416 + }, 3417 + { 3418 + "name": "emoji_u1f64c_1f3fd", 3419 + "version": 1, 3420 + "popularity": 480, 3421 + "codepoint": "1f64c_1f3fd", 3422 + "unsupported_families": [], 3423 + "categories": [ 3424 + "Smileys and emotions" 3425 + ], 3426 + "tags": [ 3427 + ":raising-hands:", 3428 + ":hooray:" 3429 + ], 3430 + "sizes_px": [] 3431 + }, 3432 + { 3433 + "name": "emoji_u1f64c_1f3fe", 3434 + "version": 1, 3435 + "popularity": 479, 3436 + "codepoint": "1f64c_1f3fe", 3437 + "unsupported_families": [], 3438 + "categories": [ 3439 + "Smileys and emotions" 3440 + ], 3441 + "tags": [ 3442 + ":raising-hands:", 3443 + ":hooray:" 3444 + ], 3445 + "sizes_px": [] 3446 + }, 3447 + { 3448 + "name": "emoji_u1f64c_1f3ff", 3449 + "version": 1, 3450 + "popularity": 478, 3451 + "codepoint": "1f64c_1f3ff", 3452 + "unsupported_families": [], 3453 + "categories": [ 3454 + "Smileys and emotions" 3455 + ], 3456 + "tags": [ 3457 + ":raising-hands:", 3458 + ":hooray:" 3459 + ], 3460 + "sizes_px": [] 3461 + }, 3462 + { 3463 + "name": "emoji_u1f450", 3464 + "version": 1, 3465 + "popularity": 477, 3466 + "codepoint": "1f450", 3467 + "unsupported_families": [], 3468 + "categories": [ 3469 + "Smileys and emotions" 3470 + ], 3471 + "tags": [ 3472 + ":open-hands:" 3473 + ], 3474 + "sizes_px": [] 3475 + }, 3476 + { 3477 + "name": "emoji_u1f450_1f3fb", 3478 + "version": 1, 3479 + "popularity": 476, 3480 + "codepoint": "1f450_1f3fb", 3481 + "unsupported_families": [], 3482 + "categories": [ 3483 + "Smileys and emotions" 3484 + ], 3485 + "tags": [ 3486 + ":open-hands:" 3487 + ], 3488 + "sizes_px": [] 3489 + }, 3490 + { 3491 + "name": "emoji_u1f450_1f3fc", 3492 + "version": 1, 3493 + "popularity": 475, 3494 + "codepoint": "1f450_1f3fc", 3495 + "unsupported_families": [], 3496 + "categories": [ 3497 + "Smileys and emotions" 3498 + ], 3499 + "tags": [ 3500 + ":open-hands:" 3501 + ], 3502 + "sizes_px": [] 3503 + }, 3504 + { 3505 + "name": "emoji_u1f450_1f3fd", 3506 + "version": 1, 3507 + "popularity": 474, 3508 + "codepoint": "1f450_1f3fd", 3509 + "unsupported_families": [], 3510 + "categories": [ 3511 + "Smileys and emotions" 3512 + ], 3513 + "tags": [ 3514 + ":open-hands:" 3515 + ], 3516 + "sizes_px": [] 3517 + }, 3518 + { 3519 + "name": "emoji_u1f450_1f3fe", 3520 + "version": 1, 3521 + "popularity": 473, 3522 + "codepoint": "1f450_1f3fe", 3523 + "unsupported_families": [], 3524 + "categories": [ 3525 + "Smileys and emotions" 3526 + ], 3527 + "tags": [ 3528 + ":open-hands:" 3529 + ], 3530 + "sizes_px": [] 3531 + }, 3532 + { 3533 + "name": "emoji_u1f450_1f3ff", 3534 + "version": 1, 3535 + "popularity": 472, 3536 + "codepoint": "1f450_1f3ff", 3537 + "unsupported_families": [], 3538 + "categories": [ 3539 + "Smileys and emotions" 3540 + ], 3541 + "tags": [ 3542 + ":open-hands:" 3543 + ], 3544 + "sizes_px": [] 3545 + }, 3546 + { 3547 + "name": "emoji_u1f932", 3548 + "version": 1, 3549 + "popularity": 471, 3550 + "codepoint": "1f932", 3551 + "unsupported_families": [], 3552 + "categories": [ 3553 + "Smileys and emotions" 3554 + ], 3555 + "tags": [ 3556 + ":palms-up:" 3557 + ], 3558 + "sizes_px": [] 3559 + }, 3560 + { 3561 + "name": "emoji_u1f932_1f3fb", 3562 + "version": 1, 3563 + "popularity": 470, 3564 + "codepoint": "1f932_1f3fb", 3565 + "unsupported_families": [], 3566 + "categories": [ 3567 + "Smileys and emotions" 3568 + ], 3569 + "tags": [ 3570 + ":palms-up:" 3571 + ], 3572 + "sizes_px": [] 3573 + }, 3574 + { 3575 + "name": "emoji_u1f932_1f3fc", 3576 + "version": 1, 3577 + "popularity": 469, 3578 + "codepoint": "1f932_1f3fc", 3579 + "unsupported_families": [], 3580 + "categories": [ 3581 + "Smileys and emotions" 3582 + ], 3583 + "tags": [ 3584 + ":palms-up:" 3585 + ], 3586 + "sizes_px": [] 3587 + }, 3588 + { 3589 + "name": "emoji_u1f932_1f3fd", 3590 + "version": 1, 3591 + "popularity": 468, 3592 + "codepoint": "1f932_1f3fd", 3593 + "unsupported_families": [], 3594 + "categories": [ 3595 + "Smileys and emotions" 3596 + ], 3597 + "tags": [ 3598 + ":palms-up:" 3599 + ], 3600 + "sizes_px": [] 3601 + }, 3602 + { 3603 + "name": "emoji_u1f932_1f3fe", 3604 + "version": 1, 3605 + "popularity": 467, 3606 + "codepoint": "1f932_1f3fe", 3607 + "unsupported_families": [], 3608 + "categories": [ 3609 + "Smileys and emotions" 3610 + ], 3611 + "tags": [ 3612 + ":palms-up:" 3613 + ], 3614 + "sizes_px": [] 3615 + }, 3616 + { 3617 + "name": "emoji_u1f932_1f3ff", 3618 + "version": 1, 3619 + "popularity": 466, 3620 + "codepoint": "1f932_1f3ff", 3621 + "unsupported_families": [], 3622 + "categories": [ 3623 + "Smileys and emotions" 3624 + ], 3625 + "tags": [ 3626 + ":palms-up:" 3627 + ], 3628 + "sizes_px": [] 3629 + }, 3630 + { 3631 + "name": "emoji_u1f91c", 3632 + "version": 1, 3633 + "popularity": 465, 3634 + "codepoint": "1f91c", 3635 + "unsupported_families": [], 3636 + "categories": [ 3637 + "Smileys and emotions" 3638 + ], 3639 + "tags": [ 3640 + ":fist-rightwards:" 3641 + ], 3642 + "sizes_px": [] 3643 + }, 3644 + { 3645 + "name": "emoji_u1f91c_1f3fb", 3646 + "version": 1, 3647 + "popularity": 464, 3648 + "codepoint": "1f91c_1f3fb", 3649 + "unsupported_families": [], 3650 + "categories": [ 3651 + "Smileys and emotions" 3652 + ], 3653 + "tags": [ 3654 + ":fist-rightwards:" 3655 + ], 3656 + "sizes_px": [] 3657 + }, 3658 + { 3659 + "name": "emoji_u1f91c_1f3fc", 3660 + "version": 1, 3661 + "popularity": 463, 3662 + "codepoint": "1f91c_1f3fc", 3663 + "unsupported_families": [], 3664 + "categories": [ 3665 + "Smileys and emotions" 3666 + ], 3667 + "tags": [ 3668 + ":fist-rightwards:" 3669 + ], 3670 + "sizes_px": [] 3671 + }, 3672 + { 3673 + "name": "emoji_u1f91c_1f3fd", 3674 + "version": 1, 3675 + "popularity": 462, 3676 + "codepoint": "1f91c_1f3fd", 3677 + "unsupported_families": [], 3678 + "categories": [ 3679 + "Smileys and emotions" 3680 + ], 3681 + "tags": [ 3682 + ":fist-rightwards:" 3683 + ], 3684 + "sizes_px": [] 3685 + }, 3686 + { 3687 + "name": "emoji_u1f91c_1f3fe", 3688 + "version": 1, 3689 + "popularity": 461, 3690 + "codepoint": "1f91c_1f3fe", 3691 + "unsupported_families": [], 3692 + "categories": [ 3693 + "Smileys and emotions" 3694 + ], 3695 + "tags": [ 3696 + ":fist-rightwards:" 3697 + ], 3698 + "sizes_px": [] 3699 + }, 3700 + { 3701 + "name": "emoji_u1f91c_1f3ff", 3702 + "version": 1, 3703 + "popularity": 460, 3704 + "codepoint": "1f91c_1f3ff", 3705 + "unsupported_families": [], 3706 + "categories": [ 3707 + "Smileys and emotions" 3708 + ], 3709 + "tags": [ 3710 + ":fist-rightwards:" 3711 + ], 3712 + "sizes_px": [] 3713 + }, 3714 + { 3715 + "name": "emoji_u1f91b", 3716 + "version": 1, 3717 + "popularity": 459, 3718 + "codepoint": "1f91b", 3719 + "unsupported_families": [], 3720 + "categories": [ 3721 + "Smileys and emotions" 3722 + ], 3723 + "tags": [ 3724 + ":fist-leftwards:" 3725 + ], 3726 + "sizes_px": [] 3727 + }, 3728 + { 3729 + "name": "emoji_u1f91b_1f3fb", 3730 + "version": 1, 3731 + "popularity": 458, 3732 + "codepoint": "1f91b_1f3fb", 3733 + "unsupported_families": [], 3734 + "categories": [ 3735 + "Smileys and emotions" 3736 + ], 3737 + "tags": [ 3738 + ":fist-leftwards:" 3739 + ], 3740 + "sizes_px": [] 3741 + }, 3742 + { 3743 + "name": "emoji_u1f91b_1f3fc", 3744 + "version": 1, 3745 + "popularity": 457, 3746 + "codepoint": "1f91b_1f3fc", 3747 + "unsupported_families": [], 3748 + "categories": [ 3749 + "Smileys and emotions" 3750 + ], 3751 + "tags": [ 3752 + ":fist-leftwards:" 3753 + ], 3754 + "sizes_px": [] 3755 + }, 3756 + { 3757 + "name": "emoji_u1f91b_1f3fd", 3758 + "version": 1, 3759 + "popularity": 456, 3760 + "codepoint": "1f91b_1f3fd", 3761 + "unsupported_families": [], 3762 + "categories": [ 3763 + "Smileys and emotions" 3764 + ], 3765 + "tags": [ 3766 + ":fist-leftwards:" 3767 + ], 3768 + "sizes_px": [] 3769 + }, 3770 + { 3771 + "name": "emoji_u1f91b_1f3fe", 3772 + "version": 1, 3773 + "popularity": 455, 3774 + "codepoint": "1f91b_1f3fe", 3775 + "unsupported_families": [], 3776 + "categories": [ 3777 + "Smileys and emotions" 3778 + ], 3779 + "tags": [ 3780 + ":fist-leftwards:" 3781 + ], 3782 + "sizes_px": [] 3783 + }, 3784 + { 3785 + "name": "emoji_u1f91b_1f3ff", 3786 + "version": 1, 3787 + "popularity": 454, 3788 + "codepoint": "1f91b_1f3ff", 3789 + "unsupported_families": [], 3790 + "categories": [ 3791 + "Smileys and emotions" 3792 + ], 3793 + "tags": [ 3794 + ":fist-leftwards:" 3795 + ], 3796 + "sizes_px": [] 3797 + }, 3798 + { 3799 + "name": "emoji_u270a", 3800 + "version": 1, 3801 + "popularity": 453, 3802 + "codepoint": "270a", 3803 + "unsupported_families": [], 3804 + "categories": [ 3805 + "Smileys and emotions" 3806 + ], 3807 + "tags": [ 3808 + ":raised-fist:" 3809 + ], 3810 + "sizes_px": [] 3811 + }, 3812 + { 3813 + "name": "emoji_u270a_1f3fb", 3814 + "version": 1, 3815 + "popularity": 452, 3816 + "codepoint": "270a_1f3fb", 3817 + "unsupported_families": [], 3818 + "categories": [ 3819 + "Smileys and emotions" 3820 + ], 3821 + "tags": [ 3822 + ":raised-fist:" 3823 + ], 3824 + "sizes_px": [] 3825 + }, 3826 + { 3827 + "name": "emoji_u270a_1f3fc", 3828 + "version": 1, 3829 + "popularity": 451, 3830 + "codepoint": "270a_1f3fc", 3831 + "unsupported_families": [], 3832 + "categories": [ 3833 + "Smileys and emotions" 3834 + ], 3835 + "tags": [ 3836 + ":raised-fist:" 3837 + ], 3838 + "sizes_px": [] 3839 + }, 3840 + { 3841 + "name": "emoji_u270a_1f3fd", 3842 + "version": 1, 3843 + "popularity": 450, 3844 + "codepoint": "270a_1f3fd", 3845 + "unsupported_families": [], 3846 + "categories": [ 3847 + "Smileys and emotions" 3848 + ], 3849 + "tags": [ 3850 + ":raised-fist:" 3851 + ], 3852 + "sizes_px": [] 3853 + }, 3854 + { 3855 + "name": "emoji_u270a_1f3fe", 3856 + "version": 1, 3857 + "popularity": 449, 3858 + "codepoint": "270a_1f3fe", 3859 + "unsupported_families": [], 3860 + "categories": [ 3861 + "Smileys and emotions" 3862 + ], 3863 + "tags": [ 3864 + ":raised-fist:" 3865 + ], 3866 + "sizes_px": [] 3867 + }, 3868 + { 3869 + "name": "emoji_u270a_1f3ff", 3870 + "version": 1, 3871 + "popularity": 448, 3872 + "codepoint": "270a_1f3ff", 3873 + "unsupported_families": [], 3874 + "categories": [ 3875 + "Smileys and emotions" 3876 + ], 3877 + "tags": [ 3878 + ":raised-fist:" 3879 + ], 3880 + "sizes_px": [] 3881 + }, 3882 + { 3883 + "name": "emoji_u1f44a", 3884 + "version": 1, 3885 + "popularity": 447, 3886 + "codepoint": "1f44a", 3887 + "unsupported_families": [], 3888 + "categories": [ 3889 + "Smileys and emotions" 3890 + ], 3891 + "tags": [ 3892 + ":fist:", 3893 + ":bump:" 3894 + ], 3895 + "sizes_px": [] 3896 + }, 3897 + { 3898 + "name": "emoji_u1f44a_1f3fb", 3899 + "version": 1, 3900 + "popularity": 446, 3901 + "codepoint": "1f44a_1f3fb", 3902 + "unsupported_families": [], 3903 + "categories": [ 3904 + "Smileys and emotions" 3905 + ], 3906 + "tags": [ 3907 + ":fist:", 3908 + ":bump:" 3909 + ], 3910 + "sizes_px": [] 3911 + }, 3912 + { 3913 + "name": "emoji_u1f44a_1f3fc", 3914 + "version": 1, 3915 + "popularity": 445, 3916 + "codepoint": "1f44a_1f3fc", 3917 + "unsupported_families": [], 3918 + "categories": [ 3919 + "Smileys and emotions" 3920 + ], 3921 + "tags": [ 3922 + ":fist:", 3923 + ":bump:" 3924 + ], 3925 + "sizes_px": [] 3926 + }, 3927 + { 3928 + "name": "emoji_u1f44a_1f3fd", 3929 + "version": 1, 3930 + "popularity": 444, 3931 + "codepoint": "1f44a_1f3fd", 3932 + "unsupported_families": [], 3933 + "categories": [ 3934 + "Smileys and emotions" 3935 + ], 3936 + "tags": [ 3937 + ":fist:", 3938 + ":bump:" 3939 + ], 3940 + "sizes_px": [] 3941 + }, 3942 + { 3943 + "name": "emoji_u1f44a_1f3fe", 3944 + "version": 1, 3945 + "popularity": 443, 3946 + "codepoint": "1f44a_1f3fe", 3947 + "unsupported_families": [], 3948 + "categories": [ 3949 + "Smileys and emotions" 3950 + ], 3951 + "tags": [ 3952 + ":fist:", 3953 + ":bump:" 3954 + ], 3955 + "sizes_px": [] 3956 + }, 3957 + { 3958 + "name": "emoji_u1f44a_1f3ff", 3959 + "version": 1, 3960 + "popularity": 442, 3961 + "codepoint": "1f44a_1f3ff", 3962 + "unsupported_families": [], 3963 + "categories": [ 3964 + "Smileys and emotions" 3965 + ], 3966 + "tags": [ 3967 + ":fist:", 3968 + ":bump:" 3969 + ], 3970 + "sizes_px": [] 3971 + }, 3972 + { 3973 + "name": "emoji_u1faf3", 3974 + "version": 1, 3975 + "popularity": 441, 3976 + "codepoint": "1faf3", 3977 + "unsupported_families": [], 3978 + "categories": [ 3979 + "Smileys and emotions" 3980 + ], 3981 + "tags": [ 3982 + ":palm-down:", 3983 + ":drop:" 3984 + ], 3985 + "sizes_px": [] 3986 + }, 3987 + { 3988 + "name": "emoji_u1faf3_1f3fb", 3989 + "version": 1, 3990 + "popularity": 440, 3991 + "codepoint": "1faf3_1f3fb", 3992 + "unsupported_families": [], 3993 + "categories": [ 3994 + "Smileys and emotions" 3995 + ], 3996 + "tags": [ 3997 + ":palm-down:", 3998 + ":drop:" 3999 + ], 4000 + "sizes_px": [] 4001 + }, 4002 + { 4003 + "name": "emoji_u1faf3_1f3fc", 4004 + "version": 1, 4005 + "popularity": 439, 4006 + "codepoint": "1faf3_1f3fc", 4007 + "unsupported_families": [], 4008 + "categories": [ 4009 + "Smileys and emotions" 4010 + ], 4011 + "tags": [ 4012 + ":palm-down:", 4013 + ":drop:" 4014 + ], 4015 + "sizes_px": [] 4016 + }, 4017 + { 4018 + "name": "emoji_u1faf3_1f3fd", 4019 + "version": 1, 4020 + "popularity": 438, 4021 + "codepoint": "1faf3_1f3fd", 4022 + "unsupported_families": [], 4023 + "categories": [ 4024 + "Smileys and emotions" 4025 + ], 4026 + "tags": [ 4027 + ":palm-down:", 4028 + ":drop:" 4029 + ], 4030 + "sizes_px": [] 4031 + }, 4032 + { 4033 + "name": "emoji_u1faf3_1f3fe", 4034 + "version": 1, 4035 + "popularity": 437, 4036 + "codepoint": "1faf3_1f3fe", 4037 + "unsupported_families": [], 4038 + "categories": [ 4039 + "Smileys and emotions" 4040 + ], 4041 + "tags": [ 4042 + ":palm-down:", 4043 + ":drop:" 4044 + ], 4045 + "sizes_px": [] 4046 + }, 4047 + { 4048 + "name": "emoji_u1faf3_1f3ff", 4049 + "version": 1, 4050 + "popularity": 436, 4051 + "codepoint": "1faf3_1f3ff", 4052 + "unsupported_families": [], 4053 + "categories": [ 4054 + "Smileys and emotions" 4055 + ], 4056 + "tags": [ 4057 + ":palm-down:", 4058 + ":drop:" 4059 + ], 4060 + "sizes_px": [] 4061 + }, 4062 + { 4063 + "name": "emoji_u1faf4", 4064 + "version": 1, 4065 + "popularity": 435, 4066 + "codepoint": "1faf4", 4067 + "unsupported_families": [], 4068 + "categories": [ 4069 + "Smileys and emotions" 4070 + ], 4071 + "tags": [ 4072 + ":palm-up:", 4073 + ":throw:" 4074 + ], 4075 + "sizes_px": [] 4076 + }, 4077 + { 4078 + "name": "emoji_u1faf4_1f3fb", 4079 + "version": 1, 4080 + "popularity": 434, 4081 + "codepoint": "1faf4_1f3fb", 4082 + "unsupported_families": [], 4083 + "categories": [ 4084 + "Smileys and emotions" 4085 + ], 4086 + "tags": [ 4087 + ":palm-up:", 4088 + ":throw:" 4089 + ], 4090 + "sizes_px": [] 4091 + }, 4092 + { 4093 + "name": "emoji_u1faf4_1f3fc", 4094 + "version": 1, 4095 + "popularity": 433, 4096 + "codepoint": "1faf4_1f3fc", 4097 + "unsupported_families": [], 4098 + "categories": [ 4099 + "Smileys and emotions" 4100 + ], 4101 + "tags": [ 4102 + ":palm-up:", 4103 + ":throw:" 4104 + ], 4105 + "sizes_px": [] 4106 + }, 4107 + { 4108 + "name": "emoji_u1faf4_1f3fd", 4109 + "version": 1, 4110 + "popularity": 432, 4111 + "codepoint": "1faf4_1f3fd", 4112 + "unsupported_families": [], 4113 + "categories": [ 4114 + "Smileys and emotions" 4115 + ], 4116 + "tags": [ 4117 + ":palm-up:", 4118 + ":throw:" 4119 + ], 4120 + "sizes_px": [] 4121 + }, 4122 + { 4123 + "name": "emoji_u1faf4_1f3fe", 4124 + "version": 1, 4125 + "popularity": 431, 4126 + "codepoint": "1faf4_1f3fe", 4127 + "unsupported_families": [], 4128 + "categories": [ 4129 + "Smileys and emotions" 4130 + ], 4131 + "tags": [ 4132 + ":palm-up:", 4133 + ":throw:" 4134 + ], 4135 + "sizes_px": [] 4136 + }, 4137 + { 4138 + "name": "emoji_u1faf4_1f3ff", 4139 + "version": 1, 4140 + "popularity": 430, 4141 + "codepoint": "1faf4_1f3ff", 4142 + "unsupported_families": [], 4143 + "categories": [ 4144 + "Smileys and emotions" 4145 + ], 4146 + "tags": [ 4147 + ":palm-up:", 4148 + ":throw:" 4149 + ], 4150 + "sizes_px": [] 4151 + }, 4152 + { 4153 + "name": "emoji_u1faf1", 4154 + "version": 1, 4155 + "popularity": 429, 4156 + "codepoint": "1faf1", 4157 + "unsupported_families": [], 4158 + "categories": [ 4159 + "Smileys and emotions" 4160 + ], 4161 + "tags": [ 4162 + ":rightwards-hand:" 4163 + ], 4164 + "sizes_px": [] 4165 + }, 4166 + { 4167 + "name": "emoji_u1faf1_1f3fb", 4168 + "version": 1, 4169 + "popularity": 428, 4170 + "codepoint": "1faf1_1f3fb", 4171 + "unsupported_families": [], 4172 + "categories": [ 4173 + "Smileys and emotions" 4174 + ], 4175 + "tags": [ 4176 + ":rightwards-hand:" 4177 + ], 4178 + "sizes_px": [] 4179 + }, 4180 + { 4181 + "name": "emoji_u1faf1_1f3fc", 4182 + "version": 1, 4183 + "popularity": 427, 4184 + "codepoint": "1faf1_1f3fc", 4185 + "unsupported_families": [], 4186 + "categories": [ 4187 + "Smileys and emotions" 4188 + ], 4189 + "tags": [ 4190 + ":rightwards-hand:" 4191 + ], 4192 + "sizes_px": [] 4193 + }, 4194 + { 4195 + "name": "emoji_u1faf1_1f3fd", 4196 + "version": 1, 4197 + "popularity": 426, 4198 + "codepoint": "1faf1_1f3fd", 4199 + "unsupported_families": [], 4200 + "categories": [ 4201 + "Smileys and emotions" 4202 + ], 4203 + "tags": [ 4204 + ":rightwards-hand:" 4205 + ], 4206 + "sizes_px": [] 4207 + }, 4208 + { 4209 + "name": "emoji_u1faf1_1f3fe", 4210 + "version": 1, 4211 + "popularity": 425, 4212 + "codepoint": "1faf1_1f3fe", 4213 + "unsupported_families": [], 4214 + "categories": [ 4215 + "Smileys and emotions" 4216 + ], 4217 + "tags": [ 4218 + ":rightwards-hand:" 4219 + ], 4220 + "sizes_px": [] 4221 + }, 4222 + { 4223 + "name": "emoji_u1faf1_1f3ff", 4224 + "version": 1, 4225 + "popularity": 424, 4226 + "codepoint": "1faf1_1f3ff", 4227 + "unsupported_families": [], 4228 + "categories": [ 4229 + "Smileys and emotions" 4230 + ], 4231 + "tags": [ 4232 + ":rightwards-hand:" 4233 + ], 4234 + "sizes_px": [] 4235 + }, 4236 + { 4237 + "name": "emoji_u1faf2", 4238 + "version": 1, 4239 + "popularity": 423, 4240 + "codepoint": "1faf2", 4241 + "unsupported_families": [], 4242 + "categories": [ 4243 + "Smileys and emotions" 4244 + ], 4245 + "tags": [ 4246 + ":leftwards-hand:" 4247 + ], 4248 + "sizes_px": [] 4249 + }, 4250 + { 4251 + "name": "emoji_u1faf2_1f3fb", 4252 + "version": 1, 4253 + "popularity": 422, 4254 + "codepoint": "1faf2_1f3fb", 4255 + "unsupported_families": [], 4256 + "categories": [ 4257 + "Smileys and emotions" 4258 + ], 4259 + "tags": [ 4260 + ":leftwards-hand:" 4261 + ], 4262 + "sizes_px": [] 4263 + }, 4264 + { 4265 + "name": "emoji_u1faf2_1f3fc", 4266 + "version": 1, 4267 + "popularity": 421, 4268 + "codepoint": "1faf2_1f3fc", 4269 + "unsupported_families": [], 4270 + "categories": [ 4271 + "Smileys and emotions" 4272 + ], 4273 + "tags": [ 4274 + ":leftwards-hand:" 4275 + ], 4276 + "sizes_px": [] 4277 + }, 4278 + { 4279 + "name": "emoji_u1faf2_1f3fd", 4280 + "version": 1, 4281 + "popularity": 420, 4282 + "codepoint": "1faf2_1f3fd", 4283 + "unsupported_families": [], 4284 + "categories": [ 4285 + "Smileys and emotions" 4286 + ], 4287 + "tags": [ 4288 + ":leftwards-hand:" 4289 + ], 4290 + "sizes_px": [] 4291 + }, 4292 + { 4293 + "name": "emoji_u1faf2_1f3fe", 4294 + "version": 1, 4295 + "popularity": 419, 4296 + "codepoint": "1faf2_1f3fe", 4297 + "unsupported_families": [], 4298 + "categories": [ 4299 + "Smileys and emotions" 4300 + ], 4301 + "tags": [ 4302 + ":leftwards-hand:" 4303 + ], 4304 + "sizes_px": [] 4305 + }, 4306 + { 4307 + "name": "emoji_u1faf2_1f3ff", 4308 + "version": 1, 4309 + "popularity": 418, 4310 + "codepoint": "1faf2_1f3ff", 4311 + "unsupported_families": [], 4312 + "categories": [ 4313 + "Smileys and emotions" 4314 + ], 4315 + "tags": [ 4316 + ":leftwards-hand:" 4317 + ], 4318 + "sizes_px": [] 4319 + }, 4320 + { 4321 + "name": "emoji_u1faf8", 4322 + "version": 1, 4323 + "popularity": 417, 4324 + "codepoint": "1faf8", 4325 + "unsupported_families": [], 4326 + "categories": [ 4327 + "Smileys and emotions" 4328 + ], 4329 + "tags": [ 4330 + ":push-rightwards:" 4331 + ], 4332 + "sizes_px": [] 4333 + }, 4334 + { 4335 + "name": "emoji_u1faf8_1f3fb", 4336 + "version": 1, 4337 + "popularity": 416, 4338 + "codepoint": "1faf8_1f3fb", 4339 + "unsupported_families": [], 4340 + "categories": [ 4341 + "Smileys and emotions" 4342 + ], 4343 + "tags": [ 4344 + ":push-rightwards:" 4345 + ], 4346 + "sizes_px": [] 4347 + }, 4348 + { 4349 + "name": "emoji_u1faf8_1f3fc", 4350 + "version": 1, 4351 + "popularity": 415, 4352 + "codepoint": "1faf8_1f3fc", 4353 + "unsupported_families": [], 4354 + "categories": [ 4355 + "Smileys and emotions" 4356 + ], 4357 + "tags": [ 4358 + ":push-rightwards:" 4359 + ], 4360 + "sizes_px": [] 4361 + }, 4362 + { 4363 + "name": "emoji_u1faf8_1f3fd", 4364 + "version": 1, 4365 + "popularity": 414, 4366 + "codepoint": "1faf8_1f3fd", 4367 + "unsupported_families": [], 4368 + "categories": [ 4369 + "Smileys and emotions" 4370 + ], 4371 + "tags": [ 4372 + ":push-rightwards:" 4373 + ], 4374 + "sizes_px": [] 4375 + }, 4376 + { 4377 + "name": "emoji_u1faf8_1f3fe", 4378 + "version": 1, 4379 + "popularity": 413, 4380 + "codepoint": "1faf8_1f3fe", 4381 + "unsupported_families": [], 4382 + "categories": [ 4383 + "Smileys and emotions" 4384 + ], 4385 + "tags": [ 4386 + ":push-rightwards:" 4387 + ], 4388 + "sizes_px": [] 4389 + }, 4390 + { 4391 + "name": "emoji_u1faf8_1f3ff", 4392 + "version": 1, 4393 + "popularity": 412, 4394 + "codepoint": "1faf8_1f3ff", 4395 + "unsupported_families": [], 4396 + "categories": [ 4397 + "Smileys and emotions" 4398 + ], 4399 + "tags": [ 4400 + ":push-rightwards:" 4401 + ], 4402 + "sizes_px": [] 4403 + }, 4404 + { 4405 + "name": "emoji_u1faf7", 4406 + "version": 1, 4407 + "popularity": 411, 4408 + "codepoint": "1faf7", 4409 + "unsupported_families": [], 4410 + "categories": [ 4411 + "Smileys and emotions" 4412 + ], 4413 + "tags": [ 4414 + ":push-leftwards:" 4415 + ], 4416 + "sizes_px": [] 4417 + }, 4418 + { 4419 + "name": "emoji_u1faf7_1f3fb", 4420 + "version": 1, 4421 + "popularity": 410, 4422 + "codepoint": "1faf7_1f3fb", 4423 + "unsupported_families": [], 4424 + "categories": [ 4425 + "Smileys and emotions" 4426 + ], 4427 + "tags": [ 4428 + ":push-leftwards:" 4429 + ], 4430 + "sizes_px": [] 4431 + }, 4432 + { 4433 + "name": "emoji_u1faf7_1f3fc", 4434 + "version": 1, 4435 + "popularity": 409, 4436 + "codepoint": "1faf7_1f3fc", 4437 + "unsupported_families": [], 4438 + "categories": [ 4439 + "Smileys and emotions" 4440 + ], 4441 + "tags": [ 4442 + ":push-leftwards:" 4443 + ], 4444 + "sizes_px": [] 4445 + }, 4446 + { 4447 + "name": "emoji_u1faf7_1f3fd", 4448 + "version": 1, 4449 + "popularity": 408, 4450 + "codepoint": "1faf7_1f3fd", 4451 + "unsupported_families": [], 4452 + "categories": [ 4453 + "Smileys and emotions" 4454 + ], 4455 + "tags": [ 4456 + ":push-leftwards:" 4457 + ], 4458 + "sizes_px": [] 4459 + }, 4460 + { 4461 + "name": "emoji_u1faf7_1f3fe", 4462 + "version": 1, 4463 + "popularity": 407, 4464 + "codepoint": "1faf7_1f3fe", 4465 + "unsupported_families": [], 4466 + "categories": [ 4467 + "Smileys and emotions" 4468 + ], 4469 + "tags": [ 4470 + ":push-leftwards:" 4471 + ], 4472 + "sizes_px": [] 4473 + }, 4474 + { 4475 + "name": "emoji_u1faf7_1f3ff", 4476 + "version": 1, 4477 + "popularity": 406, 4478 + "codepoint": "1faf7_1f3ff", 4479 + "unsupported_families": [], 4480 + "categories": [ 4481 + "Smileys and emotions" 4482 + ], 4483 + "tags": [ 4484 + ":push-leftwards:" 4485 + ], 4486 + "sizes_px": [] 4487 + }, 4488 + { 4489 + "name": "emoji_u1f44b", 4490 + "version": 1, 4491 + "popularity": 405, 4492 + "codepoint": "1f44b", 4493 + "unsupported_families": [], 4494 + "categories": [ 4495 + "Smileys and emotions" 4496 + ], 4497 + "tags": [ 4498 + ":wave:" 4499 + ], 4500 + "sizes_px": [] 4501 + }, 4502 + { 4503 + "name": "emoji_u1f44b_1f3fb", 4504 + "version": 1, 4505 + "popularity": 404, 4506 + "codepoint": "1f44b_1f3fb", 4507 + "unsupported_families": [], 4508 + "categories": [ 4509 + "Smileys and emotions" 4510 + ], 4511 + "tags": [ 4512 + ":wave:" 4513 + ], 4514 + "sizes_px": [] 4515 + }, 4516 + { 4517 + "name": "emoji_u1f44b_1f3fc", 4518 + "version": 1, 4519 + "popularity": 403, 4520 + "codepoint": "1f44b_1f3fc", 4521 + "unsupported_families": [], 4522 + "categories": [ 4523 + "Smileys and emotions" 4524 + ], 4525 + "tags": [ 4526 + ":wave:" 4527 + ], 4528 + "sizes_px": [] 4529 + }, 4530 + { 4531 + "name": "emoji_u1f44b_1f3fd", 4532 + "version": 1, 4533 + "popularity": 402, 4534 + "codepoint": "1f44b_1f3fd", 4535 + "unsupported_families": [], 4536 + "categories": [ 4537 + "Smileys and emotions" 4538 + ], 4539 + "tags": [ 4540 + ":wave:" 4541 + ], 4542 + "sizes_px": [] 4543 + }, 4544 + { 4545 + "name": "emoji_u1f44b_1f3fe", 4546 + "version": 1, 4547 + "popularity": 401, 4548 + "codepoint": "1f44b_1f3fe", 4549 + "unsupported_families": [], 4550 + "categories": [ 4551 + "Smileys and emotions" 4552 + ], 4553 + "tags": [ 4554 + ":wave:" 4555 + ], 4556 + "sizes_px": [] 4557 + }, 4558 + { 4559 + "name": "emoji_u1f44b_1f3ff", 4560 + "version": 1, 4561 + "popularity": 400, 4562 + "codepoint": "1f44b_1f3ff", 4563 + "unsupported_families": [], 4564 + "categories": [ 4565 + "Smileys and emotions" 4566 + ], 4567 + "tags": [ 4568 + ":wave:" 4569 + ], 4570 + "sizes_px": [] 4571 + }, 4572 + { 4573 + "name": "emoji_u1f91a", 4574 + "version": 1, 4575 + "popularity": 399, 4576 + "codepoint": "1f91a", 4577 + "unsupported_families": [], 4578 + "categories": [ 4579 + "Smileys and emotions" 4580 + ], 4581 + "tags": [ 4582 + ":back-hand:" 4583 + ], 4584 + "sizes_px": [] 4585 + }, 4586 + { 4587 + "name": "emoji_u1f91a_1f3fb", 4588 + "version": 1, 4589 + "popularity": 398, 4590 + "codepoint": "1f91a_1f3fb", 4591 + "unsupported_families": [], 4592 + "categories": [ 4593 + "Smileys and emotions" 4594 + ], 4595 + "tags": [ 4596 + ":back-hand:" 4597 + ], 4598 + "sizes_px": [] 4599 + }, 4600 + { 4601 + "name": "emoji_u1f91a_1f3fc", 4602 + "version": 1, 4603 + "popularity": 397, 4604 + "codepoint": "1f91a_1f3fc", 4605 + "unsupported_families": [], 4606 + "categories": [ 4607 + "Smileys and emotions" 4608 + ], 4609 + "tags": [ 4610 + ":back-hand:" 4611 + ], 4612 + "sizes_px": [] 4613 + }, 4614 + { 4615 + "name": "emoji_u1f91a_1f3fd", 4616 + "version": 1, 4617 + "popularity": 396, 4618 + "codepoint": "1f91a_1f3fd", 4619 + "unsupported_families": [], 4620 + "categories": [ 4621 + "Smileys and emotions" 4622 + ], 4623 + "tags": [ 4624 + ":back-hand:" 4625 + ], 4626 + "sizes_px": [] 4627 + }, 4628 + { 4629 + "name": "emoji_u1f91a_1f3fe", 4630 + "version": 1, 4631 + "popularity": 395, 4632 + "codepoint": "1f91a_1f3fe", 4633 + "unsupported_families": [], 4634 + "categories": [ 4635 + "Smileys and emotions" 4636 + ], 4637 + "tags": [ 4638 + ":back-hand:" 4639 + ], 4640 + "sizes_px": [] 4641 + }, 4642 + { 4643 + "name": "emoji_u1f91a_1f3ff", 4644 + "version": 1, 4645 + "popularity": 394, 4646 + "codepoint": "1f91a_1f3ff", 4647 + "unsupported_families": [], 4648 + "categories": [ 4649 + "Smileys and emotions" 4650 + ], 4651 + "tags": [ 4652 + ":back-hand:" 4653 + ], 4654 + "sizes_px": [] 4655 + }, 4656 + { 4657 + "name": "emoji_u1f590_fe0f", 4658 + "version": 1, 4659 + "popularity": 393, 4660 + "codepoint": "1f590_fe0f", 4661 + "unsupported_families": [], 4662 + "categories": [ 4663 + "Smileys and emotions" 4664 + ], 4665 + "tags": [ 4666 + ":palm:" 4667 + ], 4668 + "sizes_px": [] 4669 + }, 4670 + { 4671 + "name": "emoji_u1f590_1f3fb", 4672 + "version": 1, 4673 + "popularity": 392, 4674 + "codepoint": "1f590_1f3fb", 4675 + "unsupported_families": [], 4676 + "categories": [ 4677 + "Smileys and emotions" 4678 + ], 4679 + "tags": [ 4680 + ":palm:" 4681 + ], 4682 + "sizes_px": [] 4683 + }, 4684 + { 4685 + "name": "emoji_u1f590_1f3fc", 4686 + "version": 1, 4687 + "popularity": 391, 4688 + "codepoint": "1f590_1f3fc", 4689 + "unsupported_families": [], 4690 + "categories": [ 4691 + "Smileys and emotions" 4692 + ], 4693 + "tags": [ 4694 + ":palm:" 4695 + ], 4696 + "sizes_px": [] 4697 + }, 4698 + { 4699 + "name": "emoji_u1f590_1f3fd", 4700 + "version": 1, 4701 + "popularity": 390, 4702 + "codepoint": "1f590_1f3fd", 4703 + "unsupported_families": [], 4704 + "categories": [ 4705 + "Smileys and emotions" 4706 + ], 4707 + "tags": [ 4708 + ":palm:" 4709 + ], 4710 + "sizes_px": [] 4711 + }, 4712 + { 4713 + "name": "emoji_u1f590_1f3fe", 4714 + "version": 1, 4715 + "popularity": 389, 4716 + "codepoint": "1f590_1f3fe", 4717 + "unsupported_families": [], 4718 + "categories": [ 4719 + "Smileys and emotions" 4720 + ], 4721 + "tags": [ 4722 + ":palm:" 4723 + ], 4724 + "sizes_px": [] 4725 + }, 4726 + { 4727 + "name": "emoji_u1f590_1f3ff", 4728 + "version": 1, 4729 + "popularity": 388, 4730 + "codepoint": "1f590_1f3ff", 4731 + "unsupported_families": [], 4732 + "categories": [ 4733 + "Smileys and emotions" 4734 + ], 4735 + "tags": [ 4736 + ":palm:" 4737 + ], 4738 + "sizes_px": [] 4739 + }, 4740 + { 4741 + "name": "emoji_u270b", 4742 + "version": 1, 4743 + "popularity": 387, 4744 + "codepoint": "270b", 4745 + "unsupported_families": [], 4746 + "categories": [ 4747 + "Smileys and emotions" 4748 + ], 4749 + "tags": [ 4750 + ":raised-hand:" 4751 + ], 4752 + "sizes_px": [] 4753 + }, 4754 + { 4755 + "name": "emoji_u270b_1f3fb", 4756 + "version": 1, 4757 + "popularity": 386, 4758 + "codepoint": "270b_1f3fb", 4759 + "unsupported_families": [], 4760 + "categories": [ 4761 + "Smileys and emotions" 4762 + ], 4763 + "tags": [ 4764 + ":raised-hand:" 4765 + ], 4766 + "sizes_px": [] 4767 + }, 4768 + { 4769 + "name": "emoji_u270b_1f3fc", 4770 + "version": 1, 4771 + "popularity": 385, 4772 + "codepoint": "270b_1f3fc", 4773 + "unsupported_families": [], 4774 + "categories": [ 4775 + "Smileys and emotions" 4776 + ], 4777 + "tags": [ 4778 + ":raised-hand:" 4779 + ], 4780 + "sizes_px": [] 4781 + }, 4782 + { 4783 + "name": "emoji_u270b_1f3fd", 4784 + "version": 1, 4785 + "popularity": 384, 4786 + "codepoint": "270b_1f3fd", 4787 + "unsupported_families": [], 4788 + "categories": [ 4789 + "Smileys and emotions" 4790 + ], 4791 + "tags": [ 4792 + ":raised-hand:" 4793 + ], 4794 + "sizes_px": [] 4795 + }, 4796 + { 4797 + "name": "emoji_u270b_1f3fe", 4798 + "version": 1, 4799 + "popularity": 383, 4800 + "codepoint": "270b_1f3fe", 4801 + "unsupported_families": [], 4802 + "categories": [ 4803 + "Smileys and emotions" 4804 + ], 4805 + "tags": [ 4806 + ":raised-hand:" 4807 + ], 4808 + "sizes_px": [] 4809 + }, 4810 + { 4811 + "name": "emoji_u270b_1f3ff", 4812 + "version": 1, 4813 + "popularity": 382, 4814 + "codepoint": "270b_1f3ff", 4815 + "unsupported_families": [], 4816 + "categories": [ 4817 + "Smileys and emotions" 4818 + ], 4819 + "tags": [ 4820 + ":raised-hand:" 4821 + ], 4822 + "sizes_px": [] 4823 + }, 4824 + { 4825 + "name": "emoji_u1f596", 4826 + "version": 1, 4827 + "popularity": 381, 4828 + "codepoint": "1f596", 4829 + "unsupported_families": [], 4830 + "categories": [ 4831 + "Smileys and emotions" 4832 + ], 4833 + "tags": [ 4834 + ":vulcan:", 4835 + ":prosper:", 4836 + ":spock:" 4837 + ], 4838 + "sizes_px": [] 4839 + }, 4840 + { 4841 + "name": "emoji_u1f596_1f3fb", 4842 + "version": 1, 4843 + "popularity": 380, 4844 + "codepoint": "1f596_1f3fb", 4845 + "unsupported_families": [], 4846 + "categories": [ 4847 + "Smileys and emotions" 4848 + ], 4849 + "tags": [ 4850 + ":vulcan:", 4851 + ":prosper:", 4852 + ":spock:" 4853 + ], 4854 + "sizes_px": [] 4855 + }, 4856 + { 4857 + "name": "emoji_u1f596_1f3fc", 4858 + "version": 1, 4859 + "popularity": 379, 4860 + "codepoint": "1f596_1f3fc", 4861 + "unsupported_families": [], 4862 + "categories": [ 4863 + "Smileys and emotions" 4864 + ], 4865 + "tags": [ 4866 + ":vulcan:", 4867 + ":prosper:", 4868 + ":spock:" 4869 + ], 4870 + "sizes_px": [] 4871 + }, 4872 + { 4873 + "name": "emoji_u1f596_1f3fd", 4874 + "version": 1, 4875 + "popularity": 378, 4876 + "codepoint": "1f596_1f3fd", 4877 + "unsupported_families": [], 4878 + "categories": [ 4879 + "Smileys and emotions" 4880 + ], 4881 + "tags": [ 4882 + ":vulcan:", 4883 + ":prosper:", 4884 + ":spock:" 4885 + ], 4886 + "sizes_px": [] 4887 + }, 4888 + { 4889 + "name": "emoji_u1f596_1f3fe", 4890 + "version": 1, 4891 + "popularity": 377, 4892 + "codepoint": "1f596_1f3fe", 4893 + "unsupported_families": [], 4894 + "categories": [ 4895 + "Smileys and emotions" 4896 + ], 4897 + "tags": [ 4898 + ":vulcan:", 4899 + ":prosper:", 4900 + ":spock:" 4901 + ], 4902 + "sizes_px": [] 4903 + }, 4904 + { 4905 + "name": "emoji_u1f596_1f3ff", 4906 + "version": 1, 4907 + "popularity": 376, 4908 + "codepoint": "1f596_1f3ff", 4909 + "unsupported_families": [], 4910 + "categories": [ 4911 + "Smileys and emotions" 4912 + ], 4913 + "tags": [ 4914 + ":vulcan:", 4915 + ":prosper:", 4916 + ":spock:" 4917 + ], 4918 + "sizes_px": [] 4919 + }, 4920 + { 4921 + "name": "emoji_u1f91f", 4922 + "version": 1, 4923 + "popularity": 375, 4924 + "codepoint": "1f91f", 4925 + "unsupported_families": [], 4926 + "categories": [ 4927 + "Smileys and emotions" 4928 + ], 4929 + "tags": [ 4930 + ":love-you-gesture:" 4931 + ], 4932 + "sizes_px": [] 4933 + }, 4934 + { 4935 + "name": "emoji_u1f91f_1f3fb", 4936 + "version": 1, 4937 + "popularity": 374, 4938 + "codepoint": "1f91f_1f3fb", 4939 + "unsupported_families": [], 4940 + "categories": [ 4941 + "Smileys and emotions" 4942 + ], 4943 + "tags": [ 4944 + ":love-you-gesture:" 4945 + ], 4946 + "sizes_px": [] 4947 + }, 4948 + { 4949 + "name": "emoji_u1f91f_1f3fc", 4950 + "version": 1, 4951 + "popularity": 373, 4952 + "codepoint": "1f91f_1f3fc", 4953 + "unsupported_families": [], 4954 + "categories": [ 4955 + "Smileys and emotions" 4956 + ], 4957 + "tags": [ 4958 + ":love-you-gesture:" 4959 + ], 4960 + "sizes_px": [] 4961 + }, 4962 + { 4963 + "name": "emoji_u1f91f_1f3fd", 4964 + "version": 1, 4965 + "popularity": 372, 4966 + "codepoint": "1f91f_1f3fd", 4967 + "unsupported_families": [], 4968 + "categories": [ 4969 + "Smileys and emotions" 4970 + ], 4971 + "tags": [ 4972 + ":love-you-gesture:" 4973 + ], 4974 + "sizes_px": [] 4975 + }, 4976 + { 4977 + "name": "emoji_u1f91f_1f3fe", 4978 + "version": 1, 4979 + "popularity": 371, 4980 + "codepoint": "1f91f_1f3fe", 4981 + "unsupported_families": [], 4982 + "categories": [ 4983 + "Smileys and emotions" 4984 + ], 4985 + "tags": [ 4986 + ":love-you-gesture:" 4987 + ], 4988 + "sizes_px": [] 4989 + }, 4990 + { 4991 + "name": "emoji_u1f91f_1f3ff", 4992 + "version": 1, 4993 + "popularity": 370, 4994 + "codepoint": "1f91f_1f3ff", 4995 + "unsupported_families": [], 4996 + "categories": [ 4997 + "Smileys and emotions" 4998 + ], 4999 + "tags": [ 5000 + ":love-you-gesture:" 5001 + ], 5002 + "sizes_px": [] 5003 + }, 5004 + { 5005 + "name": "emoji_u1f918", 5006 + "version": 1, 5007 + "popularity": 369, 5008 + "codepoint": "1f918", 5009 + "unsupported_families": [], 5010 + "categories": [ 5011 + "Smileys and emotions" 5012 + ], 5013 + "tags": [ 5014 + ":metal:", 5015 + ":horns:" 5016 + ], 5017 + "sizes_px": [] 5018 + }, 5019 + { 5020 + "name": "emoji_u1f918_1f3fb", 5021 + "version": 1, 5022 + "popularity": 368, 5023 + "codepoint": "1f918_1f3fb", 5024 + "unsupported_families": [], 5025 + "categories": [ 5026 + "Smileys and emotions" 5027 + ], 5028 + "tags": [ 5029 + ":metal:", 5030 + ":horns:" 5031 + ], 5032 + "sizes_px": [] 5033 + }, 5034 + { 5035 + "name": "emoji_u1f918_1f3fc", 5036 + "version": 1, 5037 + "popularity": 367, 5038 + "codepoint": "1f918_1f3fc", 5039 + "unsupported_families": [], 5040 + "categories": [ 5041 + "Smileys and emotions" 5042 + ], 5043 + "tags": [ 5044 + ":metal:", 5045 + ":horns:" 5046 + ], 5047 + "sizes_px": [] 5048 + }, 5049 + { 5050 + "name": "emoji_u1f918_1f3fd", 5051 + "version": 1, 5052 + "popularity": 366, 5053 + "codepoint": "1f918_1f3fd", 5054 + "unsupported_families": [], 5055 + "categories": [ 5056 + "Smileys and emotions" 5057 + ], 5058 + "tags": [ 5059 + ":metal:", 5060 + ":horns:" 5061 + ], 5062 + "sizes_px": [] 5063 + }, 5064 + { 5065 + "name": "emoji_u1f918_1f3fe", 5066 + "version": 1, 5067 + "popularity": 365, 5068 + "codepoint": "1f918_1f3fe", 5069 + "unsupported_families": [], 5070 + "categories": [ 5071 + "Smileys and emotions" 5072 + ], 5073 + "tags": [ 5074 + ":metal:", 5075 + ":horns:" 5076 + ], 5077 + "sizes_px": [] 5078 + }, 5079 + { 5080 + "name": "emoji_u1f918_1f3ff", 5081 + "version": 1, 5082 + "popularity": 364, 5083 + "codepoint": "1f918_1f3ff", 5084 + "unsupported_families": [], 5085 + "categories": [ 5086 + "Smileys and emotions" 5087 + ], 5088 + "tags": [ 5089 + ":metal:", 5090 + ":horns:" 5091 + ], 5092 + "sizes_px": [] 5093 + }, 5094 + { 5095 + "name": "emoji_u270c_fe0f", 5096 + "version": 1, 5097 + "popularity": 363, 5098 + "codepoint": "270c_fe0f", 5099 + "unsupported_families": [], 5100 + "categories": [ 5101 + "Smileys and emotions" 5102 + ], 5103 + "tags": [ 5104 + ":victory:", 5105 + ":v:", 5106 + ":peace-hand:" 5107 + ], 5108 + "sizes_px": [] 5109 + }, 5110 + { 5111 + "name": "emoji_u270c_1f3fb", 5112 + "version": 1, 5113 + "popularity": 362, 5114 + "codepoint": "270c_1f3fb", 5115 + "unsupported_families": [], 5116 + "categories": [ 5117 + "Smileys and emotions" 5118 + ], 5119 + "tags": [ 5120 + ":victory:", 5121 + ":v:", 5122 + ":peace-hand:" 5123 + ], 5124 + "sizes_px": [] 5125 + }, 5126 + { 5127 + "name": "emoji_u270c_1f3fc", 5128 + "version": 1, 5129 + "popularity": 361, 5130 + "codepoint": "270c_1f3fc", 5131 + "unsupported_families": [], 5132 + "categories": [ 5133 + "Smileys and emotions" 5134 + ], 5135 + "tags": [ 5136 + ":victory:", 5137 + ":v:", 5138 + ":peace-hand:" 5139 + ], 5140 + "sizes_px": [] 5141 + }, 5142 + { 5143 + "name": "emoji_u270c_1f3fd", 5144 + "version": 1, 5145 + "popularity": 360, 5146 + "codepoint": "270c_1f3fd", 5147 + "unsupported_families": [], 5148 + "categories": [ 5149 + "Smileys and emotions" 5150 + ], 5151 + "tags": [ 5152 + ":victory:", 5153 + ":v:", 5154 + ":peace-hand:" 5155 + ], 5156 + "sizes_px": [] 5157 + }, 5158 + { 5159 + "name": "emoji_u270c_1f3fe", 5160 + "version": 1, 5161 + "popularity": 359, 5162 + "codepoint": "270c_1f3fe", 5163 + "unsupported_families": [], 5164 + "categories": [ 5165 + "Smileys and emotions" 5166 + ], 5167 + "tags": [ 5168 + ":victory:", 5169 + ":v:", 5170 + ":peace-hand:" 5171 + ], 5172 + "sizes_px": [] 5173 + }, 5174 + { 5175 + "name": "emoji_u270c_1f3ff", 5176 + "version": 1, 5177 + "popularity": 358, 5178 + "codepoint": "270c_1f3ff", 5179 + "unsupported_families": [], 5180 + "categories": [ 5181 + "Smileys and emotions" 5182 + ], 5183 + "tags": [ 5184 + ":victory:", 5185 + ":v:", 5186 + ":peace-hand:" 5187 + ], 5188 + "sizes_px": [] 5189 + }, 5190 + { 5191 + "name": "emoji_u1f91e", 5192 + "version": 1, 5193 + "popularity": 357, 5194 + "codepoint": "1f91e", 5195 + "unsupported_families": [], 5196 + "categories": [ 5197 + "Smileys and emotions" 5198 + ], 5199 + "tags": [ 5200 + ":crossed-fingers:" 5201 + ], 5202 + "sizes_px": [] 5203 + }, 5204 + { 5205 + "name": "emoji_u1f91e_1f3fb", 5206 + "version": 1, 5207 + "popularity": 356, 5208 + "codepoint": "1f91e_1f3fb", 5209 + "unsupported_families": [], 5210 + "categories": [ 5211 + "Smileys and emotions" 5212 + ], 5213 + "tags": [ 5214 + ":crossed-fingers:" 5215 + ], 5216 + "sizes_px": [] 5217 + }, 5218 + { 5219 + "name": "emoji_u1f91e_1f3fc", 5220 + "version": 1, 5221 + "popularity": 355, 5222 + "codepoint": "1f91e_1f3fc", 5223 + "unsupported_families": [], 5224 + "categories": [ 5225 + "Smileys and emotions" 5226 + ], 5227 + "tags": [ 5228 + ":crossed-fingers:" 5229 + ], 5230 + "sizes_px": [] 5231 + }, 5232 + { 5233 + "name": "emoji_u1f91e_1f3fd", 5234 + "version": 1, 5235 + "popularity": 354, 5236 + "codepoint": "1f91e_1f3fd", 5237 + "unsupported_families": [], 5238 + "categories": [ 5239 + "Smileys and emotions" 5240 + ], 5241 + "tags": [ 5242 + ":crossed-fingers:" 5243 + ], 5244 + "sizes_px": [] 5245 + }, 5246 + { 5247 + "name": "emoji_u1f91e_1f3fe", 5248 + "version": 1, 5249 + "popularity": 353, 5250 + "codepoint": "1f91e_1f3fe", 5251 + "unsupported_families": [], 5252 + "categories": [ 5253 + "Smileys and emotions" 5254 + ], 5255 + "tags": [ 5256 + ":crossed-fingers:" 5257 + ], 5258 + "sizes_px": [] 5259 + }, 5260 + { 5261 + "name": "emoji_u1f91e_1f3ff", 5262 + "version": 1, 5263 + "popularity": 352, 5264 + "codepoint": "1f91e_1f3ff", 5265 + "unsupported_families": [], 5266 + "categories": [ 5267 + "Smileys and emotions" 5268 + ], 5269 + "tags": [ 5270 + ":crossed-fingers:" 5271 + ], 5272 + "sizes_px": [] 5273 + }, 5274 + { 5275 + "name": "emoji_u1faf0", 5276 + "version": 1, 5277 + "popularity": 351, 5278 + "codepoint": "1faf0", 5279 + "unsupported_families": [], 5280 + "categories": [ 5281 + "Smileys and emotions" 5282 + ], 5283 + "tags": [ 5284 + ":hand-with-index-finger-and-thumb-crossed:", 5285 + ":snap:", 5286 + ":finger-heart:" 5287 + ], 5288 + "sizes_px": [] 5289 + }, 5290 + { 5291 + "name": "emoji_u1faf0_1f3fb", 5292 + "version": 1, 5293 + "popularity": 350, 5294 + "codepoint": "1faf0_1f3fb", 5295 + "unsupported_families": [], 5296 + "categories": [ 5297 + "Smileys and emotions" 5298 + ], 5299 + "tags": [ 5300 + ":hand-with-index-finger-and-thumb-crossed:", 5301 + ":snap:", 5302 + ":finger-heart:" 5303 + ], 5304 + "sizes_px": [] 5305 + }, 5306 + { 5307 + "name": "emoji_u1faf0_1f3fc", 5308 + "version": 1, 5309 + "popularity": 349, 5310 + "codepoint": "1faf0_1f3fc", 5311 + "unsupported_families": [], 5312 + "categories": [ 5313 + "Smileys and emotions" 5314 + ], 5315 + "tags": [ 5316 + ":hand-with-index-finger-and-thumb-crossed:", 5317 + ":snap:", 5318 + ":finger-heart:" 5319 + ], 5320 + "sizes_px": [] 5321 + }, 5322 + { 5323 + "name": "emoji_u1faf0_1f3fd", 5324 + "version": 1, 5325 + "popularity": 348, 5326 + "codepoint": "1faf0_1f3fd", 5327 + "unsupported_families": [], 5328 + "categories": [ 5329 + "Smileys and emotions" 5330 + ], 5331 + "tags": [ 5332 + ":hand-with-index-finger-and-thumb-crossed:", 5333 + ":snap:", 5334 + ":finger-heart:" 5335 + ], 5336 + "sizes_px": [] 5337 + }, 5338 + { 5339 + "name": "emoji_u1faf0_1f3fe", 5340 + "version": 1, 5341 + "popularity": 347, 5342 + "codepoint": "1faf0_1f3fe", 5343 + "unsupported_families": [], 5344 + "categories": [ 5345 + "Smileys and emotions" 5346 + ], 5347 + "tags": [ 5348 + ":hand-with-index-finger-and-thumb-crossed:", 5349 + ":snap:", 5350 + ":finger-heart:" 5351 + ], 5352 + "sizes_px": [] 5353 + }, 5354 + { 5355 + "name": "emoji_u1faf0_1f3ff", 5356 + "version": 1, 5357 + "popularity": 346, 5358 + "codepoint": "1faf0_1f3ff", 5359 + "unsupported_families": [], 5360 + "categories": [ 5361 + "Smileys and emotions" 5362 + ], 5363 + "tags": [ 5364 + ":hand-with-index-finger-and-thumb-crossed:", 5365 + ":snap:", 5366 + ":finger-heart:" 5367 + ], 5368 + "sizes_px": [] 5369 + }, 5370 + { 5371 + "name": "emoji_u1f919", 5372 + "version": 1, 5373 + "popularity": 345, 5374 + "codepoint": "1f919", 5375 + "unsupported_families": [], 5376 + "categories": [ 5377 + "Smileys and emotions" 5378 + ], 5379 + "tags": [ 5380 + ":call-me-hand:" 5381 + ], 5382 + "sizes_px": [] 5383 + }, 5384 + { 5385 + "name": "emoji_u1f919_1f3fb", 5386 + "version": 1, 5387 + "popularity": 344, 5388 + "codepoint": "1f919_1f3fb", 5389 + "unsupported_families": [], 5390 + "categories": [ 5391 + "Smileys and emotions" 5392 + ], 5393 + "tags": [ 5394 + ":call-me-hand:" 5395 + ], 5396 + "sizes_px": [] 5397 + }, 5398 + { 5399 + "name": "emoji_u1f919_1f3fc", 5400 + "version": 1, 5401 + "popularity": 343, 5402 + "codepoint": "1f919_1f3fc", 5403 + "unsupported_families": [], 5404 + "categories": [ 5405 + "Smileys and emotions" 5406 + ], 5407 + "tags": [ 5408 + ":call-me-hand:" 5409 + ], 5410 + "sizes_px": [] 5411 + }, 5412 + { 5413 + "name": "emoji_u1f919_1f3fd", 5414 + "version": 1, 5415 + "popularity": 342, 5416 + "codepoint": "1f919_1f3fd", 5417 + "unsupported_families": [], 5418 + "categories": [ 5419 + "Smileys and emotions" 5420 + ], 5421 + "tags": [ 5422 + ":call-me-hand:" 5423 + ], 5424 + "sizes_px": [] 5425 + }, 5426 + { 5427 + "name": "emoji_u1f919_1f3fe", 5428 + "version": 1, 5429 + "popularity": 341, 5430 + "codepoint": "1f919_1f3fe", 5431 + "unsupported_families": [], 5432 + "categories": [ 5433 + "Smileys and emotions" 5434 + ], 5435 + "tags": [ 5436 + ":call-me-hand:" 5437 + ], 5438 + "sizes_px": [] 5439 + }, 5440 + { 5441 + "name": "emoji_u1f919_1f3ff", 5442 + "version": 1, 5443 + "popularity": 340, 5444 + "codepoint": "1f919_1f3ff", 5445 + "unsupported_families": [], 5446 + "categories": [ 5447 + "Smileys and emotions" 5448 + ], 5449 + "tags": [ 5450 + ":call-me-hand:" 5451 + ], 5452 + "sizes_px": [] 5453 + }, 5454 + { 5455 + "name": "emoji_u1f90c", 5456 + "version": 1, 5457 + "popularity": 339, 5458 + "codepoint": "1f90c", 5459 + "unsupported_families": [], 5460 + "categories": [ 5461 + "Smileys and emotions" 5462 + ], 5463 + "tags": [ 5464 + ":pinched-fingers:" 5465 + ], 5466 + "sizes_px": [] 5467 + }, 5468 + { 5469 + "name": "emoji_u1f90c_1f3fb", 5470 + "version": 1, 5471 + "popularity": 338, 5472 + "codepoint": "1f90c_1f3fb", 5473 + "unsupported_families": [], 5474 + "categories": [ 5475 + "Smileys and emotions" 5476 + ], 5477 + "tags": [ 5478 + ":pinched-fingers:" 5479 + ], 5480 + "sizes_px": [] 5481 + }, 5482 + { 5483 + "name": "emoji_u1f90c_1f3fc", 5484 + "version": 1, 5485 + "popularity": 337, 5486 + "codepoint": "1f90c_1f3fc", 5487 + "unsupported_families": [], 5488 + "categories": [ 5489 + "Smileys and emotions" 5490 + ], 5491 + "tags": [ 5492 + ":pinched-fingers:" 5493 + ], 5494 + "sizes_px": [] 5495 + }, 5496 + { 5497 + "name": "emoji_u1f90c_1f3fd", 5498 + "version": 1, 5499 + "popularity": 336, 5500 + "codepoint": "1f90c_1f3fd", 5501 + "unsupported_families": [], 5502 + "categories": [ 5503 + "Smileys and emotions" 5504 + ], 5505 + "tags": [ 5506 + ":pinched-fingers:" 5507 + ], 5508 + "sizes_px": [] 5509 + }, 5510 + { 5511 + "name": "emoji_u1f90c_1f3fe", 5512 + "version": 1, 5513 + "popularity": 335, 5514 + "codepoint": "1f90c_1f3fe", 5515 + "unsupported_families": [], 5516 + "categories": [ 5517 + "Smileys and emotions" 5518 + ], 5519 + "tags": [ 5520 + ":pinched-fingers:" 5521 + ], 5522 + "sizes_px": [] 5523 + }, 5524 + { 5525 + "name": "emoji_u1f90c_1f3ff", 5526 + "version": 1, 5527 + "popularity": 334, 5528 + "codepoint": "1f90c_1f3ff", 5529 + "unsupported_families": [], 5530 + "categories": [ 5531 + "Smileys and emotions" 5532 + ], 5533 + "tags": [ 5534 + ":pinched-fingers:" 5535 + ], 5536 + "sizes_px": [] 5537 + }, 5538 + { 5539 + "name": "emoji_u1f90f", 5540 + "version": 1, 5541 + "popularity": 333, 5542 + "codepoint": "1f90f", 5543 + "unsupported_families": [], 5544 + "categories": [ 5545 + "Smileys and emotions" 5546 + ], 5547 + "tags": [ 5548 + ":pinch:" 5549 + ], 5550 + "sizes_px": [] 5551 + }, 5552 + { 5553 + "name": "emoji_u1f90f_1f3fb", 5554 + "version": 1, 5555 + "popularity": 332, 5556 + "codepoint": "1f90f_1f3fb", 5557 + "unsupported_families": [], 5558 + "categories": [ 5559 + "Smileys and emotions" 5560 + ], 5561 + "tags": [ 5562 + ":pinch:" 5563 + ], 5564 + "sizes_px": [] 5565 + }, 5566 + { 5567 + "name": "emoji_u1f90f_1f3fc", 5568 + "version": 1, 5569 + "popularity": 331, 5570 + "codepoint": "1f90f_1f3fc", 5571 + "unsupported_families": [], 5572 + "categories": [ 5573 + "Smileys and emotions" 5574 + ], 5575 + "tags": [ 5576 + ":pinch:" 5577 + ], 5578 + "sizes_px": [] 5579 + }, 5580 + { 5581 + "name": "emoji_u1f90f_1f3fd", 5582 + "version": 1, 5583 + "popularity": 330, 5584 + "codepoint": "1f90f_1f3fd", 5585 + "unsupported_families": [], 5586 + "categories": [ 5587 + "Smileys and emotions" 5588 + ], 5589 + "tags": [ 5590 + ":pinch:" 5591 + ], 5592 + "sizes_px": [] 5593 + }, 5594 + { 5595 + "name": "emoji_u1f90f_1f3fe", 5596 + "version": 1, 5597 + "popularity": 329, 5598 + "codepoint": "1f90f_1f3fe", 5599 + "unsupported_families": [], 5600 + "categories": [ 5601 + "Smileys and emotions" 5602 + ], 5603 + "tags": [ 5604 + ":pinch:" 5605 + ], 5606 + "sizes_px": [] 5607 + }, 5608 + { 5609 + "name": "emoji_u1f90f_1f3ff", 5610 + "version": 1, 5611 + "popularity": 328, 5612 + "codepoint": "1f90f_1f3ff", 5613 + "unsupported_families": [], 5614 + "categories": [ 5615 + "Smileys and emotions" 5616 + ], 5617 + "tags": [ 5618 + ":pinch:" 5619 + ], 5620 + "sizes_px": [] 5621 + }, 5622 + { 5623 + "name": "emoji_u1f44c", 5624 + "version": 1, 5625 + "popularity": 327, 5626 + "codepoint": "1f44c", 5627 + "unsupported_families": [], 5628 + "categories": [ 5629 + "Smileys and emotions" 5630 + ], 5631 + "tags": [ 5632 + ":ok:" 5633 + ], 5634 + "sizes_px": [] 5635 + }, 5636 + { 5637 + "name": "emoji_u1f44c_1f3fb", 5638 + "version": 1, 5639 + "popularity": 326, 5640 + "codepoint": "1f44c_1f3fb", 5641 + "unsupported_families": [], 5642 + "categories": [ 5643 + "Smileys and emotions" 5644 + ], 5645 + "tags": [ 5646 + ":ok:" 5647 + ], 5648 + "sizes_px": [] 5649 + }, 5650 + { 5651 + "name": "emoji_u1f44c_1f3fc", 5652 + "version": 1, 5653 + "popularity": 325, 5654 + "codepoint": "1f44c_1f3fc", 5655 + "unsupported_families": [], 5656 + "categories": [ 5657 + "Smileys and emotions" 5658 + ], 5659 + "tags": [ 5660 + ":ok:" 5661 + ], 5662 + "sizes_px": [] 5663 + }, 5664 + { 5665 + "name": "emoji_u1f44c_1f3fd", 5666 + "version": 1, 5667 + "popularity": 324, 5668 + "codepoint": "1f44c_1f3fd", 5669 + "unsupported_families": [], 5670 + "categories": [ 5671 + "Smileys and emotions" 5672 + ], 5673 + "tags": [ 5674 + ":ok:" 5675 + ], 5676 + "sizes_px": [] 5677 + }, 5678 + { 5679 + "name": "emoji_u1f44c_1f3fe", 5680 + "version": 1, 5681 + "popularity": 323, 5682 + "codepoint": "1f44c_1f3fe", 5683 + "unsupported_families": [], 5684 + "categories": [ 5685 + "Smileys and emotions" 5686 + ], 5687 + "tags": [ 5688 + ":ok:" 5689 + ], 5690 + "sizes_px": [] 5691 + }, 5692 + { 5693 + "name": "emoji_u1f44c_1f3ff", 5694 + "version": 1, 5695 + "popularity": 322, 5696 + "codepoint": "1f44c_1f3ff", 5697 + "unsupported_families": [], 5698 + "categories": [ 5699 + "Smileys and emotions" 5700 + ], 5701 + "tags": [ 5702 + ":ok:" 5703 + ], 5704 + "sizes_px": [] 5705 + }, 5706 + { 5707 + "name": "emoji_u1faf5", 5708 + "version": 1, 5709 + "popularity": 321, 5710 + "codepoint": "1faf5", 5711 + "unsupported_families": [], 5712 + "categories": [ 5713 + "Smileys and emotions" 5714 + ], 5715 + "tags": [ 5716 + ":pointing:" 5717 + ], 5718 + "sizes_px": [] 5719 + }, 5720 + { 5721 + "name": "emoji_u1faf5_1f3fb", 5722 + "version": 1, 5723 + "popularity": 320, 5724 + "codepoint": "1faf5_1f3fb", 5725 + "unsupported_families": [], 5726 + "categories": [ 5727 + "Smileys and emotions" 5728 + ], 5729 + "tags": [ 5730 + ":pointing:" 5731 + ], 5732 + "sizes_px": [] 5733 + }, 5734 + { 5735 + "name": "emoji_u1faf5_1f3fc", 5736 + "version": 1, 5737 + "popularity": 319, 5738 + "codepoint": "1faf5_1f3fc", 5739 + "unsupported_families": [], 5740 + "categories": [ 5741 + "Smileys and emotions" 5742 + ], 5743 + "tags": [ 5744 + ":pointing:" 5745 + ], 5746 + "sizes_px": [] 5747 + }, 5748 + { 5749 + "name": "emoji_u1faf5_1f3fd", 5750 + "version": 1, 5751 + "popularity": 318, 5752 + "codepoint": "1faf5_1f3fd", 5753 + "unsupported_families": [], 5754 + "categories": [ 5755 + "Smileys and emotions" 5756 + ], 5757 + "tags": [ 5758 + ":pointing:" 5759 + ], 5760 + "sizes_px": [] 5761 + }, 5762 + { 5763 + "name": "emoji_u1faf5_1f3fe", 5764 + "version": 1, 5765 + "popularity": 317, 5766 + "codepoint": "1faf5_1f3fe", 5767 + "unsupported_families": [], 5768 + "categories": [ 5769 + "Smileys and emotions" 5770 + ], 5771 + "tags": [ 5772 + ":pointing:" 5773 + ], 5774 + "sizes_px": [] 5775 + }, 5776 + { 5777 + "name": "emoji_u1faf5_1f3ff", 5778 + "version": 1, 5779 + "popularity": 316, 5780 + "codepoint": "1faf5_1f3ff", 5781 + "unsupported_families": [], 5782 + "categories": [ 5783 + "Smileys and emotions" 5784 + ], 5785 + "tags": [ 5786 + ":pointing:" 5787 + ], 5788 + "sizes_px": [] 5789 + }, 5790 + { 5791 + "name": "emoji_u1f449", 5792 + "version": 1, 5793 + "popularity": 315, 5794 + "codepoint": "1f449", 5795 + "unsupported_families": [], 5796 + "categories": [ 5797 + "Smileys and emotions" 5798 + ], 5799 + "tags": [ 5800 + ":point-right:" 5801 + ], 5802 + "sizes_px": [] 5803 + }, 5804 + { 5805 + "name": "emoji_u1f449_1f3fb", 5806 + "version": 1, 5807 + "popularity": 314, 5808 + "codepoint": "1f449_1f3fb", 5809 + "unsupported_families": [], 5810 + "categories": [ 5811 + "Smileys and emotions" 5812 + ], 5813 + "tags": [ 5814 + ":point-right:" 5815 + ], 5816 + "sizes_px": [] 5817 + }, 5818 + { 5819 + "name": "emoji_u1f449_1f3fc", 5820 + "version": 1, 5821 + "popularity": 313, 5822 + "codepoint": "1f449_1f3fc", 5823 + "unsupported_families": [], 5824 + "categories": [ 5825 + "Smileys and emotions" 5826 + ], 5827 + "tags": [ 5828 + ":point-right:" 5829 + ], 5830 + "sizes_px": [] 5831 + }, 5832 + { 5833 + "name": "emoji_u1f449_1f3fd", 5834 + "version": 1, 5835 + "popularity": 312, 5836 + "codepoint": "1f449_1f3fd", 5837 + "unsupported_families": [], 5838 + "categories": [ 5839 + "Smileys and emotions" 5840 + ], 5841 + "tags": [ 5842 + ":point-right:" 5843 + ], 5844 + "sizes_px": [] 5845 + }, 5846 + { 5847 + "name": "emoji_u1f449_1f3fe", 5848 + "version": 1, 5849 + "popularity": 311, 5850 + "codepoint": "1f449_1f3fe", 5851 + "unsupported_families": [], 5852 + "categories": [ 5853 + "Smileys and emotions" 5854 + ], 5855 + "tags": [ 5856 + ":point-right:" 5857 + ], 5858 + "sizes_px": [] 5859 + }, 5860 + { 5861 + "name": "emoji_u1f449_1f3ff", 5862 + "version": 1, 5863 + "popularity": 310, 5864 + "codepoint": "1f449_1f3ff", 5865 + "unsupported_families": [], 5866 + "categories": [ 5867 + "Smileys and emotions" 5868 + ], 5869 + "tags": [ 5870 + ":point-right:" 5871 + ], 5872 + "sizes_px": [] 5873 + }, 5874 + { 5875 + "name": "emoji_u1f448", 5876 + "version": 1, 5877 + "popularity": 309, 5878 + "codepoint": "1f448", 5879 + "unsupported_families": [], 5880 + "categories": [ 5881 + "Smileys and emotions" 5882 + ], 5883 + "tags": [ 5884 + ":point-left:" 5885 + ], 5886 + "sizes_px": [] 5887 + }, 5888 + { 5889 + "name": "emoji_u1f448_1f3fb", 5890 + "version": 1, 5891 + "popularity": 308, 5892 + "codepoint": "1f448_1f3fb", 5893 + "unsupported_families": [], 5894 + "categories": [ 5895 + "Smileys and emotions" 5896 + ], 5897 + "tags": [ 5898 + ":point-left:" 5899 + ], 5900 + "sizes_px": [] 5901 + }, 5902 + { 5903 + "name": "emoji_u1f448_1f3fc", 5904 + "version": 1, 5905 + "popularity": 307, 5906 + "codepoint": "1f448_1f3fc", 5907 + "unsupported_families": [], 5908 + "categories": [ 5909 + "Smileys and emotions" 5910 + ], 5911 + "tags": [ 5912 + ":point-left:" 5913 + ], 5914 + "sizes_px": [] 5915 + }, 5916 + { 5917 + "name": "emoji_u1f448_1f3fd", 5918 + "version": 1, 5919 + "popularity": 306, 5920 + "codepoint": "1f448_1f3fd", 5921 + "unsupported_families": [], 5922 + "categories": [ 5923 + "Smileys and emotions" 5924 + ], 5925 + "tags": [ 5926 + ":point-left:" 5927 + ], 5928 + "sizes_px": [] 5929 + }, 5930 + { 5931 + "name": "emoji_u1f448_1f3fe", 5932 + "version": 1, 5933 + "popularity": 305, 5934 + "codepoint": "1f448_1f3fe", 5935 + "unsupported_families": [], 5936 + "categories": [ 5937 + "Smileys and emotions" 5938 + ], 5939 + "tags": [ 5940 + ":point-left:" 5941 + ], 5942 + "sizes_px": [] 5943 + }, 5944 + { 5945 + "name": "emoji_u1f448_1f3ff", 5946 + "version": 1, 5947 + "popularity": 304, 5948 + "codepoint": "1f448_1f3ff", 5949 + "unsupported_families": [], 5950 + "categories": [ 5951 + "Smileys and emotions" 5952 + ], 5953 + "tags": [ 5954 + ":point-left:" 5955 + ], 5956 + "sizes_px": [] 5957 + }, 5958 + { 5959 + "name": "emoji_u261d_fe0f", 5960 + "version": 1, 5961 + "popularity": 303, 5962 + "codepoint": "261d_fe0f", 5963 + "unsupported_families": [], 5964 + "categories": [ 5965 + "Smileys and emotions" 5966 + ], 5967 + "tags": [ 5968 + ":index-finger:" 5969 + ], 5970 + "sizes_px": [] 5971 + }, 5972 + { 5973 + "name": "emoji_u261d_1f3fb", 5974 + "version": 1, 5975 + "popularity": 302, 5976 + "codepoint": "261d_1f3fb", 5977 + "unsupported_families": [], 5978 + "categories": [ 5979 + "Smileys and emotions" 5980 + ], 5981 + "tags": [ 5982 + ":index-finger:" 5983 + ], 5984 + "sizes_px": [] 5985 + }, 5986 + { 5987 + "name": "emoji_u261d_1f3fc", 5988 + "version": 1, 5989 + "popularity": 301, 5990 + "codepoint": "261d_1f3fc", 5991 + "unsupported_families": [], 5992 + "categories": [ 5993 + "Smileys and emotions" 5994 + ], 5995 + "tags": [ 5996 + ":index-finger:" 5997 + ], 5998 + "sizes_px": [] 5999 + }, 6000 + { 6001 + "name": "emoji_u261d_1f3fd", 6002 + "version": 1, 6003 + "popularity": 300, 6004 + "codepoint": "261d_1f3fd", 6005 + "unsupported_families": [], 6006 + "categories": [ 6007 + "Smileys and emotions" 6008 + ], 6009 + "tags": [ 6010 + ":index-finger:" 6011 + ], 6012 + "sizes_px": [] 6013 + }, 6014 + { 6015 + "name": "emoji_u261d_1f3fe", 6016 + "version": 1, 6017 + "popularity": 299, 6018 + "codepoint": "261d_1f3fe", 6019 + "unsupported_families": [], 6020 + "categories": [ 6021 + "Smileys and emotions" 6022 + ], 6023 + "tags": [ 6024 + ":index-finger:" 6025 + ], 6026 + "sizes_px": [] 6027 + }, 6028 + { 6029 + "name": "emoji_u261d_1f3ff", 6030 + "version": 1, 6031 + "popularity": 298, 6032 + "codepoint": "261d_1f3ff", 6033 + "unsupported_families": [], 6034 + "categories": [ 6035 + "Smileys and emotions" 6036 + ], 6037 + "tags": [ 6038 + ":index-finger:" 6039 + ], 6040 + "sizes_px": [] 6041 + }, 6042 + { 6043 + "name": "emoji_u1f446", 6044 + "version": 1, 6045 + "popularity": 297, 6046 + "codepoint": "1f446", 6047 + "unsupported_families": [], 6048 + "categories": [ 6049 + "Smileys and emotions" 6050 + ], 6051 + "tags": [ 6052 + ":point-up:" 6053 + ], 6054 + "sizes_px": [] 6055 + }, 6056 + { 6057 + "name": "emoji_u1f446_1f3fb", 6058 + "version": 1, 6059 + "popularity": 296, 6060 + "codepoint": "1f446_1f3fb", 6061 + "unsupported_families": [], 6062 + "categories": [ 6063 + "Smileys and emotions" 6064 + ], 6065 + "tags": [ 6066 + ":point-up:" 6067 + ], 6068 + "sizes_px": [] 6069 + }, 6070 + { 6071 + "name": "emoji_u1f446_1f3fc", 6072 + "version": 1, 6073 + "popularity": 295, 6074 + "codepoint": "1f446_1f3fc", 6075 + "unsupported_families": [], 6076 + "categories": [ 6077 + "Smileys and emotions" 6078 + ], 6079 + "tags": [ 6080 + ":point-up:" 6081 + ], 6082 + "sizes_px": [] 6083 + }, 6084 + { 6085 + "name": "emoji_u1f446_1f3fd", 6086 + "version": 1, 6087 + "popularity": 294, 6088 + "codepoint": "1f446_1f3fd", 6089 + "unsupported_families": [], 6090 + "categories": [ 6091 + "Smileys and emotions" 6092 + ], 6093 + "tags": [ 6094 + ":point-up:" 6095 + ], 6096 + "sizes_px": [] 6097 + }, 6098 + { 6099 + "name": "emoji_u1f446_1f3fe", 6100 + "version": 1, 6101 + "popularity": 293, 6102 + "codepoint": "1f446_1f3fe", 6103 + "unsupported_families": [], 6104 + "categories": [ 6105 + "Smileys and emotions" 6106 + ], 6107 + "tags": [ 6108 + ":point-up:" 6109 + ], 6110 + "sizes_px": [] 6111 + }, 6112 + { 6113 + "name": "emoji_u1f446_1f3ff", 6114 + "version": 1, 6115 + "popularity": 292, 6116 + "codepoint": "1f446_1f3ff", 6117 + "unsupported_families": [], 6118 + "categories": [ 6119 + "Smileys and emotions" 6120 + ], 6121 + "tags": [ 6122 + ":point-up:" 6123 + ], 6124 + "sizes_px": [] 6125 + }, 6126 + { 6127 + "name": "emoji_u1f447", 6128 + "version": 1, 6129 + "popularity": 291, 6130 + "codepoint": "1f447", 6131 + "unsupported_families": [], 6132 + "categories": [ 6133 + "Smileys and emotions" 6134 + ], 6135 + "tags": [ 6136 + ":point-down:" 6137 + ], 6138 + "sizes_px": [] 6139 + }, 6140 + { 6141 + "name": "emoji_u1f447_1f3fb", 6142 + "version": 1, 6143 + "popularity": 290, 6144 + "codepoint": "1f447_1f3fb", 6145 + "unsupported_families": [], 6146 + "categories": [ 6147 + "Smileys and emotions" 6148 + ], 6149 + "tags": [ 6150 + ":point-down:" 6151 + ], 6152 + "sizes_px": [] 6153 + }, 6154 + { 6155 + "name": "emoji_u1f447_1f3fc", 6156 + "version": 1, 6157 + "popularity": 289, 6158 + "codepoint": "1f447_1f3fc", 6159 + "unsupported_families": [], 6160 + "categories": [ 6161 + "Smileys and emotions" 6162 + ], 6163 + "tags": [ 6164 + ":point-down:" 6165 + ], 6166 + "sizes_px": [] 6167 + }, 6168 + { 6169 + "name": "emoji_u1f447_1f3fd", 6170 + "version": 1, 6171 + "popularity": 288, 6172 + "codepoint": "1f447_1f3fd", 6173 + "unsupported_families": [], 6174 + "categories": [ 6175 + "Smileys and emotions" 6176 + ], 6177 + "tags": [ 6178 + ":point-down:" 6179 + ], 6180 + "sizes_px": [] 6181 + }, 6182 + { 6183 + "name": "emoji_u1f447_1f3fe", 6184 + "version": 1, 6185 + "popularity": 287, 6186 + "codepoint": "1f447_1f3fe", 6187 + "unsupported_families": [], 6188 + "categories": [ 6189 + "Smileys and emotions" 6190 + ], 6191 + "tags": [ 6192 + ":point-down:" 6193 + ], 6194 + "sizes_px": [] 6195 + }, 6196 + { 6197 + "name": "emoji_u1f447_1f3ff", 6198 + "version": 1, 6199 + "popularity": 286, 6200 + "codepoint": "1f447_1f3ff", 6201 + "unsupported_families": [], 6202 + "categories": [ 6203 + "Smileys and emotions" 6204 + ], 6205 + "tags": [ 6206 + ":point-down:" 6207 + ], 6208 + "sizes_px": [] 6209 + }, 6210 + { 6211 + "name": "emoji_u1f595", 6212 + "version": 1, 6213 + "popularity": 285, 6214 + "codepoint": "1f595", 6215 + "unsupported_families": [], 6216 + "categories": [ 6217 + "Smileys and emotions" 6218 + ], 6219 + "tags": [ 6220 + ":middle-finger:" 6221 + ], 6222 + "sizes_px": [] 6223 + }, 6224 + { 6225 + "name": "emoji_u1f595_1f3fb", 6226 + "version": 1, 6227 + "popularity": 284, 6228 + "codepoint": "1f595_1f3fb", 6229 + "unsupported_families": [], 6230 + "categories": [ 6231 + "Smileys and emotions" 6232 + ], 6233 + "tags": [ 6234 + ":middle-finger:" 6235 + ], 6236 + "sizes_px": [] 6237 + }, 6238 + { 6239 + "name": "emoji_u1f595_1f3fc", 6240 + "version": 1, 6241 + "popularity": 283, 6242 + "codepoint": "1f595_1f3fc", 6243 + "unsupported_families": [], 6244 + "categories": [ 6245 + "Smileys and emotions" 6246 + ], 6247 + "tags": [ 6248 + ":middle-finger:" 6249 + ], 6250 + "sizes_px": [] 6251 + }, 6252 + { 6253 + "name": "emoji_u1f595_1f3fd", 6254 + "version": 1, 6255 + "popularity": 282, 6256 + "codepoint": "1f595_1f3fd", 6257 + "unsupported_families": [], 6258 + "categories": [ 6259 + "Smileys and emotions" 6260 + ], 6261 + "tags": [ 6262 + ":middle-finger:" 6263 + ], 6264 + "sizes_px": [] 6265 + }, 6266 + { 6267 + "name": "emoji_u1f595_1f3fe", 6268 + "version": 1, 6269 + "popularity": 281, 6270 + "codepoint": "1f595_1f3fe", 6271 + "unsupported_families": [], 6272 + "categories": [ 6273 + "Smileys and emotions" 6274 + ], 6275 + "tags": [ 6276 + ":middle-finger:" 6277 + ], 6278 + "sizes_px": [] 6279 + }, 6280 + { 6281 + "name": "emoji_u1f595_1f3ff", 6282 + "version": 1, 6283 + "popularity": 280, 6284 + "codepoint": "1f595_1f3ff", 6285 + "unsupported_families": [], 6286 + "categories": [ 6287 + "Smileys and emotions" 6288 + ], 6289 + "tags": [ 6290 + ":middle-finger:" 6291 + ], 6292 + "sizes_px": [] 6293 + }, 6294 + { 6295 + "name": "emoji_u270d_fe0f", 6296 + "version": 1, 6297 + "popularity": 279, 6298 + "codepoint": "270d_fe0f", 6299 + "unsupported_families": [], 6300 + "categories": [ 6301 + "Smileys and emotions" 6302 + ], 6303 + "tags": [ 6304 + ":writing-hand:" 6305 + ], 6306 + "sizes_px": [] 6307 + }, 6308 + { 6309 + "name": "emoji_u270d_1f3fb", 6310 + "version": 1, 6311 + "popularity": 278, 6312 + "codepoint": "270d_1f3fb", 6313 + "unsupported_families": [], 6314 + "categories": [ 6315 + "Smileys and emotions" 6316 + ], 6317 + "tags": [ 6318 + ":writing-hand:" 6319 + ], 6320 + "sizes_px": [] 6321 + }, 6322 + { 6323 + "name": "emoji_u270d_1f3fc", 6324 + "version": 1, 6325 + "popularity": 277, 6326 + "codepoint": "270d_1f3fc", 6327 + "unsupported_families": [], 6328 + "categories": [ 6329 + "Smileys and emotions" 6330 + ], 6331 + "tags": [ 6332 + ":writing-hand:" 6333 + ], 6334 + "sizes_px": [] 6335 + }, 6336 + { 6337 + "name": "emoji_u270d_1f3fd", 6338 + "version": 1, 6339 + "popularity": 276, 6340 + "codepoint": "270d_1f3fd", 6341 + "unsupported_families": [], 6342 + "categories": [ 6343 + "Smileys and emotions" 6344 + ], 6345 + "tags": [ 6346 + ":writing-hand:" 6347 + ], 6348 + "sizes_px": [] 6349 + }, 6350 + { 6351 + "name": "emoji_u270d_1f3fe", 6352 + "version": 1, 6353 + "popularity": 275, 6354 + "codepoint": "270d_1f3fe", 6355 + "unsupported_families": [], 6356 + "categories": [ 6357 + "Smileys and emotions" 6358 + ], 6359 + "tags": [ 6360 + ":writing-hand:" 6361 + ], 6362 + "sizes_px": [] 6363 + }, 6364 + { 6365 + "name": "emoji_u270d_1f3ff", 6366 + "version": 1, 6367 + "popularity": 274, 6368 + "codepoint": "270d_1f3ff", 6369 + "unsupported_families": [], 6370 + "categories": [ 6371 + "Smileys and emotions" 6372 + ], 6373 + "tags": [ 6374 + ":writing-hand:" 6375 + ], 6376 + "sizes_px": [] 6377 + }, 6378 + { 6379 + "name": "emoji_u1f933", 6380 + "version": 1, 6381 + "popularity": 273, 6382 + "codepoint": "1f933", 6383 + "unsupported_families": [], 6384 + "categories": [ 6385 + "Smileys and emotions" 6386 + ], 6387 + "tags": [ 6388 + ":selfie:" 6389 + ], 6390 + "sizes_px": [] 6391 + }, 6392 + { 6393 + "name": "emoji_u1f933_1f3fb", 6394 + "version": 1, 6395 + "popularity": 272, 6396 + "codepoint": "1f933_1f3fb", 6397 + "unsupported_families": [], 6398 + "categories": [ 6399 + "Smileys and emotions" 6400 + ], 6401 + "tags": [ 6402 + ":selfie:" 6403 + ], 6404 + "sizes_px": [] 6405 + }, 6406 + { 6407 + "name": "emoji_u1f933_1f3fc", 6408 + "version": 1, 6409 + "popularity": 271, 6410 + "codepoint": "1f933_1f3fc", 6411 + "unsupported_families": [], 6412 + "categories": [ 6413 + "Smileys and emotions" 6414 + ], 6415 + "tags": [ 6416 + ":selfie:" 6417 + ], 6418 + "sizes_px": [] 6419 + }, 6420 + { 6421 + "name": "emoji_u1f933_1f3fd", 6422 + "version": 1, 6423 + "popularity": 270, 6424 + "codepoint": "1f933_1f3fd", 6425 + "unsupported_families": [], 6426 + "categories": [ 6427 + "Smileys and emotions" 6428 + ], 6429 + "tags": [ 6430 + ":selfie:" 6431 + ], 6432 + "sizes_px": [] 6433 + }, 6434 + { 6435 + "name": "emoji_u1f933_1f3fe", 6436 + "version": 1, 6437 + "popularity": 269, 6438 + "codepoint": "1f933_1f3fe", 6439 + "unsupported_families": [], 6440 + "categories": [ 6441 + "Smileys and emotions" 6442 + ], 6443 + "tags": [ 6444 + ":selfie:" 6445 + ], 6446 + "sizes_px": [] 6447 + }, 6448 + { 6449 + "name": "emoji_u1f933_1f3ff", 6450 + "version": 1, 6451 + "popularity": 268, 6452 + "codepoint": "1f933_1f3ff", 6453 + "unsupported_families": [], 6454 + "categories": [ 6455 + "Smileys and emotions" 6456 + ], 6457 + "tags": [ 6458 + ":selfie:" 6459 + ], 6460 + "sizes_px": [] 6461 + }, 6462 + { 6463 + "name": "emoji_u1f64f", 6464 + "version": 1, 6465 + "popularity": 267, 6466 + "codepoint": "1f64f", 6467 + "unsupported_families": [], 6468 + "categories": [ 6469 + "Smileys and emotions" 6470 + ], 6471 + "tags": [ 6472 + ":folded-hands:", 6473 + ":please:", 6474 + ":pray:", 6475 + ":hope:", 6476 + ":wish:", 6477 + ":thank-you:", 6478 + ":high-five:" 6479 + ], 6480 + "sizes_px": [] 6481 + }, 6482 + { 6483 + "name": "emoji_u1f64f_1f3fb", 6484 + "version": 1, 6485 + "popularity": 266, 6486 + "codepoint": "1f64f_1f3fb", 6487 + "unsupported_families": [], 6488 + "categories": [ 6489 + "Smileys and emotions" 6490 + ], 6491 + "tags": [ 6492 + ":folded-hands:", 6493 + ":please:", 6494 + ":pray:", 6495 + ":hope:", 6496 + ":wish:", 6497 + ":thank-you:", 6498 + ":high-five:" 6499 + ], 6500 + "sizes_px": [] 6501 + }, 6502 + { 6503 + "name": "emoji_u1f64f_1f3fc", 6504 + "version": 1, 6505 + "popularity": 265, 6506 + "codepoint": "1f64f_1f3fc", 6507 + "unsupported_families": [], 6508 + "categories": [ 6509 + "Smileys and emotions" 6510 + ], 6511 + "tags": [ 6512 + ":folded-hands:", 6513 + ":please:", 6514 + ":pray:", 6515 + ":hope:", 6516 + ":wish:", 6517 + ":thank-you:", 6518 + ":high-five:" 6519 + ], 6520 + "sizes_px": [] 6521 + }, 6522 + { 6523 + "name": "emoji_u1f64f_1f3fd", 6524 + "version": 1, 6525 + "popularity": 264, 6526 + "codepoint": "1f64f_1f3fd", 6527 + "unsupported_families": [], 6528 + "categories": [ 6529 + "Smileys and emotions" 6530 + ], 6531 + "tags": [ 6532 + ":folded-hands:", 6533 + ":please:", 6534 + ":pray:", 6535 + ":hope:", 6536 + ":wish:", 6537 + ":thank-you:", 6538 + ":high-five:" 6539 + ], 6540 + "sizes_px": [] 6541 + }, 6542 + { 6543 + "name": "emoji_u1f64f_1f3fe", 6544 + "version": 1, 6545 + "popularity": 263, 6546 + "codepoint": "1f64f_1f3fe", 6547 + "unsupported_families": [], 6548 + "categories": [ 6549 + "Smileys and emotions" 6550 + ], 6551 + "tags": [ 6552 + ":folded-hands:", 6553 + ":please:", 6554 + ":pray:", 6555 + ":hope:", 6556 + ":wish:", 6557 + ":thank-you:", 6558 + ":high-five:" 6559 + ], 6560 + "sizes_px": [] 6561 + }, 6562 + { 6563 + "name": "emoji_u1f64f_1f3ff", 6564 + "version": 1, 6565 + "popularity": 262, 6566 + "codepoint": "1f64f_1f3ff", 6567 + "unsupported_families": [], 6568 + "categories": [ 6569 + "Smileys and emotions" 6570 + ], 6571 + "tags": [ 6572 + ":folded-hands:", 6573 + ":please:", 6574 + ":pray:", 6575 + ":hope:", 6576 + ":wish:", 6577 + ":thank-you:", 6578 + ":high-five:" 6579 + ], 6580 + "sizes_px": [] 6581 + }, 6582 + { 6583 + "name": "emoji_u1f485", 6584 + "version": 1, 6585 + "popularity": 261, 6586 + "codepoint": "1f485", 6587 + "unsupported_families": [], 6588 + "categories": [ 6589 + "Smileys and emotions" 6590 + ], 6591 + "tags": [ 6592 + ":nail-care:" 6593 + ], 6594 + "sizes_px": [] 6595 + }, 6596 + { 6597 + "name": "emoji_u1f485_1f3fb", 6598 + "version": 1, 6599 + "popularity": 260, 6600 + "codepoint": "1f485_1f3fb", 6601 + "unsupported_families": [], 6602 + "categories": [ 6603 + "Smileys and emotions" 6604 + ], 6605 + "tags": [ 6606 + ":nail-care:" 6607 + ], 6608 + "sizes_px": [] 6609 + }, 6610 + { 6611 + "name": "emoji_u1f485_1f3fc", 6612 + "version": 1, 6613 + "popularity": 259, 6614 + "codepoint": "1f485_1f3fc", 6615 + "unsupported_families": [], 6616 + "categories": [ 6617 + "Smileys and emotions" 6618 + ], 6619 + "tags": [ 6620 + ":nail-care:" 6621 + ], 6622 + "sizes_px": [] 6623 + }, 6624 + { 6625 + "name": "emoji_u1f485_1f3fd", 6626 + "version": 1, 6627 + "popularity": 258, 6628 + "codepoint": "1f485_1f3fd", 6629 + "unsupported_families": [], 6630 + "categories": [ 6631 + "Smileys and emotions" 6632 + ], 6633 + "tags": [ 6634 + ":nail-care:" 6635 + ], 6636 + "sizes_px": [] 6637 + }, 6638 + { 6639 + "name": "emoji_u1f485_1f3fe", 6640 + "version": 1, 6641 + "popularity": 257, 6642 + "codepoint": "1f485_1f3fe", 6643 + "unsupported_families": [], 6644 + "categories": [ 6645 + "Smileys and emotions" 6646 + ], 6647 + "tags": [ 6648 + ":nail-care:" 6649 + ], 6650 + "sizes_px": [] 6651 + }, 6652 + { 6653 + "name": "emoji_u1f485_1f3ff", 6654 + "version": 1, 6655 + "popularity": 256, 6656 + "codepoint": "1f485_1f3ff", 6657 + "unsupported_families": [], 6658 + "categories": [ 6659 + "Smileys and emotions" 6660 + ], 6661 + "tags": [ 6662 + ":nail-care:" 6663 + ], 6664 + "sizes_px": [] 6665 + }, 6666 + { 6667 + "name": "emoji_u1f91d", 6668 + "version": 1, 6669 + "popularity": 255, 6670 + "codepoint": "1f91d", 6671 + "unsupported_families": [], 6672 + "categories": [ 6673 + "Smileys and emotions" 6674 + ], 6675 + "tags": [ 6676 + ":handshake:" 6677 + ], 6678 + "sizes_px": [] 6679 + }, 6680 + { 6681 + "name": "emoji_u1f91d_1f3fb", 6682 + "version": 1, 6683 + "popularity": 254, 6684 + "codepoint": "1f91d_1f3fb", 6685 + "unsupported_families": [], 6686 + "categories": [ 6687 + "Smileys and emotions" 6688 + ], 6689 + "tags": [ 6690 + ":handshake:" 6691 + ], 6692 + "sizes_px": [] 6693 + }, 6694 + { 6695 + "name": "emoji_u1faf1_1f3fb_200d_1faf2_1f3fc", 6696 + "version": 1, 6697 + "popularity": 253, 6698 + "codepoint": "1faf1_1f3fb_200d_1faf2_1f3fc", 6699 + "unsupported_families": [], 6700 + "categories": [ 6701 + "Smileys and emotions" 6702 + ], 6703 + "tags": [ 6704 + ":handshake:" 6705 + ], 6706 + "sizes_px": [] 6707 + }, 6708 + { 6709 + "name": "emoji_u1faf1_1f3fb_200d_1faf2_1f3fd", 6710 + "version": 1, 6711 + "popularity": 252, 6712 + "codepoint": "1faf1_1f3fb_200d_1faf2_1f3fd", 6713 + "unsupported_families": [], 6714 + "categories": [ 6715 + "Smileys and emotions" 6716 + ], 6717 + "tags": [ 6718 + ":handshake:" 6719 + ], 6720 + "sizes_px": [] 6721 + }, 6722 + { 6723 + "name": "emoji_u1faf1_1f3fb_200d_1faf2_1f3fe", 6724 + "version": 1, 6725 + "popularity": 251, 6726 + "codepoint": "1faf1_1f3fb_200d_1faf2_1f3fe", 6727 + "unsupported_families": [], 6728 + "categories": [ 6729 + "Smileys and emotions" 6730 + ], 6731 + "tags": [ 6732 + ":handshake:" 6733 + ], 6734 + "sizes_px": [] 6735 + }, 6736 + { 6737 + "name": "emoji_u1faf1_1f3fb_200d_1faf2_1f3ff", 6738 + "version": 1, 6739 + "popularity": 250, 6740 + "codepoint": "1faf1_1f3fb_200d_1faf2_1f3ff", 6741 + "unsupported_families": [], 6742 + "categories": [ 6743 + "Smileys and emotions" 6744 + ], 6745 + "tags": [ 6746 + ":handshake:" 6747 + ], 6748 + "sizes_px": [] 6749 + }, 6750 + { 6751 + "name": "emoji_u1faf1_1f3fc_200d_1faf2_1f3fb", 6752 + "version": 1, 6753 + "popularity": 249, 6754 + "codepoint": "1faf1_1f3fc_200d_1faf2_1f3fb", 6755 + "unsupported_families": [], 6756 + "categories": [ 6757 + "Smileys and emotions" 6758 + ], 6759 + "tags": [ 6760 + ":handshake:" 6761 + ], 6762 + "sizes_px": [] 6763 + }, 6764 + { 6765 + "name": "emoji_u1f91d_1f3fc", 6766 + "version": 1, 6767 + "popularity": 248, 6768 + "codepoint": "1f91d_1f3fc", 6769 + "unsupported_families": [], 6770 + "categories": [ 6771 + "Smileys and emotions" 6772 + ], 6773 + "tags": [ 6774 + ":handshake:" 6775 + ], 6776 + "sizes_px": [] 6777 + }, 6778 + { 6779 + "name": "emoji_u1faf1_1f3fc_200d_1faf2_1f3fd", 6780 + "version": 1, 6781 + "popularity": 247, 6782 + "codepoint": "1faf1_1f3fc_200d_1faf2_1f3fd", 6783 + "unsupported_families": [], 6784 + "categories": [ 6785 + "Smileys and emotions" 6786 + ], 6787 + "tags": [ 6788 + ":handshake:" 6789 + ], 6790 + "sizes_px": [] 6791 + }, 6792 + { 6793 + "name": "emoji_u1faf1_1f3fc_200d_1faf2_1f3fe", 6794 + "version": 1, 6795 + "popularity": 246, 6796 + "codepoint": "1faf1_1f3fc_200d_1faf2_1f3fe", 6797 + "unsupported_families": [], 6798 + "categories": [ 6799 + "Smileys and emotions" 6800 + ], 6801 + "tags": [ 6802 + ":handshake:" 6803 + ], 6804 + "sizes_px": [] 6805 + }, 6806 + { 6807 + "name": "emoji_u1faf1_1f3fc_200d_1faf2_1f3ff", 6808 + "version": 1, 6809 + "popularity": 245, 6810 + "codepoint": "1faf1_1f3fc_200d_1faf2_1f3ff", 6811 + "unsupported_families": [], 6812 + "categories": [ 6813 + "Smileys and emotions" 6814 + ], 6815 + "tags": [ 6816 + ":handshake:" 6817 + ], 6818 + "sizes_px": [] 6819 + }, 6820 + { 6821 + "name": "emoji_u1faf1_1f3fd_200d_1faf2_1f3fb", 6822 + "version": 1, 6823 + "popularity": 244, 6824 + "codepoint": "1faf1_1f3fd_200d_1faf2_1f3fb", 6825 + "unsupported_families": [], 6826 + "categories": [ 6827 + "Smileys and emotions" 6828 + ], 6829 + "tags": [ 6830 + ":handshake:" 6831 + ], 6832 + "sizes_px": [] 6833 + }, 6834 + { 6835 + "name": "emoji_u1faf1_1f3fd_200d_1faf2_1f3fc", 6836 + "version": 1, 6837 + "popularity": 243, 6838 + "codepoint": "1faf1_1f3fd_200d_1faf2_1f3fc", 6839 + "unsupported_families": [], 6840 + "categories": [ 6841 + "Smileys and emotions" 6842 + ], 6843 + "tags": [ 6844 + ":handshake:" 6845 + ], 6846 + "sizes_px": [] 6847 + }, 6848 + { 6849 + "name": "emoji_u1f91d_1f3fd", 6850 + "version": 1, 6851 + "popularity": 242, 6852 + "codepoint": "1f91d_1f3fd", 6853 + "unsupported_families": [], 6854 + "categories": [ 6855 + "Smileys and emotions" 6856 + ], 6857 + "tags": [ 6858 + ":handshake:" 6859 + ], 6860 + "sizes_px": [] 6861 + }, 6862 + { 6863 + "name": "emoji_u1faf1_1f3fd_200d_1faf2_1f3fe", 6864 + "version": 1, 6865 + "popularity": 241, 6866 + "codepoint": "1faf1_1f3fd_200d_1faf2_1f3fe", 6867 + "unsupported_families": [], 6868 + "categories": [ 6869 + "Smileys and emotions" 6870 + ], 6871 + "tags": [ 6872 + ":handshake:" 6873 + ], 6874 + "sizes_px": [] 6875 + }, 6876 + { 6877 + "name": "emoji_u1faf1_1f3fd_200d_1faf2_1f3ff", 6878 + "version": 1, 6879 + "popularity": 240, 6880 + "codepoint": "1faf1_1f3fd_200d_1faf2_1f3ff", 6881 + "unsupported_families": [], 6882 + "categories": [ 6883 + "Smileys and emotions" 6884 + ], 6885 + "tags": [ 6886 + ":handshake:" 6887 + ], 6888 + "sizes_px": [] 6889 + }, 6890 + { 6891 + "name": "emoji_u1faf1_1f3fe_200d_1faf2_1f3fb", 6892 + "version": 1, 6893 + "popularity": 239, 6894 + "codepoint": "1faf1_1f3fe_200d_1faf2_1f3fb", 6895 + "unsupported_families": [], 6896 + "categories": [ 6897 + "Smileys and emotions" 6898 + ], 6899 + "tags": [ 6900 + ":handshake:" 6901 + ], 6902 + "sizes_px": [] 6903 + }, 6904 + { 6905 + "name": "emoji_u1faf1_1f3fe_200d_1faf2_1f3fc", 6906 + "version": 1, 6907 + "popularity": 238, 6908 + "codepoint": "1faf1_1f3fe_200d_1faf2_1f3fc", 6909 + "unsupported_families": [], 6910 + "categories": [ 6911 + "Smileys and emotions" 6912 + ], 6913 + "tags": [ 6914 + ":handshake:" 6915 + ], 6916 + "sizes_px": [] 6917 + }, 6918 + { 6919 + "name": "emoji_u1faf1_1f3fe_200d_1faf2_1f3fd", 6920 + "version": 1, 6921 + "popularity": 237, 6922 + "codepoint": "1faf1_1f3fe_200d_1faf2_1f3fd", 6923 + "unsupported_families": [], 6924 + "categories": [ 6925 + "Smileys and emotions" 6926 + ], 6927 + "tags": [ 6928 + ":handshake:" 6929 + ], 6930 + "sizes_px": [] 6931 + }, 6932 + { 6933 + "name": "emoji_u1f91d_1f3fe", 6934 + "version": 1, 6935 + "popularity": 236, 6936 + "codepoint": "1f91d_1f3fe", 6937 + "unsupported_families": [], 6938 + "categories": [ 6939 + "Smileys and emotions" 6940 + ], 6941 + "tags": [ 6942 + ":handshake:" 6943 + ], 6944 + "sizes_px": [] 6945 + }, 6946 + { 6947 + "name": "emoji_u1faf1_1f3fe_200d_1faf2_1f3ff", 6948 + "version": 1, 6949 + "popularity": 235, 6950 + "codepoint": "1faf1_1f3fe_200d_1faf2_1f3ff", 6951 + "unsupported_families": [], 6952 + "categories": [ 6953 + "Smileys and emotions" 6954 + ], 6955 + "tags": [ 6956 + ":handshake:" 6957 + ], 6958 + "sizes_px": [] 6959 + }, 6960 + { 6961 + "name": "emoji_u1faf1_1f3ff_200d_1faf2_1f3fb", 6962 + "version": 1, 6963 + "popularity": 234, 6964 + "codepoint": "1faf1_1f3ff_200d_1faf2_1f3fb", 6965 + "unsupported_families": [], 6966 + "categories": [ 6967 + "Smileys and emotions" 6968 + ], 6969 + "tags": [ 6970 + ":handshake:" 6971 + ], 6972 + "sizes_px": [] 6973 + }, 6974 + { 6975 + "name": "emoji_u1faf1_1f3ff_200d_1faf2_1f3fc", 6976 + "version": 1, 6977 + "popularity": 233, 6978 + "codepoint": "1faf1_1f3ff_200d_1faf2_1f3fc", 6979 + "unsupported_families": [], 6980 + "categories": [ 6981 + "Smileys and emotions" 6982 + ], 6983 + "tags": [ 6984 + ":handshake:" 6985 + ], 6986 + "sizes_px": [] 6987 + }, 6988 + { 6989 + "name": "emoji_u1faf1_1f3ff_200d_1faf2_1f3fd", 6990 + "version": 1, 6991 + "popularity": 232, 6992 + "codepoint": "1faf1_1f3ff_200d_1faf2_1f3fd", 6993 + "unsupported_families": [], 6994 + "categories": [ 6995 + "Smileys and emotions" 6996 + ], 6997 + "tags": [ 6998 + ":handshake:" 6999 + ], 7000 + "sizes_px": [] 7001 + }, 7002 + { 7003 + "name": "emoji_u1faf1_1f3ff_200d_1faf2_1f3fe", 7004 + "version": 1, 7005 + "popularity": 231, 7006 + "codepoint": "1faf1_1f3ff_200d_1faf2_1f3fe", 7007 + "unsupported_families": [], 7008 + "categories": [ 7009 + "Smileys and emotions" 7010 + ], 7011 + "tags": [ 7012 + ":handshake:" 7013 + ], 7014 + "sizes_px": [] 7015 + }, 7016 + { 7017 + "name": "emoji_u1f91d_1f3ff", 7018 + "version": 1, 7019 + "popularity": 230, 7020 + "codepoint": "1f91d_1f3ff", 7021 + "unsupported_families": [], 7022 + "categories": [ 7023 + "Smileys and emotions" 7024 + ], 7025 + "tags": [ 7026 + ":handshake:" 7027 + ], 7028 + "sizes_px": [] 7029 + }, 7030 + { 7031 + "name": "emoji_u1f483", 7032 + "version": 1, 7033 + "popularity": 229, 7034 + "codepoint": "1f483", 7035 + "unsupported_families": [], 7036 + "categories": [ 7037 + "People" 7038 + ], 7039 + "tags": [ 7040 + ":dancer-woman:" 7041 + ], 7042 + "sizes_px": [] 7043 + }, 7044 + { 7045 + "name": "emoji_u1f483_1f3fb", 7046 + "version": 1, 7047 + "popularity": 228, 7048 + "codepoint": "1f483_1f3fb", 7049 + "unsupported_families": [], 7050 + "categories": [ 7051 + "People" 7052 + ], 7053 + "tags": [ 7054 + ":dancer-woman:" 7055 + ], 7056 + "sizes_px": [] 7057 + }, 7058 + { 7059 + "name": "emoji_u1f483_1f3fc", 7060 + "version": 1, 7061 + "popularity": 227, 7062 + "codepoint": "1f483_1f3fc", 7063 + "unsupported_families": [], 7064 + "categories": [ 7065 + "People" 7066 + ], 7067 + "tags": [ 7068 + ":dancer-woman:" 7069 + ], 7070 + "sizes_px": [] 7071 + }, 7072 + { 7073 + "name": "emoji_u1f483_1f3fd", 7074 + "version": 1, 7075 + "popularity": 226, 7076 + "codepoint": "1f483_1f3fd", 7077 + "unsupported_families": [], 7078 + "categories": [ 7079 + "People" 7080 + ], 7081 + "tags": [ 7082 + ":dancer-woman:" 7083 + ], 7084 + "sizes_px": [] 7085 + }, 7086 + { 7087 + "name": "emoji_u1f483_1f3fe", 7088 + "version": 1, 7089 + "popularity": 225, 7090 + "codepoint": "1f483_1f3fe", 7091 + "unsupported_families": [], 7092 + "categories": [ 7093 + "People" 7094 + ], 7095 + "tags": [ 7096 + ":dancer-woman:" 7097 + ], 7098 + "sizes_px": [] 7099 + }, 7100 + { 7101 + "name": "emoji_u1f483_1f3ff", 7102 + "version": 1, 7103 + "popularity": 224, 7104 + "codepoint": "1f483_1f3ff", 7105 + "unsupported_families": [], 7106 + "categories": [ 7107 + "People" 7108 + ], 7109 + "tags": [ 7110 + ":dancer-woman:" 7111 + ], 7112 + "sizes_px": [] 7113 + }, 7114 + { 7115 + "name": "emoji_u1f490", 7116 + "version": 1, 7117 + "popularity": 223, 7118 + "codepoint": "1f490", 7119 + "unsupported_families": [], 7120 + "categories": [ 7121 + "Animals and nature" 7122 + ], 7123 + "tags": [ 7124 + ":bouquet:", 7125 + ":flowers:" 7126 + ], 7127 + "sizes_px": [] 7128 + }, 7129 + { 7130 + "name": "emoji_u1f339", 7131 + "version": 1, 7132 + "popularity": 222, 7133 + "codepoint": "1f339", 7134 + "unsupported_families": [], 7135 + "categories": [ 7136 + "Animals and nature" 7137 + ], 7138 + "tags": [ 7139 + ":rose:" 7140 + ], 7141 + "sizes_px": [] 7142 + }, 7143 + { 7144 + "name": "emoji_u1f940", 7145 + "version": 1, 7146 + "popularity": 221, 7147 + "codepoint": "1f940", 7148 + "unsupported_families": [], 7149 + "categories": [ 7150 + "Animals and nature" 7151 + ], 7152 + "tags": [ 7153 + ":wilted-flower:" 7154 + ], 7155 + "sizes_px": [] 7156 + }, 7157 + { 7158 + "name": "emoji_u1f342", 7159 + "version": 1, 7160 + "popularity": 220, 7161 + "codepoint": "1f342", 7162 + "unsupported_families": [], 7163 + "categories": [ 7164 + "Animals and nature" 7165 + ], 7166 + "tags": [ 7167 + ":fallen-leaf:" 7168 + ], 7169 + "sizes_px": [] 7170 + }, 7171 + { 7172 + "name": "emoji_u1f331", 7173 + "version": 1, 7174 + "popularity": 219, 7175 + "codepoint": "1f331", 7176 + "unsupported_families": [], 7177 + "categories": [ 7178 + "Animals and nature" 7179 + ], 7180 + "tags": [ 7181 + ":plant:", 7182 + ":seed:" 7183 + ], 7184 + "sizes_px": [] 7185 + }, 7186 + { 7187 + "name": "emoji_u1f343", 7188 + "version": 1, 7189 + "popularity": 218, 7190 + "codepoint": "1f343", 7191 + "unsupported_families": [], 7192 + "categories": [ 7193 + "Animals and nature" 7194 + ], 7195 + "tags": [ 7196 + ":leaves:" 7197 + ], 7198 + "sizes_px": [] 7199 + }, 7200 + { 7201 + "name": "emoji_u1f340", 7202 + "version": 1, 7203 + "popularity": 217, 7204 + "codepoint": "1f340", 7205 + "unsupported_families": [], 7206 + "categories": [ 7207 + "Animals and nature" 7208 + ], 7209 + "tags": [ 7210 + ":luck:", 7211 + ":four-leaf-clover:" 7212 + ], 7213 + "sizes_px": [] 7214 + }, 7215 + { 7216 + "name": "emoji_u1fabe", 7217 + "version": 1, 7218 + "popularity": 216, 7219 + "codepoint": "1fabe", 7220 + "unsupported_families": [], 7221 + "categories": [ 7222 + "Animals and nature" 7223 + ], 7224 + "tags": [ 7225 + ":leafless-tree:" 7226 + ], 7227 + "sizes_px": [] 7228 + }, 7229 + { 7230 + "name": "emoji_u2744_fe0f", 7231 + "version": 1, 7232 + "popularity": 215, 7233 + "codepoint": "2744_fe0f", 7234 + "unsupported_families": [], 7235 + "categories": [ 7236 + "Animals and nature" 7237 + ], 7238 + "tags": [ 7239 + ":snowflake:", 7240 + ":winter:", 7241 + ":cold:" 7242 + ], 7243 + "sizes_px": [] 7244 + }, 7245 + { 7246 + "name": "emoji_u1f30b", 7247 + "version": 1, 7248 + "popularity": 214, 7249 + "codepoint": "1f30b", 7250 + "unsupported_families": [], 7251 + "categories": [ 7252 + "Animals and nature" 7253 + ], 7254 + "tags": [ 7255 + ":volcano:" 7256 + ], 7257 + "sizes_px": [] 7258 + }, 7259 + { 7260 + "name": "emoji_u1f305", 7261 + "version": 1, 7262 + "popularity": 213, 7263 + "codepoint": "1f305", 7264 + "unsupported_families": [], 7265 + "categories": [ 7266 + "Animals and nature" 7267 + ], 7268 + "tags": [ 7269 + ":sunrise:" 7270 + ], 7271 + "sizes_px": [] 7272 + }, 7273 + { 7274 + "name": "emoji_u1f304", 7275 + "version": 1, 7276 + "popularity": 212, 7277 + "codepoint": "1f304", 7278 + "unsupported_families": [], 7279 + "categories": [ 7280 + "Animals and nature" 7281 + ], 7282 + "tags": [ 7283 + ":sunrise-over-mountains:" 7284 + ], 7285 + "sizes_px": [] 7286 + }, 7287 + { 7288 + "name": "emoji_u1f308", 7289 + "version": 1, 7290 + "popularity": 211, 7291 + "codepoint": "1f308", 7292 + "unsupported_families": [], 7293 + "categories": [ 7294 + "Animals and nature" 7295 + ], 7296 + "tags": [ 7297 + ":rainbow:" 7298 + ], 7299 + "sizes_px": [] 7300 + }, 7301 + { 7302 + "name": "emoji_u1fae7", 7303 + "version": 1, 7304 + "popularity": 210, 7305 + "codepoint": "1fae7", 7306 + "unsupported_families": [], 7307 + "categories": [ 7308 + "Animals and nature" 7309 + ], 7310 + "tags": [ 7311 + ":bubbles:" 7312 + ], 7313 + "sizes_px": [] 7314 + }, 7315 + { 7316 + "name": "emoji_u1f30a", 7317 + "version": 1, 7318 + "popularity": 209, 7319 + "codepoint": "1f30a", 7320 + "unsupported_families": [], 7321 + "categories": [ 7322 + "Animals and nature" 7323 + ], 7324 + "tags": [ 7325 + ":ocean:" 7326 + ], 7327 + "sizes_px": [] 7328 + }, 7329 + { 7330 + "name": "emoji_u1f32c_fe0f", 7331 + "version": 1, 7332 + "popularity": 208, 7333 + "codepoint": "1f32c_fe0f", 7334 + "unsupported_families": [], 7335 + "categories": [ 7336 + "Animals and nature" 7337 + ], 7338 + "tags": [ 7339 + ":wind-face:" 7340 + ], 7341 + "sizes_px": [] 7342 + }, 7343 + { 7344 + "name": "emoji_u1f32a_fe0f", 7345 + "version": 1, 7346 + "popularity": 207, 7347 + "codepoint": "1f32a_fe0f", 7348 + "unsupported_families": [], 7349 + "categories": [ 7350 + "Animals and nature" 7351 + ], 7352 + "tags": [ 7353 + ":tornado:" 7354 + ], 7355 + "sizes_px": [] 7356 + }, 7357 + { 7358 + "name": "emoji_u1f4a7", 7359 + "version": 1, 7360 + "popularity": 206, 7361 + "codepoint": "1f4a7", 7362 + "unsupported_families": [], 7363 + "categories": [ 7364 + "Animals and nature" 7365 + ], 7366 + "tags": [ 7367 + ":droplet:" 7368 + ], 7369 + "sizes_px": [] 7370 + }, 7371 + { 7372 + "name": "emoji_u1f327_fe0f", 7373 + "version": 1, 7374 + "popularity": 205, 7375 + "codepoint": "1f327_fe0f", 7376 + "unsupported_families": [], 7377 + "categories": [ 7378 + "Animals and nature" 7379 + ], 7380 + "tags": [ 7381 + ":rain-cloud:" 7382 + ], 7383 + "sizes_px": [] 7384 + }, 7385 + { 7386 + "name": "emoji_u1f329_fe0f", 7387 + "version": 1, 7388 + "popularity": 204, 7389 + "codepoint": "1f329_fe0f", 7390 + "unsupported_families": [], 7391 + "categories": [ 7392 + "Animals and nature" 7393 + ], 7394 + "tags": [ 7395 + ":cloud-with-lightning:" 7396 + ], 7397 + "sizes_px": [] 7398 + }, 7399 + { 7400 + "name": "emoji_u1f30d", 7401 + "version": 1, 7402 + "popularity": 203, 7403 + "codepoint": "1f30d", 7404 + "unsupported_families": [], 7405 + "categories": [ 7406 + "Animals and nature" 7407 + ], 7408 + "tags": [ 7409 + ":globe-showing-Europe-Africa:" 7410 + ], 7411 + "sizes_px": [] 7412 + }, 7413 + { 7414 + "name": "emoji_u1f30e", 7415 + "version": 1, 7416 + "popularity": 202, 7417 + "codepoint": "1f30e", 7418 + "unsupported_families": [], 7419 + "categories": [ 7420 + "Animals and nature" 7421 + ], 7422 + "tags": [ 7423 + ":globe-showing-Americas:" 7424 + ], 7425 + "sizes_px": [] 7426 + }, 7427 + { 7428 + "name": "emoji_u1f30f", 7429 + "version": 1, 7430 + "popularity": 201, 7431 + "codepoint": "1f30f", 7432 + "unsupported_families": [], 7433 + "categories": [ 7434 + "Animals and nature" 7435 + ], 7436 + "tags": [ 7437 + ":globe-showing-Asia-Australia:" 7438 + ], 7439 + "sizes_px": [] 7440 + }, 7441 + { 7442 + "name": "emoji_u2604_fe0f", 7443 + "version": 1, 7444 + "popularity": 200, 7445 + "codepoint": "2604_fe0f", 7446 + "unsupported_families": [], 7447 + "categories": [ 7448 + "Animals and nature" 7449 + ], 7450 + "tags": [ 7451 + ":comet:" 7452 + ], 7453 + "sizes_px": [] 7454 + }, 7455 + { 7456 + "name": "emoji_u1f42e", 7457 + "version": 1, 7458 + "popularity": 199, 7459 + "codepoint": "1f42e", 7460 + "unsupported_families": [], 7461 + "categories": [ 7462 + "Animals and nature" 7463 + ], 7464 + "tags": [ 7465 + ":cow-face:" 7466 + ], 7467 + "sizes_px": [] 7468 + }, 7469 + { 7470 + "name": "emoji_u1f984", 7471 + "version": 1, 7472 + "popularity": 198, 7473 + "codepoint": "1f984", 7474 + "unsupported_families": [], 7475 + "categories": [ 7476 + "Animals and nature" 7477 + ], 7478 + "tags": [ 7479 + ":unicorn:" 7480 + ], 7481 + "sizes_px": [] 7482 + }, 7483 + { 7484 + "name": "emoji_u1f98e", 7485 + "version": 1, 7486 + "popularity": 197, 7487 + "codepoint": "1f98e", 7488 + "unsupported_families": [], 7489 + "categories": [ 7490 + "Animals and nature" 7491 + ], 7492 + "tags": [ 7493 + ":lizard:" 7494 + ], 7495 + "sizes_px": [] 7496 + }, 7497 + { 7498 + "name": "emoji_u1f409", 7499 + "version": 1, 7500 + "popularity": 196, 7501 + "codepoint": "1f409", 7502 + "unsupported_families": [], 7503 + "categories": [ 7504 + "Animals and nature" 7505 + ], 7506 + "tags": [ 7507 + ":dragon:" 7508 + ], 7509 + "sizes_px": [] 7510 + }, 7511 + { 7512 + "name": "emoji_u1f996", 7513 + "version": 1, 7514 + "popularity": 195, 7515 + "codepoint": "1f996", 7516 + "unsupported_families": [], 7517 + "categories": [ 7518 + "Animals and nature" 7519 + ], 7520 + "tags": [ 7521 + ":t-rex:" 7522 + ], 7523 + "sizes_px": [] 7524 + }, 7525 + { 7526 + "name": "emoji_u1f995", 7527 + "version": 1, 7528 + "popularity": 194, 7529 + "codepoint": "1f995", 7530 + "unsupported_families": [], 7531 + "categories": [ 7532 + "Animals and nature" 7533 + ], 7534 + "tags": [ 7535 + ":dinosaur:" 7536 + ], 7537 + "sizes_px": [] 7538 + }, 7539 + { 7540 + "name": "emoji_u1f422", 7541 + "version": 1, 7542 + "popularity": 193, 7543 + "codepoint": "1f422", 7544 + "unsupported_families": [], 7545 + "categories": [ 7546 + "Animals and nature" 7547 + ], 7548 + "tags": [ 7549 + ":turtle:" 7550 + ], 7551 + "sizes_px": [] 7552 + }, 7553 + { 7554 + "name": "emoji_u1f40a", 7555 + "version": 1, 7556 + "popularity": 192, 7557 + "codepoint": "1f40a", 7558 + "unsupported_families": [], 7559 + "categories": [ 7560 + "Animals and nature" 7561 + ], 7562 + "tags": [ 7563 + ":crocodile:" 7564 + ], 7565 + "sizes_px": [] 7566 + }, 7567 + { 7568 + "name": "emoji_u1f40d", 7569 + "version": 1, 7570 + "popularity": 191, 7571 + "codepoint": "1f40d", 7572 + "unsupported_families": [], 7573 + "categories": [ 7574 + "Animals and nature" 7575 + ], 7576 + "tags": [ 7577 + ":snake:" 7578 + ], 7579 + "sizes_px": [] 7580 + }, 7581 + { 7582 + "name": "emoji_u1f438", 7583 + "version": 1, 7584 + "popularity": 190, 7585 + "codepoint": "1f438", 7586 + "unsupported_families": [], 7587 + "categories": [ 7588 + "Animals and nature" 7589 + ], 7590 + "tags": [ 7591 + ":frog:" 7592 + ], 7593 + "sizes_px": [] 7594 + }, 7595 + { 7596 + "name": "emoji_u1f407", 7597 + "version": 1, 7598 + "popularity": 189, 7599 + "codepoint": "1f407", 7600 + "unsupported_families": [], 7601 + "categories": [ 7602 + "Animals and nature" 7603 + ], 7604 + "tags": [ 7605 + ":rabbit:" 7606 + ], 7607 + "sizes_px": [] 7608 + }, 7609 + { 7610 + "name": "emoji_u1f400", 7611 + "version": 1, 7612 + "popularity": 188, 7613 + "codepoint": "1f400", 7614 + "unsupported_families": [], 7615 + "categories": [ 7616 + "Animals and nature" 7617 + ], 7618 + "tags": [ 7619 + ":rat:" 7620 + ], 7621 + "sizes_px": [] 7622 + }, 7623 + { 7624 + "name": "emoji_u1f429", 7625 + "version": 1, 7626 + "popularity": 187, 7627 + "codepoint": "1f429", 7628 + "unsupported_families": [], 7629 + "categories": [ 7630 + "Animals and nature" 7631 + ], 7632 + "tags": [ 7633 + ":poodle:" 7634 + ], 7635 + "sizes_px": [] 7636 + }, 7637 + { 7638 + "name": "emoji_u1f415", 7639 + "version": 1, 7640 + "popularity": 186, 7641 + "codepoint": "1f415", 7642 + "unsupported_families": [], 7643 + "categories": [ 7644 + "Animals and nature" 7645 + ], 7646 + "tags": [ 7647 + ":dog:" 7648 + ], 7649 + "sizes_px": [] 7650 + }, 7651 + { 7652 + "name": "emoji_u1f9ae", 7653 + "version": 1, 7654 + "popularity": 185, 7655 + "codepoint": "1f9ae", 7656 + "unsupported_families": [], 7657 + "categories": [ 7658 + "Animals and nature" 7659 + ], 7660 + "tags": [ 7661 + ":guide-dog:" 7662 + ], 7663 + "sizes_px": [] 7664 + }, 7665 + { 7666 + "name": "emoji_u1f415_200d_1f9ba", 7667 + "version": 1, 7668 + "popularity": 184, 7669 + "codepoint": "1f415_200d_1f9ba", 7670 + "unsupported_families": [], 7671 + "categories": [ 7672 + "Animals and nature" 7673 + ], 7674 + "tags": [ 7675 + ":service-dog:" 7676 + ], 7677 + "sizes_px": [] 7678 + }, 7679 + { 7680 + "name": "emoji_u1f416", 7681 + "version": 1, 7682 + "popularity": 183, 7683 + "codepoint": "1f416", 7684 + "unsupported_families": [], 7685 + "categories": [ 7686 + "Animals and nature" 7687 + ], 7688 + "tags": [ 7689 + ":pig:" 7690 + ], 7691 + "sizes_px": [] 7692 + }, 7693 + { 7694 + "name": "emoji_u1f40e", 7695 + "version": 1, 7696 + "popularity": 182, 7697 + "codepoint": "1f40e", 7698 + "unsupported_families": [], 7699 + "categories": [ 7700 + "Animals and nature" 7701 + ], 7702 + "tags": [ 7703 + ":racehorse:" 7704 + ], 7705 + "sizes_px": [] 7706 + }, 7707 + { 7708 + "name": "emoji_u1facf", 7709 + "version": 1, 7710 + "popularity": 181, 7711 + "codepoint": "1facf", 7712 + "unsupported_families": [], 7713 + "categories": [ 7714 + "Animals and nature" 7715 + ], 7716 + "tags": [ 7717 + ":donkey:" 7718 + ], 7719 + "sizes_px": [] 7720 + }, 7721 + { 7722 + "name": "emoji_u1f402", 7723 + "version": 1, 7724 + "popularity": 180, 7725 + "codepoint": "1f402", 7726 + "unsupported_families": [], 7727 + "categories": [ 7728 + "Animals and nature" 7729 + ], 7730 + "tags": [ 7731 + ":ox:" 7732 + ], 7733 + "sizes_px": [] 7734 + }, 7735 + { 7736 + "name": "emoji_u1f410", 7737 + "version": 1, 7738 + "popularity": 179, 7739 + "codepoint": "1f410", 7740 + "unsupported_families": [], 7741 + "categories": [ 7742 + "Animals and nature" 7743 + ], 7744 + "tags": [ 7745 + ":goat:" 7746 + ], 7747 + "sizes_px": [] 7748 + }, 7749 + { 7750 + "name": "emoji_u1f998", 7751 + "version": 1, 7752 + "popularity": 178, 7753 + "codepoint": "1f998", 7754 + "unsupported_families": [], 7755 + "categories": [ 7756 + "Animals and nature" 7757 + ], 7758 + "tags": [ 7759 + ":kangaroo:" 7760 + ], 7761 + "sizes_px": [] 7762 + }, 7763 + { 7764 + "name": "emoji_u1f405", 7765 + "version": 1, 7766 + "popularity": 177, 7767 + "codepoint": "1f405", 7768 + "unsupported_families": [], 7769 + "categories": [ 7770 + "Animals and nature" 7771 + ], 7772 + "tags": [ 7773 + ":tiger:" 7774 + ], 7775 + "sizes_px": [] 7776 + }, 7777 + { 7778 + "name": "emoji_u1f412", 7779 + "version": 1, 7780 + "popularity": 176, 7781 + "codepoint": "1f412", 7782 + "unsupported_families": [], 7783 + "categories": [ 7784 + "Animals and nature" 7785 + ], 7786 + "tags": [ 7787 + ":monkey:" 7788 + ], 7789 + "sizes_px": [] 7790 + }, 7791 + { 7792 + "name": "emoji_u1f98d", 7793 + "version": 1, 7794 + "popularity": 175, 7795 + "codepoint": "1f98d", 7796 + "unsupported_families": [], 7797 + "categories": [ 7798 + "Animals and nature" 7799 + ], 7800 + "tags": [ 7801 + ":gorilla:" 7802 + ], 7803 + "sizes_px": [] 7804 + }, 7805 + { 7806 + "name": "emoji_u1f9a7", 7807 + "version": 1, 7808 + "popularity": 174, 7809 + "codepoint": "1f9a7", 7810 + "unsupported_families": [], 7811 + "categories": [ 7812 + "Animals and nature" 7813 + ], 7814 + "tags": [ 7815 + ":orangutan:" 7816 + ], 7817 + "sizes_px": [] 7818 + }, 7819 + { 7820 + "name": "emoji_u1f43f_fe0f", 7821 + "version": 1, 7822 + "popularity": 173, 7823 + "codepoint": "1f43f_fe0f", 7824 + "unsupported_families": [], 7825 + "categories": [ 7826 + "Animals and nature" 7827 + ], 7828 + "tags": [ 7829 + ":chipmunk:" 7830 + ], 7831 + "sizes_px": [] 7832 + }, 7833 + { 7834 + "name": "emoji_u1f9a6", 7835 + "version": 1, 7836 + "popularity": 172, 7837 + "codepoint": "1f9a6", 7838 + "unsupported_families": [], 7839 + "categories": [ 7840 + "Animals and nature" 7841 + ], 7842 + "tags": [ 7843 + ":otter:" 7844 + ], 7845 + "sizes_px": [] 7846 + }, 7847 + { 7848 + "name": "emoji_u1f987", 7849 + "version": 1, 7850 + "popularity": 171, 7851 + "codepoint": "1f987", 7852 + "unsupported_families": [], 7853 + "categories": [ 7854 + "Animals and nature" 7855 + ], 7856 + "tags": [ 7857 + ":bat:" 7858 + ], 7859 + "sizes_px": [] 7860 + }, 7861 + { 7862 + "name": "emoji_u1f426", 7863 + "version": 1, 7864 + "popularity": 170, 7865 + "codepoint": "1f426", 7866 + "unsupported_families": [], 7867 + "categories": [ 7868 + "Animals and nature" 7869 + ], 7870 + "tags": [ 7871 + ":bird:" 7872 + ], 7873 + "sizes_px": [] 7874 + }, 7875 + { 7876 + "name": "emoji_u1f426_200d_2b1b", 7877 + "version": 1, 7878 + "popularity": 169, 7879 + "codepoint": "1f426_200d_2b1b", 7880 + "unsupported_families": [], 7881 + "categories": [ 7882 + "Animals and nature" 7883 + ], 7884 + "tags": [ 7885 + ":black-bird:" 7886 + ], 7887 + "sizes_px": [] 7888 + }, 7889 + { 7890 + "name": "emoji_u1f413", 7891 + "version": 1, 7892 + "popularity": 168, 7893 + "codepoint": "1f413", 7894 + "unsupported_families": [], 7895 + "categories": [ 7896 + "Animals and nature" 7897 + ], 7898 + "tags": [ 7899 + ":rooster:" 7900 + ], 7901 + "sizes_px": [] 7902 + }, 7903 + { 7904 + "name": "emoji_u1f423", 7905 + "version": 1, 7906 + "popularity": 167, 7907 + "codepoint": "1f423", 7908 + "unsupported_families": [], 7909 + "categories": [ 7910 + "Animals and nature" 7911 + ], 7912 + "tags": [ 7913 + ":hatching-chick:" 7914 + ], 7915 + "sizes_px": [] 7916 + }, 7917 + { 7918 + "name": "emoji_u1f424", 7919 + "version": 1, 7920 + "popularity": 166, 7921 + "codepoint": "1f424", 7922 + "unsupported_families": [], 7923 + "categories": [ 7924 + "Animals and nature" 7925 + ], 7926 + "tags": [ 7927 + ":baby-chick:" 7928 + ], 7929 + "sizes_px": [] 7930 + }, 7931 + { 7932 + "name": "emoji_u1f425", 7933 + "version": 1, 7934 + "popularity": 165, 7935 + "codepoint": "1f425", 7936 + "unsupported_families": [], 7937 + "categories": [ 7938 + "Animals and nature" 7939 + ], 7940 + "tags": [ 7941 + ":hatched-chick:" 7942 + ], 7943 + "sizes_px": [] 7944 + }, 7945 + { 7946 + "name": "emoji_u1f985", 7947 + "version": 1, 7948 + "popularity": 164, 7949 + "codepoint": "1f985", 7950 + "unsupported_families": [], 7951 + "categories": [ 7952 + "Animals and nature" 7953 + ], 7954 + "tags": [ 7955 + ":eagle:" 7956 + ], 7957 + "sizes_px": [] 7958 + }, 7959 + { 7960 + "name": "emoji_u1f989", 7961 + "version": 1, 7962 + "popularity": 163, 7963 + "codepoint": "1f989", 7964 + "unsupported_families": [], 7965 + "categories": [ 7966 + "Animals and nature" 7967 + ], 7968 + "tags": [ 7969 + ":owl:" 7970 + ], 7971 + "sizes_px": [] 7972 + }, 7973 + { 7974 + "name": "emoji_u1f54a_fe0f", 7975 + "version": 1, 7976 + "popularity": 162, 7977 + "codepoint": "1f54a_fe0f", 7978 + "unsupported_families": [], 7979 + "categories": [ 7980 + "Animals and nature" 7981 + ], 7982 + "tags": [ 7983 + ":peace:", 7984 + ":dove:" 7985 + ], 7986 + "sizes_px": [] 7987 + }, 7988 + { 7989 + "name": "emoji_u1fabf", 7990 + "version": 1, 7991 + "popularity": 161, 7992 + "codepoint": "1fabf", 7993 + "unsupported_families": [], 7994 + "categories": [ 7995 + "Animals and nature" 7996 + ], 7997 + "tags": [ 7998 + ":goose:" 7999 + ], 8000 + "sizes_px": [] 8001 + }, 8002 + { 8003 + "name": "emoji_u1f99a", 8004 + "version": 1, 8005 + "popularity": 160, 8006 + "codepoint": "1f99a", 8007 + "unsupported_families": [], 8008 + "categories": [ 8009 + "Animals and nature" 8010 + ], 8011 + "tags": [ 8012 + ":peacock:" 8013 + ], 8014 + "sizes_px": [] 8015 + }, 8016 + { 8017 + "name": "emoji_u1f426_200d_1f525", 8018 + "version": 1, 8019 + "popularity": 159, 8020 + "codepoint": "1f426_200d_1f525", 8021 + "unsupported_families": [], 8022 + "categories": [ 8023 + "Animals and nature" 8024 + ], 8025 + "tags": [ 8026 + ":phoenix:" 8027 + ], 8028 + "sizes_px": [] 8029 + }, 8030 + { 8031 + "name": "emoji_u1f9ad", 8032 + "version": 1, 8033 + "popularity": 158, 8034 + "codepoint": "1f9ad", 8035 + "unsupported_families": [], 8036 + "categories": [ 8037 + "Animals and nature" 8038 + ], 8039 + "tags": [ 8040 + ":seal:" 8041 + ], 8042 + "sizes_px": [] 8043 + }, 8044 + { 8045 + "name": "emoji_u1f988", 8046 + "version": 1, 8047 + "popularity": 157, 8048 + "codepoint": "1f988", 8049 + "unsupported_families": [], 8050 + "categories": [ 8051 + "Animals and nature" 8052 + ], 8053 + "tags": [ 8054 + ":shark:" 8055 + ], 8056 + "sizes_px": [] 8057 + }, 8058 + { 8059 + "name": "emoji_u1f42c", 8060 + "version": 1, 8061 + "popularity": 156, 8062 + "codepoint": "1f42c", 8063 + "unsupported_families": [], 8064 + "categories": [ 8065 + "Animals and nature" 8066 + ], 8067 + "tags": [ 8068 + ":dolphin:" 8069 + ], 8070 + "sizes_px": [] 8071 + }, 8072 + { 8073 + "name": "emoji_u1f433", 8074 + "version": 1, 8075 + "popularity": 155, 8076 + "codepoint": "1f433", 8077 + "unsupported_families": [], 8078 + "categories": [ 8079 + "Animals and nature" 8080 + ], 8081 + "tags": [ 8082 + ":whale:" 8083 + ], 8084 + "sizes_px": [] 8085 + }, 8086 + { 8087 + "name": "emoji_u1f41f", 8088 + "version": 1, 8089 + "popularity": 154, 8090 + "codepoint": "1f41f", 8091 + "unsupported_families": [], 8092 + "categories": [ 8093 + "Animals and nature" 8094 + ], 8095 + "tags": [ 8096 + ":fish:" 8097 + ], 8098 + "sizes_px": [] 8099 + }, 8100 + { 8101 + "name": "emoji_u1f421", 8102 + "version": 1, 8103 + "popularity": 153, 8104 + "codepoint": "1f421", 8105 + "unsupported_families": [], 8106 + "categories": [ 8107 + "Animals and nature" 8108 + ], 8109 + "tags": [ 8110 + ":blowfish:" 8111 + ], 8112 + "sizes_px": [] 8113 + }, 8114 + { 8115 + "name": "emoji_u1f99e", 8116 + "version": 1, 8117 + "popularity": 152, 8118 + "codepoint": "1f99e", 8119 + "unsupported_families": [], 8120 + "categories": [ 8121 + "Animals and nature" 8122 + ], 8123 + "tags": [ 8124 + ":lobster:" 8125 + ], 8126 + "sizes_px": [] 8127 + }, 8128 + { 8129 + "name": "emoji_u1f980", 8130 + "version": 1, 8131 + "popularity": 151, 8132 + "codepoint": "1f980", 8133 + "unsupported_families": [], 8134 + "categories": [ 8135 + "Animals and nature" 8136 + ], 8137 + "tags": [ 8138 + ":crab:" 8139 + ], 8140 + "sizes_px": [] 8141 + }, 8142 + { 8143 + "name": "emoji_u1f419", 8144 + "version": 1, 8145 + "popularity": 150, 8146 + "codepoint": "1f419", 8147 + "unsupported_families": [], 8148 + "categories": [ 8149 + "Animals and nature" 8150 + ], 8151 + "tags": [ 8152 + ":octopus:" 8153 + ], 8154 + "sizes_px": [] 8155 + }, 8156 + { 8157 + "name": "emoji_u1fabc", 8158 + "version": 1, 8159 + "popularity": 149, 8160 + "codepoint": "1fabc", 8161 + "unsupported_families": [], 8162 + "categories": [ 8163 + "Animals and nature" 8164 + ], 8165 + "tags": [ 8166 + ":jellyfish:" 8167 + ], 8168 + "sizes_px": [] 8169 + }, 8170 + { 8171 + "name": "emoji_u1f982", 8172 + "version": 1, 8173 + "popularity": 148, 8174 + "codepoint": "1f982", 8175 + "unsupported_families": [], 8176 + "categories": [ 8177 + "Animals and nature" 8178 + ], 8179 + "tags": [ 8180 + ":scorpion:" 8181 + ], 8182 + "sizes_px": [] 8183 + }, 8184 + { 8185 + "name": "emoji_u1f577_fe0f", 8186 + "version": 1, 8187 + "popularity": 147, 8188 + "codepoint": "1f577_fe0f", 8189 + "unsupported_families": [], 8190 + "categories": [ 8191 + "Animals and nature" 8192 + ], 8193 + "tags": [ 8194 + ":spider:" 8195 + ], 8196 + "sizes_px": [] 8197 + }, 8198 + { 8199 + "name": "emoji_u1f40c", 8200 + "version": 1, 8201 + "popularity": 146, 8202 + "codepoint": "1f40c", 8203 + "unsupported_families": [], 8204 + "categories": [ 8205 + "Animals and nature" 8206 + ], 8207 + "tags": [ 8208 + ":snail:" 8209 + ], 8210 + "sizes_px": [] 8211 + }, 8212 + { 8213 + "name": "emoji_u1f41c", 8214 + "version": 1, 8215 + "popularity": 145, 8216 + "codepoint": "1f41c", 8217 + "unsupported_families": [], 8218 + "categories": [ 8219 + "Animals and nature" 8220 + ], 8221 + "tags": [ 8222 + ":ant:" 8223 + ], 8224 + "sizes_px": [] 8225 + }, 8226 + { 8227 + "name": "emoji_u1f99f", 8228 + "version": 1, 8229 + "popularity": 144, 8230 + "codepoint": "1f99f", 8231 + "unsupported_families": [], 8232 + "categories": [ 8233 + "Animals and nature" 8234 + ], 8235 + "tags": [ 8236 + ":mosquito:" 8237 + ], 8238 + "sizes_px": [] 8239 + }, 8240 + { 8241 + "name": "emoji_u1fab3", 8242 + "version": 1, 8243 + "popularity": 143, 8244 + "codepoint": "1fab3", 8245 + "unsupported_families": [], 8246 + "categories": [ 8247 + "Animals and nature" 8248 + ], 8249 + "tags": [ 8250 + ":cockroach:" 8251 + ], 8252 + "sizes_px": [] 8253 + }, 8254 + { 8255 + "name": "emoji_u1fab0", 8256 + "version": 1, 8257 + "popularity": 142, 8258 + "codepoint": "1fab0", 8259 + "unsupported_families": [], 8260 + "categories": [ 8261 + "Animals and nature" 8262 + ], 8263 + "tags": [ 8264 + ":fly:" 8265 + ], 8266 + "sizes_px": [] 8267 + }, 8268 + { 8269 + "name": "emoji_u1f41d", 8270 + "version": 1, 8271 + "popularity": 141, 8272 + "codepoint": "1f41d", 8273 + "unsupported_families": [], 8274 + "categories": [ 8275 + "Animals and nature" 8276 + ], 8277 + "tags": [ 8278 + ":bee:" 8279 + ], 8280 + "sizes_px": [] 8281 + }, 8282 + { 8283 + "name": "emoji_u1f41e", 8284 + "version": 1, 8285 + "popularity": 140, 8286 + "codepoint": "1f41e", 8287 + "unsupported_families": [], 8288 + "categories": [ 8289 + "Animals and nature" 8290 + ], 8291 + "tags": [ 8292 + ":lady-bug:" 8293 + ], 8294 + "sizes_px": [] 8295 + }, 8296 + { 8297 + "name": "emoji_u1f98b", 8298 + "version": 1, 8299 + "popularity": 139, 8300 + "codepoint": "1f98b", 8301 + "unsupported_families": [], 8302 + "categories": [ 8303 + "Animals and nature" 8304 + ], 8305 + "tags": [ 8306 + ":butterfly:" 8307 + ], 8308 + "sizes_px": [] 8309 + }, 8310 + { 8311 + "name": "emoji_u1f41b", 8312 + "version": 1, 8313 + "popularity": 138, 8314 + "codepoint": "1f41b", 8315 + "unsupported_families": [], 8316 + "categories": [ 8317 + "Animals and nature" 8318 + ], 8319 + "tags": [ 8320 + ":bug:" 8321 + ], 8322 + "sizes_px": [] 8323 + }, 8324 + { 8325 + "name": "emoji_u1fab1", 8326 + "version": 1, 8327 + "popularity": 137, 8328 + "codepoint": "1fab1", 8329 + "unsupported_families": [], 8330 + "categories": [ 8331 + "Animals and nature" 8332 + ], 8333 + "tags": [ 8334 + ":worm:" 8335 + ], 8336 + "sizes_px": [] 8337 + }, 8338 + { 8339 + "name": "emoji_u1f43e", 8340 + "version": 1, 8341 + "popularity": 136, 8342 + "codepoint": "1f43e", 8343 + "unsupported_families": [], 8344 + "categories": [ 8345 + "Animals and nature" 8346 + ], 8347 + "tags": [ 8348 + ":paw prints:" 8349 + ], 8350 + "sizes_px": [] 8351 + }, 8352 + { 8353 + "name": "emoji_u1f345", 8354 + "version": 1, 8355 + "popularity": 135, 8356 + "codepoint": "1f345", 8357 + "unsupported_families": [], 8358 + "categories": [ 8359 + "Food and drink" 8360 + ], 8361 + "tags": [ 8362 + ":tomato:" 8363 + ], 8364 + "sizes_px": [] 8365 + }, 8366 + { 8367 + "name": "emoji_u1fadc", 8368 + "version": 1, 8369 + "popularity": 134, 8370 + "codepoint": "1fadc", 8371 + "unsupported_families": [], 8372 + "categories": [ 8373 + "Food and drink" 8374 + ], 8375 + "tags": [ 8376 + ":root-vegetable:", 8377 + ":beet:", 8378 + ":turnip:" 8379 + ], 8380 + "sizes_px": [] 8381 + }, 8382 + { 8383 + "name": "emoji_u1f373", 8384 + "version": 1, 8385 + "popularity": 133, 8386 + "codepoint": "1f373", 8387 + "unsupported_families": [], 8388 + "categories": [ 8389 + "Food and drink" 8390 + ], 8391 + "tags": [ 8392 + ":cooking:" 8393 + ], 8394 + "sizes_px": [] 8395 + }, 8396 + { 8397 + "name": "emoji_u1f32f", 8398 + "version": 1, 8399 + "popularity": 132, 8400 + "codepoint": "1f32f", 8401 + "unsupported_families": [], 8402 + "categories": [ 8403 + "Food and drink" 8404 + ], 8405 + "tags": [ 8406 + ":burrito:" 8407 + ], 8408 + "sizes_px": [] 8409 + }, 8410 + { 8411 + "name": "emoji_u1f35d", 8412 + "version": 1, 8413 + "popularity": 131, 8414 + "codepoint": "1f35d", 8415 + "unsupported_families": [], 8416 + "categories": [ 8417 + "Food and drink" 8418 + ], 8419 + "tags": [ 8420 + ":spaghetti:" 8421 + ], 8422 + "sizes_px": [] 8423 + }, 8424 + { 8425 + "name": "emoji_u1f35c", 8426 + "version": 1, 8427 + "popularity": 130, 8428 + "codepoint": "1f35c", 8429 + "unsupported_families": [], 8430 + "categories": [ 8431 + "Food and drink" 8432 + ], 8433 + "tags": [ 8434 + ":steaming-bowl:" 8435 + ], 8436 + "sizes_px": [] 8437 + }, 8438 + { 8439 + "name": "emoji_u1f37f", 8440 + "version": 1, 8441 + "popularity": 129, 8442 + "codepoint": "1f37f", 8443 + "unsupported_families": [], 8444 + "categories": [ 8445 + "Food and drink" 8446 + ], 8447 + "tags": [ 8448 + ":popcorn:" 8449 + ], 8450 + "sizes_px": [] 8451 + }, 8452 + { 8453 + "name": "emoji_u2615", 8454 + "version": 1, 8455 + "popularity": 128, 8456 + "codepoint": "2615", 8457 + "unsupported_families": [], 8458 + "categories": [ 8459 + "Food and drink" 8460 + ], 8461 + "tags": [ 8462 + ":hot-beverage:" 8463 + ], 8464 + "sizes_px": [] 8465 + }, 8466 + { 8467 + "name": "emoji_u1f37b", 8468 + "version": 1, 8469 + "popularity": 127, 8470 + "codepoint": "1f37b", 8471 + "unsupported_families": [], 8472 + "categories": [ 8473 + "Food and drink" 8474 + ], 8475 + "tags": [ 8476 + ":clinking-beer-mugs:" 8477 + ], 8478 + "sizes_px": [] 8479 + }, 8480 + { 8481 + "name": "emoji_u1f942", 8482 + "version": 1, 8483 + "popularity": 126, 8484 + "codepoint": "1f942", 8485 + "unsupported_families": [], 8486 + "categories": [ 8487 + "Food and drink" 8488 + ], 8489 + "tags": [ 8490 + ":clinking-glasses:" 8491 + ], 8492 + "sizes_px": [] 8493 + }, 8494 + { 8495 + "name": "emoji_u1f37e", 8496 + "version": 1, 8497 + "popularity": 125, 8498 + "codepoint": "1f37e", 8499 + "unsupported_families": [], 8500 + "categories": [ 8501 + "Food and drink" 8502 + ], 8503 + "tags": [ 8504 + ":bottle-with-popping-cork:" 8505 + ], 8506 + "sizes_px": [] 8507 + }, 8508 + { 8509 + "name": "emoji_u1f377", 8510 + "version": 1, 8511 + "popularity": 124, 8512 + "codepoint": "1f377", 8513 + "unsupported_families": [], 8514 + "categories": [ 8515 + "Food and drink" 8516 + ], 8517 + "tags": [ 8518 + ":wine-glass:" 8519 + ], 8520 + "sizes_px": [] 8521 + }, 8522 + { 8523 + "name": "emoji_u1fad7", 8524 + "version": 1, 8525 + "popularity": 123, 8526 + "codepoint": "1fad7", 8527 + "unsupported_families": [], 8528 + "categories": [ 8529 + "Food and drink" 8530 + ], 8531 + "tags": [ 8532 + ":pour:" 8533 + ], 8534 + "sizes_px": [] 8535 + }, 8536 + { 8537 + "name": "emoji_u1f379", 8538 + "version": 1, 8539 + "popularity": 122, 8540 + "codepoint": "1f379", 8541 + "unsupported_families": [], 8542 + "categories": [ 8543 + "Food and drink" 8544 + ], 8545 + "tags": [ 8546 + ":tropical-drink:" 8547 + ], 8548 + "sizes_px": [] 8549 + }, 8550 + { 8551 + "name": "emoji_u1f6a7", 8552 + "version": 1, 8553 + "popularity": 121, 8554 + "codepoint": "1f6a7", 8555 + "unsupported_families": [], 8556 + "categories": [ 8557 + "Travel and places" 8558 + ], 8559 + "tags": [ 8560 + ":construction:" 8561 + ], 8562 + "sizes_px": [] 8563 + }, 8564 + { 8565 + "name": "emoji_u1f6a8", 8566 + "version": 1, 8567 + "popularity": 120, 8568 + "codepoint": "1f6a8", 8569 + "unsupported_families": [], 8570 + "categories": [ 8571 + "Travel and places" 8572 + ], 8573 + "tags": [ 8574 + ":police-car-light:" 8575 + ], 8576 + "sizes_px": [] 8577 + }, 8578 + { 8579 + "name": "emoji_u1f6b2", 8580 + "version": 1, 8581 + "popularity": 119, 8582 + "codepoint": "1f6b2", 8583 + "unsupported_families": [], 8584 + "categories": [ 8585 + "Travel and places" 8586 + ], 8587 + "tags": [ 8588 + ":bicycle:" 8589 + ], 8590 + "sizes_px": [] 8591 + }, 8592 + { 8593 + "name": "emoji_u1f697", 8594 + "version": 1, 8595 + "popularity": 118, 8596 + "codepoint": "1f697", 8597 + "unsupported_families": [], 8598 + "categories": [ 8599 + "Travel and places" 8600 + ], 8601 + "tags": [ 8602 + ":automobile:" 8603 + ], 8604 + "sizes_px": [] 8605 + }, 8606 + { 8607 + "name": "emoji_u1f3ce_fe0f", 8608 + "version": 1, 8609 + "popularity": 117, 8610 + "codepoint": "1f3ce_fe0f", 8611 + "unsupported_families": [], 8612 + "categories": [ 8613 + "Travel and places" 8614 + ], 8615 + "tags": [ 8616 + ":racing-car:" 8617 + ], 8618 + "sizes_px": [] 8619 + }, 8620 + { 8621 + "name": "emoji_u1f695", 8622 + "version": 1, 8623 + "popularity": 116, 8624 + "codepoint": "1f695", 8625 + "unsupported_families": [], 8626 + "categories": [ 8627 + "Travel and places" 8628 + ], 8629 + "tags": [ 8630 + ":taxi:" 8631 + ], 8632 + "sizes_px": [] 8633 + }, 8634 + { 8635 + "name": "emoji_u1f68c", 8636 + "version": 1, 8637 + "popularity": 115, 8638 + "codepoint": "1f68c", 8639 + "unsupported_families": [], 8640 + "categories": [ 8641 + "Travel and places" 8642 + ], 8643 + "tags": [ 8644 + ":bus:" 8645 + ], 8646 + "sizes_px": [] 8647 + }, 8648 + { 8649 + "name": "emoji_u26f5", 8650 + "version": 1, 8651 + "popularity": 114, 8652 + "codepoint": "26f5", 8653 + "unsupported_families": [], 8654 + "categories": [ 8655 + "Travel and places" 8656 + ], 8657 + "tags": [ 8658 + ":sailboat:" 8659 + ], 8660 + "sizes_px": [] 8661 + }, 8662 + { 8663 + "name": "emoji_u1f6f6", 8664 + "version": 1, 8665 + "popularity": 113, 8666 + "codepoint": "1f6f6", 8667 + "unsupported_families": [], 8668 + "categories": [ 8669 + "Travel and places" 8670 + ], 8671 + "tags": [ 8672 + ":canoe:" 8673 + ], 8674 + "sizes_px": [] 8675 + }, 8676 + { 8677 + "name": "emoji_u1f6f8", 8678 + "version": 1, 8679 + "popularity": 112, 8680 + "codepoint": "1f6f8", 8681 + "unsupported_families": [], 8682 + "categories": [ 8683 + "Travel and places" 8684 + ], 8685 + "tags": [ 8686 + ":flying-saucer:" 8687 + ], 8688 + "sizes_px": [] 8689 + }, 8690 + { 8691 + "name": "emoji_u1f680", 8692 + "version": 1, 8693 + "popularity": 111, 8694 + "codepoint": "1f680", 8695 + "unsupported_families": [], 8696 + "categories": [ 8697 + "Travel and places" 8698 + ], 8699 + "tags": [ 8700 + ":rocket:" 8701 + ], 8702 + "sizes_px": [] 8703 + }, 8704 + { 8705 + "name": "emoji_u1f6eb", 8706 + "version": 1, 8707 + "popularity": 110, 8708 + "codepoint": "1f6eb", 8709 + "unsupported_families": [], 8710 + "categories": [ 8711 + "Travel and places" 8712 + ], 8713 + "tags": [ 8714 + ":airplane-departure:" 8715 + ], 8716 + "sizes_px": [] 8717 + }, 8718 + { 8719 + "name": "emoji_u1f6ec", 8720 + "version": 1, 8721 + "popularity": 109, 8722 + "codepoint": "1f6ec", 8723 + "unsupported_families": [], 8724 + "categories": [ 8725 + "Travel and places" 8726 + ], 8727 + "tags": [ 8728 + ":airplane-arrival:" 8729 + ], 8730 + "sizes_px": [] 8731 + }, 8732 + { 8733 + "name": "emoji_u1f3a2", 8734 + "version": 1, 8735 + "popularity": 108, 8736 + "codepoint": "1f3a2", 8737 + "unsupported_families": [], 8738 + "categories": [ 8739 + "Travel and places" 8740 + ], 8741 + "tags": [ 8742 + ":roller-coaster:" 8743 + ], 8744 + "sizes_px": [] 8745 + }, 8746 + { 8747 + "name": "emoji_u1f3a1", 8748 + "version": 1, 8749 + "popularity": 107, 8750 + "codepoint": "1f3a1", 8751 + "unsupported_families": [], 8752 + "categories": [ 8753 + "Travel and places" 8754 + ], 8755 + "tags": [ 8756 + ":ferris-wheel:" 8757 + ], 8758 + "sizes_px": [] 8759 + }, 8760 + { 8761 + "name": "emoji_u1f3d5_fe0f", 8762 + "version": 1, 8763 + "popularity": 106, 8764 + "codepoint": "1f3d5_fe0f", 8765 + "unsupported_families": [], 8766 + "categories": [ 8767 + "Travel and places" 8768 + ], 8769 + "tags": [ 8770 + ":camping:" 8771 + ], 8772 + "sizes_px": [] 8773 + }, 8774 + { 8775 + "name": "emoji_u1f388", 8776 + "version": 1, 8777 + "popularity": 105, 8778 + "codepoint": "1f388", 8779 + "unsupported_families": [], 8780 + "categories": [ 8781 + "Activities and events" 8782 + ], 8783 + "tags": [ 8784 + ":balloon:" 8785 + ], 8786 + "sizes_px": [] 8787 + }, 8788 + { 8789 + "name": "emoji_u1f382", 8790 + "version": 1, 8791 + "popularity": 104, 8792 + "codepoint": "1f382", 8793 + "unsupported_families": [], 8794 + "categories": [ 8795 + "Activities and events" 8796 + ], 8797 + "tags": [ 8798 + ":birthday-cake:" 8799 + ], 8800 + "sizes_px": [] 8801 + }, 8802 + { 8803 + "name": "emoji_u1f381", 8804 + "version": 1, 8805 + "popularity": 103, 8806 + "codepoint": "1f381", 8807 + "unsupported_families": [], 8808 + "categories": [ 8809 + "Activities and events" 8810 + ], 8811 + "tags": [ 8812 + ":wrapped-gift:" 8813 + ], 8814 + "sizes_px": [] 8815 + }, 8816 + { 8817 + "name": "emoji_u1f386", 8818 + "version": 1, 8819 + "popularity": 102, 8820 + "codepoint": "1f386", 8821 + "unsupported_families": [], 8822 + "categories": [ 8823 + "Activities and events" 8824 + ], 8825 + "tags": [ 8826 + ":fireworks:" 8827 + ], 8828 + "sizes_px": [] 8829 + }, 8830 + { 8831 + "name": "emoji_u1fa85", 8832 + "version": 1, 8833 + "popularity": 101, 8834 + "codepoint": "1fa85", 8835 + "unsupported_families": [], 8836 + "categories": [ 8837 + "Activities and events" 8838 + ], 8839 + "tags": [ 8840 + ":piñata:" 8841 + ], 8842 + "sizes_px": [] 8843 + }, 8844 + { 8845 + "name": "emoji_u1faa9", 8846 + "version": 1, 8847 + "popularity": 100, 8848 + "codepoint": "1faa9", 8849 + "unsupported_families": [], 8850 + "categories": [ 8851 + "Activities and events" 8852 + ], 8853 + "tags": [ 8854 + ":mirror-ball:", 8855 + ":disco-ball:" 8856 + ], 8857 + "sizes_px": [] 8858 + }, 8859 + { 8860 + "name": "emoji_u1f947", 8861 + "version": 1, 8862 + "popularity": 99, 8863 + "codepoint": "1f947", 8864 + "unsupported_families": [], 8865 + "categories": [ 8866 + "Activities and events" 8867 + ], 8868 + "tags": [ 8869 + ":gold-medal:", 8870 + ":1st-place-medal:" 8871 + ], 8872 + "sizes_px": [] 8873 + }, 8874 + { 8875 + "name": "emoji_u1f948", 8876 + "version": 1, 8877 + "popularity": 98, 8878 + "codepoint": "1f948", 8879 + "unsupported_families": [], 8880 + "categories": [ 8881 + "Activities and events" 8882 + ], 8883 + "tags": [ 8884 + ":silver-medal:", 8885 + ":2nd-place-medal:" 8886 + ], 8887 + "sizes_px": [] 8888 + }, 8889 + { 8890 + "name": "emoji_u1f949", 8891 + "version": 1, 8892 + "popularity": 97, 8893 + "codepoint": "1f949", 8894 + "unsupported_families": [], 8895 + "categories": [ 8896 + "Activities and events" 8897 + ], 8898 + "tags": [ 8899 + ":bronze-medal:", 8900 + ":3rd-place-medal:" 8901 + ], 8902 + "sizes_px": [] 8903 + }, 8904 + { 8905 + "name": "emoji_u1f3c6", 8906 + "version": 1, 8907 + "popularity": 96, 8908 + "codepoint": "1f3c6", 8909 + "unsupported_families": [], 8910 + "categories": [ 8911 + "Activities and events" 8912 + ], 8913 + "tags": [ 8914 + ":trophy:" 8915 + ], 8916 + "sizes_px": [] 8917 + }, 8918 + { 8919 + "name": "emoji_u26bd", 8920 + "version": 1, 8921 + "popularity": 95, 8922 + "codepoint": "26bd", 8923 + "unsupported_families": [], 8924 + "categories": [ 8925 + "Activities and events" 8926 + ], 8927 + "tags": [ 8928 + ":soccer-ball:" 8929 + ], 8930 + "sizes_px": [] 8931 + }, 8932 + { 8933 + "name": "emoji_u26be", 8934 + "version": 1, 8935 + "popularity": 94, 8936 + "codepoint": "26be", 8937 + "unsupported_families": [], 8938 + "categories": [ 8939 + "Activities and events" 8940 + ], 8941 + "tags": [ 8942 + ":baseball:" 8943 + ], 8944 + "sizes_px": [] 8945 + }, 8946 + { 8947 + "name": "emoji_u1f94e", 8948 + "version": 1, 8949 + "popularity": 93, 8950 + "codepoint": "1f94e", 8951 + "unsupported_families": [], 8952 + "categories": [ 8953 + "Activities and events" 8954 + ], 8955 + "tags": [ 8956 + ":softball:" 8957 + ], 8958 + "sizes_px": [] 8959 + }, 8960 + { 8961 + "name": "emoji_u1f3be", 8962 + "version": 1, 8963 + "popularity": 92, 8964 + "codepoint": "1f3be", 8965 + "unsupported_families": [], 8966 + "categories": [ 8967 + "Activities and events" 8968 + ], 8969 + "tags": [ 8970 + ":tennis:" 8971 + ], 8972 + "sizes_px": [] 8973 + }, 8974 + { 8975 + "name": "emoji_u1f3f8", 8976 + "version": 1, 8977 + "popularity": 91, 8978 + "codepoint": "1f3f8", 8979 + "unsupported_families": [], 8980 + "categories": [ 8981 + "Activities and events" 8982 + ], 8983 + "tags": [ 8984 + ":badminton:" 8985 + ], 8986 + "sizes_px": [] 8987 + }, 8988 + { 8989 + "name": "emoji_u1f94d", 8990 + "version": 1, 8991 + "popularity": 90, 8992 + "codepoint": "1f94d", 8993 + "unsupported_families": [], 8994 + "categories": [ 8995 + "Activities and events" 8996 + ], 8997 + "tags": [ 8998 + ":lacrosse:" 8999 + ], 9000 + "sizes_px": [] 9001 + }, 9002 + { 9003 + "name": "emoji_u1f3cf", 9004 + "version": 1, 9005 + "popularity": 89, 9006 + "codepoint": "1f3cf", 9007 + "unsupported_families": [], 9008 + "categories": [ 9009 + "Activities and events" 9010 + ], 9011 + "tags": [ 9012 + ":cricket-game:" 9013 + ], 9014 + "sizes_px": [] 9015 + }, 9016 + { 9017 + "name": "emoji_u1f3d1", 9018 + "version": 1, 9019 + "popularity": 88, 9020 + "codepoint": "1f3d1", 9021 + "unsupported_families": [], 9022 + "categories": [ 9023 + "Activities and events" 9024 + ], 9025 + "tags": [ 9026 + ":field-hockey:" 9027 + ], 9028 + "sizes_px": [] 9029 + }, 9030 + { 9031 + "name": "emoji_u1f3d2", 9032 + "version": 1, 9033 + "popularity": 87, 9034 + "codepoint": "1f3d2", 9035 + "unsupported_families": [], 9036 + "categories": [ 9037 + "Activities and events" 9038 + ], 9039 + "tags": [ 9040 + ":ice-hockey:" 9041 + ], 9042 + "sizes_px": [] 9043 + }, 9044 + { 9045 + "name": "emoji_u26f8_fe0f", 9046 + "version": 1, 9047 + "popularity": 86, 9048 + "codepoint": "26f8_fe0f", 9049 + "unsupported_families": [], 9050 + "categories": [ 9051 + "Activities and events" 9052 + ], 9053 + "tags": [ 9054 + ":ice-skate:" 9055 + ], 9056 + "sizes_px": [] 9057 + }, 9058 + { 9059 + "name": "emoji_u1f6fc", 9060 + "version": 1, 9061 + "popularity": 85, 9062 + "codepoint": "1f6fc", 9063 + "unsupported_families": [], 9064 + "categories": [ 9065 + "Activities and events" 9066 + ], 9067 + "tags": [ 9068 + ":roller-skates:" 9069 + ], 9070 + "sizes_px": [] 9071 + }, 9072 + { 9073 + "name": "emoji_u1fa70", 9074 + "version": 1, 9075 + "popularity": 84, 9076 + "codepoint": "1fa70", 9077 + "unsupported_families": [], 9078 + "categories": [ 9079 + "Activities and events" 9080 + ], 9081 + "tags": [ 9082 + ":ballet-shoes:" 9083 + ], 9084 + "sizes_px": [] 9085 + }, 9086 + { 9087 + "name": "emoji_u1f6f9", 9088 + "version": 1, 9089 + "popularity": 83, 9090 + "codepoint": "1f6f9", 9091 + "unsupported_families": [], 9092 + "categories": [ 9093 + "Activities and events" 9094 + ], 9095 + "tags": [ 9096 + ":skateboard:" 9097 + ], 9098 + "sizes_px": [] 9099 + }, 9100 + { 9101 + "name": "emoji_u26f3", 9102 + "version": 1, 9103 + "popularity": 82, 9104 + "codepoint": "26f3", 9105 + "unsupported_families": [], 9106 + "categories": [ 9107 + "Activities and events" 9108 + ], 9109 + "tags": [ 9110 + ":flag-in-hole:" 9111 + ], 9112 + "sizes_px": [] 9113 + }, 9114 + { 9115 + "name": "emoji_u1f3af", 9116 + "version": 1, 9117 + "popularity": 81, 9118 + "codepoint": "1f3af", 9119 + "unsupported_families": [], 9120 + "categories": [ 9121 + "Activities and events" 9122 + ], 9123 + "tags": [ 9124 + ":direct-hit:", 9125 + ":target:" 9126 + ], 9127 + "sizes_px": [] 9128 + }, 9129 + { 9130 + "name": "emoji_u1f94f", 9131 + "version": 1, 9132 + "popularity": 80, 9133 + "codepoint": "1f94f", 9134 + "unsupported_families": [], 9135 + "categories": [ 9136 + "Activities and events" 9137 + ], 9138 + "tags": [ 9139 + ":flying-disc:" 9140 + ], 9141 + "sizes_px": [] 9142 + }, 9143 + { 9144 + "name": "emoji_u1fa83", 9145 + "version": 1, 9146 + "popularity": 79, 9147 + "codepoint": "1fa83", 9148 + "unsupported_families": [], 9149 + "categories": [ 9150 + "Activities and events" 9151 + ], 9152 + "tags": [ 9153 + ":boomerang:" 9154 + ], 9155 + "sizes_px": [] 9156 + }, 9157 + { 9158 + "name": "emoji_u1fa81", 9159 + "version": 1, 9160 + "popularity": 78, 9161 + "codepoint": "1fa81", 9162 + "unsupported_families": [], 9163 + "categories": [ 9164 + "Activities and events" 9165 + ], 9166 + "tags": [ 9167 + ":kite:" 9168 + ], 9169 + "sizes_px": [] 9170 + }, 9171 + { 9172 + "name": "emoji_u1f3a3", 9173 + "version": 1, 9174 + "popularity": 77, 9175 + "codepoint": "1f3a3", 9176 + "unsupported_families": [], 9177 + "categories": [ 9178 + "Activities and events" 9179 + ], 9180 + "tags": [ 9181 + ":fishing-pole:" 9182 + ], 9183 + "sizes_px": [] 9184 + }, 9185 + { 9186 + "name": "emoji_u1f94b", 9187 + "version": 1, 9188 + "popularity": 76, 9189 + "codepoint": "1f94b", 9190 + "unsupported_families": [], 9191 + "categories": [ 9192 + "Activities and events" 9193 + ], 9194 + "tags": [ 9195 + ":martial-arts-uniform:" 9196 + ], 9197 + "sizes_px": [] 9198 + }, 9199 + { 9200 + "name": "emoji_u1f3b1", 9201 + "version": 1, 9202 + "popularity": 75, 9203 + "codepoint": "1f3b1", 9204 + "unsupported_families": [], 9205 + "categories": [ 9206 + "Activities and events" 9207 + ], 9208 + "tags": [ 9209 + ":8-ball:" 9210 + ], 9211 + "sizes_px": [] 9212 + }, 9213 + { 9214 + "name": "emoji_u1f3d3", 9215 + "version": 1, 9216 + "popularity": 74, 9217 + "codepoint": "1f3d3", 9218 + "unsupported_families": [], 9219 + "categories": [ 9220 + "Activities and events" 9221 + ], 9222 + "tags": [ 9223 + ":ping-pong:" 9224 + ], 9225 + "sizes_px": [] 9226 + }, 9227 + { 9228 + "name": "emoji_u1f3b3", 9229 + "version": 1, 9230 + "popularity": 73, 9231 + "codepoint": "1f3b3", 9232 + "unsupported_families": [], 9233 + "categories": [ 9234 + "Activities and events" 9235 + ], 9236 + "tags": [ 9237 + ":bowling:" 9238 + ], 9239 + "sizes_px": [] 9240 + }, 9241 + { 9242 + "name": "emoji_u1f3b2", 9243 + "version": 1, 9244 + "popularity": 72, 9245 + "codepoint": "1f3b2", 9246 + "unsupported_families": [], 9247 + "categories": [ 9248 + "Activities and events" 9249 + ], 9250 + "tags": [ 9251 + ":die:" 9252 + ], 9253 + "sizes_px": [] 9254 + }, 9255 + { 9256 + "name": "emoji_u1f3b0", 9257 + "version": 1, 9258 + "popularity": 71, 9259 + "codepoint": "1f3b0", 9260 + "unsupported_families": [], 9261 + "categories": [ 9262 + "Activities and events" 9263 + ], 9264 + "tags": [ 9265 + ":slot-machine:" 9266 + ], 9267 + "sizes_px": [] 9268 + }, 9269 + { 9270 + "name": "emoji_u1fa84", 9271 + "version": 1, 9272 + "popularity": 70, 9273 + "codepoint": "1fa84", 9274 + "unsupported_families": [], 9275 + "categories": [ 9276 + "Activities and events" 9277 + ], 9278 + "tags": [ 9279 + ":wand:" 9280 + ], 9281 + "sizes_px": [] 9282 + }, 9283 + { 9284 + "name": "emoji_u1f4f8", 9285 + "version": 1, 9286 + "popularity": 69, 9287 + "codepoint": "1f4f8", 9288 + "unsupported_families": [], 9289 + "categories": [ 9290 + "Activities and events" 9291 + ], 9292 + "tags": [ 9293 + ":camera-flash:" 9294 + ], 9295 + "sizes_px": [] 9296 + }, 9297 + { 9298 + "name": "emoji_u1fadf", 9299 + "version": 1, 9300 + "popularity": 68, 9301 + "codepoint": "1fadf", 9302 + "unsupported_families": [], 9303 + "categories": [ 9304 + "Activities and events" 9305 + ], 9306 + "tags": [ 9307 + ":splatter:" 9308 + ], 9309 + "sizes_px": [] 9310 + }, 9311 + { 9312 + "name": "emoji_u1f3b7", 9313 + "version": 1, 9314 + "popularity": 67, 9315 + "codepoint": "1f3b7", 9316 + "unsupported_families": [], 9317 + "categories": [ 9318 + "Activities and events" 9319 + ], 9320 + "tags": [ 9321 + ":saxophone:" 9322 + ], 9323 + "sizes_px": [] 9324 + }, 9325 + { 9326 + "name": "emoji_u1f3ba", 9327 + "version": 1, 9328 + "popularity": 66, 9329 + "codepoint": "1f3ba", 9330 + "unsupported_families": [], 9331 + "categories": [ 9332 + "Activities and events" 9333 + ], 9334 + "tags": [ 9335 + ":trumpet:" 9336 + ], 9337 + "sizes_px": [] 9338 + }, 9339 + { 9340 + "name": "emoji_u1f3bb", 9341 + "version": 1, 9342 + "popularity": 65, 9343 + "codepoint": "1f3bb", 9344 + "unsupported_families": [], 9345 + "categories": [ 9346 + "Activities and events" 9347 + ], 9348 + "tags": [ 9349 + ":violin:" 9350 + ], 9351 + "sizes_px": [] 9352 + }, 9353 + { 9354 + "name": "emoji_u1fa89", 9355 + "version": 1, 9356 + "popularity": 64, 9357 + "codepoint": "1fa89", 9358 + "unsupported_families": [], 9359 + "categories": [ 9360 + "Activities and events" 9361 + ], 9362 + "tags": [ 9363 + ":harp:" 9364 + ], 9365 + "sizes_px": [] 9366 + }, 9367 + { 9368 + "name": "emoji_u1f941", 9369 + "version": 1, 9370 + "popularity": 63, 9371 + "codepoint": "1f941", 9372 + "unsupported_families": [], 9373 + "categories": [ 9374 + "Activities and events" 9375 + ], 9376 + "tags": [ 9377 + ":drum:" 9378 + ], 9379 + "sizes_px": [] 9380 + }, 9381 + { 9382 + "name": "emoji_u1fa87", 9383 + "version": 1, 9384 + "popularity": 62, 9385 + "codepoint": "1fa87", 9386 + "unsupported_families": [], 9387 + "categories": [ 9388 + "Activities and events" 9389 + ], 9390 + "tags": [ 9391 + ":maracas:" 9392 + ], 9393 + "sizes_px": [] 9394 + }, 9395 + { 9396 + "name": "emoji_u1f3ac", 9397 + "version": 1, 9398 + "popularity": 61, 9399 + "codepoint": "1f3ac", 9400 + "unsupported_families": [], 9401 + "categories": [ 9402 + "Activities and events" 9403 + ], 9404 + "tags": [ 9405 + ":clapper:" 9406 + ], 9407 + "sizes_px": [] 9408 + }, 9409 + { 9410 + "name": "emoji_u1f50b", 9411 + "version": 1, 9412 + "popularity": 60, 9413 + "codepoint": "1f50b", 9414 + "unsupported_families": [], 9415 + "categories": [ 9416 + "Objects" 9417 + ], 9418 + "tags": [ 9419 + ":battery-full:" 9420 + ], 9421 + "sizes_px": [] 9422 + }, 9423 + { 9424 + "name": "emoji_u1faab", 9425 + "version": 1, 9426 + "popularity": 59, 9427 + "codepoint": "1faab", 9428 + "unsupported_families": [], 9429 + "categories": [ 9430 + "Objects" 9431 + ], 9432 + "tags": [ 9433 + ":battery-low:" 9434 + ], 9435 + "sizes_px": [] 9436 + }, 9437 + { 9438 + "name": "emoji_u1fa99", 9439 + "version": 1, 9440 + "popularity": 58, 9441 + "codepoint": "1fa99", 9442 + "unsupported_families": [], 9443 + "categories": [ 9444 + "Objects" 9445 + ], 9446 + "tags": [ 9447 + ":coin:" 9448 + ], 9449 + "sizes_px": [] 9450 + }, 9451 + { 9452 + "name": "emoji_u1f4b8", 9453 + "version": 1, 9454 + "popularity": 57, 9455 + "codepoint": "1f4b8", 9456 + "unsupported_families": [], 9457 + "categories": [ 9458 + "Objects" 9459 + ], 9460 + "tags": [ 9461 + ":money-with-wings:" 9462 + ], 9463 + "sizes_px": [] 9464 + }, 9465 + { 9466 + "name": "emoji_u1f48e", 9467 + "version": 1, 9468 + "popularity": 56, 9469 + "codepoint": "1f48e", 9470 + "unsupported_families": [], 9471 + "categories": [ 9472 + "Objects" 9473 + ], 9474 + "tags": [ 9475 + ":gem-stone:" 9476 + ], 9477 + "sizes_px": [] 9478 + }, 9479 + { 9480 + "name": "emoji_u2696_fe0f", 9481 + "version": 1, 9482 + "popularity": 55, 9483 + "codepoint": "2696_fe0f", 9484 + "unsupported_families": [], 9485 + "categories": [ 9486 + "Objects" 9487 + ], 9488 + "tags": [ 9489 + ":balance-scale:" 9490 + ], 9491 + "sizes_px": [] 9492 + }, 9493 + { 9494 + "name": "emoji_u1f4a1", 9495 + "version": 1, 9496 + "popularity": 54, 9497 + "codepoint": "1f4a1", 9498 + "unsupported_families": [], 9499 + "categories": [ 9500 + "Objects" 9501 + ], 9502 + "tags": [ 9503 + ":light-bulb:" 9504 + ], 9505 + "sizes_px": [] 9506 + }, 9507 + { 9508 + "name": "emoji_u1f393", 9509 + "version": 1, 9510 + "popularity": 53, 9511 + "codepoint": "1f393", 9512 + "unsupported_families": [], 9513 + "categories": [ 9514 + "Objects" 9515 + ], 9516 + "tags": [ 9517 + ":graduation-cap:" 9518 + ], 9519 + "sizes_px": [] 9520 + }, 9521 + { 9522 + "name": "emoji_u1f48d", 9523 + "version": 1, 9524 + "popularity": 52, 9525 + "codepoint": "1f48d", 9526 + "unsupported_families": [], 9527 + "categories": [ 9528 + "Objects" 9529 + ], 9530 + "tags": [ 9531 + ":ring:" 9532 + ], 9533 + "sizes_px": [] 9534 + }, 9535 + { 9536 + "name": "emoji_u1faad", 9537 + "version": 1, 9538 + "popularity": 51, 9539 + "codepoint": "1faad", 9540 + "unsupported_families": [], 9541 + "categories": [ 9542 + "Objects" 9543 + ], 9544 + "tags": [ 9545 + ":fan:" 9546 + ], 9547 + "sizes_px": [] 9548 + }, 9549 + { 9550 + "name": "emoji_u2602_fe0f", 9551 + "version": 1, 9552 + "popularity": 50, 9553 + "codepoint": "2602_fe0f", 9554 + "unsupported_families": [], 9555 + "categories": [ 9556 + "Objects" 9557 + ], 9558 + "tags": [ 9559 + ":umbrella:" 9560 + ], 9561 + "sizes_px": [] 9562 + }, 9563 + { 9564 + "name": "emoji_u1fa8f", 9565 + "version": 1, 9566 + "popularity": 49, 9567 + "codepoint": "1fa8f", 9568 + "unsupported_families": [], 9569 + "categories": [ 9570 + "Objects" 9571 + ], 9572 + "tags": [ 9573 + ":shovel:", 9574 + ":dig:" 9575 + ], 9576 + "sizes_px": [] 9577 + }, 9578 + { 9579 + "name": "emoji_u2699_fe0f", 9580 + "version": 1, 9581 + "popularity": 48, 9582 + "codepoint": "2699_fe0f", 9583 + "unsupported_families": [], 9584 + "categories": [ 9585 + "Objects" 9586 + ], 9587 + "tags": [ 9588 + ":gear:" 9589 + ], 9590 + "sizes_px": [] 9591 + }, 9592 + { 9593 + "name": "emoji_u26d3_fe0f_200d_1f4a5", 9594 + "version": 1, 9595 + "popularity": 47, 9596 + "codepoint": "26d3_fe0f_200d_1f4a5", 9597 + "unsupported_families": [], 9598 + "categories": [ 9599 + "Objects" 9600 + ], 9601 + "tags": [ 9602 + ":broken-chain:" 9603 + ], 9604 + "sizes_px": [] 9605 + }, 9606 + { 9607 + "name": "emoji_u270f_fe0f", 9608 + "version": 1, 9609 + "popularity": 46, 9610 + "codepoint": "270f_fe0f", 9611 + "unsupported_families": [], 9612 + "categories": [ 9613 + "Objects" 9614 + ], 9615 + "tags": [ 9616 + ":pencil:" 9617 + ], 9618 + "sizes_px": [] 9619 + }, 9620 + { 9621 + "name": "emoji_u23f0", 9622 + "version": 1, 9623 + "popularity": 45, 9624 + "codepoint": "23f0", 9625 + "unsupported_families": [], 9626 + "categories": [ 9627 + "Objects" 9628 + ], 9629 + "tags": [ 9630 + ":alarm-clock:" 9631 + ], 9632 + "sizes_px": [] 9633 + }, 9634 + { 9635 + "name": "emoji_u1f6ce_fe0f", 9636 + "version": 1, 9637 + "popularity": 44, 9638 + "codepoint": "1f6ce_fe0f", 9639 + "unsupported_families": [], 9640 + "categories": [ 9641 + "Objects" 9642 + ], 9643 + "tags": [ 9644 + ":bellhop-bell:" 9645 + ], 9646 + "sizes_px": [] 9647 + }, 9648 + { 9649 + "name": "emoji_u1f514", 9650 + "version": 1, 9651 + "popularity": 43, 9652 + "codepoint": "1f514", 9653 + "unsupported_families": [], 9654 + "categories": [ 9655 + "Objects" 9656 + ], 9657 + "tags": [ 9658 + ":bell:" 9659 + ], 9660 + "sizes_px": [] 9661 + }, 9662 + { 9663 + "name": "emoji_u1f52e", 9664 + "version": 1, 9665 + "popularity": 42, 9666 + "codepoint": "1f52e", 9667 + "unsupported_families": [], 9668 + "categories": [ 9669 + "Objects" 9670 + ], 9671 + "tags": [ 9672 + ":crystal-ball:" 9673 + ], 9674 + "sizes_px": [] 9675 + }, 9676 + { 9677 + "name": "emoji_u1f4a3", 9678 + "version": 1, 9679 + "popularity": 41, 9680 + "codepoint": "1f4a3", 9681 + "unsupported_families": [], 9682 + "categories": [ 9683 + "Objects" 9684 + ], 9685 + "tags": [ 9686 + ":bomb:" 9687 + ], 9688 + "sizes_px": [] 9689 + }, 9690 + { 9691 + "name": "emoji_u1faa4", 9692 + "version": 1, 9693 + "popularity": 40, 9694 + "codepoint": "1faa4", 9695 + "unsupported_families": [], 9696 + "categories": [ 9697 + "Objects" 9698 + ], 9699 + "tags": [ 9700 + ":mouse-trap:" 9701 + ], 9702 + "sizes_px": [] 9703 + }, 9704 + { 9705 + "name": "emoji_u1f512", 9706 + "version": 1, 9707 + "popularity": 39, 9708 + "codepoint": "1f512", 9709 + "unsupported_families": [], 9710 + "categories": [ 9711 + "Objects" 9712 + ], 9713 + "tags": [ 9714 + ":locked:" 9715 + ], 9716 + "sizes_px": [] 9717 + }, 9718 + { 9719 + "name": "emoji_u2648", 9720 + "version": 1, 9721 + "popularity": 38, 9722 + "codepoint": "2648", 9723 + "unsupported_families": [], 9724 + "categories": [ 9725 + "Symbols" 9726 + ], 9727 + "tags": [ 9728 + ":Aries:" 9729 + ], 9730 + "sizes_px": [] 9731 + }, 9732 + { 9733 + "name": "emoji_u2649", 9734 + "version": 1, 9735 + "popularity": 37, 9736 + "codepoint": "2649", 9737 + "unsupported_families": [], 9738 + "categories": [ 9739 + "Symbols" 9740 + ], 9741 + "tags": [ 9742 + ":Taurus:" 9743 + ], 9744 + "sizes_px": [] 9745 + }, 9746 + { 9747 + "name": "emoji_u264a", 9748 + "version": 1, 9749 + "popularity": 36, 9750 + "codepoint": "264a", 9751 + "unsupported_families": [], 9752 + "categories": [ 9753 + "Symbols" 9754 + ], 9755 + "tags": [ 9756 + ":Gemini:" 9757 + ], 9758 + "sizes_px": [] 9759 + }, 9760 + { 9761 + "name": "emoji_u264b", 9762 + "version": 1, 9763 + "popularity": 35, 9764 + "codepoint": "264b", 9765 + "unsupported_families": [], 9766 + "categories": [ 9767 + "Symbols" 9768 + ], 9769 + "tags": [ 9770 + ":Cancer:" 9771 + ], 9772 + "sizes_px": [] 9773 + }, 9774 + { 9775 + "name": "emoji_u264c", 9776 + "version": 1, 9777 + "popularity": 34, 9778 + "codepoint": "264c", 9779 + "unsupported_families": [], 9780 + "categories": [ 9781 + "Symbols" 9782 + ], 9783 + "tags": [ 9784 + ":Leo:" 9785 + ], 9786 + "sizes_px": [] 9787 + }, 9788 + { 9789 + "name": "emoji_u264d", 9790 + "version": 1, 9791 + "popularity": 33, 9792 + "codepoint": "264d", 9793 + "unsupported_families": [], 9794 + "categories": [ 9795 + "Symbols" 9796 + ], 9797 + "tags": [ 9798 + ":Virgo:" 9799 + ], 9800 + "sizes_px": [] 9801 + }, 9802 + { 9803 + "name": "emoji_u264e", 9804 + "version": 1, 9805 + "popularity": 32, 9806 + "codepoint": "264e", 9807 + "unsupported_families": [], 9808 + "categories": [ 9809 + "Symbols" 9810 + ], 9811 + "tags": [ 9812 + ":Libra:" 9813 + ], 9814 + "sizes_px": [] 9815 + }, 9816 + { 9817 + "name": "emoji_u264f", 9818 + "version": 1, 9819 + "popularity": 31, 9820 + "codepoint": "264f", 9821 + "unsupported_families": [], 9822 + "categories": [ 9823 + "Symbols" 9824 + ], 9825 + "tags": [ 9826 + ":Scorpio:" 9827 + ], 9828 + "sizes_px": [] 9829 + }, 9830 + { 9831 + "name": "emoji_u2650", 9832 + "version": 1, 9833 + "popularity": 30, 9834 + "codepoint": "2650", 9835 + "unsupported_families": [], 9836 + "categories": [ 9837 + "Symbols" 9838 + ], 9839 + "tags": [ 9840 + ":Sagittarius:" 9841 + ], 9842 + "sizes_px": [] 9843 + }, 9844 + { 9845 + "name": "emoji_u2651", 9846 + "version": 1, 9847 + "popularity": 29, 9848 + "codepoint": "2651", 9849 + "unsupported_families": [], 9850 + "categories": [ 9851 + "Symbols" 9852 + ], 9853 + "tags": [ 9854 + ":Capricorn:" 9855 + ], 9856 + "sizes_px": [] 9857 + }, 9858 + { 9859 + "name": "emoji_u2652", 9860 + "version": 1, 9861 + "popularity": 28, 9862 + "codepoint": "2652", 9863 + "unsupported_families": [], 9864 + "categories": [ 9865 + "Symbols" 9866 + ], 9867 + "tags": [ 9868 + ":Aquarius:" 9869 + ], 9870 + "sizes_px": [] 9871 + }, 9872 + { 9873 + "name": "emoji_u2653", 9874 + "version": 1, 9875 + "popularity": 27, 9876 + "codepoint": "2653", 9877 + "unsupported_families": [], 9878 + "categories": [ 9879 + "Symbols" 9880 + ], 9881 + "tags": [ 9882 + ":Pisces:" 9883 + ], 9884 + "sizes_px": [] 9885 + }, 9886 + { 9887 + "name": "emoji_u26ce", 9888 + "version": 1, 9889 + "popularity": 26, 9890 + "codepoint": "26ce", 9891 + "unsupported_families": [], 9892 + "categories": [ 9893 + "Symbols" 9894 + ], 9895 + "tags": [ 9896 + ":Ophiuchus:" 9897 + ], 9898 + "sizes_px": [] 9899 + }, 9900 + { 9901 + "name": "emoji_u2757", 9902 + "version": 1, 9903 + "popularity": 25, 9904 + "codepoint": "2757", 9905 + "unsupported_families": [], 9906 + "categories": [ 9907 + "Symbols" 9908 + ], 9909 + "tags": [ 9910 + ":exclamation:", 9911 + ":exclamation-mark:" 9912 + ], 9913 + "sizes_px": [] 9914 + }, 9915 + { 9916 + "name": "emoji_u2753", 9917 + "version": 1, 9918 + "popularity": 24, 9919 + "codepoint": "2753", 9920 + "unsupported_families": [], 9921 + "categories": [ 9922 + "Symbols" 9923 + ], 9924 + "tags": [ 9925 + ":question:", 9926 + ":question-mark:", 9927 + ":?:" 9928 + ], 9929 + "sizes_px": [] 9930 + }, 9931 + { 9932 + "name": "emoji_u2049_fe0f", 9933 + "version": 1, 9934 + "popularity": 23, 9935 + "codepoint": "2049_fe0f", 9936 + "unsupported_families": [], 9937 + "categories": [ 9938 + "Symbols" 9939 + ], 9940 + "tags": [ 9941 + ":exclamation-question-mark:", 9942 + ":!?:" 9943 + ], 9944 + "sizes_px": [] 9945 + }, 9946 + { 9947 + "name": "emoji_u203c_fe0f", 9948 + "version": 1, 9949 + "popularity": 22, 9950 + "codepoint": "203c_fe0f", 9951 + "unsupported_families": [], 9952 + "categories": [ 9953 + "Symbols" 9954 + ], 9955 + "tags": [ 9956 + ":exclamation-double:", 9957 + ":!!:" 9958 + ], 9959 + "sizes_px": [] 9960 + }, 9961 + { 9962 + "name": "emoji_u274c", 9963 + "version": 1, 9964 + "popularity": 21, 9965 + "codepoint": "274c", 9966 + "unsupported_families": [], 9967 + "categories": [ 9968 + "Symbols" 9969 + ], 9970 + "tags": [ 9971 + ":cross-mark:", 9972 + ":x:" 9973 + ], 9974 + "sizes_px": [] 9975 + }, 9976 + { 9977 + "name": "emoji_u1f198", 9978 + "version": 1, 9979 + "popularity": 20, 9980 + "codepoint": "1f198", 9981 + "unsupported_families": [], 9982 + "categories": [ 9983 + "Symbols" 9984 + ], 9985 + "tags": [ 9986 + ":sos:" 9987 + ], 9988 + "sizes_px": [] 9989 + }, 9990 + { 9991 + "name": "emoji_u1f4f4", 9992 + "version": 1, 9993 + "popularity": 19, 9994 + "codepoint": "1f4f4", 9995 + "unsupported_families": [], 9996 + "categories": [ 9997 + "Symbols" 9998 + ], 9999 + "tags": [ 10000 + ":phone-off:" 10001 + ], 10002 + "sizes_px": [] 10003 + }, 10004 + { 10005 + "name": "emoji_u2622_fe0f", 10006 + "version": 1, 10007 + "popularity": 18, 10008 + "codepoint": "2622_fe0f", 10009 + "unsupported_families": [], 10010 + "categories": [ 10011 + "Symbols" 10012 + ], 10013 + "tags": [ 10014 + ":radioactive:" 10015 + ], 10016 + "sizes_px": [] 10017 + }, 10018 + { 10019 + "name": "emoji_u2623_fe0f", 10020 + "version": 1, 10021 + "popularity": 17, 10022 + "codepoint": "2623_fe0f", 10023 + "unsupported_families": [], 10024 + "categories": [ 10025 + "Symbols" 10026 + ], 10027 + "tags": [ 10028 + ":biohazard:" 10029 + ], 10030 + "sizes_px": [] 10031 + }, 10032 + { 10033 + "name": "emoji_u26a0_fe0f", 10034 + "version": 1, 10035 + "popularity": 16, 10036 + "codepoint": "26a0_fe0f", 10037 + "unsupported_families": [], 10038 + "categories": [ 10039 + "Symbols" 10040 + ], 10041 + "tags": [ 10042 + ":warning:" 10043 + ], 10044 + "sizes_px": [] 10045 + }, 10046 + { 10047 + "name": "emoji_u2705", 10048 + "version": 1, 10049 + "popularity": 15, 10050 + "codepoint": "2705", 10051 + "unsupported_families": [], 10052 + "categories": [ 10053 + "Symbols" 10054 + ], 10055 + "tags": [ 10056 + ":check-mark:", 10057 + ":check-mark-green:" 10058 + ], 10059 + "sizes_px": [] 10060 + }, 10061 + { 10062 + "name": "emoji_u1f195", 10063 + "version": 1, 10064 + "popularity": 14, 10065 + "codepoint": "1f195", 10066 + "unsupported_families": [], 10067 + "categories": [ 10068 + "Symbols" 10069 + ], 10070 + "tags": [ 10071 + ":new:" 10072 + ], 10073 + "sizes_px": [] 10074 + }, 10075 + { 10076 + "name": "emoji_u1f193", 10077 + "version": 1, 10078 + "popularity": 13, 10079 + "codepoint": "1f193", 10080 + "unsupported_families": [], 10081 + "categories": [ 10082 + "Symbols" 10083 + ], 10084 + "tags": [ 10085 + ":free:" 10086 + ], 10087 + "sizes_px": [] 10088 + }, 10089 + { 10090 + "name": "emoji_u1f199", 10091 + "version": 1, 10092 + "popularity": 12, 10093 + "codepoint": "1f199", 10094 + "unsupported_families": [], 10095 + "categories": [ 10096 + "Symbols" 10097 + ], 10098 + "tags": [ 10099 + ":up!:" 10100 + ], 10101 + "sizes_px": [] 10102 + }, 10103 + { 10104 + "name": "emoji_u1f192", 10105 + "version": 1, 10106 + "popularity": 11, 10107 + "codepoint": "1f192", 10108 + "unsupported_families": [], 10109 + "categories": [ 10110 + "Symbols" 10111 + ], 10112 + "tags": [ 10113 + ":cool:" 10114 + ], 10115 + "sizes_px": [] 10116 + }, 10117 + { 10118 + "name": "emoji_u1f6ae", 10119 + "version": 1, 10120 + "popularity": 10, 10121 + "codepoint": "1f6ae", 10122 + "unsupported_families": [], 10123 + "categories": [ 10124 + "Symbols" 10125 + ], 10126 + "tags": [ 10127 + ":litter:" 10128 + ], 10129 + "sizes_px": [] 10130 + }, 10131 + { 10132 + "name": "emoji_u262e_fe0f", 10133 + "version": 1, 10134 + "popularity": 9, 10135 + "codepoint": "262e_fe0f", 10136 + "unsupported_families": [], 10137 + "categories": [ 10138 + "Symbols" 10139 + ], 10140 + "tags": [ 10141 + ":peace-symbol:" 10142 + ], 10143 + "sizes_px": [] 10144 + }, 10145 + { 10146 + "name": "emoji_u262f_fe0f", 10147 + "version": 1, 10148 + "popularity": 8, 10149 + "codepoint": "262f_fe0f", 10150 + "unsupported_families": [], 10151 + "categories": [ 10152 + "Symbols" 10153 + ], 10154 + "tags": [ 10155 + ":yin-yang:" 10156 + ], 10157 + "sizes_px": [] 10158 + }, 10159 + { 10160 + "name": "emoji_u267e_fe0f", 10161 + "version": 1, 10162 + "popularity": 7, 10163 + "codepoint": "267e_fe0f", 10164 + "unsupported_families": [], 10165 + "categories": [ 10166 + "Symbols" 10167 + ], 10168 + "tags": [ 10169 + ":infinity:" 10170 + ], 10171 + "sizes_px": [] 10172 + }, 10173 + { 10174 + "name": "emoji_u1f3b6", 10175 + "version": 1, 10176 + "popularity": 6, 10177 + "codepoint": "1f3b6", 10178 + "unsupported_families": [], 10179 + "categories": [ 10180 + "Symbols" 10181 + ], 10182 + "tags": [ 10183 + ":musical-notes:" 10184 + ], 10185 + "sizes_px": [] 10186 + }, 10187 + { 10188 + "name": "emoji_u2795", 10189 + "version": 1, 10190 + "popularity": 5, 10191 + "codepoint": "2795", 10192 + "unsupported_families": [], 10193 + "categories": [ 10194 + "Symbols" 10195 + ], 10196 + "tags": [ 10197 + ":plus-sign:", 10198 + ":+:" 10199 + ], 10200 + "sizes_px": [] 10201 + }, 10202 + { 10203 + "name": "emoji_u1f3c1", 10204 + "version": 1, 10205 + "popularity": 4, 10206 + "codepoint": "1f3c1", 10207 + "unsupported_families": [], 10208 + "categories": [ 10209 + "Flags" 10210 + ], 10211 + "tags": [ 10212 + ":chequered-flag:" 10213 + ], 10214 + "sizes_px": [] 10215 + }, 10216 + { 10217 + "name": "emoji_u1f6a9", 10218 + "version": 1, 10219 + "popularity": 3, 10220 + "codepoint": "1f6a9", 10221 + "unsupported_families": [], 10222 + "categories": [ 10223 + "Flags" 10224 + ], 10225 + "tags": [ 10226 + ":triangular-flag:" 10227 + ], 10228 + "sizes_px": [] 10229 + }, 10230 + { 10231 + "name": "emoji_u1f3f4", 10232 + "version": 1, 10233 + "popularity": 2, 10234 + "codepoint": "1f3f4", 10235 + "unsupported_families": [], 10236 + "categories": [ 10237 + "Flags" 10238 + ], 10239 + "tags": [ 10240 + ":black-flag:" 10241 + ], 10242 + "sizes_px": [] 10243 + }, 10244 + { 10245 + "name": "emoji_u1f3f3_fe0f", 10246 + "version": 1, 10247 + "popularity": 1, 10248 + "codepoint": "1f3f3_fe0f", 10249 + "unsupported_families": [], 10250 + "categories": [ 10251 + "Flags" 10252 + ], 10253 + "tags": [ 10254 + ":white-flag:" 10255 + ], 10256 + "sizes_px": [] 10257 + } 10258 + ] 10259 + }
+63
src/lib/cards/StatusphereCard/index.ts
··· 1 + // animated emojis from 2 + // https://googlefonts.github.io/noto-emoji-animation/ 3 + 4 + import type { CardDefinition } from '../types'; 5 + import { listRecords, putRecord } from '$lib/oauth/atproto'; 6 + import StatusphereCard from './StatusphereCard.svelte'; 7 + import { TID } from '@atproto/common-web'; 8 + import EditStatusphereCard from './EditStatusphereCard.svelte'; 9 + import icons from './icons.json'; 10 + 11 + export const StatusphereCardDefinition = { 12 + type: 'statusphere', 13 + contentComponent: StatusphereCard, 14 + editingContentComponent: EditStatusphereCard, 15 + 16 + createNew: (item) => { 17 + item.h = 3; 18 + item.mobileH = 5; 19 + }, 20 + 21 + loadData: async (items, { did }) => { 22 + const data = await listRecords({ did, collection: 'xyz.statusphere.status', limit: 1 }); 23 + 24 + return data[0]; 25 + }, 26 + sidebarButtonText: 'Statusphere', 27 + 28 + upload: async (item) => { 29 + if (item.cardData.hasUpdate) { 30 + await putRecord({ 31 + rkey: TID.nextStr(), 32 + collection: 'xyz.statusphere.status', 33 + record: { 34 + status: item.cardData.emoji, 35 + createdAt: new Date().toISOString() 36 + } 37 + }); 38 + delete item.cardData.hasUpdate; 39 + delete item.cardData.emoji; 40 + } 41 + 42 + return item; 43 + } 44 + } as CardDefinition & { type: 'statusphere' }; 45 + 46 + export function emojiToNotoAnimatedWebp(emoji: string | undefined): string | undefined { 47 + if (!emoji) return; 48 + // Convert emoji to lowercase hex codepoints joined by "-" 49 + const codepoints: string[] = []; 50 + for (const char of emoji) { 51 + codepoints.push(char.codePointAt(0)!.toString(16).toLowerCase()); 52 + } 53 + 54 + let key = codepoints.join('_'); 55 + 56 + if (icons.icons.find((v) => v.codepoint == key)) { 57 + return `https://fonts.gstatic.com/s/e/notoemoji/latest/${key}/512.webp`; 58 + } 59 + 60 + key = codepoints.filter((cp) => cp !== 'fe0f' && cp !== 'fe0e').join('_'); 61 + if (icons.icons.find((v) => v.codepoint == key)) 62 + return `https://fonts.gstatic.com/s/e/notoemoji/latest/${key}/512.webp`; 63 + }
+3 -1
src/lib/cards/index.ts
··· 23 23 import { TealFMPlaysCardDefinition } from './TealFMPlaysCard'; 24 24 import { PhotoGalleryCardDefinition } from './PhotoGalleryCard'; 25 25 import { StandardSiteDocumentListCardDefinition } from './StandardSiteDocumentListCard'; 26 + import { StatusphereCardDefinition } from './StatusphereCard'; 26 27 27 28 export const AllCardDefinitions = [ 28 29 ImageCardDefinition, ··· 48 49 PopfeedReviewsCardDefinition, 49 50 TealFMPlaysCardDefinition, 50 51 PhotoGalleryCardDefinition, 51 - StandardSiteDocumentListCardDefinition 52 + StandardSiteDocumentListCardDefinition, 53 + StatusphereCardDefinition 52 54 ] as const; 53 55 54 56 export const CardDefinitionsByType = AllCardDefinitions.reduce(
+9 -1
src/lib/components/bluesky-post/BlueskyPost.svelte
··· 30 30 {/snippet} 31 31 32 32 {#if postData} 33 - <Post data={postData} showBookmark={false} logo={showLogo ? logo : undefined} {...restProps}> 33 + <Post 34 + data={postData} 35 + replyHref={postData?.href} 36 + repostHref={postData?.href} 37 + likeHref={postData?.href} 38 + showBookmark={false} 39 + logo={showLogo ? logo : undefined} 40 + {...restProps} 41 + > 34 42 {@render children?.()} 35 43 </Post> 36 44 {/if}
+11 -2
src/lib/components/post/Post.svelte
··· 26 26 onLikeClick, 27 27 onBookmarkClick, 28 28 29 + replyHref, 30 + repostHref, 31 + likeHref, 32 + 29 33 customActions, 30 34 31 35 children, ··· 47 51 onRepostClick?: () => void; 48 52 onLikeClick?: () => void; 49 53 onBookmarkClick?: () => void; 54 + 55 + replyHref?: string; 56 + repostHref?: string; 57 + likeHref?: string; 50 58 51 59 customActions?: Snippet; 52 60 ··· 182 190 class="text-base-500 dark:text-base-400 accent:text-base-900 mt-4 flex justify-between gap-2" 183 191 > 184 192 {#if showReply} 185 - <PostAction onclick={onReplyClick}> 193 + <PostAction onclick={onReplyClick} href={replyHref}> 186 194 <svg 187 195 xmlns="http://www.w3.org/2000/svg" 188 196 fill="none" ··· 204 212 {/if} 205 213 206 214 {#if showRepost} 207 - <PostAction onclick={onRepostClick}> 215 + <PostAction onclick={onRepostClick} href={repostHref}> 208 216 <svg 209 217 xmlns="http://www.w3.org/2000/svg" 210 218 fill="none" ··· 228 236 <PostAction 229 237 class={liked ? 'text-accent-700 dark:text-accent-500 font-semibold' : ''} 230 238 onclick={onLikeClick} 239 + href={likeHref} 231 240 > 232 241 {#if liked} 233 242 <svg
+10
src/lib/components/post/PostAction.svelte
··· 5 5 let { 6 6 onclick, 7 7 children, 8 + href, 8 9 class: className 9 10 }: { 10 11 onclick?: () => void; 11 12 children: Snippet; 12 13 class?: string; 14 + href?: string; 13 15 } = $props(); 14 16 </script> 15 17 ··· 20 22 > 21 23 {@render children?.()} 22 24 </button> 25 + {:else if href} 26 + <a 27 + class={cn('group/post-action inline-flex cursor-pointer items-center gap-2 text-sm', className)} 28 + {href} 29 + target="_blank" 30 + > 31 + {@render children?.()} 32 + </a> 23 33 {:else} 24 34 <div class={cn('inline-flex items-center gap-2 text-sm', className)}> 25 35 {@render children?.()}
+1 -1
src/lib/oauth/const.ts
··· 8 8 redirect_uris: [env.PUBLIC_DOMAIN + base], 9 9 10 10 scope: 11 - 'atproto repo:app.blento.card repo:app.blento.page repo:app.blento.settings repo:app.blento.comment repo:site.standard.publication repo:site.standard.document blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview', 11 + 'atproto repo:app.blento.card repo:app.blento.page repo:app.blento.settings repo:app.blento.comment repo:site.standard.publication repo:site.standard.document repo:app.blento.guestbook.entry repo:xyz.statusphere.status repo:app.bsky.feed.like blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview', 12 12 grant_types: ['authorization_code', 'refresh_token'], 13 13 response_types: ['code'], 14 14 token_endpoint_auth_method: 'none',
+7 -1
src/lib/website/EditBar.svelte
··· 2 2 import { dev } from '$app/environment'; 3 3 import { client } from '$lib/oauth'; 4 4 import type { WebsiteData } from '$lib/types'; 5 - import { Button, Input, Navbar, Popover, Toggle } from '@foxui/core'; 5 + import { Button, Input, Modal, Navbar, Popover, Toggle } from '@foxui/core'; 6 6 7 7 let { 8 8 data, ··· 40 40 41 41 let imageInputRef: HTMLInputElement | undefined = $state(); 42 42 let videoInputRef: HTMLInputElement | undefined = $state(); 43 + 44 + let shareModalOpen = $state(false); 43 45 </script> 44 46 45 47 <input ··· 59 61 multiple 60 62 bind:this={videoInputRef} 61 63 /> 64 + 65 + <Modal bind:open={shareModalOpen}> 66 + 67 + </Modal> 62 68 63 69 {#if dev || (client.isLoggedIn && client.profile?.did === data.did)} 64 70 <Navbar
+3
vite.config.ts
··· 8 8 server: { 9 9 host: '127.0.0.1', 10 10 port: 5179 11 + }, 12 + build: { 13 + sourcemap: true 11 14 } 12 15 });