diff --git a/esbuild.config.mjs b/esbuild.config.mjs new file mode 100644 index 0000000..6a7f584 --- /dev/null +++ b/esbuild.config.mjs @@ -0,0 +1,71 @@ +import esbuild from "esbuild"; +import process from "process"; +import builtins from 'builtin-modules' +import fs from 'fs' +import { copy } from 'esbuild-plugin-copy'; +import * as dotenv from 'dotenv' +dotenv.config() + +const banner = +`/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ +`; + +const demo = (process.argv[2] === 'demo'); +const prod = (process.argv[2] === 'production'); + +let renamePlugin = { + name: 'rename-styles', + setup(build) { + build.onEnd(() => { + const { outfile } = build.initialOptions; + const outcss = outfile.replace(/\.js$/, '.css'); + const fixcss = outfile.replace(/main\.js$/, 'styles.css'); + if (fs.existsSync(outcss)) { + console.log('Renaming', outcss, 'to', fixcss); + fs.renameSync(outcss, fixcss); + } + }); + }, +}; + + +const outputDir = prod ? process.env.buildDir : demo ? process.env.demoDir : process.env.devDir +esbuild.build({ + banner: { + js: banner, + }, + entryPoints: ['main.ts'], + bundle: true, + external: [ + 'obsidian', + 'electron', + '@codemirror/autocomplete', + '@codemirror/collab', + '@codemirror/commands', + '@codemirror/language', + '@codemirror/lint', + '@codemirror/search', + '@codemirror/state', + '@codemirror/view', + ...builtins], + format: 'cjs', + watch: !prod, + target: 'es2018', + logLevel: "info", + sourcemap: prod ? false : 'inline', + treeShaking: true, + outfile: outputDir+'/main.js', + plugins: [renamePlugin, + ...(prod ? [copy({ + resolveFrom: 'cwd', + assets: { + from: ['./manifest.json'], + to: [outputDir+'/manifest.json'], + }, + })] : []), + ], +}).catch(() => process.exit(1)); + diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..3255cfe --- /dev/null +++ b/global.d.ts @@ -0,0 +1 @@ +declare module '*.css'; \ No newline at end of file diff --git a/main.js b/main.js index 9c808fd..ed175d6 100644 --- a/main.js +++ b/main.js @@ -30,211 +30,211 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru // node_modules/dayjs/dayjs.min.js var require_dayjs_min = __commonJS({ "node_modules/dayjs/dayjs.min.js"(exports, module2) { - !function(t3, e5) { - typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e5() : typeof define == "function" && define.amd ? define(e5) : (t3 = typeof globalThis != "undefined" ? globalThis : t3 || self).dayjs = e5(); + !function(t3, e3) { + typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e3() : typeof define == "function" && define.amd ? define(e3) : (t3 = typeof globalThis != "undefined" ? globalThis : t3 || self).dayjs = e3(); }(exports, function() { "use strict"; - var t3 = 1e3, e5 = 6e4, n4 = 36e5, r6 = "millisecond", i5 = "second", s10 = "minute", u6 = "hour", a5 = "day", o6 = "week", f4 = "month", h4 = "quarter", c3 = "year", d5 = "date", l4 = "Invalid Date", $4 = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y4 = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M4 = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t4) { - var e6 = ["th", "st", "nd", "rd"], n5 = t4 % 100; - return "[" + t4 + (e6[(n5 - 20) % 10] || e6[n5] || e6[0]) + "]"; - } }, m5 = function(t4, e6, n5) { - var r7 = String(t4); - return !r7 || r7.length >= e6 ? t4 : "" + Array(e6 + 1 - r7.length).join(n5) + t4; - }, v3 = { s: m5, z: function(t4) { - var e6 = -t4.utcOffset(), n5 = Math.abs(e6), r7 = Math.floor(n5 / 60), i6 = n5 % 60; - return (e6 <= 0 ? "+" : "-") + m5(r7, 2, "0") + ":" + m5(i6, 2, "0"); - }, m: function t4(e6, n5) { - if (e6.date() < n5.date()) - return -t4(n5, e6); - var r7 = 12 * (n5.year() - e6.year()) + (n5.month() - e6.month()), i6 = e6.clone().add(r7, f4), s11 = n5 - i6 < 0, u7 = e6.clone().add(r7 + (s11 ? -1 : 1), f4); - return +(-(r7 + (n5 - i6) / (s11 ? i6 - u7 : u7 - i6)) || 0); + var t3 = 1e3, e3 = 6e4, n2 = 36e5, r3 = "millisecond", i3 = "second", s3 = "minute", u3 = "hour", a3 = "day", o3 = "week", f4 = "month", h3 = "quarter", c3 = "year", d3 = "date", l3 = "Invalid Date", $3 = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y3 = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M3 = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t4) { + var e4 = ["th", "st", "nd", "rd"], n3 = t4 % 100; + return "[" + t4 + (e4[(n3 - 20) % 10] || e4[n3] || e4[0]) + "]"; + } }, m3 = function(t4, e4, n3) { + var r4 = String(t4); + return !r4 || r4.length >= e4 ? t4 : "" + Array(e4 + 1 - r4.length).join(n3) + t4; + }, v3 = { s: m3, z: function(t4) { + var e4 = -t4.utcOffset(), n3 = Math.abs(e4), r4 = Math.floor(n3 / 60), i4 = n3 % 60; + return (e4 <= 0 ? "+" : "-") + m3(r4, 2, "0") + ":" + m3(i4, 2, "0"); + }, m: function t4(e4, n3) { + if (e4.date() < n3.date()) + return -t4(n3, e4); + var r4 = 12 * (n3.year() - e4.year()) + (n3.month() - e4.month()), i4 = e4.clone().add(r4, f4), s4 = n3 - i4 < 0, u4 = e4.clone().add(r4 + (s4 ? -1 : 1), f4); + return +(-(r4 + (n3 - i4) / (s4 ? i4 - u4 : u4 - i4)) || 0); }, a: function(t4) { return t4 < 0 ? Math.ceil(t4) || 0 : Math.floor(t4); }, p: function(t4) { - return { M: f4, y: c3, w: o6, d: a5, D: d5, h: u6, m: s10, s: i5, ms: r6, Q: h4 }[t4] || String(t4 || "").toLowerCase().replace(/s$/, ""); + return { M: f4, y: c3, w: o3, d: a3, D: d3, h: u3, m: s3, s: i3, ms: r3, Q: h3 }[t4] || String(t4 || "").toLowerCase().replace(/s$/, ""); }, u: function(t4) { return t4 === void 0; } }, g4 = "en", D2 = {}; - D2[g4] = M4; - var p5 = function(t4) { + D2[g4] = M3; + var p3 = function(t4) { return t4 instanceof _3; - }, S4 = function t4(e6, n5, r7) { - var i6; - if (!e6) + }, S2 = function t4(e4, n3, r4) { + var i4; + if (!e4) return g4; - if (typeof e6 == "string") { - var s11 = e6.toLowerCase(); - D2[s11] && (i6 = s11), n5 && (D2[s11] = n5, i6 = s11); - var u7 = e6.split("-"); - if (!i6 && u7.length > 1) - return t4(u7[0]); + if (typeof e4 == "string") { + var s4 = e4.toLowerCase(); + D2[s4] && (i4 = s4), n3 && (D2[s4] = n3, i4 = s4); + var u4 = e4.split("-"); + if (!i4 && u4.length > 1) + return t4(u4[0]); } else { - var a6 = e6.name; - D2[a6] = e6, i6 = a6; + var a4 = e4.name; + D2[a4] = e4, i4 = a4; } - return !r7 && i6 && (g4 = i6), i6 || !r7 && g4; - }, w6 = function(t4, e6) { - if (p5(t4)) + return !r4 && i4 && (g4 = i4), i4 || !r4 && g4; + }, w4 = function(t4, e4) { + if (p3(t4)) return t4.clone(); - var n5 = typeof e6 == "object" ? e6 : {}; - return n5.date = t4, n5.args = arguments, new _3(n5); - }, O4 = v3; - O4.l = S4, O4.i = p5, O4.w = function(t4, e6) { - return w6(t4, { locale: e6.$L, utc: e6.$u, x: e6.$x, $offset: e6.$offset }); + var n3 = typeof e4 == "object" ? e4 : {}; + return n3.date = t4, n3.args = arguments, new _3(n3); + }, O3 = v3; + O3.l = S2, O3.i = p3, O3.w = function(t4, e4) { + return w4(t4, { locale: e4.$L, utc: e4.$u, x: e4.$x, $offset: e4.$offset }); }; var _3 = function() { - function M5(t4) { - this.$L = S4(t4.locale, null, true), this.parse(t4); + function M4(t4) { + this.$L = S2(t4.locale, null, true), this.parse(t4); } - var m6 = M5.prototype; - return m6.parse = function(t4) { + var m4 = M4.prototype; + return m4.parse = function(t4) { this.$d = function(t5) { - var e6 = t5.date, n5 = t5.utc; - if (e6 === null) + var e4 = t5.date, n3 = t5.utc; + if (e4 === null) return new Date(NaN); - if (O4.u(e6)) + if (O3.u(e4)) return new Date(); - if (e6 instanceof Date) - return new Date(e6); - if (typeof e6 == "string" && !/Z$/i.test(e6)) { - var r7 = e6.match($4); - if (r7) { - var i6 = r7[2] - 1 || 0, s11 = (r7[7] || "0").substring(0, 3); - return n5 ? new Date(Date.UTC(r7[1], i6, r7[3] || 1, r7[4] || 0, r7[5] || 0, r7[6] || 0, s11)) : new Date(r7[1], i6, r7[3] || 1, r7[4] || 0, r7[5] || 0, r7[6] || 0, s11); + if (e4 instanceof Date) + return new Date(e4); + if (typeof e4 == "string" && !/Z$/i.test(e4)) { + var r4 = e4.match($3); + if (r4) { + var i4 = r4[2] - 1 || 0, s4 = (r4[7] || "0").substring(0, 3); + return n3 ? new Date(Date.UTC(r4[1], i4, r4[3] || 1, r4[4] || 0, r4[5] || 0, r4[6] || 0, s4)) : new Date(r4[1], i4, r4[3] || 1, r4[4] || 0, r4[5] || 0, r4[6] || 0, s4); } } - return new Date(e6); + return new Date(e4); }(t4), this.$x = t4.x || {}, this.init(); - }, m6.init = function() { + }, m4.init = function() { var t4 = this.$d; this.$y = t4.getFullYear(), this.$M = t4.getMonth(), this.$D = t4.getDate(), this.$W = t4.getDay(), this.$H = t4.getHours(), this.$m = t4.getMinutes(), this.$s = t4.getSeconds(), this.$ms = t4.getMilliseconds(); - }, m6.$utils = function() { - return O4; - }, m6.isValid = function() { - return !(this.$d.toString() === l4); - }, m6.isSame = function(t4, e6) { - var n5 = w6(t4); - return this.startOf(e6) <= n5 && n5 <= this.endOf(e6); - }, m6.isAfter = function(t4, e6) { - return w6(t4) < this.startOf(e6); - }, m6.isBefore = function(t4, e6) { - return this.endOf(e6) < w6(t4); - }, m6.$g = function(t4, e6, n5) { - return O4.u(t4) ? this[e6] : this.set(n5, t4); - }, m6.unix = function() { + }, m4.$utils = function() { + return O3; + }, m4.isValid = function() { + return !(this.$d.toString() === l3); + }, m4.isSame = function(t4, e4) { + var n3 = w4(t4); + return this.startOf(e4) <= n3 && n3 <= this.endOf(e4); + }, m4.isAfter = function(t4, e4) { + return w4(t4) < this.startOf(e4); + }, m4.isBefore = function(t4, e4) { + return this.endOf(e4) < w4(t4); + }, m4.$g = function(t4, e4, n3) { + return O3.u(t4) ? this[e4] : this.set(n3, t4); + }, m4.unix = function() { return Math.floor(this.valueOf() / 1e3); - }, m6.valueOf = function() { + }, m4.valueOf = function() { return this.$d.getTime(); - }, m6.startOf = function(t4, e6) { - var n5 = this, r7 = !!O4.u(e6) || e6, h5 = O4.p(t4), l5 = function(t5, e7) { - var i6 = O4.w(n5.$u ? Date.UTC(n5.$y, e7, t5) : new Date(n5.$y, e7, t5), n5); - return r7 ? i6 : i6.endOf(a5); - }, $5 = function(t5, e7) { - return O4.w(n5.toDate()[t5].apply(n5.toDate("s"), (r7 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e7)), n5); - }, y5 = this.$W, M6 = this.$M, m7 = this.$D, v4 = "set" + (this.$u ? "UTC" : ""); - switch (h5) { + }, m4.startOf = function(t4, e4) { + var n3 = this, r4 = !!O3.u(e4) || e4, h4 = O3.p(t4), l4 = function(t5, e5) { + var i4 = O3.w(n3.$u ? Date.UTC(n3.$y, e5, t5) : new Date(n3.$y, e5, t5), n3); + return r4 ? i4 : i4.endOf(a3); + }, $4 = function(t5, e5) { + return O3.w(n3.toDate()[t5].apply(n3.toDate("s"), (r4 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e5)), n3); + }, y4 = this.$W, M5 = this.$M, m5 = this.$D, v4 = "set" + (this.$u ? "UTC" : ""); + switch (h4) { case c3: - return r7 ? l5(1, 0) : l5(31, 11); + return r4 ? l4(1, 0) : l4(31, 11); case f4: - return r7 ? l5(1, M6) : l5(0, M6 + 1); - case o6: - var g5 = this.$locale().weekStart || 0, D3 = (y5 < g5 ? y5 + 7 : y5) - g5; - return l5(r7 ? m7 - D3 : m7 + (6 - D3), M6); - case a5: - case d5: - return $5(v4 + "Hours", 0); - case u6: - return $5(v4 + "Minutes", 1); - case s10: - return $5(v4 + "Seconds", 2); - case i5: - return $5(v4 + "Milliseconds", 3); + return r4 ? l4(1, M5) : l4(0, M5 + 1); + case o3: + var g5 = this.$locale().weekStart || 0, D3 = (y4 < g5 ? y4 + 7 : y4) - g5; + return l4(r4 ? m5 - D3 : m5 + (6 - D3), M5); + case a3: + case d3: + return $4(v4 + "Hours", 0); + case u3: + return $4(v4 + "Minutes", 1); + case s3: + return $4(v4 + "Seconds", 2); + case i3: + return $4(v4 + "Milliseconds", 3); default: return this.clone(); } - }, m6.endOf = function(t4) { + }, m4.endOf = function(t4) { return this.startOf(t4, false); - }, m6.$set = function(t4, e6) { - var n5, o7 = O4.p(t4), h5 = "set" + (this.$u ? "UTC" : ""), l5 = (n5 = {}, n5[a5] = h5 + "Date", n5[d5] = h5 + "Date", n5[f4] = h5 + "Month", n5[c3] = h5 + "FullYear", n5[u6] = h5 + "Hours", n5[s10] = h5 + "Minutes", n5[i5] = h5 + "Seconds", n5[r6] = h5 + "Milliseconds", n5)[o7], $5 = o7 === a5 ? this.$D + (e6 - this.$W) : e6; - if (o7 === f4 || o7 === c3) { - var y5 = this.clone().set(d5, 1); - y5.$d[l5]($5), y5.init(), this.$d = y5.set(d5, Math.min(this.$D, y5.daysInMonth())).$d; + }, m4.$set = function(t4, e4) { + var n3, o4 = O3.p(t4), h4 = "set" + (this.$u ? "UTC" : ""), l4 = (n3 = {}, n3[a3] = h4 + "Date", n3[d3] = h4 + "Date", n3[f4] = h4 + "Month", n3[c3] = h4 + "FullYear", n3[u3] = h4 + "Hours", n3[s3] = h4 + "Minutes", n3[i3] = h4 + "Seconds", n3[r3] = h4 + "Milliseconds", n3)[o4], $4 = o4 === a3 ? this.$D + (e4 - this.$W) : e4; + if (o4 === f4 || o4 === c3) { + var y4 = this.clone().set(d3, 1); + y4.$d[l4]($4), y4.init(), this.$d = y4.set(d3, Math.min(this.$D, y4.daysInMonth())).$d; } else - l5 && this.$d[l5]($5); + l4 && this.$d[l4]($4); return this.init(), this; - }, m6.set = function(t4, e6) { - return this.clone().$set(t4, e6); - }, m6.get = function(t4) { - return this[O4.p(t4)](); - }, m6.add = function(r7, h5) { - var d6, l5 = this; - r7 = Number(r7); - var $5 = O4.p(h5), y5 = function(t4) { - var e6 = w6(l5); - return O4.w(e6.date(e6.date() + Math.round(t4 * r7)), l5); + }, m4.set = function(t4, e4) { + return this.clone().$set(t4, e4); + }, m4.get = function(t4) { + return this[O3.p(t4)](); + }, m4.add = function(r4, h4) { + var d4, l4 = this; + r4 = Number(r4); + var $4 = O3.p(h4), y4 = function(t4) { + var e4 = w4(l4); + return O3.w(e4.date(e4.date() + Math.round(t4 * r4)), l4); }; - if ($5 === f4) - return this.set(f4, this.$M + r7); - if ($5 === c3) - return this.set(c3, this.$y + r7); - if ($5 === a5) - return y5(1); - if ($5 === o6) - return y5(7); - var M6 = (d6 = {}, d6[s10] = e5, d6[u6] = n4, d6[i5] = t3, d6)[$5] || 1, m7 = this.$d.getTime() + r7 * M6; - return O4.w(m7, this); - }, m6.subtract = function(t4, e6) { - return this.add(-1 * t4, e6); - }, m6.format = function(t4) { - var e6 = this, n5 = this.$locale(); + if ($4 === f4) + return this.set(f4, this.$M + r4); + if ($4 === c3) + return this.set(c3, this.$y + r4); + if ($4 === a3) + return y4(1); + if ($4 === o3) + return y4(7); + var M5 = (d4 = {}, d4[s3] = e3, d4[u3] = n2, d4[i3] = t3, d4)[$4] || 1, m5 = this.$d.getTime() + r4 * M5; + return O3.w(m5, this); + }, m4.subtract = function(t4, e4) { + return this.add(-1 * t4, e4); + }, m4.format = function(t4) { + var e4 = this, n3 = this.$locale(); if (!this.isValid()) - return n5.invalidDate || l4; - var r7 = t4 || "YYYY-MM-DDTHH:mm:ssZ", i6 = O4.z(this), s11 = this.$H, u7 = this.$m, a6 = this.$M, o7 = n5.weekdays, f5 = n5.months, h5 = function(t5, n6, i7, s12) { - return t5 && (t5[n6] || t5(e6, r7)) || i7[n6].slice(0, s12); + return n3.invalidDate || l3; + var r4 = t4 || "YYYY-MM-DDTHH:mm:ssZ", i4 = O3.z(this), s4 = this.$H, u4 = this.$m, a4 = this.$M, o4 = n3.weekdays, f5 = n3.months, h4 = function(t5, n4, i5, s5) { + return t5 && (t5[n4] || t5(e4, r4)) || i5[n4].slice(0, s5); }, c4 = function(t5) { - return O4.s(s11 % 12 || 12, t5, "0"); - }, d6 = n5.meridiem || function(t5, e7, n6) { - var r8 = t5 < 12 ? "AM" : "PM"; - return n6 ? r8.toLowerCase() : r8; - }, $5 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a6 + 1, MM: O4.s(a6 + 1, 2, "0"), MMM: h5(n5.monthsShort, a6, f5, 3), MMMM: h5(f5, a6), D: this.$D, DD: O4.s(this.$D, 2, "0"), d: String(this.$W), dd: h5(n5.weekdaysMin, this.$W, o7, 2), ddd: h5(n5.weekdaysShort, this.$W, o7, 3), dddd: o7[this.$W], H: String(s11), HH: O4.s(s11, 2, "0"), h: c4(1), hh: c4(2), a: d6(s11, u7, true), A: d6(s11, u7, false), m: String(u7), mm: O4.s(u7, 2, "0"), s: String(this.$s), ss: O4.s(this.$s, 2, "0"), SSS: O4.s(this.$ms, 3, "0"), Z: i6 }; - return r7.replace(y4, function(t5, e7) { - return e7 || $5[t5] || i6.replace(":", ""); + return O3.s(s4 % 12 || 12, t5, "0"); + }, d4 = n3.meridiem || function(t5, e5, n4) { + var r5 = t5 < 12 ? "AM" : "PM"; + return n4 ? r5.toLowerCase() : r5; + }, $4 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a4 + 1, MM: O3.s(a4 + 1, 2, "0"), MMM: h4(n3.monthsShort, a4, f5, 3), MMMM: h4(f5, a4), D: this.$D, DD: O3.s(this.$D, 2, "0"), d: String(this.$W), dd: h4(n3.weekdaysMin, this.$W, o4, 2), ddd: h4(n3.weekdaysShort, this.$W, o4, 3), dddd: o4[this.$W], H: String(s4), HH: O3.s(s4, 2, "0"), h: c4(1), hh: c4(2), a: d4(s4, u4, true), A: d4(s4, u4, false), m: String(u4), mm: O3.s(u4, 2, "0"), s: String(this.$s), ss: O3.s(this.$s, 2, "0"), SSS: O3.s(this.$ms, 3, "0"), Z: i4 }; + return r4.replace(y3, function(t5, e5) { + return e5 || $4[t5] || i4.replace(":", ""); }); - }, m6.utcOffset = function() { + }, m4.utcOffset = function() { return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); - }, m6.diff = function(r7, d6, l5) { - var $5, y5 = O4.p(d6), M6 = w6(r7), m7 = (M6.utcOffset() - this.utcOffset()) * e5, v4 = this - M6, g5 = O4.m(this, M6); - return g5 = ($5 = {}, $5[c3] = g5 / 12, $5[f4] = g5, $5[h4] = g5 / 3, $5[o6] = (v4 - m7) / 6048e5, $5[a5] = (v4 - m7) / 864e5, $5[u6] = v4 / n4, $5[s10] = v4 / e5, $5[i5] = v4 / t3, $5)[y5] || v4, l5 ? g5 : O4.a(g5); - }, m6.daysInMonth = function() { + }, m4.diff = function(r4, d4, l4) { + var $4, y4 = O3.p(d4), M5 = w4(r4), m5 = (M5.utcOffset() - this.utcOffset()) * e3, v4 = this - M5, g5 = O3.m(this, M5); + return g5 = ($4 = {}, $4[c3] = g5 / 12, $4[f4] = g5, $4[h3] = g5 / 3, $4[o3] = (v4 - m5) / 6048e5, $4[a3] = (v4 - m5) / 864e5, $4[u3] = v4 / n2, $4[s3] = v4 / e3, $4[i3] = v4 / t3, $4)[y4] || v4, l4 ? g5 : O3.a(g5); + }, m4.daysInMonth = function() { return this.endOf(f4).$D; - }, m6.$locale = function() { + }, m4.$locale = function() { return D2[this.$L]; - }, m6.locale = function(t4, e6) { + }, m4.locale = function(t4, e4) { if (!t4) return this.$L; - var n5 = this.clone(), r7 = S4(t4, e6, true); - return r7 && (n5.$L = r7), n5; - }, m6.clone = function() { - return O4.w(this.$d, this); - }, m6.toDate = function() { + var n3 = this.clone(), r4 = S2(t4, e4, true); + return r4 && (n3.$L = r4), n3; + }, m4.clone = function() { + return O3.w(this.$d, this); + }, m4.toDate = function() { return new Date(this.valueOf()); - }, m6.toJSON = function() { + }, m4.toJSON = function() { return this.isValid() ? this.toISOString() : null; - }, m6.toISOString = function() { + }, m4.toISOString = function() { return this.$d.toISOString(); - }, m6.toString = function() { + }, m4.toString = function() { return this.$d.toUTCString(); - }, M5; - }(), T8 = _3.prototype; - return w6.prototype = T8, [["$ms", r6], ["$s", i5], ["$m", s10], ["$H", u6], ["$W", a5], ["$M", f4], ["$y", c3], ["$D", d5]].forEach(function(t4) { - T8[t4[1]] = function(e6) { - return this.$g(e6, t4[0], t4[1]); + }, M4; + }(), T5 = _3.prototype; + return w4.prototype = T5, [["$ms", r3], ["$s", i3], ["$m", s3], ["$H", u3], ["$W", a3], ["$M", f4], ["$y", c3], ["$D", d3]].forEach(function(t4) { + T5[t4[1]] = function(e4) { + return this.$g(e4, t4[0], t4[1]); }; - }), w6.extend = function(t4, e6) { - return t4.$i || (t4(e6, _3, w6), t4.$i = true), w6; - }, w6.locale = S4, w6.isDayjs = p5, w6.unix = function(t4) { - return w6(1e3 * t4); - }, w6.en = D2[g4], w6.Ls = D2, w6.p = {}, w6; + }), w4.extend = function(t4, e4) { + return t4.$i || (t4(e4, _3, w4), t4.$i = true), w4; + }, w4.locale = S2, w4.isDayjs = p3, w4.unix = function(t4) { + return w4(1e3 * t4); + }, w4.en = D2[g4], w4.Ls = D2, w4.p = {}, w4; }); } }); @@ -291,52 +291,52 @@ var require_tslib = __commonJS({ }; } })(function(exporter) { - var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d5, b4) { - d5.__proto__ = b4; - } || function(d5, b4) { - for (var p5 in b4) - if (Object.prototype.hasOwnProperty.call(b4, p5)) - d5[p5] = b4[p5]; + var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d3, b3) { + d3.__proto__ = b3; + } || function(d3, b3) { + for (var p3 in b3) + if (Object.prototype.hasOwnProperty.call(b3, p3)) + d3[p3] = b3[p3]; }; - __extends2 = function(d5, b4) { - if (typeof b4 !== "function" && b4 !== null) - throw new TypeError("Class extends value " + String(b4) + " is not a constructor or null"); - extendStatics(d5, b4); + __extends2 = function(d3, b3) { + if (typeof b3 !== "function" && b3 !== null) + throw new TypeError("Class extends value " + String(b3) + " is not a constructor or null"); + extendStatics(d3, b3); function __() { - this.constructor = d5; + this.constructor = d3; } - d5.prototype = b4 === null ? Object.create(b4) : (__.prototype = b4.prototype, new __()); + d3.prototype = b3 === null ? Object.create(b3) : (__.prototype = b3.prototype, new __()); }; __assign2 = Object.assign || function(t3) { - for (var s10, i5 = 1, n4 = arguments.length; i5 < n4; i5++) { - s10 = arguments[i5]; - for (var p5 in s10) - if (Object.prototype.hasOwnProperty.call(s10, p5)) - t3[p5] = s10[p5]; + for (var s3, i3 = 1, n2 = arguments.length; i3 < n2; i3++) { + s3 = arguments[i3]; + for (var p3 in s3) + if (Object.prototype.hasOwnProperty.call(s3, p3)) + t3[p3] = s3[p3]; } return t3; }; - __rest2 = function(s10, e5) { + __rest2 = function(s3, e3) { var t3 = {}; - for (var p5 in s10) - if (Object.prototype.hasOwnProperty.call(s10, p5) && e5.indexOf(p5) < 0) - t3[p5] = s10[p5]; - if (s10 != null && typeof Object.getOwnPropertySymbols === "function") - for (var i5 = 0, p5 = Object.getOwnPropertySymbols(s10); i5 < p5.length; i5++) { - if (e5.indexOf(p5[i5]) < 0 && Object.prototype.propertyIsEnumerable.call(s10, p5[i5])) - t3[p5[i5]] = s10[p5[i5]]; + for (var p3 in s3) + if (Object.prototype.hasOwnProperty.call(s3, p3) && e3.indexOf(p3) < 0) + t3[p3] = s3[p3]; + if (s3 != null && typeof Object.getOwnPropertySymbols === "function") + for (var i3 = 0, p3 = Object.getOwnPropertySymbols(s3); i3 < p3.length; i3++) { + if (e3.indexOf(p3[i3]) < 0 && Object.prototype.propertyIsEnumerable.call(s3, p3[i3])) + t3[p3[i3]] = s3[p3[i3]]; } return t3; }; __decorate2 = function(decorators, target, key2, desc) { - var c3 = arguments.length, r6 = c3 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key2) : desc, d5; + var c3 = arguments.length, r3 = c3 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key2) : desc, d3; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r6 = Reflect.decorate(decorators, target, key2, desc); + r3 = Reflect.decorate(decorators, target, key2, desc); else - for (var i5 = decorators.length - 1; i5 >= 0; i5--) - if (d5 = decorators[i5]) - r6 = (c3 < 3 ? d5(r6) : c3 > 3 ? d5(target, key2, r6) : d5(target, key2)) || r6; - return c3 > 3 && r6 && Object.defineProperty(target, key2, r6), r6; + for (var i3 = decorators.length - 1; i3 >= 0; i3--) + if (d3 = decorators[i3]) + r3 = (c3 < 3 ? d3(r3) : c3 > 3 ? d3(target, key2, r3) : d3(target, key2)) || r3; + return c3 > 3 && r3 && Object.defineProperty(target, key2, r3), r3; }; __param2 = function(paramIndex, decorator) { return function(target, key2) { @@ -357,15 +357,15 @@ var require_tslib = __commonJS({ function fulfilled(value) { try { step(generator.next(value)); - } catch (e5) { - reject(e5); + } catch (e3) { + reject(e3); } } function rejected(value) { try { step(generator["throw"](value)); - } catch (e5) { - reject(e5); + } catch (e3) { + reject(e3); } } function step(result) { @@ -379,13 +379,13 @@ var require_tslib = __commonJS({ if (t3[0] & 1) throw t3[1]; return t3[1]; - }, trys: [], ops: [] }, f4, y4, t3, g4; + }, trys: [], ops: [] }, f4, y3, t3, g4; return g4 = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g4[Symbol.iterator] = function() { return this; }), g4; - function verb(n4) { + function verb(n2) { return function(v3) { - return step([n4, v3]); + return step([n2, v3]); }; } function step(op) { @@ -393,9 +393,9 @@ var require_tslib = __commonJS({ throw new TypeError("Generator is already executing."); while (g4 && (g4 = 0, op[0] && (_3 = 0)), _3) try { - if (f4 = 1, y4 && (t3 = op[0] & 2 ? y4["return"] : op[0] ? y4["throw"] || ((t3 = y4["return"]) && t3.call(y4), 0) : y4.next) && !(t3 = t3.call(y4, op[1])).done) + if (f4 = 1, y3 && (t3 = op[0] & 2 ? y3["return"] : op[0] ? y3["throw"] || ((t3 = y3["return"]) && t3.call(y3), 0) : y3.next) && !(t3 = t3.call(y3, op[1])).done) return t3; - if (y4 = 0, t3) + if (y3 = 0, t3) op = [op[0] & 2, t3.value]; switch (op[0]) { case 0: @@ -407,7 +407,7 @@ var require_tslib = __commonJS({ return { value: op[1], done: false }; case 5: _3.label++; - y4 = op[1]; + y3 = op[1]; op = [0]; continue; case 7: @@ -439,9 +439,9 @@ var require_tslib = __commonJS({ continue; } op = body.call(thisArg, _3); - } catch (e5) { - op = [6, e5]; - y4 = 0; + } catch (e3) { + op = [6, e3]; + y3 = 0; } finally { f4 = t3 = 0; } @@ -450,81 +450,81 @@ var require_tslib = __commonJS({ return { value: op[0] ? op[1] : void 0, done: true }; } }; - __exportStar2 = function(m5, o6) { - for (var p5 in m5) - if (p5 !== "default" && !Object.prototype.hasOwnProperty.call(o6, p5)) - __createBinding2(o6, m5, p5); + __exportStar2 = function(m3, o3) { + for (var p3 in m3) + if (p3 !== "default" && !Object.prototype.hasOwnProperty.call(o3, p3)) + __createBinding2(o3, m3, p3); }; - __createBinding2 = Object.create ? function(o6, m5, k4, k22) { + __createBinding2 = Object.create ? function(o3, m3, k4, k22) { if (k22 === void 0) k22 = k4; - var desc = Object.getOwnPropertyDescriptor(m5, k4); - if (!desc || ("get" in desc ? !m5.__esModule : desc.writable || desc.configurable)) { + var desc = Object.getOwnPropertyDescriptor(m3, k4); + if (!desc || ("get" in desc ? !m3.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { - return m5[k4]; + return m3[k4]; } }; } - Object.defineProperty(o6, k22, desc); - } : function(o6, m5, k4, k22) { + Object.defineProperty(o3, k22, desc); + } : function(o3, m3, k4, k22) { if (k22 === void 0) k22 = k4; - o6[k22] = m5[k4]; + o3[k22] = m3[k4]; }; - __values2 = function(o6) { - var s10 = typeof Symbol === "function" && Symbol.iterator, m5 = s10 && o6[s10], i5 = 0; - if (m5) - return m5.call(o6); - if (o6 && typeof o6.length === "number") + __values2 = function(o3) { + var s3 = typeof Symbol === "function" && Symbol.iterator, m3 = s3 && o3[s3], i3 = 0; + if (m3) + return m3.call(o3); + if (o3 && typeof o3.length === "number") return { next: function() { - if (o6 && i5 >= o6.length) - o6 = void 0; - return { value: o6 && o6[i5++], done: !o6 }; + if (o3 && i3 >= o3.length) + o3 = void 0; + return { value: o3 && o3[i3++], done: !o3 }; } }; - throw new TypeError(s10 ? "Object is not iterable." : "Symbol.iterator is not defined."); + throw new TypeError(s3 ? "Object is not iterable." : "Symbol.iterator is not defined."); }; - __read2 = function(o6, n4) { - var m5 = typeof Symbol === "function" && o6[Symbol.iterator]; - if (!m5) - return o6; - var i5 = m5.call(o6), r6, ar = [], e5; + __read2 = function(o3, n2) { + var m3 = typeof Symbol === "function" && o3[Symbol.iterator]; + if (!m3) + return o3; + var i3 = m3.call(o3), r3, ar = [], e3; try { - while ((n4 === void 0 || n4-- > 0) && !(r6 = i5.next()).done) - ar.push(r6.value); + while ((n2 === void 0 || n2-- > 0) && !(r3 = i3.next()).done) + ar.push(r3.value); } catch (error) { - e5 = { error }; + e3 = { error }; } finally { try { - if (r6 && !r6.done && (m5 = i5["return"])) - m5.call(i5); + if (r3 && !r3.done && (m3 = i3["return"])) + m3.call(i3); } finally { - if (e5) - throw e5.error; + if (e3) + throw e3.error; } } return ar; }; __spread2 = function() { - for (var ar = [], i5 = 0; i5 < arguments.length; i5++) - ar = ar.concat(__read2(arguments[i5])); + for (var ar = [], i3 = 0; i3 < arguments.length; i3++) + ar = ar.concat(__read2(arguments[i3])); return ar; }; __spreadArrays2 = function() { - for (var s10 = 0, i5 = 0, il = arguments.length; i5 < il; i5++) - s10 += arguments[i5].length; - for (var r6 = Array(s10), k4 = 0, i5 = 0; i5 < il; i5++) - for (var a5 = arguments[i5], j5 = 0, jl = a5.length; j5 < jl; j5++, k4++) - r6[k4] = a5[j5]; - return r6; + for (var s3 = 0, i3 = 0, il = arguments.length; i3 < il; i3++) + s3 += arguments[i3].length; + for (var r3 = Array(s3), k4 = 0, i3 = 0; i3 < il; i3++) + for (var a3 = arguments[i3], j4 = 0, jl = a3.length; j4 < jl; j4++, k4++) + r3[k4] = a3[j4]; + return r3; }; __spreadArray2 = function(to, from, pack) { if (pack || arguments.length === 2) - for (var i5 = 0, l4 = from.length, ar; i5 < l4; i5++) { - if (ar || !(i5 in from)) { + for (var i3 = 0, l3 = from.length, ar; i3 < l3; i3++) { + if (ar || !(i3 in from)) { if (!ar) - ar = Array.prototype.slice.call(from, 0, i5); - ar[i5] = from[i5]; + ar = Array.prototype.slice.call(from, 0, i3); + ar[i3] = from[i3]; } } return to.concat(ar || Array.prototype.slice.call(from)); @@ -535,27 +535,27 @@ var require_tslib = __commonJS({ __asyncGenerator2 = function(thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g4 = generator.apply(thisArg, _arguments || []), i5, q4 = []; - return i5 = {}, verb("next"), verb("throw"), verb("return"), i5[Symbol.asyncIterator] = function() { + var g4 = generator.apply(thisArg, _arguments || []), i3, q4 = []; + return i3 = {}, verb("next"), verb("throw"), verb("return"), i3[Symbol.asyncIterator] = function() { return this; - }, i5; - function verb(n4) { - if (g4[n4]) - i5[n4] = function(v3) { - return new Promise(function(a5, b4) { - q4.push([n4, v3, a5, b4]) > 1 || resume(n4, v3); + }, i3; + function verb(n2) { + if (g4[n2]) + i3[n2] = function(v3) { + return new Promise(function(a3, b3) { + q4.push([n2, v3, a3, b3]) > 1 || resume(n2, v3); }); }; } - function resume(n4, v3) { + function resume(n2, v3) { try { - step(g4[n4](v3)); - } catch (e5) { - settle(q4[0][3], e5); + step(g4[n2](v3)); + } catch (e3) { + settle(q4[0][3], e3); } } - function step(r6) { - r6.value instanceof __await2 ? Promise.resolve(r6.value.v).then(fulfill, reject) : settle(q4[0][2], r6); + function step(r3) { + r3.value instanceof __await2 ? Promise.resolve(r3.value.v).then(fulfill, reject) : settle(q4[0][2], r3); } function fulfill(value) { resume("next", value); @@ -568,36 +568,36 @@ var require_tslib = __commonJS({ resume(q4[0][0], q4[0][1]); } }; - __asyncDelegator2 = function(o6) { - var i5, p5; - return i5 = {}, verb("next"), verb("throw", function(e5) { - throw e5; - }), verb("return"), i5[Symbol.iterator] = function() { + __asyncDelegator2 = function(o3) { + var i3, p3; + return i3 = {}, verb("next"), verb("throw", function(e3) { + throw e3; + }), verb("return"), i3[Symbol.iterator] = function() { return this; - }, i5; - function verb(n4, f4) { - i5[n4] = o6[n4] ? function(v3) { - return (p5 = !p5) ? { value: __await2(o6[n4](v3)), done: n4 === "return" } : f4 ? f4(v3) : v3; + }, i3; + function verb(n2, f4) { + i3[n2] = o3[n2] ? function(v3) { + return (p3 = !p3) ? { value: __await2(o3[n2](v3)), done: n2 === "return" } : f4 ? f4(v3) : v3; } : f4; } }; - __asyncValues2 = function(o6) { + __asyncValues2 = function(o3) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m5 = o6[Symbol.asyncIterator], i5; - return m5 ? m5.call(o6) : (o6 = typeof __values2 === "function" ? __values2(o6) : o6[Symbol.iterator](), i5 = {}, verb("next"), verb("throw"), verb("return"), i5[Symbol.asyncIterator] = function() { + var m3 = o3[Symbol.asyncIterator], i3; + return m3 ? m3.call(o3) : (o3 = typeof __values2 === "function" ? __values2(o3) : o3[Symbol.iterator](), i3 = {}, verb("next"), verb("throw"), verb("return"), i3[Symbol.asyncIterator] = function() { return this; - }, i5); - function verb(n4) { - i5[n4] = o6[n4] && function(v3) { + }, i3); + function verb(n2) { + i3[n2] = o3[n2] && function(v3) { return new Promise(function(resolve, reject) { - v3 = o6[n4](v3), settle(resolve, reject, v3.done, v3.value); + v3 = o3[n2](v3), settle(resolve, reject, v3.done, v3.value); }); }; } - function settle(resolve, reject, d5, v3) { + function settle(resolve, reject, d3, v3) { Promise.resolve(v3).then(function(v4) { - resolve({ value: v4, done: d5 }); + resolve({ value: v4, done: d3 }); }, reject); } }; @@ -609,10 +609,10 @@ var require_tslib = __commonJS({ } return cooked; }; - var __setModuleDefault = Object.create ? function(o6, v3) { - Object.defineProperty(o6, "default", { enumerable: true, value: v3 }); - } : function(o6, v3) { - o6["default"] = v3; + var __setModuleDefault = Object.create ? function(o3, v3) { + Object.defineProperty(o3, "default", { enumerable: true, value: v3 }); + } : function(o3, v3) { + o3["default"] = v3; }; __importStar2 = function(mod) { if (mod && mod.__esModule) @@ -682,44 +682,44 @@ var require_tslib = __commonJS({ // node_modules/dayjs/plugin/relativeTime.js var require_relativeTime = __commonJS({ "node_modules/dayjs/plugin/relativeTime.js"(exports, module2) { - !function(r6, e5) { - typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e5() : typeof define == "function" && define.amd ? define(e5) : (r6 = typeof globalThis != "undefined" ? globalThis : r6 || self).dayjs_plugin_relativeTime = e5(); + !function(r3, e3) { + typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e3() : typeof define == "function" && define.amd ? define(e3) : (r3 = typeof globalThis != "undefined" ? globalThis : r3 || self).dayjs_plugin_relativeTime = e3(); }(exports, function() { "use strict"; - return function(r6, e5, t3) { - r6 = r6 || {}; - var n4 = e5.prototype, o6 = { future: "in %s", past: "%s ago", s: "a few seconds", m: "a minute", mm: "%d minutes", h: "an hour", hh: "%d hours", d: "a day", dd: "%d days", M: "a month", MM: "%d months", y: "a year", yy: "%d years" }; - function i5(r7, e6, t4, o7) { - return n4.fromToBase(r7, e6, t4, o7); + return function(r3, e3, t3) { + r3 = r3 || {}; + var n2 = e3.prototype, o3 = { future: "in %s", past: "%s ago", s: "a few seconds", m: "a minute", mm: "%d minutes", h: "an hour", hh: "%d hours", d: "a day", dd: "%d days", M: "a month", MM: "%d months", y: "a year", yy: "%d years" }; + function i3(r4, e4, t4, o4) { + return n2.fromToBase(r4, e4, t4, o4); } - t3.en.relativeTime = o6, n4.fromToBase = function(e6, n5, i6, d6, u6) { - for (var f4, a5, s10, l4 = i6.$locale().relativeTime || o6, h4 = r6.thresholds || [{ l: "s", r: 44, d: "second" }, { l: "m", r: 89 }, { l: "mm", r: 44, d: "minute" }, { l: "h", r: 89 }, { l: "hh", r: 21, d: "hour" }, { l: "d", r: 35 }, { l: "dd", r: 25, d: "day" }, { l: "M", r: 45 }, { l: "MM", r: 10, d: "month" }, { l: "y", r: 17 }, { l: "yy", d: "year" }], m5 = h4.length, c3 = 0; c3 < m5; c3 += 1) { - var y4 = h4[c3]; - y4.d && (f4 = d6 ? t3(e6).diff(i6, y4.d, true) : i6.diff(e6, y4.d, true)); - var p5 = (r6.rounding || Math.round)(Math.abs(f4)); - if (s10 = f4 > 0, p5 <= y4.r || !y4.r) { - p5 <= 1 && c3 > 0 && (y4 = h4[c3 - 1]); - var v3 = l4[y4.l]; - u6 && (p5 = u6("" + p5)), a5 = typeof v3 == "string" ? v3.replace("%d", p5) : v3(p5, n5, y4.l, s10); + t3.en.relativeTime = o3, n2.fromToBase = function(e4, n3, i4, d4, u3) { + for (var f4, a3, s3, l3 = i4.$locale().relativeTime || o3, h3 = r3.thresholds || [{ l: "s", r: 44, d: "second" }, { l: "m", r: 89 }, { l: "mm", r: 44, d: "minute" }, { l: "h", r: 89 }, { l: "hh", r: 21, d: "hour" }, { l: "d", r: 35 }, { l: "dd", r: 25, d: "day" }, { l: "M", r: 45 }, { l: "MM", r: 10, d: "month" }, { l: "y", r: 17 }, { l: "yy", d: "year" }], m3 = h3.length, c3 = 0; c3 < m3; c3 += 1) { + var y3 = h3[c3]; + y3.d && (f4 = d4 ? t3(e4).diff(i4, y3.d, true) : i4.diff(e4, y3.d, true)); + var p3 = (r3.rounding || Math.round)(Math.abs(f4)); + if (s3 = f4 > 0, p3 <= y3.r || !y3.r) { + p3 <= 1 && c3 > 0 && (y3 = h3[c3 - 1]); + var v3 = l3[y3.l]; + u3 && (p3 = u3("" + p3)), a3 = typeof v3 == "string" ? v3.replace("%d", p3) : v3(p3, n3, y3.l, s3); break; } } - if (n5) - return a5; - var M4 = s10 ? l4.future : l4.past; - return typeof M4 == "function" ? M4(a5) : M4.replace("%s", a5); - }, n4.to = function(r7, e6) { - return i5(r7, e6, this, true); - }, n4.from = function(r7, e6) { - return i5(r7, e6, this); + if (n3) + return a3; + var M3 = s3 ? l3.future : l3.past; + return typeof M3 == "function" ? M3(a3) : M3.replace("%s", a3); + }, n2.to = function(r4, e4) { + return i3(r4, e4, this, true); + }, n2.from = function(r4, e4) { + return i3(r4, e4, this); }; - var d5 = function(r7) { - return r7.$u ? t3.utc() : t3(); + var d3 = function(r4) { + return r4.$u ? t3.utc() : t3(); }; - n4.toNow = function(r7) { - return this.to(d5(this), r7); - }, n4.fromNow = function(r7) { - return this.from(d5(this), r7); + n2.toNow = function(r4) { + return this.to(d3(this), r4); + }, n2.fromNow = function(r4) { + return this.from(d3(this), r4); }; }; }); @@ -735,8 +735,8 @@ var require_classnames = __commonJS({ var nativeCodeString = "[native code]"; function classNames4() { var classes = []; - for (var i5 = 0; i5 < arguments.length; i5++) { - var arg = arguments[i5]; + for (var i3 = 0; i3 < arguments.length; i3++) { + var arg = arguments[i3]; if (!arg) continue; var argType = typeof arg; @@ -784,83 +784,83 @@ var require_react_fast_compare = __commonJS({ var hasMap = typeof Map === "function"; var hasSet = typeof Set === "function"; var hasArrayBuffer = typeof ArrayBuffer === "function" && !!ArrayBuffer.isView; - function equal(a5, b4) { - if (a5 === b4) + function equal(a3, b3) { + if (a3 === b3) return true; - if (a5 && b4 && typeof a5 == "object" && typeof b4 == "object") { - if (a5.constructor !== b4.constructor) + if (a3 && b3 && typeof a3 == "object" && typeof b3 == "object") { + if (a3.constructor !== b3.constructor) return false; - var length, i5, keys; - if (Array.isArray(a5)) { - length = a5.length; - if (length != b4.length) + var length, i3, keys; + if (Array.isArray(a3)) { + length = a3.length; + if (length != b3.length) return false; - for (i5 = length; i5-- !== 0; ) - if (!equal(a5[i5], b4[i5])) + for (i3 = length; i3-- !== 0; ) + if (!equal(a3[i3], b3[i3])) return false; return true; } var it; - if (hasMap && a5 instanceof Map && b4 instanceof Map) { - if (a5.size !== b4.size) + if (hasMap && a3 instanceof Map && b3 instanceof Map) { + if (a3.size !== b3.size) return false; - it = a5.entries(); - while (!(i5 = it.next()).done) - if (!b4.has(i5.value[0])) + it = a3.entries(); + while (!(i3 = it.next()).done) + if (!b3.has(i3.value[0])) return false; - it = a5.entries(); - while (!(i5 = it.next()).done) - if (!equal(i5.value[1], b4.get(i5.value[0]))) + it = a3.entries(); + while (!(i3 = it.next()).done) + if (!equal(i3.value[1], b3.get(i3.value[0]))) return false; return true; } - if (hasSet && a5 instanceof Set && b4 instanceof Set) { - if (a5.size !== b4.size) + if (hasSet && a3 instanceof Set && b3 instanceof Set) { + if (a3.size !== b3.size) return false; - it = a5.entries(); - while (!(i5 = it.next()).done) - if (!b4.has(i5.value[0])) + it = a3.entries(); + while (!(i3 = it.next()).done) + if (!b3.has(i3.value[0])) return false; return true; } - if (hasArrayBuffer && ArrayBuffer.isView(a5) && ArrayBuffer.isView(b4)) { - length = a5.length; - if (length != b4.length) + if (hasArrayBuffer && ArrayBuffer.isView(a3) && ArrayBuffer.isView(b3)) { + length = a3.length; + if (length != b3.length) return false; - for (i5 = length; i5-- !== 0; ) - if (a5[i5] !== b4[i5]) + for (i3 = length; i3-- !== 0; ) + if (a3[i3] !== b3[i3]) return false; return true; } - if (a5.constructor === RegExp) - return a5.source === b4.source && a5.flags === b4.flags; - if (a5.valueOf !== Object.prototype.valueOf) - return a5.valueOf() === b4.valueOf(); - if (a5.toString !== Object.prototype.toString) - return a5.toString() === b4.toString(); - keys = Object.keys(a5); + if (a3.constructor === RegExp) + return a3.source === b3.source && a3.flags === b3.flags; + if (a3.valueOf !== Object.prototype.valueOf) + return a3.valueOf() === b3.valueOf(); + if (a3.toString !== Object.prototype.toString) + return a3.toString() === b3.toString(); + keys = Object.keys(a3); length = keys.length; - if (length !== Object.keys(b4).length) + if (length !== Object.keys(b3).length) return false; - for (i5 = length; i5-- !== 0; ) - if (!Object.prototype.hasOwnProperty.call(b4, keys[i5])) + for (i3 = length; i3-- !== 0; ) + if (!Object.prototype.hasOwnProperty.call(b3, keys[i3])) return false; - if (hasElementType && a5 instanceof Element) + if (hasElementType && a3 instanceof Element) return false; - for (i5 = length; i5-- !== 0; ) { - if ((keys[i5] === "_owner" || keys[i5] === "__v" || keys[i5] === "__o") && a5.$$typeof) { + for (i3 = length; i3-- !== 0; ) { + if ((keys[i3] === "_owner" || keys[i3] === "__v" || keys[i3] === "__o") && a3.$$typeof) { continue; } - if (!equal(a5[keys[i5]], b4[keys[i5]])) + if (!equal(a3[keys[i3]], b3[keys[i3]])) return false; } return true; } - return a5 !== a5 && b4 !== b4; + return a3 !== a3 && b3 !== b3; } - module2.exports = function isEqual3(a5, b4) { + module2.exports = function isEqual3(a3, b3) { try { - return equal(a5, b4); + return equal(a3, b3); } catch (error) { if ((error.message || "").match(/stack|recursion/i)) { console.warn("react-fast-compare cannot handle circular refs"); @@ -878,10 +878,10 @@ __export(main_exports, { default: () => MakeMDPlugin }); module.exports = __toCommonJS(main_exports); -var import_obsidian14 = require("obsidian"); +var import_obsidian15 = require("obsidian"); // src/components/Spaces/FileTreeView.tsx -var import_obsidian9 = require("obsidian"); +var import_obsidian10 = require("obsidian"); // node_modules/preact/dist/preact.module.js var n; @@ -894,317 +894,317 @@ var r; var f = {}; var e = []; var c = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; -function s(n4, l4) { - for (var u6 in l4) - n4[u6] = l4[u6]; - return n4; -} -function a(n4) { - var l4 = n4.parentNode; - l4 && l4.removeChild(n4); -} -function h(l4, u6, i5) { - var t3, o6, r6, f4 = {}; - for (r6 in u6) - r6 == "key" ? t3 = u6[r6] : r6 == "ref" ? o6 = u6[r6] : f4[r6] = u6[r6]; - if (arguments.length > 2 && (f4.children = arguments.length > 3 ? n.call(arguments, 2) : i5), typeof l4 == "function" && l4.defaultProps != null) - for (r6 in l4.defaultProps) - f4[r6] === void 0 && (f4[r6] = l4.defaultProps[r6]); - return v(l4, f4, t3, o6, null); -} -function v(n4, i5, t3, o6, r6) { - var f4 = { type: n4, props: i5, key: t3, ref: o6, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: r6 == null ? ++u : r6 }; - return r6 == null && l.vnode != null && l.vnode(f4), f4; +function s(n2, l3) { + for (var u3 in l3) + n2[u3] = l3[u3]; + return n2; +} +function a(n2) { + var l3 = n2.parentNode; + l3 && l3.removeChild(n2); +} +function h(l3, u3, i3) { + var t3, o3, r3, f4 = {}; + for (r3 in u3) + r3 == "key" ? t3 = u3[r3] : r3 == "ref" ? o3 = u3[r3] : f4[r3] = u3[r3]; + if (arguments.length > 2 && (f4.children = arguments.length > 3 ? n.call(arguments, 2) : i3), typeof l3 == "function" && l3.defaultProps != null) + for (r3 in l3.defaultProps) + f4[r3] === void 0 && (f4[r3] = l3.defaultProps[r3]); + return v(l3, f4, t3, o3, null); +} +function v(n2, i3, t3, o3, r3) { + var f4 = { type: n2, props: i3, key: t3, ref: o3, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: r3 == null ? ++u : r3 }; + return r3 == null && l.vnode != null && l.vnode(f4), f4; } function y() { return { current: null }; } -function p(n4) { - return n4.children; -} -function d(n4, l4) { - this.props = n4, this.context = l4; -} -function _(n4, l4) { - if (l4 == null) - return n4.__ ? _(n4.__, n4.__.__k.indexOf(n4) + 1) : null; - for (var u6; l4 < n4.__k.length; l4++) - if ((u6 = n4.__k[l4]) != null && u6.__e != null) - return u6.__e; - return typeof n4.type == "function" ? _(n4) : null; -} -function k(n4) { - var l4, u6; - if ((n4 = n4.__) != null && n4.__c != null) { - for (n4.__e = n4.__c.base = null, l4 = 0; l4 < n4.__k.length; l4++) - if ((u6 = n4.__k[l4]) != null && u6.__e != null) { - n4.__e = n4.__c.base = u6.__e; +function p(n2) { + return n2.children; +} +function d(n2, l3) { + this.props = n2, this.context = l3; +} +function _(n2, l3) { + if (l3 == null) + return n2.__ ? _(n2.__, n2.__.__k.indexOf(n2) + 1) : null; + for (var u3; l3 < n2.__k.length; l3++) + if ((u3 = n2.__k[l3]) != null && u3.__e != null) + return u3.__e; + return typeof n2.type == "function" ? _(n2) : null; +} +function k(n2) { + var l3, u3; + if ((n2 = n2.__) != null && n2.__c != null) { + for (n2.__e = n2.__c.base = null, l3 = 0; l3 < n2.__k.length; l3++) + if ((u3 = n2.__k[l3]) != null && u3.__e != null) { + n2.__e = n2.__c.base = u3.__e; break; } - return k(n4); + return k(n2); } } -function b(n4) { - (!n4.__d && (n4.__d = true) && t.push(n4) && !g.__r++ || o !== l.debounceRendering) && ((o = l.debounceRendering) || setTimeout)(g); +function b(n2) { + (!n2.__d && (n2.__d = true) && t.push(n2) && !g.__r++ || o !== l.debounceRendering) && ((o = l.debounceRendering) || setTimeout)(g); } function g() { - for (var n4; g.__r = t.length; ) - n4 = t.sort(function(n5, l4) { - return n5.__v.__b - l4.__v.__b; - }), t = [], n4.some(function(n5) { - var l4, u6, i5, t3, o6, r6; - n5.__d && (o6 = (t3 = (l4 = n5).__v).__e, (r6 = l4.__P) && (u6 = [], (i5 = s({}, t3)).__v = t3.__v + 1, j(r6, t3, i5, l4.__n, r6.ownerSVGElement !== void 0, t3.__h != null ? [o6] : null, u6, o6 == null ? _(t3) : o6, t3.__h), z(u6, t3), t3.__e != o6 && k(t3))); + for (var n2; g.__r = t.length; ) + n2 = t.sort(function(n3, l3) { + return n3.__v.__b - l3.__v.__b; + }), t = [], n2.some(function(n3) { + var l3, u3, i3, t3, o3, r3; + n3.__d && (o3 = (t3 = (l3 = n3).__v).__e, (r3 = l3.__P) && (u3 = [], (i3 = s({}, t3)).__v = t3.__v + 1, j(r3, t3, i3, l3.__n, r3.ownerSVGElement !== void 0, t3.__h != null ? [o3] : null, u3, o3 == null ? _(t3) : o3, t3.__h), z(u3, t3), t3.__e != o3 && k(t3))); }); } -function w(n4, l4, u6, i5, t3, o6, r6, c3, s10, a5) { - var h4, y4, d5, k4, b4, g4, w6, x4 = i5 && i5.__k || e, C5 = x4.length; - for (u6.__k = [], h4 = 0; h4 < l4.length; h4++) - if ((k4 = u6.__k[h4] = (k4 = l4[h4]) == null || typeof k4 == "boolean" ? null : typeof k4 == "string" || typeof k4 == "number" || typeof k4 == "bigint" ? v(null, k4, null, null, k4) : Array.isArray(k4) ? v(p, { children: k4 }, null, null, null) : k4.__b > 0 ? v(k4.type, k4.props, k4.key, k4.ref ? k4.ref : null, k4.__v) : k4) != null) { - if (k4.__ = u6, k4.__b = u6.__b + 1, (d5 = x4[h4]) === null || d5 && k4.key == d5.key && k4.type === d5.type) - x4[h4] = void 0; +function w(n2, l3, u3, i3, t3, o3, r3, c3, s3, a3) { + var h3, y3, d3, k4, b3, g4, w4, x4 = i3 && i3.__k || e, C3 = x4.length; + for (u3.__k = [], h3 = 0; h3 < l3.length; h3++) + if ((k4 = u3.__k[h3] = (k4 = l3[h3]) == null || typeof k4 == "boolean" ? null : typeof k4 == "string" || typeof k4 == "number" || typeof k4 == "bigint" ? v(null, k4, null, null, k4) : Array.isArray(k4) ? v(p, { children: k4 }, null, null, null) : k4.__b > 0 ? v(k4.type, k4.props, k4.key, k4.ref ? k4.ref : null, k4.__v) : k4) != null) { + if (k4.__ = u3, k4.__b = u3.__b + 1, (d3 = x4[h3]) === null || d3 && k4.key == d3.key && k4.type === d3.type) + x4[h3] = void 0; else - for (y4 = 0; y4 < C5; y4++) { - if ((d5 = x4[y4]) && k4.key == d5.key && k4.type === d5.type) { - x4[y4] = void 0; + for (y3 = 0; y3 < C3; y3++) { + if ((d3 = x4[y3]) && k4.key == d3.key && k4.type === d3.type) { + x4[y3] = void 0; break; } - d5 = null; + d3 = null; } - j(n4, k4, d5 = d5 || f, t3, o6, r6, c3, s10, a5), b4 = k4.__e, (y4 = k4.ref) && d5.ref != y4 && (w6 || (w6 = []), d5.ref && w6.push(d5.ref, null, k4), w6.push(y4, k4.__c || b4, k4)), b4 != null ? (g4 == null && (g4 = b4), typeof k4.type == "function" && k4.__k === d5.__k ? k4.__d = s10 = m(k4, s10, n4) : s10 = A(n4, k4, d5, x4, b4, s10), typeof u6.type == "function" && (u6.__d = s10)) : s10 && d5.__e == s10 && s10.parentNode != n4 && (s10 = _(d5)); - } - for (u6.__e = g4, h4 = C5; h4--; ) - x4[h4] != null && N(x4[h4], x4[h4]); - if (w6) - for (h4 = 0; h4 < w6.length; h4++) - M(w6[h4], w6[++h4], w6[++h4]); -} -function m(n4, l4, u6) { - for (var i5, t3 = n4.__k, o6 = 0; t3 && o6 < t3.length; o6++) - (i5 = t3[o6]) && (i5.__ = n4, l4 = typeof i5.type == "function" ? m(i5, l4, u6) : A(u6, i5, i5, t3, i5.__e, l4)); - return l4; -} -function x(n4, l4) { - return l4 = l4 || [], n4 == null || typeof n4 == "boolean" || (Array.isArray(n4) ? n4.some(function(n5) { - x(n5, l4); - }) : l4.push(n4)), l4; -} -function A(n4, l4, u6, i5, t3, o6) { - var r6, f4, e5; - if (l4.__d !== void 0) - r6 = l4.__d, l4.__d = void 0; - else if (u6 == null || t3 != o6 || t3.parentNode == null) + j(n2, k4, d3 = d3 || f, t3, o3, r3, c3, s3, a3), b3 = k4.__e, (y3 = k4.ref) && d3.ref != y3 && (w4 || (w4 = []), d3.ref && w4.push(d3.ref, null, k4), w4.push(y3, k4.__c || b3, k4)), b3 != null ? (g4 == null && (g4 = b3), typeof k4.type == "function" && k4.__k === d3.__k ? k4.__d = s3 = m(k4, s3, n2) : s3 = A(n2, k4, d3, x4, b3, s3), typeof u3.type == "function" && (u3.__d = s3)) : s3 && d3.__e == s3 && s3.parentNode != n2 && (s3 = _(d3)); + } + for (u3.__e = g4, h3 = C3; h3--; ) + x4[h3] != null && N(x4[h3], x4[h3]); + if (w4) + for (h3 = 0; h3 < w4.length; h3++) + M(w4[h3], w4[++h3], w4[++h3]); +} +function m(n2, l3, u3) { + for (var i3, t3 = n2.__k, o3 = 0; t3 && o3 < t3.length; o3++) + (i3 = t3[o3]) && (i3.__ = n2, l3 = typeof i3.type == "function" ? m(i3, l3, u3) : A(u3, i3, i3, t3, i3.__e, l3)); + return l3; +} +function x(n2, l3) { + return l3 = l3 || [], n2 == null || typeof n2 == "boolean" || (Array.isArray(n2) ? n2.some(function(n3) { + x(n3, l3); + }) : l3.push(n2)), l3; +} +function A(n2, l3, u3, i3, t3, o3) { + var r3, f4, e3; + if (l3.__d !== void 0) + r3 = l3.__d, l3.__d = void 0; + else if (u3 == null || t3 != o3 || t3.parentNode == null) n: - if (o6 == null || o6.parentNode !== n4) - n4.appendChild(t3), r6 = null; + if (o3 == null || o3.parentNode !== n2) + n2.appendChild(t3), r3 = null; else { - for (f4 = o6, e5 = 0; (f4 = f4.nextSibling) && e5 < i5.length; e5 += 1) + for (f4 = o3, e3 = 0; (f4 = f4.nextSibling) && e3 < i3.length; e3 += 1) if (f4 == t3) break n; - n4.insertBefore(t3, o6), r6 = o6; + n2.insertBefore(t3, o3), r3 = o3; } - return r6 !== void 0 ? r6 : t3.nextSibling; + return r3 !== void 0 ? r3 : t3.nextSibling; } -function C(n4, l4, u6, i5, t3) { - var o6; - for (o6 in u6) - o6 === "children" || o6 === "key" || o6 in l4 || H(n4, o6, null, u6[o6], i5); - for (o6 in l4) - t3 && typeof l4[o6] != "function" || o6 === "children" || o6 === "key" || o6 === "value" || o6 === "checked" || u6[o6] === l4[o6] || H(n4, o6, l4[o6], u6[o6], i5); +function C(n2, l3, u3, i3, t3) { + var o3; + for (o3 in u3) + o3 === "children" || o3 === "key" || o3 in l3 || H(n2, o3, null, u3[o3], i3); + for (o3 in l3) + t3 && typeof l3[o3] != "function" || o3 === "children" || o3 === "key" || o3 === "value" || o3 === "checked" || u3[o3] === l3[o3] || H(n2, o3, l3[o3], u3[o3], i3); } -function $(n4, l4, u6) { - l4[0] === "-" ? n4.setProperty(l4, u6) : n4[l4] = u6 == null ? "" : typeof u6 != "number" || c.test(l4) ? u6 : u6 + "px"; +function $(n2, l3, u3) { + l3[0] === "-" ? n2.setProperty(l3, u3) : n2[l3] = u3 == null ? "" : typeof u3 != "number" || c.test(l3) ? u3 : u3 + "px"; } -function H(n4, l4, u6, i5, t3) { - var o6; +function H(n2, l3, u3, i3, t3) { + var o3; n: - if (l4 === "style") - if (typeof u6 == "string") - n4.style.cssText = u6; + if (l3 === "style") + if (typeof u3 == "string") + n2.style.cssText = u3; else { - if (typeof i5 == "string" && (n4.style.cssText = i5 = ""), i5) - for (l4 in i5) - u6 && l4 in u6 || $(n4.style, l4, ""); - if (u6) - for (l4 in u6) - i5 && u6[l4] === i5[l4] || $(n4.style, l4, u6[l4]); - } - else if (l4[0] === "o" && l4[1] === "n") - o6 = l4 !== (l4 = l4.replace(/Capture$/, "")), l4 = l4.toLowerCase() in n4 ? l4.toLowerCase().slice(2) : l4.slice(2), n4.l || (n4.l = {}), n4.l[l4 + o6] = u6, u6 ? i5 || n4.addEventListener(l4, o6 ? T : I, o6) : n4.removeEventListener(l4, o6 ? T : I, o6); - else if (l4 !== "dangerouslySetInnerHTML") { + if (typeof i3 == "string" && (n2.style.cssText = i3 = ""), i3) + for (l3 in i3) + u3 && l3 in u3 || $(n2.style, l3, ""); + if (u3) + for (l3 in u3) + i3 && u3[l3] === i3[l3] || $(n2.style, l3, u3[l3]); + } + else if (l3[0] === "o" && l3[1] === "n") + o3 = l3 !== (l3 = l3.replace(/Capture$/, "")), l3 = l3.toLowerCase() in n2 ? l3.toLowerCase().slice(2) : l3.slice(2), n2.l || (n2.l = {}), n2.l[l3 + o3] = u3, u3 ? i3 || n2.addEventListener(l3, o3 ? T : I, o3) : n2.removeEventListener(l3, o3 ? T : I, o3); + else if (l3 !== "dangerouslySetInnerHTML") { if (t3) - l4 = l4.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s"); - else if (l4 !== "href" && l4 !== "list" && l4 !== "form" && l4 !== "tabIndex" && l4 !== "download" && l4 in n4) + l3 = l3.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s"); + else if (l3 !== "href" && l3 !== "list" && l3 !== "form" && l3 !== "tabIndex" && l3 !== "download" && l3 in n2) try { - n4[l4] = u6 == null ? "" : u6; + n2[l3] = u3 == null ? "" : u3; break n; - } catch (n5) { + } catch (n3) { } - typeof u6 == "function" || (u6 == null || u6 === false && l4.indexOf("-") == -1 ? n4.removeAttribute(l4) : n4.setAttribute(l4, u6)); + typeof u3 == "function" || (u3 == null || u3 === false && l3.indexOf("-") == -1 ? n2.removeAttribute(l3) : n2.setAttribute(l3, u3)); } } -function I(n4) { - this.l[n4.type + false](l.event ? l.event(n4) : n4); +function I(n2) { + this.l[n2.type + false](l.event ? l.event(n2) : n2); } -function T(n4) { - this.l[n4.type + true](l.event ? l.event(n4) : n4); +function T(n2) { + this.l[n2.type + true](l.event ? l.event(n2) : n2); } -function j(n4, u6, i5, t3, o6, r6, f4, e5, c3) { - var a5, h4, v3, y4, _3, k4, b4, g4, m5, x4, A4, C5, $4, H4, I4, T8 = u6.type; - if (u6.constructor !== void 0) +function j(n2, u3, i3, t3, o3, r3, f4, e3, c3) { + var a3, h3, v3, y3, _3, k4, b3, g4, m3, x4, A4, C3, $3, H3, I3, T5 = u3.type; + if (u3.constructor !== void 0) return null; - i5.__h != null && (c3 = i5.__h, e5 = u6.__e = i5.__e, u6.__h = null, r6 = [e5]), (a5 = l.__b) && a5(u6); + i3.__h != null && (c3 = i3.__h, e3 = u3.__e = i3.__e, u3.__h = null, r3 = [e3]), (a3 = l.__b) && a3(u3); try { n: - if (typeof T8 == "function") { - if (g4 = u6.props, m5 = (a5 = T8.contextType) && t3[a5.__c], x4 = a5 ? m5 ? m5.props.value : a5.__ : t3, i5.__c ? b4 = (h4 = u6.__c = i5.__c).__ = h4.__E : ("prototype" in T8 && T8.prototype.render ? u6.__c = h4 = new T8(g4, x4) : (u6.__c = h4 = new d(g4, x4), h4.constructor = T8, h4.render = O), m5 && m5.sub(h4), h4.props = g4, h4.state || (h4.state = {}), h4.context = x4, h4.__n = t3, v3 = h4.__d = true, h4.__h = [], h4._sb = []), h4.__s == null && (h4.__s = h4.state), T8.getDerivedStateFromProps != null && (h4.__s == h4.state && (h4.__s = s({}, h4.__s)), s(h4.__s, T8.getDerivedStateFromProps(g4, h4.__s))), y4 = h4.props, _3 = h4.state, v3) - T8.getDerivedStateFromProps == null && h4.componentWillMount != null && h4.componentWillMount(), h4.componentDidMount != null && h4.__h.push(h4.componentDidMount); + if (typeof T5 == "function") { + if (g4 = u3.props, m3 = (a3 = T5.contextType) && t3[a3.__c], x4 = a3 ? m3 ? m3.props.value : a3.__ : t3, i3.__c ? b3 = (h3 = u3.__c = i3.__c).__ = h3.__E : ("prototype" in T5 && T5.prototype.render ? u3.__c = h3 = new T5(g4, x4) : (u3.__c = h3 = new d(g4, x4), h3.constructor = T5, h3.render = O), m3 && m3.sub(h3), h3.props = g4, h3.state || (h3.state = {}), h3.context = x4, h3.__n = t3, v3 = h3.__d = true, h3.__h = [], h3._sb = []), h3.__s == null && (h3.__s = h3.state), T5.getDerivedStateFromProps != null && (h3.__s == h3.state && (h3.__s = s({}, h3.__s)), s(h3.__s, T5.getDerivedStateFromProps(g4, h3.__s))), y3 = h3.props, _3 = h3.state, v3) + T5.getDerivedStateFromProps == null && h3.componentWillMount != null && h3.componentWillMount(), h3.componentDidMount != null && h3.__h.push(h3.componentDidMount); else { - if (T8.getDerivedStateFromProps == null && g4 !== y4 && h4.componentWillReceiveProps != null && h4.componentWillReceiveProps(g4, x4), !h4.__e && h4.shouldComponentUpdate != null && h4.shouldComponentUpdate(g4, h4.__s, x4) === false || u6.__v === i5.__v) { - for (h4.props = g4, h4.state = h4.__s, u6.__v !== i5.__v && (h4.__d = false), h4.__v = u6, u6.__e = i5.__e, u6.__k = i5.__k, u6.__k.forEach(function(n5) { - n5 && (n5.__ = u6); - }), A4 = 0; A4 < h4._sb.length; A4++) - h4.__h.push(h4._sb[A4]); - h4._sb = [], h4.__h.length && f4.push(h4); + if (T5.getDerivedStateFromProps == null && g4 !== y3 && h3.componentWillReceiveProps != null && h3.componentWillReceiveProps(g4, x4), !h3.__e && h3.shouldComponentUpdate != null && h3.shouldComponentUpdate(g4, h3.__s, x4) === false || u3.__v === i3.__v) { + for (h3.props = g4, h3.state = h3.__s, u3.__v !== i3.__v && (h3.__d = false), h3.__v = u3, u3.__e = i3.__e, u3.__k = i3.__k, u3.__k.forEach(function(n3) { + n3 && (n3.__ = u3); + }), A4 = 0; A4 < h3._sb.length; A4++) + h3.__h.push(h3._sb[A4]); + h3._sb = [], h3.__h.length && f4.push(h3); break n; } - h4.componentWillUpdate != null && h4.componentWillUpdate(g4, h4.__s, x4), h4.componentDidUpdate != null && h4.__h.push(function() { - h4.componentDidUpdate(y4, _3, k4); + h3.componentWillUpdate != null && h3.componentWillUpdate(g4, h3.__s, x4), h3.componentDidUpdate != null && h3.__h.push(function() { + h3.componentDidUpdate(y3, _3, k4); }); } - if (h4.context = x4, h4.props = g4, h4.__v = u6, h4.__P = n4, C5 = l.__r, $4 = 0, "prototype" in T8 && T8.prototype.render) { - for (h4.state = h4.__s, h4.__d = false, C5 && C5(u6), a5 = h4.render(h4.props, h4.state, h4.context), H4 = 0; H4 < h4._sb.length; H4++) - h4.__h.push(h4._sb[H4]); - h4._sb = []; + if (h3.context = x4, h3.props = g4, h3.__v = u3, h3.__P = n2, C3 = l.__r, $3 = 0, "prototype" in T5 && T5.prototype.render) { + for (h3.state = h3.__s, h3.__d = false, C3 && C3(u3), a3 = h3.render(h3.props, h3.state, h3.context), H3 = 0; H3 < h3._sb.length; H3++) + h3.__h.push(h3._sb[H3]); + h3._sb = []; } else do { - h4.__d = false, C5 && C5(u6), a5 = h4.render(h4.props, h4.state, h4.context), h4.state = h4.__s; - } while (h4.__d && ++$4 < 25); - h4.state = h4.__s, h4.getChildContext != null && (t3 = s(s({}, t3), h4.getChildContext())), v3 || h4.getSnapshotBeforeUpdate == null || (k4 = h4.getSnapshotBeforeUpdate(y4, _3)), I4 = a5 != null && a5.type === p && a5.key == null ? a5.props.children : a5, w(n4, Array.isArray(I4) ? I4 : [I4], u6, i5, t3, o6, r6, f4, e5, c3), h4.base = u6.__e, u6.__h = null, h4.__h.length && f4.push(h4), b4 && (h4.__E = h4.__ = null), h4.__e = false; + h3.__d = false, C3 && C3(u3), a3 = h3.render(h3.props, h3.state, h3.context), h3.state = h3.__s; + } while (h3.__d && ++$3 < 25); + h3.state = h3.__s, h3.getChildContext != null && (t3 = s(s({}, t3), h3.getChildContext())), v3 || h3.getSnapshotBeforeUpdate == null || (k4 = h3.getSnapshotBeforeUpdate(y3, _3)), I3 = a3 != null && a3.type === p && a3.key == null ? a3.props.children : a3, w(n2, Array.isArray(I3) ? I3 : [I3], u3, i3, t3, o3, r3, f4, e3, c3), h3.base = u3.__e, u3.__h = null, h3.__h.length && f4.push(h3), b3 && (h3.__E = h3.__ = null), h3.__e = false; } else - r6 == null && u6.__v === i5.__v ? (u6.__k = i5.__k, u6.__e = i5.__e) : u6.__e = L(i5.__e, u6, i5, t3, o6, r6, f4, c3); - (a5 = l.diffed) && a5(u6); - } catch (n5) { - u6.__v = null, (c3 || r6 != null) && (u6.__e = e5, u6.__h = !!c3, r6[r6.indexOf(e5)] = null), l.__e(n5, u6, i5); + r3 == null && u3.__v === i3.__v ? (u3.__k = i3.__k, u3.__e = i3.__e) : u3.__e = L(i3.__e, u3, i3, t3, o3, r3, f4, c3); + (a3 = l.diffed) && a3(u3); + } catch (n3) { + u3.__v = null, (c3 || r3 != null) && (u3.__e = e3, u3.__h = !!c3, r3[r3.indexOf(e3)] = null), l.__e(n3, u3, i3); } } -function z(n4, u6) { - l.__c && l.__c(u6, n4), n4.some(function(u7) { +function z(n2, u3) { + l.__c && l.__c(u3, n2), n2.some(function(u4) { try { - n4 = u7.__h, u7.__h = [], n4.some(function(n5) { - n5.call(u7); + n2 = u4.__h, u4.__h = [], n2.some(function(n3) { + n3.call(u4); }); - } catch (n5) { - l.__e(n5, u7.__v); + } catch (n3) { + l.__e(n3, u4.__v); } }); } -function L(l4, u6, i5, t3, o6, r6, e5, c3) { - var s10, h4, v3, y4 = i5.props, p5 = u6.props, d5 = u6.type, k4 = 0; - if (d5 === "svg" && (o6 = true), r6 != null) { - for (; k4 < r6.length; k4++) - if ((s10 = r6[k4]) && "setAttribute" in s10 == !!d5 && (d5 ? s10.localName === d5 : s10.nodeType === 3)) { - l4 = s10, r6[k4] = null; +function L(l3, u3, i3, t3, o3, r3, e3, c3) { + var s3, h3, v3, y3 = i3.props, p3 = u3.props, d3 = u3.type, k4 = 0; + if (d3 === "svg" && (o3 = true), r3 != null) { + for (; k4 < r3.length; k4++) + if ((s3 = r3[k4]) && "setAttribute" in s3 == !!d3 && (d3 ? s3.localName === d3 : s3.nodeType === 3)) { + l3 = s3, r3[k4] = null; break; } } - if (l4 == null) { - if (d5 === null) - return document.createTextNode(p5); - l4 = o6 ? document.createElementNS("http://www.w3.org/2000/svg", d5) : document.createElement(d5, p5.is && p5), r6 = null, c3 = false; + if (l3 == null) { + if (d3 === null) + return document.createTextNode(p3); + l3 = o3 ? document.createElementNS("http://www.w3.org/2000/svg", d3) : document.createElement(d3, p3.is && p3), r3 = null, c3 = false; } - if (d5 === null) - y4 === p5 || c3 && l4.data === p5 || (l4.data = p5); + if (d3 === null) + y3 === p3 || c3 && l3.data === p3 || (l3.data = p3); else { - if (r6 = r6 && n.call(l4.childNodes), h4 = (y4 = i5.props || f).dangerouslySetInnerHTML, v3 = p5.dangerouslySetInnerHTML, !c3) { - if (r6 != null) - for (y4 = {}, k4 = 0; k4 < l4.attributes.length; k4++) - y4[l4.attributes[k4].name] = l4.attributes[k4].value; - (v3 || h4) && (v3 && (h4 && v3.__html == h4.__html || v3.__html === l4.innerHTML) || (l4.innerHTML = v3 && v3.__html || "")); - } - if (C(l4, p5, y4, o6, c3), v3) - u6.__k = []; - else if (k4 = u6.props.children, w(l4, Array.isArray(k4) ? k4 : [k4], u6, i5, t3, o6 && d5 !== "foreignObject", r6, e5, r6 ? r6[0] : i5.__k && _(i5, 0), c3), r6 != null) - for (k4 = r6.length; k4--; ) - r6[k4] != null && a(r6[k4]); - c3 || ("value" in p5 && (k4 = p5.value) !== void 0 && (k4 !== l4.value || d5 === "progress" && !k4 || d5 === "option" && k4 !== y4.value) && H(l4, "value", k4, y4.value, false), "checked" in p5 && (k4 = p5.checked) !== void 0 && k4 !== l4.checked && H(l4, "checked", k4, y4.checked, false)); - } - return l4; -} -function M(n4, u6, i5) { + if (r3 = r3 && n.call(l3.childNodes), h3 = (y3 = i3.props || f).dangerouslySetInnerHTML, v3 = p3.dangerouslySetInnerHTML, !c3) { + if (r3 != null) + for (y3 = {}, k4 = 0; k4 < l3.attributes.length; k4++) + y3[l3.attributes[k4].name] = l3.attributes[k4].value; + (v3 || h3) && (v3 && (h3 && v3.__html == h3.__html || v3.__html === l3.innerHTML) || (l3.innerHTML = v3 && v3.__html || "")); + } + if (C(l3, p3, y3, o3, c3), v3) + u3.__k = []; + else if (k4 = u3.props.children, w(l3, Array.isArray(k4) ? k4 : [k4], u3, i3, t3, o3 && d3 !== "foreignObject", r3, e3, r3 ? r3[0] : i3.__k && _(i3, 0), c3), r3 != null) + for (k4 = r3.length; k4--; ) + r3[k4] != null && a(r3[k4]); + c3 || ("value" in p3 && (k4 = p3.value) !== void 0 && (k4 !== l3.value || d3 === "progress" && !k4 || d3 === "option" && k4 !== y3.value) && H(l3, "value", k4, y3.value, false), "checked" in p3 && (k4 = p3.checked) !== void 0 && k4 !== l3.checked && H(l3, "checked", k4, y3.checked, false)); + } + return l3; +} +function M(n2, u3, i3) { try { - typeof n4 == "function" ? n4(u6) : n4.current = u6; - } catch (n5) { - l.__e(n5, i5); + typeof n2 == "function" ? n2(u3) : n2.current = u3; + } catch (n3) { + l.__e(n3, i3); } } -function N(n4, u6, i5) { - var t3, o6; - if (l.unmount && l.unmount(n4), (t3 = n4.ref) && (t3.current && t3.current !== n4.__e || M(t3, null, u6)), (t3 = n4.__c) != null) { +function N(n2, u3, i3) { + var t3, o3; + if (l.unmount && l.unmount(n2), (t3 = n2.ref) && (t3.current && t3.current !== n2.__e || M(t3, null, u3)), (t3 = n2.__c) != null) { if (t3.componentWillUnmount) try { t3.componentWillUnmount(); - } catch (n5) { - l.__e(n5, u6); - } - t3.base = t3.__P = null, n4.__c = void 0; - } - if (t3 = n4.__k) - for (o6 = 0; o6 < t3.length; o6++) - t3[o6] && N(t3[o6], u6, i5 || typeof n4.type != "function"); - i5 || n4.__e == null || a(n4.__e), n4.__ = n4.__e = n4.__d = void 0; -} -function O(n4, l4, u6) { - return this.constructor(n4, u6); -} -function P(u6, i5, t3) { - var o6, r6, e5; - l.__ && l.__(u6, i5), r6 = (o6 = typeof t3 == "function") ? null : t3 && t3.__k || i5.__k, e5 = [], j(i5, u6 = (!o6 && t3 || i5).__k = h(p, null, [u6]), r6 || f, f, i5.ownerSVGElement !== void 0, !o6 && t3 ? [t3] : r6 ? null : i5.firstChild ? n.call(i5.childNodes) : null, e5, !o6 && t3 ? t3 : r6 ? r6.__e : i5.firstChild, o6), z(e5, u6); -} -function S(n4, l4) { - P(n4, l4, S); -} -function q(l4, u6, i5) { - var t3, o6, r6, f4 = s({}, l4.props); - for (r6 in u6) - r6 == "key" ? t3 = u6[r6] : r6 == "ref" ? o6 = u6[r6] : f4[r6] = u6[r6]; - return arguments.length > 2 && (f4.children = arguments.length > 3 ? n.call(arguments, 2) : i5), v(l4.type, f4, t3 || l4.key, o6 || l4.ref, null); -} -function B(n4, l4) { - var u6 = { __c: l4 = "__cC" + r++, __: n4, Consumer: function(n5, l5) { - return n5.children(l5); - }, Provider: function(n5) { - var u7, i5; - return this.getChildContext || (u7 = [], (i5 = {})[l4] = this, this.getChildContext = function() { - return i5; - }, this.shouldComponentUpdate = function(n6) { - this.props.value !== n6.value && u7.some(b); - }, this.sub = function(n6) { - u7.push(n6); - var l5 = n6.componentWillUnmount; - n6.componentWillUnmount = function() { - u7.splice(u7.indexOf(n6), 1), l5 && l5.call(n6); + } catch (n3) { + l.__e(n3, u3); + } + t3.base = t3.__P = null, n2.__c = void 0; + } + if (t3 = n2.__k) + for (o3 = 0; o3 < t3.length; o3++) + t3[o3] && N(t3[o3], u3, i3 || typeof n2.type != "function"); + i3 || n2.__e == null || a(n2.__e), n2.__ = n2.__e = n2.__d = void 0; +} +function O(n2, l3, u3) { + return this.constructor(n2, u3); +} +function P(u3, i3, t3) { + var o3, r3, e3; + l.__ && l.__(u3, i3), r3 = (o3 = typeof t3 == "function") ? null : t3 && t3.__k || i3.__k, e3 = [], j(i3, u3 = (!o3 && t3 || i3).__k = h(p, null, [u3]), r3 || f, f, i3.ownerSVGElement !== void 0, !o3 && t3 ? [t3] : r3 ? null : i3.firstChild ? n.call(i3.childNodes) : null, e3, !o3 && t3 ? t3 : r3 ? r3.__e : i3.firstChild, o3), z(e3, u3); +} +function S(n2, l3) { + P(n2, l3, S); +} +function q(l3, u3, i3) { + var t3, o3, r3, f4 = s({}, l3.props); + for (r3 in u3) + r3 == "key" ? t3 = u3[r3] : r3 == "ref" ? o3 = u3[r3] : f4[r3] = u3[r3]; + return arguments.length > 2 && (f4.children = arguments.length > 3 ? n.call(arguments, 2) : i3), v(l3.type, f4, t3 || l3.key, o3 || l3.ref, null); +} +function B(n2, l3) { + var u3 = { __c: l3 = "__cC" + r++, __: n2, Consumer: function(n3, l4) { + return n3.children(l4); + }, Provider: function(n3) { + var u4, i3; + return this.getChildContext || (u4 = [], (i3 = {})[l3] = this, this.getChildContext = function() { + return i3; + }, this.shouldComponentUpdate = function(n4) { + this.props.value !== n4.value && u4.some(b); + }, this.sub = function(n4) { + u4.push(n4); + var l4 = n4.componentWillUnmount; + n4.componentWillUnmount = function() { + u4.splice(u4.indexOf(n4), 1), l4 && l4.call(n4); }; - }), n5.children; + }), n3.children; } }; - return u6.Provider.__ = u6.Consumer.contextType = u6; + return u3.Provider.__ = u3.Consumer.contextType = u3; } -n = e.slice, l = { __e: function(n4, l4, u6, i5) { - for (var t3, o6, r6; l4 = l4.__; ) - if ((t3 = l4.__c) && !t3.__) +n = e.slice, l = { __e: function(n2, l3, u3, i3) { + for (var t3, o3, r3; l3 = l3.__; ) + if ((t3 = l3.__c) && !t3.__) try { - if ((o6 = t3.constructor) && o6.getDerivedStateFromError != null && (t3.setState(o6.getDerivedStateFromError(n4)), r6 = t3.__d), t3.componentDidCatch != null && (t3.componentDidCatch(n4, i5 || {}), r6 = t3.__d), r6) + if ((o3 = t3.constructor) && o3.getDerivedStateFromError != null && (t3.setState(o3.getDerivedStateFromError(n2)), r3 = t3.__d), t3.componentDidCatch != null && (t3.componentDidCatch(n2, i3 || {}), r3 = t3.__d), r3) return t3.__E = t3; - } catch (l5) { - n4 = l5; - } - throw n4; -} }, u = 0, i = function(n4) { - return n4 != null && n4.constructor === void 0; -}, d.prototype.setState = function(n4, l4) { - var u6; - u6 = this.__s != null && this.__s !== this.state ? this.__s : this.__s = s({}, this.state), typeof n4 == "function" && (n4 = n4(s({}, u6), this.props)), n4 && s(u6, n4), n4 != null && this.__v && (l4 && this._sb.push(l4), b(this)); -}, d.prototype.forceUpdate = function(n4) { - this.__v && (this.__e = true, n4 && this.__h.push(n4), b(this)); + } catch (l4) { + n2 = l4; + } + throw n2; +} }, u = 0, i = function(n2) { + return n2 != null && n2.constructor === void 0; +}, d.prototype.setState = function(n2, l3) { + var u3; + u3 = this.__s != null && this.__s !== this.state ? this.__s : this.__s = s({}, this.state), typeof n2 == "function" && (n2 = n2(s({}, u3), this.props)), n2 && s(u3, n2), n2 != null && this.__v && (l3 && this._sb.push(l3), b(this)); +}, d.prototype.forceUpdate = function(n2) { + this.__v && (this.__e = true, n2 && this.__h.push(n2), b(this)); }, d.prototype.render = p, t = [], g.__r = 0, r = 0; // node_modules/preact/hooks/dist/hooks.module.js @@ -1220,369 +1220,369 @@ var a2 = l.__r; var v2 = l.diffed; var l2 = l.__c; var m2 = l.unmount; -function d2(t3, u6) { - l.__h && l.__h(r2, t3, o2 || u6), o2 = 0; - var i5 = r2.__H || (r2.__H = { __: [], __h: [] }); - return t3 >= i5.__.length && i5.__.push({ __V: c2 }), i5.__[t3]; -} -function p2(n4) { - return o2 = 1, y2(B2, n4); -} -function y2(n4, u6, i5) { - var o6 = d2(t2++, 2); - if (o6.t = n4, !o6.__c && (o6.__ = [i5 ? i5(u6) : B2(void 0, u6), function(n5) { - var t3 = o6.__N ? o6.__N[0] : o6.__[0], r6 = o6.t(t3, n5); - t3 !== r6 && (o6.__N = [r6, o6.__[1]], o6.__c.setState({})); - }], o6.__c = r2, !r2.u)) { +function d2(t3, u3) { + l.__h && l.__h(r2, t3, o2 || u3), o2 = 0; + var i3 = r2.__H || (r2.__H = { __: [], __h: [] }); + return t3 >= i3.__.length && i3.__.push({ __V: c2 }), i3.__[t3]; +} +function p2(n2) { + return o2 = 1, y2(B2, n2); +} +function y2(n2, u3, i3) { + var o3 = d2(t2++, 2); + if (o3.t = n2, !o3.__c && (o3.__ = [i3 ? i3(u3) : B2(void 0, u3), function(n3) { + var t3 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t3, n3); + t3 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({})); + }], o3.__c = r2, !r2.u)) { r2.u = true; var f4 = r2.shouldComponentUpdate; - r2.shouldComponentUpdate = function(n5, t3, r6) { - if (!o6.__c.__H) + r2.shouldComponentUpdate = function(n3, t3, r3) { + if (!o3.__c.__H) return true; - var u7 = o6.__c.__H.__.filter(function(n6) { - return n6.__c; + var u4 = o3.__c.__H.__.filter(function(n4) { + return n4.__c; }); - if (u7.every(function(n6) { - return !n6.__N; + if (u4.every(function(n4) { + return !n4.__N; })) - return !f4 || f4.call(this, n5, t3, r6); - var i6 = false; - return u7.forEach(function(n6) { - if (n6.__N) { - var t4 = n6.__[0]; - n6.__ = n6.__N, n6.__N = void 0, t4 !== n6.__[0] && (i6 = true); + return !f4 || f4.call(this, n3, t3, r3); + var i4 = false; + return u4.forEach(function(n4) { + if (n4.__N) { + var t4 = n4.__[0]; + n4.__ = n4.__N, n4.__N = void 0, t4 !== n4.__[0] && (i4 = true); } - }), !(!i6 && o6.__c.props === n5) && (!f4 || f4.call(this, n5, t3, r6)); + }), !(!i4 && o3.__c.props === n3) && (!f4 || f4.call(this, n3, t3, r3)); }; } - return o6.__N || o6.__; + return o3.__N || o3.__; } -function h2(u6, i5) { - var o6 = d2(t2++, 3); - !l.__s && z2(o6.__H, i5) && (o6.__ = u6, o6.i = i5, r2.__H.__h.push(o6)); +function h2(u3, i3) { + var o3 = d2(t2++, 3); + !l.__s && z2(o3.__H, i3) && (o3.__ = u3, o3.i = i3, r2.__H.__h.push(o3)); } -function s2(u6, i5) { - var o6 = d2(t2++, 4); - !l.__s && z2(o6.__H, i5) && (o6.__ = u6, o6.i = i5, r2.__h.push(o6)); +function s2(u3, i3) { + var o3 = d2(t2++, 4); + !l.__s && z2(o3.__H, i3) && (o3.__ = u3, o3.i = i3, r2.__h.push(o3)); } -function _2(n4) { +function _2(n2) { return o2 = 5, F(function() { - return { current: n4 }; + return { current: n2 }; }, []); } -function A2(n4, t3, r6) { +function A2(n2, t3, r3) { o2 = 6, s2(function() { - return typeof n4 == "function" ? (n4(t3()), function() { - return n4(null); - }) : n4 ? (n4.current = t3(), function() { - return n4.current = null; + return typeof n2 == "function" ? (n2(t3()), function() { + return n2(null); + }) : n2 ? (n2.current = t3(), function() { + return n2.current = null; }) : void 0; - }, r6 == null ? r6 : r6.concat(n4)); + }, r3 == null ? r3 : r3.concat(n2)); } -function F(n4, r6) { - var u6 = d2(t2++, 7); - return z2(u6.__H, r6) ? (u6.__V = n4(), u6.i = r6, u6.__h = n4, u6.__V) : u6.__; +function F(n2, r3) { + var u3 = d2(t2++, 7); + return z2(u3.__H, r3) ? (u3.__V = n2(), u3.i = r3, u3.__h = n2, u3.__V) : u3.__; } -function T2(n4, t3) { +function T2(n2, t3) { return o2 = 8, F(function() { - return n4; + return n2; }, t3); } -function q2(n4) { - var u6 = r2.context[n4.__c], i5 = d2(t2++, 9); - return i5.c = n4, u6 ? (i5.__ == null && (i5.__ = true, u6.sub(r2)), u6.props.value) : n4.__; +function q2(n2) { + var u3 = r2.context[n2.__c], i3 = d2(t2++, 9); + return i3.c = n2, u3 ? (i3.__ == null && (i3.__ = true, u3.sub(r2)), u3.props.value) : n2.__; } -function x2(t3, r6) { - l.useDebugValue && l.useDebugValue(r6 ? r6(t3) : t3); +function x2(t3, r3) { + l.useDebugValue && l.useDebugValue(r3 ? r3(t3) : t3); } function V() { - var n4 = d2(t2++, 11); - if (!n4.__) { - for (var u6 = r2.__v; u6 !== null && !u6.__m && u6.__ !== null; ) - u6 = u6.__; - var i5 = u6.__m || (u6.__m = [0, 0]); - n4.__ = "P" + i5[0] + "-" + i5[1]++; + var n2 = d2(t2++, 11); + if (!n2.__) { + for (var u3 = r2.__v; u3 !== null && !u3.__m && u3.__ !== null; ) + u3 = u3.__; + var i3 = u3.__m || (u3.__m = [0, 0]); + n2.__ = "P" + i3[0] + "-" + i3[1]++; } - return n4.__; + return n2.__; } function b2() { for (var t3; t3 = f2.shift(); ) if (t3.__P && t3.__H) try { t3.__H.__h.forEach(k2), t3.__H.__h.forEach(w2), t3.__H.__h = []; - } catch (r6) { - t3.__H.__h = [], l.__e(r6, t3.__v); - } -} -l.__b = function(n4) { - r2 = null, e2 && e2(n4); -}, l.__r = function(n4) { - a2 && a2(n4), t2 = 0; - var i5 = (r2 = n4.__c).__H; - i5 && (u2 === r2 ? (i5.__h = [], r2.__h = [], i5.__.forEach(function(n5) { - n5.__N && (n5.__ = n5.__N), n5.__V = c2, n5.__N = n5.i = void 0; - })) : (i5.__h.forEach(k2), i5.__h.forEach(w2), i5.__h = [])), u2 = r2; + } catch (r3) { + t3.__H.__h = [], l.__e(r3, t3.__v); + } +} +l.__b = function(n2) { + r2 = null, e2 && e2(n2); +}, l.__r = function(n2) { + a2 && a2(n2), t2 = 0; + var i3 = (r2 = n2.__c).__H; + i3 && (u2 === r2 ? (i3.__h = [], r2.__h = [], i3.__.forEach(function(n3) { + n3.__N && (n3.__ = n3.__N), n3.__V = c2, n3.__N = n3.i = void 0; + })) : (i3.__h.forEach(k2), i3.__h.forEach(w2), i3.__h = [])), u2 = r2; }, l.diffed = function(t3) { v2 && v2(t3); - var o6 = t3.__c; - o6 && o6.__H && (o6.__H.__h.length && (f2.push(o6) !== 1 && i2 === l.requestAnimationFrame || ((i2 = l.requestAnimationFrame) || j2)(b2)), o6.__H.__.forEach(function(n4) { - n4.i && (n4.__H = n4.i), n4.__V !== c2 && (n4.__ = n4.__V), n4.i = void 0, n4.__V = c2; + var o3 = t3.__c; + o3 && o3.__H && (o3.__H.__h.length && (f2.push(o3) !== 1 && i2 === l.requestAnimationFrame || ((i2 = l.requestAnimationFrame) || j2)(b2)), o3.__H.__.forEach(function(n2) { + n2.i && (n2.__H = n2.i), n2.__V !== c2 && (n2.__ = n2.__V), n2.i = void 0, n2.__V = c2; })), u2 = r2 = null; -}, l.__c = function(t3, r6) { - r6.some(function(t4) { +}, l.__c = function(t3, r3) { + r3.some(function(t4) { try { - t4.__h.forEach(k2), t4.__h = t4.__h.filter(function(n4) { - return !n4.__ || w2(n4); + t4.__h.forEach(k2), t4.__h = t4.__h.filter(function(n2) { + return !n2.__ || w2(n2); }); - } catch (u6) { - r6.some(function(n4) { - n4.__h && (n4.__h = []); - }), r6 = [], l.__e(u6, t4.__v); + } catch (u3) { + r3.some(function(n2) { + n2.__h && (n2.__h = []); + }), r3 = [], l.__e(u3, t4.__v); } - }), l2 && l2(t3, r6); + }), l2 && l2(t3, r3); }, l.unmount = function(t3) { m2 && m2(t3); - var r6, u6 = t3.__c; - u6 && u6.__H && (u6.__H.__.forEach(function(n4) { + var r3, u3 = t3.__c; + u3 && u3.__H && (u3.__H.__.forEach(function(n2) { try { - k2(n4); - } catch (n5) { - r6 = n5; + k2(n2); + } catch (n3) { + r3 = n3; } - }), u6.__H = void 0, r6 && l.__e(r6, u6.__v)); + }), u3.__H = void 0, r3 && l.__e(r3, u3.__v)); }; var g2 = typeof requestAnimationFrame == "function"; -function j2(n4) { - var t3, r6 = function() { - clearTimeout(u6), g2 && cancelAnimationFrame(t3), setTimeout(n4); - }, u6 = setTimeout(r6, 100); - g2 && (t3 = requestAnimationFrame(r6)); +function j2(n2) { + var t3, r3 = function() { + clearTimeout(u3), g2 && cancelAnimationFrame(t3), setTimeout(n2); + }, u3 = setTimeout(r3, 100); + g2 && (t3 = requestAnimationFrame(r3)); } -function k2(n4) { - var t3 = r2, u6 = n4.__c; - typeof u6 == "function" && (n4.__c = void 0, u6()), r2 = t3; +function k2(n2) { + var t3 = r2, u3 = n2.__c; + typeof u3 == "function" && (n2.__c = void 0, u3()), r2 = t3; } -function w2(n4) { +function w2(n2) { var t3 = r2; - n4.__c = n4.__(), r2 = t3; + n2.__c = n2.__(), r2 = t3; } -function z2(n4, t3) { - return !n4 || n4.length !== t3.length || t3.some(function(t4, r6) { - return t4 !== n4[r6]; +function z2(n2, t3) { + return !n2 || n2.length !== t3.length || t3.some(function(t4, r3) { + return t4 !== n2[r3]; }); } -function B2(n4, t3) { - return typeof t3 == "function" ? t3(n4) : t3; +function B2(n2, t3) { + return typeof t3 == "function" ? t3(n2) : t3; } // node_modules/preact/compat/dist/compat.module.js -function g3(n4, t3) { - for (var e5 in t3) - n4[e5] = t3[e5]; - return n4; -} -function C2(n4, t3) { - for (var e5 in n4) - if (e5 !== "__source" && !(e5 in t3)) +function g3(n2, t3) { + for (var e3 in t3) + n2[e3] = t3[e3]; + return n2; +} +function C2(n2, t3) { + for (var e3 in n2) + if (e3 !== "__source" && !(e3 in t3)) return true; - for (var r6 in t3) - if (r6 !== "__source" && n4[r6] !== t3[r6]) + for (var r3 in t3) + if (r3 !== "__source" && n2[r3] !== t3[r3]) return true; return false; } -function E(n4, t3) { - return n4 === t3 && (n4 !== 0 || 1 / n4 == 1 / t3) || n4 != n4 && t3 != t3; +function E(n2, t3) { + return n2 === t3 && (n2 !== 0 || 1 / n2 == 1 / t3) || n2 != n2 && t3 != t3; } -function w3(n4) { - this.props = n4; +function w3(n2) { + this.props = n2; } -function R(n4, e5) { - function r6(n5) { - var t3 = this.props.ref, r7 = t3 == n5.ref; - return !r7 && t3 && (t3.call ? t3(null) : t3.current = null), e5 ? !e5(this.props, n5) || !r7 : C2(this.props, n5); +function R(n2, e3) { + function r3(n3) { + var t3 = this.props.ref, r4 = t3 == n3.ref; + return !r4 && t3 && (t3.call ? t3(null) : t3.current = null), e3 ? !e3(this.props, n3) || !r4 : C2(this.props, n3); } - function u6(e6) { - return this.shouldComponentUpdate = r6, h(n4, e6); + function u3(e4) { + return this.shouldComponentUpdate = r3, h(n2, e4); } - return u6.displayName = "Memo(" + (n4.displayName || n4.name) + ")", u6.prototype.isReactComponent = true, u6.__f = true, u6; + return u3.displayName = "Memo(" + (n2.displayName || n2.name) + ")", u3.prototype.isReactComponent = true, u3.__f = true, u3; } -(w3.prototype = new d()).isPureReactComponent = true, w3.prototype.shouldComponentUpdate = function(n4, t3) { - return C2(this.props, n4) || C2(this.state, t3); +(w3.prototype = new d()).isPureReactComponent = true, w3.prototype.shouldComponentUpdate = function(n2, t3) { + return C2(this.props, n2) || C2(this.state, t3); }; var x3 = l.__b; -l.__b = function(n4) { - n4.type && n4.type.__f && n4.ref && (n4.props.ref = n4.ref, n4.ref = null), x3 && x3(n4); +l.__b = function(n2) { + n2.type && n2.type.__f && n2.ref && (n2.props.ref = n2.ref, n2.ref = null), x3 && x3(n2); }; var N2 = typeof Symbol != "undefined" && Symbol.for && Symbol.for("react.forward_ref") || 3911; -function k3(n4) { +function k3(n2) { function t3(t4) { - var e5 = g3({}, t4); - return delete e5.ref, n4(e5, t4.ref || null); + var e3 = g3({}, t4); + return delete e3.ref, n2(e3, t4.ref || null); } - return t3.$$typeof = N2, t3.render = t3, t3.prototype.isReactComponent = t3.__f = true, t3.displayName = "ForwardRef(" + (n4.displayName || n4.name) + ")", t3; + return t3.$$typeof = N2, t3.render = t3, t3.prototype.isReactComponent = t3.__f = true, t3.displayName = "ForwardRef(" + (n2.displayName || n2.name) + ")", t3; } -var A3 = function(n4, t3) { - return n4 == null ? null : x(x(n4).map(t3)); +var A3 = function(n2, t3) { + return n2 == null ? null : x(x(n2).map(t3)); }; -var O2 = { map: A3, forEach: A3, count: function(n4) { - return n4 ? x(n4).length : 0; -}, only: function(n4) { - var t3 = x(n4); +var O2 = { map: A3, forEach: A3, count: function(n2) { + return n2 ? x(n2).length : 0; +}, only: function(n2) { + var t3 = x(n2); if (t3.length !== 1) throw "Children.only"; return t3[0]; }, toArray: x }; var T3 = l.__e; -l.__e = function(n4, t3, e5, r6) { - if (n4.then) { - for (var u6, o6 = t3; o6 = o6.__; ) - if ((u6 = o6.__c) && u6.__c) - return t3.__e == null && (t3.__e = e5.__e, t3.__k = e5.__k), u6.__c(n4, t3); +l.__e = function(n2, t3, e3, r3) { + if (n2.then) { + for (var u3, o3 = t3; o3 = o3.__; ) + if ((u3 = o3.__c) && u3.__c) + return t3.__e == null && (t3.__e = e3.__e, t3.__k = e3.__k), u3.__c(n2, t3); } - T3(n4, t3, e5, r6); + T3(n2, t3, e3, r3); }; var I2 = l.unmount; -function L2(n4, t3, e5) { - return n4 && (n4.__c && n4.__c.__H && (n4.__c.__H.__.forEach(function(n5) { - typeof n5.__c == "function" && n5.__c(); - }), n4.__c.__H = null), (n4 = g3({}, n4)).__c != null && (n4.__c.__P === e5 && (n4.__c.__P = t3), n4.__c = null), n4.__k = n4.__k && n4.__k.map(function(n5) { - return L2(n5, t3, e5); - })), n4; -} -function U(n4, t3, e5) { - return n4 && (n4.__v = null, n4.__k = n4.__k && n4.__k.map(function(n5) { - return U(n5, t3, e5); - }), n4.__c && n4.__c.__P === t3 && (n4.__e && e5.insertBefore(n4.__e, n4.__d), n4.__c.__e = true, n4.__c.__P = e5)), n4; +function L2(n2, t3, e3) { + return n2 && (n2.__c && n2.__c.__H && (n2.__c.__H.__.forEach(function(n3) { + typeof n3.__c == "function" && n3.__c(); + }), n2.__c.__H = null), (n2 = g3({}, n2)).__c != null && (n2.__c.__P === e3 && (n2.__c.__P = t3), n2.__c = null), n2.__k = n2.__k && n2.__k.map(function(n3) { + return L2(n3, t3, e3); + })), n2; +} +function U(n2, t3, e3) { + return n2 && (n2.__v = null, n2.__k = n2.__k && n2.__k.map(function(n3) { + return U(n3, t3, e3); + }), n2.__c && n2.__c.__P === t3 && (n2.__e && e3.insertBefore(n2.__e, n2.__d), n2.__c.__e = true, n2.__c.__P = e3)), n2; } function D() { this.__u = 0, this.t = null, this.__b = null; } -function F2(n4) { - var t3 = n4.__.__c; - return t3 && t3.__a && t3.__a(n4); -} -function M2(n4) { - var e5, r6, u6; - function o6(o7) { - if (e5 || (e5 = n4()).then(function(n5) { - r6 = n5.default || n5; - }, function(n5) { - u6 = n5; - }), u6) - throw u6; - if (!r6) - throw e5; - return h(r6, o7); - } - return o6.displayName = "Lazy", o6.__f = true, o6; +function F2(n2) { + var t3 = n2.__.__c; + return t3 && t3.__a && t3.__a(n2); +} +function M2(n2) { + var e3, r3, u3; + function o3(o4) { + if (e3 || (e3 = n2()).then(function(n3) { + r3 = n3.default || n3; + }, function(n3) { + u3 = n3; + }), u3) + throw u3; + if (!r3) + throw e3; + return h(r3, o4); + } + return o3.displayName = "Lazy", o3.__f = true, o3; } function V2() { this.u = null, this.o = null; } -l.unmount = function(n4) { - var t3 = n4.__c; - t3 && t3.__R && t3.__R(), t3 && n4.__h === true && (n4.type = null), I2 && I2(n4); -}, (D.prototype = new d()).__c = function(n4, t3) { - var e5 = t3.__c, r6 = this; - r6.t == null && (r6.t = []), r6.t.push(e5); - var u6 = F2(r6.__v), o6 = false, i5 = function() { - o6 || (o6 = true, e5.__R = null, u6 ? u6(l4) : l4()); +l.unmount = function(n2) { + var t3 = n2.__c; + t3 && t3.__R && t3.__R(), t3 && n2.__h === true && (n2.type = null), I2 && I2(n2); +}, (D.prototype = new d()).__c = function(n2, t3) { + var e3 = t3.__c, r3 = this; + r3.t == null && (r3.t = []), r3.t.push(e3); + var u3 = F2(r3.__v), o3 = false, i3 = function() { + o3 || (o3 = true, e3.__R = null, u3 ? u3(l3) : l3()); }; - e5.__R = i5; - var l4 = function() { - if (!--r6.__u) { - if (r6.state.__a) { - var n5 = r6.state.__a; - r6.__v.__k[0] = U(n5, n5.__c.__P, n5.__c.__O); + e3.__R = i3; + var l3 = function() { + if (!--r3.__u) { + if (r3.state.__a) { + var n3 = r3.state.__a; + r3.__v.__k[0] = U(n3, n3.__c.__P, n3.__c.__O); } var t4; - for (r6.setState({ __a: r6.__b = null }); t4 = r6.t.pop(); ) + for (r3.setState({ __a: r3.__b = null }); t4 = r3.t.pop(); ) t4.forceUpdate(); } }, c3 = t3.__h === true; - r6.__u++ || c3 || r6.setState({ __a: r6.__b = r6.__v.__k[0] }), n4.then(i5, i5); + r3.__u++ || c3 || r3.setState({ __a: r3.__b = r3.__v.__k[0] }), n2.then(i3, i3); }, D.prototype.componentWillUnmount = function() { this.t = []; -}, D.prototype.render = function(n4, e5) { +}, D.prototype.render = function(n2, e3) { if (this.__b) { if (this.__v.__k) { - var r6 = document.createElement("div"), o6 = this.__v.__k[0].__c; - this.__v.__k[0] = L2(this.__b, r6, o6.__O = o6.__P); + var r3 = document.createElement("div"), o3 = this.__v.__k[0].__c; + this.__v.__k[0] = L2(this.__b, r3, o3.__O = o3.__P); } this.__b = null; } - var i5 = e5.__a && h(p, null, n4.fallback); - return i5 && (i5.__h = null), [h(p, null, e5.__a ? null : n4.children), i5]; + var i3 = e3.__a && h(p, null, n2.fallback); + return i3 && (i3.__h = null), [h(p, null, e3.__a ? null : n2.children), i3]; }; -var W = function(n4, t3, e5) { - if (++e5[1] === e5[0] && n4.o.delete(t3), n4.props.revealOrder && (n4.props.revealOrder[0] !== "t" || !n4.o.size)) - for (e5 = n4.u; e5; ) { - for (; e5.length > 3; ) - e5.pop()(); - if (e5[1] < e5[0]) +var W = function(n2, t3, e3) { + if (++e3[1] === e3[0] && n2.o.delete(t3), n2.props.revealOrder && (n2.props.revealOrder[0] !== "t" || !n2.o.size)) + for (e3 = n2.u; e3; ) { + for (; e3.length > 3; ) + e3.pop()(); + if (e3[1] < e3[0]) break; - n4.u = e5 = e5[2]; + n2.u = e3 = e3[2]; } }; -function P2(n4) { +function P2(n2) { return this.getChildContext = function() { - return n4.context; - }, n4.children; -} -function $2(n4) { - var e5 = this, r6 = n4.i; - e5.componentWillUnmount = function() { - P(null, e5.l), e5.l = null, e5.i = null; - }, e5.i && e5.i !== r6 && e5.componentWillUnmount(), n4.__v ? (e5.l || (e5.i = r6, e5.l = { nodeType: 1, parentNode: r6, childNodes: [], appendChild: function(n5) { - this.childNodes.push(n5), e5.i.appendChild(n5); - }, insertBefore: function(n5, t3) { - this.childNodes.push(n5), e5.i.appendChild(n5); - }, removeChild: function(n5) { - this.childNodes.splice(this.childNodes.indexOf(n5) >>> 1, 1), e5.i.removeChild(n5); - } }), P(h(P2, { context: e5.context }, n4.__v), e5.l)) : e5.l && e5.componentWillUnmount(); -} -function j3(n4, e5) { - var r6 = h($2, { __v: n4, i: e5 }); - return r6.containerInfo = e5, r6; -} -(V2.prototype = new d()).__a = function(n4) { - var t3 = this, e5 = F2(t3.__v), r6 = t3.o.get(n4); - return r6[0]++, function(u6) { - var o6 = function() { - t3.props.revealOrder ? (r6.push(u6), W(t3, n4, r6)) : u6(); + return n2.context; + }, n2.children; +} +function $2(n2) { + var e3 = this, r3 = n2.i; + e3.componentWillUnmount = function() { + P(null, e3.l), e3.l = null, e3.i = null; + }, e3.i && e3.i !== r3 && e3.componentWillUnmount(), n2.__v ? (e3.l || (e3.i = r3, e3.l = { nodeType: 1, parentNode: r3, childNodes: [], appendChild: function(n3) { + this.childNodes.push(n3), e3.i.appendChild(n3); + }, insertBefore: function(n3, t3) { + this.childNodes.push(n3), e3.i.appendChild(n3); + }, removeChild: function(n3) { + this.childNodes.splice(this.childNodes.indexOf(n3) >>> 1, 1), e3.i.removeChild(n3); + } }), P(h(P2, { context: e3.context }, n2.__v), e3.l)) : e3.l && e3.componentWillUnmount(); +} +function j3(n2, e3) { + var r3 = h($2, { __v: n2, i: e3 }); + return r3.containerInfo = e3, r3; +} +(V2.prototype = new d()).__a = function(n2) { + var t3 = this, e3 = F2(t3.__v), r3 = t3.o.get(n2); + return r3[0]++, function(u3) { + var o3 = function() { + t3.props.revealOrder ? (r3.push(u3), W(t3, n2, r3)) : u3(); }; - e5 ? e5(o6) : o6(); + e3 ? e3(o3) : o3(); }; -}, V2.prototype.render = function(n4) { +}, V2.prototype.render = function(n2) { this.u = null, this.o = /* @__PURE__ */ new Map(); - var t3 = x(n4.children); - n4.revealOrder && n4.revealOrder[0] === "b" && t3.reverse(); - for (var e5 = t3.length; e5--; ) - this.o.set(t3[e5], this.u = [1, 0, this.u]); - return n4.children; + var t3 = x(n2.children); + n2.revealOrder && n2.revealOrder[0] === "b" && t3.reverse(); + for (var e3 = t3.length; e3--; ) + this.o.set(t3[e3], this.u = [1, 0, this.u]); + return n2.children; }, V2.prototype.componentDidUpdate = V2.prototype.componentDidMount = function() { - var n4 = this; - this.o.forEach(function(t3, e5) { - W(n4, e5, t3); + var n2 = this; + this.o.forEach(function(t3, e3) { + W(n2, e3, t3); }); }; var z3 = typeof Symbol != "undefined" && Symbol.for && Symbol.for("react.element") || 60103; var B3 = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/; var H2 = typeof document != "undefined"; -var Z = function(n4) { - return (typeof Symbol != "undefined" && typeof Symbol() == "symbol" ? /fil|che|rad/i : /fil|che|ra/i).test(n4); +var Z = function(n2) { + return (typeof Symbol != "undefined" && typeof Symbol() == "symbol" ? /fil|che|rad/i : /fil|che|ra/i).test(n2); }; -function Y(n4, t3, e5) { - return t3.__k == null && (t3.textContent = ""), P(n4, t3), typeof e5 == "function" && e5(), n4 ? n4.__c : null; +function Y(n2, t3, e3) { + return t3.__k == null && (t3.textContent = ""), P(n2, t3), typeof e3 == "function" && e3(), n2 ? n2.__c : null; } -function q3(n4, t3, e5) { - return S(n4, t3), typeof e5 == "function" && e5(), n4 ? n4.__c : null; +function q3(n2, t3, e3) { + return S(n2, t3), typeof e3 == "function" && e3(), n2 ? n2.__c : null; } d.prototype.isReactComponent = {}, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t3) { Object.defineProperty(d.prototype, t3, { configurable: true, get: function() { return this["UNSAFE_" + t3]; - }, set: function(n4) { - Object.defineProperty(this, t3, { configurable: true, writable: true, value: n4 }); + }, set: function(n2) { + Object.defineProperty(this, t3, { configurable: true, writable: true, value: n2 }); } }); }); var G = l.event; @@ -1594,78 +1594,78 @@ function K() { function Q() { return this.defaultPrevented; } -l.event = function(n4) { - return G && (n4 = G(n4)), n4.persist = J, n4.isPropagationStopped = K, n4.isDefaultPrevented = Q, n4.nativeEvent = n4; +l.event = function(n2) { + return G && (n2 = G(n2)), n2.persist = J, n2.isPropagationStopped = K, n2.isDefaultPrevented = Q, n2.nativeEvent = n2; }; var X; var nn = { configurable: true, get: function() { return this.class; } }; var tn = l.vnode; -l.vnode = function(n4) { - var t3 = n4.type, e5 = n4.props, u6 = e5; +l.vnode = function(n2) { + var t3 = n2.type, e3 = n2.props, u3 = e3; if (typeof t3 == "string") { - var o6 = t3.indexOf("-") === -1; - for (var i5 in u6 = {}, e5) { - var l4 = e5[i5]; - H2 && i5 === "children" && t3 === "noscript" || i5 === "value" && "defaultValue" in e5 && l4 == null || (i5 === "defaultValue" && "value" in e5 && e5.value == null ? i5 = "value" : i5 === "download" && l4 === true ? l4 = "" : /ondoubleclick/i.test(i5) ? i5 = "ondblclick" : /^onchange(textarea|input)/i.test(i5 + t3) && !Z(e5.type) ? i5 = "oninput" : /^onfocus$/i.test(i5) ? i5 = "onfocusin" : /^onblur$/i.test(i5) ? i5 = "onfocusout" : /^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i5) ? i5 = i5.toLowerCase() : o6 && B3.test(i5) ? i5 = i5.replace(/[A-Z0-9]/g, "-$&").toLowerCase() : l4 === null && (l4 = void 0), /^oninput$/i.test(i5) && (i5 = i5.toLowerCase(), u6[i5] && (i5 = "oninputCapture")), u6[i5] = l4); - } - t3 == "select" && u6.multiple && Array.isArray(u6.value) && (u6.value = x(e5.children).forEach(function(n5) { - n5.props.selected = u6.value.indexOf(n5.props.value) != -1; - })), t3 == "select" && u6.defaultValue != null && (u6.value = x(e5.children).forEach(function(n5) { - n5.props.selected = u6.multiple ? u6.defaultValue.indexOf(n5.props.value) != -1 : u6.defaultValue == n5.props.value; - })), n4.props = u6, e5.class != e5.className && (nn.enumerable = "className" in e5, e5.className != null && (u6.class = e5.className), Object.defineProperty(u6, "className", nn)); - } - n4.$$typeof = z3, tn && tn(n4); + var o3 = t3.indexOf("-") === -1; + for (var i3 in u3 = {}, e3) { + var l3 = e3[i3]; + H2 && i3 === "children" && t3 === "noscript" || i3 === "value" && "defaultValue" in e3 && l3 == null || (i3 === "defaultValue" && "value" in e3 && e3.value == null ? i3 = "value" : i3 === "download" && l3 === true ? l3 = "" : /ondoubleclick/i.test(i3) ? i3 = "ondblclick" : /^onchange(textarea|input)/i.test(i3 + t3) && !Z(e3.type) ? i3 = "oninput" : /^onfocus$/i.test(i3) ? i3 = "onfocusin" : /^onblur$/i.test(i3) ? i3 = "onfocusout" : /^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i3) ? i3 = i3.toLowerCase() : o3 && B3.test(i3) ? i3 = i3.replace(/[A-Z0-9]/g, "-$&").toLowerCase() : l3 === null && (l3 = void 0), /^oninput$/i.test(i3) && (i3 = i3.toLowerCase(), u3[i3] && (i3 = "oninputCapture")), u3[i3] = l3); + } + t3 == "select" && u3.multiple && Array.isArray(u3.value) && (u3.value = x(e3.children).forEach(function(n3) { + n3.props.selected = u3.value.indexOf(n3.props.value) != -1; + })), t3 == "select" && u3.defaultValue != null && (u3.value = x(e3.children).forEach(function(n3) { + n3.props.selected = u3.multiple ? u3.defaultValue.indexOf(n3.props.value) != -1 : u3.defaultValue == n3.props.value; + })), n2.props = u3, e3.class != e3.className && (nn.enumerable = "className" in e3, e3.className != null && (u3.class = e3.className), Object.defineProperty(u3, "className", nn)); + } + n2.$$typeof = z3, tn && tn(n2); }; var en = l.__r; -l.__r = function(n4) { - en && en(n4), X = n4.__c; +l.__r = function(n2) { + en && en(n2), X = n2.__c; }; -var rn = { ReactCurrentDispatcher: { current: { readContext: function(n4) { - return X.__n[n4.__c].props.value; +var rn = { ReactCurrentDispatcher: { current: { readContext: function(n2) { + return X.__n[n2.__c].props.value; } } } }; -function on(n4) { - return h.bind(null, n4); +function on(n2) { + return h.bind(null, n2); } -function ln(n4) { - return !!n4 && n4.$$typeof === z3; +function ln(n2) { + return !!n2 && n2.$$typeof === z3; } -function cn(n4) { - return ln(n4) ? q.apply(null, arguments) : n4; +function cn(n2) { + return ln(n2) ? q.apply(null, arguments) : n2; } -function fn(n4) { - return !!n4.__k && (P(null, n4), true); +function fn(n2) { + return !!n2.__k && (P(null, n2), true); } -function an(n4) { - return n4 && (n4.base || n4.nodeType === 1 && n4) || null; +function an(n2) { + return n2 && (n2.base || n2.nodeType === 1 && n2) || null; } -var sn = function(n4, t3) { - return n4(t3); +var sn = function(n2, t3) { + return n2(t3); }; -var hn = function(n4, t3) { - return n4(t3); +var hn = function(n2, t3) { + return n2(t3); }; var vn = p; -function dn(n4) { - n4(); +function dn(n2) { + n2(); } -function pn(n4) { - return n4; +function pn(n2) { + return n2; } function mn() { return [false, dn]; } var yn = s2; -function _n(n4, t3) { - var e5 = t3(), r6 = p2({ h: { __: e5, v: t3 } }), u6 = r6[0].h, o6 = r6[1]; +function _n(n2, t3) { + var e3 = t3(), r3 = p2({ h: { __: e3, v: t3 } }), u3 = r3[0].h, o3 = r3[1]; return s2(function() { - u6.__ = e5, u6.v = t3, E(u6.__, t3()) || o6({ h: u6 }); - }, [n4, e5, t3]), h2(function() { - return E(u6.__, u6.v()) || o6({ h: u6 }), n4(function() { - E(u6.__, u6.v()) || o6({ h: u6 }); + u3.__ = e3, u3.v = t3, E(u3.__, t3()) || o3({ h: u3 }); + }, [n2, e3, t3]), h2(function() { + return E(u3.__, u3.v()) || o3({ h: u3 }), n2(function() { + E(u3.__, u3.v()) || o3({ h: u3 }); }); - }, [n4]), e5; + }, [n2]), e3; } var bn = { useState: p2, useId: V, useReducer: y2, useEffect: h2, useLayoutEffect: s2, useInsertionEffect: yn, useTransition: mn, useDeferredValue: pn, useSyncExternalStore: _n, startTransition: dn, useRef: _2, useImperativeHandle: A2, useMemo: F, useCallback: T2, useContext: q2, useDebugValue: x2, version: "17.0.2", Children: O2, render: Y, hydrate: q3, unmountComponentAtNode: fn, createPortal: j3, createElement: h, createContext: B, createFactory: on, cloneElement: cn, createRef: y, Fragment: p, isValidElement: ln, findDOMNode: an, Component: d, PureComponent: w3, memo: R, forwardRef: k3, flushSync: hn, unstable_batchedUpdates: sn, StrictMode: vn, Suspense: D, SuspenseList: V2, lazy: M2, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: rn }; @@ -1682,8 +1682,8 @@ function createRoot(container) { } // node_modules/recoil/es/recoil.js -function isPromise(p5) { - return !!p5 && typeof p5.then === "function"; +function isPromise(p3) { + return !!p3 && typeof p3.then === "function"; } var Recoil_isPromise = isPromise; function nullthrows(x4, message) { @@ -1731,18 +1731,18 @@ var loadableAccessors = { return Recoil_isPromise(next) ? loadableWithPromise(next.then((value) => ({ __value: value }))) : loadableWithValue(next); - } catch (e5) { - return Recoil_isPromise(e5) ? loadableWithPromise(e5.next(() => map(this.contents))) : loadableWithError(e5); + } catch (e3) { + return Recoil_isPromise(e3) ? loadableWithPromise(e3.next(() => map(this.contents))) : loadableWithError(e3); } } if (this.state === "loading") { return loadableWithPromise(this.contents.then((value) => ({ __value: map(value.__value) - })).catch((e5) => { - if (Recoil_isPromise(e5)) { - return e5.then(() => map(this.contents)); + })).catch((e3) => { + if (Recoil_isPromise(e3)) { + return e3.then(() => map(this.contents)); } - throw e5; + throw e3; })); } const error = new Error("Invalid Loadable state"); @@ -1819,7 +1819,7 @@ function loadableLoading() { })); } function loadableAll(inputs) { - return inputs.every((i5) => i5.state === "hasValue") ? loadableWithValue(inputs.map((i5) => i5.contents)) : inputs.some((i5) => i5.state === "hasError") ? loadableWithError(Recoil_nullthrows(inputs.find((i5) => i5.state === "hasError"), "Invalid loadable passed to loadableAll").contents) : loadableWithPromise(Promise.all(inputs.map((i5) => i5.contents)).then((value) => ({ + return inputs.every((i3) => i3.state === "hasValue") ? loadableWithValue(inputs.map((i3) => i3.contents)) : inputs.some((i3) => i3.state === "hasError") ? loadableWithError(Recoil_nullthrows(inputs.find((i3) => i3.state === "hasError"), "Invalid loadable passed to loadableAll").contents) : loadableWithPromise(Promise.all(inputs.map((i3) => i3.contents)).then((value) => ({ __value: value }))); } @@ -2506,7 +2506,7 @@ var Recoil_Batching = { setBatcher, batchUpdates }; -function enqueueExecution(s10, f4) { +function enqueueExecution(s3, f4) { f4(); } var Recoil_Queue = { @@ -2542,8 +2542,8 @@ function graph() { } function cloneGraph(graph2) { return { - nodeDeps: Recoil_mapMap(graph2.nodeDeps, (s10) => new Set(s10)), - nodeToNodeSubscriptions: Recoil_mapMap(graph2.nodeToNodeSubscriptions, (s10) => new Set(s10)) + nodeDeps: Recoil_mapMap(graph2.nodeDeps, (s3) => new Set(s3)), + nodeToNodeSubscriptions: Recoil_mapMap(graph2.nodeToNodeSubscriptions, (s3) => new Set(s3)) }; } function mergeDependencyMapIntoGraph(deps, graph2, olderGraph) { @@ -2651,8 +2651,8 @@ var hamt_1 = createCommonjsModule(function(module2) { if (type !== "string") str += ""; var hash4 = 0; - for (var i5 = 0, len = str.length; i5 < len; ++i5) { - var c3 = str.charCodeAt(i5); + for (var i3 = 0, len = str.length; i3 < len; ++i3) { + var c3 = str.charCodeAt(i3); hash4 = (hash4 << 5) - hash4 + c3 | 0; } return hash4; @@ -2665,8 +2665,8 @@ var hamt_1 = createCommonjsModule(function(module2) { x4 += x4 >> 16; return x4 & 127; }; - var hashFragment = function hashFragment2(shift, h4) { - return h4 >>> shift & MASK; + var hashFragment = function hashFragment2(shift, h3) { + return h3 >>> shift & MASK; }; var toBitmap = function toBitmap2(x4) { return 1 << x4; @@ -2679,8 +2679,8 @@ var hamt_1 = createCommonjsModule(function(module2) { if (!mutate2) { var len = arr.length; out = new Array(len); - for (var i5 = 0; i5 < len; ++i5) { - out[i5] = arr[i5]; + for (var i3 = 0; i3 < len; ++i3) { + out[i3] = arr[i3]; } } out[at] = v3; @@ -2688,20 +2688,20 @@ var hamt_1 = createCommonjsModule(function(module2) { }; var arraySpliceOut = function arraySpliceOut2(mutate2, at, arr) { var newLen = arr.length - 1; - var i5 = 0; + var i3 = 0; var g4 = 0; var out = arr; if (mutate2) { - i5 = g4 = at; + i3 = g4 = at; } else { out = new Array(newLen); - while (i5 < at) { - out[g4++] = arr[i5++]; + while (i3 < at) { + out[g4++] = arr[i3++]; } } - ++i5; - while (i5 <= newLen) { - out[g4++] = arr[i5++]; + ++i3; + while (i3 <= newLen) { + out[g4++] = arr[i3++]; } if (mutate2) { out.length = newLen; @@ -2718,14 +2718,14 @@ var hamt_1 = createCommonjsModule(function(module2) { arr[at] = v3; return arr; } - var i5 = 0, g4 = 0; + var i3 = 0, g4 = 0; var out = new Array(len + 1); - while (i5 < at) { - out[g4++] = arr[i5++]; + while (i3 < at) { + out[g4++] = arr[i3++]; } out[at] = v3; - while (i5 < len) { - out[++g4] = arr[i5++]; + while (i3 < len) { + out[++g4] = arr[i3++]; } return out; }; @@ -2783,9 +2783,9 @@ var hamt_1 = createCommonjsModule(function(module2) { var arr = []; var bit = bitmap; var count2 = 0; - for (var i5 = 0; bit; ++i5) { + for (var i3 = 0; bit; ++i3) { if (bit & 1) - arr[i5] = subNodes[count2++]; + arr[i3] = subNodes[count2++]; bit >>>= 1; } arr[frag] = child; @@ -2795,28 +2795,28 @@ var hamt_1 = createCommonjsModule(function(module2) { var children = new Array(count2 - 1); var g4 = 0; var bitmap = 0; - for (var i5 = 0, len = elements.length; i5 < len; ++i5) { - if (i5 !== removed) { - var elem = elements[i5]; + for (var i3 = 0, len = elements.length; i3 < len; ++i3) { + if (i3 !== removed) { + var elem = elements[i3]; if (elem && !isEmptyNode(elem)) { children[g4++] = elem; - bitmap |= 1 << i5; + bitmap |= 1 << i3; } } } return IndexedNode(edit, bitmap, children); }; - var mergeLeaves = function mergeLeaves2(edit, shift, h1, n1, h22, n22) { + var mergeLeaves = function mergeLeaves2(edit, shift, h1, n1, h22, n2) { if (h1 === h22) - return Collision(edit, h1, [n22, n1]); + return Collision(edit, h1, [n2, n1]); var subH1 = hashFragment(shift, h1); var subH2 = hashFragment(shift, h22); - return IndexedNode(edit, toBitmap(subH1) | toBitmap(subH2), subH1 === subH2 ? [mergeLeaves2(edit, shift + SIZE, h1, n1, h22, n22)] : subH1 < subH2 ? [n1, n22] : [n22, n1]); + return IndexedNode(edit, toBitmap(subH1) | toBitmap(subH2), subH1 === subH2 ? [mergeLeaves2(edit, shift + SIZE, h1, n1, h22, n2)] : subH1 < subH2 ? [n1, n2] : [n2, n1]); }; - var updateCollisionList = function updateCollisionList2(mutate2, edit, keyEq, h4, list, f4, k4, size2) { + var updateCollisionList = function updateCollisionList2(mutate2, edit, keyEq, h3, list, f4, k4, size2) { var len = list.length; - for (var i5 = 0; i5 < len; ++i5) { - var child = list[i5]; + for (var i3 = 0; i3 < len; ++i3) { + var child = list[i3]; if (keyEq(k4, child.key)) { var value = child.value; var _newValue = f4(value); @@ -2824,21 +2824,21 @@ var hamt_1 = createCommonjsModule(function(module2) { return list; if (_newValue === nothing) { --size2.value; - return arraySpliceOut(mutate2, i5, list); + return arraySpliceOut(mutate2, i3, list); } - return arrayUpdate(mutate2, i5, Leaf(edit, h4, k4, _newValue), list); + return arrayUpdate(mutate2, i3, Leaf(edit, h3, k4, _newValue), list); } } var newValue = f4(); if (newValue === nothing) return list; ++size2.value; - return arrayUpdate(mutate2, len, Leaf(edit, h4, k4, newValue), list); + return arrayUpdate(mutate2, len, Leaf(edit, h3, k4, newValue), list); }; var canEditNode = function canEditNode2(edit, node) { return edit === node.edit; }; - var Leaf__modify = function Leaf__modify2(edit, keyEq, shift, f4, h4, k4, size2) { + var Leaf__modify = function Leaf__modify2(edit, keyEq, shift, f4, h3, k4, size2) { if (keyEq(k4, this.key)) { var _v = f4(this.value); if (_v === this.value) @@ -2851,16 +2851,16 @@ var hamt_1 = createCommonjsModule(function(module2) { this.value = _v; return this; } - return Leaf(edit, h4, k4, _v); + return Leaf(edit, h3, k4, _v); } var v3 = f4(); if (v3 === nothing) return this; ++size2.value; - return mergeLeaves(edit, shift, this.hash, this, h4, Leaf(edit, h4, k4, v3)); + return mergeLeaves(edit, shift, this.hash, this, h3, Leaf(edit, h3, k4, v3)); }; - var Collision__modify = function Collision__modify2(edit, keyEq, shift, f4, h4, k4, size2) { - if (h4 === this.hash) { + var Collision__modify = function Collision__modify2(edit, keyEq, shift, f4, h3, k4, size2) { + if (h3 === this.hash) { var canEdit = canEditNode(edit, this); var list = updateCollisionList(canEdit, edit, keyEq, this.hash, this.children, f4, k4, size2); if (list === this.children) @@ -2871,17 +2871,17 @@ var hamt_1 = createCommonjsModule(function(module2) { if (v3 === nothing) return this; ++size2.value; - return mergeLeaves(edit, shift, this.hash, this, h4, Leaf(edit, h4, k4, v3)); + return mergeLeaves(edit, shift, this.hash, this, h3, Leaf(edit, h3, k4, v3)); }; - var IndexedNode__modify = function IndexedNode__modify2(edit, keyEq, shift, f4, h4, k4, size2) { + var IndexedNode__modify = function IndexedNode__modify2(edit, keyEq, shift, f4, h3, k4, size2) { var mask = this.mask; var children = this.children; - var frag = hashFragment(shift, h4); + var frag = hashFragment(shift, h3); var bit = toBitmap(frag); var indx = fromBitmap(mask, bit); var exists = mask & bit; var current = exists ? children[indx] : empty; - var child = current._modify(edit, keyEq, shift + SIZE, f4, h4, k4, size2); + var child = current._modify(edit, keyEq, shift + SIZE, f4, h3, k4, size2); if (current === child) return this; var canEdit = canEditNode(edit, this); @@ -2909,12 +2909,12 @@ var hamt_1 = createCommonjsModule(function(module2) { } return IndexedNode(edit, bitmap, newChildren); }; - var ArrayNode__modify = function ArrayNode__modify2(edit, keyEq, shift, f4, h4, k4, size2) { + var ArrayNode__modify = function ArrayNode__modify2(edit, keyEq, shift, f4, h3, k4, size2) { var count2 = this.size; var children = this.children; - var frag = hashFragment(shift, h4); + var frag = hashFragment(shift, h3); var child = children[frag]; - var newChild = (child || empty)._modify(edit, keyEq, shift + SIZE, f4, h4, k4, size2); + var newChild = (child || empty)._modify(edit, keyEq, shift + SIZE, f4, h3, k4, size2); if (child === newChild) return this; var canEdit = canEditNode(edit, this); @@ -2937,12 +2937,12 @@ var hamt_1 = createCommonjsModule(function(module2) { } return ArrayNode(edit, count2, newChildren); }; - empty._modify = function(edit, keyEq, shift, f4, h4, k4, size2) { + empty._modify = function(edit, keyEq, shift, f4, h3, k4, size2) { var v3 = f4(); if (v3 === nothing) return empty; ++size2.value; - return Leaf(edit, h4, k4, v3); + return Leaf(edit, h3, k4, v3); }; function Map2(editable, edit, config, root, size2) { this._editable = editable; @@ -2971,8 +2971,8 @@ var hamt_1 = createCommonjsModule(function(module2) { case COLLISION: { if (hash4 === node.hash) { var children = node.children; - for (var i5 = 0, len = children.length; i5 < len; ++i5) { - var child = children[i5]; + for (var i3 = 0, len = children.length; i3 < len; ++i3) { + var child = children[i3]; if (keyEq(key2, child.key)) return child.value; } @@ -3035,8 +3035,8 @@ var hamt_1 = createCommonjsModule(function(module2) { Map2.prototype.has = function(key2) { return has(key2, this); }; - var defKeyCompare = function defKeyCompare2(x4, y4) { - return x4 === y4; + var defKeyCompare = function defKeyCompare2(x4, y3) { + return x4 === y3; }; hamt.make = function(config) { return new Map2(0, 0, { @@ -3116,11 +3116,11 @@ var hamt_1 = createCommonjsModule(function(module2) { var appk = function appk2(k4) { return k4 && lazyVisitChildren(k4[0], k4[1], k4[2], k4[3], k4[4]); }; - var lazyVisitChildren = function lazyVisitChildren2(len, children, i5, f4, k4) { - while (i5 < len) { - var child = children[i5++]; + var lazyVisitChildren = function lazyVisitChildren2(len, children, i3, f4, k4) { + while (i3 < len) { + var child = children[i3++]; if (child && !isEmptyNode(child)) - return lazyVisit(child, f4, [len, children, i5, f4, k4]); + return lazyVisit(child, f4, [len, children, i3, f4, k4]); } return appk(k4); }; @@ -3186,15 +3186,15 @@ var hamt_1 = createCommonjsModule(function(module2) { Map2.prototype.values = function() { return values(this); }; - var fold = hamt.fold = function(f4, z4, m5) { - var root = m5._root; + var fold = hamt.fold = function(f4, z4, m3) { + var root = m3._root; if (root.type === LEAF) return f4(z4, root.value, root.key); var toVisit = [root.children]; var children = void 0; while (children = toVisit.pop()) { - for (var i5 = 0, len = children.length; i5 < len; ) { - var child = children[i5++]; + for (var i3 = 0, len = children.length; i3 < len; ) { + var child = children[i3++]; if (child && child.type) { if (child.type === LEAF) z4 = f4(z4, child.value, child.key); @@ -3267,9 +3267,9 @@ var HashArrayMappedTrieMap = class { constructor(existing) { _defineProperty(this, "_hamt", hamt_1.empty.beginMutation()); if (existing instanceof HashArrayMappedTrieMap) { - const h4 = existing._hamt.endMutation(); - existing._hamt = h4.beginMutation(); - this._hamt = h4.beginMutation(); + const h3 = existing._hamt.endMutation(); + existing._hamt = h3.beginMutation(); + this._hamt = h3.beginMutation(); } else if (existing) { for (const [k4, v3] of existing.entries()) { this._hamt.set(k4, v3); @@ -3408,13 +3408,13 @@ function releaseRetainablesNowOnCurrentTree(store, retainables) { return; } const nodes2 = /* @__PURE__ */ new Set(); - for (const r6 of retainables) { - if (r6 instanceof RetentionZone$2) { - for (const n4 of nodesRetainedByZone(storeState, r6)) { - nodes2.add(n4); + for (const r3 of retainables) { + if (r3 instanceof RetentionZone$2) { + for (const n2 of nodesRetainedByZone(storeState, r3)) { + nodes2.add(n2); } } else { - nodes2.add(r6); + nodes2.add(r3); } } const releasableNodes = findReleasableNodes(store, nodes2); @@ -3579,8 +3579,8 @@ function releaseScheduledRetainablesNow(store) { releaseRetainablesNowOnCurrentTree(store, state.retention.retainablesToCheckForRelease); state.retention.retainablesToCheckForRelease.clear(); } -function retainedByOptionWithDefault(r6) { - return r6 === void 0 ? "recoilRoot" : r6; +function retainedByOptionWithDefault(r3) { + return r3 === void 0 ? "recoilRoot" : r3; } var Recoil_Retention = { updateRetainCount, @@ -4034,8 +4034,8 @@ function initialStoreState_DEPRECATED(store, initializeState) { const writes = setNodeValue$2(store, state, atom2.key, value); const writtenNodes = new Set(writes.keys()); const nonvalidatedAtoms = state.nonvalidatedAtoms.clone(); - for (const n4 of writtenNodes) { - nonvalidatedAtoms.delete(n4); + for (const n2 of writtenNodes) { + nonvalidatedAtoms.delete(n2); } initial.currentTree = { ...state, @@ -4298,25 +4298,25 @@ var invariant_1 = invariant; var Recoil_invariant = invariant_1; function mergeMaps(...maps) { const result = /* @__PURE__ */ new Map(); - for (let i5 = 0; i5 < maps.length; i5++) { - const iterator = maps[i5].keys(); + for (let i3 = 0; i3 < maps.length; i3++) { + const iterator = maps[i3].keys(); let nextKey; while (!(nextKey = iterator.next()).done) { - result.set(nextKey.value, maps[i5].get(nextKey.value)); + result.set(nextKey.value, maps[i3].get(nextKey.value)); } } return result; } var Recoil_mergeMaps = mergeMaps; -function shallowArrayEqual(a5, b4) { - if (a5 === b4) { +function shallowArrayEqual(a3, b3) { + if (a3 === b3) { return true; } - if (a5.length !== b4.length) { + if (a3.length !== b3.length) { return false; } - for (let i5 = 0, l4 = a5.length; i5 < l4; i5++) { - if (a5[i5] !== b4[i5]) { + for (let i3 = 0, l3 = a3.length; i3 < l3; i3++) { + if (a3[i3] !== b3[i3]) { return false; } } @@ -4936,7 +4936,7 @@ function useRetain(toRetain) { } function useRetain_ACTUAL(toRetain) { const array = Array.isArray(toRetain) ? toRetain : [toRetain]; - const retainables = array.map((a5) => a5 instanceof RetentionZone$3 ? a5 : a5.key); + const retainables = array.map((a3) => a3 instanceof RetentionZone$3 ? a3 : a3.key); const storeRef = useStoreRef$1(); useEffect$1(() => { if (!Recoil_gkx_1("recoil_memory_managament_2020")) { @@ -4947,13 +4947,13 @@ function useRetain_ACTUAL(toRetain) { window.clearTimeout(timeoutID.current); timeoutID.current = null; } else { - for (const r6 of retainables) { - updateRetainCount$2(store, r6, 1); + for (const r3 of retainables) { + updateRetainCount$2(store, r3, 1); } } return () => { - for (const r6 of retainables) { - updateRetainCount$2(store, r6, -1); + for (const r3 of retainables) { + updateRetainCount$2(store, r3, -1); } }; }, [storeRef, ...retainables]); @@ -4961,12 +4961,12 @@ function useRetain_ACTUAL(toRetain) { const previousRetainables = usePrevious(retainables); if (!isSSR$2 && (previousRetainables === void 0 || !Recoil_shallowArrayEqual(previousRetainables, retainables))) { const store = storeRef.current; - for (const r6 of retainables) { - updateRetainCount$2(store, r6, 1); + for (const r3 of retainables) { + updateRetainCount$2(store, r3, 1); } if (previousRetainables) { - for (const r6 of previousRetainables) { - updateRetainCount$2(store, r6, -1); + for (const r3 of previousRetainables) { + updateRetainCount$2(store, r3, -1); } } if (timeoutID.current) { @@ -4974,8 +4974,8 @@ function useRetain_ACTUAL(toRetain) { } timeoutID.current = window.setTimeout(() => { timeoutID.current = null; - for (const r6 of retainables) { - updateRetainCount$2(store, r6, -1); + for (const r3 of retainables) { + updateRetainCount$2(store, r3, -1); } }, SUSPENSE_TIMEOUT_MS); } @@ -5134,7 +5134,7 @@ function stringify(x4, opt, key2) { return "__PROMISE__"; } if (Array.isArray(x4)) { - return `[${x4.map((v3, i5) => stringify(v3, opt, i5.toString()))}]`; + return `[${x4.map((v3, i3) => stringify(v3, opt, i3.toString()))}]`; } if (typeof x4.toJSON === "function") { return stringify(x4.toJSON(key2), opt, key2); @@ -5147,7 +5147,7 @@ function stringify(x4, opt, key2) { return stringify(obj, opt, key2); } if (x4 instanceof Set) { - return stringify(Array.from(x4).sort((a5, b4) => stringify(a5, opt).localeCompare(stringify(b4, opt))), opt, key2); + return stringify(Array.from(x4).sort((a3, b3) => stringify(a3, opt).localeCompare(stringify(b3, opt))), opt, key2); } if (Symbol !== void 0 && x4[Symbol.iterator] != null && typeof x4[Symbol.iterator] === "function") { return stringify(Array.from(x4), opt, key2); @@ -6508,11 +6508,11 @@ var { function concurrentRequests(getRecoilValue, deps) { const results = Array(deps.length).fill(void 0); const exceptions = Array(deps.length).fill(void 0); - for (const [i5, dep] of deps.entries()) { + for (const [i3, dep] of deps.entries()) { try { - results[i5] = getRecoilValue(dep); - } catch (e5) { - exceptions[i5] = e5; + results[i3] = getRecoilValue(dep); + } catch (e3) { + exceptions[i3] = e3; } } return [results, exceptions]; @@ -6564,14 +6564,14 @@ var waitForAny = Recoil_selectorFamily({ return wrapLoadables(dependencies, results, exceptions); } return new Promise((resolve) => { - for (const [i5, exp] of exceptions.entries()) { + for (const [i3, exp] of exceptions.entries()) { if (Recoil_isPromise(exp)) { exp.then((result) => { - results[i5] = getValueFromLoadablePromiseResult(result); - exceptions[i5] = void 0; + results[i3] = getValueFromLoadablePromiseResult(result); + exceptions[i3] = void 0; resolve(wrapLoadables(dependencies, results, exceptions)); }).catch((error) => { - exceptions[i5] = error; + exceptions[i3] = error; resolve(wrapLoadables(dependencies, results, exceptions)); }); } @@ -6608,12 +6608,12 @@ var waitForAllSettled = Recoil_selectorFamily({ if (exceptions.every((exp) => !Recoil_isPromise(exp))) { return wrapLoadables(dependencies, results, exceptions); } - return Promise.all(exceptions.map((exp, i5) => Recoil_isPromise(exp) ? exp.then((result) => { - results[i5] = getValueFromLoadablePromiseResult(result); - exceptions[i5] = void 0; + return Promise.all(exceptions.map((exp, i3) => Recoil_isPromise(exp) ? exp.then((result) => { + results[i3] = getValueFromLoadablePromiseResult(result); + exceptions[i3] = void 0; }).catch((error) => { - results[i5] = void 0; - exceptions[i5] = error; + results[i3] = void 0; + exceptions[i3] = error; }) : null)).then(() => wrapLoadables(dependencies, results, exceptions)); }, dangerouslyAllowMutability: true @@ -6773,63 +6773,34 @@ function useForceUpdate() { } // src/components/Spaces/FileExplorerVirtualized.tsx -var import_obsidian7 = require("obsidian"); +var import_obsidian8 = require("obsidian"); // src/recoil/pluginState.ts -var view = Recoil_index_4({ - key: "fileTreeViewState", - default: "folder" -}); -var activeFolderPath = Recoil_index_4({ - key: "fileTreeActiveFolderPathState", - default: "" -}); var activeFile = Recoil_index_4({ - key: "fileTreeActiveFile", + key: "spacesActiveFile", default: null, dangerouslyAllowMutability: true }); -var excludedFolders = Recoil_index_4({ - key: "fileTreeExcludedFoldersState", - default: [] -}); -var excludedExtensions = Recoil_index_4({ - key: "fileTreeExcludedExtensions", - default: [] -}); -var folderFileCountMap = Recoil_index_4({ - key: "fileTreeFolderFileCountMapState", - default: {} -}); var folderTree = Recoil_index_4({ - key: "fileTreeFolderTreeState", + key: "spacesFolderTree", default: null, dangerouslyAllowMutability: true }); -var fileList = Recoil_index_4({ - key: "fileTreeFileListState", - default: [], - dangerouslyAllowMutability: true -}); var sections = Recoil_index_4({ - key: "fileTreePinnedFilesState", + key: "spacesSections", default: [], dangerouslyAllowMutability: true }); var fileIcons = Recoil_index_4({ - key: "fileTreeFileIcons", + key: "spacesIcons", default: [] }); var openFolders = Recoil_index_4({ - key: "fileTreeOpenFoldersState", + key: "spacesOpenFolders", default: [] }); -var showSubFolders = Recoil_index_4({ - key: "showSubFoldersInVault", - default: false -}); var focusedFolder = Recoil_index_4({ - key: "fileTreeFocusedFolder", + key: "spacesFocusedFolder", default: null, dangerouslyAllowMutability: true }); @@ -6837,7 +6808,7 @@ var focusedFolder = Recoil_index_4({ // src/utils/utils.ts var import_obsidian4 = require("obsidian"); -// src/modals.ts +// src/components/Spaces/modals.ts var import_obsidian = require("obsidian"); // src/i18n.ts @@ -6861,7 +6832,10 @@ var T4 = class { emoji: "Emoji", image: "Image", flow: "Flow Note", - tag: "Tag" + tag: "Tag", + makeMenu: "Make Menu", + selectStyle: "Style", + toggleKeyboard: "Toggle Keyboard" }, styles: { bold: "Bold", @@ -6869,7 +6843,9 @@ var T4 = class { strikethrough: "Strikethrough", code: "Code", link: "Web Link", - blocklink: "Link to Note" + blocklink: "Link to Note", + textColor: "Text Color", + highlight: "Highlight" }, commandsSuggest: { noResult: "No result" @@ -6893,6 +6869,8 @@ var T4 = class { newSpace: "New Space", collapseAllSections: "Collapse All Spaces", expandAllSections: "Expand All Spaces", + collapseAllFolders: "Collapse All Folders", + expandAllFolders: "Expand All Folders", spaceTitle: "Add/Remove in Space" }, buttons: { @@ -6904,7 +6882,11 @@ var T4 = class { createNote: "New Note", createSection: "New Space", cancel: "Cancel", - search: "Search" + search: "Search", + toggleFlow: "Hide Flow", + openFlow: "Open Flow", + hideFlow: "Hide Flow", + openLink: "Open Link" }, labels: { createFolder: "New Folder Name", @@ -6915,7 +6897,8 @@ var T4 = class { collapse: "Collapse", expand: "Expand", findStickers: "Find Sticker", - placeholder: "Type '/' for commands" + placeholder: "Type '/' for commands", + noFile: "is not created yet. Click to create." }, flowView: { emptyDoc: "Empty Document", @@ -6923,7 +6906,7 @@ var T4 = class { emptyFolder: "This Folder is Empty" }, notice: { - duplicateFile: "Folder already contains note with same name.", + duplicateFile: "Folder already contains note with same name", addedToSection: "Added to Space" }, settings: { @@ -6932,12 +6915,21 @@ var T4 = class { sectionFlow: "Flow Editor", spaces: { name: "Spaces", - desc: `The sidebar gives you control over how you organize your files and access to flow view` + desc: `Spaces gives you control over how you organize your files` }, spacesStickers: { name: "Stickers", desc: `Use Emojis to make it easier to find your notes` }, + spacesDeleteOption: { + name: "Delete File Option", + desc: "Select how you want files to be deleted" + }, + spacesDeleteOptions: { + permanant: "Delete Permanently", + trash: "Move to Obsidian Trash", + "system-trash": "Move to System Trash" + }, sidebarRibbon: { name: "Show Ribbon Bar", desc: `Show/hide Obsidian ribbon bar` @@ -6947,8 +6939,8 @@ var T4 = class { desc: `Show/hide other sidebar tabs` }, spacesPerformance: { - name: "Performance Mode", - desc: `Turn on performance mode, may affect scrolling appearance. Requires Restart` + name: "Spaces Performance Mode", + desc: `Turn on performance mode for Spaces, may affect scrolling appearance. Requires Restart` }, inlineStyler: { name: "Inline Styler", @@ -6999,7 +6991,7 @@ var T4 = class { }; var i18n_default = new T4().texts; -// src/modals.ts +// src/components/Spaces/modals.ts var VaultChangeModal = class extends import_obsidian.Modal { constructor(plugin, file, action, section) { super(plugin.app); @@ -7040,7 +7032,7 @@ var VaultChangeModal = class extends import_obsidian.Modal { changeButtonText = i18n_default.buttons.createNote; } const changeButton = contentEl.createEl("button", { text: changeButtonText }); - const cancelButton = contentEl.createEl("button", { text: "Cancel" }); + const cancelButton = contentEl.createEl("button", { text: i18n_default.buttons.cancel }); cancelButton.style.cssText = "float: right;"; cancelButton.addEventListener("click", () => { myModal.close(); @@ -7059,11 +7051,11 @@ var VaultChangeModal = class extends import_obsidian.Modal { const path = this.file.path + "/" + newName; this.app.vault.createFolder(path); if (this.section >= 0) - updateSections(this.plugin.settings.spaces.map((s10, k4) => { + updateSections(this.plugin.settings.spaces.map((s3, k4) => { return k4 == this.section ? { - ...s10, - children: [newName, ...s10.children] - } : s10; + ...s3, + children: [newName, ...s3.children] + } : s3; })); } else if (this.action === "create note") { await createNewMarkdownFile(this.plugin.app, this.file, newName, ""); @@ -7071,8 +7063,8 @@ var VaultChangeModal = class extends import_obsidian.Modal { myModal.close(); }; changeButton.addEventListener("click", onClickAction); - inputEl.addEventListener("keydown", (e5) => { - if (e5.key === "Enter") + inputEl.addEventListener("keydown", (e3) => { + if (e3.key === "Enter") onClickAction(); }); } @@ -7157,11 +7149,11 @@ var SectionChangeModal = class extends import_obsidian.Modal { const onClickAction = async () => { let newName = inputEl.value; if (this.action === "rename") { - updateSections(this.plugin.settings.spaces.map((s10, i5) => { - return i5 == this.sectionIndex ? { - ...s10, + updateSections(this.plugin.settings.spaces.map((s3, i3) => { + return i3 == this.sectionIndex ? { + ...s3, section: newName - } : s10; + } : s3; })); } else if (this.action === "create") { updateSections([{ section: newName, children: [], collapsed: false }, ...this.plugin.settings.spaces]); @@ -7169,8 +7161,8 @@ var SectionChangeModal = class extends import_obsidian.Modal { myModal.close(); }; changeButton.addEventListener("click", onClickAction); - inputEl.addEventListener("keydown", (e5) => { - if (e5.key === "Enter") + inputEl.addEventListener("keydown", (e3) => { + if (e3.key === "Enter") onClickAction(); }); } @@ -7191,11 +7183,11 @@ var import_view = require("@codemirror/view"); var import_language = require("@codemirror/language"); var import_state = require("@codemirror/state"); -// src/flow-editor/FlowEditor.tsx +// src/components/FlowEditor/FlowEditor.tsx var import_obsidian2 = require("obsidian"); function genId(size2) { const chars = []; - for (let n4 = 0; n4 < size2; n4++) + for (let n2 = 0; n2 < size2; n2++) chars.push((16 * Math.random() | 0).toString(16)); return chars.join(""); } @@ -7272,7 +7264,7 @@ var FlowEditor = class extends nosuper(import_obsidian2.HoverPopover) { } static popoversForWindow(win) { var _a2, _b2; - return Array.prototype.slice.call((_b2 = (_a2 = win == null ? void 0 : win.document) == null ? void 0 : _a2.body.querySelectorAll(".mk-hover-popover")) != null ? _b2 : []).map((el) => popovers.get(el)).filter((he2) => he2); + return Array.prototype.slice.call((_b2 = (_a2 = win == null ? void 0 : win.document) == null ? void 0 : _a2.body.querySelectorAll(".mk-hover-popover")) != null ? _b2 : []).map((el) => popovers.get(el)).filter((he) => he); } static forLeaf(leaf) { const el = leaf && document.body.matchParent.call(leaf.containerEl, ".mk-hover-popover"); @@ -7455,8 +7447,8 @@ var FlowEditor = class extends nosuper(import_obsidian2.HoverPopover) { this.opening = true; try { await leaf.openFile(file, openState); - } catch (e5) { - console.error(e5); + } catch (e3) { + console.error(e3); } finally { this.opening = false; if (this.detaching) @@ -7596,7 +7588,7 @@ var calloutBlock = (range, text, id) => import_view.Decoration.widget({ var import_view3 = require("@codemirror/view"); var import_state3 = require("@codemirror/state"); -// src/utils/cm-utils.ts +// src/utils/codemirror.ts var import_language2 = require("@codemirror/language"); var getActiveCM = () => { let rcm; @@ -7638,10 +7630,10 @@ var import_state2 = require("@codemirror/state"); var ios = typeof navigator != "undefined" && !/Edge\/(\d+)/.exec(navigator.userAgent) && /Apple Computer/.test(navigator.vendor) && (/Mobile\/\w+/.test(navigator.userAgent) || navigator.maxTouchPoints > 2); var Outside = "-10000px"; var TooltipViewManager = class { - constructor(view2, facet, createTooltipView) { + constructor(view, facet, createTooltipView) { this.facet = facet; this.createTooltipView = createTooltipView; - this.input = view2.state.facet(facet); + this.input = view.state.facet(facet); this.tooltips = this.input.filter((t3) => t3); this.tooltipViews = this.tooltips.map(createTooltipView); } @@ -7655,19 +7647,19 @@ var TooltipViewManager = class { return false; } let tooltipViews = []; - for (let i5 = 0; i5 < tooltips3.length; i5++) { - let tip = tooltips3[i5], known = -1; + for (let i3 = 0; i3 < tooltips3.length; i3++) { + let tip = tooltips3[i3], known = -1; if (!tip) continue; - for (let i6 = 0; i6 < this.tooltips.length; i6++) { - let other = this.tooltips[i6]; + for (let i4 = 0; i4 < this.tooltips.length; i4++) { + let other = this.tooltips[i4]; if (other && other.create == tip.create) - known = i6; + known = i4; } if (known < 0) { - tooltipViews[i5] = this.createTooltipView(tip); + tooltipViews[i3] = this.createTooltipView(tip); } else { - let tooltipView = tooltipViews[i5] = this.tooltipViews[known]; + let tooltipView = tooltipViews[i3] = this.tooltipViews[known]; if (tooltipView.update) tooltipView.update(update); } @@ -7698,25 +7690,25 @@ var tooltipConfig = import_state2.Facet.define({ } }); var tooltipPlugin = import_view2.ViewPlugin.fromClass(class { - constructor(view2) { - this.view = view2; + constructor(view) { + this.view = view; this.inView = true; this.lastTransaction = 0; this.measureTimeout = -1; var _a2; - let config = view2.state.facet(tooltipConfig); + let config = view.state.facet(tooltipConfig); this.position = config.position; this.parent = config.parent; - this.classes = view2.themeClasses; + this.classes = view.themeClasses; this.createContainer(); this.measureReq = { read: this.readMeasure.bind(this), write: this.writeMeasure.bind(this), key: this }; - this.manager = new TooltipViewManager(view2, showTooltip, (t3) => this.createTooltip(t3)); + this.manager = new TooltipViewManager(view, showTooltip, (t3) => this.createTooltip(t3)); this.intersectionObserver = typeof IntersectionObserver == "function" ? new IntersectionObserver((entries) => { if (Date.now() > this.lastTransaction - 50 && entries.length > 0 && entries[entries.length - 1].intersectionRatio < 1) this.measureSoon(); }, { threshold: [1] }) : null; this.observeIntersection(); - (_a2 = view2.dom.ownerDocument.defaultView) == null ? void 0 : _a2.addEventListener("resize", this.measureSoon = this.measureSoon.bind(this)); + (_a2 = view.dom.ownerDocument.defaultView) == null ? void 0 : _a2.addEventListener("resize", this.measureSoon = this.measureSoon.bind(this)); this.maybeMeasure(); } createContainer() { @@ -7799,8 +7791,8 @@ var tooltipPlugin = import_view2.ViewPlugin.fromClass(class { return { editor, parent: this.parent ? this.container.getBoundingClientRect() : editor, - pos: this.manager.tooltips.map((t3, i5) => { - let tv = this.manager.tooltipViews[i5]; + pos: this.manager.tooltips.map((t3, i3) => { + let tv = this.manager.tooltipViews[i3]; return tv.getCoords ? tv.getCoords(t3.pos) : this.view.coordsAtPos(t3.pos); }), size: this.manager.tooltipViews.map(({ dom }) => dom.getBoundingClientRect()), @@ -7810,9 +7802,9 @@ var tooltipPlugin = import_view2.ViewPlugin.fromClass(class { writeMeasure(measured) { let { editor, space } = measured; let others = []; - for (let i5 = 0; i5 < this.manager.tooltips.length; i5++) { - let tooltip = this.manager.tooltips[i5], tView = this.manager.tooltipViews[i5], { dom } = tView; - let pos = measured.pos[i5], size2 = measured.size[i5]; + for (let i3 = 0; i3 < this.manager.tooltips.length; i3++) { + let tooltip = this.manager.tooltips[i3], tView = this.manager.tooltipViews[i3], { dom } = tView; + let pos = measured.pos[i3], size2 = measured.size[i3]; if (!pos || pos.bottom <= Math.max(editor.top, space.top) || pos.top >= Math.min(editor.bottom, space.bottom) || pos.right < Math.max(editor.left, space.left) - 0.1 || pos.left > Math.min(editor.right, space.right) + 0.1) { dom.style.top = Outside; continue; @@ -7828,9 +7820,9 @@ var tooltipPlugin = import_view2.ViewPlugin.fromClass(class { let top2 = above ? pos.top - height - arrowHeight - offset2.y : pos.bottom + arrowHeight + offset2.y; let right2 = left2 + width; if (tView.overlap !== true) { - for (let r6 of others) - if (r6.left < right2 && r6.right > left2 && r6.top < top2 + height && r6.bottom > top2) - top2 = above ? r6.top - height - 2 - arrowHeight : r6.bottom + arrowHeight + 2; + for (let r3 of others) + if (r3.left < right2 && r3.right > left2 && r3.top < top2 + height && r3.bottom > top2) + top2 = above ? r3.top - height - 2 - arrowHeight : r3.bottom + arrowHeight + 2; } if (this.position == "absolute") { dom.style.top = top2 - measured.parent.top + "px"; @@ -7935,15 +7927,15 @@ var showTooltip = import_state2.Facet.define({ }); var showHoverTooltip = import_state2.Facet.define(); var HoverTooltipHost = class { - constructor(view2) { - this.view = view2; + constructor(view) { + this.view = view; this.mounted = false; this.dom = document.createElement("div"); this.dom.classList.add("cm-tooltip-hover"); - this.manager = new TooltipViewManager(view2, showHoverTooltip, (t3) => this.createHostedView(t3)); + this.manager = new TooltipViewManager(view, showHoverTooltip, (t3) => this.createHostedView(t3)); } - static create(view2) { - return new HoverTooltipHost(view2); + static create(view) { + return new HoverTooltipHost(view); } createHostedView(tooltip) { let hostedView = tooltip.create(this.view); @@ -7953,10 +7945,10 @@ var HoverTooltipHost = class { hostedView.mount(this.view); return hostedView; } - mount(view2) { + mount(view) { for (let hostedView of this.manager.tooltipViews) { if (hostedView.mount) - hostedView.mount(view2); + hostedView.mount(view); } this.mounted = true; } @@ -7983,8 +7975,8 @@ var showHoverTooltipHost = showTooltip.compute([showHoverTooltip], (state) => { }; }); var HoverPlugin = class { - constructor(view2, source, field, setHover, hoverTime) { - this.view = view2; + constructor(view, source, field, setHover, hoverTime) { + this.view = view; this.source = source; this.field = field; this.setHover = setHover; @@ -7992,10 +7984,10 @@ var HoverPlugin = class { this.hoverTimeout = -1; this.restartTimeout = -1; this.pending = null; - this.lastMove = { x: 0, y: 0, target: view2.dom, time: 0 }; + this.lastMove = { x: 0, y: 0, target: view.dom, time: 0 }; this.checkHover = this.checkHover.bind(this); - view2.dom.addEventListener("mouseleave", this.mouseleave = this.mouseleave.bind(this)); - view2.dom.addEventListener("mousemove", this.mousemove = this.mousemove.bind(this)); + view.dom.addEventListener("mouseleave", this.mouseleave = this.mouseleave.bind(this)); + view.dom.addEventListener("mousemove", this.mousemove = this.mousemove.bind(this)); } update() { if (this.pending) { @@ -8026,7 +8018,7 @@ var HoverPlugin = class { let posCoords = this.view.coordsAtPos(pos); if (posCoords == null || lastMove.y < posCoords.top || lastMove.y > posCoords.bottom || lastMove.x < posCoords.left - this.view.defaultCharacterWidth || lastMove.x > posCoords.right + this.view.defaultCharacterWidth) return; - let bidi = this.view.bidiSpans(this.view.state.doc.lineAt(pos)).find((s10) => s10.from <= pos && s10.to >= pos); + let bidi = this.view.bidiSpans(this.view.state.doc.lineAt(pos)).find((s3) => s3.from <= pos && s3.to >= pos); let rtl = bidi && bidi.dir == import_view2.Direction.RTL ? -1 : 1; let open = this.source(this.view, pos, lastMove.x < posCoords.left ? -rtl : rtl); if (open == null ? void 0 : open.then) { @@ -8037,7 +8029,7 @@ var HoverPlugin = class { if (result) this.view.dispatch({ effects: this.setHover.of(result) }); } - }, (e5) => (0, import_view2.logException)(this.view.state, e5, "hover tooltip")); + }, (e3) => (0, import_view2.logException)(this.view.state, e3, "hover tooltip")); } else if (open) { this.view.dispatch({ effects: this.setHover.of(open) }); } @@ -8056,10 +8048,10 @@ var HoverPlugin = class { } } } - mouseleave(e5) { + mouseleave(e3) { clearTimeout(this.hoverTimeout); this.hoverTimeout = -1; - if (this.active && !isInTooltip(e5.relatedTarget)) + if (this.active && !isInTooltip(e3.relatedTarget)) this.view.dispatch({ effects: this.setHover.of(null) }); } destroy() { @@ -8074,16 +8066,16 @@ function isInTooltip(elt) { return true; return false; } -function isOverRange(view2, from, to, x4, y4, margin) { +function isOverRange(view, from, to, x4, y3, margin) { let range = document.createRange(); - let fromDOM = view2.domAtPos(from), toDOM = view2.domAtPos(to); + let fromDOM = view.domAtPos(from), toDOM = view.domAtPos(to); range.setEnd(toDOM.node, toDOM.offset); range.setStart(fromDOM.node, fromDOM.offset); let rects = range.getClientRects(); range.detach(); - for (let i5 = 0; i5 < rects.length; i5++) { - let rect = rects[i5]; - let dist = Math.max(rect.top - y4, y4 - rect.bottom, rect.left - x4, x4 - rect.right); + for (let i3 = 0; i3 < rects.length; i3++) { + let rect = rects[i3]; + let dist = Math.max(rect.top - y3, y3 - rect.bottom, rect.left - x4, x4 - rect.right); if (dist <= margin) return true; } @@ -8121,7 +8113,7 @@ function hoverTooltip(source, options = {}) { }); return [ hoverState, - import_view2.ViewPlugin.define((view2) => new HoverPlugin(view2, source, hoverState, setHover, options.hoverTime || 300 /* Time */)), + import_view2.ViewPlugin.define((view) => new HoverPlugin(view, source, hoverState, setHover, options.hoverTime || 300 /* Time */)), showHoverTooltipHost ]; } @@ -8146,39 +8138,205 @@ var openFileFlowEditor = (file, source) => { window.dispatchEvent(evt); }; -// src/flow-editor/FlowEditorHover.tsx +// src/utils/icons.ts +var uiIconSet = { + "mk-ui-close": ` + + `, + "mk-ui-flow-hover": ` + + `, + "mk-ui-folder": ` + + `, + "mk-ui-open-link": ` + + `, + "mk-ui-file": ` + +`, + "mk-ui-expand": ` + +`, + "mk-ui-new-folder": ``, + "mk-ui-new-note": ``, + "mk-ui-collapse": ` + +`, + "mk-ui-options": ` + +`, + "mk-ui-plus": ` + +`, + "mk-ui-collapse-sm": ` + +` +}; +var makeIconSet = { + "mk-make-todo": ` + + + + `, + "mk-make-list": ` + + + + + + + + `, + "mk-make-ordered": ` + + + + + + + + `, + "mk-make-h1": ` + + + + `, + "mk-make-h2": ` + + + + `, + "mk-make-h3": ` + + + + `, + "mk-make-quote": ` + + + + + + `, + "mk-make-hr": ` + + + `, + "mk-make-link": ` + + + `, + "mk-make-image": ` + + + + + + `, + "mk-make-codeblock": ` + + + + + `, + "mk-make-callout": ` + + + + `, + "mk-make-note": ` + + + + + + `, + "mk-make-flow": ` + + + `, + "mk-make-tag": ` + + + ` +}; +var mkLogo = ` + + +`; +var markIconSet = { + "mk-mark-strong": ` + + + `, + "mk-mark-em": ` + + `, + "mk-mark-strikethrough": ` + + + + `, + "mk-mark-code": ` + + + + + `, + "mk-mark-link": ` + + `, + "mk-mark-blocklink": ` + + + + + `, + "mk-mark-highlight": ` + + + + + + `, + "mk-make-attach": ` + + + + + `, + "mk-make-keyboard": ` + + + +`, + "mk-make-slash": ` + + + +`, + "mk-make-style": ` + +`, + "mk-mark-color": ` + + +` +}; + +// src/components/FlowEditor/FlowEditorHover.tsx var FlowEditorHover = (props) => { return /* @__PURE__ */ bn.createElement(bn.Fragment, null, props.toggle && /* @__PURE__ */ bn.createElement("div", { - "aria-label": "Toggle Flow", + "aria-label": i18n_default.buttons.toggleFlow, onClick: props.toggleFlow, - className: props.toggleState ? "mk-toggle-on" : "" - }, /* @__PURE__ */ bn.createElement("svg", { - width: "16", - height: "16", - viewBox: "0 0 16 16", - fill: "none", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ bn.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M10.7941 11.6917C11.4281 11.809 12.0857 11.7486 12.6856 11.5163C13.2858 11.2838 13.8068 10.8873 14.1773 10.3692C14.5483 9.85038 14.75 9.23465 14.75 8.6C14.75 7.96535 14.5483 7.34962 14.1773 6.83081C13.8068 6.31273 13.2858 5.91619 12.6856 5.68372C12.0857 5.45136 11.4281 5.39096 10.7941 5.50834C10.1599 5.62575 9.57072 5.91716 9.10335 6.35289C9.09233 6.36317 9.08162 6.37378 9.07124 6.3847L5.85862 9.76393C5.60897 9.99123 5.28818 10.1509 4.93287 10.2167C4.5702 10.2839 4.19486 10.2487 3.85619 10.1175C3.51778 9.98646 3.23669 9.76777 3.04283 9.49668C2.84949 9.22631 2.75 8.91434 2.75 8.6C2.75 8.28566 2.84949 7.97369 3.04283 7.70332C3.23669 7.43223 3.51778 7.21354 3.85619 7.08246C4.19486 6.95128 4.5702 6.91614 4.93287 6.98328C5.29024 7.04944 5.61268 7.21063 5.86295 7.44003L6.559 8.14747L7.62823 7.09545L6.91982 6.37545C6.91226 6.36777 6.90453 6.36025 6.89665 6.35289C6.42928 5.91716 5.8401 5.62575 5.20593 5.50834C4.57189 5.39096 3.91432 5.45136 3.31441 5.68372C2.71423 5.91619 2.19318 6.31273 1.8227 6.83081C1.4517 7.34962 1.25 7.96535 1.25 8.6C1.25 9.23465 1.4517 9.85038 1.8227 10.3692C2.19318 10.8873 2.71423 11.2838 3.31441 11.5163C3.91432 11.7486 4.57189 11.809 5.20593 11.6917C5.8401 11.5742 6.42928 11.2828 6.89665 10.8471C6.90767 10.8368 6.91838 10.8262 6.92876 10.8153L10.1414 7.43607C10.391 7.20877 10.7118 7.04906 11.0671 6.98328C11.4298 6.91614 11.8051 6.95128 12.1438 7.08246C12.4822 7.21354 12.7633 7.43223 12.9572 7.70332C13.1505 7.97369 13.25 8.28566 13.25 8.6C13.25 8.91434 13.1505 9.22631 12.9572 9.49668C12.7633 9.76777 12.4822 9.98646 12.1438 10.1175C11.8051 10.2487 11.4298 10.2839 11.0671 10.2167C10.7098 10.1506 10.3873 9.98938 10.1371 9.75998L9.441 9.05253L8.37177 10.1045L9.08018 10.8245C9.08774 10.8322 9.09547 10.8398 9.10335 10.8471C9.57072 11.2828 10.1599 11.5742 10.7941 11.6917Z", - fill: "currentColor" - }))), /* @__PURE__ */ bn.createElement("div", { - "aria-label": "Open Link", - onClick: props.openLink - }, /* @__PURE__ */ bn.createElement("svg", { - width: "16", - height: "16", - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 1.5, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244" - })))); + className: props.toggleState ? "mk-toggle-on" : "", + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-flow-hover"] } + }), /* @__PURE__ */ bn.createElement("div", { + "aria-label": i18n_default.buttons.openLink, + onClick: props.openLink, + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-open-link"] } + })); }; // src/cm-extensions/flowEditor/flowEditor.tsx @@ -8202,35 +8360,33 @@ var preloadFlowEditor = import_state3.EditorState.transactionFilter.of((tr) => { } return [tr, ...newTrans]; }); -var internalLinkHover = hoverTooltip((view2, pos, side) => { - let { from: lineFrom, to: lineTo, text } = view2.state.doc.lineAt(pos); +var internalLinkHover = hoverTooltip((view, pos, side) => { + let { from: lineFrom, to: lineTo, text } = view.state.doc.lineAt(pos); let hovObject = null; - iterateTreeInSelection({ from: lineFrom, to: lineTo }, view2.state, { + iterateTreeInSelection({ from: lineFrom, to: lineTo }, view.state, { enter: ({ name, from, to }) => { if (name.contains("hmd-internal-link") && pos <= to && pos >= from) { - const stateField = view2.state.field(flowEditorInfo, false); + const stateField = view.state.field(flowEditorInfo, false); const info = stateField.find((f4) => f4.to == to); if (info) { hovObject = { pos: pos - 5, end: to, above: true, - create(view3) { + create(view2) { let dom = document.createElement("div"); dom.toggleClass("mk-flow-hover", true); dom.toggleClass("menu", true); const openHoverDiv = dom.createDiv(); - openHoverDiv.setAttribute("aria-label", info.expandedState == 0 ? "Open Flow" : "Hide Flow"); + openHoverDiv.setAttribute("aria-label", info.expandedState == 0 ? i18n_default.buttons.openFlow : i18n_default.buttons.hideFlow); openHoverDiv.addEventListener("click", () => { - view3.dispatch({ + view2.dispatch({ annotations: toggleFlowEditor.of([info.id, 2]) }); }); const icon = openHoverDiv.createDiv(); - icon.innerHTML = ` - - `; - openHoverDiv.insertAdjacentText("beforeend", info.expandedState == 0 ? "Open Flow" : "Hide Flow"); + icon.innerHTML = uiIconSet["mk-ui-flow-hover"]; + openHoverDiv.insertAdjacentText("beforeend", info.expandedState == 0 ? i18n_default.buttons.openFlow : i18n_default.buttons.hideFlow); return { dom }; } }; @@ -8344,14 +8500,14 @@ var FlowEditorWidget = class extends import_view3.WidgetType { eq(other) { return other.info.id === this.info.id; } - toDOM(view2) { + toDOM(view) { const div = document.createElement("div"); div.toggleClass("mk-floweditor-container", true); div.toggleClass("mk-floweditor-fix", this.info.startOfLineFix); div.setAttribute("id", "mk-flow-" + this.info.id); const placeholder2 = div.createDiv("mk-floweditor-placeholder"); placeholder2.style.setProperty("height", this.info.height + "px"); - loadFlowEditorByDOM(div, view2, this.info.id); + loadFlowEditorByDOM(div, view, this.info.id); return div; } get estimatedHeight() { @@ -8366,7 +8522,7 @@ var FlowEditorSelector = class extends import_view3.WidgetType { eq(other) { return false; } - toDOM(view2) { + toDOM(view) { const div = document.createElement("div"); div.toggleClass("mk-floweditor-selector", true); const reactEl = createRoot(div); @@ -8374,7 +8530,7 @@ var FlowEditorSelector = class extends import_view3.WidgetType { toggle: true, toggleState: true, toggleFlow: () => { - view2.dispatch({ + view.dispatch({ changes: { from: this.info.from - 4, to: this.info.from - 3 } }); }, @@ -8382,7 +8538,7 @@ var FlowEditorSelector = class extends import_view3.WidgetType { app.workspace.iterateLeaves((leaf) => { var _a2, _b2; const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm; - if (cm && view2.dom == cm.dom) { + if (cm && view.dom == cm.dom) { openFileFlowEditor(this.info.link, (_b2 = leaf.view.file) == null ? void 0 : _b2.path); } }, app.workspace["rootSplit"]); @@ -8406,7 +8562,7 @@ var flowEditorWidgetDecoration = (info) => import_view3.Decoration.widget({ block: true }); -// src/utils/flow-editor.ts +// src/utils/flowEditor.ts var import_state6 = require("@codemirror/state"); // src/cm-extensions/flowEditor/selectiveEditor.ts @@ -8527,7 +8683,7 @@ var preventModifyTargetRanges = import_state4.EditorState.transactionFilter.of(( } } } - } catch (e5) { + } catch (e3) { return []; } return [tr, ...newTrans]; @@ -8576,7 +8732,7 @@ var atomicSelect = import_state5.EditorState.transactionFilter.of((tr) => { return tr; }); -// src/utils/flow-editor.ts +// src/utils/flowEditor.ts var parseOutReferences = (ostr) => { const str = ostr.split("|")[0]; const refIndex = str.lastIndexOf("#"); @@ -8601,7 +8757,7 @@ var getLineRangeFromRef = (file, ref, app2) => { if (heading) { const index = headings.findIndex((f4) => f4.heading == heading.heading); const level = (_a2 = headings[index]) == null ? void 0 : _a2.level; - const nextIndex2 = headings.findIndex((f4, i5) => i5 > index && f4.level <= level); + const nextIndex2 = headings.findIndex((f4, i3) => i3 > index && f4.level <= level); if (index < headings.length - 1 && nextIndex2 != -1) { return [heading.position.start.line + 2, headings[nextIndex2].position.end.line]; } @@ -8609,7 +8765,7 @@ var getLineRangeFromRef = (file, ref, app2) => { } return [void 0, void 0]; }; -var loadFlowEditorByDOM = (el, view2, id) => { +var loadFlowEditorByDOM = (el, view, id) => { setTimeout(async () => { let counter = 0; while (!el.parentElement && counter++ <= 50) @@ -8632,7 +8788,7 @@ var loadFlowEditorByDOM = (el, view2, id) => { app.workspace.iterateLeaves((leaf) => { var _a2; const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm; - if (cm && view2.dom == cm.dom) { + if (cm && view.dom == cm.dom) { loadFlowEditorsForLeafForID(cm, leaf, app, id); } }, app.workspace["rootSplit"]); @@ -8663,14 +8819,15 @@ var loadFlowEditor = (cm, flowEditorInfo2, leaf, app2) => { } } else { dom.empty(); - const createDiv = dom.createDiv("mk-new-file"); - const createFile = async (e5) => { - e5.stopPropagation(); - e5.stopImmediatePropagation(); + const createDiv = dom.createDiv("file-embed"); + createDiv.toggleClass("mod-empty", true); + const createFile = async (e3) => { + e3.stopPropagation(); + e3.stopImmediatePropagation(); await app2.fileManager.createNewMarkdownFile(app2.vault.getRoot(), link); loadFlowEditor(cm, flowEditorInfo2, leaf, app2); }; - createDiv.setText(`Create ${link}`); + createDiv.setText(`"${link}" ` + i18n_default.labels.noFile); createDiv.addEventListener("click", createFile); } } @@ -8746,29 +8903,29 @@ var spawnNewPortal = async (plugin, evt) => { let portalFile = plugin.app.vault.getAbstractFileByPath(file); const newLeaf = spawnPortal(plugin, el, !from && portalFile.name); await newLeaf.openFile(portalFile); - const view2 = (_a2 = newLeaf.view.editor) == null ? void 0 : _a2.cm; - view2.dispatch({ + const view = (_a2 = newLeaf.view.editor) == null ? void 0 : _a2.cm; + view.dispatch({ annotations: [portalTypeAnnotation.of(evt.detail.type), flowIDAnnotation.of(evt.detail.id)] }); - view2.dom.addEventListener("keydown", (e5) => { - if (e5.key == "ArrowUp") { - if (e5.metaKey == true) { - view2.dispatch({ + view.dom.addEventListener("keydown", (e3) => { + if (e3.key == "ArrowUp") { + if (e3.metaKey == true) { + view.dispatch({ annotations: arrowKeyAnnotation.of(3) }); } else { - view2.dispatch({ + view.dispatch({ annotations: arrowKeyAnnotation.of(1) }); } } - if (e5.key == "ArrowDown") { - if (e5.metaKey == true) { - view2.dispatch({ + if (e3.key == "ArrowDown") { + if (e3.metaKey == true) { + view.dispatch({ annotations: arrowKeyAnnotation.of(4) }); } else { - view2.dispatch({ + view.dispatch({ annotations: arrowKeyAnnotation.of(2) }); } @@ -8794,6 +8951,7 @@ var spawnPortal = (plugin, initiatingEl, fileName, onShowCallback) => { // src/components/FlowView/FlowRow.tsx import_dayjs.default.extend(require_relativeTime()); var FlowRow = (props) => { + var _a2; const ref = _2(null); const [flowOpen, setFlowOpen] = p2(false); const loadFile = () => { @@ -8817,44 +8975,16 @@ var FlowRow = (props) => { className: "mk-flowspace-container" }, /* @__PURE__ */ bn.createElement("div", { className: "mk-flowspace-title", - onClick: (e5) => openFile({ ...props.item.file, isFolder: item.type == "folder" }, props.plugin.app, false) - }, /* @__PURE__ */ bn.createElement("div", null, item.icon ? unifiedToNative(item.icon[1]) : item.type == "folder" ? /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 2, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" - })) : /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 2, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" - }))), /* @__PURE__ */ bn.createElement("div", null, /* @__PURE__ */ bn.createElement("p", null, item.name), /* @__PURE__ */ bn.createElement("p", { + onClick: (e3) => openFile({ ...props.item.file, isFolder: item.type == "folder" }, props.plugin.app, false) + }, /* @__PURE__ */ bn.createElement("div", { + dangerouslySetInnerHTML: ((_a2 = item.icon) != null ? _a2 : item.type == "folder") ? { __html: uiIconSet["mk-ui-folder"] } : { __html: uiIconSet["mk-ui-file"] } + }, item.icon && unifiedToNative(item.icon[1])), /* @__PURE__ */ bn.createElement("div", null, /* @__PURE__ */ bn.createElement("p", null, item.name), /* @__PURE__ */ bn.createElement("p", { className: "mk-flowspace-date" }, item.created && (0, import_dayjs.default)(item.created).fromNow())), " ", /* @__PURE__ */ bn.createElement("span", null), /* @__PURE__ */ bn.createElement("button", { onClick: toggleFlow, - className: flowOpen ? "mk-open" : "" - }, /* @__PURE__ */ bn.createElement("svg", { - width: "16", - height: "16", - viewBox: "0 0 16 16", - fill: "none", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ bn.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M10.7941 11.6917C11.4281 11.809 12.0857 11.7486 12.6856 11.5163C13.2858 11.2838 13.8068 10.8873 14.1773 10.3692C14.5483 9.85038 14.75 9.23465 14.75 8.6C14.75 7.96535 14.5483 7.34962 14.1773 6.83081C13.8068 6.31273 13.2858 5.91619 12.6856 5.68372C12.0857 5.45136 11.4281 5.39096 10.7941 5.50834C10.1599 5.62575 9.57072 5.91716 9.10335 6.35289C9.09233 6.36317 9.08162 6.37378 9.07124 6.3847L5.85862 9.76393C5.60897 9.99123 5.28818 10.1509 4.93287 10.2167C4.5702 10.2839 4.19486 10.2487 3.85619 10.1175C3.51778 9.98646 3.23669 9.76777 3.04283 9.49668C2.84949 9.22631 2.75 8.91434 2.75 8.6C2.75 8.28566 2.84949 7.97369 3.04283 7.70332C3.23669 7.43223 3.51778 7.21354 3.85619 7.08246C4.19486 6.95128 4.5702 6.91614 4.93287 6.98328C5.29024 7.04944 5.61268 7.21063 5.86295 7.44003L6.559 8.14747L7.62823 7.09545L6.91982 6.37545C6.91226 6.36777 6.90453 6.36025 6.89665 6.35289C6.42928 5.91716 5.8401 5.62575 5.20593 5.50834C4.57189 5.39096 3.91432 5.45136 3.31441 5.68372C2.71423 5.91619 2.19318 6.31273 1.8227 6.83081C1.4517 7.34962 1.25 7.96535 1.25 8.6C1.25 9.23465 1.4517 9.85038 1.8227 10.3692C2.19318 10.8873 2.71423 11.2838 3.31441 11.5163C3.91432 11.7486 4.57189 11.809 5.20593 11.6917C5.8401 11.5742 6.42928 11.2828 6.89665 10.8471C6.90767 10.8368 6.91838 10.8262 6.92876 10.8153L10.1414 7.43607C10.391 7.20877 10.7118 7.04906 11.0671 6.98328C11.4298 6.91614 11.8051 6.95128 12.1438 7.08246C12.4822 7.21354 12.7633 7.43223 12.9572 7.70332C13.1505 7.97369 13.25 8.28566 13.25 8.6C13.25 8.91434 13.1505 9.22631 12.9572 9.49668C12.7633 9.76777 12.4822 9.98646 12.1438 10.1175C11.8051 10.2487 11.4298 10.2839 11.0671 10.2167C10.7098 10.1506 10.3873 9.98938 10.1371 9.75998L9.441 9.05253L8.37177 10.1045L9.08018 10.8245C9.08774 10.8322 9.09547 10.8398 9.10335 10.8471C9.57072 11.2828 10.1599 11.5742 10.7941 11.6917Z", - fill: "currentColor" - })))), /* @__PURE__ */ bn.createElement("div", { + className: flowOpen ? "mk-open" : "", + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-flow-hover"] } + })), /* @__PURE__ */ bn.createElement("div", { className: "mk-flowspace-editor", ref })); @@ -8881,8 +9011,8 @@ var FolderComponent = (props) => { className: "mk-folder-header" }, /* @__PURE__ */ bn.createElement("div", { className: "inline-title" - }, props.folder.name)), filteredNotes.length > 0 ? /* @__PURE__ */ bn.createElement("div", null, filteredNotes.map((f4, i5) => /* @__PURE__ */ bn.createElement(FlowRow, { - key: i5, + }, props.folder.name)), filteredNotes.length > 0 ? /* @__PURE__ */ bn.createElement("div", null, filteredNotes.map((f4, i3) => /* @__PURE__ */ bn.createElement(FlowRow, { + key: i3, item: f4, plugin: props.plugin }))) : /* @__PURE__ */ bn.createElement("div", { @@ -9083,7 +9213,7 @@ var flattenTree = (folder, path, sectionIndex, collapsed) => { function includeChildrenOf(items, ids3) { const excludeParentIds = items.filter((f4) => { var _a2; - return ((_a2 = f4.children) == null ? void 0 : _a2.length) > 0 && !ids3.find((i5) => i5 == f4.id) && f4.id != "/"; + return ((_a2 = f4.children) == null ? void 0 : _a2.length) > 0 && !ids3.find((i3) => i3 == f4.id) && f4.id != "/"; }).map((f4) => f4.id); return items.filter((item) => { var _a2; @@ -9157,8 +9287,8 @@ var reorderStringTree = (savedTrees, rawTrees) => { var mergeStringTree = (savedTree, rawTree) => { const flattenSavedTree = (tree) => { const treeReduce = (t3, currPath) => { - return t3.reduce((p5, c3) => { - return [...p5, { + return t3.reduce((p3, c3) => { + return [...p3, { ...c3, path: currPath + "/" + c3.node }, ...treeReduce(c3.children, currPath + "/" + c3.node)]; @@ -9196,7 +9326,7 @@ var sortFolderTreeUsingStringTree = (folderTree2, stringTree) => { if (currStringTree) return recursiveSort(f4, currStringTree); return f4; - }).sort((a5, b4) => strings.children.findIndex((x4) => x4.node == a5.name) - strings.children.findIndex((x4) => x4.node == b4.name)) + }).sort((a3, b3) => strings.children.findIndex((x4) => x4.node == a3.name) - strings.children.findIndex((x4) => x4.node == b3.name)) }; } else { return file; @@ -9249,12 +9379,12 @@ var platformIsMobile = () => { }; var unifiedToNative = (unified) => { let unicodes = unified.split("-"); - let codePoints = unicodes.map((u6) => `0x${u6}`); + let codePoints = unicodes.map((u3) => `0x${u3}`); return String.fromCodePoint(...codePoints); }; // src/components/Spaces/TreeView/FolderTreeView.tsx -var import_obsidian6 = require("obsidian"); +var import_obsidian7 = require("obsidian"); // node_modules/@dnd-kit/core/node_modules/@dnd-kit/utilities/dist/utilities.esm.js var canUseDOM = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined"; @@ -9424,20 +9554,20 @@ function getEventCoordinates(event) { if (event.touches && event.touches.length) { const { clientX: x4, - clientY: y4 + clientY: y3 } = event.touches[0]; return { x: x4, - y: y4 + y: y3 }; } else if (event.changedTouches && event.changedTouches.length) { const { clientX: x4, - clientY: y4 + clientY: y3 } = event.changedTouches[0]; return { x: x4, - y: y4 + y: y3 }; } } @@ -9457,9 +9587,9 @@ var CSS = /* @__PURE__ */ Object.freeze({ } const { x: x4, - y: y4 + y: y3 } = transform; - return `translate3d(${x4 ? Math.round(x4) : 0}px, ${y4 ? Math.round(y4) : 0}px, 0)`; + return `translate3d(${x4 ? Math.round(x4) : 0}px, ${y3 ? Math.round(y3) : 0}px, 0)`; } }, Scale: { @@ -9745,28 +9875,28 @@ function getRelativeTransformOrigin(event, rect) { function sortCollisionsAsc(_ref, _ref2) { let { data: { - value: a5 + value: a3 } } = _ref; let { data: { - value: b4 + value: b3 } } = _ref2; - return a5 - b4; + return a3 - b3; } function sortCollisionsDesc(_ref3, _ref4) { let { data: { - value: a5 + value: a3 } } = _ref3; let { data: { - value: b4 + value: b3 } } = _ref4; - return b4 - a5; + return b3 - a3; } function getFirstCollision(collisions, property) { if (!collisions || collisions.length === 0) { @@ -9918,15 +10048,15 @@ function inverseTransform(rect, transform, transformOrigin) { y: translateY } = parsedTransform; const x4 = rect.left - translateX - (1 - scaleX) * parseFloat(transformOrigin); - const y4 = rect.top - translateY - (1 - scaleY) * parseFloat(transformOrigin.slice(transformOrigin.indexOf(" ") + 1)); - const w6 = scaleX ? rect.width / scaleX : rect.width; - const h4 = scaleY ? rect.height / scaleY : rect.height; + const y3 = rect.top - translateY - (1 - scaleY) * parseFloat(transformOrigin.slice(transformOrigin.indexOf(" ") + 1)); + const w4 = scaleX ? rect.width / scaleX : rect.width; + const h3 = scaleY ? rect.height / scaleY : rect.height; return { - width: w6, - height: h4, - top: y4, - right: x4 + w6, - bottom: y4 + h4, + width: w4, + height: h3, + top: y3, + right: x4 + w4, + bottom: y3 + h3, left: x4 }; } @@ -11760,13 +11890,13 @@ function useLayoutShiftScrollCompensation(_ref) { const initialized = _2(false); const { x: x4, - y: y4 + y: y3 } = typeof config === "boolean" ? { x: config, y: config } : config; useIsomorphicLayoutEffect(() => { - const disabled = !x4 && !y4; + const disabled = !x4 && !y3; if (disabled || !activeNode) { initialized.current = false; return; @@ -11783,7 +11913,7 @@ function useLayoutShiftScrollCompensation(_ref) { if (!x4) { rectDelta.x = 0; } - if (!y4) { + if (!y3) { rectDelta.y = 0; } initialized.current = true; @@ -11796,7 +11926,7 @@ function useLayoutShiftScrollCompensation(_ref) { }); } } - }, [activeNode, x4, y4, initialRect, measure]); + }, [activeNode, x4, y3, initialRect, measure]); } var ActiveDraggableContext = /* @__PURE__ */ B({ ...defaultCoordinates, @@ -12835,9 +12965,9 @@ var CSS2 = /* @__PURE__ */ Object.freeze({ } const { x: x4, - y: y4 + y: y3 } = transform; - return `translate3d(${x4 ? Math.round(x4) : 0}px, ${y4 ? Math.round(y4) : 0}px, 0)`; + return `translate3d(${x4 ? Math.round(x4) : 0}px, ${y3 ? Math.round(y3) : 0}px, 0)`; } }, Scale: { @@ -12889,15 +13019,15 @@ function getSortedRects(items, rects) { function isValidIndex(index) { return index !== null && index >= 0; } -function itemsEqual(a5, b4) { - if (a5 === b4) { +function itemsEqual(a3, b3) { + if (a3 === b3) { return true; } - if (a5.length !== b4.length) { + if (a3.length !== b3.length) { return false; } - for (let i5 = 0; i5 < a5.length; i5++) { - if (a5[i5] !== b4[i5]) { + for (let i3 = 0; i3 < a3.length; i3++) { + if (a3[i3] !== b3[i3]) { return false; } } @@ -13339,8 +13469,8 @@ var directions = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, Keyboa var import_classnames2 = __toESM(require_classnames()); // src/hooks/useLongPress.tsx -function isMouseEvent(e5) { - return e5 && "screenX" in e5; +function isMouseEvent(e3) { + return e3 && "screenX" in e3; } // src/components/Spaces/TreeView/SectionView.tsx @@ -13366,8 +13496,8 @@ var SectionItem = k3(({ }, ref) => { const [sections2, setSections] = Recoil_index_14(sections); const [focusedFolder2, setFocusedFolder] = Recoil_index_14(focusedFolder); - const section = sections2.find((s10, i5) => { - return i5 == data.section; + const section = sections2.find((s3, i3) => { + return i3 == data.section; }); const newFolderInSection = () => { let vaultChangeModal = new VaultChangeModal(plugin, focusedFolder2, "create folder", data.section); @@ -13376,8 +13506,8 @@ var SectionItem = k3(({ const newFileInSection = async () => { const newFile = await createNewMarkdownFile(plugin.app, focusedFolder2, ""); if (data.section != -1) - updateSections(sections2.map((f4, i5) => { - return i5 == data.section ? { + updateSections(sections2.map((f4, i3) => { + return i3 == data.section ? { ...f4, children: [newFile.path, ...f4.children] } : f4; @@ -13387,10 +13517,10 @@ var SectionItem = k3(({ plugin.settings.spaces = sections3; plugin.saveSettings(); }; - const triggerMenu = (e5) => { - data.section == -1 ? triggerVaultMenu(e5) : triggerSectionMenu(data.name, data.index, e5); + const triggerMenu = (e3) => { + data.section == -1 ? triggerVaultMenu(e3) : triggerSectionMenu(data.name, data.index, e3); }; - const triggerSectionMenu = (section2, index, e5) => { + const triggerSectionMenu = (section2, index, e3) => { const fileMenu = new import_obsidian5.Menu(); fileMenu.addItem((menuItem) => { menuItem.setTitle(i18n_default.menu.edit); @@ -13404,19 +13534,19 @@ var SectionItem = k3(({ menuItem.setTitle(i18n_default.menu.delete); menuItem.setIcon("trash"); menuItem.onClick((ev) => { - updateSections(sections2.filter((s10, i5) => { - return i5 != index; + updateSections(sections2.filter((s3, i3) => { + return i3 != index; })); }); }); - if (isMouseEvent(e5)) { - fileMenu.showAtPosition({ x: e5.pageX, y: e5.pageY }); + if (isMouseEvent(e3)) { + fileMenu.showAtPosition({ x: e3.pageX, y: e3.pageY }); } else { - fileMenu.showAtPosition({ x: e5.nativeEvent.locationX, y: e5.nativeEvent.locationY }); + fileMenu.showAtPosition({ x: e3.nativeEvent.locationX, y: e3.nativeEvent.locationY }); } return false; }; - const triggerVaultMenu = (e5) => { + const triggerVaultMenu = (e3) => { const fileMenu = new import_obsidian5.Menu(); fileMenu.addItem((menuItem) => { menuItem.setTitle(i18n_default.menu.newSpace); @@ -13425,10 +13555,10 @@ var SectionItem = k3(({ let vaultChangeModal = new SectionChangeModal(plugin, "", 0, "create"); vaultChangeModal.open(); }); - if (isMouseEvent(e5)) { - fileMenu.showAtPosition({ x: e5.pageX, y: e5.pageY }); + if (isMouseEvent(e3)) { + fileMenu.showAtPosition({ x: e3.pageX, y: e3.pageY }); } else { - fileMenu.showAtPosition({ x: e5.nativeEvent.locationX, y: e5.nativeEvent.locationY }); + fileMenu.showAtPosition({ x: e3.nativeEvent.locationX, y: e3.nativeEvent.locationY }); } return false; }); @@ -13444,70 +13574,30 @@ var SectionItem = k3(({ className: (0, import_classnames.default)("mk-section", indicator ? indicator.state == 2 /* Bottom */ ? "mk-indicator-bottom" : indicator.state == 1 /* Top */ ? "mk-indicator-top" : indicator.state == 3 /* Row */ ? "mk-indicator-row" : "" : "") }, /* @__PURE__ */ bn.createElement("div", { className: "mk-section-title", - onContextMenu: (e5) => triggerMenu(e5), - onClick: (e5) => onCollapse(data), + onContextMenu: (e3) => triggerMenu(e3), + onClick: (e3) => onCollapse(data), ref, ...handleProps }, /* @__PURE__ */ bn.createElement("div", { className: "mk-tree-text" }, data.id == "/" ? plugin.app.vault.getName() : data.name), /* @__PURE__ */ bn.createElement("div", { - className: `mk-collapse ${collapsed ? "mk-collapsed" : ""}` - }, /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - viewBox: "0 0 20 20", - fill: "currentColor", - className: "w-5 h-5" - }, /* @__PURE__ */ bn.createElement("path", { - d: "M6.3 2.841A1.5 1.5 0 004 4.11V15.89a1.5 1.5 0 002.3 1.269l9.344-5.89a1.5 1.5 0 000-2.538L6.3 2.84z" - })))), /* @__PURE__ */ bn.createElement("div", { + className: `mk-collapse ${collapsed ? "mk-collapsed" : ""}`, + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-collapse-sm"] } + })), /* @__PURE__ */ bn.createElement("div", { className: "mk-folder-buttons" }, /* @__PURE__ */ bn.createElement("button", { "aria-label": i18n_default.buttons.createFolder, onClick: () => { newFolderInSection(); - } - }, /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - width: "24", - height: "24", - viewBox: "0 0 24 24", - fill: "none", - stroke: "currentColor", - strokeWidth: "2", - strokeLinecap: "round", - strokeLinejoin: "round" - }, /* @__PURE__ */ bn.createElement("path", { - d: "M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z" - }), /* @__PURE__ */ bn.createElement("line", { - x1: "12", - y1: "10", - x2: "12", - y2: "16" - }), /* @__PURE__ */ bn.createElement("line", { - x1: "9", - y1: "13", - x2: "15", - y2: "13" - }))), /* @__PURE__ */ bn.createElement("button", { + }, + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-new-folder"] } + }), /* @__PURE__ */ bn.createElement("button", { "aria-label": i18n_default.buttons.newNote, onClick: () => { newFileInSection(); - } - }, /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - width: "24", - height: "24", - viewBox: "0 0 24 24", - fill: "none", - stroke: "currentColor", - strokeWidth: "2", - strokeLinecap: "round", - strokeLinejoin: "round" - }, /* @__PURE__ */ bn.createElement("path", { - d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" - }), /* @__PURE__ */ bn.createElement("path", { - d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" - })))))), section && !collapsed && section.children.length == 0 && /* @__PURE__ */ bn.createElement("div", { + }, + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-new-note"] } + })))), section && !collapsed && section.children.length == 0 && /* @__PURE__ */ bn.createElement("div", { className: "mk-tree-empty", style: { "--spacing": `${indentationWidth}px` @@ -13516,643 +13606,34 @@ var SectionItem = k3(({ }); SectionItem.displayName = "SectionItem"; -// node_modules/@headlessui/react/dist/utils/ssr.js -var e3 = typeof window == "undefined" || typeof document == "undefined"; - -// node_modules/@headlessui/react/dist/hooks/use-iso-morphic-effect.js -var s3 = e3 ? h2 : s2; - -// node_modules/@headlessui/react/dist/hooks/use-latest-value.js -function s4(e5) { - let r6 = _2(e5); - return s3(() => { - r6.current = e5; - }, [e5]), r6; -} - -// node_modules/@headlessui/react/dist/hooks/use-event.js -var o3 = function(t3) { - let e5 = s4(t3); - return bn.useCallback((...r6) => e5.current(...r6), [e5]); -}; - -// node_modules/@headlessui/react/dist/hooks/use-server-handoff-complete.js -var r3 = { serverHandoffComplete: false }; -function a3() { - let [e5, f4] = p2(r3.serverHandoffComplete); - return h2(() => { - e5 !== true && f4(true); - }, [e5]), h2(() => { - r3.serverHandoffComplete === false && (r3.serverHandoffComplete = true); - }, []), e5; -} - -// node_modules/@headlessui/react/dist/hooks/use-id.js -var u3; -var l3 = 0; -function r4() { - return ++l3; -} -var I3 = (u3 = bn.useId) != null ? u3 : function() { - let n4 = a3(), [e5, o6] = bn.useState(n4 ? r4 : null); - return s3(() => { - e5 === null && o6(r4()); - }, [e5]), e5 != null ? "" + e5 : void 0; -}; +// src/components/StickerMenu/emojis/default.ts +var emojis = { "smileys_people": [{ "n": ["grinning", "grinning face"], "u": "1f600" }, { "n": ["smiley", "smiling face with open mouth"], "u": "1f603" }, { "n": ["smile", "smiling face with open mouth and smiling eyes"], "u": "1f604" }, { "n": ["grin", "grinning face with smiling eyes"], "u": "1f601" }, { "n": ["laughing", "satisfied", "smiling face with open mouth and tightly-closed eyes"], "u": "1f606" }, { "n": ["sweat smile", "smiling face with open mouth and cold sweat"], "u": "1f605" }, { "n": ["rolling on the floor laughing"], "u": "1f923" }, { "n": ["joy", "face with tears of joy"], "u": "1f602" }, { "n": ["slightly smiling face"], "u": "1f642" }, { "n": ["upside-down face", "upside down face"], "u": "1f643" }, { "n": ["melting face"], "u": "1fae0" }, { "n": ["wink", "winking face"], "u": "1f609" }, { "n": ["blush", "smiling face with smiling eyes"], "u": "1f60a" }, { "n": ["innocent", "smiling face with halo"], "u": "1f607" }, { "n": ["smiling face with 3 hearts", "smiling face with smiling eyes and three hearts"], "u": "1f970" }, { "n": ["heart eyes", "smiling face with heart-shaped eyes"], "u": "1f60d" }, { "n": ["star-struck", "grinning face with star eyes"], "u": "1f929" }, { "n": ["kissing heart", "face throwing a kiss"], "u": "1f618" }, { "n": ["kissing", "kissing face"], "u": "1f617" }, { "n": ["relaxed", "white smiling face"], "u": "263a-fe0f" }, { "n": ["kissing closed eyes", "kissing face with closed eyes"], "u": "1f61a" }, { "n": ["kissing smiling eyes", "kissing face with smiling eyes"], "u": "1f619" }, { "n": ["smiling face with tear"], "u": "1f972" }, { "n": ["yum", "face savouring delicious food"], "u": "1f60b" }, { "n": ["stuck out tongue", "face with stuck-out tongue"], "u": "1f61b" }, { "n": ["stuck out tongue winking eye", "face with stuck-out tongue and winking eye"], "u": "1f61c" }, { "n": ["zany face", "grinning face with one large and one small eye"], "u": "1f92a" }, { "n": ["stuck out tongue closed eyes", "face with stuck-out tongue and tightly-closed eyes"], "u": "1f61d" }, { "n": ["money-mouth face", "money mouth face"], "u": "1f911" }, { "n": ["hugging face"], "u": "1f917" }, { "n": ["face with hand over mouth", "smiling face with smiling eyes and hand covering mouth"], "u": "1f92d" }, { "n": ["face with open eyes and hand over mouth"], "u": "1fae2" }, { "n": ["face with peeking eye"], "u": "1fae3" }, { "n": ["shushing face", "face with finger covering closed lips"], "u": "1f92b" }, { "n": ["thinking face"], "u": "1f914" }, { "n": ["saluting face"], "u": "1fae1" }, { "n": ["zipper-mouth face", "zipper mouth face"], "u": "1f910" }, { "n": ["face with raised eyebrow", "face with one eyebrow raised"], "u": "1f928" }, { "n": ["neutral face"], "u": "1f610" }, { "n": ["expressionless", "expressionless face"], "u": "1f611" }, { "n": ["no mouth", "face without mouth"], "u": "1f636" }, { "n": ["dotted line face"], "u": "1fae5" }, { "n": ["face in clouds"], "u": "1f636-200d-1f32b-fe0f" }, { "n": ["smirk", "smirking face"], "u": "1f60f" }, { "n": ["unamused", "unamused face"], "u": "1f612" }, { "n": ["face with rolling eyes"], "u": "1f644" }, { "n": ["grimacing", "grimacing face"], "u": "1f62c" }, { "n": ["face exhaling"], "u": "1f62e-200d-1f4a8" }, { "n": ["lying face"], "u": "1f925" }, { "n": ["relieved", "relieved face"], "u": "1f60c" }, { "n": ["pensive", "pensive face"], "u": "1f614" }, { "n": ["sleepy", "sleepy face"], "u": "1f62a" }, { "n": ["drooling face"], "u": "1f924" }, { "n": ["sleeping", "sleeping face"], "u": "1f634" }, { "n": ["mask", "face with medical mask"], "u": "1f637" }, { "n": ["face with thermometer"], "u": "1f912" }, { "n": ["face with head-bandage", "face with head bandage"], "u": "1f915" }, { "n": ["nauseated face"], "u": "1f922" }, { "n": ["face vomiting", "face with open mouth vomiting"], "u": "1f92e" }, { "n": ["sneezing face"], "u": "1f927" }, { "n": ["hot face", "overheated face"], "u": "1f975" }, { "n": ["cold face", "freezing face"], "u": "1f976" }, { "n": ["woozy face", "face with uneven eyes and wavy mouth"], "u": "1f974" }, { "n": ["dizzy face"], "u": "1f635" }, { "n": ["face with spiral eyes"], "u": "1f635-200d-1f4ab" }, { "n": ["exploding head", "shocked face with exploding head"], "u": "1f92f" }, { "n": ["face with cowboy hat"], "u": "1f920" }, { "n": ["partying face", "face with party horn and party hat"], "u": "1f973" }, { "n": ["disguised face"], "u": "1f978" }, { "n": ["sunglasses", "smiling face with sunglasses"], "u": "1f60e" }, { "n": ["nerd face"], "u": "1f913" }, { "n": ["face with monocle"], "u": "1f9d0" }, { "n": ["confused", "confused face"], "u": "1f615" }, { "n": ["face with diagonal mouth"], "u": "1fae4" }, { "n": ["worried", "worried face"], "u": "1f61f" }, { "n": ["slightly frowning face"], "u": "1f641" }, { "n": ["frowning face", "white frowning face"], "u": "2639-fe0f" }, { "n": ["open mouth", "face with open mouth"], "u": "1f62e" }, { "n": ["hushed", "hushed face"], "u": "1f62f" }, { "n": ["astonished", "astonished face"], "u": "1f632" }, { "n": ["flushed", "flushed face"], "u": "1f633" }, { "n": ["pleading face", "face with pleading eyes"], "u": "1f97a" }, { "n": ["face holding back tears"], "u": "1f979" }, { "n": ["frowning", "frowning face with open mouth"], "u": "1f626" }, { "n": ["anguished", "anguished face"], "u": "1f627" }, { "n": ["fearful", "fearful face"], "u": "1f628" }, { "n": ["cold sweat", "face with open mouth and cold sweat"], "u": "1f630" }, { "n": ["disappointed relieved", "disappointed but relieved face"], "u": "1f625" }, { "n": ["cry", "crying face"], "u": "1f622" }, { "n": ["sob", "loudly crying face"], "u": "1f62d" }, { "n": ["scream", "face screaming in fear"], "u": "1f631" }, { "n": ["confounded", "confounded face"], "u": "1f616" }, { "n": ["persevere", "persevering face"], "u": "1f623" }, { "n": ["disappointed", "disappointed face"], "u": "1f61e" }, { "n": ["sweat", "face with cold sweat"], "u": "1f613" }, { "n": ["weary", "weary face"], "u": "1f629" }, { "n": ["tired face"], "u": "1f62b" }, { "n": ["yawning face"], "u": "1f971" }, { "n": ["triumph", "face with look of triumph"], "u": "1f624" }, { "n": ["rage", "pouting face"], "u": "1f621" }, { "n": ["angry", "angry face"], "u": "1f620" }, { "n": ["face with symbols on mouth", "serious face with symbols covering mouth"], "u": "1f92c" }, { "n": ["smiling imp", "smiling face with horns"], "u": "1f608" }, { "n": ["imp"], "u": "1f47f" }, { "n": ["skull"], "u": "1f480" }, { "n": ["skull and crossbones"], "u": "2620-fe0f" }, { "n": ["poop", "shit", "hankey", "pile of poo"], "u": "1f4a9" }, { "n": ["clown face"], "u": "1f921" }, { "n": ["japanese ogre"], "u": "1f479" }, { "n": ["japanese goblin"], "u": "1f47a" }, { "n": ["ghost"], "u": "1f47b" }, { "n": ["alien", "extraterrestrial alien"], "u": "1f47d" }, { "n": ["alien monster", "space invader"], "u": "1f47e" }, { "n": ["robot face"], "u": "1f916" }, { "n": ["smiley cat", "smiling cat face with open mouth"], "u": "1f63a" }, { "n": ["smile cat", "grinning cat face with smiling eyes"], "u": "1f638" }, { "n": ["joy cat", "cat face with tears of joy"], "u": "1f639" }, { "n": ["heart eyes cat", "smiling cat face with heart-shaped eyes"], "u": "1f63b" }, { "n": ["smirk cat", "cat face with wry smile"], "u": "1f63c" }, { "n": ["kissing cat", "kissing cat face with closed eyes"], "u": "1f63d" }, { "n": ["scream cat", "weary cat face"], "u": "1f640" }, { "n": ["crying cat face"], "u": "1f63f" }, { "n": ["pouting cat", "pouting cat face"], "u": "1f63e" }, { "n": ["see no evil", "see-no-evil monkey"], "u": "1f648" }, { "n": ["hear no evil", "hear-no-evil monkey"], "u": "1f649" }, { "n": ["speak no evil", "speak-no-evil monkey"], "u": "1f64a" }, { "n": ["kiss", "kiss mark"], "u": "1f48b" }, { "n": ["love letter"], "u": "1f48c" }, { "n": ["cupid", "heart with arrow"], "u": "1f498" }, { "n": ["gift heart", "heart with ribbon"], "u": "1f49d" }, { "n": ["sparkling heart"], "u": "1f496" }, { "n": ["heartpulse", "growing heart"], "u": "1f497" }, { "n": ["heartbeat", "beating heart"], "u": "1f493" }, { "n": ["revolving hearts"], "u": "1f49e" }, { "n": ["two hearts"], "u": "1f495" }, { "n": ["heart decoration"], "u": "1f49f" }, { "n": ["heart exclamation", "heavy heart exclamation mark ornament"], "u": "2763-fe0f" }, { "n": ["broken heart"], "u": "1f494" }, { "n": ["heart on fire"], "u": "2764-fe0f-200d-1f525" }, { "n": ["mending heart"], "u": "2764-fe0f-200d-1fa79" }, { "n": ["heart", "heavy black heart"], "u": "2764-fe0f" }, { "n": ["orange heart"], "u": "1f9e1" }, { "n": ["yellow heart"], "u": "1f49b" }, { "n": ["green heart"], "u": "1f49a" }, { "n": ["blue heart"], "u": "1f499" }, { "n": ["purple heart"], "u": "1f49c" }, { "n": ["brown heart"], "u": "1f90e" }, { "n": ["black heart"], "u": "1f5a4" }, { "n": ["white heart"], "u": "1f90d" }, { "n": ["100", "hundred points symbol"], "u": "1f4af" }, { "n": ["anger", "anger symbol"], "u": "1f4a2" }, { "n": ["boom", "collision", "collision symbol"], "u": "1f4a5" }, { "n": ["dizzy", "dizzy symbol"], "u": "1f4ab" }, { "n": ["sweat drops", "splashing sweat symbol"], "u": "1f4a6" }, { "n": ["dash", "dash symbol"], "u": "1f4a8" }, { "n": ["hole"], "u": "1f573-fe0f" }, { "n": ["bomb"], "u": "1f4a3" }, { "n": ["speech balloon"], "u": "1f4ac" }, { "n": ["eye in speech bubble", "eye-in-speech-bubble"], "u": "1f441-fe0f-200d-1f5e8-fe0f" }, { "n": ["left speech bubble"], "u": "1f5e8-fe0f" }, { "n": ["right anger bubble"], "u": "1f5ef-fe0f" }, { "n": ["thought balloon"], "u": "1f4ad" }, { "n": ["zzz", "sleeping symbol"], "u": "1f4a4" }, { "n": ["wave", "waving hand sign"], "u": "1f44b", "v": ["1f44b-1f3fb", "1f44b-1f3fc", "1f44b-1f3fd", "1f44b-1f3fe", "1f44b-1f3ff"] }, { "n": ["raised back of hand"], "u": "1f91a", "v": ["1f91a-1f3fb", "1f91a-1f3fc", "1f91a-1f3fd", "1f91a-1f3fe", "1f91a-1f3ff"] }, { "n": ["hand with fingers splayed", "raised hand with fingers splayed"], "u": "1f590-fe0f", "v": ["1f590-1f3fb", "1f590-1f3fc", "1f590-1f3fd", "1f590-1f3fe", "1f590-1f3ff"] }, { "n": ["hand", "raised hand"], "u": "270b", "v": ["270b-1f3fb", "270b-1f3fc", "270b-1f3fd", "270b-1f3fe", "270b-1f3ff"] }, { "n": ["spock-hand", "raised hand with part between middle and ring fingers"], "u": "1f596", "v": ["1f596-1f3fb", "1f596-1f3fc", "1f596-1f3fd", "1f596-1f3fe", "1f596-1f3ff"] }, { "n": ["rightwards hand"], "u": "1faf1", "v": ["1faf1-1f3fb", "1faf1-1f3fc", "1faf1-1f3fd", "1faf1-1f3fe", "1faf1-1f3ff"] }, { "n": ["leftwards hand"], "u": "1faf2", "v": ["1faf2-1f3fb", "1faf2-1f3fc", "1faf2-1f3fd", "1faf2-1f3fe", "1faf2-1f3ff"] }, { "n": ["palm down hand"], "u": "1faf3", "v": ["1faf3-1f3fb", "1faf3-1f3fc", "1faf3-1f3fd", "1faf3-1f3fe", "1faf3-1f3ff"] }, { "n": ["palm up hand"], "u": "1faf4", "v": ["1faf4-1f3fb", "1faf4-1f3fc", "1faf4-1f3fd", "1faf4-1f3fe", "1faf4-1f3ff"] }, { "n": ["ok hand", "ok hand sign"], "u": "1f44c", "v": ["1f44c-1f3fb", "1f44c-1f3fc", "1f44c-1f3fd", "1f44c-1f3fe", "1f44c-1f3ff"] }, { "n": ["pinched fingers"], "u": "1f90c", "v": ["1f90c-1f3fb", "1f90c-1f3fc", "1f90c-1f3fd", "1f90c-1f3fe", "1f90c-1f3ff"] }, { "n": ["pinching hand"], "u": "1f90f", "v": ["1f90f-1f3fb", "1f90f-1f3fc", "1f90f-1f3fd", "1f90f-1f3fe", "1f90f-1f3ff"] }, { "n": ["v", "victory hand"], "u": "270c-fe0f", "v": ["270c-1f3fb", "270c-1f3fc", "270c-1f3fd", "270c-1f3fe", "270c-1f3ff"] }, { "n": ["crossed fingers", "hand with index and middle fingers crossed"], "u": "1f91e", "v": ["1f91e-1f3fb", "1f91e-1f3fc", "1f91e-1f3fd", "1f91e-1f3fe", "1f91e-1f3ff"] }, { "n": ["hand with index finger and thumb crossed"], "u": "1faf0", "v": ["1faf0-1f3fb", "1faf0-1f3fc", "1faf0-1f3fd", "1faf0-1f3fe", "1faf0-1f3ff"] }, { "n": ["i love you hand sign"], "u": "1f91f", "v": ["1f91f-1f3fb", "1f91f-1f3fc", "1f91f-1f3fd", "1f91f-1f3fe", "1f91f-1f3ff"] }, { "n": ["the horns", "sign of the horns"], "u": "1f918", "v": ["1f918-1f3fb", "1f918-1f3fc", "1f918-1f3fd", "1f918-1f3fe", "1f918-1f3ff"] }, { "n": ["call me hand"], "u": "1f919", "v": ["1f919-1f3fb", "1f919-1f3fc", "1f919-1f3fd", "1f919-1f3fe", "1f919-1f3ff"] }, { "n": ["point left", "white left pointing backhand index"], "u": "1f448", "v": ["1f448-1f3fb", "1f448-1f3fc", "1f448-1f3fd", "1f448-1f3fe", "1f448-1f3ff"] }, { "n": ["point right", "white right pointing backhand index"], "u": "1f449", "v": ["1f449-1f3fb", "1f449-1f3fc", "1f449-1f3fd", "1f449-1f3fe", "1f449-1f3ff"] }, { "n": ["point up 2", "white up pointing backhand index"], "u": "1f446", "v": ["1f446-1f3fb", "1f446-1f3fc", "1f446-1f3fd", "1f446-1f3fe", "1f446-1f3ff"] }, { "n": ["middle finger", "reversed hand with middle finger extended"], "u": "1f595", "v": ["1f595-1f3fb", "1f595-1f3fc", "1f595-1f3fd", "1f595-1f3fe", "1f595-1f3ff"] }, { "n": ["point down", "white down pointing backhand index"], "u": "1f447", "v": ["1f447-1f3fb", "1f447-1f3fc", "1f447-1f3fd", "1f447-1f3fe", "1f447-1f3ff"] }, { "n": ["point up", "white up pointing index"], "u": "261d-fe0f", "v": ["261d-1f3fb", "261d-1f3fc", "261d-1f3fd", "261d-1f3fe", "261d-1f3ff"] }, { "n": ["index pointing at the viewer"], "u": "1faf5", "v": ["1faf5-1f3fb", "1faf5-1f3fc", "1faf5-1f3fd", "1faf5-1f3fe", "1faf5-1f3ff"] }, { "n": ["+1", "thumbsup", "thumbs up sign"], "u": "1f44d", "v": ["1f44d-1f3fb", "1f44d-1f3fc", "1f44d-1f3fd", "1f44d-1f3fe", "1f44d-1f3ff"] }, { "n": ["-1", "thumbsdown", "thumbs down sign"], "u": "1f44e", "v": ["1f44e-1f3fb", "1f44e-1f3fc", "1f44e-1f3fd", "1f44e-1f3fe", "1f44e-1f3ff"] }, { "n": ["fist", "raised fist"], "u": "270a", "v": ["270a-1f3fb", "270a-1f3fc", "270a-1f3fd", "270a-1f3fe", "270a-1f3ff"] }, { "n": ["punch", "facepunch", "fisted hand sign"], "u": "1f44a", "v": ["1f44a-1f3fb", "1f44a-1f3fc", "1f44a-1f3fd", "1f44a-1f3fe", "1f44a-1f3ff"] }, { "n": ["left-facing fist"], "u": "1f91b", "v": ["1f91b-1f3fb", "1f91b-1f3fc", "1f91b-1f3fd", "1f91b-1f3fe", "1f91b-1f3ff"] }, { "n": ["right-facing fist"], "u": "1f91c", "v": ["1f91c-1f3fb", "1f91c-1f3fc", "1f91c-1f3fd", "1f91c-1f3fe", "1f91c-1f3ff"] }, { "n": ["clap", "clapping hands sign"], "u": "1f44f", "v": ["1f44f-1f3fb", "1f44f-1f3fc", "1f44f-1f3fd", "1f44f-1f3fe", "1f44f-1f3ff"] }, { "n": ["raised hands", "person raising both hands in celebration"], "u": "1f64c", "v": ["1f64c-1f3fb", "1f64c-1f3fc", "1f64c-1f3fd", "1f64c-1f3fe", "1f64c-1f3ff"] }, { "n": ["heart hands"], "u": "1faf6", "v": ["1faf6-1f3fb", "1faf6-1f3fc", "1faf6-1f3fd", "1faf6-1f3fe", "1faf6-1f3ff"] }, { "n": ["open hands", "open hands sign"], "u": "1f450", "v": ["1f450-1f3fb", "1f450-1f3fc", "1f450-1f3fd", "1f450-1f3fe", "1f450-1f3ff"] }, { "n": ["palms up together"], "u": "1f932", "v": ["1f932-1f3fb", "1f932-1f3fc", "1f932-1f3fd", "1f932-1f3fe", "1f932-1f3ff"] }, { "n": ["handshake"], "u": "1f91d", "v": ["1f91d-1f3fb", "1f91d-1f3fc", "1f91d-1f3fd", "1f91d-1f3fe", "1f91d-1f3ff", "1faf1-1f3fb-200d-1faf2-1f3fc", "1faf1-1f3fb-200d-1faf2-1f3fd", "1faf1-1f3fb-200d-1faf2-1f3fe", "1faf1-1f3fb-200d-1faf2-1f3ff", "1faf1-1f3fc-200d-1faf2-1f3fb", "1faf1-1f3fc-200d-1faf2-1f3fd", "1faf1-1f3fc-200d-1faf2-1f3fe", "1faf1-1f3fc-200d-1faf2-1f3ff", "1faf1-1f3fd-200d-1faf2-1f3fb", "1faf1-1f3fd-200d-1faf2-1f3fc", "1faf1-1f3fd-200d-1faf2-1f3fe", "1faf1-1f3fd-200d-1faf2-1f3ff", "1faf1-1f3fe-200d-1faf2-1f3fb", "1faf1-1f3fe-200d-1faf2-1f3fc", "1faf1-1f3fe-200d-1faf2-1f3fd", "1faf1-1f3fe-200d-1faf2-1f3ff", "1faf1-1f3ff-200d-1faf2-1f3fb", "1faf1-1f3ff-200d-1faf2-1f3fc", "1faf1-1f3ff-200d-1faf2-1f3fd", "1faf1-1f3ff-200d-1faf2-1f3fe"] }, { "n": ["pray", "person with folded hands"], "u": "1f64f", "v": ["1f64f-1f3fb", "1f64f-1f3fc", "1f64f-1f3fd", "1f64f-1f3fe", "1f64f-1f3ff"] }, { "n": ["writing hand"], "u": "270d-fe0f", "v": ["270d-1f3fb", "270d-1f3fc", "270d-1f3fd", "270d-1f3fe", "270d-1f3ff"] }, { "n": ["nail care", "nail polish"], "u": "1f485", "v": ["1f485-1f3fb", "1f485-1f3fc", "1f485-1f3fd", "1f485-1f3fe", "1f485-1f3ff"] }, { "n": ["selfie"], "u": "1f933", "v": ["1f933-1f3fb", "1f933-1f3fc", "1f933-1f3fd", "1f933-1f3fe", "1f933-1f3ff"] }, { "n": ["muscle", "flexed biceps"], "u": "1f4aa", "v": ["1f4aa-1f3fb", "1f4aa-1f3fc", "1f4aa-1f3fd", "1f4aa-1f3fe", "1f4aa-1f3ff"] }, { "n": ["mechanical arm"], "u": "1f9be" }, { "n": ["mechanical leg"], "u": "1f9bf" }, { "n": ["leg"], "u": "1f9b5", "v": ["1f9b5-1f3fb", "1f9b5-1f3fc", "1f9b5-1f3fd", "1f9b5-1f3fe", "1f9b5-1f3ff"] }, { "n": ["foot"], "u": "1f9b6", "v": ["1f9b6-1f3fb", "1f9b6-1f3fc", "1f9b6-1f3fd", "1f9b6-1f3fe", "1f9b6-1f3ff"] }, { "n": ["ear"], "u": "1f442", "v": ["1f442-1f3fb", "1f442-1f3fc", "1f442-1f3fd", "1f442-1f3fe", "1f442-1f3ff"] }, { "n": ["ear with hearing aid"], "u": "1f9bb", "v": ["1f9bb-1f3fb", "1f9bb-1f3fc", "1f9bb-1f3fd", "1f9bb-1f3fe", "1f9bb-1f3ff"] }, { "n": ["nose"], "u": "1f443", "v": ["1f443-1f3fb", "1f443-1f3fc", "1f443-1f3fd", "1f443-1f3fe", "1f443-1f3ff"] }, { "n": ["brain"], "u": "1f9e0" }, { "n": ["anatomical heart"], "u": "1fac0" }, { "n": ["lungs"], "u": "1fac1" }, { "n": ["tooth"], "u": "1f9b7" }, { "n": ["bone"], "u": "1f9b4" }, { "n": ["eyes"], "u": "1f440" }, { "n": ["eye"], "u": "1f441-fe0f" }, { "n": ["tongue"], "u": "1f445" }, { "n": ["lips", "mouth"], "u": "1f444" }, { "n": ["biting lip"], "u": "1fae6" }, { "n": ["baby"], "u": "1f476", "v": ["1f476-1f3fb", "1f476-1f3fc", "1f476-1f3fd", "1f476-1f3fe", "1f476-1f3ff"] }, { "n": ["child"], "u": "1f9d2", "v": ["1f9d2-1f3fb", "1f9d2-1f3fc", "1f9d2-1f3fd", "1f9d2-1f3fe", "1f9d2-1f3ff"] }, { "n": ["boy"], "u": "1f466", "v": ["1f466-1f3fb", "1f466-1f3fc", "1f466-1f3fd", "1f466-1f3fe", "1f466-1f3ff"] }, { "n": ["girl"], "u": "1f467", "v": ["1f467-1f3fb", "1f467-1f3fc", "1f467-1f3fd", "1f467-1f3fe", "1f467-1f3ff"] }, { "n": ["adult"], "u": "1f9d1", "v": ["1f9d1-1f3fb", "1f9d1-1f3fc", "1f9d1-1f3fd", "1f9d1-1f3fe", "1f9d1-1f3ff"] }, { "n": ["person with blond hair"], "u": "1f471", "v": ["1f471-1f3fb", "1f471-1f3fc", "1f471-1f3fd", "1f471-1f3fe", "1f471-1f3ff"] }, { "n": ["man"], "u": "1f468", "v": ["1f468-1f3fb", "1f468-1f3fc", "1f468-1f3fd", "1f468-1f3fe", "1f468-1f3ff"] }, { "n": ["bearded person"], "u": "1f9d4", "v": ["1f9d4-1f3fb", "1f9d4-1f3fc", "1f9d4-1f3fd", "1f9d4-1f3fe", "1f9d4-1f3ff"] }, { "n": ["man: beard", "man with beard"], "u": "1f9d4-200d-2642-fe0f", "v": ["1f9d4-1f3fb-200d-2642-fe0f", "1f9d4-1f3fc-200d-2642-fe0f", "1f9d4-1f3fd-200d-2642-fe0f", "1f9d4-1f3fe-200d-2642-fe0f", "1f9d4-1f3ff-200d-2642-fe0f"] }, { "n": ["woman: beard", "woman with beard"], "u": "1f9d4-200d-2640-fe0f", "v": ["1f9d4-1f3fb-200d-2640-fe0f", "1f9d4-1f3fc-200d-2640-fe0f", "1f9d4-1f3fd-200d-2640-fe0f", "1f9d4-1f3fe-200d-2640-fe0f", "1f9d4-1f3ff-200d-2640-fe0f"] }, { "n": ["man: red hair", "red haired man"], "u": "1f468-200d-1f9b0", "v": ["1f468-1f3fb-200d-1f9b0", "1f468-1f3fc-200d-1f9b0", "1f468-1f3fd-200d-1f9b0", "1f468-1f3fe-200d-1f9b0", "1f468-1f3ff-200d-1f9b0"] }, { "n": ["man: curly hair", "curly haired man"], "u": "1f468-200d-1f9b1", "v": ["1f468-1f3fb-200d-1f9b1", "1f468-1f3fc-200d-1f9b1", "1f468-1f3fd-200d-1f9b1", "1f468-1f3fe-200d-1f9b1", "1f468-1f3ff-200d-1f9b1"] }, { "n": ["man: white hair", "white haired man"], "u": "1f468-200d-1f9b3", "v": ["1f468-1f3fb-200d-1f9b3", "1f468-1f3fc-200d-1f9b3", "1f468-1f3fd-200d-1f9b3", "1f468-1f3fe-200d-1f9b3", "1f468-1f3ff-200d-1f9b3"] }, { "n": ["bald man", "man: bald"], "u": "1f468-200d-1f9b2", "v": ["1f468-1f3fb-200d-1f9b2", "1f468-1f3fc-200d-1f9b2", "1f468-1f3fd-200d-1f9b2", "1f468-1f3fe-200d-1f9b2", "1f468-1f3ff-200d-1f9b2"] }, { "n": ["woman"], "u": "1f469", "v": ["1f469-1f3fb", "1f469-1f3fc", "1f469-1f3fd", "1f469-1f3fe", "1f469-1f3ff"] }, { "n": ["woman: red hair", "red haired woman"], "u": "1f469-200d-1f9b0", "v": ["1f469-1f3fb-200d-1f9b0", "1f469-1f3fc-200d-1f9b0", "1f469-1f3fd-200d-1f9b0", "1f469-1f3fe-200d-1f9b0", "1f469-1f3ff-200d-1f9b0"] }, { "n": ["person: red hair", "red haired person"], "u": "1f9d1-200d-1f9b0", "v": ["1f9d1-1f3fb-200d-1f9b0", "1f9d1-1f3fc-200d-1f9b0", "1f9d1-1f3fd-200d-1f9b0", "1f9d1-1f3fe-200d-1f9b0", "1f9d1-1f3ff-200d-1f9b0"] }, { "n": ["woman: curly hair", "curly haired woman"], "u": "1f469-200d-1f9b1", "v": ["1f469-1f3fb-200d-1f9b1", "1f469-1f3fc-200d-1f9b1", "1f469-1f3fd-200d-1f9b1", "1f469-1f3fe-200d-1f9b1", "1f469-1f3ff-200d-1f9b1"] }, { "n": ["person: curly hair", "curly haired person"], "u": "1f9d1-200d-1f9b1", "v": ["1f9d1-1f3fb-200d-1f9b1", "1f9d1-1f3fc-200d-1f9b1", "1f9d1-1f3fd-200d-1f9b1", "1f9d1-1f3fe-200d-1f9b1", "1f9d1-1f3ff-200d-1f9b1"] }, { "n": ["woman: white hair", "white haired woman"], "u": "1f469-200d-1f9b3", "v": ["1f469-1f3fb-200d-1f9b3", "1f469-1f3fc-200d-1f9b3", "1f469-1f3fd-200d-1f9b3", "1f469-1f3fe-200d-1f9b3", "1f469-1f3ff-200d-1f9b3"] }, { "n": ["person: white hair", "white haired person"], "u": "1f9d1-200d-1f9b3", "v": ["1f9d1-1f3fb-200d-1f9b3", "1f9d1-1f3fc-200d-1f9b3", "1f9d1-1f3fd-200d-1f9b3", "1f9d1-1f3fe-200d-1f9b3", "1f9d1-1f3ff-200d-1f9b3"] }, { "n": ["bald woman", "woman: bald"], "u": "1f469-200d-1f9b2", "v": ["1f469-1f3fb-200d-1f9b2", "1f469-1f3fc-200d-1f9b2", "1f469-1f3fd-200d-1f9b2", "1f469-1f3fe-200d-1f9b2", "1f469-1f3ff-200d-1f9b2"] }, { "n": ["bald person", "person: bald"], "u": "1f9d1-200d-1f9b2", "v": ["1f9d1-1f3fb-200d-1f9b2", "1f9d1-1f3fc-200d-1f9b2", "1f9d1-1f3fd-200d-1f9b2", "1f9d1-1f3fe-200d-1f9b2", "1f9d1-1f3ff-200d-1f9b2"] }, { "n": ["woman: blond hair", "blond-haired-woman"], "u": "1f471-200d-2640-fe0f", "v": ["1f471-1f3fb-200d-2640-fe0f", "1f471-1f3fc-200d-2640-fe0f", "1f471-1f3fd-200d-2640-fe0f", "1f471-1f3fe-200d-2640-fe0f", "1f471-1f3ff-200d-2640-fe0f"] }, { "n": ["man: blond hair", "blond-haired-man"], "u": "1f471-200d-2642-fe0f", "v": ["1f471-1f3fb-200d-2642-fe0f", "1f471-1f3fc-200d-2642-fe0f", "1f471-1f3fd-200d-2642-fe0f", "1f471-1f3fe-200d-2642-fe0f", "1f471-1f3ff-200d-2642-fe0f"] }, { "n": ["older adult"], "u": "1f9d3", "v": ["1f9d3-1f3fb", "1f9d3-1f3fc", "1f9d3-1f3fd", "1f9d3-1f3fe", "1f9d3-1f3ff"] }, { "n": ["older man"], "u": "1f474", "v": ["1f474-1f3fb", "1f474-1f3fc", "1f474-1f3fd", "1f474-1f3fe", "1f474-1f3ff"] }, { "n": ["older woman"], "u": "1f475", "v": ["1f475-1f3fb", "1f475-1f3fc", "1f475-1f3fd", "1f475-1f3fe", "1f475-1f3ff"] }, { "n": ["person frowning"], "u": "1f64d", "v": ["1f64d-1f3fb", "1f64d-1f3fc", "1f64d-1f3fd", "1f64d-1f3fe", "1f64d-1f3ff"] }, { "n": ["man frowning", "man-frowning"], "u": "1f64d-200d-2642-fe0f", "v": ["1f64d-1f3fb-200d-2642-fe0f", "1f64d-1f3fc-200d-2642-fe0f", "1f64d-1f3fd-200d-2642-fe0f", "1f64d-1f3fe-200d-2642-fe0f", "1f64d-1f3ff-200d-2642-fe0f"] }, { "n": ["woman frowning", "woman-frowning"], "u": "1f64d-200d-2640-fe0f", "v": ["1f64d-1f3fb-200d-2640-fe0f", "1f64d-1f3fc-200d-2640-fe0f", "1f64d-1f3fd-200d-2640-fe0f", "1f64d-1f3fe-200d-2640-fe0f", "1f64d-1f3ff-200d-2640-fe0f"] }, { "n": ["person with pouting face"], "u": "1f64e", "v": ["1f64e-1f3fb", "1f64e-1f3fc", "1f64e-1f3fd", "1f64e-1f3fe", "1f64e-1f3ff"] }, { "n": ["man pouting", "man-pouting"], "u": "1f64e-200d-2642-fe0f", "v": ["1f64e-1f3fb-200d-2642-fe0f", "1f64e-1f3fc-200d-2642-fe0f", "1f64e-1f3fd-200d-2642-fe0f", "1f64e-1f3fe-200d-2642-fe0f", "1f64e-1f3ff-200d-2642-fe0f"] }, { "n": ["woman pouting", "woman-pouting"], "u": "1f64e-200d-2640-fe0f", "v": ["1f64e-1f3fb-200d-2640-fe0f", "1f64e-1f3fc-200d-2640-fe0f", "1f64e-1f3fd-200d-2640-fe0f", "1f64e-1f3fe-200d-2640-fe0f", "1f64e-1f3ff-200d-2640-fe0f"] }, { "n": ["no good", "face with no good gesture"], "u": "1f645", "v": ["1f645-1f3fb", "1f645-1f3fc", "1f645-1f3fd", "1f645-1f3fe", "1f645-1f3ff"] }, { "n": ["man gesturing no", "man-gesturing-no"], "u": "1f645-200d-2642-fe0f", "v": ["1f645-1f3fb-200d-2642-fe0f", "1f645-1f3fc-200d-2642-fe0f", "1f645-1f3fd-200d-2642-fe0f", "1f645-1f3fe-200d-2642-fe0f", "1f645-1f3ff-200d-2642-fe0f"] }, { "n": ["woman gesturing no", "woman-gesturing-no"], "u": "1f645-200d-2640-fe0f", "v": ["1f645-1f3fb-200d-2640-fe0f", "1f645-1f3fc-200d-2640-fe0f", "1f645-1f3fd-200d-2640-fe0f", "1f645-1f3fe-200d-2640-fe0f", "1f645-1f3ff-200d-2640-fe0f"] }, { "n": ["ok woman", "face with ok gesture"], "u": "1f646", "v": ["1f646-1f3fb", "1f646-1f3fc", "1f646-1f3fd", "1f646-1f3fe", "1f646-1f3ff"] }, { "n": ["man gesturing ok", "man-gesturing-ok"], "u": "1f646-200d-2642-fe0f", "v": ["1f646-1f3fb-200d-2642-fe0f", "1f646-1f3fc-200d-2642-fe0f", "1f646-1f3fd-200d-2642-fe0f", "1f646-1f3fe-200d-2642-fe0f", "1f646-1f3ff-200d-2642-fe0f"] }, { "n": ["woman gesturing ok", "woman-gesturing-ok"], "u": "1f646-200d-2640-fe0f", "v": ["1f646-1f3fb-200d-2640-fe0f", "1f646-1f3fc-200d-2640-fe0f", "1f646-1f3fd-200d-2640-fe0f", "1f646-1f3fe-200d-2640-fe0f", "1f646-1f3ff-200d-2640-fe0f"] }, { "n": ["information desk person"], "u": "1f481", "v": ["1f481-1f3fb", "1f481-1f3fc", "1f481-1f3fd", "1f481-1f3fe", "1f481-1f3ff"] }, { "n": ["man tipping hand", "man-tipping-hand"], "u": "1f481-200d-2642-fe0f", "v": ["1f481-1f3fb-200d-2642-fe0f", "1f481-1f3fc-200d-2642-fe0f", "1f481-1f3fd-200d-2642-fe0f", "1f481-1f3fe-200d-2642-fe0f", "1f481-1f3ff-200d-2642-fe0f"] }, { "n": ["woman tipping hand", "woman-tipping-hand"], "u": "1f481-200d-2640-fe0f", "v": ["1f481-1f3fb-200d-2640-fe0f", "1f481-1f3fc-200d-2640-fe0f", "1f481-1f3fd-200d-2640-fe0f", "1f481-1f3fe-200d-2640-fe0f", "1f481-1f3ff-200d-2640-fe0f"] }, { "n": ["raising hand", "happy person raising one hand"], "u": "1f64b", "v": ["1f64b-1f3fb", "1f64b-1f3fc", "1f64b-1f3fd", "1f64b-1f3fe", "1f64b-1f3ff"] }, { "n": ["man raising hand", "man-raising-hand"], "u": "1f64b-200d-2642-fe0f", "v": ["1f64b-1f3fb-200d-2642-fe0f", "1f64b-1f3fc-200d-2642-fe0f", "1f64b-1f3fd-200d-2642-fe0f", "1f64b-1f3fe-200d-2642-fe0f", "1f64b-1f3ff-200d-2642-fe0f"] }, { "n": ["woman raising hand", "woman-raising-hand"], "u": "1f64b-200d-2640-fe0f", "v": ["1f64b-1f3fb-200d-2640-fe0f", "1f64b-1f3fc-200d-2640-fe0f", "1f64b-1f3fd-200d-2640-fe0f", "1f64b-1f3fe-200d-2640-fe0f", "1f64b-1f3ff-200d-2640-fe0f"] }, { "n": ["deaf person"], "u": "1f9cf", "v": ["1f9cf-1f3fb", "1f9cf-1f3fc", "1f9cf-1f3fd", "1f9cf-1f3fe", "1f9cf-1f3ff"] }, { "n": ["deaf man"], "u": "1f9cf-200d-2642-fe0f", "v": ["1f9cf-1f3fb-200d-2642-fe0f", "1f9cf-1f3fc-200d-2642-fe0f", "1f9cf-1f3fd-200d-2642-fe0f", "1f9cf-1f3fe-200d-2642-fe0f", "1f9cf-1f3ff-200d-2642-fe0f"] }, { "n": ["deaf woman"], "u": "1f9cf-200d-2640-fe0f", "v": ["1f9cf-1f3fb-200d-2640-fe0f", "1f9cf-1f3fc-200d-2640-fe0f", "1f9cf-1f3fd-200d-2640-fe0f", "1f9cf-1f3fe-200d-2640-fe0f", "1f9cf-1f3ff-200d-2640-fe0f"] }, { "n": ["bow", "person bowing deeply"], "u": "1f647", "v": ["1f647-1f3fb", "1f647-1f3fc", "1f647-1f3fd", "1f647-1f3fe", "1f647-1f3ff"] }, { "n": ["man bowing", "man-bowing"], "u": "1f647-200d-2642-fe0f", "v": ["1f647-1f3fb-200d-2642-fe0f", "1f647-1f3fc-200d-2642-fe0f", "1f647-1f3fd-200d-2642-fe0f", "1f647-1f3fe-200d-2642-fe0f", "1f647-1f3ff-200d-2642-fe0f"] }, { "n": ["woman bowing", "woman-bowing"], "u": "1f647-200d-2640-fe0f", "v": ["1f647-1f3fb-200d-2640-fe0f", "1f647-1f3fc-200d-2640-fe0f", "1f647-1f3fd-200d-2640-fe0f", "1f647-1f3fe-200d-2640-fe0f", "1f647-1f3ff-200d-2640-fe0f"] }, { "n": ["face palm"], "u": "1f926", "v": ["1f926-1f3fb", "1f926-1f3fc", "1f926-1f3fd", "1f926-1f3fe", "1f926-1f3ff"] }, { "n": ["man facepalming", "man-facepalming"], "u": "1f926-200d-2642-fe0f", "v": ["1f926-1f3fb-200d-2642-fe0f", "1f926-1f3fc-200d-2642-fe0f", "1f926-1f3fd-200d-2642-fe0f", "1f926-1f3fe-200d-2642-fe0f", "1f926-1f3ff-200d-2642-fe0f"] }, { "n": ["woman facepalming", "woman-facepalming"], "u": "1f926-200d-2640-fe0f", "v": ["1f926-1f3fb-200d-2640-fe0f", "1f926-1f3fc-200d-2640-fe0f", "1f926-1f3fd-200d-2640-fe0f", "1f926-1f3fe-200d-2640-fe0f", "1f926-1f3ff-200d-2640-fe0f"] }, { "n": ["shrug"], "u": "1f937", "v": ["1f937-1f3fb", "1f937-1f3fc", "1f937-1f3fd", "1f937-1f3fe", "1f937-1f3ff"] }, { "n": ["man shrugging", "man-shrugging"], "u": "1f937-200d-2642-fe0f", "v": ["1f937-1f3fb-200d-2642-fe0f", "1f937-1f3fc-200d-2642-fe0f", "1f937-1f3fd-200d-2642-fe0f", "1f937-1f3fe-200d-2642-fe0f", "1f937-1f3ff-200d-2642-fe0f"] }, { "n": ["woman shrugging", "woman-shrugging"], "u": "1f937-200d-2640-fe0f", "v": ["1f937-1f3fb-200d-2640-fe0f", "1f937-1f3fc-200d-2640-fe0f", "1f937-1f3fd-200d-2640-fe0f", "1f937-1f3fe-200d-2640-fe0f", "1f937-1f3ff-200d-2640-fe0f"] }, { "n": ["health worker"], "u": "1f9d1-200d-2695-fe0f", "v": ["1f9d1-1f3fb-200d-2695-fe0f", "1f9d1-1f3fc-200d-2695-fe0f", "1f9d1-1f3fd-200d-2695-fe0f", "1f9d1-1f3fe-200d-2695-fe0f", "1f9d1-1f3ff-200d-2695-fe0f"] }, { "n": ["male-doctor", "man health worker"], "u": "1f468-200d-2695-fe0f", "v": ["1f468-1f3fb-200d-2695-fe0f", "1f468-1f3fc-200d-2695-fe0f", "1f468-1f3fd-200d-2695-fe0f", "1f468-1f3fe-200d-2695-fe0f", "1f468-1f3ff-200d-2695-fe0f"] }, { "n": ["female-doctor", "woman health worker"], "u": "1f469-200d-2695-fe0f", "v": ["1f469-1f3fb-200d-2695-fe0f", "1f469-1f3fc-200d-2695-fe0f", "1f469-1f3fd-200d-2695-fe0f", "1f469-1f3fe-200d-2695-fe0f", "1f469-1f3ff-200d-2695-fe0f"] }, { "n": ["student"], "u": "1f9d1-200d-1f393", "v": ["1f9d1-1f3fb-200d-1f393", "1f9d1-1f3fc-200d-1f393", "1f9d1-1f3fd-200d-1f393", "1f9d1-1f3fe-200d-1f393", "1f9d1-1f3ff-200d-1f393"] }, { "n": ["man student", "male-student"], "u": "1f468-200d-1f393", "v": ["1f468-1f3fb-200d-1f393", "1f468-1f3fc-200d-1f393", "1f468-1f3fd-200d-1f393", "1f468-1f3fe-200d-1f393", "1f468-1f3ff-200d-1f393"] }, { "n": ["woman student", "female-student"], "u": "1f469-200d-1f393", "v": ["1f469-1f3fb-200d-1f393", "1f469-1f3fc-200d-1f393", "1f469-1f3fd-200d-1f393", "1f469-1f3fe-200d-1f393", "1f469-1f3ff-200d-1f393"] }, { "n": ["teacher"], "u": "1f9d1-200d-1f3eb", "v": ["1f9d1-1f3fb-200d-1f3eb", "1f9d1-1f3fc-200d-1f3eb", "1f9d1-1f3fd-200d-1f3eb", "1f9d1-1f3fe-200d-1f3eb", "1f9d1-1f3ff-200d-1f3eb"] }, { "n": ["man teacher", "male-teacher"], "u": "1f468-200d-1f3eb", "v": ["1f468-1f3fb-200d-1f3eb", "1f468-1f3fc-200d-1f3eb", "1f468-1f3fd-200d-1f3eb", "1f468-1f3fe-200d-1f3eb", "1f468-1f3ff-200d-1f3eb"] }, { "n": ["woman teacher", "female-teacher"], "u": "1f469-200d-1f3eb", "v": ["1f469-1f3fb-200d-1f3eb", "1f469-1f3fc-200d-1f3eb", "1f469-1f3fd-200d-1f3eb", "1f469-1f3fe-200d-1f3eb", "1f469-1f3ff-200d-1f3eb"] }, { "n": ["judge"], "u": "1f9d1-200d-2696-fe0f", "v": ["1f9d1-1f3fb-200d-2696-fe0f", "1f9d1-1f3fc-200d-2696-fe0f", "1f9d1-1f3fd-200d-2696-fe0f", "1f9d1-1f3fe-200d-2696-fe0f", "1f9d1-1f3ff-200d-2696-fe0f"] }, { "n": ["man judge", "male-judge"], "u": "1f468-200d-2696-fe0f", "v": ["1f468-1f3fb-200d-2696-fe0f", "1f468-1f3fc-200d-2696-fe0f", "1f468-1f3fd-200d-2696-fe0f", "1f468-1f3fe-200d-2696-fe0f", "1f468-1f3ff-200d-2696-fe0f"] }, { "n": ["woman judge", "female-judge"], "u": "1f469-200d-2696-fe0f", "v": ["1f469-1f3fb-200d-2696-fe0f", "1f469-1f3fc-200d-2696-fe0f", "1f469-1f3fd-200d-2696-fe0f", "1f469-1f3fe-200d-2696-fe0f", "1f469-1f3ff-200d-2696-fe0f"] }, { "n": ["farmer"], "u": "1f9d1-200d-1f33e", "v": ["1f9d1-1f3fb-200d-1f33e", "1f9d1-1f3fc-200d-1f33e", "1f9d1-1f3fd-200d-1f33e", "1f9d1-1f3fe-200d-1f33e", "1f9d1-1f3ff-200d-1f33e"] }, { "n": ["man farmer", "male-farmer"], "u": "1f468-200d-1f33e", "v": ["1f468-1f3fb-200d-1f33e", "1f468-1f3fc-200d-1f33e", "1f468-1f3fd-200d-1f33e", "1f468-1f3fe-200d-1f33e", "1f468-1f3ff-200d-1f33e"] }, { "n": ["woman farmer", "female-farmer"], "u": "1f469-200d-1f33e", "v": ["1f469-1f3fb-200d-1f33e", "1f469-1f3fc-200d-1f33e", "1f469-1f3fd-200d-1f33e", "1f469-1f3fe-200d-1f33e", "1f469-1f3ff-200d-1f33e"] }, { "n": ["cook"], "u": "1f9d1-200d-1f373", "v": ["1f9d1-1f3fb-200d-1f373", "1f9d1-1f3fc-200d-1f373", "1f9d1-1f3fd-200d-1f373", "1f9d1-1f3fe-200d-1f373", "1f9d1-1f3ff-200d-1f373"] }, { "n": ["man cook", "male-cook"], "u": "1f468-200d-1f373", "v": ["1f468-1f3fb-200d-1f373", "1f468-1f3fc-200d-1f373", "1f468-1f3fd-200d-1f373", "1f468-1f3fe-200d-1f373", "1f468-1f3ff-200d-1f373"] }, { "n": ["woman cook", "female-cook"], "u": "1f469-200d-1f373", "v": ["1f469-1f3fb-200d-1f373", "1f469-1f3fc-200d-1f373", "1f469-1f3fd-200d-1f373", "1f469-1f3fe-200d-1f373", "1f469-1f3ff-200d-1f373"] }, { "n": ["mechanic"], "u": "1f9d1-200d-1f527", "v": ["1f9d1-1f3fb-200d-1f527", "1f9d1-1f3fc-200d-1f527", "1f9d1-1f3fd-200d-1f527", "1f9d1-1f3fe-200d-1f527", "1f9d1-1f3ff-200d-1f527"] }, { "n": ["man mechanic", "male-mechanic"], "u": "1f468-200d-1f527", "v": ["1f468-1f3fb-200d-1f527", "1f468-1f3fc-200d-1f527", "1f468-1f3fd-200d-1f527", "1f468-1f3fe-200d-1f527", "1f468-1f3ff-200d-1f527"] }, { "n": ["woman mechanic", "female-mechanic"], "u": "1f469-200d-1f527", "v": ["1f469-1f3fb-200d-1f527", "1f469-1f3fc-200d-1f527", "1f469-1f3fd-200d-1f527", "1f469-1f3fe-200d-1f527", "1f469-1f3ff-200d-1f527"] }, { "n": ["factory worker"], "u": "1f9d1-200d-1f3ed", "v": ["1f9d1-1f3fb-200d-1f3ed", "1f9d1-1f3fc-200d-1f3ed", "1f9d1-1f3fd-200d-1f3ed", "1f9d1-1f3fe-200d-1f3ed", "1f9d1-1f3ff-200d-1f3ed"] }, { "n": ["man factory worker", "male-factory-worker"], "u": "1f468-200d-1f3ed", "v": ["1f468-1f3fb-200d-1f3ed", "1f468-1f3fc-200d-1f3ed", "1f468-1f3fd-200d-1f3ed", "1f468-1f3fe-200d-1f3ed", "1f468-1f3ff-200d-1f3ed"] }, { "n": ["woman factory worker", "female-factory-worker"], "u": "1f469-200d-1f3ed", "v": ["1f469-1f3fb-200d-1f3ed", "1f469-1f3fc-200d-1f3ed", "1f469-1f3fd-200d-1f3ed", "1f469-1f3fe-200d-1f3ed", "1f469-1f3ff-200d-1f3ed"] }, { "n": ["office worker"], "u": "1f9d1-200d-1f4bc", "v": ["1f9d1-1f3fb-200d-1f4bc", "1f9d1-1f3fc-200d-1f4bc", "1f9d1-1f3fd-200d-1f4bc", "1f9d1-1f3fe-200d-1f4bc", "1f9d1-1f3ff-200d-1f4bc"] }, { "n": ["man office worker", "male-office-worker"], "u": "1f468-200d-1f4bc", "v": ["1f468-1f3fb-200d-1f4bc", "1f468-1f3fc-200d-1f4bc", "1f468-1f3fd-200d-1f4bc", "1f468-1f3fe-200d-1f4bc", "1f468-1f3ff-200d-1f4bc"] }, { "n": ["woman office worker", "female-office-worker"], "u": "1f469-200d-1f4bc", "v": ["1f469-1f3fb-200d-1f4bc", "1f469-1f3fc-200d-1f4bc", "1f469-1f3fd-200d-1f4bc", "1f469-1f3fe-200d-1f4bc", "1f469-1f3ff-200d-1f4bc"] }, { "n": ["scientist"], "u": "1f9d1-200d-1f52c", "v": ["1f9d1-1f3fb-200d-1f52c", "1f9d1-1f3fc-200d-1f52c", "1f9d1-1f3fd-200d-1f52c", "1f9d1-1f3fe-200d-1f52c", "1f9d1-1f3ff-200d-1f52c"] }, { "n": ["man scientist", "male-scientist"], "u": "1f468-200d-1f52c", "v": ["1f468-1f3fb-200d-1f52c", "1f468-1f3fc-200d-1f52c", "1f468-1f3fd-200d-1f52c", "1f468-1f3fe-200d-1f52c", "1f468-1f3ff-200d-1f52c"] }, { "n": ["woman scientist", "female-scientist"], "u": "1f469-200d-1f52c", "v": ["1f469-1f3fb-200d-1f52c", "1f469-1f3fc-200d-1f52c", "1f469-1f3fd-200d-1f52c", "1f469-1f3fe-200d-1f52c", "1f469-1f3ff-200d-1f52c"] }, { "n": ["technologist"], "u": "1f9d1-200d-1f4bb", "v": ["1f9d1-1f3fb-200d-1f4bb", "1f9d1-1f3fc-200d-1f4bb", "1f9d1-1f3fd-200d-1f4bb", "1f9d1-1f3fe-200d-1f4bb", "1f9d1-1f3ff-200d-1f4bb"] }, { "n": ["man technologist", "male-technologist"], "u": "1f468-200d-1f4bb", "v": ["1f468-1f3fb-200d-1f4bb", "1f468-1f3fc-200d-1f4bb", "1f468-1f3fd-200d-1f4bb", "1f468-1f3fe-200d-1f4bb", "1f468-1f3ff-200d-1f4bb"] }, { "n": ["woman technologist", "female-technologist"], "u": "1f469-200d-1f4bb", "v": ["1f469-1f3fb-200d-1f4bb", "1f469-1f3fc-200d-1f4bb", "1f469-1f3fd-200d-1f4bb", "1f469-1f3fe-200d-1f4bb", "1f469-1f3ff-200d-1f4bb"] }, { "n": ["singer"], "u": "1f9d1-200d-1f3a4", "v": ["1f9d1-1f3fb-200d-1f3a4", "1f9d1-1f3fc-200d-1f3a4", "1f9d1-1f3fd-200d-1f3a4", "1f9d1-1f3fe-200d-1f3a4", "1f9d1-1f3ff-200d-1f3a4"] }, { "n": ["man singer", "male-singer"], "u": "1f468-200d-1f3a4", "v": ["1f468-1f3fb-200d-1f3a4", "1f468-1f3fc-200d-1f3a4", "1f468-1f3fd-200d-1f3a4", "1f468-1f3fe-200d-1f3a4", "1f468-1f3ff-200d-1f3a4"] }, { "n": ["woman singer", "female-singer"], "u": "1f469-200d-1f3a4", "v": ["1f469-1f3fb-200d-1f3a4", "1f469-1f3fc-200d-1f3a4", "1f469-1f3fd-200d-1f3a4", "1f469-1f3fe-200d-1f3a4", "1f469-1f3ff-200d-1f3a4"] }, { "n": ["artist"], "u": "1f9d1-200d-1f3a8", "v": ["1f9d1-1f3fb-200d-1f3a8", "1f9d1-1f3fc-200d-1f3a8", "1f9d1-1f3fd-200d-1f3a8", "1f9d1-1f3fe-200d-1f3a8", "1f9d1-1f3ff-200d-1f3a8"] }, { "n": ["man artist", "male-artist"], "u": "1f468-200d-1f3a8", "v": ["1f468-1f3fb-200d-1f3a8", "1f468-1f3fc-200d-1f3a8", "1f468-1f3fd-200d-1f3a8", "1f468-1f3fe-200d-1f3a8", "1f468-1f3ff-200d-1f3a8"] }, { "n": ["woman artist", "female-artist"], "u": "1f469-200d-1f3a8", "v": ["1f469-1f3fb-200d-1f3a8", "1f469-1f3fc-200d-1f3a8", "1f469-1f3fd-200d-1f3a8", "1f469-1f3fe-200d-1f3a8", "1f469-1f3ff-200d-1f3a8"] }, { "n": ["pilot"], "u": "1f9d1-200d-2708-fe0f", "v": ["1f9d1-1f3fb-200d-2708-fe0f", "1f9d1-1f3fc-200d-2708-fe0f", "1f9d1-1f3fd-200d-2708-fe0f", "1f9d1-1f3fe-200d-2708-fe0f", "1f9d1-1f3ff-200d-2708-fe0f"] }, { "n": ["man pilot", "male-pilot"], "u": "1f468-200d-2708-fe0f", "v": ["1f468-1f3fb-200d-2708-fe0f", "1f468-1f3fc-200d-2708-fe0f", "1f468-1f3fd-200d-2708-fe0f", "1f468-1f3fe-200d-2708-fe0f", "1f468-1f3ff-200d-2708-fe0f"] }, { "n": ["woman pilot", "female-pilot"], "u": "1f469-200d-2708-fe0f", "v": ["1f469-1f3fb-200d-2708-fe0f", "1f469-1f3fc-200d-2708-fe0f", "1f469-1f3fd-200d-2708-fe0f", "1f469-1f3fe-200d-2708-fe0f", "1f469-1f3ff-200d-2708-fe0f"] }, { "n": ["astronaut"], "u": "1f9d1-200d-1f680", "v": ["1f9d1-1f3fb-200d-1f680", "1f9d1-1f3fc-200d-1f680", "1f9d1-1f3fd-200d-1f680", "1f9d1-1f3fe-200d-1f680", "1f9d1-1f3ff-200d-1f680"] }, { "n": ["man astronaut", "male-astronaut"], "u": "1f468-200d-1f680", "v": ["1f468-1f3fb-200d-1f680", "1f468-1f3fc-200d-1f680", "1f468-1f3fd-200d-1f680", "1f468-1f3fe-200d-1f680", "1f468-1f3ff-200d-1f680"] }, { "n": ["woman astronaut", "female-astronaut"], "u": "1f469-200d-1f680", "v": ["1f469-1f3fb-200d-1f680", "1f469-1f3fc-200d-1f680", "1f469-1f3fd-200d-1f680", "1f469-1f3fe-200d-1f680", "1f469-1f3ff-200d-1f680"] }, { "n": ["firefighter"], "u": "1f9d1-200d-1f692", "v": ["1f9d1-1f3fb-200d-1f692", "1f9d1-1f3fc-200d-1f692", "1f9d1-1f3fd-200d-1f692", "1f9d1-1f3fe-200d-1f692", "1f9d1-1f3ff-200d-1f692"] }, { "n": ["man firefighter", "male-firefighter"], "u": "1f468-200d-1f692", "v": ["1f468-1f3fb-200d-1f692", "1f468-1f3fc-200d-1f692", "1f468-1f3fd-200d-1f692", "1f468-1f3fe-200d-1f692", "1f468-1f3ff-200d-1f692"] }, { "n": ["woman firefighter", "female-firefighter"], "u": "1f469-200d-1f692", "v": ["1f469-1f3fb-200d-1f692", "1f469-1f3fc-200d-1f692", "1f469-1f3fd-200d-1f692", "1f469-1f3fe-200d-1f692", "1f469-1f3ff-200d-1f692"] }, { "n": ["cop", "police officer"], "u": "1f46e", "v": ["1f46e-1f3fb", "1f46e-1f3fc", "1f46e-1f3fd", "1f46e-1f3fe", "1f46e-1f3ff"] }, { "n": ["man police officer", "male-police-officer"], "u": "1f46e-200d-2642-fe0f", "v": ["1f46e-1f3fb-200d-2642-fe0f", "1f46e-1f3fc-200d-2642-fe0f", "1f46e-1f3fd-200d-2642-fe0f", "1f46e-1f3fe-200d-2642-fe0f", "1f46e-1f3ff-200d-2642-fe0f"] }, { "n": ["woman police officer", "female-police-officer"], "u": "1f46e-200d-2640-fe0f", "v": ["1f46e-1f3fb-200d-2640-fe0f", "1f46e-1f3fc-200d-2640-fe0f", "1f46e-1f3fd-200d-2640-fe0f", "1f46e-1f3fe-200d-2640-fe0f", "1f46e-1f3ff-200d-2640-fe0f"] }, { "n": ["detective", "sleuth or spy"], "u": "1f575-fe0f", "v": ["1f575-1f3fb", "1f575-1f3fc", "1f575-1f3fd", "1f575-1f3fe", "1f575-1f3ff"] }, { "n": ["man detective", "male-detective"], "u": "1f575-fe0f-200d-2642-fe0f", "v": ["1f575-1f3fb-200d-2642-fe0f", "1f575-1f3fc-200d-2642-fe0f", "1f575-1f3fd-200d-2642-fe0f", "1f575-1f3fe-200d-2642-fe0f", "1f575-1f3ff-200d-2642-fe0f"] }, { "n": ["woman detective", "female-detective"], "u": "1f575-fe0f-200d-2640-fe0f", "v": ["1f575-1f3fb-200d-2640-fe0f", "1f575-1f3fc-200d-2640-fe0f", "1f575-1f3fd-200d-2640-fe0f", "1f575-1f3fe-200d-2640-fe0f", "1f575-1f3ff-200d-2640-fe0f"] }, { "n": ["guardsman"], "u": "1f482", "v": ["1f482-1f3fb", "1f482-1f3fc", "1f482-1f3fd", "1f482-1f3fe", "1f482-1f3ff"] }, { "n": ["man guard", "male-guard"], "u": "1f482-200d-2642-fe0f", "v": ["1f482-1f3fb-200d-2642-fe0f", "1f482-1f3fc-200d-2642-fe0f", "1f482-1f3fd-200d-2642-fe0f", "1f482-1f3fe-200d-2642-fe0f", "1f482-1f3ff-200d-2642-fe0f"] }, { "n": ["woman guard", "female-guard"], "u": "1f482-200d-2640-fe0f", "v": ["1f482-1f3fb-200d-2640-fe0f", "1f482-1f3fc-200d-2640-fe0f", "1f482-1f3fd-200d-2640-fe0f", "1f482-1f3fe-200d-2640-fe0f", "1f482-1f3ff-200d-2640-fe0f"] }, { "n": ["ninja"], "u": "1f977", "v": ["1f977-1f3fb", "1f977-1f3fc", "1f977-1f3fd", "1f977-1f3fe", "1f977-1f3ff"] }, { "n": ["construction worker"], "u": "1f477", "v": ["1f477-1f3fb", "1f477-1f3fc", "1f477-1f3fd", "1f477-1f3fe", "1f477-1f3ff"] }, { "n": ["man construction worker", "male-construction-worker"], "u": "1f477-200d-2642-fe0f", "v": ["1f477-1f3fb-200d-2642-fe0f", "1f477-1f3fc-200d-2642-fe0f", "1f477-1f3fd-200d-2642-fe0f", "1f477-1f3fe-200d-2642-fe0f", "1f477-1f3ff-200d-2642-fe0f"] }, { "n": ["woman construction worker", "female-construction-worker"], "u": "1f477-200d-2640-fe0f", "v": ["1f477-1f3fb-200d-2640-fe0f", "1f477-1f3fc-200d-2640-fe0f", "1f477-1f3fd-200d-2640-fe0f", "1f477-1f3fe-200d-2640-fe0f", "1f477-1f3ff-200d-2640-fe0f"] }, { "n": ["person with crown"], "u": "1fac5", "v": ["1fac5-1f3fb", "1fac5-1f3fc", "1fac5-1f3fd", "1fac5-1f3fe", "1fac5-1f3ff"] }, { "n": ["prince"], "u": "1f934", "v": ["1f934-1f3fb", "1f934-1f3fc", "1f934-1f3fd", "1f934-1f3fe", "1f934-1f3ff"] }, { "n": ["princess"], "u": "1f478", "v": ["1f478-1f3fb", "1f478-1f3fc", "1f478-1f3fd", "1f478-1f3fe", "1f478-1f3ff"] }, { "n": ["man with turban"], "u": "1f473", "v": ["1f473-1f3fb", "1f473-1f3fc", "1f473-1f3fd", "1f473-1f3fe", "1f473-1f3ff"] }, { "n": ["man wearing turban", "man-wearing-turban"], "u": "1f473-200d-2642-fe0f", "v": ["1f473-1f3fb-200d-2642-fe0f", "1f473-1f3fc-200d-2642-fe0f", "1f473-1f3fd-200d-2642-fe0f", "1f473-1f3fe-200d-2642-fe0f", "1f473-1f3ff-200d-2642-fe0f"] }, { "n": ["woman wearing turban", "woman-wearing-turban"], "u": "1f473-200d-2640-fe0f", "v": ["1f473-1f3fb-200d-2640-fe0f", "1f473-1f3fc-200d-2640-fe0f", "1f473-1f3fd-200d-2640-fe0f", "1f473-1f3fe-200d-2640-fe0f", "1f473-1f3ff-200d-2640-fe0f"] }, { "n": ["man with gua pi mao"], "u": "1f472", "v": ["1f472-1f3fb", "1f472-1f3fc", "1f472-1f3fd", "1f472-1f3fe", "1f472-1f3ff"] }, { "n": ["person with headscarf"], "u": "1f9d5", "v": ["1f9d5-1f3fb", "1f9d5-1f3fc", "1f9d5-1f3fd", "1f9d5-1f3fe", "1f9d5-1f3ff"] }, { "n": ["man in tuxedo", "person in tuxedo"], "u": "1f935", "v": ["1f935-1f3fb", "1f935-1f3fc", "1f935-1f3fd", "1f935-1f3fe", "1f935-1f3ff"] }, { "n": ["man in tuxedo"], "u": "1f935-200d-2642-fe0f", "v": ["1f935-1f3fb-200d-2642-fe0f", "1f935-1f3fc-200d-2642-fe0f", "1f935-1f3fd-200d-2642-fe0f", "1f935-1f3fe-200d-2642-fe0f", "1f935-1f3ff-200d-2642-fe0f"] }, { "n": ["woman in tuxedo"], "u": "1f935-200d-2640-fe0f", "v": ["1f935-1f3fb-200d-2640-fe0f", "1f935-1f3fc-200d-2640-fe0f", "1f935-1f3fd-200d-2640-fe0f", "1f935-1f3fe-200d-2640-fe0f", "1f935-1f3ff-200d-2640-fe0f"] }, { "n": ["bride with veil"], "u": "1f470", "v": ["1f470-1f3fb", "1f470-1f3fc", "1f470-1f3fd", "1f470-1f3fe", "1f470-1f3ff"] }, { "n": ["man with veil"], "u": "1f470-200d-2642-fe0f", "v": ["1f470-1f3fb-200d-2642-fe0f", "1f470-1f3fc-200d-2642-fe0f", "1f470-1f3fd-200d-2642-fe0f", "1f470-1f3fe-200d-2642-fe0f", "1f470-1f3ff-200d-2642-fe0f"] }, { "n": ["woman with veil"], "u": "1f470-200d-2640-fe0f", "v": ["1f470-1f3fb-200d-2640-fe0f", "1f470-1f3fc-200d-2640-fe0f", "1f470-1f3fd-200d-2640-fe0f", "1f470-1f3fe-200d-2640-fe0f", "1f470-1f3ff-200d-2640-fe0f"] }, { "n": ["pregnant woman"], "u": "1f930", "v": ["1f930-1f3fb", "1f930-1f3fc", "1f930-1f3fd", "1f930-1f3fe", "1f930-1f3ff"] }, { "n": ["pregnant man"], "u": "1fac3", "v": ["1fac3-1f3fb", "1fac3-1f3fc", "1fac3-1f3fd", "1fac3-1f3fe", "1fac3-1f3ff"] }, { "n": ["pregnant person"], "u": "1fac4", "v": ["1fac4-1f3fb", "1fac4-1f3fc", "1fac4-1f3fd", "1fac4-1f3fe", "1fac4-1f3ff"] }, { "n": ["breast-feeding"], "u": "1f931", "v": ["1f931-1f3fb", "1f931-1f3fc", "1f931-1f3fd", "1f931-1f3fe", "1f931-1f3ff"] }, { "n": ["woman feeding baby"], "u": "1f469-200d-1f37c", "v": ["1f469-1f3fb-200d-1f37c", "1f469-1f3fc-200d-1f37c", "1f469-1f3fd-200d-1f37c", "1f469-1f3fe-200d-1f37c", "1f469-1f3ff-200d-1f37c"] }, { "n": ["man feeding baby"], "u": "1f468-200d-1f37c", "v": ["1f468-1f3fb-200d-1f37c", "1f468-1f3fc-200d-1f37c", "1f468-1f3fd-200d-1f37c", "1f468-1f3fe-200d-1f37c", "1f468-1f3ff-200d-1f37c"] }, { "n": ["person feeding baby"], "u": "1f9d1-200d-1f37c", "v": ["1f9d1-1f3fb-200d-1f37c", "1f9d1-1f3fc-200d-1f37c", "1f9d1-1f3fd-200d-1f37c", "1f9d1-1f3fe-200d-1f37c", "1f9d1-1f3ff-200d-1f37c"] }, { "n": ["angel", "baby angel"], "u": "1f47c", "v": ["1f47c-1f3fb", "1f47c-1f3fc", "1f47c-1f3fd", "1f47c-1f3fe", "1f47c-1f3ff"] }, { "n": ["santa", "father christmas"], "u": "1f385", "v": ["1f385-1f3fb", "1f385-1f3fc", "1f385-1f3fd", "1f385-1f3fe", "1f385-1f3ff"] }, { "n": ["mrs claus", "mother christmas"], "u": "1f936", "v": ["1f936-1f3fb", "1f936-1f3fc", "1f936-1f3fd", "1f936-1f3fe", "1f936-1f3ff"] }, { "n": ["mx claus"], "u": "1f9d1-200d-1f384", "v": ["1f9d1-1f3fb-200d-1f384", "1f9d1-1f3fc-200d-1f384", "1f9d1-1f3fd-200d-1f384", "1f9d1-1f3fe-200d-1f384", "1f9d1-1f3ff-200d-1f384"] }, { "n": ["superhero"], "u": "1f9b8", "v": ["1f9b8-1f3fb", "1f9b8-1f3fc", "1f9b8-1f3fd", "1f9b8-1f3fe", "1f9b8-1f3ff"] }, { "n": ["man superhero", "male superhero"], "u": "1f9b8-200d-2642-fe0f", "v": ["1f9b8-1f3fb-200d-2642-fe0f", "1f9b8-1f3fc-200d-2642-fe0f", "1f9b8-1f3fd-200d-2642-fe0f", "1f9b8-1f3fe-200d-2642-fe0f", "1f9b8-1f3ff-200d-2642-fe0f"] }, { "n": ["woman superhero", "female superhero"], "u": "1f9b8-200d-2640-fe0f", "v": ["1f9b8-1f3fb-200d-2640-fe0f", "1f9b8-1f3fc-200d-2640-fe0f", "1f9b8-1f3fd-200d-2640-fe0f", "1f9b8-1f3fe-200d-2640-fe0f", "1f9b8-1f3ff-200d-2640-fe0f"] }, { "n": ["supervillain"], "u": "1f9b9", "v": ["1f9b9-1f3fb", "1f9b9-1f3fc", "1f9b9-1f3fd", "1f9b9-1f3fe", "1f9b9-1f3ff"] }, { "n": ["man supervillain", "male supervillain"], "u": "1f9b9-200d-2642-fe0f", "v": ["1f9b9-1f3fb-200d-2642-fe0f", "1f9b9-1f3fc-200d-2642-fe0f", "1f9b9-1f3fd-200d-2642-fe0f", "1f9b9-1f3fe-200d-2642-fe0f", "1f9b9-1f3ff-200d-2642-fe0f"] }, { "n": ["woman supervillain", "female supervillain"], "u": "1f9b9-200d-2640-fe0f", "v": ["1f9b9-1f3fb-200d-2640-fe0f", "1f9b9-1f3fc-200d-2640-fe0f", "1f9b9-1f3fd-200d-2640-fe0f", "1f9b9-1f3fe-200d-2640-fe0f", "1f9b9-1f3ff-200d-2640-fe0f"] }, { "n": ["mage"], "u": "1f9d9", "v": ["1f9d9-1f3fb", "1f9d9-1f3fc", "1f9d9-1f3fd", "1f9d9-1f3fe", "1f9d9-1f3ff"] }, { "n": ["man mage", "male mage"], "u": "1f9d9-200d-2642-fe0f", "v": ["1f9d9-1f3fb-200d-2642-fe0f", "1f9d9-1f3fc-200d-2642-fe0f", "1f9d9-1f3fd-200d-2642-fe0f", "1f9d9-1f3fe-200d-2642-fe0f", "1f9d9-1f3ff-200d-2642-fe0f"] }, { "n": ["woman mage", "female mage"], "u": "1f9d9-200d-2640-fe0f", "v": ["1f9d9-1f3fb-200d-2640-fe0f", "1f9d9-1f3fc-200d-2640-fe0f", "1f9d9-1f3fd-200d-2640-fe0f", "1f9d9-1f3fe-200d-2640-fe0f", "1f9d9-1f3ff-200d-2640-fe0f"] }, { "n": ["fairy"], "u": "1f9da", "v": ["1f9da-1f3fb", "1f9da-1f3fc", "1f9da-1f3fd", "1f9da-1f3fe", "1f9da-1f3ff"] }, { "n": ["man fairy", "male fairy"], "u": "1f9da-200d-2642-fe0f", "v": ["1f9da-1f3fb-200d-2642-fe0f", "1f9da-1f3fc-200d-2642-fe0f", "1f9da-1f3fd-200d-2642-fe0f", "1f9da-1f3fe-200d-2642-fe0f", "1f9da-1f3ff-200d-2642-fe0f"] }, { "n": ["woman fairy", "female fairy"], "u": "1f9da-200d-2640-fe0f", "v": ["1f9da-1f3fb-200d-2640-fe0f", "1f9da-1f3fc-200d-2640-fe0f", "1f9da-1f3fd-200d-2640-fe0f", "1f9da-1f3fe-200d-2640-fe0f", "1f9da-1f3ff-200d-2640-fe0f"] }, { "n": ["vampire"], "u": "1f9db", "v": ["1f9db-1f3fb", "1f9db-1f3fc", "1f9db-1f3fd", "1f9db-1f3fe", "1f9db-1f3ff"] }, { "n": ["man vampire", "male vampire"], "u": "1f9db-200d-2642-fe0f", "v": ["1f9db-1f3fb-200d-2642-fe0f", "1f9db-1f3fc-200d-2642-fe0f", "1f9db-1f3fd-200d-2642-fe0f", "1f9db-1f3fe-200d-2642-fe0f", "1f9db-1f3ff-200d-2642-fe0f"] }, { "n": ["woman vampire", "female vampire"], "u": "1f9db-200d-2640-fe0f", "v": ["1f9db-1f3fb-200d-2640-fe0f", "1f9db-1f3fc-200d-2640-fe0f", "1f9db-1f3fd-200d-2640-fe0f", "1f9db-1f3fe-200d-2640-fe0f", "1f9db-1f3ff-200d-2640-fe0f"] }, { "n": ["merperson"], "u": "1f9dc", "v": ["1f9dc-1f3fb", "1f9dc-1f3fc", "1f9dc-1f3fd", "1f9dc-1f3fe", "1f9dc-1f3ff"] }, { "n": ["merman"], "u": "1f9dc-200d-2642-fe0f", "v": ["1f9dc-1f3fb-200d-2642-fe0f", "1f9dc-1f3fc-200d-2642-fe0f", "1f9dc-1f3fd-200d-2642-fe0f", "1f9dc-1f3fe-200d-2642-fe0f", "1f9dc-1f3ff-200d-2642-fe0f"] }, { "n": ["mermaid"], "u": "1f9dc-200d-2640-fe0f", "v": ["1f9dc-1f3fb-200d-2640-fe0f", "1f9dc-1f3fc-200d-2640-fe0f", "1f9dc-1f3fd-200d-2640-fe0f", "1f9dc-1f3fe-200d-2640-fe0f", "1f9dc-1f3ff-200d-2640-fe0f"] }, { "n": ["elf"], "u": "1f9dd", "v": ["1f9dd-1f3fb", "1f9dd-1f3fc", "1f9dd-1f3fd", "1f9dd-1f3fe", "1f9dd-1f3ff"] }, { "n": ["man elf", "male elf"], "u": "1f9dd-200d-2642-fe0f", "v": ["1f9dd-1f3fb-200d-2642-fe0f", "1f9dd-1f3fc-200d-2642-fe0f", "1f9dd-1f3fd-200d-2642-fe0f", "1f9dd-1f3fe-200d-2642-fe0f", "1f9dd-1f3ff-200d-2642-fe0f"] }, { "n": ["woman elf", "female elf"], "u": "1f9dd-200d-2640-fe0f", "v": ["1f9dd-1f3fb-200d-2640-fe0f", "1f9dd-1f3fc-200d-2640-fe0f", "1f9dd-1f3fd-200d-2640-fe0f", "1f9dd-1f3fe-200d-2640-fe0f", "1f9dd-1f3ff-200d-2640-fe0f"] }, { "n": ["genie"], "u": "1f9de" }, { "n": ["man genie", "male genie"], "u": "1f9de-200d-2642-fe0f" }, { "n": ["woman genie", "female genie"], "u": "1f9de-200d-2640-fe0f" }, { "n": ["zombie"], "u": "1f9df" }, { "n": ["man zombie", "male zombie"], "u": "1f9df-200d-2642-fe0f" }, { "n": ["woman zombie", "female zombie"], "u": "1f9df-200d-2640-fe0f" }, { "n": ["troll"], "u": "1f9cc" }, { "n": ["massage", "face massage"], "u": "1f486", "v": ["1f486-1f3fb", "1f486-1f3fc", "1f486-1f3fd", "1f486-1f3fe", "1f486-1f3ff"] }, { "n": ["man getting massage", "man-getting-massage"], "u": "1f486-200d-2642-fe0f", "v": ["1f486-1f3fb-200d-2642-fe0f", "1f486-1f3fc-200d-2642-fe0f", "1f486-1f3fd-200d-2642-fe0f", "1f486-1f3fe-200d-2642-fe0f", "1f486-1f3ff-200d-2642-fe0f"] }, { "n": ["woman getting massage", "woman-getting-massage"], "u": "1f486-200d-2640-fe0f", "v": ["1f486-1f3fb-200d-2640-fe0f", "1f486-1f3fc-200d-2640-fe0f", "1f486-1f3fd-200d-2640-fe0f", "1f486-1f3fe-200d-2640-fe0f", "1f486-1f3ff-200d-2640-fe0f"] }, { "n": ["haircut"], "u": "1f487", "v": ["1f487-1f3fb", "1f487-1f3fc", "1f487-1f3fd", "1f487-1f3fe", "1f487-1f3ff"] }, { "n": ["man getting haircut", "man-getting-haircut"], "u": "1f487-200d-2642-fe0f", "v": ["1f487-1f3fb-200d-2642-fe0f", "1f487-1f3fc-200d-2642-fe0f", "1f487-1f3fd-200d-2642-fe0f", "1f487-1f3fe-200d-2642-fe0f", "1f487-1f3ff-200d-2642-fe0f"] }, { "n": ["woman getting haircut", "woman-getting-haircut"], "u": "1f487-200d-2640-fe0f", "v": ["1f487-1f3fb-200d-2640-fe0f", "1f487-1f3fc-200d-2640-fe0f", "1f487-1f3fd-200d-2640-fe0f", "1f487-1f3fe-200d-2640-fe0f", "1f487-1f3ff-200d-2640-fe0f"] }, { "n": ["walking", "pedestrian"], "u": "1f6b6", "v": ["1f6b6-1f3fb", "1f6b6-1f3fc", "1f6b6-1f3fd", "1f6b6-1f3fe", "1f6b6-1f3ff"] }, { "n": ["man walking", "man-walking"], "u": "1f6b6-200d-2642-fe0f", "v": ["1f6b6-1f3fb-200d-2642-fe0f", "1f6b6-1f3fc-200d-2642-fe0f", "1f6b6-1f3fd-200d-2642-fe0f", "1f6b6-1f3fe-200d-2642-fe0f", "1f6b6-1f3ff-200d-2642-fe0f"] }, { "n": ["woman walking", "woman-walking"], "u": "1f6b6-200d-2640-fe0f", "v": ["1f6b6-1f3fb-200d-2640-fe0f", "1f6b6-1f3fc-200d-2640-fe0f", "1f6b6-1f3fd-200d-2640-fe0f", "1f6b6-1f3fe-200d-2640-fe0f", "1f6b6-1f3ff-200d-2640-fe0f"] }, { "n": ["standing person"], "u": "1f9cd", "v": ["1f9cd-1f3fb", "1f9cd-1f3fc", "1f9cd-1f3fd", "1f9cd-1f3fe", "1f9cd-1f3ff"] }, { "n": ["man standing"], "u": "1f9cd-200d-2642-fe0f", "v": ["1f9cd-1f3fb-200d-2642-fe0f", "1f9cd-1f3fc-200d-2642-fe0f", "1f9cd-1f3fd-200d-2642-fe0f", "1f9cd-1f3fe-200d-2642-fe0f", "1f9cd-1f3ff-200d-2642-fe0f"] }, { "n": ["woman standing"], "u": "1f9cd-200d-2640-fe0f", "v": ["1f9cd-1f3fb-200d-2640-fe0f", "1f9cd-1f3fc-200d-2640-fe0f", "1f9cd-1f3fd-200d-2640-fe0f", "1f9cd-1f3fe-200d-2640-fe0f", "1f9cd-1f3ff-200d-2640-fe0f"] }, { "n": ["kneeling person"], "u": "1f9ce", "v": ["1f9ce-1f3fb", "1f9ce-1f3fc", "1f9ce-1f3fd", "1f9ce-1f3fe", "1f9ce-1f3ff"] }, { "n": ["man kneeling"], "u": "1f9ce-200d-2642-fe0f", "v": ["1f9ce-1f3fb-200d-2642-fe0f", "1f9ce-1f3fc-200d-2642-fe0f", "1f9ce-1f3fd-200d-2642-fe0f", "1f9ce-1f3fe-200d-2642-fe0f", "1f9ce-1f3ff-200d-2642-fe0f"] }, { "n": ["woman kneeling"], "u": "1f9ce-200d-2640-fe0f", "v": ["1f9ce-1f3fb-200d-2640-fe0f", "1f9ce-1f3fc-200d-2640-fe0f", "1f9ce-1f3fd-200d-2640-fe0f", "1f9ce-1f3fe-200d-2640-fe0f", "1f9ce-1f3ff-200d-2640-fe0f"] }, { "n": ["person with white cane", "person with probing cane"], "u": "1f9d1-200d-1f9af", "v": ["1f9d1-1f3fb-200d-1f9af", "1f9d1-1f3fc-200d-1f9af", "1f9d1-1f3fd-200d-1f9af", "1f9d1-1f3fe-200d-1f9af", "1f9d1-1f3ff-200d-1f9af"] }, { "n": ["man with white cane", "man with probing cane"], "u": "1f468-200d-1f9af", "v": ["1f468-1f3fb-200d-1f9af", "1f468-1f3fc-200d-1f9af", "1f468-1f3fd-200d-1f9af", "1f468-1f3fe-200d-1f9af", "1f468-1f3ff-200d-1f9af"] }, { "n": ["woman with white cane", "woman with probing cane"], "u": "1f469-200d-1f9af", "v": ["1f469-1f3fb-200d-1f9af", "1f469-1f3fc-200d-1f9af", "1f469-1f3fd-200d-1f9af", "1f469-1f3fe-200d-1f9af", "1f469-1f3ff-200d-1f9af"] }, { "n": ["person in motorized wheelchair"], "u": "1f9d1-200d-1f9bc", "v": ["1f9d1-1f3fb-200d-1f9bc", "1f9d1-1f3fc-200d-1f9bc", "1f9d1-1f3fd-200d-1f9bc", "1f9d1-1f3fe-200d-1f9bc", "1f9d1-1f3ff-200d-1f9bc"] }, { "n": ["man in motorized wheelchair"], "u": "1f468-200d-1f9bc", "v": ["1f468-1f3fb-200d-1f9bc", "1f468-1f3fc-200d-1f9bc", "1f468-1f3fd-200d-1f9bc", "1f468-1f3fe-200d-1f9bc", "1f468-1f3ff-200d-1f9bc"] }, { "n": ["woman in motorized wheelchair"], "u": "1f469-200d-1f9bc", "v": ["1f469-1f3fb-200d-1f9bc", "1f469-1f3fc-200d-1f9bc", "1f469-1f3fd-200d-1f9bc", "1f469-1f3fe-200d-1f9bc", "1f469-1f3ff-200d-1f9bc"] }, { "n": ["person in manual wheelchair"], "u": "1f9d1-200d-1f9bd", "v": ["1f9d1-1f3fb-200d-1f9bd", "1f9d1-1f3fc-200d-1f9bd", "1f9d1-1f3fd-200d-1f9bd", "1f9d1-1f3fe-200d-1f9bd", "1f9d1-1f3ff-200d-1f9bd"] }, { "n": ["man in manual wheelchair"], "u": "1f468-200d-1f9bd", "v": ["1f468-1f3fb-200d-1f9bd", "1f468-1f3fc-200d-1f9bd", "1f468-1f3fd-200d-1f9bd", "1f468-1f3fe-200d-1f9bd", "1f468-1f3ff-200d-1f9bd"] }, { "n": ["woman in manual wheelchair"], "u": "1f469-200d-1f9bd", "v": ["1f469-1f3fb-200d-1f9bd", "1f469-1f3fc-200d-1f9bd", "1f469-1f3fd-200d-1f9bd", "1f469-1f3fe-200d-1f9bd", "1f469-1f3ff-200d-1f9bd"] }, { "n": ["runner", "running"], "u": "1f3c3", "v": ["1f3c3-1f3fb", "1f3c3-1f3fc", "1f3c3-1f3fd", "1f3c3-1f3fe", "1f3c3-1f3ff"] }, { "n": ["man running", "man-running"], "u": "1f3c3-200d-2642-fe0f", "v": ["1f3c3-1f3fb-200d-2642-fe0f", "1f3c3-1f3fc-200d-2642-fe0f", "1f3c3-1f3fd-200d-2642-fe0f", "1f3c3-1f3fe-200d-2642-fe0f", "1f3c3-1f3ff-200d-2642-fe0f"] }, { "n": ["woman running", "woman-running"], "u": "1f3c3-200d-2640-fe0f", "v": ["1f3c3-1f3fb-200d-2640-fe0f", "1f3c3-1f3fc-200d-2640-fe0f", "1f3c3-1f3fd-200d-2640-fe0f", "1f3c3-1f3fe-200d-2640-fe0f", "1f3c3-1f3ff-200d-2640-fe0f"] }, { "n": ["dancer"], "u": "1f483", "v": ["1f483-1f3fb", "1f483-1f3fc", "1f483-1f3fd", "1f483-1f3fe", "1f483-1f3ff"] }, { "n": ["man dancing"], "u": "1f57a", "v": ["1f57a-1f3fb", "1f57a-1f3fc", "1f57a-1f3fd", "1f57a-1f3fe", "1f57a-1f3ff"] }, { "n": ["person in suit levitating", "man in business suit levitating"], "u": "1f574-fe0f", "v": ["1f574-1f3fb", "1f574-1f3fc", "1f574-1f3fd", "1f574-1f3fe", "1f574-1f3ff"] }, { "n": ["dancers", "woman with bunny ears"], "u": "1f46f" }, { "n": ["men with bunny ears", "men-with-bunny-ears-partying", "man-with-bunny-ears-partying"], "u": "1f46f-200d-2642-fe0f" }, { "n": ["women with bunny ears", "women-with-bunny-ears-partying", "woman-with-bunny-ears-partying"], "u": "1f46f-200d-2640-fe0f" }, { "n": ["person in steamy room"], "u": "1f9d6", "v": ["1f9d6-1f3fb", "1f9d6-1f3fc", "1f9d6-1f3fd", "1f9d6-1f3fe", "1f9d6-1f3ff"] }, { "n": ["man in steamy room"], "u": "1f9d6-200d-2642-fe0f", "v": ["1f9d6-1f3fb-200d-2642-fe0f", "1f9d6-1f3fc-200d-2642-fe0f", "1f9d6-1f3fd-200d-2642-fe0f", "1f9d6-1f3fe-200d-2642-fe0f", "1f9d6-1f3ff-200d-2642-fe0f"] }, { "n": ["woman in steamy room"], "u": "1f9d6-200d-2640-fe0f", "v": ["1f9d6-1f3fb-200d-2640-fe0f", "1f9d6-1f3fc-200d-2640-fe0f", "1f9d6-1f3fd-200d-2640-fe0f", "1f9d6-1f3fe-200d-2640-fe0f", "1f9d6-1f3ff-200d-2640-fe0f"] }, { "n": ["person climbing"], "u": "1f9d7", "v": ["1f9d7-1f3fb", "1f9d7-1f3fc", "1f9d7-1f3fd", "1f9d7-1f3fe", "1f9d7-1f3ff"] }, { "n": ["man climbing"], "u": "1f9d7-200d-2642-fe0f", "v": ["1f9d7-1f3fb-200d-2642-fe0f", "1f9d7-1f3fc-200d-2642-fe0f", "1f9d7-1f3fd-200d-2642-fe0f", "1f9d7-1f3fe-200d-2642-fe0f", "1f9d7-1f3ff-200d-2642-fe0f"] }, { "n": ["woman climbing"], "u": "1f9d7-200d-2640-fe0f", "v": ["1f9d7-1f3fb-200d-2640-fe0f", "1f9d7-1f3fc-200d-2640-fe0f", "1f9d7-1f3fd-200d-2640-fe0f", "1f9d7-1f3fe-200d-2640-fe0f", "1f9d7-1f3ff-200d-2640-fe0f"] }, { "n": ["fencer"], "u": "1f93a" }, { "n": ["horse racing"], "u": "1f3c7", "v": ["1f3c7-1f3fb", "1f3c7-1f3fc", "1f3c7-1f3fd", "1f3c7-1f3fe", "1f3c7-1f3ff"] }, { "n": ["skier"], "u": "26f7-fe0f" }, { "n": ["snowboarder"], "u": "1f3c2", "v": ["1f3c2-1f3fb", "1f3c2-1f3fc", "1f3c2-1f3fd", "1f3c2-1f3fe", "1f3c2-1f3ff"] }, { "n": ["golfer", "person golfing"], "u": "1f3cc-fe0f", "v": ["1f3cc-1f3fb", "1f3cc-1f3fc", "1f3cc-1f3fd", "1f3cc-1f3fe", "1f3cc-1f3ff"] }, { "n": ["man golfing", "man-golfing"], "u": "1f3cc-fe0f-200d-2642-fe0f", "v": ["1f3cc-1f3fb-200d-2642-fe0f", "1f3cc-1f3fc-200d-2642-fe0f", "1f3cc-1f3fd-200d-2642-fe0f", "1f3cc-1f3fe-200d-2642-fe0f", "1f3cc-1f3ff-200d-2642-fe0f"] }, { "n": ["woman golfing", "woman-golfing"], "u": "1f3cc-fe0f-200d-2640-fe0f", "v": ["1f3cc-1f3fb-200d-2640-fe0f", "1f3cc-1f3fc-200d-2640-fe0f", "1f3cc-1f3fd-200d-2640-fe0f", "1f3cc-1f3fe-200d-2640-fe0f", "1f3cc-1f3ff-200d-2640-fe0f"] }, { "n": ["surfer"], "u": "1f3c4", "v": ["1f3c4-1f3fb", "1f3c4-1f3fc", "1f3c4-1f3fd", "1f3c4-1f3fe", "1f3c4-1f3ff"] }, { "n": ["man surfing", "man-surfing"], "u": "1f3c4-200d-2642-fe0f", "v": ["1f3c4-1f3fb-200d-2642-fe0f", "1f3c4-1f3fc-200d-2642-fe0f", "1f3c4-1f3fd-200d-2642-fe0f", "1f3c4-1f3fe-200d-2642-fe0f", "1f3c4-1f3ff-200d-2642-fe0f"] }, { "n": ["woman surfing", "woman-surfing"], "u": "1f3c4-200d-2640-fe0f", "v": ["1f3c4-1f3fb-200d-2640-fe0f", "1f3c4-1f3fc-200d-2640-fe0f", "1f3c4-1f3fd-200d-2640-fe0f", "1f3c4-1f3fe-200d-2640-fe0f", "1f3c4-1f3ff-200d-2640-fe0f"] }, { "n": ["rowboat"], "u": "1f6a3", "v": ["1f6a3-1f3fb", "1f6a3-1f3fc", "1f6a3-1f3fd", "1f6a3-1f3fe", "1f6a3-1f3ff"] }, { "n": ["man rowing boat", "man-rowing-boat"], "u": "1f6a3-200d-2642-fe0f", "v": ["1f6a3-1f3fb-200d-2642-fe0f", "1f6a3-1f3fc-200d-2642-fe0f", "1f6a3-1f3fd-200d-2642-fe0f", "1f6a3-1f3fe-200d-2642-fe0f", "1f6a3-1f3ff-200d-2642-fe0f"] }, { "n": ["woman rowing boat", "woman-rowing-boat"], "u": "1f6a3-200d-2640-fe0f", "v": ["1f6a3-1f3fb-200d-2640-fe0f", "1f6a3-1f3fc-200d-2640-fe0f", "1f6a3-1f3fd-200d-2640-fe0f", "1f6a3-1f3fe-200d-2640-fe0f", "1f6a3-1f3ff-200d-2640-fe0f"] }, { "n": ["swimmer"], "u": "1f3ca", "v": ["1f3ca-1f3fb", "1f3ca-1f3fc", "1f3ca-1f3fd", "1f3ca-1f3fe", "1f3ca-1f3ff"] }, { "n": ["man swimming", "man-swimming"], "u": "1f3ca-200d-2642-fe0f", "v": ["1f3ca-1f3fb-200d-2642-fe0f", "1f3ca-1f3fc-200d-2642-fe0f", "1f3ca-1f3fd-200d-2642-fe0f", "1f3ca-1f3fe-200d-2642-fe0f", "1f3ca-1f3ff-200d-2642-fe0f"] }, { "n": ["woman swimming", "woman-swimming"], "u": "1f3ca-200d-2640-fe0f", "v": ["1f3ca-1f3fb-200d-2640-fe0f", "1f3ca-1f3fc-200d-2640-fe0f", "1f3ca-1f3fd-200d-2640-fe0f", "1f3ca-1f3fe-200d-2640-fe0f", "1f3ca-1f3ff-200d-2640-fe0f"] }, { "n": ["person with ball", "person bouncing ball"], "u": "26f9-fe0f", "v": ["26f9-1f3fb", "26f9-1f3fc", "26f9-1f3fd", "26f9-1f3fe", "26f9-1f3ff"] }, { "n": ["man bouncing ball", "man-bouncing-ball"], "u": "26f9-fe0f-200d-2642-fe0f", "v": ["26f9-1f3fb-200d-2642-fe0f", "26f9-1f3fc-200d-2642-fe0f", "26f9-1f3fd-200d-2642-fe0f", "26f9-1f3fe-200d-2642-fe0f", "26f9-1f3ff-200d-2642-fe0f"] }, { "n": ["woman bouncing ball", "woman-bouncing-ball"], "u": "26f9-fe0f-200d-2640-fe0f", "v": ["26f9-1f3fb-200d-2640-fe0f", "26f9-1f3fc-200d-2640-fe0f", "26f9-1f3fd-200d-2640-fe0f", "26f9-1f3fe-200d-2640-fe0f", "26f9-1f3ff-200d-2640-fe0f"] }, { "n": ["weight lifter", "person lifting weights"], "u": "1f3cb-fe0f", "v": ["1f3cb-1f3fb", "1f3cb-1f3fc", "1f3cb-1f3fd", "1f3cb-1f3fe", "1f3cb-1f3ff"] }, { "n": ["man lifting weights", "man-lifting-weights"], "u": "1f3cb-fe0f-200d-2642-fe0f", "v": ["1f3cb-1f3fb-200d-2642-fe0f", "1f3cb-1f3fc-200d-2642-fe0f", "1f3cb-1f3fd-200d-2642-fe0f", "1f3cb-1f3fe-200d-2642-fe0f", "1f3cb-1f3ff-200d-2642-fe0f"] }, { "n": ["woman lifting weights", "woman-lifting-weights"], "u": "1f3cb-fe0f-200d-2640-fe0f", "v": ["1f3cb-1f3fb-200d-2640-fe0f", "1f3cb-1f3fc-200d-2640-fe0f", "1f3cb-1f3fd-200d-2640-fe0f", "1f3cb-1f3fe-200d-2640-fe0f", "1f3cb-1f3ff-200d-2640-fe0f"] }, { "n": ["bicyclist"], "u": "1f6b4", "v": ["1f6b4-1f3fb", "1f6b4-1f3fc", "1f6b4-1f3fd", "1f6b4-1f3fe", "1f6b4-1f3ff"] }, { "n": ["man biking", "man-biking"], "u": "1f6b4-200d-2642-fe0f", "v": ["1f6b4-1f3fb-200d-2642-fe0f", "1f6b4-1f3fc-200d-2642-fe0f", "1f6b4-1f3fd-200d-2642-fe0f", "1f6b4-1f3fe-200d-2642-fe0f", "1f6b4-1f3ff-200d-2642-fe0f"] }, { "n": ["woman biking", "woman-biking"], "u": "1f6b4-200d-2640-fe0f", "v": ["1f6b4-1f3fb-200d-2640-fe0f", "1f6b4-1f3fc-200d-2640-fe0f", "1f6b4-1f3fd-200d-2640-fe0f", "1f6b4-1f3fe-200d-2640-fe0f", "1f6b4-1f3ff-200d-2640-fe0f"] }, { "n": ["mountain bicyclist"], "u": "1f6b5", "v": ["1f6b5-1f3fb", "1f6b5-1f3fc", "1f6b5-1f3fd", "1f6b5-1f3fe", "1f6b5-1f3ff"] }, { "n": ["man mountain biking", "man-mountain-biking"], "u": "1f6b5-200d-2642-fe0f", "v": ["1f6b5-1f3fb-200d-2642-fe0f", "1f6b5-1f3fc-200d-2642-fe0f", "1f6b5-1f3fd-200d-2642-fe0f", "1f6b5-1f3fe-200d-2642-fe0f", "1f6b5-1f3ff-200d-2642-fe0f"] }, { "n": ["woman mountain biking", "woman-mountain-biking"], "u": "1f6b5-200d-2640-fe0f", "v": ["1f6b5-1f3fb-200d-2640-fe0f", "1f6b5-1f3fc-200d-2640-fe0f", "1f6b5-1f3fd-200d-2640-fe0f", "1f6b5-1f3fe-200d-2640-fe0f", "1f6b5-1f3ff-200d-2640-fe0f"] }, { "n": ["person doing cartwheel"], "u": "1f938", "v": ["1f938-1f3fb", "1f938-1f3fc", "1f938-1f3fd", "1f938-1f3fe", "1f938-1f3ff"] }, { "n": ["man cartwheeling", "man-cartwheeling"], "u": "1f938-200d-2642-fe0f", "v": ["1f938-1f3fb-200d-2642-fe0f", "1f938-1f3fc-200d-2642-fe0f", "1f938-1f3fd-200d-2642-fe0f", "1f938-1f3fe-200d-2642-fe0f", "1f938-1f3ff-200d-2642-fe0f"] }, { "n": ["woman cartwheeling", "woman-cartwheeling"], "u": "1f938-200d-2640-fe0f", "v": ["1f938-1f3fb-200d-2640-fe0f", "1f938-1f3fc-200d-2640-fe0f", "1f938-1f3fd-200d-2640-fe0f", "1f938-1f3fe-200d-2640-fe0f", "1f938-1f3ff-200d-2640-fe0f"] }, { "n": ["wrestlers"], "u": "1f93c" }, { "n": ["men wrestling", "man-wrestling"], "u": "1f93c-200d-2642-fe0f" }, { "n": ["women wrestling", "woman-wrestling"], "u": "1f93c-200d-2640-fe0f" }, { "n": ["water polo"], "u": "1f93d", "v": ["1f93d-1f3fb", "1f93d-1f3fc", "1f93d-1f3fd", "1f93d-1f3fe", "1f93d-1f3ff"] }, { "n": ["man playing water polo", "man-playing-water-polo"], "u": "1f93d-200d-2642-fe0f", "v": ["1f93d-1f3fb-200d-2642-fe0f", "1f93d-1f3fc-200d-2642-fe0f", "1f93d-1f3fd-200d-2642-fe0f", "1f93d-1f3fe-200d-2642-fe0f", "1f93d-1f3ff-200d-2642-fe0f"] }, { "n": ["woman playing water polo", "woman-playing-water-polo"], "u": "1f93d-200d-2640-fe0f", "v": ["1f93d-1f3fb-200d-2640-fe0f", "1f93d-1f3fc-200d-2640-fe0f", "1f93d-1f3fd-200d-2640-fe0f", "1f93d-1f3fe-200d-2640-fe0f", "1f93d-1f3ff-200d-2640-fe0f"] }, { "n": ["handball"], "u": "1f93e", "v": ["1f93e-1f3fb", "1f93e-1f3fc", "1f93e-1f3fd", "1f93e-1f3fe", "1f93e-1f3ff"] }, { "n": ["man playing handball", "man-playing-handball"], "u": "1f93e-200d-2642-fe0f", "v": ["1f93e-1f3fb-200d-2642-fe0f", "1f93e-1f3fc-200d-2642-fe0f", "1f93e-1f3fd-200d-2642-fe0f", "1f93e-1f3fe-200d-2642-fe0f", "1f93e-1f3ff-200d-2642-fe0f"] }, { "n": ["woman playing handball", "woman-playing-handball"], "u": "1f93e-200d-2640-fe0f", "v": ["1f93e-1f3fb-200d-2640-fe0f", "1f93e-1f3fc-200d-2640-fe0f", "1f93e-1f3fd-200d-2640-fe0f", "1f93e-1f3fe-200d-2640-fe0f", "1f93e-1f3ff-200d-2640-fe0f"] }, { "n": ["juggling"], "u": "1f939", "v": ["1f939-1f3fb", "1f939-1f3fc", "1f939-1f3fd", "1f939-1f3fe", "1f939-1f3ff"] }, { "n": ["man juggling", "man-juggling"], "u": "1f939-200d-2642-fe0f", "v": ["1f939-1f3fb-200d-2642-fe0f", "1f939-1f3fc-200d-2642-fe0f", "1f939-1f3fd-200d-2642-fe0f", "1f939-1f3fe-200d-2642-fe0f", "1f939-1f3ff-200d-2642-fe0f"] }, { "n": ["woman juggling", "woman-juggling"], "u": "1f939-200d-2640-fe0f", "v": ["1f939-1f3fb-200d-2640-fe0f", "1f939-1f3fc-200d-2640-fe0f", "1f939-1f3fd-200d-2640-fe0f", "1f939-1f3fe-200d-2640-fe0f", "1f939-1f3ff-200d-2640-fe0f"] }, { "n": ["person in lotus position"], "u": "1f9d8", "v": ["1f9d8-1f3fb", "1f9d8-1f3fc", "1f9d8-1f3fd", "1f9d8-1f3fe", "1f9d8-1f3ff"] }, { "n": ["man in lotus position"], "u": "1f9d8-200d-2642-fe0f", "v": ["1f9d8-1f3fb-200d-2642-fe0f", "1f9d8-1f3fc-200d-2642-fe0f", "1f9d8-1f3fd-200d-2642-fe0f", "1f9d8-1f3fe-200d-2642-fe0f", "1f9d8-1f3ff-200d-2642-fe0f"] }, { "n": ["woman in lotus position"], "u": "1f9d8-200d-2640-fe0f", "v": ["1f9d8-1f3fb-200d-2640-fe0f", "1f9d8-1f3fc-200d-2640-fe0f", "1f9d8-1f3fd-200d-2640-fe0f", "1f9d8-1f3fe-200d-2640-fe0f", "1f9d8-1f3ff-200d-2640-fe0f"] }, { "n": ["bath"], "u": "1f6c0", "v": ["1f6c0-1f3fb", "1f6c0-1f3fc", "1f6c0-1f3fd", "1f6c0-1f3fe", "1f6c0-1f3ff"] }, { "n": ["sleeping accommodation"], "u": "1f6cc", "v": ["1f6cc-1f3fb", "1f6cc-1f3fc", "1f6cc-1f3fd", "1f6cc-1f3fe", "1f6cc-1f3ff"] }, { "n": ["people holding hands"], "u": "1f9d1-200d-1f91d-200d-1f9d1", "v": ["1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff"] }, { "n": ["women holding hands", "two women holding hands"], "u": "1f46d", "v": ["1f46d-1f3fb", "1f46d-1f3fc", "1f46d-1f3fd", "1f46d-1f3fe", "1f46d-1f3ff", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe"] }, { "n": ["couple", "man and woman holding hands", "woman and man holding hands"], "u": "1f46b", "v": ["1f46b-1f3fb", "1f46b-1f3fc", "1f46b-1f3fd", "1f46b-1f3fe", "1f46b-1f3ff", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe"] }, { "n": ["men holding hands", "two men holding hands"], "u": "1f46c", "v": ["1f46c-1f3fb", "1f46c-1f3fc", "1f46c-1f3fd", "1f46c-1f3fe", "1f46c-1f3ff", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe"] }, { "n": ["kiss", "couplekiss"], "u": "1f48f", "v": ["1f48f-1f3fb", "1f48f-1f3fc", "1f48f-1f3fd", "1f48f-1f3fe", "1f48f-1f3ff", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe"] }, { "n": ["woman-kiss-man", "kiss: woman, man"], "u": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f468", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"] }, { "n": ["man-kiss-man", "kiss: man, man"], "u": "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468", "v": ["1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"] }, { "n": ["woman-kiss-woman", "kiss: woman, woman"], "u": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff"] }, { "n": ["couple with heart"], "u": "1f491", "v": ["1f491-1f3fb", "1f491-1f3fc", "1f491-1f3fd", "1f491-1f3fe", "1f491-1f3ff", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe"] }, { "n": ["woman-heart-man", "couple with heart: woman, man"], "u": "1f469-200d-2764-fe0f-200d-1f468", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"] }, { "n": ["man-heart-man", "couple with heart: man, man"], "u": "1f468-200d-2764-fe0f-200d-1f468", "v": ["1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"] }, { "n": ["woman-heart-woman", "couple with heart: woman, woman"], "u": "1f469-200d-2764-fe0f-200d-1f469", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff"] }, { "n": ["family"], "u": "1f46a" }, { "n": ["man-woman-boy", "family: man, woman, boy"], "u": "1f468-200d-1f469-200d-1f466" }, { "n": ["man-woman-girl", "family: man, woman, girl"], "u": "1f468-200d-1f469-200d-1f467" }, { "n": ["man-woman-girl-boy", "family: man, woman, girl, boy"], "u": "1f468-200d-1f469-200d-1f467-200d-1f466" }, { "n": ["man-woman-boy-boy", "family: man, woman, boy, boy"], "u": "1f468-200d-1f469-200d-1f466-200d-1f466" }, { "n": ["man-woman-girl-girl", "family: man, woman, girl, girl"], "u": "1f468-200d-1f469-200d-1f467-200d-1f467" }, { "n": ["man-man-boy", "family: man, man, boy"], "u": "1f468-200d-1f468-200d-1f466" }, { "n": ["man-man-girl", "family: man, man, girl"], "u": "1f468-200d-1f468-200d-1f467" }, { "n": ["man-man-girl-boy", "family: man, man, girl, boy"], "u": "1f468-200d-1f468-200d-1f467-200d-1f466" }, { "n": ["man-man-boy-boy", "family: man, man, boy, boy"], "u": "1f468-200d-1f468-200d-1f466-200d-1f466" }, { "n": ["man-man-girl-girl", "family: man, man, girl, girl"], "u": "1f468-200d-1f468-200d-1f467-200d-1f467" }, { "n": ["woman-woman-boy", "family: woman, woman, boy"], "u": "1f469-200d-1f469-200d-1f466" }, { "n": ["woman-woman-girl", "family: woman, woman, girl"], "u": "1f469-200d-1f469-200d-1f467" }, { "n": ["woman-woman-girl-boy", "family: woman, woman, girl, boy"], "u": "1f469-200d-1f469-200d-1f467-200d-1f466" }, { "n": ["woman-woman-boy-boy", "family: woman, woman, boy, boy"], "u": "1f469-200d-1f469-200d-1f466-200d-1f466" }, { "n": ["woman-woman-girl-girl", "family: woman, woman, girl, girl"], "u": "1f469-200d-1f469-200d-1f467-200d-1f467" }, { "n": ["man-boy", "family: man, boy"], "u": "1f468-200d-1f466" }, { "n": ["man-boy-boy", "family: man, boy, boy"], "u": "1f468-200d-1f466-200d-1f466" }, { "n": ["man-girl", "family: man, girl"], "u": "1f468-200d-1f467" }, { "n": ["man-girl-boy", "family: man, girl, boy"], "u": "1f468-200d-1f467-200d-1f466" }, { "n": ["man-girl-girl", "family: man, girl, girl"], "u": "1f468-200d-1f467-200d-1f467" }, { "n": ["woman-boy", "family: woman, boy"], "u": "1f469-200d-1f466" }, { "n": ["woman-boy-boy", "family: woman, boy, boy"], "u": "1f469-200d-1f466-200d-1f466" }, { "n": ["woman-girl", "family: woman, girl"], "u": "1f469-200d-1f467" }, { "n": ["woman-girl-boy", "family: woman, girl, boy"], "u": "1f469-200d-1f467-200d-1f466" }, { "n": ["woman-girl-girl", "family: woman, girl, girl"], "u": "1f469-200d-1f467-200d-1f467" }, { "n": ["speaking head", "speaking head in silhouette"], "u": "1f5e3-fe0f" }, { "n": ["bust in silhouette"], "u": "1f464" }, { "n": ["busts in silhouette"], "u": "1f465" }, { "n": ["people hugging"], "u": "1fac2" }, { "n": ["footprints"], "u": "1f463" }], "animals_nature": [{ "n": ["monkey face"], "u": "1f435" }, { "n": ["monkey"], "u": "1f412" }, { "n": ["gorilla"], "u": "1f98d" }, { "n": ["orangutan"], "u": "1f9a7" }, { "n": ["dog", "dog face"], "u": "1f436" }, { "n": ["dog", "dog2"], "u": "1f415" }, { "n": ["guide dog"], "u": "1f9ae" }, { "n": ["service dog"], "u": "1f415-200d-1f9ba" }, { "n": ["poodle"], "u": "1f429" }, { "n": ["wolf", "wolf face"], "u": "1f43a" }, { "n": ["fox face"], "u": "1f98a" }, { "n": ["raccoon"], "u": "1f99d" }, { "n": ["cat", "cat face"], "u": "1f431" }, { "n": ["cat", "cat2"], "u": "1f408" }, { "n": ["black cat"], "u": "1f408-200d-2b1b" }, { "n": ["lion face"], "u": "1f981" }, { "n": ["tiger", "tiger face"], "u": "1f42f" }, { "n": ["tiger", "tiger2"], "u": "1f405" }, { "n": ["leopard"], "u": "1f406" }, { "n": ["horse", "horse face"], "u": "1f434" }, { "n": ["horse", "racehorse"], "u": "1f40e" }, { "n": ["unicorn face"], "u": "1f984" }, { "n": ["zebra face"], "u": "1f993" }, { "n": ["deer"], "u": "1f98c" }, { "n": ["bison"], "u": "1f9ac" }, { "n": ["cow", "cow face"], "u": "1f42e" }, { "n": ["ox"], "u": "1f402" }, { "n": ["water buffalo"], "u": "1f403" }, { "n": ["cow", "cow2"], "u": "1f404" }, { "n": ["pig", "pig face"], "u": "1f437" }, { "n": ["pig", "pig2"], "u": "1f416" }, { "n": ["boar"], "u": "1f417" }, { "n": ["pig nose"], "u": "1f43d" }, { "n": ["ram"], "u": "1f40f" }, { "n": ["sheep"], "u": "1f411" }, { "n": ["goat"], "u": "1f410" }, { "n": ["dromedary camel"], "u": "1f42a" }, { "n": ["camel", "bactrian camel"], "u": "1f42b" }, { "n": ["llama"], "u": "1f999" }, { "n": ["giraffe face"], "u": "1f992" }, { "n": ["elephant"], "u": "1f418" }, { "n": ["mammoth"], "u": "1f9a3" }, { "n": ["rhinoceros"], "u": "1f98f" }, { "n": ["hippopotamus"], "u": "1f99b" }, { "n": ["mouse", "mouse face"], "u": "1f42d" }, { "n": ["mouse", "mouse2"], "u": "1f401" }, { "n": ["rat"], "u": "1f400" }, { "n": ["hamster", "hamster face"], "u": "1f439" }, { "n": ["rabbit", "rabbit face"], "u": "1f430" }, { "n": ["rabbit", "rabbit2"], "u": "1f407" }, { "n": ["chipmunk"], "u": "1f43f-fe0f" }, { "n": ["beaver"], "u": "1f9ab" }, { "n": ["hedgehog"], "u": "1f994" }, { "n": ["bat"], "u": "1f987" }, { "n": ["bear", "bear face"], "u": "1f43b" }, { "n": ["polar bear"], "u": "1f43b-200d-2744-fe0f" }, { "n": ["koala"], "u": "1f428" }, { "n": ["panda face"], "u": "1f43c" }, { "n": ["sloth"], "u": "1f9a5" }, { "n": ["otter"], "u": "1f9a6" }, { "n": ["skunk"], "u": "1f9a8" }, { "n": ["kangaroo"], "u": "1f998" }, { "n": ["badger"], "u": "1f9a1" }, { "n": ["feet", "paw prints"], "u": "1f43e" }, { "n": ["turkey"], "u": "1f983" }, { "n": ["chicken"], "u": "1f414" }, { "n": ["rooster"], "u": "1f413" }, { "n": ["hatching chick"], "u": "1f423" }, { "n": ["baby chick"], "u": "1f424" }, { "n": ["hatched chick", "front-facing baby chick"], "u": "1f425" }, { "n": ["bird"], "u": "1f426" }, { "n": ["penguin"], "u": "1f427" }, { "n": ["dove", "dove of peace"], "u": "1f54a-fe0f" }, { "n": ["eagle"], "u": "1f985" }, { "n": ["duck"], "u": "1f986" }, { "n": ["swan"], "u": "1f9a2" }, { "n": ["owl"], "u": "1f989" }, { "n": ["dodo"], "u": "1f9a4" }, { "n": ["feather"], "u": "1fab6" }, { "n": ["flamingo"], "u": "1f9a9" }, { "n": ["peacock"], "u": "1f99a" }, { "n": ["parrot"], "u": "1f99c" }, { "n": ["frog", "frog face"], "u": "1f438" }, { "n": ["crocodile"], "u": "1f40a" }, { "n": ["turtle"], "u": "1f422" }, { "n": ["lizard"], "u": "1f98e" }, { "n": ["snake"], "u": "1f40d" }, { "n": ["dragon face"], "u": "1f432" }, { "n": ["dragon"], "u": "1f409" }, { "n": ["sauropod"], "u": "1f995" }, { "n": ["t-rex"], "u": "1f996" }, { "n": ["whale", "spouting whale"], "u": "1f433" }, { "n": ["whale", "whale2"], "u": "1f40b" }, { "n": ["dolphin", "flipper"], "u": "1f42c" }, { "n": ["seal"], "u": "1f9ad" }, { "n": ["fish"], "u": "1f41f" }, { "n": ["tropical fish"], "u": "1f420" }, { "n": ["blowfish"], "u": "1f421" }, { "n": ["shark"], "u": "1f988" }, { "n": ["octopus"], "u": "1f419" }, { "n": ["shell", "spiral shell"], "u": "1f41a" }, { "n": ["coral"], "u": "1fab8" }, { "n": ["snail"], "u": "1f40c" }, { "n": ["butterfly"], "u": "1f98b" }, { "n": ["bug"], "u": "1f41b" }, { "n": ["ant"], "u": "1f41c" }, { "n": ["bee", "honeybee"], "u": "1f41d" }, { "n": ["beetle"], "u": "1fab2" }, { "n": ["ladybug", "lady beetle"], "u": "1f41e" }, { "n": ["cricket"], "u": "1f997" }, { "n": ["cockroach"], "u": "1fab3" }, { "n": ["spider"], "u": "1f577-fe0f" }, { "n": ["spider web"], "u": "1f578-fe0f" }, { "n": ["scorpion"], "u": "1f982" }, { "n": ["mosquito"], "u": "1f99f" }, { "n": ["fly"], "u": "1fab0" }, { "n": ["worm"], "u": "1fab1" }, { "n": ["microbe"], "u": "1f9a0" }, { "n": ["bouquet"], "u": "1f490" }, { "n": ["cherry blossom"], "u": "1f338" }, { "n": ["white flower"], "u": "1f4ae" }, { "n": ["lotus"], "u": "1fab7" }, { "n": ["rosette"], "u": "1f3f5-fe0f" }, { "n": ["rose"], "u": "1f339" }, { "n": ["wilted flower"], "u": "1f940" }, { "n": ["hibiscus"], "u": "1f33a" }, { "n": ["sunflower"], "u": "1f33b" }, { "n": ["blossom"], "u": "1f33c" }, { "n": ["tulip"], "u": "1f337" }, { "n": ["seedling"], "u": "1f331" }, { "n": ["potted plant"], "u": "1fab4" }, { "n": ["evergreen tree"], "u": "1f332" }, { "n": ["deciduous tree"], "u": "1f333" }, { "n": ["palm tree"], "u": "1f334" }, { "n": ["cactus"], "u": "1f335" }, { "n": ["ear of rice"], "u": "1f33e" }, { "n": ["herb"], "u": "1f33f" }, { "n": ["shamrock"], "u": "2618-fe0f" }, { "n": ["four leaf clover"], "u": "1f340" }, { "n": ["maple leaf"], "u": "1f341" }, { "n": ["fallen leaf"], "u": "1f342" }, { "n": ["leaves", "leaf fluttering in wind"], "u": "1f343" }, { "n": ["empty nest"], "u": "1fab9" }, { "n": ["nest with eggs"], "u": "1faba" }], "food_drink": [{ "n": ["grapes"], "u": "1f347" }, { "n": ["melon"], "u": "1f348" }, { "n": ["watermelon"], "u": "1f349" }, { "n": ["tangerine"], "u": "1f34a" }, { "n": ["lemon"], "u": "1f34b" }, { "n": ["banana"], "u": "1f34c" }, { "n": ["pineapple"], "u": "1f34d" }, { "n": ["mango"], "u": "1f96d" }, { "n": ["apple", "red apple"], "u": "1f34e" }, { "n": ["green apple"], "u": "1f34f" }, { "n": ["pear"], "u": "1f350" }, { "n": ["peach"], "u": "1f351" }, { "n": ["cherries"], "u": "1f352" }, { "n": ["strawberry"], "u": "1f353" }, { "n": ["blueberries"], "u": "1fad0" }, { "n": ["kiwifruit"], "u": "1f95d" }, { "n": ["tomato"], "u": "1f345" }, { "n": ["olive"], "u": "1fad2" }, { "n": ["coconut"], "u": "1f965" }, { "n": ["avocado"], "u": "1f951" }, { "n": ["eggplant", "aubergine"], "u": "1f346" }, { "n": ["potato"], "u": "1f954" }, { "n": ["carrot"], "u": "1f955" }, { "n": ["corn", "ear of maize"], "u": "1f33d" }, { "n": ["hot pepper"], "u": "1f336-fe0f" }, { "n": ["bell pepper"], "u": "1fad1" }, { "n": ["cucumber"], "u": "1f952" }, { "n": ["leafy green"], "u": "1f96c" }, { "n": ["broccoli"], "u": "1f966" }, { "n": ["garlic"], "u": "1f9c4" }, { "n": ["onion"], "u": "1f9c5" }, { "n": ["mushroom"], "u": "1f344" }, { "n": ["peanuts"], "u": "1f95c" }, { "n": ["beans"], "u": "1fad8" }, { "n": ["chestnut"], "u": "1f330" }, { "n": ["bread"], "u": "1f35e" }, { "n": ["croissant"], "u": "1f950" }, { "n": ["baguette bread"], "u": "1f956" }, { "n": ["flatbread"], "u": "1fad3" }, { "n": ["pretzel"], "u": "1f968" }, { "n": ["bagel"], "u": "1f96f" }, { "n": ["pancakes"], "u": "1f95e" }, { "n": ["waffle"], "u": "1f9c7" }, { "n": ["cheese wedge"], "u": "1f9c0" }, { "n": ["meat on bone"], "u": "1f356" }, { "n": ["poultry leg"], "u": "1f357" }, { "n": ["cut of meat"], "u": "1f969" }, { "n": ["bacon"], "u": "1f953" }, { "n": ["hamburger"], "u": "1f354" }, { "n": ["fries", "french fries"], "u": "1f35f" }, { "n": ["pizza", "slice of pizza"], "u": "1f355" }, { "n": ["hotdog", "hot dog"], "u": "1f32d" }, { "n": ["sandwich"], "u": "1f96a" }, { "n": ["taco"], "u": "1f32e" }, { "n": ["burrito"], "u": "1f32f" }, { "n": ["tamale"], "u": "1fad4" }, { "n": ["stuffed flatbread"], "u": "1f959" }, { "n": ["falafel"], "u": "1f9c6" }, { "n": ["egg"], "u": "1f95a" }, { "n": ["cooking", "fried egg"], "u": "1f373" }, { "n": ["shallow pan of food"], "u": "1f958" }, { "n": ["stew", "pot of food"], "u": "1f372" }, { "n": ["fondue"], "u": "1fad5" }, { "n": ["bowl with spoon"], "u": "1f963" }, { "n": ["green salad"], "u": "1f957" }, { "n": ["popcorn"], "u": "1f37f" }, { "n": ["butter"], "u": "1f9c8" }, { "n": ["salt", "salt shaker"], "u": "1f9c2" }, { "n": ["canned food"], "u": "1f96b" }, { "n": ["bento", "bento box"], "u": "1f371" }, { "n": ["rice cracker"], "u": "1f358" }, { "n": ["rice ball"], "u": "1f359" }, { "n": ["rice", "cooked rice"], "u": "1f35a" }, { "n": ["curry", "curry and rice"], "u": "1f35b" }, { "n": ["ramen", "steaming bowl"], "u": "1f35c" }, { "n": ["spaghetti"], "u": "1f35d" }, { "n": ["sweet potato", "roasted sweet potato"], "u": "1f360" }, { "n": ["oden"], "u": "1f362" }, { "n": ["sushi"], "u": "1f363" }, { "n": ["fried shrimp"], "u": "1f364" }, { "n": ["fish cake", "fish cake with swirl design"], "u": "1f365" }, { "n": ["moon cake"], "u": "1f96e" }, { "n": ["dango"], "u": "1f361" }, { "n": ["dumpling"], "u": "1f95f" }, { "n": ["fortune cookie"], "u": "1f960" }, { "n": ["takeout box"], "u": "1f961" }, { "n": ["crab"], "u": "1f980" }, { "n": ["lobster"], "u": "1f99e" }, { "n": ["shrimp"], "u": "1f990" }, { "n": ["squid"], "u": "1f991" }, { "n": ["oyster"], "u": "1f9aa" }, { "n": ["icecream", "soft ice cream"], "u": "1f366" }, { "n": ["shaved ice"], "u": "1f367" }, { "n": ["ice cream"], "u": "1f368" }, { "n": ["doughnut"], "u": "1f369" }, { "n": ["cookie"], "u": "1f36a" }, { "n": ["birthday", "birthday cake"], "u": "1f382" }, { "n": ["cake", "shortcake"], "u": "1f370" }, { "n": ["cupcake"], "u": "1f9c1" }, { "n": ["pie"], "u": "1f967" }, { "n": ["chocolate bar"], "u": "1f36b" }, { "n": ["candy"], "u": "1f36c" }, { "n": ["lollipop"], "u": "1f36d" }, { "n": ["custard"], "u": "1f36e" }, { "n": ["honey pot"], "u": "1f36f" }, { "n": ["baby bottle"], "u": "1f37c" }, { "n": ["glass of milk"], "u": "1f95b" }, { "n": ["coffee", "hot beverage"], "u": "2615" }, { "n": ["teapot"], "u": "1fad6" }, { "n": ["tea", "teacup without handle"], "u": "1f375" }, { "n": ["sake", "sake bottle and cup"], "u": "1f376" }, { "n": ["champagne", "bottle with popping cork"], "u": "1f37e" }, { "n": ["wine glass"], "u": "1f377" }, { "n": ["cocktail", "cocktail glass"], "u": "1f378" }, { "n": ["tropical drink"], "u": "1f379" }, { "n": ["beer", "beer mug"], "u": "1f37a" }, { "n": ["beers", "clinking beer mugs"], "u": "1f37b" }, { "n": ["clinking glasses"], "u": "1f942" }, { "n": ["tumbler glass"], "u": "1f943" }, { "n": ["pouring liquid"], "u": "1fad7" }, { "n": ["cup with straw"], "u": "1f964" }, { "n": ["bubble tea"], "u": "1f9cb" }, { "n": ["beverage box"], "u": "1f9c3" }, { "n": ["mate drink"], "u": "1f9c9" }, { "n": ["ice cube"], "u": "1f9ca" }, { "n": ["chopsticks"], "u": "1f962" }, { "n": ["knife fork plate", "fork and knife with plate"], "u": "1f37d-fe0f" }, { "n": ["fork and knife"], "u": "1f374" }, { "n": ["spoon"], "u": "1f944" }, { "n": ["hocho", "knife"], "u": "1f52a" }, { "n": ["jar"], "u": "1fad9" }, { "n": ["amphora"], "u": "1f3fa" }], "travel_places": [{ "n": ["earth africa", "earth globe europe-africa"], "u": "1f30d" }, { "n": ["earth americas", "earth globe americas"], "u": "1f30e" }, { "n": ["earth asia", "earth globe asia-australia"], "u": "1f30f" }, { "n": ["globe with meridians"], "u": "1f310" }, { "n": ["world map"], "u": "1f5fa-fe0f" }, { "n": ["japan", "silhouette of japan"], "u": "1f5fe" }, { "n": ["compass"], "u": "1f9ed" }, { "n": ["snow-capped mountain", "snow capped mountain"], "u": "1f3d4-fe0f" }, { "n": ["mountain"], "u": "26f0-fe0f" }, { "n": ["volcano"], "u": "1f30b" }, { "n": ["mount fuji"], "u": "1f5fb" }, { "n": ["camping"], "u": "1f3d5-fe0f" }, { "n": ["beach with umbrella"], "u": "1f3d6-fe0f" }, { "n": ["desert"], "u": "1f3dc-fe0f" }, { "n": ["desert island"], "u": "1f3dd-fe0f" }, { "n": ["national park"], "u": "1f3de-fe0f" }, { "n": ["stadium"], "u": "1f3df-fe0f" }, { "n": ["classical building"], "u": "1f3db-fe0f" }, { "n": ["building construction"], "u": "1f3d7-fe0f" }, { "n": ["brick", "bricks"], "u": "1f9f1" }, { "n": ["rock"], "u": "1faa8" }, { "n": ["wood"], "u": "1fab5" }, { "n": ["hut"], "u": "1f6d6" }, { "n": ["houses", "house buildings"], "u": "1f3d8-fe0f" }, { "n": ["derelict house", "derelict house building"], "u": "1f3da-fe0f" }, { "n": ["house", "house building"], "u": "1f3e0" }, { "n": ["house with garden"], "u": "1f3e1" }, { "n": ["office", "office building"], "u": "1f3e2" }, { "n": ["post office", "japanese post office"], "u": "1f3e3" }, { "n": ["european post office"], "u": "1f3e4" }, { "n": ["hospital"], "u": "1f3e5" }, { "n": ["bank"], "u": "1f3e6" }, { "n": ["hotel"], "u": "1f3e8" }, { "n": ["love hotel"], "u": "1f3e9" }, { "n": ["convenience store"], "u": "1f3ea" }, { "n": ["school"], "u": "1f3eb" }, { "n": ["department store"], "u": "1f3ec" }, { "n": ["factory"], "u": "1f3ed" }, { "n": ["japanese castle"], "u": "1f3ef" }, { "n": ["european castle"], "u": "1f3f0" }, { "n": ["wedding"], "u": "1f492" }, { "n": ["tokyo tower"], "u": "1f5fc" }, { "n": ["statue of liberty"], "u": "1f5fd" }, { "n": ["church"], "u": "26ea" }, { "n": ["mosque"], "u": "1f54c" }, { "n": ["hindu temple"], "u": "1f6d5" }, { "n": ["synagogue"], "u": "1f54d" }, { "n": ["shinto shrine"], "u": "26e9-fe0f" }, { "n": ["kaaba"], "u": "1f54b" }, { "n": ["fountain"], "u": "26f2" }, { "n": ["tent"], "u": "26fa" }, { "n": ["foggy"], "u": "1f301" }, { "n": ["night with stars"], "u": "1f303" }, { "n": ["cityscape"], "u": "1f3d9-fe0f" }, { "n": ["sunrise over mountains"], "u": "1f304" }, { "n": ["sunrise"], "u": "1f305" }, { "n": ["city sunset", "cityscape at dusk"], "u": "1f306" }, { "n": ["city sunrise", "sunset over buildings"], "u": "1f307" }, { "n": ["bridge at night"], "u": "1f309" }, { "n": ["hotsprings", "hot springs"], "u": "2668-fe0f" }, { "n": ["carousel horse"], "u": "1f3a0" }, { "n": ["playground slide"], "u": "1f6dd" }, { "n": ["ferris wheel"], "u": "1f3a1" }, { "n": ["roller coaster"], "u": "1f3a2" }, { "n": ["barber", "barber pole"], "u": "1f488" }, { "n": ["circus tent"], "u": "1f3aa" }, { "n": ["steam locomotive"], "u": "1f682" }, { "n": ["railway car"], "u": "1f683" }, { "n": ["high-speed train", "bullettrain side"], "u": "1f684" }, { "n": ["bullettrain front", "high-speed train with bullet nose"], "u": "1f685" }, { "n": ["train", "train2"], "u": "1f686" }, { "n": ["metro"], "u": "1f687" }, { "n": ["light rail"], "u": "1f688" }, { "n": ["station"], "u": "1f689" }, { "n": ["tram"], "u": "1f68a" }, { "n": ["monorail"], "u": "1f69d" }, { "n": ["mountain railway"], "u": "1f69e" }, { "n": ["train", "tram car"], "u": "1f68b" }, { "n": ["bus"], "u": "1f68c" }, { "n": ["oncoming bus"], "u": "1f68d" }, { "n": ["trolleybus"], "u": "1f68e" }, { "n": ["minibus"], "u": "1f690" }, { "n": ["ambulance"], "u": "1f691" }, { "n": ["fire engine"], "u": "1f692" }, { "n": ["police car"], "u": "1f693" }, { "n": ["oncoming police car"], "u": "1f694" }, { "n": ["taxi"], "u": "1f695" }, { "n": ["oncoming taxi"], "u": "1f696" }, { "n": ["car", "red car", "automobile"], "u": "1f697" }, { "n": ["oncoming automobile"], "u": "1f698" }, { "n": ["blue car", "recreational vehicle"], "u": "1f699" }, { "n": ["pickup truck"], "u": "1f6fb" }, { "n": ["truck", "delivery truck"], "u": "1f69a" }, { "n": ["articulated lorry"], "u": "1f69b" }, { "n": ["tractor"], "u": "1f69c" }, { "n": ["racing car"], "u": "1f3ce-fe0f" }, { "n": ["motorcycle", "racing motorcycle"], "u": "1f3cd-fe0f" }, { "n": ["motor scooter"], "u": "1f6f5" }, { "n": ["manual wheelchair"], "u": "1f9bd" }, { "n": ["motorized wheelchair"], "u": "1f9bc" }, { "n": ["auto rickshaw"], "u": "1f6fa" }, { "n": ["bike", "bicycle"], "u": "1f6b2" }, { "n": ["scooter"], "u": "1f6f4" }, { "n": ["skateboard"], "u": "1f6f9" }, { "n": ["roller skate"], "u": "1f6fc" }, { "n": ["busstop", "bus stop"], "u": "1f68f" }, { "n": ["motorway"], "u": "1f6e3-fe0f" }, { "n": ["railway track"], "u": "1f6e4-fe0f" }, { "n": ["oil drum"], "u": "1f6e2-fe0f" }, { "n": ["fuelpump", "fuel pump"], "u": "26fd" }, { "n": ["wheel"], "u": "1f6de" }, { "n": ["rotating light", "police cars revolving light"], "u": "1f6a8" }, { "n": ["traffic light", "horizontal traffic light"], "u": "1f6a5" }, { "n": ["vertical traffic light"], "u": "1f6a6" }, { "n": ["octagonal sign"], "u": "1f6d1" }, { "n": ["construction", "construction sign"], "u": "1f6a7" }, { "n": ["anchor"], "u": "2693" }, { "n": ["ring buoy"], "u": "1f6df" }, { "n": ["boat", "sailboat"], "u": "26f5" }, { "n": ["canoe"], "u": "1f6f6" }, { "n": ["speedboat"], "u": "1f6a4" }, { "n": ["passenger ship"], "u": "1f6f3-fe0f" }, { "n": ["ferry"], "u": "26f4-fe0f" }, { "n": ["motor boat"], "u": "1f6e5-fe0f" }, { "n": ["ship"], "u": "1f6a2" }, { "n": ["airplane"], "u": "2708-fe0f" }, { "n": ["small airplane"], "u": "1f6e9-fe0f" }, { "n": ["airplane departure"], "u": "1f6eb" }, { "n": ["airplane arriving"], "u": "1f6ec" }, { "n": ["parachute"], "u": "1fa82" }, { "n": ["seat"], "u": "1f4ba" }, { "n": ["helicopter"], "u": "1f681" }, { "n": ["suspension railway"], "u": "1f69f" }, { "n": ["mountain cableway"], "u": "1f6a0" }, { "n": ["aerial tramway"], "u": "1f6a1" }, { "n": ["satellite"], "u": "1f6f0-fe0f" }, { "n": ["rocket"], "u": "1f680" }, { "n": ["flying saucer"], "u": "1f6f8" }, { "n": ["bellhop bell"], "u": "1f6ce-fe0f" }, { "n": ["luggage"], "u": "1f9f3" }, { "n": ["hourglass"], "u": "231b" }, { "n": ["hourglass flowing sand", "hourglass with flowing sand"], "u": "23f3" }, { "n": ["watch"], "u": "231a" }, { "n": ["alarm clock"], "u": "23f0" }, { "n": ["stopwatch"], "u": "23f1-fe0f" }, { "n": ["timer clock"], "u": "23f2-fe0f" }, { "n": ["mantelpiece clock"], "u": "1f570-fe0f" }, { "n": ["clock12", "clock face twelve oclock"], "u": "1f55b" }, { "n": ["clock1230", "clock face twelve-thirty"], "u": "1f567" }, { "n": ["clock1", "clock face one oclock"], "u": "1f550" }, { "n": ["clock130", "clock face one-thirty"], "u": "1f55c" }, { "n": ["clock2", "clock face two oclock"], "u": "1f551" }, { "n": ["clock230", "clock face two-thirty"], "u": "1f55d" }, { "n": ["clock3", "clock face three oclock"], "u": "1f552" }, { "n": ["clock330", "clock face three-thirty"], "u": "1f55e" }, { "n": ["clock4", "clock face four oclock"], "u": "1f553" }, { "n": ["clock430", "clock face four-thirty"], "u": "1f55f" }, { "n": ["clock5", "clock face five oclock"], "u": "1f554" }, { "n": ["clock530", "clock face five-thirty"], "u": "1f560" }, { "n": ["clock6", "clock face six oclock"], "u": "1f555" }, { "n": ["clock630", "clock face six-thirty"], "u": "1f561" }, { "n": ["clock7", "clock face seven oclock"], "u": "1f556" }, { "n": ["clock730", "clock face seven-thirty"], "u": "1f562" }, { "n": ["clock8", "clock face eight oclock"], "u": "1f557" }, { "n": ["clock830", "clock face eight-thirty"], "u": "1f563" }, { "n": ["clock9", "clock face nine oclock"], "u": "1f558" }, { "n": ["clock930", "clock face nine-thirty"], "u": "1f564" }, { "n": ["clock10", "clock face ten oclock"], "u": "1f559" }, { "n": ["clock1030", "clock face ten-thirty"], "u": "1f565" }, { "n": ["clock11", "clock face eleven oclock"], "u": "1f55a" }, { "n": ["clock1130", "clock face eleven-thirty"], "u": "1f566" }, { "n": ["new moon", "new moon symbol"], "u": "1f311" }, { "n": ["waxing crescent moon", "waxing crescent moon symbol"], "u": "1f312" }, { "n": ["first quarter moon", "first quarter moon symbol"], "u": "1f313" }, { "n": ["moon", "waxing gibbous moon", "waxing gibbous moon symbol"], "u": "1f314" }, { "n": ["full moon", "full moon symbol"], "u": "1f315" }, { "n": ["waning gibbous moon", "waning gibbous moon symbol"], "u": "1f316" }, { "n": ["last quarter moon", "last quarter moon symbol"], "u": "1f317" }, { "n": ["waning crescent moon", "waning crescent moon symbol"], "u": "1f318" }, { "n": ["crescent moon"], "u": "1f319" }, { "n": ["new moon with face"], "u": "1f31a" }, { "n": ["first quarter moon with face"], "u": "1f31b" }, { "n": ["last quarter moon with face"], "u": "1f31c" }, { "n": ["thermometer"], "u": "1f321-fe0f" }, { "n": ["sunny", "black sun with rays"], "u": "2600-fe0f" }, { "n": ["full moon with face"], "u": "1f31d" }, { "n": ["sun with face"], "u": "1f31e" }, { "n": ["ringed planet"], "u": "1fa90" }, { "n": ["star", "white medium star"], "u": "2b50" }, { "n": ["star2", "glowing star"], "u": "1f31f" }, { "n": ["stars", "shooting star"], "u": "1f320" }, { "n": ["milky way"], "u": "1f30c" }, { "n": ["cloud"], "u": "2601-fe0f" }, { "n": ["partly sunny", "sun behind cloud"], "u": "26c5" }, { "n": ["thunder cloud and rain", "cloud with lightning and rain"], "u": "26c8-fe0f" }, { "n": ["mostly sunny", "sun small cloud", "sun behind small cloud"], "u": "1f324-fe0f" }, { "n": ["barely sunny", "sun behind cloud", "sun behind large cloud"], "u": "1f325-fe0f" }, { "n": ["partly sunny rain", "sun behind rain cloud"], "u": "1f326-fe0f" }, { "n": ["rain cloud", "cloud with rain"], "u": "1f327-fe0f" }, { "n": ["snow cloud", "cloud with snow"], "u": "1f328-fe0f" }, { "n": ["lightning", "lightning cloud", "cloud with lightning"], "u": "1f329-fe0f" }, { "n": ["tornado", "tornado cloud"], "u": "1f32a-fe0f" }, { "n": ["fog"], "u": "1f32b-fe0f" }, { "n": ["wind face", "wind blowing face"], "u": "1f32c-fe0f" }, { "n": ["cyclone"], "u": "1f300" }, { "n": ["rainbow"], "u": "1f308" }, { "n": ["closed umbrella"], "u": "1f302" }, { "n": ["umbrella"], "u": "2602-fe0f" }, { "n": ["umbrella with rain drops"], "u": "2614" }, { "n": ["umbrella on ground"], "u": "26f1-fe0f" }, { "n": ["zap", "high voltage sign"], "u": "26a1" }, { "n": ["snowflake"], "u": "2744-fe0f" }, { "n": ["snowman"], "u": "2603-fe0f" }, { "n": ["snowman without snow"], "u": "26c4" }, { "n": ["comet"], "u": "2604-fe0f" }, { "n": ["fire"], "u": "1f525" }, { "n": ["droplet"], "u": "1f4a7" }, { "n": ["ocean", "water wave"], "u": "1f30a" }], "activities": [{ "n": ["jack-o-lantern", "jack o lantern"], "u": "1f383" }, { "n": ["christmas tree"], "u": "1f384" }, { "n": ["fireworks"], "u": "1f386" }, { "n": ["sparkler", "firework sparkler"], "u": "1f387" }, { "n": ["firecracker"], "u": "1f9e8" }, { "n": ["sparkles"], "u": "2728" }, { "n": ["balloon"], "u": "1f388" }, { "n": ["tada", "party popper"], "u": "1f389" }, { "n": ["confetti ball"], "u": "1f38a" }, { "n": ["tanabata tree"], "u": "1f38b" }, { "n": ["bamboo", "pine decoration"], "u": "1f38d" }, { "n": ["dolls", "japanese dolls"], "u": "1f38e" }, { "n": ["flags", "carp streamer"], "u": "1f38f" }, { "n": ["wind chime"], "u": "1f390" }, { "n": ["rice scene", "moon viewing ceremony"], "u": "1f391" }, { "n": ["red envelope", "red gift envelope"], "u": "1f9e7" }, { "n": ["ribbon"], "u": "1f380" }, { "n": ["gift", "wrapped present"], "u": "1f381" }, { "n": ["reminder ribbon"], "u": "1f397-fe0f" }, { "n": ["admission tickets"], "u": "1f39f-fe0f" }, { "n": ["ticket"], "u": "1f3ab" }, { "n": ["medal", "military medal"], "u": "1f396-fe0f" }, { "n": ["trophy"], "u": "1f3c6" }, { "n": ["sports medal"], "u": "1f3c5" }, { "n": ["first place medal"], "u": "1f947" }, { "n": ["second place medal"], "u": "1f948" }, { "n": ["third place medal"], "u": "1f949" }, { "n": ["soccer", "soccer ball"], "u": "26bd" }, { "n": ["baseball"], "u": "26be" }, { "n": ["softball"], "u": "1f94e" }, { "n": ["basketball", "basketball and hoop"], "u": "1f3c0" }, { "n": ["volleyball"], "u": "1f3d0" }, { "n": ["football", "american football"], "u": "1f3c8" }, { "n": ["rugby football"], "u": "1f3c9" }, { "n": ["tennis", "tennis racquet and ball"], "u": "1f3be" }, { "n": ["flying disc"], "u": "1f94f" }, { "n": ["bowling"], "u": "1f3b3" }, { "n": ["cricket bat and ball"], "u": "1f3cf" }, { "n": ["field hockey stick and ball"], "u": "1f3d1" }, { "n": ["ice hockey stick and puck"], "u": "1f3d2" }, { "n": ["lacrosse", "lacrosse stick and ball"], "u": "1f94d" }, { "n": ["table tennis paddle and ball"], "u": "1f3d3" }, { "n": ["badminton racquet and shuttlecock"], "u": "1f3f8" }, { "n": ["boxing glove"], "u": "1f94a" }, { "n": ["martial arts uniform"], "u": "1f94b" }, { "n": ["goal net"], "u": "1f945" }, { "n": ["golf", "flag in hole"], "u": "26f3" }, { "n": ["ice skate"], "u": "26f8-fe0f" }, { "n": ["fishing pole and fish"], "u": "1f3a3" }, { "n": ["diving mask"], "u": "1f93f" }, { "n": ["running shirt with sash"], "u": "1f3bd" }, { "n": ["ski", "ski and ski boot"], "u": "1f3bf" }, { "n": ["sled"], "u": "1f6f7" }, { "n": ["curling stone"], "u": "1f94c" }, { "n": ["dart", "direct hit"], "u": "1f3af" }, { "n": ["yo-yo"], "u": "1fa80" }, { "n": ["kite"], "u": "1fa81" }, { "n": ["8ball", "billiards"], "u": "1f3b1" }, { "n": ["crystal ball"], "u": "1f52e" }, { "n": ["magic wand"], "u": "1fa84" }, { "n": ["nazar amulet"], "u": "1f9ff" }, { "n": ["hamsa"], "u": "1faac" }, { "n": ["video game"], "u": "1f3ae" }, { "n": ["joystick"], "u": "1f579-fe0f" }, { "n": ["slot machine"], "u": "1f3b0" }, { "n": ["game die"], "u": "1f3b2" }, { "n": ["jigsaw", "jigsaw puzzle piece"], "u": "1f9e9" }, { "n": ["teddy bear"], "u": "1f9f8" }, { "n": ["pinata"], "u": "1fa85" }, { "n": ["mirror ball"], "u": "1faa9" }, { "n": ["nesting dolls"], "u": "1fa86" }, { "n": ["spades", "black spade suit"], "u": "2660-fe0f" }, { "n": ["hearts", "black heart suit"], "u": "2665-fe0f" }, { "n": ["diamonds", "black diamond suit"], "u": "2666-fe0f" }, { "n": ["clubs", "black club suit"], "u": "2663-fe0f" }, { "n": ["chess pawn"], "u": "265f-fe0f" }, { "n": ["black joker", "playing card black joker"], "u": "1f0cf" }, { "n": ["mahjong", "mahjong tile red dragon"], "u": "1f004" }, { "n": ["flower playing cards"], "u": "1f3b4" }, { "n": ["performing arts"], "u": "1f3ad" }, { "n": ["framed picture", "frame with picture"], "u": "1f5bc-fe0f" }, { "n": ["art", "artist palette"], "u": "1f3a8" }, { "n": ["thread", "spool of thread"], "u": "1f9f5" }, { "n": ["sewing needle"], "u": "1faa1" }, { "n": ["yarn", "ball of yarn"], "u": "1f9f6" }, { "n": ["knot"], "u": "1faa2" }], "objects": [{ "n": ["eyeglasses"], "u": "1f453" }, { "n": ["sunglasses", "dark sunglasses"], "u": "1f576-fe0f" }, { "n": ["goggles"], "u": "1f97d" }, { "n": ["lab coat"], "u": "1f97c" }, { "n": ["safety vest"], "u": "1f9ba" }, { "n": ["necktie"], "u": "1f454" }, { "n": ["shirt", "tshirt", "t-shirt"], "u": "1f455" }, { "n": ["jeans"], "u": "1f456" }, { "n": ["scarf"], "u": "1f9e3" }, { "n": ["gloves"], "u": "1f9e4" }, { "n": ["coat"], "u": "1f9e5" }, { "n": ["socks"], "u": "1f9e6" }, { "n": ["dress"], "u": "1f457" }, { "n": ["kimono"], "u": "1f458" }, { "n": ["sari"], "u": "1f97b" }, { "n": ["one-piece swimsuit"], "u": "1fa71" }, { "n": ["briefs"], "u": "1fa72" }, { "n": ["shorts"], "u": "1fa73" }, { "n": ["bikini"], "u": "1f459" }, { "n": ["womans clothes"], "u": "1f45a" }, { "n": ["purse"], "u": "1f45b" }, { "n": ["handbag"], "u": "1f45c" }, { "n": ["pouch"], "u": "1f45d" }, { "n": ["shopping bags"], "u": "1f6cd-fe0f" }, { "n": ["school satchel"], "u": "1f392" }, { "n": ["thong sandal"], "u": "1fa74" }, { "n": ["shoe", "mans shoe"], "u": "1f45e" }, { "n": ["athletic shoe"], "u": "1f45f" }, { "n": ["hiking boot"], "u": "1f97e" }, { "n": ["flat shoe", "womans flat shoe"], "u": "1f97f" }, { "n": ["high heel", "high-heeled shoe"], "u": "1f460" }, { "n": ["sandal", "womans sandal"], "u": "1f461" }, { "n": ["ballet shoes"], "u": "1fa70" }, { "n": ["boot", "womans boots"], "u": "1f462" }, { "n": ["crown"], "u": "1f451" }, { "n": ["womans hat"], "u": "1f452" }, { "n": ["tophat", "top hat"], "u": "1f3a9" }, { "n": ["mortar board", "graduation cap"], "u": "1f393" }, { "n": ["billed cap"], "u": "1f9e2" }, { "n": ["military helmet"], "u": "1fa96" }, { "n": ["rescue worker\u2019s helmet", "helmet with white cross"], "u": "26d1-fe0f" }, { "n": ["prayer beads"], "u": "1f4ff" }, { "n": ["lipstick"], "u": "1f484" }, { "n": ["ring"], "u": "1f48d" }, { "n": ["gem", "gem stone"], "u": "1f48e" }, { "n": ["mute", "speaker with cancellation stroke"], "u": "1f507" }, { "n": ["speaker"], "u": "1f508" }, { "n": ["sound", "speaker with one sound wave"], "u": "1f509" }, { "n": ["loud sound", "speaker with three sound waves"], "u": "1f50a" }, { "n": ["loudspeaker", "public address loudspeaker"], "u": "1f4e2" }, { "n": ["mega", "cheering megaphone"], "u": "1f4e3" }, { "n": ["postal horn"], "u": "1f4ef" }, { "n": ["bell"], "u": "1f514" }, { "n": ["no bell", "bell with cancellation stroke"], "u": "1f515" }, { "n": ["musical score"], "u": "1f3bc" }, { "n": ["musical note"], "u": "1f3b5" }, { "n": ["notes", "multiple musical notes"], "u": "1f3b6" }, { "n": ["studio microphone"], "u": "1f399-fe0f" }, { "n": ["level slider"], "u": "1f39a-fe0f" }, { "n": ["control knobs"], "u": "1f39b-fe0f" }, { "n": ["microphone"], "u": "1f3a4" }, { "n": ["headphone", "headphones"], "u": "1f3a7" }, { "n": ["radio"], "u": "1f4fb" }, { "n": ["saxophone"], "u": "1f3b7" }, { "n": ["accordion"], "u": "1fa97" }, { "n": ["guitar"], "u": "1f3b8" }, { "n": ["musical keyboard"], "u": "1f3b9" }, { "n": ["trumpet"], "u": "1f3ba" }, { "n": ["violin"], "u": "1f3bb" }, { "n": ["banjo"], "u": "1fa95" }, { "n": ["drum with drumsticks"], "u": "1f941" }, { "n": ["long drum"], "u": "1fa98" }, { "n": ["iphone", "mobile phone"], "u": "1f4f1" }, { "n": ["calling", "mobile phone with rightwards arrow at left"], "u": "1f4f2" }, { "n": ["phone", "telephone", "black telephone"], "u": "260e-fe0f" }, { "n": ["telephone receiver"], "u": "1f4de" }, { "n": ["pager"], "u": "1f4df" }, { "n": ["fax", "fax machine"], "u": "1f4e0" }, { "n": ["battery"], "u": "1f50b" }, { "n": ["low battery"], "u": "1faab" }, { "n": ["electric plug"], "u": "1f50c" }, { "n": ["computer", "personal computer"], "u": "1f4bb" }, { "n": ["desktop computer"], "u": "1f5a5-fe0f" }, { "n": ["printer"], "u": "1f5a8-fe0f" }, { "n": ["keyboard"], "u": "2328-fe0f" }, { "n": ["computer mouse", "three button mouse"], "u": "1f5b1-fe0f" }, { "n": ["trackball"], "u": "1f5b2-fe0f" }, { "n": ["minidisc"], "u": "1f4bd" }, { "n": ["floppy disk"], "u": "1f4be" }, { "n": ["cd", "optical disc"], "u": "1f4bf" }, { "n": ["dvd"], "u": "1f4c0" }, { "n": ["abacus"], "u": "1f9ee" }, { "n": ["movie camera"], "u": "1f3a5" }, { "n": ["film frames"], "u": "1f39e-fe0f" }, { "n": ["film projector"], "u": "1f4fd-fe0f" }, { "n": ["clapper", "clapper board"], "u": "1f3ac" }, { "n": ["tv", "television"], "u": "1f4fa" }, { "n": ["camera"], "u": "1f4f7" }, { "n": ["camera with flash"], "u": "1f4f8" }, { "n": ["video camera"], "u": "1f4f9" }, { "n": ["vhs", "videocassette"], "u": "1f4fc" }, { "n": ["mag", "left-pointing magnifying glass"], "u": "1f50d" }, { "n": ["mag right", "right-pointing magnifying glass"], "u": "1f50e" }, { "n": ["candle"], "u": "1f56f-fe0f" }, { "n": ["bulb", "electric light bulb"], "u": "1f4a1" }, { "n": ["flashlight", "electric torch"], "u": "1f526" }, { "n": ["lantern", "izakaya lantern"], "u": "1f3ee" }, { "n": ["diya lamp"], "u": "1fa94" }, { "n": ["notebook with decorative cover"], "u": "1f4d4" }, { "n": ["closed book"], "u": "1f4d5" }, { "n": ["book", "open book"], "u": "1f4d6" }, { "n": ["green book"], "u": "1f4d7" }, { "n": ["blue book"], "u": "1f4d8" }, { "n": ["orange book"], "u": "1f4d9" }, { "n": ["books"], "u": "1f4da" }, { "n": ["notebook"], "u": "1f4d3" }, { "n": ["ledger"], "u": "1f4d2" }, { "n": ["page with curl"], "u": "1f4c3" }, { "n": ["scroll"], "u": "1f4dc" }, { "n": ["page facing up"], "u": "1f4c4" }, { "n": ["newspaper"], "u": "1f4f0" }, { "n": ["rolled-up newspaper", "rolled up newspaper"], "u": "1f5de-fe0f" }, { "n": ["bookmark tabs"], "u": "1f4d1" }, { "n": ["bookmark"], "u": "1f516" }, { "n": ["label"], "u": "1f3f7-fe0f" }, { "n": ["moneybag", "money bag"], "u": "1f4b0" }, { "n": ["coin"], "u": "1fa99" }, { "n": ["yen", "banknote with yen sign"], "u": "1f4b4" }, { "n": ["dollar", "banknote with dollar sign"], "u": "1f4b5" }, { "n": ["euro", "banknote with euro sign"], "u": "1f4b6" }, { "n": ["pound", "banknote with pound sign"], "u": "1f4b7" }, { "n": ["money with wings"], "u": "1f4b8" }, { "n": ["credit card"], "u": "1f4b3" }, { "n": ["receipt"], "u": "1f9fe" }, { "n": ["chart", "chart with upwards trend and yen sign"], "u": "1f4b9" }, { "n": ["email", "envelope"], "u": "2709-fe0f" }, { "n": ["e-mail", "e-mail symbol"], "u": "1f4e7" }, { "n": ["incoming envelope"], "u": "1f4e8" }, { "n": ["envelope with arrow", "envelope with downwards arrow above"], "u": "1f4e9" }, { "n": ["outbox tray"], "u": "1f4e4" }, { "n": ["inbox tray"], "u": "1f4e5" }, { "n": ["package"], "u": "1f4e6" }, { "n": ["mailbox", "closed mailbox with raised flag"], "u": "1f4eb" }, { "n": ["mailbox closed", "closed mailbox with lowered flag"], "u": "1f4ea" }, { "n": ["mailbox with mail", "open mailbox with raised flag"], "u": "1f4ec" }, { "n": ["mailbox with no mail", "open mailbox with lowered flag"], "u": "1f4ed" }, { "n": ["postbox"], "u": "1f4ee" }, { "n": ["ballot box with ballot"], "u": "1f5f3-fe0f" }, { "n": ["pencil", "pencil2"], "u": "270f-fe0f" }, { "n": ["black nib"], "u": "2712-fe0f" }, { "n": ["fountain pen", "lower left fountain pen"], "u": "1f58b-fe0f" }, { "n": ["pen", "lower left ballpoint pen"], "u": "1f58a-fe0f" }, { "n": ["paintbrush", "lower left paintbrush"], "u": "1f58c-fe0f" }, { "n": ["crayon", "lower left crayon"], "u": "1f58d-fe0f" }, { "n": ["memo", "pencil"], "u": "1f4dd" }, { "n": ["briefcase"], "u": "1f4bc" }, { "n": ["file folder"], "u": "1f4c1" }, { "n": ["open file folder"], "u": "1f4c2" }, { "n": ["card index dividers"], "u": "1f5c2-fe0f" }, { "n": ["date", "calendar"], "u": "1f4c5" }, { "n": ["calendar", "tear-off calendar"], "u": "1f4c6" }, { "n": ["spiral notepad", "spiral note pad"], "u": "1f5d2-fe0f" }, { "n": ["spiral calendar", "spiral calendar pad"], "u": "1f5d3-fe0f" }, { "n": ["card index"], "u": "1f4c7" }, { "n": ["chart with upwards trend"], "u": "1f4c8" }, { "n": ["chart with downwards trend"], "u": "1f4c9" }, { "n": ["bar chart"], "u": "1f4ca" }, { "n": ["clipboard"], "u": "1f4cb" }, { "n": ["pushpin"], "u": "1f4cc" }, { "n": ["round pushpin"], "u": "1f4cd" }, { "n": ["paperclip"], "u": "1f4ce" }, { "n": ["linked paperclips"], "u": "1f587-fe0f" }, { "n": ["straight ruler"], "u": "1f4cf" }, { "n": ["triangular ruler"], "u": "1f4d0" }, { "n": ["scissors", "black scissors"], "u": "2702-fe0f" }, { "n": ["card file box"], "u": "1f5c3-fe0f" }, { "n": ["file cabinet"], "u": "1f5c4-fe0f" }, { "n": ["wastebasket"], "u": "1f5d1-fe0f" }, { "n": ["lock"], "u": "1f512" }, { "n": ["unlock", "open lock"], "u": "1f513" }, { "n": ["lock with ink pen"], "u": "1f50f" }, { "n": ["closed lock with key"], "u": "1f510" }, { "n": ["key"], "u": "1f511" }, { "n": ["old key"], "u": "1f5dd-fe0f" }, { "n": ["hammer"], "u": "1f528" }, { "n": ["axe"], "u": "1fa93" }, { "n": ["pick"], "u": "26cf-fe0f" }, { "n": ["hammer and pick"], "u": "2692-fe0f" }, { "n": ["hammer and wrench"], "u": "1f6e0-fe0f" }, { "n": ["dagger", "dagger knife"], "u": "1f5e1-fe0f" }, { "n": ["crossed swords"], "u": "2694-fe0f" }, { "n": ["gun", "pistol"], "u": "1f52b" }, { "n": ["boomerang"], "u": "1fa83" }, { "n": ["bow and arrow"], "u": "1f3f9" }, { "n": ["shield"], "u": "1f6e1-fe0f" }, { "n": ["carpentry saw"], "u": "1fa9a" }, { "n": ["wrench"], "u": "1f527" }, { "n": ["screwdriver"], "u": "1fa9b" }, { "n": ["nut and bolt"], "u": "1f529" }, { "n": ["gear"], "u": "2699-fe0f" }, { "n": ["clamp", "compression"], "u": "1f5dc-fe0f" }, { "n": ["scales", "balance scale"], "u": "2696-fe0f" }, { "n": ["probing cane"], "u": "1f9af" }, { "n": ["link", "link symbol"], "u": "1f517" }, { "n": ["chains"], "u": "26d3-fe0f" }, { "n": ["hook"], "u": "1fa9d" }, { "n": ["toolbox"], "u": "1f9f0" }, { "n": ["magnet"], "u": "1f9f2" }, { "n": ["ladder"], "u": "1fa9c" }, { "n": ["alembic"], "u": "2697-fe0f" }, { "n": ["test tube"], "u": "1f9ea" }, { "n": ["petri dish"], "u": "1f9eb" }, { "n": ["dna", "dna double helix"], "u": "1f9ec" }, { "n": ["microscope"], "u": "1f52c" }, { "n": ["telescope"], "u": "1f52d" }, { "n": ["satellite antenna"], "u": "1f4e1" }, { "n": ["syringe"], "u": "1f489" }, { "n": ["drop of blood"], "u": "1fa78" }, { "n": ["pill"], "u": "1f48a" }, { "n": ["adhesive bandage"], "u": "1fa79" }, { "n": ["crutch"], "u": "1fa7c" }, { "n": ["stethoscope"], "u": "1fa7a" }, { "n": ["x-ray"], "u": "1fa7b" }, { "n": ["door"], "u": "1f6aa" }, { "n": ["elevator"], "u": "1f6d7" }, { "n": ["mirror"], "u": "1fa9e" }, { "n": ["window"], "u": "1fa9f" }, { "n": ["bed"], "u": "1f6cf-fe0f" }, { "n": ["couch and lamp"], "u": "1f6cb-fe0f" }, { "n": ["chair"], "u": "1fa91" }, { "n": ["toilet"], "u": "1f6bd" }, { "n": ["plunger"], "u": "1faa0" }, { "n": ["shower"], "u": "1f6bf" }, { "n": ["bathtub"], "u": "1f6c1" }, { "n": ["mouse trap"], "u": "1faa4" }, { "n": ["razor"], "u": "1fa92" }, { "n": ["lotion bottle"], "u": "1f9f4" }, { "n": ["safety pin"], "u": "1f9f7" }, { "n": ["broom"], "u": "1f9f9" }, { "n": ["basket"], "u": "1f9fa" }, { "n": ["roll of paper"], "u": "1f9fb" }, { "n": ["bucket"], "u": "1faa3" }, { "n": ["soap", "bar of soap"], "u": "1f9fc" }, { "n": ["bubbles"], "u": "1fae7" }, { "n": ["toothbrush"], "u": "1faa5" }, { "n": ["sponge"], "u": "1f9fd" }, { "n": ["fire extinguisher"], "u": "1f9ef" }, { "n": ["shopping trolley"], "u": "1f6d2" }, { "n": ["smoking", "smoking symbol"], "u": "1f6ac" }, { "n": ["coffin"], "u": "26b0-fe0f" }, { "n": ["headstone"], "u": "1faa6" }, { "n": ["funeral urn"], "u": "26b1-fe0f" }, { "n": ["moyai"], "u": "1f5ff" }, { "n": ["placard"], "u": "1faa7" }, { "n": ["identification card"], "u": "1faaa" }], "symbols": [{ "n": ["atm", "automated teller machine"], "u": "1f3e7" }, { "n": ["put litter in its place", "put litter in its place symbol"], "u": "1f6ae" }, { "n": ["potable water", "potable water symbol"], "u": "1f6b0" }, { "n": ["wheelchair", "wheelchair symbol"], "u": "267f" }, { "n": ["mens", "mens symbol"], "u": "1f6b9" }, { "n": ["womens", "womens symbol"], "u": "1f6ba" }, { "n": ["restroom"], "u": "1f6bb" }, { "n": ["baby symbol"], "u": "1f6bc" }, { "n": ["wc", "water closet"], "u": "1f6be" }, { "n": ["passport control"], "u": "1f6c2" }, { "n": ["customs"], "u": "1f6c3" }, { "n": ["baggage claim"], "u": "1f6c4" }, { "n": ["left luggage"], "u": "1f6c5" }, { "n": ["warning", "warning sign"], "u": "26a0-fe0f" }, { "n": ["children crossing"], "u": "1f6b8" }, { "n": ["no entry"], "u": "26d4" }, { "n": ["no entry sign"], "u": "1f6ab" }, { "n": ["no bicycles"], "u": "1f6b3" }, { "n": ["no smoking", "no smoking symbol"], "u": "1f6ad" }, { "n": ["do not litter", "do not litter symbol"], "u": "1f6af" }, { "n": ["non-potable water", "non-potable water symbol"], "u": "1f6b1" }, { "n": ["no pedestrians"], "u": "1f6b7" }, { "n": ["no mobile phones"], "u": "1f4f5" }, { "n": ["underage", "no one under eighteen symbol"], "u": "1f51e" }, { "n": ["radioactive", "radioactive sign"], "u": "2622-fe0f" }, { "n": ["biohazard", "biohazard sign"], "u": "2623-fe0f" }, { "n": ["arrow up", "upwards black arrow"], "u": "2b06-fe0f" }, { "n": ["north east arrow", "arrow upper right"], "u": "2197-fe0f" }, { "n": ["arrow right", "black rightwards arrow"], "u": "27a1-fe0f" }, { "n": ["south east arrow", "arrow lower right"], "u": "2198-fe0f" }, { "n": ["arrow down", "downwards black arrow"], "u": "2b07-fe0f" }, { "n": ["south west arrow", "arrow lower left"], "u": "2199-fe0f" }, { "n": ["arrow left", "leftwards black arrow"], "u": "2b05-fe0f" }, { "n": ["north west arrow", "arrow upper left"], "u": "2196-fe0f" }, { "n": ["up down arrow", "arrow up down"], "u": "2195-fe0f" }, { "n": ["left right arrow"], "u": "2194-fe0f" }, { "n": ["leftwards arrow with hook"], "u": "21a9-fe0f" }, { "n": ["arrow right hook", "rightwards arrow with hook"], "u": "21aa-fe0f" }, { "n": ["arrow heading up", "arrow pointing rightwards then curving upwards"], "u": "2934-fe0f" }, { "n": ["arrow heading down", "arrow pointing rightwards then curving downwards"], "u": "2935-fe0f" }, { "n": ["arrows clockwise", "clockwise downwards and upwards open circle arrows"], "u": "1f503" }, { "n": ["arrows counterclockwise", "anticlockwise downwards and upwards open circle arrows"], "u": "1f504" }, { "n": ["back", "back with leftwards arrow above"], "u": "1f519" }, { "n": ["end", "end with leftwards arrow above"], "u": "1f51a" }, { "n": ["on", "on with exclamation mark with left right arrow above"], "u": "1f51b" }, { "n": ["soon", "soon with rightwards arrow above"], "u": "1f51c" }, { "n": ["top", "top with upwards arrow above"], "u": "1f51d" }, { "n": ["place of worship"], "u": "1f6d0" }, { "n": ["atom symbol"], "u": "269b-fe0f" }, { "n": ["om", "om symbol"], "u": "1f549-fe0f" }, { "n": ["star of david"], "u": "2721-fe0f" }, { "n": ["wheel of dharma"], "u": "2638-fe0f" }, { "n": ["yin yang"], "u": "262f-fe0f" }, { "n": ["latin cross"], "u": "271d-fe0f" }, { "n": ["orthodox cross"], "u": "2626-fe0f" }, { "n": ["star and crescent"], "u": "262a-fe0f" }, { "n": ["peace symbol"], "u": "262e-fe0f" }, { "n": ["menorah with nine branches"], "u": "1f54e" }, { "n": ["six pointed star", "six pointed star with middle dot"], "u": "1f52f" }, { "n": ["aries"], "u": "2648" }, { "n": ["taurus"], "u": "2649" }, { "n": ["gemini"], "u": "264a" }, { "n": ["cancer"], "u": "264b" }, { "n": ["leo"], "u": "264c" }, { "n": ["virgo"], "u": "264d" }, { "n": ["libra"], "u": "264e" }, { "n": ["scorpius"], "u": "264f" }, { "n": ["sagittarius"], "u": "2650" }, { "n": ["capricorn"], "u": "2651" }, { "n": ["aquarius"], "u": "2652" }, { "n": ["pisces"], "u": "2653" }, { "n": ["ophiuchus"], "u": "26ce" }, { "n": ["twisted rightwards arrows"], "u": "1f500" }, { "n": ["repeat", "clockwise rightwards and leftwards open circle arrows"], "u": "1f501" }, { "n": ["repeat one", "clockwise rightwards and leftwards open circle arrows with circled one overlay"], "u": "1f502" }, { "n": ["arrow forward", "black right-pointing triangle"], "u": "25b6-fe0f" }, { "n": ["fast forward", "black right-pointing double triangle"], "u": "23e9" }, { "n": ["next track button", "black right pointing double triangle with vertical bar"], "u": "23ed-fe0f" }, { "n": ["play or pause button", "black right pointing triangle with double vertical bar"], "u": "23ef-fe0f" }, { "n": ["arrow backward", "black left-pointing triangle"], "u": "25c0-fe0f" }, { "n": ["rewind", "black left-pointing double triangle"], "u": "23ea" }, { "n": ["last track button", "black left pointing double triangle with vertical bar"], "u": "23ee-fe0f" }, { "n": ["arrow up small", "up-pointing small red triangle"], "u": "1f53c" }, { "n": ["arrow double up", "black up-pointing double triangle"], "u": "23eb" }, { "n": ["arrow down small", "down-pointing small red triangle"], "u": "1f53d" }, { "n": ["arrow double down", "black down-pointing double triangle"], "u": "23ec" }, { "n": ["pause button", "double vertical bar"], "u": "23f8-fe0f" }, { "n": ["stop button", "black square for stop"], "u": "23f9-fe0f" }, { "n": ["record button", "black circle for record"], "u": "23fa-fe0f" }, { "n": ["eject", "eject button"], "u": "23cf-fe0f" }, { "n": ["cinema"], "u": "1f3a6" }, { "n": ["low brightness", "low brightness symbol"], "u": "1f505" }, { "n": ["high brightness", "high brightness symbol"], "u": "1f506" }, { "n": ["signal strength", "antenna with bars"], "u": "1f4f6" }, { "n": ["vibration mode"], "u": "1f4f3" }, { "n": ["mobile phone off"], "u": "1f4f4" }, { "n": ["female sign"], "u": "2640-fe0f" }, { "n": ["male sign"], "u": "2642-fe0f" }, { "n": ["transgender symbol"], "u": "26a7-fe0f" }, { "n": ["heavy multiplication x"], "u": "2716-fe0f" }, { "n": ["heavy plus sign"], "u": "2795" }, { "n": ["heavy minus sign"], "u": "2796" }, { "n": ["heavy division sign"], "u": "2797" }, { "n": ["heavy equals sign"], "u": "1f7f0" }, { "n": ["infinity"], "u": "267e-fe0f" }, { "n": ["bangbang", "double exclamation mark"], "u": "203c-fe0f" }, { "n": ["interrobang", "exclamation question mark"], "u": "2049-fe0f" }, { "n": ["question", "black question mark ornament"], "u": "2753" }, { "n": ["grey question", "white question mark ornament"], "u": "2754" }, { "n": ["grey exclamation", "white exclamation mark ornament"], "u": "2755" }, { "n": ["exclamation", "heavy exclamation mark", "heavy exclamation mark symbol"], "u": "2757" }, { "n": ["wavy dash"], "u": "3030-fe0f" }, { "n": ["currency exchange"], "u": "1f4b1" }, { "n": ["heavy dollar sign"], "u": "1f4b2" }, { "n": ["medical symbol", "staff of aesculapius"], "u": "2695-fe0f" }, { "n": ["recycle", "black universal recycling symbol"], "u": "267b-fe0f" }, { "n": ["fleur-de-lis", "fleur de lis"], "u": "269c-fe0f" }, { "n": ["trident", "trident emblem"], "u": "1f531" }, { "n": ["name badge"], "u": "1f4db" }, { "n": ["beginner", "japanese symbol for beginner"], "u": "1f530" }, { "n": ["o", "heavy large circle"], "u": "2b55" }, { "n": ["white check mark", "white heavy check mark"], "u": "2705" }, { "n": ["ballot box with check"], "u": "2611-fe0f" }, { "n": ["heavy check mark"], "u": "2714-fe0f" }, { "n": ["x", "cross mark"], "u": "274c" }, { "n": ["negative squared cross mark"], "u": "274e" }, { "n": ["curly loop"], "u": "27b0" }, { "n": ["loop", "double curly loop"], "u": "27bf" }, { "n": ["part alternation mark"], "u": "303d-fe0f" }, { "n": ["eight spoked asterisk"], "u": "2733-fe0f" }, { "n": ["eight pointed black star"], "u": "2734-fe0f" }, { "n": ["sparkle"], "u": "2747-fe0f" }, { "n": ["copyright", "copyright sign"], "u": "00a9-fe0f" }, { "n": ["registered", "registered sign"], "u": "00ae-fe0f" }, { "n": ["tm", "trade mark sign"], "u": "2122-fe0f" }, { "n": ["hash", "hash key"], "u": "0023-fe0f-20e3" }, { "n": ["keycap: *", "keycap star"], "u": "002a-fe0f-20e3" }, { "n": ["zero", "keycap 0"], "u": "0030-fe0f-20e3" }, { "n": ["one", "keycap 1"], "u": "0031-fe0f-20e3" }, { "n": ["two", "keycap 2"], "u": "0032-fe0f-20e3" }, { "n": ["three", "keycap 3"], "u": "0033-fe0f-20e3" }, { "n": ["four", "keycap 4"], "u": "0034-fe0f-20e3" }, { "n": ["five", "keycap 5"], "u": "0035-fe0f-20e3" }, { "n": ["six", "keycap 6"], "u": "0036-fe0f-20e3" }, { "n": ["seven", "keycap 7"], "u": "0037-fe0f-20e3" }, { "n": ["eight", "keycap 8"], "u": "0038-fe0f-20e3" }, { "n": ["nine", "keycap 9"], "u": "0039-fe0f-20e3" }, { "n": ["keycap ten"], "u": "1f51f" }, { "n": ["capital abcd", "input symbol for latin capital letters"], "u": "1f520" }, { "n": ["abcd", "input symbol for latin small letters"], "u": "1f521" }, { "n": ["1234", "input symbol for numbers"], "u": "1f522" }, { "n": ["symbols", "input symbol for symbols"], "u": "1f523" }, { "n": ["abc", "input symbol for latin letters"], "u": "1f524" }, { "n": ["a", "negative squared latin capital letter a"], "u": "1f170-fe0f" }, { "n": ["ab", "negative squared ab"], "u": "1f18e" }, { "n": ["b", "negative squared latin capital letter b"], "u": "1f171-fe0f" }, { "n": ["cl", "squared cl"], "u": "1f191" }, { "n": ["cool", "squared cool"], "u": "1f192" }, { "n": ["free", "squared free"], "u": "1f193" }, { "n": ["information source"], "u": "2139-fe0f" }, { "n": ["id", "squared id"], "u": "1f194" }, { "n": ["m", "circled latin capital letter m"], "u": "24c2-fe0f" }, { "n": ["new", "squared new"], "u": "1f195" }, { "n": ["ng", "squared ng"], "u": "1f196" }, { "n": ["o2", "negative squared latin capital letter o"], "u": "1f17e-fe0f" }, { "n": ["ok", "squared ok"], "u": "1f197" }, { "n": ["parking", "negative squared latin capital letter p"], "u": "1f17f-fe0f" }, { "n": ["sos", "squared sos"], "u": "1f198" }, { "n": ["up", "squared up with exclamation mark"], "u": "1f199" }, { "n": ["vs", "squared vs"], "u": "1f19a" }, { "n": ["koko", "squared katakana koko"], "u": "1f201" }, { "n": ["sa", "squared katakana sa"], "u": "1f202-fe0f" }, { "n": ["u6708", "squared cjk unified ideograph-6708"], "u": "1f237-fe0f" }, { "n": ["u6709", "squared cjk unified ideograph-6709"], "u": "1f236" }, { "n": ["u6307", "squared cjk unified ideograph-6307"], "u": "1f22f" }, { "n": ["ideograph advantage", "circled ideograph advantage"], "u": "1f250" }, { "n": ["u5272", "squared cjk unified ideograph-5272"], "u": "1f239" }, { "n": ["u7121", "squared cjk unified ideograph-7121"], "u": "1f21a" }, { "n": ["u7981", "squared cjk unified ideograph-7981"], "u": "1f232" }, { "n": ["accept", "circled ideograph accept"], "u": "1f251" }, { "n": ["u7533", "squared cjk unified ideograph-7533"], "u": "1f238" }, { "n": ["u5408", "squared cjk unified ideograph-5408"], "u": "1f234" }, { "n": ["u7a7a", "squared cjk unified ideograph-7a7a"], "u": "1f233" }, { "n": ["congratulations", "circled ideograph congratulation"], "u": "3297-fe0f" }, { "n": ["secret", "circled ideograph secret"], "u": "3299-fe0f" }, { "n": ["u55b6", "squared cjk unified ideograph-55b6"], "u": "1f23a" }, { "n": ["u6e80", "squared cjk unified ideograph-6e80"], "u": "1f235" }, { "n": ["red circle", "large red circle"], "u": "1f534" }, { "n": ["large orange circle"], "u": "1f7e0" }, { "n": ["large yellow circle"], "u": "1f7e1" }, { "n": ["large green circle"], "u": "1f7e2" }, { "n": ["large blue circle"], "u": "1f535" }, { "n": ["large purple circle"], "u": "1f7e3" }, { "n": ["large brown circle"], "u": "1f7e4" }, { "n": ["black circle", "medium black circle"], "u": "26ab" }, { "n": ["white circle", "medium white circle"], "u": "26aa" }, { "n": ["large red square"], "u": "1f7e5" }, { "n": ["large orange square"], "u": "1f7e7" }, { "n": ["large yellow square"], "u": "1f7e8" }, { "n": ["large green square"], "u": "1f7e9" }, { "n": ["large blue square"], "u": "1f7e6" }, { "n": ["large purple square"], "u": "1f7ea" }, { "n": ["large brown square"], "u": "1f7eb" }, { "n": ["black large square"], "u": "2b1b" }, { "n": ["white large square"], "u": "2b1c" }, { "n": ["black medium square"], "u": "25fc-fe0f" }, { "n": ["white medium square"], "u": "25fb-fe0f" }, { "n": ["black medium small square"], "u": "25fe" }, { "n": ["white medium small square"], "u": "25fd" }, { "n": ["black small square"], "u": "25aa-fe0f" }, { "n": ["white small square"], "u": "25ab-fe0f" }, { "n": ["large orange diamond"], "u": "1f536" }, { "n": ["large blue diamond"], "u": "1f537" }, { "n": ["small orange diamond"], "u": "1f538" }, { "n": ["small blue diamond"], "u": "1f539" }, { "n": ["small red triangle", "up-pointing red triangle"], "u": "1f53a" }, { "n": ["small red triangle down", "down-pointing red triangle"], "u": "1f53b" }, { "n": ["diamond shape with a dot inside"], "u": "1f4a0" }, { "n": ["radio button"], "u": "1f518" }, { "n": ["white square button"], "u": "1f533" }, { "n": ["black square button"], "u": "1f532" }], "flags": [{ "n": ["chequered flag", "checkered flag"], "u": "1f3c1" }, { "n": ["triangular flag on post"], "u": "1f6a9" }, { "n": ["crossed flags"], "u": "1f38c" }, { "n": ["waving black flag"], "u": "1f3f4" }, { "n": ["white flag", "waving white flag"], "u": "1f3f3-fe0f" }, { "n": ["rainbow flag", "rainbow-flag"], "u": "1f3f3-fe0f-200d-1f308" }, { "n": ["transgender flag"], "u": "1f3f3-fe0f-200d-26a7-fe0f" }, { "n": ["pirate flag"], "u": "1f3f4-200d-2620-fe0f" }, { "n": ["flag-ac", "ascension island flag"], "u": "1f1e6-1f1e8" }, { "n": ["flag-ad", "andorra flag"], "u": "1f1e6-1f1e9" }, { "n": ["flag-ae", "united arab emirates flag"], "u": "1f1e6-1f1ea" }, { "n": ["flag-af", "afghanistan flag"], "u": "1f1e6-1f1eb" }, { "n": ["flag-ag", "antigua & barbuda flag"], "u": "1f1e6-1f1ec" }, { "n": ["flag-ai", "anguilla flag"], "u": "1f1e6-1f1ee" }, { "n": ["flag-al", "albania flag"], "u": "1f1e6-1f1f1" }, { "n": ["flag-am", "armenia flag"], "u": "1f1e6-1f1f2" }, { "n": ["flag-ao", "angola flag"], "u": "1f1e6-1f1f4" }, { "n": ["flag-aq", "antarctica flag"], "u": "1f1e6-1f1f6" }, { "n": ["flag-ar", "argentina flag"], "u": "1f1e6-1f1f7" }, { "n": ["flag-as", "american samoa flag"], "u": "1f1e6-1f1f8" }, { "n": ["flag-at", "austria flag"], "u": "1f1e6-1f1f9" }, { "n": ["flag-au", "australia flag"], "u": "1f1e6-1f1fa" }, { "n": ["flag-aw", "aruba flag"], "u": "1f1e6-1f1fc" }, { "n": ["flag-ax", "\xE5land islands flag"], "u": "1f1e6-1f1fd" }, { "n": ["flag-az", "azerbaijan flag"], "u": "1f1e6-1f1ff" }, { "n": ["flag-ba", "bosnia & herzegovina flag"], "u": "1f1e7-1f1e6" }, { "n": ["flag-bb", "barbados flag"], "u": "1f1e7-1f1e7" }, { "n": ["flag-bd", "bangladesh flag"], "u": "1f1e7-1f1e9" }, { "n": ["flag-be", "belgium flag"], "u": "1f1e7-1f1ea" }, { "n": ["flag-bf", "burkina faso flag"], "u": "1f1e7-1f1eb" }, { "n": ["flag-bg", "bulgaria flag"], "u": "1f1e7-1f1ec" }, { "n": ["flag-bh", "bahrain flag"], "u": "1f1e7-1f1ed" }, { "n": ["flag-bi", "burundi flag"], "u": "1f1e7-1f1ee" }, { "n": ["flag-bj", "benin flag"], "u": "1f1e7-1f1ef" }, { "n": ["flag-bl", "st. barth\xE9lemy flag"], "u": "1f1e7-1f1f1" }, { "n": ["flag-bm", "bermuda flag"], "u": "1f1e7-1f1f2" }, { "n": ["flag-bn", "brunei flag"], "u": "1f1e7-1f1f3" }, { "n": ["flag-bo", "bolivia flag"], "u": "1f1e7-1f1f4" }, { "n": ["flag-bq", "caribbean netherlands flag"], "u": "1f1e7-1f1f6" }, { "n": ["flag-br", "brazil flag"], "u": "1f1e7-1f1f7" }, { "n": ["flag-bs", "bahamas flag"], "u": "1f1e7-1f1f8" }, { "n": ["flag-bt", "bhutan flag"], "u": "1f1e7-1f1f9" }, { "n": ["flag-bv", "bouvet island flag"], "u": "1f1e7-1f1fb" }, { "n": ["flag-bw", "botswana flag"], "u": "1f1e7-1f1fc" }, { "n": ["flag-by", "belarus flag"], "u": "1f1e7-1f1fe" }, { "n": ["flag-bz", "belize flag"], "u": "1f1e7-1f1ff" }, { "n": ["flag-ca", "canada flag"], "u": "1f1e8-1f1e6" }, { "n": ["flag-cc", "cocos (keeling) islands flag"], "u": "1f1e8-1f1e8" }, { "n": ["flag-cd", "congo - kinshasa flag"], "u": "1f1e8-1f1e9" }, { "n": ["flag-cf", "central african republic flag"], "u": "1f1e8-1f1eb" }, { "n": ["flag-cg", "congo - brazzaville flag"], "u": "1f1e8-1f1ec" }, { "n": ["flag-ch", "switzerland flag"], "u": "1f1e8-1f1ed" }, { "n": ["flag-ci", "c\xF4te d\u2019ivoire flag"], "u": "1f1e8-1f1ee" }, { "n": ["flag-ck", "cook islands flag"], "u": "1f1e8-1f1f0" }, { "n": ["flag-cl", "chile flag"], "u": "1f1e8-1f1f1" }, { "n": ["flag-cm", "cameroon flag"], "u": "1f1e8-1f1f2" }, { "n": ["cn", "flag-cn", "china flag"], "u": "1f1e8-1f1f3" }, { "n": ["flag-co", "colombia flag"], "u": "1f1e8-1f1f4" }, { "n": ["flag-cp", "clipperton island flag"], "u": "1f1e8-1f1f5" }, { "n": ["flag-cr", "costa rica flag"], "u": "1f1e8-1f1f7" }, { "n": ["flag-cu", "cuba flag"], "u": "1f1e8-1f1fa" }, { "n": ["flag-cv", "cape verde flag"], "u": "1f1e8-1f1fb" }, { "n": ["flag-cw", "cura\xE7ao flag"], "u": "1f1e8-1f1fc" }, { "n": ["flag-cx", "christmas island flag"], "u": "1f1e8-1f1fd" }, { "n": ["flag-cy", "cyprus flag"], "u": "1f1e8-1f1fe" }, { "n": ["flag-cz", "czechia flag"], "u": "1f1e8-1f1ff" }, { "n": ["de", "flag-de", "germany flag"], "u": "1f1e9-1f1ea" }, { "n": ["flag-dg", "diego garcia flag"], "u": "1f1e9-1f1ec" }, { "n": ["flag-dj", "djibouti flag"], "u": "1f1e9-1f1ef" }, { "n": ["flag-dk", "denmark flag"], "u": "1f1e9-1f1f0" }, { "n": ["flag-dm", "dominica flag"], "u": "1f1e9-1f1f2" }, { "n": ["flag-do", "dominican republic flag"], "u": "1f1e9-1f1f4" }, { "n": ["flag-dz", "algeria flag"], "u": "1f1e9-1f1ff" }, { "n": ["flag-ea", "ceuta & melilla flag"], "u": "1f1ea-1f1e6" }, { "n": ["flag-ec", "ecuador flag"], "u": "1f1ea-1f1e8" }, { "n": ["flag-ee", "estonia flag"], "u": "1f1ea-1f1ea" }, { "n": ["flag-eg", "egypt flag"], "u": "1f1ea-1f1ec" }, { "n": ["flag-eh", "western sahara flag"], "u": "1f1ea-1f1ed" }, { "n": ["flag-er", "eritrea flag"], "u": "1f1ea-1f1f7" }, { "n": ["es", "flag-es", "spain flag"], "u": "1f1ea-1f1f8" }, { "n": ["flag-et", "ethiopia flag"], "u": "1f1ea-1f1f9" }, { "n": ["flag-eu", "european union flag"], "u": "1f1ea-1f1fa" }, { "n": ["flag-fi", "finland flag"], "u": "1f1eb-1f1ee" }, { "n": ["flag-fj", "fiji flag"], "u": "1f1eb-1f1ef" }, { "n": ["flag-fk", "falkland islands flag"], "u": "1f1eb-1f1f0" }, { "n": ["flag-fm", "micronesia flag"], "u": "1f1eb-1f1f2" }, { "n": ["flag-fo", "faroe islands flag"], "u": "1f1eb-1f1f4" }, { "n": ["fr", "flag-fr", "france flag"], "u": "1f1eb-1f1f7" }, { "n": ["flag-ga", "gabon flag"], "u": "1f1ec-1f1e6" }, { "n": ["gb", "uk", "flag-gb", "united kingdom flag"], "u": "1f1ec-1f1e7" }, { "n": ["flag-gd", "grenada flag"], "u": "1f1ec-1f1e9" }, { "n": ["flag-ge", "georgia flag"], "u": "1f1ec-1f1ea" }, { "n": ["flag-gf", "french guiana flag"], "u": "1f1ec-1f1eb" }, { "n": ["flag-gg", "guernsey flag"], "u": "1f1ec-1f1ec" }, { "n": ["flag-gh", "ghana flag"], "u": "1f1ec-1f1ed" }, { "n": ["flag-gi", "gibraltar flag"], "u": "1f1ec-1f1ee" }, { "n": ["flag-gl", "greenland flag"], "u": "1f1ec-1f1f1" }, { "n": ["flag-gm", "gambia flag"], "u": "1f1ec-1f1f2" }, { "n": ["flag-gn", "guinea flag"], "u": "1f1ec-1f1f3" }, { "n": ["flag-gp", "guadeloupe flag"], "u": "1f1ec-1f1f5" }, { "n": ["flag-gq", "equatorial guinea flag"], "u": "1f1ec-1f1f6" }, { "n": ["flag-gr", "greece flag"], "u": "1f1ec-1f1f7" }, { "n": ["flag-gs", "south georgia & south sandwich islands flag"], "u": "1f1ec-1f1f8" }, { "n": ["flag-gt", "guatemala flag"], "u": "1f1ec-1f1f9" }, { "n": ["flag-gu", "guam flag"], "u": "1f1ec-1f1fa" }, { "n": ["flag-gw", "guinea-bissau flag"], "u": "1f1ec-1f1fc" }, { "n": ["flag-gy", "guyana flag"], "u": "1f1ec-1f1fe" }, { "n": ["flag-hk", "hong kong sar china flag"], "u": "1f1ed-1f1f0" }, { "n": ["flag-hm", "heard & mcdonald islands flag"], "u": "1f1ed-1f1f2" }, { "n": ["flag-hn", "honduras flag"], "u": "1f1ed-1f1f3" }, { "n": ["flag-hr", "croatia flag"], "u": "1f1ed-1f1f7" }, { "n": ["flag-ht", "haiti flag"], "u": "1f1ed-1f1f9" }, { "n": ["flag-hu", "hungary flag"], "u": "1f1ed-1f1fa" }, { "n": ["flag-ic", "canary islands flag"], "u": "1f1ee-1f1e8" }, { "n": ["flag-id", "indonesia flag"], "u": "1f1ee-1f1e9" }, { "n": ["flag-ie", "ireland flag"], "u": "1f1ee-1f1ea" }, { "n": ["flag-il", "israel flag"], "u": "1f1ee-1f1f1" }, { "n": ["flag-im", "isle of man flag"], "u": "1f1ee-1f1f2" }, { "n": ["flag-in", "india flag"], "u": "1f1ee-1f1f3" }, { "n": ["flag-io", "british indian ocean territory flag"], "u": "1f1ee-1f1f4" }, { "n": ["flag-iq", "iraq flag"], "u": "1f1ee-1f1f6" }, { "n": ["flag-ir", "iran flag"], "u": "1f1ee-1f1f7" }, { "n": ["flag-is", "iceland flag"], "u": "1f1ee-1f1f8" }, { "n": ["it", "flag-it", "italy flag"], "u": "1f1ee-1f1f9" }, { "n": ["flag-je", "jersey flag"], "u": "1f1ef-1f1ea" }, { "n": ["flag-jm", "jamaica flag"], "u": "1f1ef-1f1f2" }, { "n": ["flag-jo", "jordan flag"], "u": "1f1ef-1f1f4" }, { "n": ["jp", "flag-jp", "japan flag"], "u": "1f1ef-1f1f5" }, { "n": ["flag-ke", "kenya flag"], "u": "1f1f0-1f1ea" }, { "n": ["flag-kg", "kyrgyzstan flag"], "u": "1f1f0-1f1ec" }, { "n": ["flag-kh", "cambodia flag"], "u": "1f1f0-1f1ed" }, { "n": ["flag-ki", "kiribati flag"], "u": "1f1f0-1f1ee" }, { "n": ["flag-km", "comoros flag"], "u": "1f1f0-1f1f2" }, { "n": ["flag-kn", "st. kitts & nevis flag"], "u": "1f1f0-1f1f3" }, { "n": ["flag-kp", "north korea flag"], "u": "1f1f0-1f1f5" }, { "n": ["kr", "flag-kr", "south korea flag"], "u": "1f1f0-1f1f7" }, { "n": ["flag-kw", "kuwait flag"], "u": "1f1f0-1f1fc" }, { "n": ["flag-ky", "cayman islands flag"], "u": "1f1f0-1f1fe" }, { "n": ["flag-kz", "kazakhstan flag"], "u": "1f1f0-1f1ff" }, { "n": ["flag-la", "laos flag"], "u": "1f1f1-1f1e6" }, { "n": ["flag-lb", "lebanon flag"], "u": "1f1f1-1f1e7" }, { "n": ["flag-lc", "st. lucia flag"], "u": "1f1f1-1f1e8" }, { "n": ["flag-li", "liechtenstein flag"], "u": "1f1f1-1f1ee" }, { "n": ["flag-lk", "sri lanka flag"], "u": "1f1f1-1f1f0" }, { "n": ["flag-lr", "liberia flag"], "u": "1f1f1-1f1f7" }, { "n": ["flag-ls", "lesotho flag"], "u": "1f1f1-1f1f8" }, { "n": ["flag-lt", "lithuania flag"], "u": "1f1f1-1f1f9" }, { "n": ["flag-lu", "luxembourg flag"], "u": "1f1f1-1f1fa" }, { "n": ["flag-lv", "latvia flag"], "u": "1f1f1-1f1fb" }, { "n": ["flag-ly", "libya flag"], "u": "1f1f1-1f1fe" }, { "n": ["flag-ma", "morocco flag"], "u": "1f1f2-1f1e6" }, { "n": ["flag-mc", "monaco flag"], "u": "1f1f2-1f1e8" }, { "n": ["flag-md", "moldova flag"], "u": "1f1f2-1f1e9" }, { "n": ["flag-me", "montenegro flag"], "u": "1f1f2-1f1ea" }, { "n": ["flag-mf", "st. martin flag"], "u": "1f1f2-1f1eb" }, { "n": ["flag-mg", "madagascar flag"], "u": "1f1f2-1f1ec" }, { "n": ["flag-mh", "marshall islands flag"], "u": "1f1f2-1f1ed" }, { "n": ["flag-mk", "north macedonia flag"], "u": "1f1f2-1f1f0" }, { "n": ["flag-ml", "mali flag"], "u": "1f1f2-1f1f1" }, { "n": ["flag-mm", "myanmar (burma) flag"], "u": "1f1f2-1f1f2" }, { "n": ["flag-mn", "mongolia flag"], "u": "1f1f2-1f1f3" }, { "n": ["flag-mo", "macao sar china flag"], "u": "1f1f2-1f1f4" }, { "n": ["flag-mp", "northern mariana islands flag"], "u": "1f1f2-1f1f5" }, { "n": ["flag-mq", "martinique flag"], "u": "1f1f2-1f1f6" }, { "n": ["flag-mr", "mauritania flag"], "u": "1f1f2-1f1f7" }, { "n": ["flag-ms", "montserrat flag"], "u": "1f1f2-1f1f8" }, { "n": ["flag-mt", "malta flag"], "u": "1f1f2-1f1f9" }, { "n": ["flag-mu", "mauritius flag"], "u": "1f1f2-1f1fa" }, { "n": ["flag-mv", "maldives flag"], "u": "1f1f2-1f1fb" }, { "n": ["flag-mw", "malawi flag"], "u": "1f1f2-1f1fc" }, { "n": ["flag-mx", "mexico flag"], "u": "1f1f2-1f1fd" }, { "n": ["flag-my", "malaysia flag"], "u": "1f1f2-1f1fe" }, { "n": ["flag-mz", "mozambique flag"], "u": "1f1f2-1f1ff" }, { "n": ["flag-na", "namibia flag"], "u": "1f1f3-1f1e6" }, { "n": ["flag-nc", "new caledonia flag"], "u": "1f1f3-1f1e8" }, { "n": ["flag-ne", "niger flag"], "u": "1f1f3-1f1ea" }, { "n": ["flag-nf", "norfolk island flag"], "u": "1f1f3-1f1eb" }, { "n": ["flag-ng", "nigeria flag"], "u": "1f1f3-1f1ec" }, { "n": ["flag-ni", "nicaragua flag"], "u": "1f1f3-1f1ee" }, { "n": ["flag-nl", "netherlands flag"], "u": "1f1f3-1f1f1" }, { "n": ["flag-no", "norway flag"], "u": "1f1f3-1f1f4" }, { "n": ["flag-np", "nepal flag"], "u": "1f1f3-1f1f5" }, { "n": ["flag-nr", "nauru flag"], "u": "1f1f3-1f1f7" }, { "n": ["flag-nu", "niue flag"], "u": "1f1f3-1f1fa" }, { "n": ["flag-nz", "new zealand flag"], "u": "1f1f3-1f1ff" }, { "n": ["flag-om", "oman flag"], "u": "1f1f4-1f1f2" }, { "n": ["flag-pa", "panama flag"], "u": "1f1f5-1f1e6" }, { "n": ["flag-pe", "peru flag"], "u": "1f1f5-1f1ea" }, { "n": ["flag-pf", "french polynesia flag"], "u": "1f1f5-1f1eb" }, { "n": ["flag-pg", "papua new guinea flag"], "u": "1f1f5-1f1ec" }, { "n": ["flag-ph", "philippines flag"], "u": "1f1f5-1f1ed" }, { "n": ["flag-pk", "pakistan flag"], "u": "1f1f5-1f1f0" }, { "n": ["flag-pl", "poland flag"], "u": "1f1f5-1f1f1" }, { "n": ["flag-pm", "st. pierre & miquelon flag"], "u": "1f1f5-1f1f2" }, { "n": ["flag-pn", "pitcairn islands flag"], "u": "1f1f5-1f1f3" }, { "n": ["flag-pr", "puerto rico flag"], "u": "1f1f5-1f1f7" }, { "n": ["flag-ps", "palestinian territories flag"], "u": "1f1f5-1f1f8" }, { "n": ["flag-pt", "portugal flag"], "u": "1f1f5-1f1f9" }, { "n": ["flag-pw", "palau flag"], "u": "1f1f5-1f1fc" }, { "n": ["flag-py", "paraguay flag"], "u": "1f1f5-1f1fe" }, { "n": ["flag-qa", "qatar flag"], "u": "1f1f6-1f1e6" }, { "n": ["flag-re", "r\xE9union flag"], "u": "1f1f7-1f1ea" }, { "n": ["flag-ro", "romania flag"], "u": "1f1f7-1f1f4" }, { "n": ["flag-rs", "serbia flag"], "u": "1f1f7-1f1f8" }, { "n": ["ru", "flag-ru", "russia flag"], "u": "1f1f7-1f1fa" }, { "n": ["flag-rw", "rwanda flag"], "u": "1f1f7-1f1fc" }, { "n": ["flag-sa", "saudi arabia flag"], "u": "1f1f8-1f1e6" }, { "n": ["flag-sb", "solomon islands flag"], "u": "1f1f8-1f1e7" }, { "n": ["flag-sc", "seychelles flag"], "u": "1f1f8-1f1e8" }, { "n": ["flag-sd", "sudan flag"], "u": "1f1f8-1f1e9" }, { "n": ["flag-se", "sweden flag"], "u": "1f1f8-1f1ea" }, { "n": ["flag-sg", "singapore flag"], "u": "1f1f8-1f1ec" }, { "n": ["flag-sh", "st. helena flag"], "u": "1f1f8-1f1ed" }, { "n": ["flag-si", "slovenia flag"], "u": "1f1f8-1f1ee" }, { "n": ["flag-sj", "svalbard & jan mayen flag"], "u": "1f1f8-1f1ef" }, { "n": ["flag-sk", "slovakia flag"], "u": "1f1f8-1f1f0" }, { "n": ["flag-sl", "sierra leone flag"], "u": "1f1f8-1f1f1" }, { "n": ["flag-sm", "san marino flag"], "u": "1f1f8-1f1f2" }, { "n": ["flag-sn", "senegal flag"], "u": "1f1f8-1f1f3" }, { "n": ["flag-so", "somalia flag"], "u": "1f1f8-1f1f4" }, { "n": ["flag-sr", "suriname flag"], "u": "1f1f8-1f1f7" }, { "n": ["flag-ss", "south sudan flag"], "u": "1f1f8-1f1f8" }, { "n": ["flag-st", "s\xE3o tom\xE9 & pr\xEDncipe flag"], "u": "1f1f8-1f1f9" }, { "n": ["flag-sv", "el salvador flag"], "u": "1f1f8-1f1fb" }, { "n": ["flag-sx", "sint maarten flag"], "u": "1f1f8-1f1fd" }, { "n": ["flag-sy", "syria flag"], "u": "1f1f8-1f1fe" }, { "n": ["flag-sz", "eswatini flag"], "u": "1f1f8-1f1ff" }, { "n": ["flag-ta", "tristan da cunha flag"], "u": "1f1f9-1f1e6" }, { "n": ["flag-tc", "turks & caicos islands flag"], "u": "1f1f9-1f1e8" }, { "n": ["flag-td", "chad flag"], "u": "1f1f9-1f1e9" }, { "n": ["flag-tf", "french southern territories flag"], "u": "1f1f9-1f1eb" }, { "n": ["flag-tg", "togo flag"], "u": "1f1f9-1f1ec" }, { "n": ["flag-th", "thailand flag"], "u": "1f1f9-1f1ed" }, { "n": ["flag-tj", "tajikistan flag"], "u": "1f1f9-1f1ef" }, { "n": ["flag-tk", "tokelau flag"], "u": "1f1f9-1f1f0" }, { "n": ["flag-tl", "timor-leste flag"], "u": "1f1f9-1f1f1" }, { "n": ["flag-tm", "turkmenistan flag"], "u": "1f1f9-1f1f2" }, { "n": ["flag-tn", "tunisia flag"], "u": "1f1f9-1f1f3" }, { "n": ["flag-to", "tonga flag"], "u": "1f1f9-1f1f4" }, { "n": ["flag-tr", "turkey flag"], "u": "1f1f9-1f1f7" }, { "n": ["flag-tt", "trinidad & tobago flag"], "u": "1f1f9-1f1f9" }, { "n": ["flag-tv", "tuvalu flag"], "u": "1f1f9-1f1fb" }, { "n": ["flag-tw", "taiwan flag"], "u": "1f1f9-1f1fc" }, { "n": ["flag-tz", "tanzania flag"], "u": "1f1f9-1f1ff" }, { "n": ["flag-ua", "ukraine flag"], "u": "1f1fa-1f1e6" }, { "n": ["flag-ug", "uganda flag"], "u": "1f1fa-1f1ec" }, { "n": ["flag-um", "u.s. outlying islands flag"], "u": "1f1fa-1f1f2" }, { "n": ["flag-un", "united nations flag"], "u": "1f1fa-1f1f3" }, { "n": ["us", "flag-us", "united states flag"], "u": "1f1fa-1f1f8" }, { "n": ["flag-uy", "uruguay flag"], "u": "1f1fa-1f1fe" }, { "n": ["flag-uz", "uzbekistan flag"], "u": "1f1fa-1f1ff" }, { "n": ["flag-va", "vatican city flag"], "u": "1f1fb-1f1e6" }, { "n": ["flag-vc", "st. vincent & grenadines flag"], "u": "1f1fb-1f1e8" }, { "n": ["flag-ve", "venezuela flag"], "u": "1f1fb-1f1ea" }, { "n": ["flag-vg", "british virgin islands flag"], "u": "1f1fb-1f1ec" }, { "n": ["flag-vi", "u.s. virgin islands flag"], "u": "1f1fb-1f1ee" }, { "n": ["flag-vn", "vietnam flag"], "u": "1f1fb-1f1f3" }, { "n": ["flag-vu", "vanuatu flag"], "u": "1f1fb-1f1fa" }, { "n": ["flag-wf", "wallis & futuna flag"], "u": "1f1fc-1f1eb" }, { "n": ["flag-ws", "samoa flag"], "u": "1f1fc-1f1f8" }, { "n": ["flag-xk", "kosovo flag"], "u": "1f1fd-1f1f0" }, { "n": ["flag-ye", "yemen flag"], "u": "1f1fe-1f1ea" }, { "n": ["flag-yt", "mayotte flag"], "u": "1f1fe-1f1f9" }, { "n": ["flag-za", "south africa flag"], "u": "1f1ff-1f1e6" }, { "n": ["flag-zm", "zambia flag"], "u": "1f1ff-1f1f2" }, { "n": ["flag-zw", "zimbabwe flag"], "u": "1f1ff-1f1fc" }, { "n": ["england flag", "flag-england"], "u": "1f3f4-e0067-e0062-e0065-e006e-e0067-e007f" }, { "n": ["scotland flag", "flag-scotland"], "u": "1f3f4-e0067-e0062-e0073-e0063-e0074-e007f" }, { "n": ["wales flag", "flag-wales"], "u": "1f3f4-e0067-e0062-e0077-e006c-e0073-e007f" }] }; -// node_modules/@headlessui/react/dist/utils/match.js -function u4(r6, n4, ...a5) { - if (r6 in n4) { - let e5 = n4[r6]; - return typeof e5 == "function" ? e5(...a5) : e5; +// src/components/Spaces/FileStickerMenu/FileStickerMenu.tsx +var import_obsidian6 = require("obsidian"); +var StickerModal = class extends import_obsidian6.FuzzySuggestModal { + constructor(app2, setIcon3) { + super(app2); + this.setIcon = setIcon3; + this.resultContainerEl.toggleClass("mk-sticker-modal", true); + this.inputEl.focus(); + this.emptyStateText = i18n_default.labels.findStickers; + this.limit = 0; } - let t3 = new Error(`Tried to handle "${r6}" but there is no handler defined. Only defined handlers are: ${Object.keys(n4).map((e5) => `"${e5}"`).join(", ")}.`); - throw Error.captureStackTrace && Error.captureStackTrace(t3, u4), t3; -} - -// node_modules/@headlessui/react/dist/utils/owner.js -function e4(r6) { - return e3 ? null : r6 instanceof Node ? r6.ownerDocument : r6 != null && r6.hasOwnProperty("current") && r6.current instanceof Node ? r6.current.ownerDocument : document; -} - -// node_modules/@headlessui/react/dist/utils/focus-management.js -var m3 = ["[contentEditable=true]", "[tabindex]", "a[href]", "area[href]", "button:not([disabled])", "iframe", "input:not([disabled])", "select:not([disabled])", "textarea:not([disabled])"].map((e5) => `${e5}:not([tabindex='-1'])`).join(","); -var T5 = ((n4) => (n4[n4.First = 1] = "First", n4[n4.Previous = 2] = "Previous", n4[n4.Next = 4] = "Next", n4[n4.Last = 8] = "Last", n4[n4.WrapAround = 16] = "WrapAround", n4[n4.NoScroll = 32] = "NoScroll", n4))(T5 || {}); -var M3 = ((o6) => (o6[o6.Error = 0] = "Error", o6[o6.Overflow = 1] = "Overflow", o6[o6.Success = 2] = "Success", o6[o6.Underflow = 3] = "Underflow", o6))(M3 || {}); -var b3 = ((r6) => (r6[r6.Previous = -1] = "Previous", r6[r6.Next = 1] = "Next", r6))(b3 || {}); -function d3(e5 = document.body) { - return e5 == null ? [] : Array.from(e5.querySelectorAll(m3)); -} -var N3 = ((r6) => (r6[r6.Strict = 0] = "Strict", r6[r6.Loose = 1] = "Loose", r6))(N3 || {}); -function F3(e5, t3 = 0) { - var r6; - return e5 === ((r6 = e4(e5)) == null ? void 0 : r6.body) ? false : u4(t3, { [0]() { - return e5.matches(m3); - }, [1]() { - let l4 = e5; - for (; l4 !== null; ) { - if (l4.matches(m3)) - return true; - l4 = l4.parentElement; - } - return false; - } }); -} -var w4 = ["textarea", "input"].join(","); -function H3(e5) { - var t3, r6; - return (r6 = (t3 = e5 == null ? void 0 : e5.matches) == null ? void 0 : t3.call(e5, w4)) != null ? r6 : false; -} -function S2(e5, t3 = (r6) => r6) { - return e5.slice().sort((r6, l4) => { - let o6 = t3(r6), s10 = t3(l4); - if (o6 === null || s10 === null) - return 0; - let n4 = o6.compareDocumentPosition(s10); - return n4 & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : n4 & Node.DOCUMENT_POSITION_PRECEDING ? 1 : 0; - }); -} -function O3(e5, t3, r6 = true, l4 = null) { - let o6 = Array.isArray(e5) ? e5.length > 0 ? e5[0].ownerDocument : document : e5.ownerDocument, s10 = Array.isArray(e5) ? r6 ? S2(e5) : e5 : d3(e5); - l4 = l4 != null ? l4 : o6.activeElement; - let n4 = (() => { - if (t3 & 5) - return 1; - if (t3 & 10) - return -1; - throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last"); - })(), E3 = (() => { - if (t3 & 1) - return 0; - if (t3 & 2) - return Math.max(0, s10.indexOf(l4)) - 1; - if (t3 & 4) - return Math.max(0, s10.indexOf(l4)) + 1; - if (t3 & 8) - return s10.length - 1; - throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last"); - })(), x4 = t3 & 32 ? { preventScroll: true } : {}, f4 = 0, i5 = s10.length, u6; - do { - if (f4 >= i5 || f4 + i5 <= 0) - return 0; - let a5 = E3 + f4; - if (t3 & 16) - a5 = (a5 + i5) % i5; - else { - if (a5 < 0) - return 3; - if (a5 >= i5) - return 1; - } - u6 = s10[a5], u6 == null || u6.focus(x4), f4 += n4; - } while (u6 !== o6.activeElement); - return t3 & 6 && H3(u6) && u6.select(), u6.hasAttribute("tabindex") || u6.setAttribute("tabindex", "0"), 2; -} - -// node_modules/@headlessui/react/dist/hooks/use-document-event.js -function d4(e5, r6, n4) { - let o6 = s4(r6); - h2(() => { - function t3(u6) { - o6.current(u6); - } - return document.addEventListener(e5, t3, n4), () => document.removeEventListener(e5, t3, n4); - }, [e5, n4]); -} - -// node_modules/@headlessui/react/dist/hooks/use-outside-click.js -function L3(E3, m5, c3 = true) { - let i5 = _2(false); - h2(() => { - requestAnimationFrame(() => { - i5.current = c3; - }); - }, [c3]); - function f4(e5, o6) { - if (!i5.current || e5.defaultPrevented) - return; - let l4 = function r6(t3) { - return typeof t3 == "function" ? r6(t3()) : Array.isArray(t3) || t3 instanceof Set ? t3 : [t3]; - }(E3), n4 = o6(e5); - if (n4 !== null && !!n4.getRootNode().contains(n4)) { - for (let r6 of l4) { - if (r6 === null) - continue; - let t3 = r6 instanceof HTMLElement ? r6 : r6.current; - if (t3 != null && t3.contains(n4)) - return; - } - return !F3(n4, N3.Loose) && n4.tabIndex !== -1 && e5.preventDefault(), m5(e5, n4); - } + renderSuggestion(item, el) { + el.innerHTML = unifiedToNative(item.item.unicode); + el.setAttr("aria-label", item.item.label); } - let u6 = _2(null); - d4("mousedown", (e5) => { - var o6, l4; - i5.current && (u6.current = ((l4 = (o6 = e5.composedPath) == null ? void 0 : o6.call(e5)) == null ? void 0 : l4[0]) || e5.target); - }, true), d4("click", (e5) => { - !u6.current || (f4(e5, () => u6.current), u6.current = null); - }, true), d4("blur", (e5) => f4(e5, () => window.document.activeElement instanceof HTMLIFrameElement ? window.document.activeElement : null), true); -} - -// node_modules/@headlessui/react/dist/hooks/use-resolve-button-type.js -function i3(t3) { - var n4; - if (t3.type) - return t3.type; - let e5 = (n4 = t3.as) != null ? n4 : "button"; - if (typeof e5 == "string" && e5.toLowerCase() === "button") - return "button"; -} -function s5(t3, e5) { - let [n4, u6] = p2(() => i3(t3)); - return s3(() => { - u6(i3(t3)); - }, [t3.type, t3.as]), s3(() => { - n4 || !e5.current || e5.current instanceof HTMLButtonElement && !e5.current.hasAttribute("type") && u6("button"); - }, [n4, e5]), n4; -} - -// node_modules/@headlessui/react/dist/hooks/use-sync-refs.js -var u5 = Symbol(); -function T6(t3, n4 = true) { - return Object.assign(t3, { [u5]: n4 }); -} -function y3(...t3) { - let n4 = _2(t3); - h2(() => { - n4.current = t3; - }, [t3]); - let c3 = o3((e5) => { - for (let o6 of n4.current) - o6 != null && (typeof o6 == "function" ? o6(e5) : o6.current = e5); - }); - return t3.every((e5) => e5 == null || (e5 == null ? void 0 : e5[u5])) ? void 0 : c3; -} - -// node_modules/@headlessui/react/dist/utils/render.js -var S3 = ((a5) => (a5[a5.None = 0] = "None", a5[a5.RenderStrategy = 1] = "RenderStrategy", a5[a5.Static = 2] = "Static", a5))(S3 || {}); -var j4 = ((e5) => (e5[e5.Unmount = 0] = "Unmount", e5[e5.Hidden = 1] = "Hidden", e5))(j4 || {}); -function $3({ ourProps: r6, theirProps: t3, slot: e5, defaultTag: a5, features: o6, visible: n4 = true, name: l4 }) { - let s10 = T7(t3, r6); - if (n4) - return p3(s10, e5, a5, l4); - let u6 = o6 != null ? o6 : 0; - if (u6 & 2) { - let { static: i5 = false, ...d5 } = s10; - if (i5) - return p3(d5, e5, a5, l4); - } - if (u6 & 1) { - let { unmount: i5 = true, ...d5 } = s10; - return u4(i5 ? 0 : 1, { [0]() { - return null; - }, [1]() { - return p3({ ...d5, hidden: true, style: { display: "none" } }, e5, a5, l4); - } }); - } - return p3(s10, e5, a5, l4); -} -function p3(r6, t3 = {}, e5, a5) { - let { as: o6 = e5, children: n4, refName: l4 = "ref", ...s10 } = m4(r6, ["unmount", "static"]), u6 = r6.ref !== void 0 ? { [l4]: r6.ref } : {}, i5 = typeof n4 == "function" ? n4(t3) : n4; - s10.className && typeof s10.className == "function" && (s10.className = s10.className(t3)); - let d5 = {}; - if (t3) { - let f4 = false, y4 = []; - for (let [h4, g4] of Object.entries(t3)) - typeof g4 == "boolean" && (f4 = true), g4 === true && y4.push(h4); - f4 && (d5["data-headlessui-state"] = y4.join(" ")); - } - if (o6 === p && Object.keys(F4(s10)).length > 0) { - if (!ln(i5) || Array.isArray(i5) && i5.length > 1) - throw new Error(['Passing props on "Fragment"!', "", `The current component <${a5} /> is rendering a "Fragment".`, "However we need to passthrough the following props:", Object.keys(s10).map((f4) => ` - ${f4}`).join(` -`), "", "You can apply a few solutions:", ['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".', "Render a single element as the child so that we can forward the props onto that element."].map((f4) => ` - ${f4}`).join(` -`)].join(` -`)); - return cn(i5, Object.assign({}, T7(i5.props, F4(m4(s10, ["ref"]))), d5, u6, w5(i5.ref, u6.ref))); - } - return h(o6, Object.assign({}, m4(s10, ["ref"]), o6 !== p && u6, o6 !== p && d5), i5); -} -function w5(...r6) { - return { ref: r6.every((t3) => t3 == null) ? void 0 : (t3) => { - for (let e5 of r6) - e5 != null && (typeof e5 == "function" ? e5(t3) : e5.current = t3); - } }; -} -function T7(...r6) { - var a5; - if (r6.length === 0) - return {}; - if (r6.length === 1) - return r6[0]; - let t3 = {}, e5 = {}; - for (let o6 of r6) - for (let n4 in o6) - n4.startsWith("on") && typeof o6[n4] == "function" ? ((a5 = e5[n4]) != null || (e5[n4] = []), e5[n4].push(o6[n4])) : t3[n4] = o6[n4]; - if (t3.disabled || t3["aria-disabled"]) - return Object.assign(t3, Object.fromEntries(Object.keys(e5).map((o6) => [o6, void 0]))); - for (let o6 in e5) - Object.assign(t3, { [o6](n4, ...l4) { - let s10 = e5[o6]; - for (let u6 of s10) { - if ((n4 instanceof Event || (n4 == null ? void 0 : n4.nativeEvent) instanceof Event) && n4.defaultPrevented) - return; - u6(n4, ...l4); - } - } }); - return t3; -} -function C3(r6) { - var t3; - return Object.assign(k3(r6), { displayName: (t3 = r6.displayName) != null ? t3 : r6.name }); -} -function F4(r6) { - let t3 = Object.assign({}, r6); - for (let e5 in t3) - t3[e5] === void 0 && delete t3[e5]; - return t3; -} -function m4(r6, t3 = []) { - let e5 = Object.assign({}, r6); - for (let a5 of t3) - a5 in e5 && delete e5[a5]; - return e5; -} - -// node_modules/@headlessui/react/dist/utils/bugs.js -function r5(n4) { - let e5 = n4.parentElement, l4 = null; - for (; e5 && !(e5 instanceof HTMLFieldSetElement); ) - e5 instanceof HTMLLegendElement && (l4 = e5), e5 = e5.parentElement; - let t3 = (e5 == null ? void 0 : e5.getAttribute("disabled")) === ""; - return t3 && i4(l4) ? false : t3; -} -function i4(n4) { - if (!n4) - return false; - let e5 = n4.previousElementSibling; - for (; e5 !== null; ) { - if (e5 instanceof HTMLLegendElement) - return false; - e5 = e5.previousElementSibling; + getItemText(item) { + return item.label + item.desc; + } + getItems() { + const allEmojis = Object.keys(emojis).reduce((p3, c3) => [...p3, ...emojis[c3].map((e3) => ({ label: e3.n[0], desc: e3.n[1], variants: e3.v, unicode: e3.u }))], []); + return allEmojis; + } + onChooseItem(item, evt) { + this.setIcon(item.unicode); } - return true; -} - -// node_modules/@headlessui/react/dist/internal/hidden.js -var a4 = "div"; -var s6 = ((e5) => (e5[e5.None = 1] = "None", e5[e5.Focusable = 2] = "Focusable", e5[e5.Hidden = 4] = "Hidden", e5))(s6 || {}); -var h3 = C3(function(t3, o6) { - let { features: e5 = 1, ...r6 } = t3, d5 = { ref: o6, "aria-hidden": (e5 & 2) === 2 ? true : void 0, style: { position: "fixed", top: 1, left: 1, width: 1, height: 0, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0, 0, 0, 0)", whiteSpace: "nowrap", borderWidth: "0", ...(e5 & 4) === 4 && (e5 & 2) !== 2 && { display: "none" } } }; - return $3({ ourProps: d5, theirProps: r6, slot: {}, defaultTag: a4, name: "Hidden" }); -}); - -// node_modules/@headlessui/react/dist/internal/open-closed.js -var o4 = B(null); -o4.displayName = "OpenClosedContext"; -var p4 = ((e5) => (e5[e5.Open = 0] = "Open", e5[e5.Closed = 1] = "Closed", e5))(p4 || {}); -function s7() { - return q2(o4); -} -function C4({ value: t3, children: n4 }) { - return bn.createElement(o4.Provider, { value: t3 }, n4); -} - -// node_modules/@headlessui/react/dist/components/keyboard.js -var o5 = ((r6) => (r6.Space = " ", r6.Enter = "Enter", r6.Escape = "Escape", r6.Backspace = "Backspace", r6.Delete = "Delete", r6.ArrowLeft = "ArrowLeft", r6.ArrowUp = "ArrowUp", r6.ArrowRight = "ArrowRight", r6.ArrowDown = "ArrowDown", r6.Home = "Home", r6.End = "End", r6.PageUp = "PageUp", r6.PageDown = "PageDown", r6.Tab = "Tab", r6))(o5 || {}); - -// node_modules/@headlessui/react/dist/hooks/use-window-event.js -function s8(e5, r6, n4) { - let o6 = s4(r6); - h2(() => { - function t3(i5) { - o6.current(i5); - } - return window.addEventListener(e5, t3, n4), () => window.removeEventListener(e5, t3, n4); - }, [e5, n4]); -} - -// node_modules/@headlessui/react/dist/hooks/use-tab-direction.js -var s9 = ((r6) => (r6[r6.Forwards = 0] = "Forwards", r6[r6.Backwards = 1] = "Backwards", r6))(s9 || {}); -function n2() { - let e5 = _2(0); - return s8("keydown", (o6) => { - o6.key === "Tab" && (e5.current = o6.shiftKey ? 1 : 0); - }, true), e5; -} - -// node_modules/@headlessui/react/dist/hooks/use-owner.js -function n3(...e5) { - return F(() => e4(...e5), [...e5]); -} - -// node_modules/@headlessui/react/dist/hooks/use-event-listener.js -function E2(n4, e5, a5, t3) { - let i5 = s4(a5); - h2(() => { - n4 = n4 != null ? n4 : window; - function r6(o6) { - i5.current(o6); - } - return n4.addEventListener(e5, r6, t3), () => n4.removeEventListener(e5, r6, t3); - }, [n4, e5, t3]); -} - -// node_modules/@headlessui/react/dist/components/popover/popover.js -var Ae = ((f4) => (f4[f4.Open = 0] = "Open", f4[f4.Closed = 1] = "Closed", f4))(Ae || {}); -var Ce = ((n4) => (n4[n4.TogglePopover = 0] = "TogglePopover", n4[n4.ClosePopover = 1] = "ClosePopover", n4[n4.SetButton = 2] = "SetButton", n4[n4.SetButtonId = 3] = "SetButtonId", n4[n4.SetPanel = 4] = "SetPanel", n4[n4.SetPanelId = 5] = "SetPanelId", n4))(Ce || {}); -var Re = { [0]: (r6) => ({ ...r6, popoverState: u4(r6.popoverState, { [0]: 1, [1]: 0 }) }), [1](r6) { - return r6.popoverState === 1 ? r6 : { ...r6, popoverState: 1 }; -}, [2](r6, t3) { - return r6.button === t3.button ? r6 : { ...r6, button: t3.button }; -}, [3](r6, t3) { - return r6.buttonId === t3.buttonId ? r6 : { ...r6, buttonId: t3.buttonId }; -}, [4](r6, t3) { - return r6.panel === t3.panel ? r6 : { ...r6, panel: t3.panel }; -}, [5](r6, t3) { - return r6.panelId === t3.panelId ? r6 : { ...r6, panelId: t3.panelId }; -} }; -var te = B(null); -te.displayName = "PopoverContext"; -function Q2(r6) { - let t3 = q2(te); - if (t3 === null) { - let f4 = new Error(`<${r6} /> is missing a parent component.`); - throw Error.captureStackTrace && Error.captureStackTrace(f4, Q2), f4; - } - return t3; -} -var oe = B(null); -oe.displayName = "PopoverAPIContext"; -function re(r6) { - let t3 = q2(oe); - if (t3 === null) { - let f4 = new Error(`<${r6} /> is missing a parent component.`); - throw Error.captureStackTrace && Error.captureStackTrace(f4, re), f4; - } - return t3; -} -var ne = B(null); -ne.displayName = "PopoverGroupContext"; -function ce() { - return q2(ne); -} -var le = B(null); -le.displayName = "PopoverPanelContext"; -function Oe() { - return q2(le); -} -function Me(r6, t3) { - return u4(t3.type, Re, r6, t3); -} -var Le = "div"; -var Ie = C3(function(t3, f4) { - var O4; - let o6 = `headlessui-popover-button-${I3()}`, v3 = `headlessui-popover-panel-${I3()}`, a5 = _2(null), n4 = y3(f4, T6((e5) => { - a5.current = e5; - })), g4 = y2(Me, { popoverState: 1, button: null, buttonId: o6, panel: null, panelId: v3, beforePanelSentinel: y(), afterPanelSentinel: y() }), [{ popoverState: y4, button: l4, panel: P3, beforePanelSentinel: s10, afterPanelSentinel: B4 }, i5] = g4, T8 = n3((O4 = a5.current) != null ? O4 : l4); - h2(() => i5({ type: 3, buttonId: o6 }), [o6, i5]), h2(() => i5({ type: 5, panelId: v3 }), [v3, i5]); - let c3 = F(() => { - if (!l4 || !P3) - return false; - for (let M4 of document.querySelectorAll("body > *")) - if (Number(M4 == null ? void 0 : M4.contains(l4)) ^ Number(M4 == null ? void 0 : M4.contains(P3))) - return true; - let e5 = d3(), p5 = e5.indexOf(l4), m5 = (p5 + e5.length - 1) % e5.length, C5 = (p5 + 1) % e5.length, D2 = e5[m5], V3 = e5[C5]; - return !P3.contains(D2) && !P3.contains(V3); - }, [l4, P3]), d5 = F(() => ({ buttonId: o6, panelId: v3, close: () => i5({ type: 1 }) }), [o6, v3, i5]), E3 = ce(), A4 = E3 == null ? void 0 : E3.registerPopover, L4 = o3(() => { - var e5; - return (e5 = E3 == null ? void 0 : E3.isFocusWithinPopoverGroup()) != null ? e5 : (T8 == null ? void 0 : T8.activeElement) && ((l4 == null ? void 0 : l4.contains(T8.activeElement)) || (P3 == null ? void 0 : P3.contains(T8.activeElement))); - }); - h2(() => A4 == null ? void 0 : A4(d5), [A4, d5]), E2(T8 == null ? void 0 : T8.defaultView, "focus", (e5) => { - var p5, m5, C5, D2; - y4 === 0 && (L4() || !l4 || !P3 || (m5 = (p5 = s10.current) == null ? void 0 : p5.contains) != null && m5.call(p5, e5.target) || (D2 = (C5 = B4.current) == null ? void 0 : C5.contains) != null && D2.call(C5, e5.target) || i5({ type: 1 })); - }, true), L3([l4, P3], (e5, p5) => { - i5({ type: 1 }), F3(p5, N3.Loose) || (e5.preventDefault(), l4 == null || l4.focus()); - }, y4 === 0); - let I4 = o3((e5) => { - i5({ type: 1 }); - let p5 = (() => e5 ? e5 instanceof HTMLElement ? e5 : "current" in e5 && e5.current instanceof HTMLElement ? e5.current : l4 : l4)(); - p5 == null || p5.focus(); - }), H4 = F(() => ({ close: I4, isPortalled: c3 }), [I4, c3]), u6 = F(() => ({ open: y4 === 0, close: I4 }), [y4, I4]), S4 = t3, R2 = { ref: n4 }; - return bn.createElement(te.Provider, { value: g4 }, bn.createElement(oe.Provider, { value: H4 }, bn.createElement(C4, { value: u4(y4, { [0]: p4.Open, [1]: p4.Closed }) }, $3({ ourProps: R2, theirProps: S4, slot: u6, defaultTag: Le, name: "Popover" })))); -}); -var Fe = "button"; -var he = C3(function(t3, f4) { - let [o6, v3] = Q2("Popover.Button"), { isPortalled: a5 } = re("Popover.Button"), n4 = _2(null), g4 = `headlessui-focus-sentinel-${I3()}`, y4 = ce(), l4 = y4 == null ? void 0 : y4.closeOthers, P3 = Oe(), s10 = P3 === null ? false : P3 === o6.panelId, B4 = y3(n4, f4, s10 ? null : (e5) => e5 && v3({ type: 2, button: e5 })), i5 = y3(n4, f4), T8 = n3(n4), c3 = o3((e5) => { - var p5, m5, C5; - if (s10) { - if (o6.popoverState === 1) - return; - switch (e5.key) { - case o5.Space: - case o5.Enter: - e5.preventDefault(), (m5 = (p5 = e5.target).click) == null || m5.call(p5), v3({ type: 1 }), (C5 = o6.button) == null || C5.focus(); - break; - } - } else - switch (e5.key) { - case o5.Space: - case o5.Enter: - e5.preventDefault(), e5.stopPropagation(), o6.popoverState === 1 && (l4 == null || l4(o6.buttonId)), v3({ type: 0 }); - break; - case o5.Escape: - if (o6.popoverState !== 0) - return l4 == null ? void 0 : l4(o6.buttonId); - if (!n4.current || (T8 == null ? void 0 : T8.activeElement) && !n4.current.contains(T8.activeElement)) - return; - e5.preventDefault(), e5.stopPropagation(), v3({ type: 1 }); - break; - } - }), d5 = o3((e5) => { - s10 || e5.key === o5.Space && e5.preventDefault(); - }), E3 = o3((e5) => { - var p5, m5; - r5(e5.currentTarget) || t3.disabled || (s10 ? (v3({ type: 1 }), (p5 = o6.button) == null || p5.focus()) : (e5.preventDefault(), e5.stopPropagation(), o6.popoverState === 1 && (l4 == null || l4(o6.buttonId)), v3({ type: 0 }), (m5 = o6.button) == null || m5.focus())); - }), A4 = o3((e5) => { - e5.preventDefault(), e5.stopPropagation(); - }), L4 = o6.popoverState === 0, I4 = F(() => ({ open: L4 }), [L4]), H4 = s5(t3, n4), u6 = t3, S4 = s10 ? { ref: i5, type: H4, onKeyDown: c3, onClick: E3 } : { ref: B4, id: o6.buttonId, type: H4, "aria-expanded": t3.disabled ? void 0 : o6.popoverState === 0, "aria-controls": o6.panel ? o6.panelId : void 0, onKeyDown: c3, onKeyUp: d5, onClick: E3, onMouseDown: A4 }, R2 = n2(), O4 = o3(() => { - let e5 = o6.panel; - if (!e5) - return; - function p5() { - u4(R2.current, { [s9.Forwards]: () => O3(e5, T5.First), [s9.Backwards]: () => O3(e5, T5.Last) }); - } - p5(); - }); - return bn.createElement(bn.Fragment, null, $3({ ourProps: S4, theirProps: u6, slot: I4, defaultTag: Fe, name: "Popover.Button" }), L4 && !s10 && a5 && bn.createElement(h3, { id: g4, features: s6.Focusable, as: "button", type: "button", onFocus: O4 })); -}); -var Be = "div"; -var De = S3.RenderStrategy | S3.Static; -var xe = C3(function(t3, f4) { - let [{ popoverState: o6 }, v3] = Q2("Popover.Overlay"), a5 = y3(f4), n4 = `headlessui-popover-overlay-${I3()}`, g4 = s7(), y4 = (() => g4 !== null ? g4 === p4.Open : o6 === 0)(), l4 = o3((i5) => { - if (r5(i5.currentTarget)) - return i5.preventDefault(); - v3({ type: 1 }); - }), P3 = F(() => ({ open: o6 === 0 }), [o6]); - return $3({ ourProps: { ref: a5, id: n4, "aria-hidden": true, onClick: l4 }, theirProps: t3, slot: P3, defaultTag: Be, features: De, visible: y4, name: "Popover.Overlay" }); -}); -var He = "div"; -var Ge = S3.RenderStrategy | S3.Static; -var ke = C3(function(t3, f4) { - let { focus: o6 = false, ...v3 } = t3, [a5, n4] = Q2("Popover.Panel"), { close: g4, isPortalled: y4 } = re("Popover.Panel"), l4 = `headlessui-focus-sentinel-before-${I3()}`, P3 = `headlessui-focus-sentinel-after-${I3()}`, s10 = _2(null), B4 = y3(s10, f4, (u6) => { - n4({ type: 4, panel: u6 }); - }), i5 = n3(s10), T8 = s7(), c3 = (() => T8 !== null ? T8 === p4.Open : a5.popoverState === 0)(), d5 = o3((u6) => { - var S4; - switch (u6.key) { - case o5.Escape: - if (a5.popoverState !== 0 || !s10.current || (i5 == null ? void 0 : i5.activeElement) && !s10.current.contains(i5.activeElement)) - return; - u6.preventDefault(), u6.stopPropagation(), n4({ type: 1 }), (S4 = a5.button) == null || S4.focus(); - break; - } - }); - h2(() => { - var u6; - t3.static || a5.popoverState === 1 && ((u6 = t3.unmount) != null ? u6 : true) && n4({ type: 4, panel: null }); - }, [a5.popoverState, t3.unmount, t3.static, n4]), h2(() => { - if (!o6 || a5.popoverState !== 0 || !s10.current) - return; - let u6 = i5 == null ? void 0 : i5.activeElement; - s10.current.contains(u6) || O3(s10.current, T5.First); - }, [o6, s10, a5.popoverState]); - let E3 = F(() => ({ open: a5.popoverState === 0, close: g4 }), [a5, g4]), A4 = { ref: B4, id: a5.panelId, onKeyDown: d5, onBlur: o6 && a5.popoverState === 0 ? (u6) => { - var R2, O4, e5, p5, m5; - let S4 = u6.relatedTarget; - !S4 || !s10.current || (R2 = s10.current) != null && R2.contains(S4) || (n4({ type: 1 }), (((e5 = (O4 = a5.beforePanelSentinel.current) == null ? void 0 : O4.contains) == null ? void 0 : e5.call(O4, S4)) || ((m5 = (p5 = a5.afterPanelSentinel.current) == null ? void 0 : p5.contains) == null ? void 0 : m5.call(p5, S4))) && S4.focus({ preventScroll: true })); - } : void 0, tabIndex: -1 }, L4 = n2(), I4 = o3(() => { - let u6 = s10.current; - if (!u6) - return; - function S4() { - u4(L4.current, { [s9.Forwards]: () => { - O3(u6, T5.First); - }, [s9.Backwards]: () => { - var R2; - (R2 = a5.button) == null || R2.focus({ preventScroll: true }); - } }); - } - S4(); - }), H4 = o3(() => { - let u6 = s10.current; - if (!u6) - return; - function S4() { - u4(L4.current, { [s9.Forwards]: () => { - var C5, D2, V3; - if (!a5.button) - return; - let R2 = d3(), O4 = R2.indexOf(a5.button), e5 = R2.slice(0, O4 + 1), m5 = [...R2.slice(O4 + 1), ...e5]; - for (let M4 of m5.slice()) - if (((D2 = (C5 = M4 == null ? void 0 : M4.id) == null ? void 0 : C5.startsWith) == null ? void 0 : D2.call(C5, "headlessui-focus-sentinel-")) || ((V3 = a5.panel) == null ? void 0 : V3.contains(M4))) { - let ae = m5.indexOf(M4); - ae !== -1 && m5.splice(ae, 1); - } - O3(m5, T5.First, false); - }, [s9.Backwards]: () => O3(u6, T5.Last) }); - } - S4(); - }); - return bn.createElement(le.Provider, { value: a5.panelId }, c3 && y4 && bn.createElement(h3, { id: l4, ref: a5.beforePanelSentinel, features: s6.Focusable, as: "button", type: "button", onFocus: I4 }), $3({ ourProps: A4, theirProps: v3, slot: E3, defaultTag: He, features: Ge, visible: c3, name: "Popover.Panel" }), c3 && y4 && bn.createElement(h3, { id: P3, ref: a5.afterPanelSentinel, features: s6.Focusable, as: "button", type: "button", onFocus: H4 })); -}); -var _e2 = "div"; -var we = C3(function(t3, f4) { - let o6 = _2(null), v3 = y3(o6, f4), [a5, n4] = p2([]), g4 = o3((c3) => { - n4((d5) => { - let E3 = d5.indexOf(c3); - if (E3 !== -1) { - let A4 = d5.slice(); - return A4.splice(E3, 1), A4; - } - return d5; - }); - }), y4 = o3((c3) => (n4((d5) => [...d5, c3]), () => g4(c3))), l4 = o3(() => { - var E3; - let c3 = e4(o6); - if (!c3) - return false; - let d5 = c3.activeElement; - return (E3 = o6.current) != null && E3.contains(d5) ? true : a5.some((A4) => { - var L4, I4; - return ((L4 = c3.getElementById(A4.buttonId)) == null ? void 0 : L4.contains(d5)) || ((I4 = c3.getElementById(A4.panelId)) == null ? void 0 : I4.contains(d5)); - }); - }), P3 = o3((c3) => { - for (let d5 of a5) - d5.buttonId !== c3 && d5.close(); - }), s10 = F(() => ({ registerPopover: y4, unregisterPopover: g4, isFocusWithinPopoverGroup: l4, closeOthers: P3 }), [y4, g4, l4, P3]), B4 = F(() => ({}), []), i5 = t3, T8 = { ref: v3 }; - return bn.createElement(ne.Provider, { value: s10 }, $3({ ourProps: T8, theirProps: i5, slot: B4, defaultTag: _e2, name: "Popover.Group" })); -}); -var mt = Object.assign(Ie, { Button: he, Overlay: xe, Panel: ke, Group: we }); - -// src/components/Editor/StickerMenu/emojis/default.ts -var emojis = { "smileys_people": [{ "n": ["grinning", "grinning face"], "u": "1f600" }, { "n": ["smiley", "smiling face with open mouth"], "u": "1f603" }, { "n": ["smile", "smiling face with open mouth and smiling eyes"], "u": "1f604" }, { "n": ["grin", "grinning face with smiling eyes"], "u": "1f601" }, { "n": ["laughing", "satisfied", "smiling face with open mouth and tightly-closed eyes"], "u": "1f606" }, { "n": ["sweat smile", "smiling face with open mouth and cold sweat"], "u": "1f605" }, { "n": ["rolling on the floor laughing"], "u": "1f923" }, { "n": ["joy", "face with tears of joy"], "u": "1f602" }, { "n": ["slightly smiling face"], "u": "1f642" }, { "n": ["upside-down face", "upside down face"], "u": "1f643" }, { "n": ["melting face"], "u": "1fae0" }, { "n": ["wink", "winking face"], "u": "1f609" }, { "n": ["blush", "smiling face with smiling eyes"], "u": "1f60a" }, { "n": ["innocent", "smiling face with halo"], "u": "1f607" }, { "n": ["smiling face with 3 hearts", "smiling face with smiling eyes and three hearts"], "u": "1f970" }, { "n": ["heart eyes", "smiling face with heart-shaped eyes"], "u": "1f60d" }, { "n": ["star-struck", "grinning face with star eyes"], "u": "1f929" }, { "n": ["kissing heart", "face throwing a kiss"], "u": "1f618" }, { "n": ["kissing", "kissing face"], "u": "1f617" }, { "n": ["relaxed", "white smiling face"], "u": "263a-fe0f" }, { "n": ["kissing closed eyes", "kissing face with closed eyes"], "u": "1f61a" }, { "n": ["kissing smiling eyes", "kissing face with smiling eyes"], "u": "1f619" }, { "n": ["smiling face with tear"], "u": "1f972" }, { "n": ["yum", "face savouring delicious food"], "u": "1f60b" }, { "n": ["stuck out tongue", "face with stuck-out tongue"], "u": "1f61b" }, { "n": ["stuck out tongue winking eye", "face with stuck-out tongue and winking eye"], "u": "1f61c" }, { "n": ["zany face", "grinning face with one large and one small eye"], "u": "1f92a" }, { "n": ["stuck out tongue closed eyes", "face with stuck-out tongue and tightly-closed eyes"], "u": "1f61d" }, { "n": ["money-mouth face", "money mouth face"], "u": "1f911" }, { "n": ["hugging face"], "u": "1f917" }, { "n": ["face with hand over mouth", "smiling face with smiling eyes and hand covering mouth"], "u": "1f92d" }, { "n": ["face with open eyes and hand over mouth"], "u": "1fae2" }, { "n": ["face with peeking eye"], "u": "1fae3" }, { "n": ["shushing face", "face with finger covering closed lips"], "u": "1f92b" }, { "n": ["thinking face"], "u": "1f914" }, { "n": ["saluting face"], "u": "1fae1" }, { "n": ["zipper-mouth face", "zipper mouth face"], "u": "1f910" }, { "n": ["face with raised eyebrow", "face with one eyebrow raised"], "u": "1f928" }, { "n": ["neutral face"], "u": "1f610" }, { "n": ["expressionless", "expressionless face"], "u": "1f611" }, { "n": ["no mouth", "face without mouth"], "u": "1f636" }, { "n": ["dotted line face"], "u": "1fae5" }, { "n": ["face in clouds"], "u": "1f636-200d-1f32b-fe0f" }, { "n": ["smirk", "smirking face"], "u": "1f60f" }, { "n": ["unamused", "unamused face"], "u": "1f612" }, { "n": ["face with rolling eyes"], "u": "1f644" }, { "n": ["grimacing", "grimacing face"], "u": "1f62c" }, { "n": ["face exhaling"], "u": "1f62e-200d-1f4a8" }, { "n": ["lying face"], "u": "1f925" }, { "n": ["relieved", "relieved face"], "u": "1f60c" }, { "n": ["pensive", "pensive face"], "u": "1f614" }, { "n": ["sleepy", "sleepy face"], "u": "1f62a" }, { "n": ["drooling face"], "u": "1f924" }, { "n": ["sleeping", "sleeping face"], "u": "1f634" }, { "n": ["mask", "face with medical mask"], "u": "1f637" }, { "n": ["face with thermometer"], "u": "1f912" }, { "n": ["face with head-bandage", "face with head bandage"], "u": "1f915" }, { "n": ["nauseated face"], "u": "1f922" }, { "n": ["face vomiting", "face with open mouth vomiting"], "u": "1f92e" }, { "n": ["sneezing face"], "u": "1f927" }, { "n": ["hot face", "overheated face"], "u": "1f975" }, { "n": ["cold face", "freezing face"], "u": "1f976" }, { "n": ["woozy face", "face with uneven eyes and wavy mouth"], "u": "1f974" }, { "n": ["dizzy face"], "u": "1f635" }, { "n": ["face with spiral eyes"], "u": "1f635-200d-1f4ab" }, { "n": ["exploding head", "shocked face with exploding head"], "u": "1f92f" }, { "n": ["face with cowboy hat"], "u": "1f920" }, { "n": ["partying face", "face with party horn and party hat"], "u": "1f973" }, { "n": ["disguised face"], "u": "1f978" }, { "n": ["sunglasses", "smiling face with sunglasses"], "u": "1f60e" }, { "n": ["nerd face"], "u": "1f913" }, { "n": ["face with monocle"], "u": "1f9d0" }, { "n": ["confused", "confused face"], "u": "1f615" }, { "n": ["face with diagonal mouth"], "u": "1fae4" }, { "n": ["worried", "worried face"], "u": "1f61f" }, { "n": ["slightly frowning face"], "u": "1f641" }, { "n": ["frowning face", "white frowning face"], "u": "2639-fe0f" }, { "n": ["open mouth", "face with open mouth"], "u": "1f62e" }, { "n": ["hushed", "hushed face"], "u": "1f62f" }, { "n": ["astonished", "astonished face"], "u": "1f632" }, { "n": ["flushed", "flushed face"], "u": "1f633" }, { "n": ["pleading face", "face with pleading eyes"], "u": "1f97a" }, { "n": ["face holding back tears"], "u": "1f979" }, { "n": ["frowning", "frowning face with open mouth"], "u": "1f626" }, { "n": ["anguished", "anguished face"], "u": "1f627" }, { "n": ["fearful", "fearful face"], "u": "1f628" }, { "n": ["cold sweat", "face with open mouth and cold sweat"], "u": "1f630" }, { "n": ["disappointed relieved", "disappointed but relieved face"], "u": "1f625" }, { "n": ["cry", "crying face"], "u": "1f622" }, { "n": ["sob", "loudly crying face"], "u": "1f62d" }, { "n": ["scream", "face screaming in fear"], "u": "1f631" }, { "n": ["confounded", "confounded face"], "u": "1f616" }, { "n": ["persevere", "persevering face"], "u": "1f623" }, { "n": ["disappointed", "disappointed face"], "u": "1f61e" }, { "n": ["sweat", "face with cold sweat"], "u": "1f613" }, { "n": ["weary", "weary face"], "u": "1f629" }, { "n": ["tired face"], "u": "1f62b" }, { "n": ["yawning face"], "u": "1f971" }, { "n": ["triumph", "face with look of triumph"], "u": "1f624" }, { "n": ["rage", "pouting face"], "u": "1f621" }, { "n": ["angry", "angry face"], "u": "1f620" }, { "n": ["face with symbols on mouth", "serious face with symbols covering mouth"], "u": "1f92c" }, { "n": ["smiling imp", "smiling face with horns"], "u": "1f608" }, { "n": ["imp"], "u": "1f47f" }, { "n": ["skull"], "u": "1f480" }, { "n": ["skull and crossbones"], "u": "2620-fe0f" }, { "n": ["poop", "shit", "hankey", "pile of poo"], "u": "1f4a9" }, { "n": ["clown face"], "u": "1f921" }, { "n": ["japanese ogre"], "u": "1f479" }, { "n": ["japanese goblin"], "u": "1f47a" }, { "n": ["ghost"], "u": "1f47b" }, { "n": ["alien", "extraterrestrial alien"], "u": "1f47d" }, { "n": ["alien monster", "space invader"], "u": "1f47e" }, { "n": ["robot face"], "u": "1f916" }, { "n": ["smiley cat", "smiling cat face with open mouth"], "u": "1f63a" }, { "n": ["smile cat", "grinning cat face with smiling eyes"], "u": "1f638" }, { "n": ["joy cat", "cat face with tears of joy"], "u": "1f639" }, { "n": ["heart eyes cat", "smiling cat face with heart-shaped eyes"], "u": "1f63b" }, { "n": ["smirk cat", "cat face with wry smile"], "u": "1f63c" }, { "n": ["kissing cat", "kissing cat face with closed eyes"], "u": "1f63d" }, { "n": ["scream cat", "weary cat face"], "u": "1f640" }, { "n": ["crying cat face"], "u": "1f63f" }, { "n": ["pouting cat", "pouting cat face"], "u": "1f63e" }, { "n": ["see no evil", "see-no-evil monkey"], "u": "1f648" }, { "n": ["hear no evil", "hear-no-evil monkey"], "u": "1f649" }, { "n": ["speak no evil", "speak-no-evil monkey"], "u": "1f64a" }, { "n": ["kiss", "kiss mark"], "u": "1f48b" }, { "n": ["love letter"], "u": "1f48c" }, { "n": ["cupid", "heart with arrow"], "u": "1f498" }, { "n": ["gift heart", "heart with ribbon"], "u": "1f49d" }, { "n": ["sparkling heart"], "u": "1f496" }, { "n": ["heartpulse", "growing heart"], "u": "1f497" }, { "n": ["heartbeat", "beating heart"], "u": "1f493" }, { "n": ["revolving hearts"], "u": "1f49e" }, { "n": ["two hearts"], "u": "1f495" }, { "n": ["heart decoration"], "u": "1f49f" }, { "n": ["heart exclamation", "heavy heart exclamation mark ornament"], "u": "2763-fe0f" }, { "n": ["broken heart"], "u": "1f494" }, { "n": ["heart on fire"], "u": "2764-fe0f-200d-1f525" }, { "n": ["mending heart"], "u": "2764-fe0f-200d-1fa79" }, { "n": ["heart", "heavy black heart"], "u": "2764-fe0f" }, { "n": ["orange heart"], "u": "1f9e1" }, { "n": ["yellow heart"], "u": "1f49b" }, { "n": ["green heart"], "u": "1f49a" }, { "n": ["blue heart"], "u": "1f499" }, { "n": ["purple heart"], "u": "1f49c" }, { "n": ["brown heart"], "u": "1f90e" }, { "n": ["black heart"], "u": "1f5a4" }, { "n": ["white heart"], "u": "1f90d" }, { "n": ["100", "hundred points symbol"], "u": "1f4af" }, { "n": ["anger", "anger symbol"], "u": "1f4a2" }, { "n": ["boom", "collision", "collision symbol"], "u": "1f4a5" }, { "n": ["dizzy", "dizzy symbol"], "u": "1f4ab" }, { "n": ["sweat drops", "splashing sweat symbol"], "u": "1f4a6" }, { "n": ["dash", "dash symbol"], "u": "1f4a8" }, { "n": ["hole"], "u": "1f573-fe0f" }, { "n": ["bomb"], "u": "1f4a3" }, { "n": ["speech balloon"], "u": "1f4ac" }, { "n": ["eye in speech bubble", "eye-in-speech-bubble"], "u": "1f441-fe0f-200d-1f5e8-fe0f" }, { "n": ["left speech bubble"], "u": "1f5e8-fe0f" }, { "n": ["right anger bubble"], "u": "1f5ef-fe0f" }, { "n": ["thought balloon"], "u": "1f4ad" }, { "n": ["zzz", "sleeping symbol"], "u": "1f4a4" }, { "n": ["wave", "waving hand sign"], "u": "1f44b", "v": ["1f44b-1f3fb", "1f44b-1f3fc", "1f44b-1f3fd", "1f44b-1f3fe", "1f44b-1f3ff"] }, { "n": ["raised back of hand"], "u": "1f91a", "v": ["1f91a-1f3fb", "1f91a-1f3fc", "1f91a-1f3fd", "1f91a-1f3fe", "1f91a-1f3ff"] }, { "n": ["hand with fingers splayed", "raised hand with fingers splayed"], "u": "1f590-fe0f", "v": ["1f590-1f3fb", "1f590-1f3fc", "1f590-1f3fd", "1f590-1f3fe", "1f590-1f3ff"] }, { "n": ["hand", "raised hand"], "u": "270b", "v": ["270b-1f3fb", "270b-1f3fc", "270b-1f3fd", "270b-1f3fe", "270b-1f3ff"] }, { "n": ["spock-hand", "raised hand with part between middle and ring fingers"], "u": "1f596", "v": ["1f596-1f3fb", "1f596-1f3fc", "1f596-1f3fd", "1f596-1f3fe", "1f596-1f3ff"] }, { "n": ["rightwards hand"], "u": "1faf1", "v": ["1faf1-1f3fb", "1faf1-1f3fc", "1faf1-1f3fd", "1faf1-1f3fe", "1faf1-1f3ff"] }, { "n": ["leftwards hand"], "u": "1faf2", "v": ["1faf2-1f3fb", "1faf2-1f3fc", "1faf2-1f3fd", "1faf2-1f3fe", "1faf2-1f3ff"] }, { "n": ["palm down hand"], "u": "1faf3", "v": ["1faf3-1f3fb", "1faf3-1f3fc", "1faf3-1f3fd", "1faf3-1f3fe", "1faf3-1f3ff"] }, { "n": ["palm up hand"], "u": "1faf4", "v": ["1faf4-1f3fb", "1faf4-1f3fc", "1faf4-1f3fd", "1faf4-1f3fe", "1faf4-1f3ff"] }, { "n": ["ok hand", "ok hand sign"], "u": "1f44c", "v": ["1f44c-1f3fb", "1f44c-1f3fc", "1f44c-1f3fd", "1f44c-1f3fe", "1f44c-1f3ff"] }, { "n": ["pinched fingers"], "u": "1f90c", "v": ["1f90c-1f3fb", "1f90c-1f3fc", "1f90c-1f3fd", "1f90c-1f3fe", "1f90c-1f3ff"] }, { "n": ["pinching hand"], "u": "1f90f", "v": ["1f90f-1f3fb", "1f90f-1f3fc", "1f90f-1f3fd", "1f90f-1f3fe", "1f90f-1f3ff"] }, { "n": ["v", "victory hand"], "u": "270c-fe0f", "v": ["270c-1f3fb", "270c-1f3fc", "270c-1f3fd", "270c-1f3fe", "270c-1f3ff"] }, { "n": ["crossed fingers", "hand with index and middle fingers crossed"], "u": "1f91e", "v": ["1f91e-1f3fb", "1f91e-1f3fc", "1f91e-1f3fd", "1f91e-1f3fe", "1f91e-1f3ff"] }, { "n": ["hand with index finger and thumb crossed"], "u": "1faf0", "v": ["1faf0-1f3fb", "1faf0-1f3fc", "1faf0-1f3fd", "1faf0-1f3fe", "1faf0-1f3ff"] }, { "n": ["i love you hand sign"], "u": "1f91f", "v": ["1f91f-1f3fb", "1f91f-1f3fc", "1f91f-1f3fd", "1f91f-1f3fe", "1f91f-1f3ff"] }, { "n": ["the horns", "sign of the horns"], "u": "1f918", "v": ["1f918-1f3fb", "1f918-1f3fc", "1f918-1f3fd", "1f918-1f3fe", "1f918-1f3ff"] }, { "n": ["call me hand"], "u": "1f919", "v": ["1f919-1f3fb", "1f919-1f3fc", "1f919-1f3fd", "1f919-1f3fe", "1f919-1f3ff"] }, { "n": ["point left", "white left pointing backhand index"], "u": "1f448", "v": ["1f448-1f3fb", "1f448-1f3fc", "1f448-1f3fd", "1f448-1f3fe", "1f448-1f3ff"] }, { "n": ["point right", "white right pointing backhand index"], "u": "1f449", "v": ["1f449-1f3fb", "1f449-1f3fc", "1f449-1f3fd", "1f449-1f3fe", "1f449-1f3ff"] }, { "n": ["point up 2", "white up pointing backhand index"], "u": "1f446", "v": ["1f446-1f3fb", "1f446-1f3fc", "1f446-1f3fd", "1f446-1f3fe", "1f446-1f3ff"] }, { "n": ["middle finger", "reversed hand with middle finger extended"], "u": "1f595", "v": ["1f595-1f3fb", "1f595-1f3fc", "1f595-1f3fd", "1f595-1f3fe", "1f595-1f3ff"] }, { "n": ["point down", "white down pointing backhand index"], "u": "1f447", "v": ["1f447-1f3fb", "1f447-1f3fc", "1f447-1f3fd", "1f447-1f3fe", "1f447-1f3ff"] }, { "n": ["point up", "white up pointing index"], "u": "261d-fe0f", "v": ["261d-1f3fb", "261d-1f3fc", "261d-1f3fd", "261d-1f3fe", "261d-1f3ff"] }, { "n": ["index pointing at the viewer"], "u": "1faf5", "v": ["1faf5-1f3fb", "1faf5-1f3fc", "1faf5-1f3fd", "1faf5-1f3fe", "1faf5-1f3ff"] }, { "n": ["+1", "thumbsup", "thumbs up sign"], "u": "1f44d", "v": ["1f44d-1f3fb", "1f44d-1f3fc", "1f44d-1f3fd", "1f44d-1f3fe", "1f44d-1f3ff"] }, { "n": ["-1", "thumbsdown", "thumbs down sign"], "u": "1f44e", "v": ["1f44e-1f3fb", "1f44e-1f3fc", "1f44e-1f3fd", "1f44e-1f3fe", "1f44e-1f3ff"] }, { "n": ["fist", "raised fist"], "u": "270a", "v": ["270a-1f3fb", "270a-1f3fc", "270a-1f3fd", "270a-1f3fe", "270a-1f3ff"] }, { "n": ["punch", "facepunch", "fisted hand sign"], "u": "1f44a", "v": ["1f44a-1f3fb", "1f44a-1f3fc", "1f44a-1f3fd", "1f44a-1f3fe", "1f44a-1f3ff"] }, { "n": ["left-facing fist"], "u": "1f91b", "v": ["1f91b-1f3fb", "1f91b-1f3fc", "1f91b-1f3fd", "1f91b-1f3fe", "1f91b-1f3ff"] }, { "n": ["right-facing fist"], "u": "1f91c", "v": ["1f91c-1f3fb", "1f91c-1f3fc", "1f91c-1f3fd", "1f91c-1f3fe", "1f91c-1f3ff"] }, { "n": ["clap", "clapping hands sign"], "u": "1f44f", "v": ["1f44f-1f3fb", "1f44f-1f3fc", "1f44f-1f3fd", "1f44f-1f3fe", "1f44f-1f3ff"] }, { "n": ["raised hands", "person raising both hands in celebration"], "u": "1f64c", "v": ["1f64c-1f3fb", "1f64c-1f3fc", "1f64c-1f3fd", "1f64c-1f3fe", "1f64c-1f3ff"] }, { "n": ["heart hands"], "u": "1faf6", "v": ["1faf6-1f3fb", "1faf6-1f3fc", "1faf6-1f3fd", "1faf6-1f3fe", "1faf6-1f3ff"] }, { "n": ["open hands", "open hands sign"], "u": "1f450", "v": ["1f450-1f3fb", "1f450-1f3fc", "1f450-1f3fd", "1f450-1f3fe", "1f450-1f3ff"] }, { "n": ["palms up together"], "u": "1f932", "v": ["1f932-1f3fb", "1f932-1f3fc", "1f932-1f3fd", "1f932-1f3fe", "1f932-1f3ff"] }, { "n": ["handshake"], "u": "1f91d", "v": ["1f91d-1f3fb", "1f91d-1f3fc", "1f91d-1f3fd", "1f91d-1f3fe", "1f91d-1f3ff", "1faf1-1f3fb-200d-1faf2-1f3fc", "1faf1-1f3fb-200d-1faf2-1f3fd", "1faf1-1f3fb-200d-1faf2-1f3fe", "1faf1-1f3fb-200d-1faf2-1f3ff", "1faf1-1f3fc-200d-1faf2-1f3fb", "1faf1-1f3fc-200d-1faf2-1f3fd", "1faf1-1f3fc-200d-1faf2-1f3fe", "1faf1-1f3fc-200d-1faf2-1f3ff", "1faf1-1f3fd-200d-1faf2-1f3fb", "1faf1-1f3fd-200d-1faf2-1f3fc", "1faf1-1f3fd-200d-1faf2-1f3fe", "1faf1-1f3fd-200d-1faf2-1f3ff", "1faf1-1f3fe-200d-1faf2-1f3fb", "1faf1-1f3fe-200d-1faf2-1f3fc", "1faf1-1f3fe-200d-1faf2-1f3fd", "1faf1-1f3fe-200d-1faf2-1f3ff", "1faf1-1f3ff-200d-1faf2-1f3fb", "1faf1-1f3ff-200d-1faf2-1f3fc", "1faf1-1f3ff-200d-1faf2-1f3fd", "1faf1-1f3ff-200d-1faf2-1f3fe"] }, { "n": ["pray", "person with folded hands"], "u": "1f64f", "v": ["1f64f-1f3fb", "1f64f-1f3fc", "1f64f-1f3fd", "1f64f-1f3fe", "1f64f-1f3ff"] }, { "n": ["writing hand"], "u": "270d-fe0f", "v": ["270d-1f3fb", "270d-1f3fc", "270d-1f3fd", "270d-1f3fe", "270d-1f3ff"] }, { "n": ["nail care", "nail polish"], "u": "1f485", "v": ["1f485-1f3fb", "1f485-1f3fc", "1f485-1f3fd", "1f485-1f3fe", "1f485-1f3ff"] }, { "n": ["selfie"], "u": "1f933", "v": ["1f933-1f3fb", "1f933-1f3fc", "1f933-1f3fd", "1f933-1f3fe", "1f933-1f3ff"] }, { "n": ["muscle", "flexed biceps"], "u": "1f4aa", "v": ["1f4aa-1f3fb", "1f4aa-1f3fc", "1f4aa-1f3fd", "1f4aa-1f3fe", "1f4aa-1f3ff"] }, { "n": ["mechanical arm"], "u": "1f9be" }, { "n": ["mechanical leg"], "u": "1f9bf" }, { "n": ["leg"], "u": "1f9b5", "v": ["1f9b5-1f3fb", "1f9b5-1f3fc", "1f9b5-1f3fd", "1f9b5-1f3fe", "1f9b5-1f3ff"] }, { "n": ["foot"], "u": "1f9b6", "v": ["1f9b6-1f3fb", "1f9b6-1f3fc", "1f9b6-1f3fd", "1f9b6-1f3fe", "1f9b6-1f3ff"] }, { "n": ["ear"], "u": "1f442", "v": ["1f442-1f3fb", "1f442-1f3fc", "1f442-1f3fd", "1f442-1f3fe", "1f442-1f3ff"] }, { "n": ["ear with hearing aid"], "u": "1f9bb", "v": ["1f9bb-1f3fb", "1f9bb-1f3fc", "1f9bb-1f3fd", "1f9bb-1f3fe", "1f9bb-1f3ff"] }, { "n": ["nose"], "u": "1f443", "v": ["1f443-1f3fb", "1f443-1f3fc", "1f443-1f3fd", "1f443-1f3fe", "1f443-1f3ff"] }, { "n": ["brain"], "u": "1f9e0" }, { "n": ["anatomical heart"], "u": "1fac0" }, { "n": ["lungs"], "u": "1fac1" }, { "n": ["tooth"], "u": "1f9b7" }, { "n": ["bone"], "u": "1f9b4" }, { "n": ["eyes"], "u": "1f440" }, { "n": ["eye"], "u": "1f441-fe0f" }, { "n": ["tongue"], "u": "1f445" }, { "n": ["lips", "mouth"], "u": "1f444" }, { "n": ["biting lip"], "u": "1fae6" }, { "n": ["baby"], "u": "1f476", "v": ["1f476-1f3fb", "1f476-1f3fc", "1f476-1f3fd", "1f476-1f3fe", "1f476-1f3ff"] }, { "n": ["child"], "u": "1f9d2", "v": ["1f9d2-1f3fb", "1f9d2-1f3fc", "1f9d2-1f3fd", "1f9d2-1f3fe", "1f9d2-1f3ff"] }, { "n": ["boy"], "u": "1f466", "v": ["1f466-1f3fb", "1f466-1f3fc", "1f466-1f3fd", "1f466-1f3fe", "1f466-1f3ff"] }, { "n": ["girl"], "u": "1f467", "v": ["1f467-1f3fb", "1f467-1f3fc", "1f467-1f3fd", "1f467-1f3fe", "1f467-1f3ff"] }, { "n": ["adult"], "u": "1f9d1", "v": ["1f9d1-1f3fb", "1f9d1-1f3fc", "1f9d1-1f3fd", "1f9d1-1f3fe", "1f9d1-1f3ff"] }, { "n": ["person with blond hair"], "u": "1f471", "v": ["1f471-1f3fb", "1f471-1f3fc", "1f471-1f3fd", "1f471-1f3fe", "1f471-1f3ff"] }, { "n": ["man"], "u": "1f468", "v": ["1f468-1f3fb", "1f468-1f3fc", "1f468-1f3fd", "1f468-1f3fe", "1f468-1f3ff"] }, { "n": ["bearded person"], "u": "1f9d4", "v": ["1f9d4-1f3fb", "1f9d4-1f3fc", "1f9d4-1f3fd", "1f9d4-1f3fe", "1f9d4-1f3ff"] }, { "n": ["man: beard", "man with beard"], "u": "1f9d4-200d-2642-fe0f", "v": ["1f9d4-1f3fb-200d-2642-fe0f", "1f9d4-1f3fc-200d-2642-fe0f", "1f9d4-1f3fd-200d-2642-fe0f", "1f9d4-1f3fe-200d-2642-fe0f", "1f9d4-1f3ff-200d-2642-fe0f"] }, { "n": ["woman: beard", "woman with beard"], "u": "1f9d4-200d-2640-fe0f", "v": ["1f9d4-1f3fb-200d-2640-fe0f", "1f9d4-1f3fc-200d-2640-fe0f", "1f9d4-1f3fd-200d-2640-fe0f", "1f9d4-1f3fe-200d-2640-fe0f", "1f9d4-1f3ff-200d-2640-fe0f"] }, { "n": ["man: red hair", "red haired man"], "u": "1f468-200d-1f9b0", "v": ["1f468-1f3fb-200d-1f9b0", "1f468-1f3fc-200d-1f9b0", "1f468-1f3fd-200d-1f9b0", "1f468-1f3fe-200d-1f9b0", "1f468-1f3ff-200d-1f9b0"] }, { "n": ["man: curly hair", "curly haired man"], "u": "1f468-200d-1f9b1", "v": ["1f468-1f3fb-200d-1f9b1", "1f468-1f3fc-200d-1f9b1", "1f468-1f3fd-200d-1f9b1", "1f468-1f3fe-200d-1f9b1", "1f468-1f3ff-200d-1f9b1"] }, { "n": ["man: white hair", "white haired man"], "u": "1f468-200d-1f9b3", "v": ["1f468-1f3fb-200d-1f9b3", "1f468-1f3fc-200d-1f9b3", "1f468-1f3fd-200d-1f9b3", "1f468-1f3fe-200d-1f9b3", "1f468-1f3ff-200d-1f9b3"] }, { "n": ["bald man", "man: bald"], "u": "1f468-200d-1f9b2", "v": ["1f468-1f3fb-200d-1f9b2", "1f468-1f3fc-200d-1f9b2", "1f468-1f3fd-200d-1f9b2", "1f468-1f3fe-200d-1f9b2", "1f468-1f3ff-200d-1f9b2"] }, { "n": ["woman"], "u": "1f469", "v": ["1f469-1f3fb", "1f469-1f3fc", "1f469-1f3fd", "1f469-1f3fe", "1f469-1f3ff"] }, { "n": ["woman: red hair", "red haired woman"], "u": "1f469-200d-1f9b0", "v": ["1f469-1f3fb-200d-1f9b0", "1f469-1f3fc-200d-1f9b0", "1f469-1f3fd-200d-1f9b0", "1f469-1f3fe-200d-1f9b0", "1f469-1f3ff-200d-1f9b0"] }, { "n": ["person: red hair", "red haired person"], "u": "1f9d1-200d-1f9b0", "v": ["1f9d1-1f3fb-200d-1f9b0", "1f9d1-1f3fc-200d-1f9b0", "1f9d1-1f3fd-200d-1f9b0", "1f9d1-1f3fe-200d-1f9b0", "1f9d1-1f3ff-200d-1f9b0"] }, { "n": ["woman: curly hair", "curly haired woman"], "u": "1f469-200d-1f9b1", "v": ["1f469-1f3fb-200d-1f9b1", "1f469-1f3fc-200d-1f9b1", "1f469-1f3fd-200d-1f9b1", "1f469-1f3fe-200d-1f9b1", "1f469-1f3ff-200d-1f9b1"] }, { "n": ["person: curly hair", "curly haired person"], "u": "1f9d1-200d-1f9b1", "v": ["1f9d1-1f3fb-200d-1f9b1", "1f9d1-1f3fc-200d-1f9b1", "1f9d1-1f3fd-200d-1f9b1", "1f9d1-1f3fe-200d-1f9b1", "1f9d1-1f3ff-200d-1f9b1"] }, { "n": ["woman: white hair", "white haired woman"], "u": "1f469-200d-1f9b3", "v": ["1f469-1f3fb-200d-1f9b3", "1f469-1f3fc-200d-1f9b3", "1f469-1f3fd-200d-1f9b3", "1f469-1f3fe-200d-1f9b3", "1f469-1f3ff-200d-1f9b3"] }, { "n": ["person: white hair", "white haired person"], "u": "1f9d1-200d-1f9b3", "v": ["1f9d1-1f3fb-200d-1f9b3", "1f9d1-1f3fc-200d-1f9b3", "1f9d1-1f3fd-200d-1f9b3", "1f9d1-1f3fe-200d-1f9b3", "1f9d1-1f3ff-200d-1f9b3"] }, { "n": ["bald woman", "woman: bald"], "u": "1f469-200d-1f9b2", "v": ["1f469-1f3fb-200d-1f9b2", "1f469-1f3fc-200d-1f9b2", "1f469-1f3fd-200d-1f9b2", "1f469-1f3fe-200d-1f9b2", "1f469-1f3ff-200d-1f9b2"] }, { "n": ["bald person", "person: bald"], "u": "1f9d1-200d-1f9b2", "v": ["1f9d1-1f3fb-200d-1f9b2", "1f9d1-1f3fc-200d-1f9b2", "1f9d1-1f3fd-200d-1f9b2", "1f9d1-1f3fe-200d-1f9b2", "1f9d1-1f3ff-200d-1f9b2"] }, { "n": ["woman: blond hair", "blond-haired-woman"], "u": "1f471-200d-2640-fe0f", "v": ["1f471-1f3fb-200d-2640-fe0f", "1f471-1f3fc-200d-2640-fe0f", "1f471-1f3fd-200d-2640-fe0f", "1f471-1f3fe-200d-2640-fe0f", "1f471-1f3ff-200d-2640-fe0f"] }, { "n": ["man: blond hair", "blond-haired-man"], "u": "1f471-200d-2642-fe0f", "v": ["1f471-1f3fb-200d-2642-fe0f", "1f471-1f3fc-200d-2642-fe0f", "1f471-1f3fd-200d-2642-fe0f", "1f471-1f3fe-200d-2642-fe0f", "1f471-1f3ff-200d-2642-fe0f"] }, { "n": ["older adult"], "u": "1f9d3", "v": ["1f9d3-1f3fb", "1f9d3-1f3fc", "1f9d3-1f3fd", "1f9d3-1f3fe", "1f9d3-1f3ff"] }, { "n": ["older man"], "u": "1f474", "v": ["1f474-1f3fb", "1f474-1f3fc", "1f474-1f3fd", "1f474-1f3fe", "1f474-1f3ff"] }, { "n": ["older woman"], "u": "1f475", "v": ["1f475-1f3fb", "1f475-1f3fc", "1f475-1f3fd", "1f475-1f3fe", "1f475-1f3ff"] }, { "n": ["person frowning"], "u": "1f64d", "v": ["1f64d-1f3fb", "1f64d-1f3fc", "1f64d-1f3fd", "1f64d-1f3fe", "1f64d-1f3ff"] }, { "n": ["man frowning", "man-frowning"], "u": "1f64d-200d-2642-fe0f", "v": ["1f64d-1f3fb-200d-2642-fe0f", "1f64d-1f3fc-200d-2642-fe0f", "1f64d-1f3fd-200d-2642-fe0f", "1f64d-1f3fe-200d-2642-fe0f", "1f64d-1f3ff-200d-2642-fe0f"] }, { "n": ["woman frowning", "woman-frowning"], "u": "1f64d-200d-2640-fe0f", "v": ["1f64d-1f3fb-200d-2640-fe0f", "1f64d-1f3fc-200d-2640-fe0f", "1f64d-1f3fd-200d-2640-fe0f", "1f64d-1f3fe-200d-2640-fe0f", "1f64d-1f3ff-200d-2640-fe0f"] }, { "n": ["person with pouting face"], "u": "1f64e", "v": ["1f64e-1f3fb", "1f64e-1f3fc", "1f64e-1f3fd", "1f64e-1f3fe", "1f64e-1f3ff"] }, { "n": ["man pouting", "man-pouting"], "u": "1f64e-200d-2642-fe0f", "v": ["1f64e-1f3fb-200d-2642-fe0f", "1f64e-1f3fc-200d-2642-fe0f", "1f64e-1f3fd-200d-2642-fe0f", "1f64e-1f3fe-200d-2642-fe0f", "1f64e-1f3ff-200d-2642-fe0f"] }, { "n": ["woman pouting", "woman-pouting"], "u": "1f64e-200d-2640-fe0f", "v": ["1f64e-1f3fb-200d-2640-fe0f", "1f64e-1f3fc-200d-2640-fe0f", "1f64e-1f3fd-200d-2640-fe0f", "1f64e-1f3fe-200d-2640-fe0f", "1f64e-1f3ff-200d-2640-fe0f"] }, { "n": ["no good", "face with no good gesture"], "u": "1f645", "v": ["1f645-1f3fb", "1f645-1f3fc", "1f645-1f3fd", "1f645-1f3fe", "1f645-1f3ff"] }, { "n": ["man gesturing no", "man-gesturing-no"], "u": "1f645-200d-2642-fe0f", "v": ["1f645-1f3fb-200d-2642-fe0f", "1f645-1f3fc-200d-2642-fe0f", "1f645-1f3fd-200d-2642-fe0f", "1f645-1f3fe-200d-2642-fe0f", "1f645-1f3ff-200d-2642-fe0f"] }, { "n": ["woman gesturing no", "woman-gesturing-no"], "u": "1f645-200d-2640-fe0f", "v": ["1f645-1f3fb-200d-2640-fe0f", "1f645-1f3fc-200d-2640-fe0f", "1f645-1f3fd-200d-2640-fe0f", "1f645-1f3fe-200d-2640-fe0f", "1f645-1f3ff-200d-2640-fe0f"] }, { "n": ["ok woman", "face with ok gesture"], "u": "1f646", "v": ["1f646-1f3fb", "1f646-1f3fc", "1f646-1f3fd", "1f646-1f3fe", "1f646-1f3ff"] }, { "n": ["man gesturing ok", "man-gesturing-ok"], "u": "1f646-200d-2642-fe0f", "v": ["1f646-1f3fb-200d-2642-fe0f", "1f646-1f3fc-200d-2642-fe0f", "1f646-1f3fd-200d-2642-fe0f", "1f646-1f3fe-200d-2642-fe0f", "1f646-1f3ff-200d-2642-fe0f"] }, { "n": ["woman gesturing ok", "woman-gesturing-ok"], "u": "1f646-200d-2640-fe0f", "v": ["1f646-1f3fb-200d-2640-fe0f", "1f646-1f3fc-200d-2640-fe0f", "1f646-1f3fd-200d-2640-fe0f", "1f646-1f3fe-200d-2640-fe0f", "1f646-1f3ff-200d-2640-fe0f"] }, { "n": ["information desk person"], "u": "1f481", "v": ["1f481-1f3fb", "1f481-1f3fc", "1f481-1f3fd", "1f481-1f3fe", "1f481-1f3ff"] }, { "n": ["man tipping hand", "man-tipping-hand"], "u": "1f481-200d-2642-fe0f", "v": ["1f481-1f3fb-200d-2642-fe0f", "1f481-1f3fc-200d-2642-fe0f", "1f481-1f3fd-200d-2642-fe0f", "1f481-1f3fe-200d-2642-fe0f", "1f481-1f3ff-200d-2642-fe0f"] }, { "n": ["woman tipping hand", "woman-tipping-hand"], "u": "1f481-200d-2640-fe0f", "v": ["1f481-1f3fb-200d-2640-fe0f", "1f481-1f3fc-200d-2640-fe0f", "1f481-1f3fd-200d-2640-fe0f", "1f481-1f3fe-200d-2640-fe0f", "1f481-1f3ff-200d-2640-fe0f"] }, { "n": ["raising hand", "happy person raising one hand"], "u": "1f64b", "v": ["1f64b-1f3fb", "1f64b-1f3fc", "1f64b-1f3fd", "1f64b-1f3fe", "1f64b-1f3ff"] }, { "n": ["man raising hand", "man-raising-hand"], "u": "1f64b-200d-2642-fe0f", "v": ["1f64b-1f3fb-200d-2642-fe0f", "1f64b-1f3fc-200d-2642-fe0f", "1f64b-1f3fd-200d-2642-fe0f", "1f64b-1f3fe-200d-2642-fe0f", "1f64b-1f3ff-200d-2642-fe0f"] }, { "n": ["woman raising hand", "woman-raising-hand"], "u": "1f64b-200d-2640-fe0f", "v": ["1f64b-1f3fb-200d-2640-fe0f", "1f64b-1f3fc-200d-2640-fe0f", "1f64b-1f3fd-200d-2640-fe0f", "1f64b-1f3fe-200d-2640-fe0f", "1f64b-1f3ff-200d-2640-fe0f"] }, { "n": ["deaf person"], "u": "1f9cf", "v": ["1f9cf-1f3fb", "1f9cf-1f3fc", "1f9cf-1f3fd", "1f9cf-1f3fe", "1f9cf-1f3ff"] }, { "n": ["deaf man"], "u": "1f9cf-200d-2642-fe0f", "v": ["1f9cf-1f3fb-200d-2642-fe0f", "1f9cf-1f3fc-200d-2642-fe0f", "1f9cf-1f3fd-200d-2642-fe0f", "1f9cf-1f3fe-200d-2642-fe0f", "1f9cf-1f3ff-200d-2642-fe0f"] }, { "n": ["deaf woman"], "u": "1f9cf-200d-2640-fe0f", "v": ["1f9cf-1f3fb-200d-2640-fe0f", "1f9cf-1f3fc-200d-2640-fe0f", "1f9cf-1f3fd-200d-2640-fe0f", "1f9cf-1f3fe-200d-2640-fe0f", "1f9cf-1f3ff-200d-2640-fe0f"] }, { "n": ["bow", "person bowing deeply"], "u": "1f647", "v": ["1f647-1f3fb", "1f647-1f3fc", "1f647-1f3fd", "1f647-1f3fe", "1f647-1f3ff"] }, { "n": ["man bowing", "man-bowing"], "u": "1f647-200d-2642-fe0f", "v": ["1f647-1f3fb-200d-2642-fe0f", "1f647-1f3fc-200d-2642-fe0f", "1f647-1f3fd-200d-2642-fe0f", "1f647-1f3fe-200d-2642-fe0f", "1f647-1f3ff-200d-2642-fe0f"] }, { "n": ["woman bowing", "woman-bowing"], "u": "1f647-200d-2640-fe0f", "v": ["1f647-1f3fb-200d-2640-fe0f", "1f647-1f3fc-200d-2640-fe0f", "1f647-1f3fd-200d-2640-fe0f", "1f647-1f3fe-200d-2640-fe0f", "1f647-1f3ff-200d-2640-fe0f"] }, { "n": ["face palm"], "u": "1f926", "v": ["1f926-1f3fb", "1f926-1f3fc", "1f926-1f3fd", "1f926-1f3fe", "1f926-1f3ff"] }, { "n": ["man facepalming", "man-facepalming"], "u": "1f926-200d-2642-fe0f", "v": ["1f926-1f3fb-200d-2642-fe0f", "1f926-1f3fc-200d-2642-fe0f", "1f926-1f3fd-200d-2642-fe0f", "1f926-1f3fe-200d-2642-fe0f", "1f926-1f3ff-200d-2642-fe0f"] }, { "n": ["woman facepalming", "woman-facepalming"], "u": "1f926-200d-2640-fe0f", "v": ["1f926-1f3fb-200d-2640-fe0f", "1f926-1f3fc-200d-2640-fe0f", "1f926-1f3fd-200d-2640-fe0f", "1f926-1f3fe-200d-2640-fe0f", "1f926-1f3ff-200d-2640-fe0f"] }, { "n": ["shrug"], "u": "1f937", "v": ["1f937-1f3fb", "1f937-1f3fc", "1f937-1f3fd", "1f937-1f3fe", "1f937-1f3ff"] }, { "n": ["man shrugging", "man-shrugging"], "u": "1f937-200d-2642-fe0f", "v": ["1f937-1f3fb-200d-2642-fe0f", "1f937-1f3fc-200d-2642-fe0f", "1f937-1f3fd-200d-2642-fe0f", "1f937-1f3fe-200d-2642-fe0f", "1f937-1f3ff-200d-2642-fe0f"] }, { "n": ["woman shrugging", "woman-shrugging"], "u": "1f937-200d-2640-fe0f", "v": ["1f937-1f3fb-200d-2640-fe0f", "1f937-1f3fc-200d-2640-fe0f", "1f937-1f3fd-200d-2640-fe0f", "1f937-1f3fe-200d-2640-fe0f", "1f937-1f3ff-200d-2640-fe0f"] }, { "n": ["health worker"], "u": "1f9d1-200d-2695-fe0f", "v": ["1f9d1-1f3fb-200d-2695-fe0f", "1f9d1-1f3fc-200d-2695-fe0f", "1f9d1-1f3fd-200d-2695-fe0f", "1f9d1-1f3fe-200d-2695-fe0f", "1f9d1-1f3ff-200d-2695-fe0f"] }, { "n": ["male-doctor", "man health worker"], "u": "1f468-200d-2695-fe0f", "v": ["1f468-1f3fb-200d-2695-fe0f", "1f468-1f3fc-200d-2695-fe0f", "1f468-1f3fd-200d-2695-fe0f", "1f468-1f3fe-200d-2695-fe0f", "1f468-1f3ff-200d-2695-fe0f"] }, { "n": ["female-doctor", "woman health worker"], "u": "1f469-200d-2695-fe0f", "v": ["1f469-1f3fb-200d-2695-fe0f", "1f469-1f3fc-200d-2695-fe0f", "1f469-1f3fd-200d-2695-fe0f", "1f469-1f3fe-200d-2695-fe0f", "1f469-1f3ff-200d-2695-fe0f"] }, { "n": ["student"], "u": "1f9d1-200d-1f393", "v": ["1f9d1-1f3fb-200d-1f393", "1f9d1-1f3fc-200d-1f393", "1f9d1-1f3fd-200d-1f393", "1f9d1-1f3fe-200d-1f393", "1f9d1-1f3ff-200d-1f393"] }, { "n": ["man student", "male-student"], "u": "1f468-200d-1f393", "v": ["1f468-1f3fb-200d-1f393", "1f468-1f3fc-200d-1f393", "1f468-1f3fd-200d-1f393", "1f468-1f3fe-200d-1f393", "1f468-1f3ff-200d-1f393"] }, { "n": ["woman student", "female-student"], "u": "1f469-200d-1f393", "v": ["1f469-1f3fb-200d-1f393", "1f469-1f3fc-200d-1f393", "1f469-1f3fd-200d-1f393", "1f469-1f3fe-200d-1f393", "1f469-1f3ff-200d-1f393"] }, { "n": ["teacher"], "u": "1f9d1-200d-1f3eb", "v": ["1f9d1-1f3fb-200d-1f3eb", "1f9d1-1f3fc-200d-1f3eb", "1f9d1-1f3fd-200d-1f3eb", "1f9d1-1f3fe-200d-1f3eb", "1f9d1-1f3ff-200d-1f3eb"] }, { "n": ["man teacher", "male-teacher"], "u": "1f468-200d-1f3eb", "v": ["1f468-1f3fb-200d-1f3eb", "1f468-1f3fc-200d-1f3eb", "1f468-1f3fd-200d-1f3eb", "1f468-1f3fe-200d-1f3eb", "1f468-1f3ff-200d-1f3eb"] }, { "n": ["woman teacher", "female-teacher"], "u": "1f469-200d-1f3eb", "v": ["1f469-1f3fb-200d-1f3eb", "1f469-1f3fc-200d-1f3eb", "1f469-1f3fd-200d-1f3eb", "1f469-1f3fe-200d-1f3eb", "1f469-1f3ff-200d-1f3eb"] }, { "n": ["judge"], "u": "1f9d1-200d-2696-fe0f", "v": ["1f9d1-1f3fb-200d-2696-fe0f", "1f9d1-1f3fc-200d-2696-fe0f", "1f9d1-1f3fd-200d-2696-fe0f", "1f9d1-1f3fe-200d-2696-fe0f", "1f9d1-1f3ff-200d-2696-fe0f"] }, { "n": ["man judge", "male-judge"], "u": "1f468-200d-2696-fe0f", "v": ["1f468-1f3fb-200d-2696-fe0f", "1f468-1f3fc-200d-2696-fe0f", "1f468-1f3fd-200d-2696-fe0f", "1f468-1f3fe-200d-2696-fe0f", "1f468-1f3ff-200d-2696-fe0f"] }, { "n": ["woman judge", "female-judge"], "u": "1f469-200d-2696-fe0f", "v": ["1f469-1f3fb-200d-2696-fe0f", "1f469-1f3fc-200d-2696-fe0f", "1f469-1f3fd-200d-2696-fe0f", "1f469-1f3fe-200d-2696-fe0f", "1f469-1f3ff-200d-2696-fe0f"] }, { "n": ["farmer"], "u": "1f9d1-200d-1f33e", "v": ["1f9d1-1f3fb-200d-1f33e", "1f9d1-1f3fc-200d-1f33e", "1f9d1-1f3fd-200d-1f33e", "1f9d1-1f3fe-200d-1f33e", "1f9d1-1f3ff-200d-1f33e"] }, { "n": ["man farmer", "male-farmer"], "u": "1f468-200d-1f33e", "v": ["1f468-1f3fb-200d-1f33e", "1f468-1f3fc-200d-1f33e", "1f468-1f3fd-200d-1f33e", "1f468-1f3fe-200d-1f33e", "1f468-1f3ff-200d-1f33e"] }, { "n": ["woman farmer", "female-farmer"], "u": "1f469-200d-1f33e", "v": ["1f469-1f3fb-200d-1f33e", "1f469-1f3fc-200d-1f33e", "1f469-1f3fd-200d-1f33e", "1f469-1f3fe-200d-1f33e", "1f469-1f3ff-200d-1f33e"] }, { "n": ["cook"], "u": "1f9d1-200d-1f373", "v": ["1f9d1-1f3fb-200d-1f373", "1f9d1-1f3fc-200d-1f373", "1f9d1-1f3fd-200d-1f373", "1f9d1-1f3fe-200d-1f373", "1f9d1-1f3ff-200d-1f373"] }, { "n": ["man cook", "male-cook"], "u": "1f468-200d-1f373", "v": ["1f468-1f3fb-200d-1f373", "1f468-1f3fc-200d-1f373", "1f468-1f3fd-200d-1f373", "1f468-1f3fe-200d-1f373", "1f468-1f3ff-200d-1f373"] }, { "n": ["woman cook", "female-cook"], "u": "1f469-200d-1f373", "v": ["1f469-1f3fb-200d-1f373", "1f469-1f3fc-200d-1f373", "1f469-1f3fd-200d-1f373", "1f469-1f3fe-200d-1f373", "1f469-1f3ff-200d-1f373"] }, { "n": ["mechanic"], "u": "1f9d1-200d-1f527", "v": ["1f9d1-1f3fb-200d-1f527", "1f9d1-1f3fc-200d-1f527", "1f9d1-1f3fd-200d-1f527", "1f9d1-1f3fe-200d-1f527", "1f9d1-1f3ff-200d-1f527"] }, { "n": ["man mechanic", "male-mechanic"], "u": "1f468-200d-1f527", "v": ["1f468-1f3fb-200d-1f527", "1f468-1f3fc-200d-1f527", "1f468-1f3fd-200d-1f527", "1f468-1f3fe-200d-1f527", "1f468-1f3ff-200d-1f527"] }, { "n": ["woman mechanic", "female-mechanic"], "u": "1f469-200d-1f527", "v": ["1f469-1f3fb-200d-1f527", "1f469-1f3fc-200d-1f527", "1f469-1f3fd-200d-1f527", "1f469-1f3fe-200d-1f527", "1f469-1f3ff-200d-1f527"] }, { "n": ["factory worker"], "u": "1f9d1-200d-1f3ed", "v": ["1f9d1-1f3fb-200d-1f3ed", "1f9d1-1f3fc-200d-1f3ed", "1f9d1-1f3fd-200d-1f3ed", "1f9d1-1f3fe-200d-1f3ed", "1f9d1-1f3ff-200d-1f3ed"] }, { "n": ["man factory worker", "male-factory-worker"], "u": "1f468-200d-1f3ed", "v": ["1f468-1f3fb-200d-1f3ed", "1f468-1f3fc-200d-1f3ed", "1f468-1f3fd-200d-1f3ed", "1f468-1f3fe-200d-1f3ed", "1f468-1f3ff-200d-1f3ed"] }, { "n": ["woman factory worker", "female-factory-worker"], "u": "1f469-200d-1f3ed", "v": ["1f469-1f3fb-200d-1f3ed", "1f469-1f3fc-200d-1f3ed", "1f469-1f3fd-200d-1f3ed", "1f469-1f3fe-200d-1f3ed", "1f469-1f3ff-200d-1f3ed"] }, { "n": ["office worker"], "u": "1f9d1-200d-1f4bc", "v": ["1f9d1-1f3fb-200d-1f4bc", "1f9d1-1f3fc-200d-1f4bc", "1f9d1-1f3fd-200d-1f4bc", "1f9d1-1f3fe-200d-1f4bc", "1f9d1-1f3ff-200d-1f4bc"] }, { "n": ["man office worker", "male-office-worker"], "u": "1f468-200d-1f4bc", "v": ["1f468-1f3fb-200d-1f4bc", "1f468-1f3fc-200d-1f4bc", "1f468-1f3fd-200d-1f4bc", "1f468-1f3fe-200d-1f4bc", "1f468-1f3ff-200d-1f4bc"] }, { "n": ["woman office worker", "female-office-worker"], "u": "1f469-200d-1f4bc", "v": ["1f469-1f3fb-200d-1f4bc", "1f469-1f3fc-200d-1f4bc", "1f469-1f3fd-200d-1f4bc", "1f469-1f3fe-200d-1f4bc", "1f469-1f3ff-200d-1f4bc"] }, { "n": ["scientist"], "u": "1f9d1-200d-1f52c", "v": ["1f9d1-1f3fb-200d-1f52c", "1f9d1-1f3fc-200d-1f52c", "1f9d1-1f3fd-200d-1f52c", "1f9d1-1f3fe-200d-1f52c", "1f9d1-1f3ff-200d-1f52c"] }, { "n": ["man scientist", "male-scientist"], "u": "1f468-200d-1f52c", "v": ["1f468-1f3fb-200d-1f52c", "1f468-1f3fc-200d-1f52c", "1f468-1f3fd-200d-1f52c", "1f468-1f3fe-200d-1f52c", "1f468-1f3ff-200d-1f52c"] }, { "n": ["woman scientist", "female-scientist"], "u": "1f469-200d-1f52c", "v": ["1f469-1f3fb-200d-1f52c", "1f469-1f3fc-200d-1f52c", "1f469-1f3fd-200d-1f52c", "1f469-1f3fe-200d-1f52c", "1f469-1f3ff-200d-1f52c"] }, { "n": ["technologist"], "u": "1f9d1-200d-1f4bb", "v": ["1f9d1-1f3fb-200d-1f4bb", "1f9d1-1f3fc-200d-1f4bb", "1f9d1-1f3fd-200d-1f4bb", "1f9d1-1f3fe-200d-1f4bb", "1f9d1-1f3ff-200d-1f4bb"] }, { "n": ["man technologist", "male-technologist"], "u": "1f468-200d-1f4bb", "v": ["1f468-1f3fb-200d-1f4bb", "1f468-1f3fc-200d-1f4bb", "1f468-1f3fd-200d-1f4bb", "1f468-1f3fe-200d-1f4bb", "1f468-1f3ff-200d-1f4bb"] }, { "n": ["woman technologist", "female-technologist"], "u": "1f469-200d-1f4bb", "v": ["1f469-1f3fb-200d-1f4bb", "1f469-1f3fc-200d-1f4bb", "1f469-1f3fd-200d-1f4bb", "1f469-1f3fe-200d-1f4bb", "1f469-1f3ff-200d-1f4bb"] }, { "n": ["singer"], "u": "1f9d1-200d-1f3a4", "v": ["1f9d1-1f3fb-200d-1f3a4", "1f9d1-1f3fc-200d-1f3a4", "1f9d1-1f3fd-200d-1f3a4", "1f9d1-1f3fe-200d-1f3a4", "1f9d1-1f3ff-200d-1f3a4"] }, { "n": ["man singer", "male-singer"], "u": "1f468-200d-1f3a4", "v": ["1f468-1f3fb-200d-1f3a4", "1f468-1f3fc-200d-1f3a4", "1f468-1f3fd-200d-1f3a4", "1f468-1f3fe-200d-1f3a4", "1f468-1f3ff-200d-1f3a4"] }, { "n": ["woman singer", "female-singer"], "u": "1f469-200d-1f3a4", "v": ["1f469-1f3fb-200d-1f3a4", "1f469-1f3fc-200d-1f3a4", "1f469-1f3fd-200d-1f3a4", "1f469-1f3fe-200d-1f3a4", "1f469-1f3ff-200d-1f3a4"] }, { "n": ["artist"], "u": "1f9d1-200d-1f3a8", "v": ["1f9d1-1f3fb-200d-1f3a8", "1f9d1-1f3fc-200d-1f3a8", "1f9d1-1f3fd-200d-1f3a8", "1f9d1-1f3fe-200d-1f3a8", "1f9d1-1f3ff-200d-1f3a8"] }, { "n": ["man artist", "male-artist"], "u": "1f468-200d-1f3a8", "v": ["1f468-1f3fb-200d-1f3a8", "1f468-1f3fc-200d-1f3a8", "1f468-1f3fd-200d-1f3a8", "1f468-1f3fe-200d-1f3a8", "1f468-1f3ff-200d-1f3a8"] }, { "n": ["woman artist", "female-artist"], "u": "1f469-200d-1f3a8", "v": ["1f469-1f3fb-200d-1f3a8", "1f469-1f3fc-200d-1f3a8", "1f469-1f3fd-200d-1f3a8", "1f469-1f3fe-200d-1f3a8", "1f469-1f3ff-200d-1f3a8"] }, { "n": ["pilot"], "u": "1f9d1-200d-2708-fe0f", "v": ["1f9d1-1f3fb-200d-2708-fe0f", "1f9d1-1f3fc-200d-2708-fe0f", "1f9d1-1f3fd-200d-2708-fe0f", "1f9d1-1f3fe-200d-2708-fe0f", "1f9d1-1f3ff-200d-2708-fe0f"] }, { "n": ["man pilot", "male-pilot"], "u": "1f468-200d-2708-fe0f", "v": ["1f468-1f3fb-200d-2708-fe0f", "1f468-1f3fc-200d-2708-fe0f", "1f468-1f3fd-200d-2708-fe0f", "1f468-1f3fe-200d-2708-fe0f", "1f468-1f3ff-200d-2708-fe0f"] }, { "n": ["woman pilot", "female-pilot"], "u": "1f469-200d-2708-fe0f", "v": ["1f469-1f3fb-200d-2708-fe0f", "1f469-1f3fc-200d-2708-fe0f", "1f469-1f3fd-200d-2708-fe0f", "1f469-1f3fe-200d-2708-fe0f", "1f469-1f3ff-200d-2708-fe0f"] }, { "n": ["astronaut"], "u": "1f9d1-200d-1f680", "v": ["1f9d1-1f3fb-200d-1f680", "1f9d1-1f3fc-200d-1f680", "1f9d1-1f3fd-200d-1f680", "1f9d1-1f3fe-200d-1f680", "1f9d1-1f3ff-200d-1f680"] }, { "n": ["man astronaut", "male-astronaut"], "u": "1f468-200d-1f680", "v": ["1f468-1f3fb-200d-1f680", "1f468-1f3fc-200d-1f680", "1f468-1f3fd-200d-1f680", "1f468-1f3fe-200d-1f680", "1f468-1f3ff-200d-1f680"] }, { "n": ["woman astronaut", "female-astronaut"], "u": "1f469-200d-1f680", "v": ["1f469-1f3fb-200d-1f680", "1f469-1f3fc-200d-1f680", "1f469-1f3fd-200d-1f680", "1f469-1f3fe-200d-1f680", "1f469-1f3ff-200d-1f680"] }, { "n": ["firefighter"], "u": "1f9d1-200d-1f692", "v": ["1f9d1-1f3fb-200d-1f692", "1f9d1-1f3fc-200d-1f692", "1f9d1-1f3fd-200d-1f692", "1f9d1-1f3fe-200d-1f692", "1f9d1-1f3ff-200d-1f692"] }, { "n": ["man firefighter", "male-firefighter"], "u": "1f468-200d-1f692", "v": ["1f468-1f3fb-200d-1f692", "1f468-1f3fc-200d-1f692", "1f468-1f3fd-200d-1f692", "1f468-1f3fe-200d-1f692", "1f468-1f3ff-200d-1f692"] }, { "n": ["woman firefighter", "female-firefighter"], "u": "1f469-200d-1f692", "v": ["1f469-1f3fb-200d-1f692", "1f469-1f3fc-200d-1f692", "1f469-1f3fd-200d-1f692", "1f469-1f3fe-200d-1f692", "1f469-1f3ff-200d-1f692"] }, { "n": ["cop", "police officer"], "u": "1f46e", "v": ["1f46e-1f3fb", "1f46e-1f3fc", "1f46e-1f3fd", "1f46e-1f3fe", "1f46e-1f3ff"] }, { "n": ["man police officer", "male-police-officer"], "u": "1f46e-200d-2642-fe0f", "v": ["1f46e-1f3fb-200d-2642-fe0f", "1f46e-1f3fc-200d-2642-fe0f", "1f46e-1f3fd-200d-2642-fe0f", "1f46e-1f3fe-200d-2642-fe0f", "1f46e-1f3ff-200d-2642-fe0f"] }, { "n": ["woman police officer", "female-police-officer"], "u": "1f46e-200d-2640-fe0f", "v": ["1f46e-1f3fb-200d-2640-fe0f", "1f46e-1f3fc-200d-2640-fe0f", "1f46e-1f3fd-200d-2640-fe0f", "1f46e-1f3fe-200d-2640-fe0f", "1f46e-1f3ff-200d-2640-fe0f"] }, { "n": ["detective", "sleuth or spy"], "u": "1f575-fe0f", "v": ["1f575-1f3fb", "1f575-1f3fc", "1f575-1f3fd", "1f575-1f3fe", "1f575-1f3ff"] }, { "n": ["man detective", "male-detective"], "u": "1f575-fe0f-200d-2642-fe0f", "v": ["1f575-1f3fb-200d-2642-fe0f", "1f575-1f3fc-200d-2642-fe0f", "1f575-1f3fd-200d-2642-fe0f", "1f575-1f3fe-200d-2642-fe0f", "1f575-1f3ff-200d-2642-fe0f"] }, { "n": ["woman detective", "female-detective"], "u": "1f575-fe0f-200d-2640-fe0f", "v": ["1f575-1f3fb-200d-2640-fe0f", "1f575-1f3fc-200d-2640-fe0f", "1f575-1f3fd-200d-2640-fe0f", "1f575-1f3fe-200d-2640-fe0f", "1f575-1f3ff-200d-2640-fe0f"] }, { "n": ["guardsman"], "u": "1f482", "v": ["1f482-1f3fb", "1f482-1f3fc", "1f482-1f3fd", "1f482-1f3fe", "1f482-1f3ff"] }, { "n": ["man guard", "male-guard"], "u": "1f482-200d-2642-fe0f", "v": ["1f482-1f3fb-200d-2642-fe0f", "1f482-1f3fc-200d-2642-fe0f", "1f482-1f3fd-200d-2642-fe0f", "1f482-1f3fe-200d-2642-fe0f", "1f482-1f3ff-200d-2642-fe0f"] }, { "n": ["woman guard", "female-guard"], "u": "1f482-200d-2640-fe0f", "v": ["1f482-1f3fb-200d-2640-fe0f", "1f482-1f3fc-200d-2640-fe0f", "1f482-1f3fd-200d-2640-fe0f", "1f482-1f3fe-200d-2640-fe0f", "1f482-1f3ff-200d-2640-fe0f"] }, { "n": ["ninja"], "u": "1f977", "v": ["1f977-1f3fb", "1f977-1f3fc", "1f977-1f3fd", "1f977-1f3fe", "1f977-1f3ff"] }, { "n": ["construction worker"], "u": "1f477", "v": ["1f477-1f3fb", "1f477-1f3fc", "1f477-1f3fd", "1f477-1f3fe", "1f477-1f3ff"] }, { "n": ["man construction worker", "male-construction-worker"], "u": "1f477-200d-2642-fe0f", "v": ["1f477-1f3fb-200d-2642-fe0f", "1f477-1f3fc-200d-2642-fe0f", "1f477-1f3fd-200d-2642-fe0f", "1f477-1f3fe-200d-2642-fe0f", "1f477-1f3ff-200d-2642-fe0f"] }, { "n": ["woman construction worker", "female-construction-worker"], "u": "1f477-200d-2640-fe0f", "v": ["1f477-1f3fb-200d-2640-fe0f", "1f477-1f3fc-200d-2640-fe0f", "1f477-1f3fd-200d-2640-fe0f", "1f477-1f3fe-200d-2640-fe0f", "1f477-1f3ff-200d-2640-fe0f"] }, { "n": ["person with crown"], "u": "1fac5", "v": ["1fac5-1f3fb", "1fac5-1f3fc", "1fac5-1f3fd", "1fac5-1f3fe", "1fac5-1f3ff"] }, { "n": ["prince"], "u": "1f934", "v": ["1f934-1f3fb", "1f934-1f3fc", "1f934-1f3fd", "1f934-1f3fe", "1f934-1f3ff"] }, { "n": ["princess"], "u": "1f478", "v": ["1f478-1f3fb", "1f478-1f3fc", "1f478-1f3fd", "1f478-1f3fe", "1f478-1f3ff"] }, { "n": ["man with turban"], "u": "1f473", "v": ["1f473-1f3fb", "1f473-1f3fc", "1f473-1f3fd", "1f473-1f3fe", "1f473-1f3ff"] }, { "n": ["man wearing turban", "man-wearing-turban"], "u": "1f473-200d-2642-fe0f", "v": ["1f473-1f3fb-200d-2642-fe0f", "1f473-1f3fc-200d-2642-fe0f", "1f473-1f3fd-200d-2642-fe0f", "1f473-1f3fe-200d-2642-fe0f", "1f473-1f3ff-200d-2642-fe0f"] }, { "n": ["woman wearing turban", "woman-wearing-turban"], "u": "1f473-200d-2640-fe0f", "v": ["1f473-1f3fb-200d-2640-fe0f", "1f473-1f3fc-200d-2640-fe0f", "1f473-1f3fd-200d-2640-fe0f", "1f473-1f3fe-200d-2640-fe0f", "1f473-1f3ff-200d-2640-fe0f"] }, { "n": ["man with gua pi mao"], "u": "1f472", "v": ["1f472-1f3fb", "1f472-1f3fc", "1f472-1f3fd", "1f472-1f3fe", "1f472-1f3ff"] }, { "n": ["person with headscarf"], "u": "1f9d5", "v": ["1f9d5-1f3fb", "1f9d5-1f3fc", "1f9d5-1f3fd", "1f9d5-1f3fe", "1f9d5-1f3ff"] }, { "n": ["man in tuxedo", "person in tuxedo"], "u": "1f935", "v": ["1f935-1f3fb", "1f935-1f3fc", "1f935-1f3fd", "1f935-1f3fe", "1f935-1f3ff"] }, { "n": ["man in tuxedo"], "u": "1f935-200d-2642-fe0f", "v": ["1f935-1f3fb-200d-2642-fe0f", "1f935-1f3fc-200d-2642-fe0f", "1f935-1f3fd-200d-2642-fe0f", "1f935-1f3fe-200d-2642-fe0f", "1f935-1f3ff-200d-2642-fe0f"] }, { "n": ["woman in tuxedo"], "u": "1f935-200d-2640-fe0f", "v": ["1f935-1f3fb-200d-2640-fe0f", "1f935-1f3fc-200d-2640-fe0f", "1f935-1f3fd-200d-2640-fe0f", "1f935-1f3fe-200d-2640-fe0f", "1f935-1f3ff-200d-2640-fe0f"] }, { "n": ["bride with veil"], "u": "1f470", "v": ["1f470-1f3fb", "1f470-1f3fc", "1f470-1f3fd", "1f470-1f3fe", "1f470-1f3ff"] }, { "n": ["man with veil"], "u": "1f470-200d-2642-fe0f", "v": ["1f470-1f3fb-200d-2642-fe0f", "1f470-1f3fc-200d-2642-fe0f", "1f470-1f3fd-200d-2642-fe0f", "1f470-1f3fe-200d-2642-fe0f", "1f470-1f3ff-200d-2642-fe0f"] }, { "n": ["woman with veil"], "u": "1f470-200d-2640-fe0f", "v": ["1f470-1f3fb-200d-2640-fe0f", "1f470-1f3fc-200d-2640-fe0f", "1f470-1f3fd-200d-2640-fe0f", "1f470-1f3fe-200d-2640-fe0f", "1f470-1f3ff-200d-2640-fe0f"] }, { "n": ["pregnant woman"], "u": "1f930", "v": ["1f930-1f3fb", "1f930-1f3fc", "1f930-1f3fd", "1f930-1f3fe", "1f930-1f3ff"] }, { "n": ["pregnant man"], "u": "1fac3", "v": ["1fac3-1f3fb", "1fac3-1f3fc", "1fac3-1f3fd", "1fac3-1f3fe", "1fac3-1f3ff"] }, { "n": ["pregnant person"], "u": "1fac4", "v": ["1fac4-1f3fb", "1fac4-1f3fc", "1fac4-1f3fd", "1fac4-1f3fe", "1fac4-1f3ff"] }, { "n": ["breast-feeding"], "u": "1f931", "v": ["1f931-1f3fb", "1f931-1f3fc", "1f931-1f3fd", "1f931-1f3fe", "1f931-1f3ff"] }, { "n": ["woman feeding baby"], "u": "1f469-200d-1f37c", "v": ["1f469-1f3fb-200d-1f37c", "1f469-1f3fc-200d-1f37c", "1f469-1f3fd-200d-1f37c", "1f469-1f3fe-200d-1f37c", "1f469-1f3ff-200d-1f37c"] }, { "n": ["man feeding baby"], "u": "1f468-200d-1f37c", "v": ["1f468-1f3fb-200d-1f37c", "1f468-1f3fc-200d-1f37c", "1f468-1f3fd-200d-1f37c", "1f468-1f3fe-200d-1f37c", "1f468-1f3ff-200d-1f37c"] }, { "n": ["person feeding baby"], "u": "1f9d1-200d-1f37c", "v": ["1f9d1-1f3fb-200d-1f37c", "1f9d1-1f3fc-200d-1f37c", "1f9d1-1f3fd-200d-1f37c", "1f9d1-1f3fe-200d-1f37c", "1f9d1-1f3ff-200d-1f37c"] }, { "n": ["angel", "baby angel"], "u": "1f47c", "v": ["1f47c-1f3fb", "1f47c-1f3fc", "1f47c-1f3fd", "1f47c-1f3fe", "1f47c-1f3ff"] }, { "n": ["santa", "father christmas"], "u": "1f385", "v": ["1f385-1f3fb", "1f385-1f3fc", "1f385-1f3fd", "1f385-1f3fe", "1f385-1f3ff"] }, { "n": ["mrs claus", "mother christmas"], "u": "1f936", "v": ["1f936-1f3fb", "1f936-1f3fc", "1f936-1f3fd", "1f936-1f3fe", "1f936-1f3ff"] }, { "n": ["mx claus"], "u": "1f9d1-200d-1f384", "v": ["1f9d1-1f3fb-200d-1f384", "1f9d1-1f3fc-200d-1f384", "1f9d1-1f3fd-200d-1f384", "1f9d1-1f3fe-200d-1f384", "1f9d1-1f3ff-200d-1f384"] }, { "n": ["superhero"], "u": "1f9b8", "v": ["1f9b8-1f3fb", "1f9b8-1f3fc", "1f9b8-1f3fd", "1f9b8-1f3fe", "1f9b8-1f3ff"] }, { "n": ["man superhero", "male superhero"], "u": "1f9b8-200d-2642-fe0f", "v": ["1f9b8-1f3fb-200d-2642-fe0f", "1f9b8-1f3fc-200d-2642-fe0f", "1f9b8-1f3fd-200d-2642-fe0f", "1f9b8-1f3fe-200d-2642-fe0f", "1f9b8-1f3ff-200d-2642-fe0f"] }, { "n": ["woman superhero", "female superhero"], "u": "1f9b8-200d-2640-fe0f", "v": ["1f9b8-1f3fb-200d-2640-fe0f", "1f9b8-1f3fc-200d-2640-fe0f", "1f9b8-1f3fd-200d-2640-fe0f", "1f9b8-1f3fe-200d-2640-fe0f", "1f9b8-1f3ff-200d-2640-fe0f"] }, { "n": ["supervillain"], "u": "1f9b9", "v": ["1f9b9-1f3fb", "1f9b9-1f3fc", "1f9b9-1f3fd", "1f9b9-1f3fe", "1f9b9-1f3ff"] }, { "n": ["man supervillain", "male supervillain"], "u": "1f9b9-200d-2642-fe0f", "v": ["1f9b9-1f3fb-200d-2642-fe0f", "1f9b9-1f3fc-200d-2642-fe0f", "1f9b9-1f3fd-200d-2642-fe0f", "1f9b9-1f3fe-200d-2642-fe0f", "1f9b9-1f3ff-200d-2642-fe0f"] }, { "n": ["woman supervillain", "female supervillain"], "u": "1f9b9-200d-2640-fe0f", "v": ["1f9b9-1f3fb-200d-2640-fe0f", "1f9b9-1f3fc-200d-2640-fe0f", "1f9b9-1f3fd-200d-2640-fe0f", "1f9b9-1f3fe-200d-2640-fe0f", "1f9b9-1f3ff-200d-2640-fe0f"] }, { "n": ["mage"], "u": "1f9d9", "v": ["1f9d9-1f3fb", "1f9d9-1f3fc", "1f9d9-1f3fd", "1f9d9-1f3fe", "1f9d9-1f3ff"] }, { "n": ["man mage", "male mage"], "u": "1f9d9-200d-2642-fe0f", "v": ["1f9d9-1f3fb-200d-2642-fe0f", "1f9d9-1f3fc-200d-2642-fe0f", "1f9d9-1f3fd-200d-2642-fe0f", "1f9d9-1f3fe-200d-2642-fe0f", "1f9d9-1f3ff-200d-2642-fe0f"] }, { "n": ["woman mage", "female mage"], "u": "1f9d9-200d-2640-fe0f", "v": ["1f9d9-1f3fb-200d-2640-fe0f", "1f9d9-1f3fc-200d-2640-fe0f", "1f9d9-1f3fd-200d-2640-fe0f", "1f9d9-1f3fe-200d-2640-fe0f", "1f9d9-1f3ff-200d-2640-fe0f"] }, { "n": ["fairy"], "u": "1f9da", "v": ["1f9da-1f3fb", "1f9da-1f3fc", "1f9da-1f3fd", "1f9da-1f3fe", "1f9da-1f3ff"] }, { "n": ["man fairy", "male fairy"], "u": "1f9da-200d-2642-fe0f", "v": ["1f9da-1f3fb-200d-2642-fe0f", "1f9da-1f3fc-200d-2642-fe0f", "1f9da-1f3fd-200d-2642-fe0f", "1f9da-1f3fe-200d-2642-fe0f", "1f9da-1f3ff-200d-2642-fe0f"] }, { "n": ["woman fairy", "female fairy"], "u": "1f9da-200d-2640-fe0f", "v": ["1f9da-1f3fb-200d-2640-fe0f", "1f9da-1f3fc-200d-2640-fe0f", "1f9da-1f3fd-200d-2640-fe0f", "1f9da-1f3fe-200d-2640-fe0f", "1f9da-1f3ff-200d-2640-fe0f"] }, { "n": ["vampire"], "u": "1f9db", "v": ["1f9db-1f3fb", "1f9db-1f3fc", "1f9db-1f3fd", "1f9db-1f3fe", "1f9db-1f3ff"] }, { "n": ["man vampire", "male vampire"], "u": "1f9db-200d-2642-fe0f", "v": ["1f9db-1f3fb-200d-2642-fe0f", "1f9db-1f3fc-200d-2642-fe0f", "1f9db-1f3fd-200d-2642-fe0f", "1f9db-1f3fe-200d-2642-fe0f", "1f9db-1f3ff-200d-2642-fe0f"] }, { "n": ["woman vampire", "female vampire"], "u": "1f9db-200d-2640-fe0f", "v": ["1f9db-1f3fb-200d-2640-fe0f", "1f9db-1f3fc-200d-2640-fe0f", "1f9db-1f3fd-200d-2640-fe0f", "1f9db-1f3fe-200d-2640-fe0f", "1f9db-1f3ff-200d-2640-fe0f"] }, { "n": ["merperson"], "u": "1f9dc", "v": ["1f9dc-1f3fb", "1f9dc-1f3fc", "1f9dc-1f3fd", "1f9dc-1f3fe", "1f9dc-1f3ff"] }, { "n": ["merman"], "u": "1f9dc-200d-2642-fe0f", "v": ["1f9dc-1f3fb-200d-2642-fe0f", "1f9dc-1f3fc-200d-2642-fe0f", "1f9dc-1f3fd-200d-2642-fe0f", "1f9dc-1f3fe-200d-2642-fe0f", "1f9dc-1f3ff-200d-2642-fe0f"] }, { "n": ["mermaid"], "u": "1f9dc-200d-2640-fe0f", "v": ["1f9dc-1f3fb-200d-2640-fe0f", "1f9dc-1f3fc-200d-2640-fe0f", "1f9dc-1f3fd-200d-2640-fe0f", "1f9dc-1f3fe-200d-2640-fe0f", "1f9dc-1f3ff-200d-2640-fe0f"] }, { "n": ["elf"], "u": "1f9dd", "v": ["1f9dd-1f3fb", "1f9dd-1f3fc", "1f9dd-1f3fd", "1f9dd-1f3fe", "1f9dd-1f3ff"] }, { "n": ["man elf", "male elf"], "u": "1f9dd-200d-2642-fe0f", "v": ["1f9dd-1f3fb-200d-2642-fe0f", "1f9dd-1f3fc-200d-2642-fe0f", "1f9dd-1f3fd-200d-2642-fe0f", "1f9dd-1f3fe-200d-2642-fe0f", "1f9dd-1f3ff-200d-2642-fe0f"] }, { "n": ["woman elf", "female elf"], "u": "1f9dd-200d-2640-fe0f", "v": ["1f9dd-1f3fb-200d-2640-fe0f", "1f9dd-1f3fc-200d-2640-fe0f", "1f9dd-1f3fd-200d-2640-fe0f", "1f9dd-1f3fe-200d-2640-fe0f", "1f9dd-1f3ff-200d-2640-fe0f"] }, { "n": ["genie"], "u": "1f9de" }, { "n": ["man genie", "male genie"], "u": "1f9de-200d-2642-fe0f" }, { "n": ["woman genie", "female genie"], "u": "1f9de-200d-2640-fe0f" }, { "n": ["zombie"], "u": "1f9df" }, { "n": ["man zombie", "male zombie"], "u": "1f9df-200d-2642-fe0f" }, { "n": ["woman zombie", "female zombie"], "u": "1f9df-200d-2640-fe0f" }, { "n": ["troll"], "u": "1f9cc" }, { "n": ["massage", "face massage"], "u": "1f486", "v": ["1f486-1f3fb", "1f486-1f3fc", "1f486-1f3fd", "1f486-1f3fe", "1f486-1f3ff"] }, { "n": ["man getting massage", "man-getting-massage"], "u": "1f486-200d-2642-fe0f", "v": ["1f486-1f3fb-200d-2642-fe0f", "1f486-1f3fc-200d-2642-fe0f", "1f486-1f3fd-200d-2642-fe0f", "1f486-1f3fe-200d-2642-fe0f", "1f486-1f3ff-200d-2642-fe0f"] }, { "n": ["woman getting massage", "woman-getting-massage"], "u": "1f486-200d-2640-fe0f", "v": ["1f486-1f3fb-200d-2640-fe0f", "1f486-1f3fc-200d-2640-fe0f", "1f486-1f3fd-200d-2640-fe0f", "1f486-1f3fe-200d-2640-fe0f", "1f486-1f3ff-200d-2640-fe0f"] }, { "n": ["haircut"], "u": "1f487", "v": ["1f487-1f3fb", "1f487-1f3fc", "1f487-1f3fd", "1f487-1f3fe", "1f487-1f3ff"] }, { "n": ["man getting haircut", "man-getting-haircut"], "u": "1f487-200d-2642-fe0f", "v": ["1f487-1f3fb-200d-2642-fe0f", "1f487-1f3fc-200d-2642-fe0f", "1f487-1f3fd-200d-2642-fe0f", "1f487-1f3fe-200d-2642-fe0f", "1f487-1f3ff-200d-2642-fe0f"] }, { "n": ["woman getting haircut", "woman-getting-haircut"], "u": "1f487-200d-2640-fe0f", "v": ["1f487-1f3fb-200d-2640-fe0f", "1f487-1f3fc-200d-2640-fe0f", "1f487-1f3fd-200d-2640-fe0f", "1f487-1f3fe-200d-2640-fe0f", "1f487-1f3ff-200d-2640-fe0f"] }, { "n": ["walking", "pedestrian"], "u": "1f6b6", "v": ["1f6b6-1f3fb", "1f6b6-1f3fc", "1f6b6-1f3fd", "1f6b6-1f3fe", "1f6b6-1f3ff"] }, { "n": ["man walking", "man-walking"], "u": "1f6b6-200d-2642-fe0f", "v": ["1f6b6-1f3fb-200d-2642-fe0f", "1f6b6-1f3fc-200d-2642-fe0f", "1f6b6-1f3fd-200d-2642-fe0f", "1f6b6-1f3fe-200d-2642-fe0f", "1f6b6-1f3ff-200d-2642-fe0f"] }, { "n": ["woman walking", "woman-walking"], "u": "1f6b6-200d-2640-fe0f", "v": ["1f6b6-1f3fb-200d-2640-fe0f", "1f6b6-1f3fc-200d-2640-fe0f", "1f6b6-1f3fd-200d-2640-fe0f", "1f6b6-1f3fe-200d-2640-fe0f", "1f6b6-1f3ff-200d-2640-fe0f"] }, { "n": ["standing person"], "u": "1f9cd", "v": ["1f9cd-1f3fb", "1f9cd-1f3fc", "1f9cd-1f3fd", "1f9cd-1f3fe", "1f9cd-1f3ff"] }, { "n": ["man standing"], "u": "1f9cd-200d-2642-fe0f", "v": ["1f9cd-1f3fb-200d-2642-fe0f", "1f9cd-1f3fc-200d-2642-fe0f", "1f9cd-1f3fd-200d-2642-fe0f", "1f9cd-1f3fe-200d-2642-fe0f", "1f9cd-1f3ff-200d-2642-fe0f"] }, { "n": ["woman standing"], "u": "1f9cd-200d-2640-fe0f", "v": ["1f9cd-1f3fb-200d-2640-fe0f", "1f9cd-1f3fc-200d-2640-fe0f", "1f9cd-1f3fd-200d-2640-fe0f", "1f9cd-1f3fe-200d-2640-fe0f", "1f9cd-1f3ff-200d-2640-fe0f"] }, { "n": ["kneeling person"], "u": "1f9ce", "v": ["1f9ce-1f3fb", "1f9ce-1f3fc", "1f9ce-1f3fd", "1f9ce-1f3fe", "1f9ce-1f3ff"] }, { "n": ["man kneeling"], "u": "1f9ce-200d-2642-fe0f", "v": ["1f9ce-1f3fb-200d-2642-fe0f", "1f9ce-1f3fc-200d-2642-fe0f", "1f9ce-1f3fd-200d-2642-fe0f", "1f9ce-1f3fe-200d-2642-fe0f", "1f9ce-1f3ff-200d-2642-fe0f"] }, { "n": ["woman kneeling"], "u": "1f9ce-200d-2640-fe0f", "v": ["1f9ce-1f3fb-200d-2640-fe0f", "1f9ce-1f3fc-200d-2640-fe0f", "1f9ce-1f3fd-200d-2640-fe0f", "1f9ce-1f3fe-200d-2640-fe0f", "1f9ce-1f3ff-200d-2640-fe0f"] }, { "n": ["person with white cane", "person with probing cane"], "u": "1f9d1-200d-1f9af", "v": ["1f9d1-1f3fb-200d-1f9af", "1f9d1-1f3fc-200d-1f9af", "1f9d1-1f3fd-200d-1f9af", "1f9d1-1f3fe-200d-1f9af", "1f9d1-1f3ff-200d-1f9af"] }, { "n": ["man with white cane", "man with probing cane"], "u": "1f468-200d-1f9af", "v": ["1f468-1f3fb-200d-1f9af", "1f468-1f3fc-200d-1f9af", "1f468-1f3fd-200d-1f9af", "1f468-1f3fe-200d-1f9af", "1f468-1f3ff-200d-1f9af"] }, { "n": ["woman with white cane", "woman with probing cane"], "u": "1f469-200d-1f9af", "v": ["1f469-1f3fb-200d-1f9af", "1f469-1f3fc-200d-1f9af", "1f469-1f3fd-200d-1f9af", "1f469-1f3fe-200d-1f9af", "1f469-1f3ff-200d-1f9af"] }, { "n": ["person in motorized wheelchair"], "u": "1f9d1-200d-1f9bc", "v": ["1f9d1-1f3fb-200d-1f9bc", "1f9d1-1f3fc-200d-1f9bc", "1f9d1-1f3fd-200d-1f9bc", "1f9d1-1f3fe-200d-1f9bc", "1f9d1-1f3ff-200d-1f9bc"] }, { "n": ["man in motorized wheelchair"], "u": "1f468-200d-1f9bc", "v": ["1f468-1f3fb-200d-1f9bc", "1f468-1f3fc-200d-1f9bc", "1f468-1f3fd-200d-1f9bc", "1f468-1f3fe-200d-1f9bc", "1f468-1f3ff-200d-1f9bc"] }, { "n": ["woman in motorized wheelchair"], "u": "1f469-200d-1f9bc", "v": ["1f469-1f3fb-200d-1f9bc", "1f469-1f3fc-200d-1f9bc", "1f469-1f3fd-200d-1f9bc", "1f469-1f3fe-200d-1f9bc", "1f469-1f3ff-200d-1f9bc"] }, { "n": ["person in manual wheelchair"], "u": "1f9d1-200d-1f9bd", "v": ["1f9d1-1f3fb-200d-1f9bd", "1f9d1-1f3fc-200d-1f9bd", "1f9d1-1f3fd-200d-1f9bd", "1f9d1-1f3fe-200d-1f9bd", "1f9d1-1f3ff-200d-1f9bd"] }, { "n": ["man in manual wheelchair"], "u": "1f468-200d-1f9bd", "v": ["1f468-1f3fb-200d-1f9bd", "1f468-1f3fc-200d-1f9bd", "1f468-1f3fd-200d-1f9bd", "1f468-1f3fe-200d-1f9bd", "1f468-1f3ff-200d-1f9bd"] }, { "n": ["woman in manual wheelchair"], "u": "1f469-200d-1f9bd", "v": ["1f469-1f3fb-200d-1f9bd", "1f469-1f3fc-200d-1f9bd", "1f469-1f3fd-200d-1f9bd", "1f469-1f3fe-200d-1f9bd", "1f469-1f3ff-200d-1f9bd"] }, { "n": ["runner", "running"], "u": "1f3c3", "v": ["1f3c3-1f3fb", "1f3c3-1f3fc", "1f3c3-1f3fd", "1f3c3-1f3fe", "1f3c3-1f3ff"] }, { "n": ["man running", "man-running"], "u": "1f3c3-200d-2642-fe0f", "v": ["1f3c3-1f3fb-200d-2642-fe0f", "1f3c3-1f3fc-200d-2642-fe0f", "1f3c3-1f3fd-200d-2642-fe0f", "1f3c3-1f3fe-200d-2642-fe0f", "1f3c3-1f3ff-200d-2642-fe0f"] }, { "n": ["woman running", "woman-running"], "u": "1f3c3-200d-2640-fe0f", "v": ["1f3c3-1f3fb-200d-2640-fe0f", "1f3c3-1f3fc-200d-2640-fe0f", "1f3c3-1f3fd-200d-2640-fe0f", "1f3c3-1f3fe-200d-2640-fe0f", "1f3c3-1f3ff-200d-2640-fe0f"] }, { "n": ["dancer"], "u": "1f483", "v": ["1f483-1f3fb", "1f483-1f3fc", "1f483-1f3fd", "1f483-1f3fe", "1f483-1f3ff"] }, { "n": ["man dancing"], "u": "1f57a", "v": ["1f57a-1f3fb", "1f57a-1f3fc", "1f57a-1f3fd", "1f57a-1f3fe", "1f57a-1f3ff"] }, { "n": ["person in suit levitating", "man in business suit levitating"], "u": "1f574-fe0f", "v": ["1f574-1f3fb", "1f574-1f3fc", "1f574-1f3fd", "1f574-1f3fe", "1f574-1f3ff"] }, { "n": ["dancers", "woman with bunny ears"], "u": "1f46f" }, { "n": ["men with bunny ears", "men-with-bunny-ears-partying", "man-with-bunny-ears-partying"], "u": "1f46f-200d-2642-fe0f" }, { "n": ["women with bunny ears", "women-with-bunny-ears-partying", "woman-with-bunny-ears-partying"], "u": "1f46f-200d-2640-fe0f" }, { "n": ["person in steamy room"], "u": "1f9d6", "v": ["1f9d6-1f3fb", "1f9d6-1f3fc", "1f9d6-1f3fd", "1f9d6-1f3fe", "1f9d6-1f3ff"] }, { "n": ["man in steamy room"], "u": "1f9d6-200d-2642-fe0f", "v": ["1f9d6-1f3fb-200d-2642-fe0f", "1f9d6-1f3fc-200d-2642-fe0f", "1f9d6-1f3fd-200d-2642-fe0f", "1f9d6-1f3fe-200d-2642-fe0f", "1f9d6-1f3ff-200d-2642-fe0f"] }, { "n": ["woman in steamy room"], "u": "1f9d6-200d-2640-fe0f", "v": ["1f9d6-1f3fb-200d-2640-fe0f", "1f9d6-1f3fc-200d-2640-fe0f", "1f9d6-1f3fd-200d-2640-fe0f", "1f9d6-1f3fe-200d-2640-fe0f", "1f9d6-1f3ff-200d-2640-fe0f"] }, { "n": ["person climbing"], "u": "1f9d7", "v": ["1f9d7-1f3fb", "1f9d7-1f3fc", "1f9d7-1f3fd", "1f9d7-1f3fe", "1f9d7-1f3ff"] }, { "n": ["man climbing"], "u": "1f9d7-200d-2642-fe0f", "v": ["1f9d7-1f3fb-200d-2642-fe0f", "1f9d7-1f3fc-200d-2642-fe0f", "1f9d7-1f3fd-200d-2642-fe0f", "1f9d7-1f3fe-200d-2642-fe0f", "1f9d7-1f3ff-200d-2642-fe0f"] }, { "n": ["woman climbing"], "u": "1f9d7-200d-2640-fe0f", "v": ["1f9d7-1f3fb-200d-2640-fe0f", "1f9d7-1f3fc-200d-2640-fe0f", "1f9d7-1f3fd-200d-2640-fe0f", "1f9d7-1f3fe-200d-2640-fe0f", "1f9d7-1f3ff-200d-2640-fe0f"] }, { "n": ["fencer"], "u": "1f93a" }, { "n": ["horse racing"], "u": "1f3c7", "v": ["1f3c7-1f3fb", "1f3c7-1f3fc", "1f3c7-1f3fd", "1f3c7-1f3fe", "1f3c7-1f3ff"] }, { "n": ["skier"], "u": "26f7-fe0f" }, { "n": ["snowboarder"], "u": "1f3c2", "v": ["1f3c2-1f3fb", "1f3c2-1f3fc", "1f3c2-1f3fd", "1f3c2-1f3fe", "1f3c2-1f3ff"] }, { "n": ["golfer", "person golfing"], "u": "1f3cc-fe0f", "v": ["1f3cc-1f3fb", "1f3cc-1f3fc", "1f3cc-1f3fd", "1f3cc-1f3fe", "1f3cc-1f3ff"] }, { "n": ["man golfing", "man-golfing"], "u": "1f3cc-fe0f-200d-2642-fe0f", "v": ["1f3cc-1f3fb-200d-2642-fe0f", "1f3cc-1f3fc-200d-2642-fe0f", "1f3cc-1f3fd-200d-2642-fe0f", "1f3cc-1f3fe-200d-2642-fe0f", "1f3cc-1f3ff-200d-2642-fe0f"] }, { "n": ["woman golfing", "woman-golfing"], "u": "1f3cc-fe0f-200d-2640-fe0f", "v": ["1f3cc-1f3fb-200d-2640-fe0f", "1f3cc-1f3fc-200d-2640-fe0f", "1f3cc-1f3fd-200d-2640-fe0f", "1f3cc-1f3fe-200d-2640-fe0f", "1f3cc-1f3ff-200d-2640-fe0f"] }, { "n": ["surfer"], "u": "1f3c4", "v": ["1f3c4-1f3fb", "1f3c4-1f3fc", "1f3c4-1f3fd", "1f3c4-1f3fe", "1f3c4-1f3ff"] }, { "n": ["man surfing", "man-surfing"], "u": "1f3c4-200d-2642-fe0f", "v": ["1f3c4-1f3fb-200d-2642-fe0f", "1f3c4-1f3fc-200d-2642-fe0f", "1f3c4-1f3fd-200d-2642-fe0f", "1f3c4-1f3fe-200d-2642-fe0f", "1f3c4-1f3ff-200d-2642-fe0f"] }, { "n": ["woman surfing", "woman-surfing"], "u": "1f3c4-200d-2640-fe0f", "v": ["1f3c4-1f3fb-200d-2640-fe0f", "1f3c4-1f3fc-200d-2640-fe0f", "1f3c4-1f3fd-200d-2640-fe0f", "1f3c4-1f3fe-200d-2640-fe0f", "1f3c4-1f3ff-200d-2640-fe0f"] }, { "n": ["rowboat"], "u": "1f6a3", "v": ["1f6a3-1f3fb", "1f6a3-1f3fc", "1f6a3-1f3fd", "1f6a3-1f3fe", "1f6a3-1f3ff"] }, { "n": ["man rowing boat", "man-rowing-boat"], "u": "1f6a3-200d-2642-fe0f", "v": ["1f6a3-1f3fb-200d-2642-fe0f", "1f6a3-1f3fc-200d-2642-fe0f", "1f6a3-1f3fd-200d-2642-fe0f", "1f6a3-1f3fe-200d-2642-fe0f", "1f6a3-1f3ff-200d-2642-fe0f"] }, { "n": ["woman rowing boat", "woman-rowing-boat"], "u": "1f6a3-200d-2640-fe0f", "v": ["1f6a3-1f3fb-200d-2640-fe0f", "1f6a3-1f3fc-200d-2640-fe0f", "1f6a3-1f3fd-200d-2640-fe0f", "1f6a3-1f3fe-200d-2640-fe0f", "1f6a3-1f3ff-200d-2640-fe0f"] }, { "n": ["swimmer"], "u": "1f3ca", "v": ["1f3ca-1f3fb", "1f3ca-1f3fc", "1f3ca-1f3fd", "1f3ca-1f3fe", "1f3ca-1f3ff"] }, { "n": ["man swimming", "man-swimming"], "u": "1f3ca-200d-2642-fe0f", "v": ["1f3ca-1f3fb-200d-2642-fe0f", "1f3ca-1f3fc-200d-2642-fe0f", "1f3ca-1f3fd-200d-2642-fe0f", "1f3ca-1f3fe-200d-2642-fe0f", "1f3ca-1f3ff-200d-2642-fe0f"] }, { "n": ["woman swimming", "woman-swimming"], "u": "1f3ca-200d-2640-fe0f", "v": ["1f3ca-1f3fb-200d-2640-fe0f", "1f3ca-1f3fc-200d-2640-fe0f", "1f3ca-1f3fd-200d-2640-fe0f", "1f3ca-1f3fe-200d-2640-fe0f", "1f3ca-1f3ff-200d-2640-fe0f"] }, { "n": ["person with ball", "person bouncing ball"], "u": "26f9-fe0f", "v": ["26f9-1f3fb", "26f9-1f3fc", "26f9-1f3fd", "26f9-1f3fe", "26f9-1f3ff"] }, { "n": ["man bouncing ball", "man-bouncing-ball"], "u": "26f9-fe0f-200d-2642-fe0f", "v": ["26f9-1f3fb-200d-2642-fe0f", "26f9-1f3fc-200d-2642-fe0f", "26f9-1f3fd-200d-2642-fe0f", "26f9-1f3fe-200d-2642-fe0f", "26f9-1f3ff-200d-2642-fe0f"] }, { "n": ["woman bouncing ball", "woman-bouncing-ball"], "u": "26f9-fe0f-200d-2640-fe0f", "v": ["26f9-1f3fb-200d-2640-fe0f", "26f9-1f3fc-200d-2640-fe0f", "26f9-1f3fd-200d-2640-fe0f", "26f9-1f3fe-200d-2640-fe0f", "26f9-1f3ff-200d-2640-fe0f"] }, { "n": ["weight lifter", "person lifting weights"], "u": "1f3cb-fe0f", "v": ["1f3cb-1f3fb", "1f3cb-1f3fc", "1f3cb-1f3fd", "1f3cb-1f3fe", "1f3cb-1f3ff"] }, { "n": ["man lifting weights", "man-lifting-weights"], "u": "1f3cb-fe0f-200d-2642-fe0f", "v": ["1f3cb-1f3fb-200d-2642-fe0f", "1f3cb-1f3fc-200d-2642-fe0f", "1f3cb-1f3fd-200d-2642-fe0f", "1f3cb-1f3fe-200d-2642-fe0f", "1f3cb-1f3ff-200d-2642-fe0f"] }, { "n": ["woman lifting weights", "woman-lifting-weights"], "u": "1f3cb-fe0f-200d-2640-fe0f", "v": ["1f3cb-1f3fb-200d-2640-fe0f", "1f3cb-1f3fc-200d-2640-fe0f", "1f3cb-1f3fd-200d-2640-fe0f", "1f3cb-1f3fe-200d-2640-fe0f", "1f3cb-1f3ff-200d-2640-fe0f"] }, { "n": ["bicyclist"], "u": "1f6b4", "v": ["1f6b4-1f3fb", "1f6b4-1f3fc", "1f6b4-1f3fd", "1f6b4-1f3fe", "1f6b4-1f3ff"] }, { "n": ["man biking", "man-biking"], "u": "1f6b4-200d-2642-fe0f", "v": ["1f6b4-1f3fb-200d-2642-fe0f", "1f6b4-1f3fc-200d-2642-fe0f", "1f6b4-1f3fd-200d-2642-fe0f", "1f6b4-1f3fe-200d-2642-fe0f", "1f6b4-1f3ff-200d-2642-fe0f"] }, { "n": ["woman biking", "woman-biking"], "u": "1f6b4-200d-2640-fe0f", "v": ["1f6b4-1f3fb-200d-2640-fe0f", "1f6b4-1f3fc-200d-2640-fe0f", "1f6b4-1f3fd-200d-2640-fe0f", "1f6b4-1f3fe-200d-2640-fe0f", "1f6b4-1f3ff-200d-2640-fe0f"] }, { "n": ["mountain bicyclist"], "u": "1f6b5", "v": ["1f6b5-1f3fb", "1f6b5-1f3fc", "1f6b5-1f3fd", "1f6b5-1f3fe", "1f6b5-1f3ff"] }, { "n": ["man mountain biking", "man-mountain-biking"], "u": "1f6b5-200d-2642-fe0f", "v": ["1f6b5-1f3fb-200d-2642-fe0f", "1f6b5-1f3fc-200d-2642-fe0f", "1f6b5-1f3fd-200d-2642-fe0f", "1f6b5-1f3fe-200d-2642-fe0f", "1f6b5-1f3ff-200d-2642-fe0f"] }, { "n": ["woman mountain biking", "woman-mountain-biking"], "u": "1f6b5-200d-2640-fe0f", "v": ["1f6b5-1f3fb-200d-2640-fe0f", "1f6b5-1f3fc-200d-2640-fe0f", "1f6b5-1f3fd-200d-2640-fe0f", "1f6b5-1f3fe-200d-2640-fe0f", "1f6b5-1f3ff-200d-2640-fe0f"] }, { "n": ["person doing cartwheel"], "u": "1f938", "v": ["1f938-1f3fb", "1f938-1f3fc", "1f938-1f3fd", "1f938-1f3fe", "1f938-1f3ff"] }, { "n": ["man cartwheeling", "man-cartwheeling"], "u": "1f938-200d-2642-fe0f", "v": ["1f938-1f3fb-200d-2642-fe0f", "1f938-1f3fc-200d-2642-fe0f", "1f938-1f3fd-200d-2642-fe0f", "1f938-1f3fe-200d-2642-fe0f", "1f938-1f3ff-200d-2642-fe0f"] }, { "n": ["woman cartwheeling", "woman-cartwheeling"], "u": "1f938-200d-2640-fe0f", "v": ["1f938-1f3fb-200d-2640-fe0f", "1f938-1f3fc-200d-2640-fe0f", "1f938-1f3fd-200d-2640-fe0f", "1f938-1f3fe-200d-2640-fe0f", "1f938-1f3ff-200d-2640-fe0f"] }, { "n": ["wrestlers"], "u": "1f93c" }, { "n": ["men wrestling", "man-wrestling"], "u": "1f93c-200d-2642-fe0f" }, { "n": ["women wrestling", "woman-wrestling"], "u": "1f93c-200d-2640-fe0f" }, { "n": ["water polo"], "u": "1f93d", "v": ["1f93d-1f3fb", "1f93d-1f3fc", "1f93d-1f3fd", "1f93d-1f3fe", "1f93d-1f3ff"] }, { "n": ["man playing water polo", "man-playing-water-polo"], "u": "1f93d-200d-2642-fe0f", "v": ["1f93d-1f3fb-200d-2642-fe0f", "1f93d-1f3fc-200d-2642-fe0f", "1f93d-1f3fd-200d-2642-fe0f", "1f93d-1f3fe-200d-2642-fe0f", "1f93d-1f3ff-200d-2642-fe0f"] }, { "n": ["woman playing water polo", "woman-playing-water-polo"], "u": "1f93d-200d-2640-fe0f", "v": ["1f93d-1f3fb-200d-2640-fe0f", "1f93d-1f3fc-200d-2640-fe0f", "1f93d-1f3fd-200d-2640-fe0f", "1f93d-1f3fe-200d-2640-fe0f", "1f93d-1f3ff-200d-2640-fe0f"] }, { "n": ["handball"], "u": "1f93e", "v": ["1f93e-1f3fb", "1f93e-1f3fc", "1f93e-1f3fd", "1f93e-1f3fe", "1f93e-1f3ff"] }, { "n": ["man playing handball", "man-playing-handball"], "u": "1f93e-200d-2642-fe0f", "v": ["1f93e-1f3fb-200d-2642-fe0f", "1f93e-1f3fc-200d-2642-fe0f", "1f93e-1f3fd-200d-2642-fe0f", "1f93e-1f3fe-200d-2642-fe0f", "1f93e-1f3ff-200d-2642-fe0f"] }, { "n": ["woman playing handball", "woman-playing-handball"], "u": "1f93e-200d-2640-fe0f", "v": ["1f93e-1f3fb-200d-2640-fe0f", "1f93e-1f3fc-200d-2640-fe0f", "1f93e-1f3fd-200d-2640-fe0f", "1f93e-1f3fe-200d-2640-fe0f", "1f93e-1f3ff-200d-2640-fe0f"] }, { "n": ["juggling"], "u": "1f939", "v": ["1f939-1f3fb", "1f939-1f3fc", "1f939-1f3fd", "1f939-1f3fe", "1f939-1f3ff"] }, { "n": ["man juggling", "man-juggling"], "u": "1f939-200d-2642-fe0f", "v": ["1f939-1f3fb-200d-2642-fe0f", "1f939-1f3fc-200d-2642-fe0f", "1f939-1f3fd-200d-2642-fe0f", "1f939-1f3fe-200d-2642-fe0f", "1f939-1f3ff-200d-2642-fe0f"] }, { "n": ["woman juggling", "woman-juggling"], "u": "1f939-200d-2640-fe0f", "v": ["1f939-1f3fb-200d-2640-fe0f", "1f939-1f3fc-200d-2640-fe0f", "1f939-1f3fd-200d-2640-fe0f", "1f939-1f3fe-200d-2640-fe0f", "1f939-1f3ff-200d-2640-fe0f"] }, { "n": ["person in lotus position"], "u": "1f9d8", "v": ["1f9d8-1f3fb", "1f9d8-1f3fc", "1f9d8-1f3fd", "1f9d8-1f3fe", "1f9d8-1f3ff"] }, { "n": ["man in lotus position"], "u": "1f9d8-200d-2642-fe0f", "v": ["1f9d8-1f3fb-200d-2642-fe0f", "1f9d8-1f3fc-200d-2642-fe0f", "1f9d8-1f3fd-200d-2642-fe0f", "1f9d8-1f3fe-200d-2642-fe0f", "1f9d8-1f3ff-200d-2642-fe0f"] }, { "n": ["woman in lotus position"], "u": "1f9d8-200d-2640-fe0f", "v": ["1f9d8-1f3fb-200d-2640-fe0f", "1f9d8-1f3fc-200d-2640-fe0f", "1f9d8-1f3fd-200d-2640-fe0f", "1f9d8-1f3fe-200d-2640-fe0f", "1f9d8-1f3ff-200d-2640-fe0f"] }, { "n": ["bath"], "u": "1f6c0", "v": ["1f6c0-1f3fb", "1f6c0-1f3fc", "1f6c0-1f3fd", "1f6c0-1f3fe", "1f6c0-1f3ff"] }, { "n": ["sleeping accommodation"], "u": "1f6cc", "v": ["1f6cc-1f3fb", "1f6cc-1f3fc", "1f6cc-1f3fd", "1f6cc-1f3fe", "1f6cc-1f3ff"] }, { "n": ["people holding hands"], "u": "1f9d1-200d-1f91d-200d-1f9d1", "v": ["1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe", "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff"] }, { "n": ["women holding hands", "two women holding hands"], "u": "1f46d", "v": ["1f46d-1f3fb", "1f46d-1f3fc", "1f46d-1f3fd", "1f46d-1f3fe", "1f46d-1f3ff", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe", "1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe", "1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe", "1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd", "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe"] }, { "n": ["couple", "man and woman holding hands", "woman and man holding hands"], "u": "1f46b", "v": ["1f46b-1f3fb", "1f46b-1f3fc", "1f46b-1f3fd", "1f46b-1f3fe", "1f46b-1f3ff", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe", "1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe", "1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe", "1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd", "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe"] }, { "n": ["men holding hands", "two men holding hands"], "u": "1f46c", "v": ["1f46c-1f3fb", "1f46c-1f3fc", "1f46c-1f3fd", "1f46c-1f3fe", "1f46c-1f3ff", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe", "1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe", "1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe", "1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd", "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe"] }, { "n": ["kiss", "couplekiss"], "u": "1f48f", "v": ["1f48f-1f3fb", "1f48f-1f3fc", "1f48f-1f3fd", "1f48f-1f3fe", "1f48f-1f3ff", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe"] }, { "n": ["woman-kiss-man", "kiss: woman, man"], "u": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f468", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"] }, { "n": ["man-kiss-man", "kiss: man, man"], "u": "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468", "v": ["1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"] }, { "n": ["woman-kiss-woman", "kiss: woman, woman"], "u": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff"] }, { "n": ["couple with heart"], "u": "1f491", "v": ["1f491-1f3fb", "1f491-1f3fc", "1f491-1f3fd", "1f491-1f3fe", "1f491-1f3ff", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe", "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe", "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe", "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd", "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe"] }, { "n": ["woman-heart-man", "couple with heart: woman, man"], "u": "1f469-200d-2764-fe0f-200d-1f468", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"] }, { "n": ["man-heart-man", "couple with heart: man, man"], "u": "1f468-200d-2764-fe0f-200d-1f468", "v": ["1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"] }, { "n": ["woman-heart-woman", "couple with heart: woman, woman"], "u": "1f469-200d-2764-fe0f-200d-1f469", "v": ["1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe", "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff"] }, { "n": ["family"], "u": "1f46a" }, { "n": ["man-woman-boy", "family: man, woman, boy"], "u": "1f468-200d-1f469-200d-1f466" }, { "n": ["man-woman-girl", "family: man, woman, girl"], "u": "1f468-200d-1f469-200d-1f467" }, { "n": ["man-woman-girl-boy", "family: man, woman, girl, boy"], "u": "1f468-200d-1f469-200d-1f467-200d-1f466" }, { "n": ["man-woman-boy-boy", "family: man, woman, boy, boy"], "u": "1f468-200d-1f469-200d-1f466-200d-1f466" }, { "n": ["man-woman-girl-girl", "family: man, woman, girl, girl"], "u": "1f468-200d-1f469-200d-1f467-200d-1f467" }, { "n": ["man-man-boy", "family: man, man, boy"], "u": "1f468-200d-1f468-200d-1f466" }, { "n": ["man-man-girl", "family: man, man, girl"], "u": "1f468-200d-1f468-200d-1f467" }, { "n": ["man-man-girl-boy", "family: man, man, girl, boy"], "u": "1f468-200d-1f468-200d-1f467-200d-1f466" }, { "n": ["man-man-boy-boy", "family: man, man, boy, boy"], "u": "1f468-200d-1f468-200d-1f466-200d-1f466" }, { "n": ["man-man-girl-girl", "family: man, man, girl, girl"], "u": "1f468-200d-1f468-200d-1f467-200d-1f467" }, { "n": ["woman-woman-boy", "family: woman, woman, boy"], "u": "1f469-200d-1f469-200d-1f466" }, { "n": ["woman-woman-girl", "family: woman, woman, girl"], "u": "1f469-200d-1f469-200d-1f467" }, { "n": ["woman-woman-girl-boy", "family: woman, woman, girl, boy"], "u": "1f469-200d-1f469-200d-1f467-200d-1f466" }, { "n": ["woman-woman-boy-boy", "family: woman, woman, boy, boy"], "u": "1f469-200d-1f469-200d-1f466-200d-1f466" }, { "n": ["woman-woman-girl-girl", "family: woman, woman, girl, girl"], "u": "1f469-200d-1f469-200d-1f467-200d-1f467" }, { "n": ["man-boy", "family: man, boy"], "u": "1f468-200d-1f466" }, { "n": ["man-boy-boy", "family: man, boy, boy"], "u": "1f468-200d-1f466-200d-1f466" }, { "n": ["man-girl", "family: man, girl"], "u": "1f468-200d-1f467" }, { "n": ["man-girl-boy", "family: man, girl, boy"], "u": "1f468-200d-1f467-200d-1f466" }, { "n": ["man-girl-girl", "family: man, girl, girl"], "u": "1f468-200d-1f467-200d-1f467" }, { "n": ["woman-boy", "family: woman, boy"], "u": "1f469-200d-1f466" }, { "n": ["woman-boy-boy", "family: woman, boy, boy"], "u": "1f469-200d-1f466-200d-1f466" }, { "n": ["woman-girl", "family: woman, girl"], "u": "1f469-200d-1f467" }, { "n": ["woman-girl-boy", "family: woman, girl, boy"], "u": "1f469-200d-1f467-200d-1f466" }, { "n": ["woman-girl-girl", "family: woman, girl, girl"], "u": "1f469-200d-1f467-200d-1f467" }, { "n": ["speaking head", "speaking head in silhouette"], "u": "1f5e3-fe0f" }, { "n": ["bust in silhouette"], "u": "1f464" }, { "n": ["busts in silhouette"], "u": "1f465" }, { "n": ["people hugging"], "u": "1fac2" }, { "n": ["footprints"], "u": "1f463" }], "animals_nature": [{ "n": ["monkey face"], "u": "1f435" }, { "n": ["monkey"], "u": "1f412" }, { "n": ["gorilla"], "u": "1f98d" }, { "n": ["orangutan"], "u": "1f9a7" }, { "n": ["dog", "dog face"], "u": "1f436" }, { "n": ["dog", "dog2"], "u": "1f415" }, { "n": ["guide dog"], "u": "1f9ae" }, { "n": ["service dog"], "u": "1f415-200d-1f9ba" }, { "n": ["poodle"], "u": "1f429" }, { "n": ["wolf", "wolf face"], "u": "1f43a" }, { "n": ["fox face"], "u": "1f98a" }, { "n": ["raccoon"], "u": "1f99d" }, { "n": ["cat", "cat face"], "u": "1f431" }, { "n": ["cat", "cat2"], "u": "1f408" }, { "n": ["black cat"], "u": "1f408-200d-2b1b" }, { "n": ["lion face"], "u": "1f981" }, { "n": ["tiger", "tiger face"], "u": "1f42f" }, { "n": ["tiger", "tiger2"], "u": "1f405" }, { "n": ["leopard"], "u": "1f406" }, { "n": ["horse", "horse face"], "u": "1f434" }, { "n": ["horse", "racehorse"], "u": "1f40e" }, { "n": ["unicorn face"], "u": "1f984" }, { "n": ["zebra face"], "u": "1f993" }, { "n": ["deer"], "u": "1f98c" }, { "n": ["bison"], "u": "1f9ac" }, { "n": ["cow", "cow face"], "u": "1f42e" }, { "n": ["ox"], "u": "1f402" }, { "n": ["water buffalo"], "u": "1f403" }, { "n": ["cow", "cow2"], "u": "1f404" }, { "n": ["pig", "pig face"], "u": "1f437" }, { "n": ["pig", "pig2"], "u": "1f416" }, { "n": ["boar"], "u": "1f417" }, { "n": ["pig nose"], "u": "1f43d" }, { "n": ["ram"], "u": "1f40f" }, { "n": ["sheep"], "u": "1f411" }, { "n": ["goat"], "u": "1f410" }, { "n": ["dromedary camel"], "u": "1f42a" }, { "n": ["camel", "bactrian camel"], "u": "1f42b" }, { "n": ["llama"], "u": "1f999" }, { "n": ["giraffe face"], "u": "1f992" }, { "n": ["elephant"], "u": "1f418" }, { "n": ["mammoth"], "u": "1f9a3" }, { "n": ["rhinoceros"], "u": "1f98f" }, { "n": ["hippopotamus"], "u": "1f99b" }, { "n": ["mouse", "mouse face"], "u": "1f42d" }, { "n": ["mouse", "mouse2"], "u": "1f401" }, { "n": ["rat"], "u": "1f400" }, { "n": ["hamster", "hamster face"], "u": "1f439" }, { "n": ["rabbit", "rabbit face"], "u": "1f430" }, { "n": ["rabbit", "rabbit2"], "u": "1f407" }, { "n": ["chipmunk"], "u": "1f43f-fe0f" }, { "n": ["beaver"], "u": "1f9ab" }, { "n": ["hedgehog"], "u": "1f994" }, { "n": ["bat"], "u": "1f987" }, { "n": ["bear", "bear face"], "u": "1f43b" }, { "n": ["polar bear"], "u": "1f43b-200d-2744-fe0f" }, { "n": ["koala"], "u": "1f428" }, { "n": ["panda face"], "u": "1f43c" }, { "n": ["sloth"], "u": "1f9a5" }, { "n": ["otter"], "u": "1f9a6" }, { "n": ["skunk"], "u": "1f9a8" }, { "n": ["kangaroo"], "u": "1f998" }, { "n": ["badger"], "u": "1f9a1" }, { "n": ["feet", "paw prints"], "u": "1f43e" }, { "n": ["turkey"], "u": "1f983" }, { "n": ["chicken"], "u": "1f414" }, { "n": ["rooster"], "u": "1f413" }, { "n": ["hatching chick"], "u": "1f423" }, { "n": ["baby chick"], "u": "1f424" }, { "n": ["hatched chick", "front-facing baby chick"], "u": "1f425" }, { "n": ["bird"], "u": "1f426" }, { "n": ["penguin"], "u": "1f427" }, { "n": ["dove", "dove of peace"], "u": "1f54a-fe0f" }, { "n": ["eagle"], "u": "1f985" }, { "n": ["duck"], "u": "1f986" }, { "n": ["swan"], "u": "1f9a2" }, { "n": ["owl"], "u": "1f989" }, { "n": ["dodo"], "u": "1f9a4" }, { "n": ["feather"], "u": "1fab6" }, { "n": ["flamingo"], "u": "1f9a9" }, { "n": ["peacock"], "u": "1f99a" }, { "n": ["parrot"], "u": "1f99c" }, { "n": ["frog", "frog face"], "u": "1f438" }, { "n": ["crocodile"], "u": "1f40a" }, { "n": ["turtle"], "u": "1f422" }, { "n": ["lizard"], "u": "1f98e" }, { "n": ["snake"], "u": "1f40d" }, { "n": ["dragon face"], "u": "1f432" }, { "n": ["dragon"], "u": "1f409" }, { "n": ["sauropod"], "u": "1f995" }, { "n": ["t-rex"], "u": "1f996" }, { "n": ["whale", "spouting whale"], "u": "1f433" }, { "n": ["whale", "whale2"], "u": "1f40b" }, { "n": ["dolphin", "flipper"], "u": "1f42c" }, { "n": ["seal"], "u": "1f9ad" }, { "n": ["fish"], "u": "1f41f" }, { "n": ["tropical fish"], "u": "1f420" }, { "n": ["blowfish"], "u": "1f421" }, { "n": ["shark"], "u": "1f988" }, { "n": ["octopus"], "u": "1f419" }, { "n": ["shell", "spiral shell"], "u": "1f41a" }, { "n": ["coral"], "u": "1fab8" }, { "n": ["snail"], "u": "1f40c" }, { "n": ["butterfly"], "u": "1f98b" }, { "n": ["bug"], "u": "1f41b" }, { "n": ["ant"], "u": "1f41c" }, { "n": ["bee", "honeybee"], "u": "1f41d" }, { "n": ["beetle"], "u": "1fab2" }, { "n": ["ladybug", "lady beetle"], "u": "1f41e" }, { "n": ["cricket"], "u": "1f997" }, { "n": ["cockroach"], "u": "1fab3" }, { "n": ["spider"], "u": "1f577-fe0f" }, { "n": ["spider web"], "u": "1f578-fe0f" }, { "n": ["scorpion"], "u": "1f982" }, { "n": ["mosquito"], "u": "1f99f" }, { "n": ["fly"], "u": "1fab0" }, { "n": ["worm"], "u": "1fab1" }, { "n": ["microbe"], "u": "1f9a0" }, { "n": ["bouquet"], "u": "1f490" }, { "n": ["cherry blossom"], "u": "1f338" }, { "n": ["white flower"], "u": "1f4ae" }, { "n": ["lotus"], "u": "1fab7" }, { "n": ["rosette"], "u": "1f3f5-fe0f" }, { "n": ["rose"], "u": "1f339" }, { "n": ["wilted flower"], "u": "1f940" }, { "n": ["hibiscus"], "u": "1f33a" }, { "n": ["sunflower"], "u": "1f33b" }, { "n": ["blossom"], "u": "1f33c" }, { "n": ["tulip"], "u": "1f337" }, { "n": ["seedling"], "u": "1f331" }, { "n": ["potted plant"], "u": "1fab4" }, { "n": ["evergreen tree"], "u": "1f332" }, { "n": ["deciduous tree"], "u": "1f333" }, { "n": ["palm tree"], "u": "1f334" }, { "n": ["cactus"], "u": "1f335" }, { "n": ["ear of rice"], "u": "1f33e" }, { "n": ["herb"], "u": "1f33f" }, { "n": ["shamrock"], "u": "2618-fe0f" }, { "n": ["four leaf clover"], "u": "1f340" }, { "n": ["maple leaf"], "u": "1f341" }, { "n": ["fallen leaf"], "u": "1f342" }, { "n": ["leaves", "leaf fluttering in wind"], "u": "1f343" }, { "n": ["empty nest"], "u": "1fab9" }, { "n": ["nest with eggs"], "u": "1faba" }], "food_drink": [{ "n": ["grapes"], "u": "1f347" }, { "n": ["melon"], "u": "1f348" }, { "n": ["watermelon"], "u": "1f349" }, { "n": ["tangerine"], "u": "1f34a" }, { "n": ["lemon"], "u": "1f34b" }, { "n": ["banana"], "u": "1f34c" }, { "n": ["pineapple"], "u": "1f34d" }, { "n": ["mango"], "u": "1f96d" }, { "n": ["apple", "red apple"], "u": "1f34e" }, { "n": ["green apple"], "u": "1f34f" }, { "n": ["pear"], "u": "1f350" }, { "n": ["peach"], "u": "1f351" }, { "n": ["cherries"], "u": "1f352" }, { "n": ["strawberry"], "u": "1f353" }, { "n": ["blueberries"], "u": "1fad0" }, { "n": ["kiwifruit"], "u": "1f95d" }, { "n": ["tomato"], "u": "1f345" }, { "n": ["olive"], "u": "1fad2" }, { "n": ["coconut"], "u": "1f965" }, { "n": ["avocado"], "u": "1f951" }, { "n": ["eggplant", "aubergine"], "u": "1f346" }, { "n": ["potato"], "u": "1f954" }, { "n": ["carrot"], "u": "1f955" }, { "n": ["corn", "ear of maize"], "u": "1f33d" }, { "n": ["hot pepper"], "u": "1f336-fe0f" }, { "n": ["bell pepper"], "u": "1fad1" }, { "n": ["cucumber"], "u": "1f952" }, { "n": ["leafy green"], "u": "1f96c" }, { "n": ["broccoli"], "u": "1f966" }, { "n": ["garlic"], "u": "1f9c4" }, { "n": ["onion"], "u": "1f9c5" }, { "n": ["mushroom"], "u": "1f344" }, { "n": ["peanuts"], "u": "1f95c" }, { "n": ["beans"], "u": "1fad8" }, { "n": ["chestnut"], "u": "1f330" }, { "n": ["bread"], "u": "1f35e" }, { "n": ["croissant"], "u": "1f950" }, { "n": ["baguette bread"], "u": "1f956" }, { "n": ["flatbread"], "u": "1fad3" }, { "n": ["pretzel"], "u": "1f968" }, { "n": ["bagel"], "u": "1f96f" }, { "n": ["pancakes"], "u": "1f95e" }, { "n": ["waffle"], "u": "1f9c7" }, { "n": ["cheese wedge"], "u": "1f9c0" }, { "n": ["meat on bone"], "u": "1f356" }, { "n": ["poultry leg"], "u": "1f357" }, { "n": ["cut of meat"], "u": "1f969" }, { "n": ["bacon"], "u": "1f953" }, { "n": ["hamburger"], "u": "1f354" }, { "n": ["fries", "french fries"], "u": "1f35f" }, { "n": ["pizza", "slice of pizza"], "u": "1f355" }, { "n": ["hotdog", "hot dog"], "u": "1f32d" }, { "n": ["sandwich"], "u": "1f96a" }, { "n": ["taco"], "u": "1f32e" }, { "n": ["burrito"], "u": "1f32f" }, { "n": ["tamale"], "u": "1fad4" }, { "n": ["stuffed flatbread"], "u": "1f959" }, { "n": ["falafel"], "u": "1f9c6" }, { "n": ["egg"], "u": "1f95a" }, { "n": ["cooking", "fried egg"], "u": "1f373" }, { "n": ["shallow pan of food"], "u": "1f958" }, { "n": ["stew", "pot of food"], "u": "1f372" }, { "n": ["fondue"], "u": "1fad5" }, { "n": ["bowl with spoon"], "u": "1f963" }, { "n": ["green salad"], "u": "1f957" }, { "n": ["popcorn"], "u": "1f37f" }, { "n": ["butter"], "u": "1f9c8" }, { "n": ["salt", "salt shaker"], "u": "1f9c2" }, { "n": ["canned food"], "u": "1f96b" }, { "n": ["bento", "bento box"], "u": "1f371" }, { "n": ["rice cracker"], "u": "1f358" }, { "n": ["rice ball"], "u": "1f359" }, { "n": ["rice", "cooked rice"], "u": "1f35a" }, { "n": ["curry", "curry and rice"], "u": "1f35b" }, { "n": ["ramen", "steaming bowl"], "u": "1f35c" }, { "n": ["spaghetti"], "u": "1f35d" }, { "n": ["sweet potato", "roasted sweet potato"], "u": "1f360" }, { "n": ["oden"], "u": "1f362" }, { "n": ["sushi"], "u": "1f363" }, { "n": ["fried shrimp"], "u": "1f364" }, { "n": ["fish cake", "fish cake with swirl design"], "u": "1f365" }, { "n": ["moon cake"], "u": "1f96e" }, { "n": ["dango"], "u": "1f361" }, { "n": ["dumpling"], "u": "1f95f" }, { "n": ["fortune cookie"], "u": "1f960" }, { "n": ["takeout box"], "u": "1f961" }, { "n": ["crab"], "u": "1f980" }, { "n": ["lobster"], "u": "1f99e" }, { "n": ["shrimp"], "u": "1f990" }, { "n": ["squid"], "u": "1f991" }, { "n": ["oyster"], "u": "1f9aa" }, { "n": ["icecream", "soft ice cream"], "u": "1f366" }, { "n": ["shaved ice"], "u": "1f367" }, { "n": ["ice cream"], "u": "1f368" }, { "n": ["doughnut"], "u": "1f369" }, { "n": ["cookie"], "u": "1f36a" }, { "n": ["birthday", "birthday cake"], "u": "1f382" }, { "n": ["cake", "shortcake"], "u": "1f370" }, { "n": ["cupcake"], "u": "1f9c1" }, { "n": ["pie"], "u": "1f967" }, { "n": ["chocolate bar"], "u": "1f36b" }, { "n": ["candy"], "u": "1f36c" }, { "n": ["lollipop"], "u": "1f36d" }, { "n": ["custard"], "u": "1f36e" }, { "n": ["honey pot"], "u": "1f36f" }, { "n": ["baby bottle"], "u": "1f37c" }, { "n": ["glass of milk"], "u": "1f95b" }, { "n": ["coffee", "hot beverage"], "u": "2615" }, { "n": ["teapot"], "u": "1fad6" }, { "n": ["tea", "teacup without handle"], "u": "1f375" }, { "n": ["sake", "sake bottle and cup"], "u": "1f376" }, { "n": ["champagne", "bottle with popping cork"], "u": "1f37e" }, { "n": ["wine glass"], "u": "1f377" }, { "n": ["cocktail", "cocktail glass"], "u": "1f378" }, { "n": ["tropical drink"], "u": "1f379" }, { "n": ["beer", "beer mug"], "u": "1f37a" }, { "n": ["beers", "clinking beer mugs"], "u": "1f37b" }, { "n": ["clinking glasses"], "u": "1f942" }, { "n": ["tumbler glass"], "u": "1f943" }, { "n": ["pouring liquid"], "u": "1fad7" }, { "n": ["cup with straw"], "u": "1f964" }, { "n": ["bubble tea"], "u": "1f9cb" }, { "n": ["beverage box"], "u": "1f9c3" }, { "n": ["mate drink"], "u": "1f9c9" }, { "n": ["ice cube"], "u": "1f9ca" }, { "n": ["chopsticks"], "u": "1f962" }, { "n": ["knife fork plate", "fork and knife with plate"], "u": "1f37d-fe0f" }, { "n": ["fork and knife"], "u": "1f374" }, { "n": ["spoon"], "u": "1f944" }, { "n": ["hocho", "knife"], "u": "1f52a" }, { "n": ["jar"], "u": "1fad9" }, { "n": ["amphora"], "u": "1f3fa" }], "travel_places": [{ "n": ["earth africa", "earth globe europe-africa"], "u": "1f30d" }, { "n": ["earth americas", "earth globe americas"], "u": "1f30e" }, { "n": ["earth asia", "earth globe asia-australia"], "u": "1f30f" }, { "n": ["globe with meridians"], "u": "1f310" }, { "n": ["world map"], "u": "1f5fa-fe0f" }, { "n": ["japan", "silhouette of japan"], "u": "1f5fe" }, { "n": ["compass"], "u": "1f9ed" }, { "n": ["snow-capped mountain", "snow capped mountain"], "u": "1f3d4-fe0f" }, { "n": ["mountain"], "u": "26f0-fe0f" }, { "n": ["volcano"], "u": "1f30b" }, { "n": ["mount fuji"], "u": "1f5fb" }, { "n": ["camping"], "u": "1f3d5-fe0f" }, { "n": ["beach with umbrella"], "u": "1f3d6-fe0f" }, { "n": ["desert"], "u": "1f3dc-fe0f" }, { "n": ["desert island"], "u": "1f3dd-fe0f" }, { "n": ["national park"], "u": "1f3de-fe0f" }, { "n": ["stadium"], "u": "1f3df-fe0f" }, { "n": ["classical building"], "u": "1f3db-fe0f" }, { "n": ["building construction"], "u": "1f3d7-fe0f" }, { "n": ["brick", "bricks"], "u": "1f9f1" }, { "n": ["rock"], "u": "1faa8" }, { "n": ["wood"], "u": "1fab5" }, { "n": ["hut"], "u": "1f6d6" }, { "n": ["houses", "house buildings"], "u": "1f3d8-fe0f" }, { "n": ["derelict house", "derelict house building"], "u": "1f3da-fe0f" }, { "n": ["house", "house building"], "u": "1f3e0" }, { "n": ["house with garden"], "u": "1f3e1" }, { "n": ["office", "office building"], "u": "1f3e2" }, { "n": ["post office", "japanese post office"], "u": "1f3e3" }, { "n": ["european post office"], "u": "1f3e4" }, { "n": ["hospital"], "u": "1f3e5" }, { "n": ["bank"], "u": "1f3e6" }, { "n": ["hotel"], "u": "1f3e8" }, { "n": ["love hotel"], "u": "1f3e9" }, { "n": ["convenience store"], "u": "1f3ea" }, { "n": ["school"], "u": "1f3eb" }, { "n": ["department store"], "u": "1f3ec" }, { "n": ["factory"], "u": "1f3ed" }, { "n": ["japanese castle"], "u": "1f3ef" }, { "n": ["european castle"], "u": "1f3f0" }, { "n": ["wedding"], "u": "1f492" }, { "n": ["tokyo tower"], "u": "1f5fc" }, { "n": ["statue of liberty"], "u": "1f5fd" }, { "n": ["church"], "u": "26ea" }, { "n": ["mosque"], "u": "1f54c" }, { "n": ["hindu temple"], "u": "1f6d5" }, { "n": ["synagogue"], "u": "1f54d" }, { "n": ["shinto shrine"], "u": "26e9-fe0f" }, { "n": ["kaaba"], "u": "1f54b" }, { "n": ["fountain"], "u": "26f2" }, { "n": ["tent"], "u": "26fa" }, { "n": ["foggy"], "u": "1f301" }, { "n": ["night with stars"], "u": "1f303" }, { "n": ["cityscape"], "u": "1f3d9-fe0f" }, { "n": ["sunrise over mountains"], "u": "1f304" }, { "n": ["sunrise"], "u": "1f305" }, { "n": ["city sunset", "cityscape at dusk"], "u": "1f306" }, { "n": ["city sunrise", "sunset over buildings"], "u": "1f307" }, { "n": ["bridge at night"], "u": "1f309" }, { "n": ["hotsprings", "hot springs"], "u": "2668-fe0f" }, { "n": ["carousel horse"], "u": "1f3a0" }, { "n": ["playground slide"], "u": "1f6dd" }, { "n": ["ferris wheel"], "u": "1f3a1" }, { "n": ["roller coaster"], "u": "1f3a2" }, { "n": ["barber", "barber pole"], "u": "1f488" }, { "n": ["circus tent"], "u": "1f3aa" }, { "n": ["steam locomotive"], "u": "1f682" }, { "n": ["railway car"], "u": "1f683" }, { "n": ["high-speed train", "bullettrain side"], "u": "1f684" }, { "n": ["bullettrain front", "high-speed train with bullet nose"], "u": "1f685" }, { "n": ["train", "train2"], "u": "1f686" }, { "n": ["metro"], "u": "1f687" }, { "n": ["light rail"], "u": "1f688" }, { "n": ["station"], "u": "1f689" }, { "n": ["tram"], "u": "1f68a" }, { "n": ["monorail"], "u": "1f69d" }, { "n": ["mountain railway"], "u": "1f69e" }, { "n": ["train", "tram car"], "u": "1f68b" }, { "n": ["bus"], "u": "1f68c" }, { "n": ["oncoming bus"], "u": "1f68d" }, { "n": ["trolleybus"], "u": "1f68e" }, { "n": ["minibus"], "u": "1f690" }, { "n": ["ambulance"], "u": "1f691" }, { "n": ["fire engine"], "u": "1f692" }, { "n": ["police car"], "u": "1f693" }, { "n": ["oncoming police car"], "u": "1f694" }, { "n": ["taxi"], "u": "1f695" }, { "n": ["oncoming taxi"], "u": "1f696" }, { "n": ["car", "red car", "automobile"], "u": "1f697" }, { "n": ["oncoming automobile"], "u": "1f698" }, { "n": ["blue car", "recreational vehicle"], "u": "1f699" }, { "n": ["pickup truck"], "u": "1f6fb" }, { "n": ["truck", "delivery truck"], "u": "1f69a" }, { "n": ["articulated lorry"], "u": "1f69b" }, { "n": ["tractor"], "u": "1f69c" }, { "n": ["racing car"], "u": "1f3ce-fe0f" }, { "n": ["motorcycle", "racing motorcycle"], "u": "1f3cd-fe0f" }, { "n": ["motor scooter"], "u": "1f6f5" }, { "n": ["manual wheelchair"], "u": "1f9bd" }, { "n": ["motorized wheelchair"], "u": "1f9bc" }, { "n": ["auto rickshaw"], "u": "1f6fa" }, { "n": ["bike", "bicycle"], "u": "1f6b2" }, { "n": ["scooter"], "u": "1f6f4" }, { "n": ["skateboard"], "u": "1f6f9" }, { "n": ["roller skate"], "u": "1f6fc" }, { "n": ["busstop", "bus stop"], "u": "1f68f" }, { "n": ["motorway"], "u": "1f6e3-fe0f" }, { "n": ["railway track"], "u": "1f6e4-fe0f" }, { "n": ["oil drum"], "u": "1f6e2-fe0f" }, { "n": ["fuelpump", "fuel pump"], "u": "26fd" }, { "n": ["wheel"], "u": "1f6de" }, { "n": ["rotating light", "police cars revolving light"], "u": "1f6a8" }, { "n": ["traffic light", "horizontal traffic light"], "u": "1f6a5" }, { "n": ["vertical traffic light"], "u": "1f6a6" }, { "n": ["octagonal sign"], "u": "1f6d1" }, { "n": ["construction", "construction sign"], "u": "1f6a7" }, { "n": ["anchor"], "u": "2693" }, { "n": ["ring buoy"], "u": "1f6df" }, { "n": ["boat", "sailboat"], "u": "26f5" }, { "n": ["canoe"], "u": "1f6f6" }, { "n": ["speedboat"], "u": "1f6a4" }, { "n": ["passenger ship"], "u": "1f6f3-fe0f" }, { "n": ["ferry"], "u": "26f4-fe0f" }, { "n": ["motor boat"], "u": "1f6e5-fe0f" }, { "n": ["ship"], "u": "1f6a2" }, { "n": ["airplane"], "u": "2708-fe0f" }, { "n": ["small airplane"], "u": "1f6e9-fe0f" }, { "n": ["airplane departure"], "u": "1f6eb" }, { "n": ["airplane arriving"], "u": "1f6ec" }, { "n": ["parachute"], "u": "1fa82" }, { "n": ["seat"], "u": "1f4ba" }, { "n": ["helicopter"], "u": "1f681" }, { "n": ["suspension railway"], "u": "1f69f" }, { "n": ["mountain cableway"], "u": "1f6a0" }, { "n": ["aerial tramway"], "u": "1f6a1" }, { "n": ["satellite"], "u": "1f6f0-fe0f" }, { "n": ["rocket"], "u": "1f680" }, { "n": ["flying saucer"], "u": "1f6f8" }, { "n": ["bellhop bell"], "u": "1f6ce-fe0f" }, { "n": ["luggage"], "u": "1f9f3" }, { "n": ["hourglass"], "u": "231b" }, { "n": ["hourglass flowing sand", "hourglass with flowing sand"], "u": "23f3" }, { "n": ["watch"], "u": "231a" }, { "n": ["alarm clock"], "u": "23f0" }, { "n": ["stopwatch"], "u": "23f1-fe0f" }, { "n": ["timer clock"], "u": "23f2-fe0f" }, { "n": ["mantelpiece clock"], "u": "1f570-fe0f" }, { "n": ["clock12", "clock face twelve oclock"], "u": "1f55b" }, { "n": ["clock1230", "clock face twelve-thirty"], "u": "1f567" }, { "n": ["clock1", "clock face one oclock"], "u": "1f550" }, { "n": ["clock130", "clock face one-thirty"], "u": "1f55c" }, { "n": ["clock2", "clock face two oclock"], "u": "1f551" }, { "n": ["clock230", "clock face two-thirty"], "u": "1f55d" }, { "n": ["clock3", "clock face three oclock"], "u": "1f552" }, { "n": ["clock330", "clock face three-thirty"], "u": "1f55e" }, { "n": ["clock4", "clock face four oclock"], "u": "1f553" }, { "n": ["clock430", "clock face four-thirty"], "u": "1f55f" }, { "n": ["clock5", "clock face five oclock"], "u": "1f554" }, { "n": ["clock530", "clock face five-thirty"], "u": "1f560" }, { "n": ["clock6", "clock face six oclock"], "u": "1f555" }, { "n": ["clock630", "clock face six-thirty"], "u": "1f561" }, { "n": ["clock7", "clock face seven oclock"], "u": "1f556" }, { "n": ["clock730", "clock face seven-thirty"], "u": "1f562" }, { "n": ["clock8", "clock face eight oclock"], "u": "1f557" }, { "n": ["clock830", "clock face eight-thirty"], "u": "1f563" }, { "n": ["clock9", "clock face nine oclock"], "u": "1f558" }, { "n": ["clock930", "clock face nine-thirty"], "u": "1f564" }, { "n": ["clock10", "clock face ten oclock"], "u": "1f559" }, { "n": ["clock1030", "clock face ten-thirty"], "u": "1f565" }, { "n": ["clock11", "clock face eleven oclock"], "u": "1f55a" }, { "n": ["clock1130", "clock face eleven-thirty"], "u": "1f566" }, { "n": ["new moon", "new moon symbol"], "u": "1f311" }, { "n": ["waxing crescent moon", "waxing crescent moon symbol"], "u": "1f312" }, { "n": ["first quarter moon", "first quarter moon symbol"], "u": "1f313" }, { "n": ["moon", "waxing gibbous moon", "waxing gibbous moon symbol"], "u": "1f314" }, { "n": ["full moon", "full moon symbol"], "u": "1f315" }, { "n": ["waning gibbous moon", "waning gibbous moon symbol"], "u": "1f316" }, { "n": ["last quarter moon", "last quarter moon symbol"], "u": "1f317" }, { "n": ["waning crescent moon", "waning crescent moon symbol"], "u": "1f318" }, { "n": ["crescent moon"], "u": "1f319" }, { "n": ["new moon with face"], "u": "1f31a" }, { "n": ["first quarter moon with face"], "u": "1f31b" }, { "n": ["last quarter moon with face"], "u": "1f31c" }, { "n": ["thermometer"], "u": "1f321-fe0f" }, { "n": ["sunny", "black sun with rays"], "u": "2600-fe0f" }, { "n": ["full moon with face"], "u": "1f31d" }, { "n": ["sun with face"], "u": "1f31e" }, { "n": ["ringed planet"], "u": "1fa90" }, { "n": ["star", "white medium star"], "u": "2b50" }, { "n": ["star2", "glowing star"], "u": "1f31f" }, { "n": ["stars", "shooting star"], "u": "1f320" }, { "n": ["milky way"], "u": "1f30c" }, { "n": ["cloud"], "u": "2601-fe0f" }, { "n": ["partly sunny", "sun behind cloud"], "u": "26c5" }, { "n": ["thunder cloud and rain", "cloud with lightning and rain"], "u": "26c8-fe0f" }, { "n": ["mostly sunny", "sun small cloud", "sun behind small cloud"], "u": "1f324-fe0f" }, { "n": ["barely sunny", "sun behind cloud", "sun behind large cloud"], "u": "1f325-fe0f" }, { "n": ["partly sunny rain", "sun behind rain cloud"], "u": "1f326-fe0f" }, { "n": ["rain cloud", "cloud with rain"], "u": "1f327-fe0f" }, { "n": ["snow cloud", "cloud with snow"], "u": "1f328-fe0f" }, { "n": ["lightning", "lightning cloud", "cloud with lightning"], "u": "1f329-fe0f" }, { "n": ["tornado", "tornado cloud"], "u": "1f32a-fe0f" }, { "n": ["fog"], "u": "1f32b-fe0f" }, { "n": ["wind face", "wind blowing face"], "u": "1f32c-fe0f" }, { "n": ["cyclone"], "u": "1f300" }, { "n": ["rainbow"], "u": "1f308" }, { "n": ["closed umbrella"], "u": "1f302" }, { "n": ["umbrella"], "u": "2602-fe0f" }, { "n": ["umbrella with rain drops"], "u": "2614" }, { "n": ["umbrella on ground"], "u": "26f1-fe0f" }, { "n": ["zap", "high voltage sign"], "u": "26a1" }, { "n": ["snowflake"], "u": "2744-fe0f" }, { "n": ["snowman"], "u": "2603-fe0f" }, { "n": ["snowman without snow"], "u": "26c4" }, { "n": ["comet"], "u": "2604-fe0f" }, { "n": ["fire"], "u": "1f525" }, { "n": ["droplet"], "u": "1f4a7" }, { "n": ["ocean", "water wave"], "u": "1f30a" }], "activities": [{ "n": ["jack-o-lantern", "jack o lantern"], "u": "1f383" }, { "n": ["christmas tree"], "u": "1f384" }, { "n": ["fireworks"], "u": "1f386" }, { "n": ["sparkler", "firework sparkler"], "u": "1f387" }, { "n": ["firecracker"], "u": "1f9e8" }, { "n": ["sparkles"], "u": "2728" }, { "n": ["balloon"], "u": "1f388" }, { "n": ["tada", "party popper"], "u": "1f389" }, { "n": ["confetti ball"], "u": "1f38a" }, { "n": ["tanabata tree"], "u": "1f38b" }, { "n": ["bamboo", "pine decoration"], "u": "1f38d" }, { "n": ["dolls", "japanese dolls"], "u": "1f38e" }, { "n": ["flags", "carp streamer"], "u": "1f38f" }, { "n": ["wind chime"], "u": "1f390" }, { "n": ["rice scene", "moon viewing ceremony"], "u": "1f391" }, { "n": ["red envelope", "red gift envelope"], "u": "1f9e7" }, { "n": ["ribbon"], "u": "1f380" }, { "n": ["gift", "wrapped present"], "u": "1f381" }, { "n": ["reminder ribbon"], "u": "1f397-fe0f" }, { "n": ["admission tickets"], "u": "1f39f-fe0f" }, { "n": ["ticket"], "u": "1f3ab" }, { "n": ["medal", "military medal"], "u": "1f396-fe0f" }, { "n": ["trophy"], "u": "1f3c6" }, { "n": ["sports medal"], "u": "1f3c5" }, { "n": ["first place medal"], "u": "1f947" }, { "n": ["second place medal"], "u": "1f948" }, { "n": ["third place medal"], "u": "1f949" }, { "n": ["soccer", "soccer ball"], "u": "26bd" }, { "n": ["baseball"], "u": "26be" }, { "n": ["softball"], "u": "1f94e" }, { "n": ["basketball", "basketball and hoop"], "u": "1f3c0" }, { "n": ["volleyball"], "u": "1f3d0" }, { "n": ["football", "american football"], "u": "1f3c8" }, { "n": ["rugby football"], "u": "1f3c9" }, { "n": ["tennis", "tennis racquet and ball"], "u": "1f3be" }, { "n": ["flying disc"], "u": "1f94f" }, { "n": ["bowling"], "u": "1f3b3" }, { "n": ["cricket bat and ball"], "u": "1f3cf" }, { "n": ["field hockey stick and ball"], "u": "1f3d1" }, { "n": ["ice hockey stick and puck"], "u": "1f3d2" }, { "n": ["lacrosse", "lacrosse stick and ball"], "u": "1f94d" }, { "n": ["table tennis paddle and ball"], "u": "1f3d3" }, { "n": ["badminton racquet and shuttlecock"], "u": "1f3f8" }, { "n": ["boxing glove"], "u": "1f94a" }, { "n": ["martial arts uniform"], "u": "1f94b" }, { "n": ["goal net"], "u": "1f945" }, { "n": ["golf", "flag in hole"], "u": "26f3" }, { "n": ["ice skate"], "u": "26f8-fe0f" }, { "n": ["fishing pole and fish"], "u": "1f3a3" }, { "n": ["diving mask"], "u": "1f93f" }, { "n": ["running shirt with sash"], "u": "1f3bd" }, { "n": ["ski", "ski and ski boot"], "u": "1f3bf" }, { "n": ["sled"], "u": "1f6f7" }, { "n": ["curling stone"], "u": "1f94c" }, { "n": ["dart", "direct hit"], "u": "1f3af" }, { "n": ["yo-yo"], "u": "1fa80" }, { "n": ["kite"], "u": "1fa81" }, { "n": ["8ball", "billiards"], "u": "1f3b1" }, { "n": ["crystal ball"], "u": "1f52e" }, { "n": ["magic wand"], "u": "1fa84" }, { "n": ["nazar amulet"], "u": "1f9ff" }, { "n": ["hamsa"], "u": "1faac" }, { "n": ["video game"], "u": "1f3ae" }, { "n": ["joystick"], "u": "1f579-fe0f" }, { "n": ["slot machine"], "u": "1f3b0" }, { "n": ["game die"], "u": "1f3b2" }, { "n": ["jigsaw", "jigsaw puzzle piece"], "u": "1f9e9" }, { "n": ["teddy bear"], "u": "1f9f8" }, { "n": ["pinata"], "u": "1fa85" }, { "n": ["mirror ball"], "u": "1faa9" }, { "n": ["nesting dolls"], "u": "1fa86" }, { "n": ["spades", "black spade suit"], "u": "2660-fe0f" }, { "n": ["hearts", "black heart suit"], "u": "2665-fe0f" }, { "n": ["diamonds", "black diamond suit"], "u": "2666-fe0f" }, { "n": ["clubs", "black club suit"], "u": "2663-fe0f" }, { "n": ["chess pawn"], "u": "265f-fe0f" }, { "n": ["black joker", "playing card black joker"], "u": "1f0cf" }, { "n": ["mahjong", "mahjong tile red dragon"], "u": "1f004" }, { "n": ["flower playing cards"], "u": "1f3b4" }, { "n": ["performing arts"], "u": "1f3ad" }, { "n": ["framed picture", "frame with picture"], "u": "1f5bc-fe0f" }, { "n": ["art", "artist palette"], "u": "1f3a8" }, { "n": ["thread", "spool of thread"], "u": "1f9f5" }, { "n": ["sewing needle"], "u": "1faa1" }, { "n": ["yarn", "ball of yarn"], "u": "1f9f6" }, { "n": ["knot"], "u": "1faa2" }], "objects": [{ "n": ["eyeglasses"], "u": "1f453" }, { "n": ["sunglasses", "dark sunglasses"], "u": "1f576-fe0f" }, { "n": ["goggles"], "u": "1f97d" }, { "n": ["lab coat"], "u": "1f97c" }, { "n": ["safety vest"], "u": "1f9ba" }, { "n": ["necktie"], "u": "1f454" }, { "n": ["shirt", "tshirt", "t-shirt"], "u": "1f455" }, { "n": ["jeans"], "u": "1f456" }, { "n": ["scarf"], "u": "1f9e3" }, { "n": ["gloves"], "u": "1f9e4" }, { "n": ["coat"], "u": "1f9e5" }, { "n": ["socks"], "u": "1f9e6" }, { "n": ["dress"], "u": "1f457" }, { "n": ["kimono"], "u": "1f458" }, { "n": ["sari"], "u": "1f97b" }, { "n": ["one-piece swimsuit"], "u": "1fa71" }, { "n": ["briefs"], "u": "1fa72" }, { "n": ["shorts"], "u": "1fa73" }, { "n": ["bikini"], "u": "1f459" }, { "n": ["womans clothes"], "u": "1f45a" }, { "n": ["purse"], "u": "1f45b" }, { "n": ["handbag"], "u": "1f45c" }, { "n": ["pouch"], "u": "1f45d" }, { "n": ["shopping bags"], "u": "1f6cd-fe0f" }, { "n": ["school satchel"], "u": "1f392" }, { "n": ["thong sandal"], "u": "1fa74" }, { "n": ["shoe", "mans shoe"], "u": "1f45e" }, { "n": ["athletic shoe"], "u": "1f45f" }, { "n": ["hiking boot"], "u": "1f97e" }, { "n": ["flat shoe", "womans flat shoe"], "u": "1f97f" }, { "n": ["high heel", "high-heeled shoe"], "u": "1f460" }, { "n": ["sandal", "womans sandal"], "u": "1f461" }, { "n": ["ballet shoes"], "u": "1fa70" }, { "n": ["boot", "womans boots"], "u": "1f462" }, { "n": ["crown"], "u": "1f451" }, { "n": ["womans hat"], "u": "1f452" }, { "n": ["tophat", "top hat"], "u": "1f3a9" }, { "n": ["mortar board", "graduation cap"], "u": "1f393" }, { "n": ["billed cap"], "u": "1f9e2" }, { "n": ["military helmet"], "u": "1fa96" }, { "n": ["rescue worker\u2019s helmet", "helmet with white cross"], "u": "26d1-fe0f" }, { "n": ["prayer beads"], "u": "1f4ff" }, { "n": ["lipstick"], "u": "1f484" }, { "n": ["ring"], "u": "1f48d" }, { "n": ["gem", "gem stone"], "u": "1f48e" }, { "n": ["mute", "speaker with cancellation stroke"], "u": "1f507" }, { "n": ["speaker"], "u": "1f508" }, { "n": ["sound", "speaker with one sound wave"], "u": "1f509" }, { "n": ["loud sound", "speaker with three sound waves"], "u": "1f50a" }, { "n": ["loudspeaker", "public address loudspeaker"], "u": "1f4e2" }, { "n": ["mega", "cheering megaphone"], "u": "1f4e3" }, { "n": ["postal horn"], "u": "1f4ef" }, { "n": ["bell"], "u": "1f514" }, { "n": ["no bell", "bell with cancellation stroke"], "u": "1f515" }, { "n": ["musical score"], "u": "1f3bc" }, { "n": ["musical note"], "u": "1f3b5" }, { "n": ["notes", "multiple musical notes"], "u": "1f3b6" }, { "n": ["studio microphone"], "u": "1f399-fe0f" }, { "n": ["level slider"], "u": "1f39a-fe0f" }, { "n": ["control knobs"], "u": "1f39b-fe0f" }, { "n": ["microphone"], "u": "1f3a4" }, { "n": ["headphone", "headphones"], "u": "1f3a7" }, { "n": ["radio"], "u": "1f4fb" }, { "n": ["saxophone"], "u": "1f3b7" }, { "n": ["accordion"], "u": "1fa97" }, { "n": ["guitar"], "u": "1f3b8" }, { "n": ["musical keyboard"], "u": "1f3b9" }, { "n": ["trumpet"], "u": "1f3ba" }, { "n": ["violin"], "u": "1f3bb" }, { "n": ["banjo"], "u": "1fa95" }, { "n": ["drum with drumsticks"], "u": "1f941" }, { "n": ["long drum"], "u": "1fa98" }, { "n": ["iphone", "mobile phone"], "u": "1f4f1" }, { "n": ["calling", "mobile phone with rightwards arrow at left"], "u": "1f4f2" }, { "n": ["phone", "telephone", "black telephone"], "u": "260e-fe0f" }, { "n": ["telephone receiver"], "u": "1f4de" }, { "n": ["pager"], "u": "1f4df" }, { "n": ["fax", "fax machine"], "u": "1f4e0" }, { "n": ["battery"], "u": "1f50b" }, { "n": ["low battery"], "u": "1faab" }, { "n": ["electric plug"], "u": "1f50c" }, { "n": ["computer", "personal computer"], "u": "1f4bb" }, { "n": ["desktop computer"], "u": "1f5a5-fe0f" }, { "n": ["printer"], "u": "1f5a8-fe0f" }, { "n": ["keyboard"], "u": "2328-fe0f" }, { "n": ["computer mouse", "three button mouse"], "u": "1f5b1-fe0f" }, { "n": ["trackball"], "u": "1f5b2-fe0f" }, { "n": ["minidisc"], "u": "1f4bd" }, { "n": ["floppy disk"], "u": "1f4be" }, { "n": ["cd", "optical disc"], "u": "1f4bf" }, { "n": ["dvd"], "u": "1f4c0" }, { "n": ["abacus"], "u": "1f9ee" }, { "n": ["movie camera"], "u": "1f3a5" }, { "n": ["film frames"], "u": "1f39e-fe0f" }, { "n": ["film projector"], "u": "1f4fd-fe0f" }, { "n": ["clapper", "clapper board"], "u": "1f3ac" }, { "n": ["tv", "television"], "u": "1f4fa" }, { "n": ["camera"], "u": "1f4f7" }, { "n": ["camera with flash"], "u": "1f4f8" }, { "n": ["video camera"], "u": "1f4f9" }, { "n": ["vhs", "videocassette"], "u": "1f4fc" }, { "n": ["mag", "left-pointing magnifying glass"], "u": "1f50d" }, { "n": ["mag right", "right-pointing magnifying glass"], "u": "1f50e" }, { "n": ["candle"], "u": "1f56f-fe0f" }, { "n": ["bulb", "electric light bulb"], "u": "1f4a1" }, { "n": ["flashlight", "electric torch"], "u": "1f526" }, { "n": ["lantern", "izakaya lantern"], "u": "1f3ee" }, { "n": ["diya lamp"], "u": "1fa94" }, { "n": ["notebook with decorative cover"], "u": "1f4d4" }, { "n": ["closed book"], "u": "1f4d5" }, { "n": ["book", "open book"], "u": "1f4d6" }, { "n": ["green book"], "u": "1f4d7" }, { "n": ["blue book"], "u": "1f4d8" }, { "n": ["orange book"], "u": "1f4d9" }, { "n": ["books"], "u": "1f4da" }, { "n": ["notebook"], "u": "1f4d3" }, { "n": ["ledger"], "u": "1f4d2" }, { "n": ["page with curl"], "u": "1f4c3" }, { "n": ["scroll"], "u": "1f4dc" }, { "n": ["page facing up"], "u": "1f4c4" }, { "n": ["newspaper"], "u": "1f4f0" }, { "n": ["rolled-up newspaper", "rolled up newspaper"], "u": "1f5de-fe0f" }, { "n": ["bookmark tabs"], "u": "1f4d1" }, { "n": ["bookmark"], "u": "1f516" }, { "n": ["label"], "u": "1f3f7-fe0f" }, { "n": ["moneybag", "money bag"], "u": "1f4b0" }, { "n": ["coin"], "u": "1fa99" }, { "n": ["yen", "banknote with yen sign"], "u": "1f4b4" }, { "n": ["dollar", "banknote with dollar sign"], "u": "1f4b5" }, { "n": ["euro", "banknote with euro sign"], "u": "1f4b6" }, { "n": ["pound", "banknote with pound sign"], "u": "1f4b7" }, { "n": ["money with wings"], "u": "1f4b8" }, { "n": ["credit card"], "u": "1f4b3" }, { "n": ["receipt"], "u": "1f9fe" }, { "n": ["chart", "chart with upwards trend and yen sign"], "u": "1f4b9" }, { "n": ["email", "envelope"], "u": "2709-fe0f" }, { "n": ["e-mail", "e-mail symbol"], "u": "1f4e7" }, { "n": ["incoming envelope"], "u": "1f4e8" }, { "n": ["envelope with arrow", "envelope with downwards arrow above"], "u": "1f4e9" }, { "n": ["outbox tray"], "u": "1f4e4" }, { "n": ["inbox tray"], "u": "1f4e5" }, { "n": ["package"], "u": "1f4e6" }, { "n": ["mailbox", "closed mailbox with raised flag"], "u": "1f4eb" }, { "n": ["mailbox closed", "closed mailbox with lowered flag"], "u": "1f4ea" }, { "n": ["mailbox with mail", "open mailbox with raised flag"], "u": "1f4ec" }, { "n": ["mailbox with no mail", "open mailbox with lowered flag"], "u": "1f4ed" }, { "n": ["postbox"], "u": "1f4ee" }, { "n": ["ballot box with ballot"], "u": "1f5f3-fe0f" }, { "n": ["pencil", "pencil2"], "u": "270f-fe0f" }, { "n": ["black nib"], "u": "2712-fe0f" }, { "n": ["fountain pen", "lower left fountain pen"], "u": "1f58b-fe0f" }, { "n": ["pen", "lower left ballpoint pen"], "u": "1f58a-fe0f" }, { "n": ["paintbrush", "lower left paintbrush"], "u": "1f58c-fe0f" }, { "n": ["crayon", "lower left crayon"], "u": "1f58d-fe0f" }, { "n": ["memo", "pencil"], "u": "1f4dd" }, { "n": ["briefcase"], "u": "1f4bc" }, { "n": ["file folder"], "u": "1f4c1" }, { "n": ["open file folder"], "u": "1f4c2" }, { "n": ["card index dividers"], "u": "1f5c2-fe0f" }, { "n": ["date", "calendar"], "u": "1f4c5" }, { "n": ["calendar", "tear-off calendar"], "u": "1f4c6" }, { "n": ["spiral notepad", "spiral note pad"], "u": "1f5d2-fe0f" }, { "n": ["spiral calendar", "spiral calendar pad"], "u": "1f5d3-fe0f" }, { "n": ["card index"], "u": "1f4c7" }, { "n": ["chart with upwards trend"], "u": "1f4c8" }, { "n": ["chart with downwards trend"], "u": "1f4c9" }, { "n": ["bar chart"], "u": "1f4ca" }, { "n": ["clipboard"], "u": "1f4cb" }, { "n": ["pushpin"], "u": "1f4cc" }, { "n": ["round pushpin"], "u": "1f4cd" }, { "n": ["paperclip"], "u": "1f4ce" }, { "n": ["linked paperclips"], "u": "1f587-fe0f" }, { "n": ["straight ruler"], "u": "1f4cf" }, { "n": ["triangular ruler"], "u": "1f4d0" }, { "n": ["scissors", "black scissors"], "u": "2702-fe0f" }, { "n": ["card file box"], "u": "1f5c3-fe0f" }, { "n": ["file cabinet"], "u": "1f5c4-fe0f" }, { "n": ["wastebasket"], "u": "1f5d1-fe0f" }, { "n": ["lock"], "u": "1f512" }, { "n": ["unlock", "open lock"], "u": "1f513" }, { "n": ["lock with ink pen"], "u": "1f50f" }, { "n": ["closed lock with key"], "u": "1f510" }, { "n": ["key"], "u": "1f511" }, { "n": ["old key"], "u": "1f5dd-fe0f" }, { "n": ["hammer"], "u": "1f528" }, { "n": ["axe"], "u": "1fa93" }, { "n": ["pick"], "u": "26cf-fe0f" }, { "n": ["hammer and pick"], "u": "2692-fe0f" }, { "n": ["hammer and wrench"], "u": "1f6e0-fe0f" }, { "n": ["dagger", "dagger knife"], "u": "1f5e1-fe0f" }, { "n": ["crossed swords"], "u": "2694-fe0f" }, { "n": ["gun", "pistol"], "u": "1f52b" }, { "n": ["boomerang"], "u": "1fa83" }, { "n": ["bow and arrow"], "u": "1f3f9" }, { "n": ["shield"], "u": "1f6e1-fe0f" }, { "n": ["carpentry saw"], "u": "1fa9a" }, { "n": ["wrench"], "u": "1f527" }, { "n": ["screwdriver"], "u": "1fa9b" }, { "n": ["nut and bolt"], "u": "1f529" }, { "n": ["gear"], "u": "2699-fe0f" }, { "n": ["clamp", "compression"], "u": "1f5dc-fe0f" }, { "n": ["scales", "balance scale"], "u": "2696-fe0f" }, { "n": ["probing cane"], "u": "1f9af" }, { "n": ["link", "link symbol"], "u": "1f517" }, { "n": ["chains"], "u": "26d3-fe0f" }, { "n": ["hook"], "u": "1fa9d" }, { "n": ["toolbox"], "u": "1f9f0" }, { "n": ["magnet"], "u": "1f9f2" }, { "n": ["ladder"], "u": "1fa9c" }, { "n": ["alembic"], "u": "2697-fe0f" }, { "n": ["test tube"], "u": "1f9ea" }, { "n": ["petri dish"], "u": "1f9eb" }, { "n": ["dna", "dna double helix"], "u": "1f9ec" }, { "n": ["microscope"], "u": "1f52c" }, { "n": ["telescope"], "u": "1f52d" }, { "n": ["satellite antenna"], "u": "1f4e1" }, { "n": ["syringe"], "u": "1f489" }, { "n": ["drop of blood"], "u": "1fa78" }, { "n": ["pill"], "u": "1f48a" }, { "n": ["adhesive bandage"], "u": "1fa79" }, { "n": ["crutch"], "u": "1fa7c" }, { "n": ["stethoscope"], "u": "1fa7a" }, { "n": ["x-ray"], "u": "1fa7b" }, { "n": ["door"], "u": "1f6aa" }, { "n": ["elevator"], "u": "1f6d7" }, { "n": ["mirror"], "u": "1fa9e" }, { "n": ["window"], "u": "1fa9f" }, { "n": ["bed"], "u": "1f6cf-fe0f" }, { "n": ["couch and lamp"], "u": "1f6cb-fe0f" }, { "n": ["chair"], "u": "1fa91" }, { "n": ["toilet"], "u": "1f6bd" }, { "n": ["plunger"], "u": "1faa0" }, { "n": ["shower"], "u": "1f6bf" }, { "n": ["bathtub"], "u": "1f6c1" }, { "n": ["mouse trap"], "u": "1faa4" }, { "n": ["razor"], "u": "1fa92" }, { "n": ["lotion bottle"], "u": "1f9f4" }, { "n": ["safety pin"], "u": "1f9f7" }, { "n": ["broom"], "u": "1f9f9" }, { "n": ["basket"], "u": "1f9fa" }, { "n": ["roll of paper"], "u": "1f9fb" }, { "n": ["bucket"], "u": "1faa3" }, { "n": ["soap", "bar of soap"], "u": "1f9fc" }, { "n": ["bubbles"], "u": "1fae7" }, { "n": ["toothbrush"], "u": "1faa5" }, { "n": ["sponge"], "u": "1f9fd" }, { "n": ["fire extinguisher"], "u": "1f9ef" }, { "n": ["shopping trolley"], "u": "1f6d2" }, { "n": ["smoking", "smoking symbol"], "u": "1f6ac" }, { "n": ["coffin"], "u": "26b0-fe0f" }, { "n": ["headstone"], "u": "1faa6" }, { "n": ["funeral urn"], "u": "26b1-fe0f" }, { "n": ["moyai"], "u": "1f5ff" }, { "n": ["placard"], "u": "1faa7" }, { "n": ["identification card"], "u": "1faaa" }], "symbols": [{ "n": ["atm", "automated teller machine"], "u": "1f3e7" }, { "n": ["put litter in its place", "put litter in its place symbol"], "u": "1f6ae" }, { "n": ["potable water", "potable water symbol"], "u": "1f6b0" }, { "n": ["wheelchair", "wheelchair symbol"], "u": "267f" }, { "n": ["mens", "mens symbol"], "u": "1f6b9" }, { "n": ["womens", "womens symbol"], "u": "1f6ba" }, { "n": ["restroom"], "u": "1f6bb" }, { "n": ["baby symbol"], "u": "1f6bc" }, { "n": ["wc", "water closet"], "u": "1f6be" }, { "n": ["passport control"], "u": "1f6c2" }, { "n": ["customs"], "u": "1f6c3" }, { "n": ["baggage claim"], "u": "1f6c4" }, { "n": ["left luggage"], "u": "1f6c5" }, { "n": ["warning", "warning sign"], "u": "26a0-fe0f" }, { "n": ["children crossing"], "u": "1f6b8" }, { "n": ["no entry"], "u": "26d4" }, { "n": ["no entry sign"], "u": "1f6ab" }, { "n": ["no bicycles"], "u": "1f6b3" }, { "n": ["no smoking", "no smoking symbol"], "u": "1f6ad" }, { "n": ["do not litter", "do not litter symbol"], "u": "1f6af" }, { "n": ["non-potable water", "non-potable water symbol"], "u": "1f6b1" }, { "n": ["no pedestrians"], "u": "1f6b7" }, { "n": ["no mobile phones"], "u": "1f4f5" }, { "n": ["underage", "no one under eighteen symbol"], "u": "1f51e" }, { "n": ["radioactive", "radioactive sign"], "u": "2622-fe0f" }, { "n": ["biohazard", "biohazard sign"], "u": "2623-fe0f" }, { "n": ["arrow up", "upwards black arrow"], "u": "2b06-fe0f" }, { "n": ["north east arrow", "arrow upper right"], "u": "2197-fe0f" }, { "n": ["arrow right", "black rightwards arrow"], "u": "27a1-fe0f" }, { "n": ["south east arrow", "arrow lower right"], "u": "2198-fe0f" }, { "n": ["arrow down", "downwards black arrow"], "u": "2b07-fe0f" }, { "n": ["south west arrow", "arrow lower left"], "u": "2199-fe0f" }, { "n": ["arrow left", "leftwards black arrow"], "u": "2b05-fe0f" }, { "n": ["north west arrow", "arrow upper left"], "u": "2196-fe0f" }, { "n": ["up down arrow", "arrow up down"], "u": "2195-fe0f" }, { "n": ["left right arrow"], "u": "2194-fe0f" }, { "n": ["leftwards arrow with hook"], "u": "21a9-fe0f" }, { "n": ["arrow right hook", "rightwards arrow with hook"], "u": "21aa-fe0f" }, { "n": ["arrow heading up", "arrow pointing rightwards then curving upwards"], "u": "2934-fe0f" }, { "n": ["arrow heading down", "arrow pointing rightwards then curving downwards"], "u": "2935-fe0f" }, { "n": ["arrows clockwise", "clockwise downwards and upwards open circle arrows"], "u": "1f503" }, { "n": ["arrows counterclockwise", "anticlockwise downwards and upwards open circle arrows"], "u": "1f504" }, { "n": ["back", "back with leftwards arrow above"], "u": "1f519" }, { "n": ["end", "end with leftwards arrow above"], "u": "1f51a" }, { "n": ["on", "on with exclamation mark with left right arrow above"], "u": "1f51b" }, { "n": ["soon", "soon with rightwards arrow above"], "u": "1f51c" }, { "n": ["top", "top with upwards arrow above"], "u": "1f51d" }, { "n": ["place of worship"], "u": "1f6d0" }, { "n": ["atom symbol"], "u": "269b-fe0f" }, { "n": ["om", "om symbol"], "u": "1f549-fe0f" }, { "n": ["star of david"], "u": "2721-fe0f" }, { "n": ["wheel of dharma"], "u": "2638-fe0f" }, { "n": ["yin yang"], "u": "262f-fe0f" }, { "n": ["latin cross"], "u": "271d-fe0f" }, { "n": ["orthodox cross"], "u": "2626-fe0f" }, { "n": ["star and crescent"], "u": "262a-fe0f" }, { "n": ["peace symbol"], "u": "262e-fe0f" }, { "n": ["menorah with nine branches"], "u": "1f54e" }, { "n": ["six pointed star", "six pointed star with middle dot"], "u": "1f52f" }, { "n": ["aries"], "u": "2648" }, { "n": ["taurus"], "u": "2649" }, { "n": ["gemini"], "u": "264a" }, { "n": ["cancer"], "u": "264b" }, { "n": ["leo"], "u": "264c" }, { "n": ["virgo"], "u": "264d" }, { "n": ["libra"], "u": "264e" }, { "n": ["scorpius"], "u": "264f" }, { "n": ["sagittarius"], "u": "2650" }, { "n": ["capricorn"], "u": "2651" }, { "n": ["aquarius"], "u": "2652" }, { "n": ["pisces"], "u": "2653" }, { "n": ["ophiuchus"], "u": "26ce" }, { "n": ["twisted rightwards arrows"], "u": "1f500" }, { "n": ["repeat", "clockwise rightwards and leftwards open circle arrows"], "u": "1f501" }, { "n": ["repeat one", "clockwise rightwards and leftwards open circle arrows with circled one overlay"], "u": "1f502" }, { "n": ["arrow forward", "black right-pointing triangle"], "u": "25b6-fe0f" }, { "n": ["fast forward", "black right-pointing double triangle"], "u": "23e9" }, { "n": ["next track button", "black right pointing double triangle with vertical bar"], "u": "23ed-fe0f" }, { "n": ["play or pause button", "black right pointing triangle with double vertical bar"], "u": "23ef-fe0f" }, { "n": ["arrow backward", "black left-pointing triangle"], "u": "25c0-fe0f" }, { "n": ["rewind", "black left-pointing double triangle"], "u": "23ea" }, { "n": ["last track button", "black left pointing double triangle with vertical bar"], "u": "23ee-fe0f" }, { "n": ["arrow up small", "up-pointing small red triangle"], "u": "1f53c" }, { "n": ["arrow double up", "black up-pointing double triangle"], "u": "23eb" }, { "n": ["arrow down small", "down-pointing small red triangle"], "u": "1f53d" }, { "n": ["arrow double down", "black down-pointing double triangle"], "u": "23ec" }, { "n": ["pause button", "double vertical bar"], "u": "23f8-fe0f" }, { "n": ["stop button", "black square for stop"], "u": "23f9-fe0f" }, { "n": ["record button", "black circle for record"], "u": "23fa-fe0f" }, { "n": ["eject", "eject button"], "u": "23cf-fe0f" }, { "n": ["cinema"], "u": "1f3a6" }, { "n": ["low brightness", "low brightness symbol"], "u": "1f505" }, { "n": ["high brightness", "high brightness symbol"], "u": "1f506" }, { "n": ["signal strength", "antenna with bars"], "u": "1f4f6" }, { "n": ["vibration mode"], "u": "1f4f3" }, { "n": ["mobile phone off"], "u": "1f4f4" }, { "n": ["female sign"], "u": "2640-fe0f" }, { "n": ["male sign"], "u": "2642-fe0f" }, { "n": ["transgender symbol"], "u": "26a7-fe0f" }, { "n": ["heavy multiplication x"], "u": "2716-fe0f" }, { "n": ["heavy plus sign"], "u": "2795" }, { "n": ["heavy minus sign"], "u": "2796" }, { "n": ["heavy division sign"], "u": "2797" }, { "n": ["heavy equals sign"], "u": "1f7f0" }, { "n": ["infinity"], "u": "267e-fe0f" }, { "n": ["bangbang", "double exclamation mark"], "u": "203c-fe0f" }, { "n": ["interrobang", "exclamation question mark"], "u": "2049-fe0f" }, { "n": ["question", "black question mark ornament"], "u": "2753" }, { "n": ["grey question", "white question mark ornament"], "u": "2754" }, { "n": ["grey exclamation", "white exclamation mark ornament"], "u": "2755" }, { "n": ["exclamation", "heavy exclamation mark", "heavy exclamation mark symbol"], "u": "2757" }, { "n": ["wavy dash"], "u": "3030-fe0f" }, { "n": ["currency exchange"], "u": "1f4b1" }, { "n": ["heavy dollar sign"], "u": "1f4b2" }, { "n": ["medical symbol", "staff of aesculapius"], "u": "2695-fe0f" }, { "n": ["recycle", "black universal recycling symbol"], "u": "267b-fe0f" }, { "n": ["fleur-de-lis", "fleur de lis"], "u": "269c-fe0f" }, { "n": ["trident", "trident emblem"], "u": "1f531" }, { "n": ["name badge"], "u": "1f4db" }, { "n": ["beginner", "japanese symbol for beginner"], "u": "1f530" }, { "n": ["o", "heavy large circle"], "u": "2b55" }, { "n": ["white check mark", "white heavy check mark"], "u": "2705" }, { "n": ["ballot box with check"], "u": "2611-fe0f" }, { "n": ["heavy check mark"], "u": "2714-fe0f" }, { "n": ["x", "cross mark"], "u": "274c" }, { "n": ["negative squared cross mark"], "u": "274e" }, { "n": ["curly loop"], "u": "27b0" }, { "n": ["loop", "double curly loop"], "u": "27bf" }, { "n": ["part alternation mark"], "u": "303d-fe0f" }, { "n": ["eight spoked asterisk"], "u": "2733-fe0f" }, { "n": ["eight pointed black star"], "u": "2734-fe0f" }, { "n": ["sparkle"], "u": "2747-fe0f" }, { "n": ["copyright", "copyright sign"], "u": "00a9-fe0f" }, { "n": ["registered", "registered sign"], "u": "00ae-fe0f" }, { "n": ["tm", "trade mark sign"], "u": "2122-fe0f" }, { "n": ["hash", "hash key"], "u": "0023-fe0f-20e3" }, { "n": ["keycap: *", "keycap star"], "u": "002a-fe0f-20e3" }, { "n": ["zero", "keycap 0"], "u": "0030-fe0f-20e3" }, { "n": ["one", "keycap 1"], "u": "0031-fe0f-20e3" }, { "n": ["two", "keycap 2"], "u": "0032-fe0f-20e3" }, { "n": ["three", "keycap 3"], "u": "0033-fe0f-20e3" }, { "n": ["four", "keycap 4"], "u": "0034-fe0f-20e3" }, { "n": ["five", "keycap 5"], "u": "0035-fe0f-20e3" }, { "n": ["six", "keycap 6"], "u": "0036-fe0f-20e3" }, { "n": ["seven", "keycap 7"], "u": "0037-fe0f-20e3" }, { "n": ["eight", "keycap 8"], "u": "0038-fe0f-20e3" }, { "n": ["nine", "keycap 9"], "u": "0039-fe0f-20e3" }, { "n": ["keycap ten"], "u": "1f51f" }, { "n": ["capital abcd", "input symbol for latin capital letters"], "u": "1f520" }, { "n": ["abcd", "input symbol for latin small letters"], "u": "1f521" }, { "n": ["1234", "input symbol for numbers"], "u": "1f522" }, { "n": ["symbols", "input symbol for symbols"], "u": "1f523" }, { "n": ["abc", "input symbol for latin letters"], "u": "1f524" }, { "n": ["a", "negative squared latin capital letter a"], "u": "1f170-fe0f" }, { "n": ["ab", "negative squared ab"], "u": "1f18e" }, { "n": ["b", "negative squared latin capital letter b"], "u": "1f171-fe0f" }, { "n": ["cl", "squared cl"], "u": "1f191" }, { "n": ["cool", "squared cool"], "u": "1f192" }, { "n": ["free", "squared free"], "u": "1f193" }, { "n": ["information source"], "u": "2139-fe0f" }, { "n": ["id", "squared id"], "u": "1f194" }, { "n": ["m", "circled latin capital letter m"], "u": "24c2-fe0f" }, { "n": ["new", "squared new"], "u": "1f195" }, { "n": ["ng", "squared ng"], "u": "1f196" }, { "n": ["o2", "negative squared latin capital letter o"], "u": "1f17e-fe0f" }, { "n": ["ok", "squared ok"], "u": "1f197" }, { "n": ["parking", "negative squared latin capital letter p"], "u": "1f17f-fe0f" }, { "n": ["sos", "squared sos"], "u": "1f198" }, { "n": ["up", "squared up with exclamation mark"], "u": "1f199" }, { "n": ["vs", "squared vs"], "u": "1f19a" }, { "n": ["koko", "squared katakana koko"], "u": "1f201" }, { "n": ["sa", "squared katakana sa"], "u": "1f202-fe0f" }, { "n": ["u6708", "squared cjk unified ideograph-6708"], "u": "1f237-fe0f" }, { "n": ["u6709", "squared cjk unified ideograph-6709"], "u": "1f236" }, { "n": ["u6307", "squared cjk unified ideograph-6307"], "u": "1f22f" }, { "n": ["ideograph advantage", "circled ideograph advantage"], "u": "1f250" }, { "n": ["u5272", "squared cjk unified ideograph-5272"], "u": "1f239" }, { "n": ["u7121", "squared cjk unified ideograph-7121"], "u": "1f21a" }, { "n": ["u7981", "squared cjk unified ideograph-7981"], "u": "1f232" }, { "n": ["accept", "circled ideograph accept"], "u": "1f251" }, { "n": ["u7533", "squared cjk unified ideograph-7533"], "u": "1f238" }, { "n": ["u5408", "squared cjk unified ideograph-5408"], "u": "1f234" }, { "n": ["u7a7a", "squared cjk unified ideograph-7a7a"], "u": "1f233" }, { "n": ["congratulations", "circled ideograph congratulation"], "u": "3297-fe0f" }, { "n": ["secret", "circled ideograph secret"], "u": "3299-fe0f" }, { "n": ["u55b6", "squared cjk unified ideograph-55b6"], "u": "1f23a" }, { "n": ["u6e80", "squared cjk unified ideograph-6e80"], "u": "1f235" }, { "n": ["red circle", "large red circle"], "u": "1f534" }, { "n": ["large orange circle"], "u": "1f7e0" }, { "n": ["large yellow circle"], "u": "1f7e1" }, { "n": ["large green circle"], "u": "1f7e2" }, { "n": ["large blue circle"], "u": "1f535" }, { "n": ["large purple circle"], "u": "1f7e3" }, { "n": ["large brown circle"], "u": "1f7e4" }, { "n": ["black circle", "medium black circle"], "u": "26ab" }, { "n": ["white circle", "medium white circle"], "u": "26aa" }, { "n": ["large red square"], "u": "1f7e5" }, { "n": ["large orange square"], "u": "1f7e7" }, { "n": ["large yellow square"], "u": "1f7e8" }, { "n": ["large green square"], "u": "1f7e9" }, { "n": ["large blue square"], "u": "1f7e6" }, { "n": ["large purple square"], "u": "1f7ea" }, { "n": ["large brown square"], "u": "1f7eb" }, { "n": ["black large square"], "u": "2b1b" }, { "n": ["white large square"], "u": "2b1c" }, { "n": ["black medium square"], "u": "25fc-fe0f" }, { "n": ["white medium square"], "u": "25fb-fe0f" }, { "n": ["black medium small square"], "u": "25fe" }, { "n": ["white medium small square"], "u": "25fd" }, { "n": ["black small square"], "u": "25aa-fe0f" }, { "n": ["white small square"], "u": "25ab-fe0f" }, { "n": ["large orange diamond"], "u": "1f536" }, { "n": ["large blue diamond"], "u": "1f537" }, { "n": ["small orange diamond"], "u": "1f538" }, { "n": ["small blue diamond"], "u": "1f539" }, { "n": ["small red triangle", "up-pointing red triangle"], "u": "1f53a" }, { "n": ["small red triangle down", "down-pointing red triangle"], "u": "1f53b" }, { "n": ["diamond shape with a dot inside"], "u": "1f4a0" }, { "n": ["radio button"], "u": "1f518" }, { "n": ["white square button"], "u": "1f533" }, { "n": ["black square button"], "u": "1f532" }], "flags": [{ "n": ["chequered flag", "checkered flag"], "u": "1f3c1" }, { "n": ["triangular flag on post"], "u": "1f6a9" }, { "n": ["crossed flags"], "u": "1f38c" }, { "n": ["waving black flag"], "u": "1f3f4" }, { "n": ["white flag", "waving white flag"], "u": "1f3f3-fe0f" }, { "n": ["rainbow flag", "rainbow-flag"], "u": "1f3f3-fe0f-200d-1f308" }, { "n": ["transgender flag"], "u": "1f3f3-fe0f-200d-26a7-fe0f" }, { "n": ["pirate flag"], "u": "1f3f4-200d-2620-fe0f" }, { "n": ["flag-ac", "ascension island flag"], "u": "1f1e6-1f1e8" }, { "n": ["flag-ad", "andorra flag"], "u": "1f1e6-1f1e9" }, { "n": ["flag-ae", "united arab emirates flag"], "u": "1f1e6-1f1ea" }, { "n": ["flag-af", "afghanistan flag"], "u": "1f1e6-1f1eb" }, { "n": ["flag-ag", "antigua & barbuda flag"], "u": "1f1e6-1f1ec" }, { "n": ["flag-ai", "anguilla flag"], "u": "1f1e6-1f1ee" }, { "n": ["flag-al", "albania flag"], "u": "1f1e6-1f1f1" }, { "n": ["flag-am", "armenia flag"], "u": "1f1e6-1f1f2" }, { "n": ["flag-ao", "angola flag"], "u": "1f1e6-1f1f4" }, { "n": ["flag-aq", "antarctica flag"], "u": "1f1e6-1f1f6" }, { "n": ["flag-ar", "argentina flag"], "u": "1f1e6-1f1f7" }, { "n": ["flag-as", "american samoa flag"], "u": "1f1e6-1f1f8" }, { "n": ["flag-at", "austria flag"], "u": "1f1e6-1f1f9" }, { "n": ["flag-au", "australia flag"], "u": "1f1e6-1f1fa" }, { "n": ["flag-aw", "aruba flag"], "u": "1f1e6-1f1fc" }, { "n": ["flag-ax", "\xE5land islands flag"], "u": "1f1e6-1f1fd" }, { "n": ["flag-az", "azerbaijan flag"], "u": "1f1e6-1f1ff" }, { "n": ["flag-ba", "bosnia & herzegovina flag"], "u": "1f1e7-1f1e6" }, { "n": ["flag-bb", "barbados flag"], "u": "1f1e7-1f1e7" }, { "n": ["flag-bd", "bangladesh flag"], "u": "1f1e7-1f1e9" }, { "n": ["flag-be", "belgium flag"], "u": "1f1e7-1f1ea" }, { "n": ["flag-bf", "burkina faso flag"], "u": "1f1e7-1f1eb" }, { "n": ["flag-bg", "bulgaria flag"], "u": "1f1e7-1f1ec" }, { "n": ["flag-bh", "bahrain flag"], "u": "1f1e7-1f1ed" }, { "n": ["flag-bi", "burundi flag"], "u": "1f1e7-1f1ee" }, { "n": ["flag-bj", "benin flag"], "u": "1f1e7-1f1ef" }, { "n": ["flag-bl", "st. barth\xE9lemy flag"], "u": "1f1e7-1f1f1" }, { "n": ["flag-bm", "bermuda flag"], "u": "1f1e7-1f1f2" }, { "n": ["flag-bn", "brunei flag"], "u": "1f1e7-1f1f3" }, { "n": ["flag-bo", "bolivia flag"], "u": "1f1e7-1f1f4" }, { "n": ["flag-bq", "caribbean netherlands flag"], "u": "1f1e7-1f1f6" }, { "n": ["flag-br", "brazil flag"], "u": "1f1e7-1f1f7" }, { "n": ["flag-bs", "bahamas flag"], "u": "1f1e7-1f1f8" }, { "n": ["flag-bt", "bhutan flag"], "u": "1f1e7-1f1f9" }, { "n": ["flag-bv", "bouvet island flag"], "u": "1f1e7-1f1fb" }, { "n": ["flag-bw", "botswana flag"], "u": "1f1e7-1f1fc" }, { "n": ["flag-by", "belarus flag"], "u": "1f1e7-1f1fe" }, { "n": ["flag-bz", "belize flag"], "u": "1f1e7-1f1ff" }, { "n": ["flag-ca", "canada flag"], "u": "1f1e8-1f1e6" }, { "n": ["flag-cc", "cocos (keeling) islands flag"], "u": "1f1e8-1f1e8" }, { "n": ["flag-cd", "congo - kinshasa flag"], "u": "1f1e8-1f1e9" }, { "n": ["flag-cf", "central african republic flag"], "u": "1f1e8-1f1eb" }, { "n": ["flag-cg", "congo - brazzaville flag"], "u": "1f1e8-1f1ec" }, { "n": ["flag-ch", "switzerland flag"], "u": "1f1e8-1f1ed" }, { "n": ["flag-ci", "c\xF4te d\u2019ivoire flag"], "u": "1f1e8-1f1ee" }, { "n": ["flag-ck", "cook islands flag"], "u": "1f1e8-1f1f0" }, { "n": ["flag-cl", "chile flag"], "u": "1f1e8-1f1f1" }, { "n": ["flag-cm", "cameroon flag"], "u": "1f1e8-1f1f2" }, { "n": ["cn", "flag-cn", "china flag"], "u": "1f1e8-1f1f3" }, { "n": ["flag-co", "colombia flag"], "u": "1f1e8-1f1f4" }, { "n": ["flag-cp", "clipperton island flag"], "u": "1f1e8-1f1f5" }, { "n": ["flag-cr", "costa rica flag"], "u": "1f1e8-1f1f7" }, { "n": ["flag-cu", "cuba flag"], "u": "1f1e8-1f1fa" }, { "n": ["flag-cv", "cape verde flag"], "u": "1f1e8-1f1fb" }, { "n": ["flag-cw", "cura\xE7ao flag"], "u": "1f1e8-1f1fc" }, { "n": ["flag-cx", "christmas island flag"], "u": "1f1e8-1f1fd" }, { "n": ["flag-cy", "cyprus flag"], "u": "1f1e8-1f1fe" }, { "n": ["flag-cz", "czechia flag"], "u": "1f1e8-1f1ff" }, { "n": ["de", "flag-de", "germany flag"], "u": "1f1e9-1f1ea" }, { "n": ["flag-dg", "diego garcia flag"], "u": "1f1e9-1f1ec" }, { "n": ["flag-dj", "djibouti flag"], "u": "1f1e9-1f1ef" }, { "n": ["flag-dk", "denmark flag"], "u": "1f1e9-1f1f0" }, { "n": ["flag-dm", "dominica flag"], "u": "1f1e9-1f1f2" }, { "n": ["flag-do", "dominican republic flag"], "u": "1f1e9-1f1f4" }, { "n": ["flag-dz", "algeria flag"], "u": "1f1e9-1f1ff" }, { "n": ["flag-ea", "ceuta & melilla flag"], "u": "1f1ea-1f1e6" }, { "n": ["flag-ec", "ecuador flag"], "u": "1f1ea-1f1e8" }, { "n": ["flag-ee", "estonia flag"], "u": "1f1ea-1f1ea" }, { "n": ["flag-eg", "egypt flag"], "u": "1f1ea-1f1ec" }, { "n": ["flag-eh", "western sahara flag"], "u": "1f1ea-1f1ed" }, { "n": ["flag-er", "eritrea flag"], "u": "1f1ea-1f1f7" }, { "n": ["es", "flag-es", "spain flag"], "u": "1f1ea-1f1f8" }, { "n": ["flag-et", "ethiopia flag"], "u": "1f1ea-1f1f9" }, { "n": ["flag-eu", "european union flag"], "u": "1f1ea-1f1fa" }, { "n": ["flag-fi", "finland flag"], "u": "1f1eb-1f1ee" }, { "n": ["flag-fj", "fiji flag"], "u": "1f1eb-1f1ef" }, { "n": ["flag-fk", "falkland islands flag"], "u": "1f1eb-1f1f0" }, { "n": ["flag-fm", "micronesia flag"], "u": "1f1eb-1f1f2" }, { "n": ["flag-fo", "faroe islands flag"], "u": "1f1eb-1f1f4" }, { "n": ["fr", "flag-fr", "france flag"], "u": "1f1eb-1f1f7" }, { "n": ["flag-ga", "gabon flag"], "u": "1f1ec-1f1e6" }, { "n": ["gb", "uk", "flag-gb", "united kingdom flag"], "u": "1f1ec-1f1e7" }, { "n": ["flag-gd", "grenada flag"], "u": "1f1ec-1f1e9" }, { "n": ["flag-ge", "georgia flag"], "u": "1f1ec-1f1ea" }, { "n": ["flag-gf", "french guiana flag"], "u": "1f1ec-1f1eb" }, { "n": ["flag-gg", "guernsey flag"], "u": "1f1ec-1f1ec" }, { "n": ["flag-gh", "ghana flag"], "u": "1f1ec-1f1ed" }, { "n": ["flag-gi", "gibraltar flag"], "u": "1f1ec-1f1ee" }, { "n": ["flag-gl", "greenland flag"], "u": "1f1ec-1f1f1" }, { "n": ["flag-gm", "gambia flag"], "u": "1f1ec-1f1f2" }, { "n": ["flag-gn", "guinea flag"], "u": "1f1ec-1f1f3" }, { "n": ["flag-gp", "guadeloupe flag"], "u": "1f1ec-1f1f5" }, { "n": ["flag-gq", "equatorial guinea flag"], "u": "1f1ec-1f1f6" }, { "n": ["flag-gr", "greece flag"], "u": "1f1ec-1f1f7" }, { "n": ["flag-gs", "south georgia & south sandwich islands flag"], "u": "1f1ec-1f1f8" }, { "n": ["flag-gt", "guatemala flag"], "u": "1f1ec-1f1f9" }, { "n": ["flag-gu", "guam flag"], "u": "1f1ec-1f1fa" }, { "n": ["flag-gw", "guinea-bissau flag"], "u": "1f1ec-1f1fc" }, { "n": ["flag-gy", "guyana flag"], "u": "1f1ec-1f1fe" }, { "n": ["flag-hk", "hong kong sar china flag"], "u": "1f1ed-1f1f0" }, { "n": ["flag-hm", "heard & mcdonald islands flag"], "u": "1f1ed-1f1f2" }, { "n": ["flag-hn", "honduras flag"], "u": "1f1ed-1f1f3" }, { "n": ["flag-hr", "croatia flag"], "u": "1f1ed-1f1f7" }, { "n": ["flag-ht", "haiti flag"], "u": "1f1ed-1f1f9" }, { "n": ["flag-hu", "hungary flag"], "u": "1f1ed-1f1fa" }, { "n": ["flag-ic", "canary islands flag"], "u": "1f1ee-1f1e8" }, { "n": ["flag-id", "indonesia flag"], "u": "1f1ee-1f1e9" }, { "n": ["flag-ie", "ireland flag"], "u": "1f1ee-1f1ea" }, { "n": ["flag-il", "israel flag"], "u": "1f1ee-1f1f1" }, { "n": ["flag-im", "isle of man flag"], "u": "1f1ee-1f1f2" }, { "n": ["flag-in", "india flag"], "u": "1f1ee-1f1f3" }, { "n": ["flag-io", "british indian ocean territory flag"], "u": "1f1ee-1f1f4" }, { "n": ["flag-iq", "iraq flag"], "u": "1f1ee-1f1f6" }, { "n": ["flag-ir", "iran flag"], "u": "1f1ee-1f1f7" }, { "n": ["flag-is", "iceland flag"], "u": "1f1ee-1f1f8" }, { "n": ["it", "flag-it", "italy flag"], "u": "1f1ee-1f1f9" }, { "n": ["flag-je", "jersey flag"], "u": "1f1ef-1f1ea" }, { "n": ["flag-jm", "jamaica flag"], "u": "1f1ef-1f1f2" }, { "n": ["flag-jo", "jordan flag"], "u": "1f1ef-1f1f4" }, { "n": ["jp", "flag-jp", "japan flag"], "u": "1f1ef-1f1f5" }, { "n": ["flag-ke", "kenya flag"], "u": "1f1f0-1f1ea" }, { "n": ["flag-kg", "kyrgyzstan flag"], "u": "1f1f0-1f1ec" }, { "n": ["flag-kh", "cambodia flag"], "u": "1f1f0-1f1ed" }, { "n": ["flag-ki", "kiribati flag"], "u": "1f1f0-1f1ee" }, { "n": ["flag-km", "comoros flag"], "u": "1f1f0-1f1f2" }, { "n": ["flag-kn", "st. kitts & nevis flag"], "u": "1f1f0-1f1f3" }, { "n": ["flag-kp", "north korea flag"], "u": "1f1f0-1f1f5" }, { "n": ["kr", "flag-kr", "south korea flag"], "u": "1f1f0-1f1f7" }, { "n": ["flag-kw", "kuwait flag"], "u": "1f1f0-1f1fc" }, { "n": ["flag-ky", "cayman islands flag"], "u": "1f1f0-1f1fe" }, { "n": ["flag-kz", "kazakhstan flag"], "u": "1f1f0-1f1ff" }, { "n": ["flag-la", "laos flag"], "u": "1f1f1-1f1e6" }, { "n": ["flag-lb", "lebanon flag"], "u": "1f1f1-1f1e7" }, { "n": ["flag-lc", "st. lucia flag"], "u": "1f1f1-1f1e8" }, { "n": ["flag-li", "liechtenstein flag"], "u": "1f1f1-1f1ee" }, { "n": ["flag-lk", "sri lanka flag"], "u": "1f1f1-1f1f0" }, { "n": ["flag-lr", "liberia flag"], "u": "1f1f1-1f1f7" }, { "n": ["flag-ls", "lesotho flag"], "u": "1f1f1-1f1f8" }, { "n": ["flag-lt", "lithuania flag"], "u": "1f1f1-1f1f9" }, { "n": ["flag-lu", "luxembourg flag"], "u": "1f1f1-1f1fa" }, { "n": ["flag-lv", "latvia flag"], "u": "1f1f1-1f1fb" }, { "n": ["flag-ly", "libya flag"], "u": "1f1f1-1f1fe" }, { "n": ["flag-ma", "morocco flag"], "u": "1f1f2-1f1e6" }, { "n": ["flag-mc", "monaco flag"], "u": "1f1f2-1f1e8" }, { "n": ["flag-md", "moldova flag"], "u": "1f1f2-1f1e9" }, { "n": ["flag-me", "montenegro flag"], "u": "1f1f2-1f1ea" }, { "n": ["flag-mf", "st. martin flag"], "u": "1f1f2-1f1eb" }, { "n": ["flag-mg", "madagascar flag"], "u": "1f1f2-1f1ec" }, { "n": ["flag-mh", "marshall islands flag"], "u": "1f1f2-1f1ed" }, { "n": ["flag-mk", "north macedonia flag"], "u": "1f1f2-1f1f0" }, { "n": ["flag-ml", "mali flag"], "u": "1f1f2-1f1f1" }, { "n": ["flag-mm", "myanmar (burma) flag"], "u": "1f1f2-1f1f2" }, { "n": ["flag-mn", "mongolia flag"], "u": "1f1f2-1f1f3" }, { "n": ["flag-mo", "macao sar china flag"], "u": "1f1f2-1f1f4" }, { "n": ["flag-mp", "northern mariana islands flag"], "u": "1f1f2-1f1f5" }, { "n": ["flag-mq", "martinique flag"], "u": "1f1f2-1f1f6" }, { "n": ["flag-mr", "mauritania flag"], "u": "1f1f2-1f1f7" }, { "n": ["flag-ms", "montserrat flag"], "u": "1f1f2-1f1f8" }, { "n": ["flag-mt", "malta flag"], "u": "1f1f2-1f1f9" }, { "n": ["flag-mu", "mauritius flag"], "u": "1f1f2-1f1fa" }, { "n": ["flag-mv", "maldives flag"], "u": "1f1f2-1f1fb" }, { "n": ["flag-mw", "malawi flag"], "u": "1f1f2-1f1fc" }, { "n": ["flag-mx", "mexico flag"], "u": "1f1f2-1f1fd" }, { "n": ["flag-my", "malaysia flag"], "u": "1f1f2-1f1fe" }, { "n": ["flag-mz", "mozambique flag"], "u": "1f1f2-1f1ff" }, { "n": ["flag-na", "namibia flag"], "u": "1f1f3-1f1e6" }, { "n": ["flag-nc", "new caledonia flag"], "u": "1f1f3-1f1e8" }, { "n": ["flag-ne", "niger flag"], "u": "1f1f3-1f1ea" }, { "n": ["flag-nf", "norfolk island flag"], "u": "1f1f3-1f1eb" }, { "n": ["flag-ng", "nigeria flag"], "u": "1f1f3-1f1ec" }, { "n": ["flag-ni", "nicaragua flag"], "u": "1f1f3-1f1ee" }, { "n": ["flag-nl", "netherlands flag"], "u": "1f1f3-1f1f1" }, { "n": ["flag-no", "norway flag"], "u": "1f1f3-1f1f4" }, { "n": ["flag-np", "nepal flag"], "u": "1f1f3-1f1f5" }, { "n": ["flag-nr", "nauru flag"], "u": "1f1f3-1f1f7" }, { "n": ["flag-nu", "niue flag"], "u": "1f1f3-1f1fa" }, { "n": ["flag-nz", "new zealand flag"], "u": "1f1f3-1f1ff" }, { "n": ["flag-om", "oman flag"], "u": "1f1f4-1f1f2" }, { "n": ["flag-pa", "panama flag"], "u": "1f1f5-1f1e6" }, { "n": ["flag-pe", "peru flag"], "u": "1f1f5-1f1ea" }, { "n": ["flag-pf", "french polynesia flag"], "u": "1f1f5-1f1eb" }, { "n": ["flag-pg", "papua new guinea flag"], "u": "1f1f5-1f1ec" }, { "n": ["flag-ph", "philippines flag"], "u": "1f1f5-1f1ed" }, { "n": ["flag-pk", "pakistan flag"], "u": "1f1f5-1f1f0" }, { "n": ["flag-pl", "poland flag"], "u": "1f1f5-1f1f1" }, { "n": ["flag-pm", "st. pierre & miquelon flag"], "u": "1f1f5-1f1f2" }, { "n": ["flag-pn", "pitcairn islands flag"], "u": "1f1f5-1f1f3" }, { "n": ["flag-pr", "puerto rico flag"], "u": "1f1f5-1f1f7" }, { "n": ["flag-ps", "palestinian territories flag"], "u": "1f1f5-1f1f8" }, { "n": ["flag-pt", "portugal flag"], "u": "1f1f5-1f1f9" }, { "n": ["flag-pw", "palau flag"], "u": "1f1f5-1f1fc" }, { "n": ["flag-py", "paraguay flag"], "u": "1f1f5-1f1fe" }, { "n": ["flag-qa", "qatar flag"], "u": "1f1f6-1f1e6" }, { "n": ["flag-re", "r\xE9union flag"], "u": "1f1f7-1f1ea" }, { "n": ["flag-ro", "romania flag"], "u": "1f1f7-1f1f4" }, { "n": ["flag-rs", "serbia flag"], "u": "1f1f7-1f1f8" }, { "n": ["ru", "flag-ru", "russia flag"], "u": "1f1f7-1f1fa" }, { "n": ["flag-rw", "rwanda flag"], "u": "1f1f7-1f1fc" }, { "n": ["flag-sa", "saudi arabia flag"], "u": "1f1f8-1f1e6" }, { "n": ["flag-sb", "solomon islands flag"], "u": "1f1f8-1f1e7" }, { "n": ["flag-sc", "seychelles flag"], "u": "1f1f8-1f1e8" }, { "n": ["flag-sd", "sudan flag"], "u": "1f1f8-1f1e9" }, { "n": ["flag-se", "sweden flag"], "u": "1f1f8-1f1ea" }, { "n": ["flag-sg", "singapore flag"], "u": "1f1f8-1f1ec" }, { "n": ["flag-sh", "st. helena flag"], "u": "1f1f8-1f1ed" }, { "n": ["flag-si", "slovenia flag"], "u": "1f1f8-1f1ee" }, { "n": ["flag-sj", "svalbard & jan mayen flag"], "u": "1f1f8-1f1ef" }, { "n": ["flag-sk", "slovakia flag"], "u": "1f1f8-1f1f0" }, { "n": ["flag-sl", "sierra leone flag"], "u": "1f1f8-1f1f1" }, { "n": ["flag-sm", "san marino flag"], "u": "1f1f8-1f1f2" }, { "n": ["flag-sn", "senegal flag"], "u": "1f1f8-1f1f3" }, { "n": ["flag-so", "somalia flag"], "u": "1f1f8-1f1f4" }, { "n": ["flag-sr", "suriname flag"], "u": "1f1f8-1f1f7" }, { "n": ["flag-ss", "south sudan flag"], "u": "1f1f8-1f1f8" }, { "n": ["flag-st", "s\xE3o tom\xE9 & pr\xEDncipe flag"], "u": "1f1f8-1f1f9" }, { "n": ["flag-sv", "el salvador flag"], "u": "1f1f8-1f1fb" }, { "n": ["flag-sx", "sint maarten flag"], "u": "1f1f8-1f1fd" }, { "n": ["flag-sy", "syria flag"], "u": "1f1f8-1f1fe" }, { "n": ["flag-sz", "eswatini flag"], "u": "1f1f8-1f1ff" }, { "n": ["flag-ta", "tristan da cunha flag"], "u": "1f1f9-1f1e6" }, { "n": ["flag-tc", "turks & caicos islands flag"], "u": "1f1f9-1f1e8" }, { "n": ["flag-td", "chad flag"], "u": "1f1f9-1f1e9" }, { "n": ["flag-tf", "french southern territories flag"], "u": "1f1f9-1f1eb" }, { "n": ["flag-tg", "togo flag"], "u": "1f1f9-1f1ec" }, { "n": ["flag-th", "thailand flag"], "u": "1f1f9-1f1ed" }, { "n": ["flag-tj", "tajikistan flag"], "u": "1f1f9-1f1ef" }, { "n": ["flag-tk", "tokelau flag"], "u": "1f1f9-1f1f0" }, { "n": ["flag-tl", "timor-leste flag"], "u": "1f1f9-1f1f1" }, { "n": ["flag-tm", "turkmenistan flag"], "u": "1f1f9-1f1f2" }, { "n": ["flag-tn", "tunisia flag"], "u": "1f1f9-1f1f3" }, { "n": ["flag-to", "tonga flag"], "u": "1f1f9-1f1f4" }, { "n": ["flag-tr", "turkey flag"], "u": "1f1f9-1f1f7" }, { "n": ["flag-tt", "trinidad & tobago flag"], "u": "1f1f9-1f1f9" }, { "n": ["flag-tv", "tuvalu flag"], "u": "1f1f9-1f1fb" }, { "n": ["flag-tw", "taiwan flag"], "u": "1f1f9-1f1fc" }, { "n": ["flag-tz", "tanzania flag"], "u": "1f1f9-1f1ff" }, { "n": ["flag-ua", "ukraine flag"], "u": "1f1fa-1f1e6" }, { "n": ["flag-ug", "uganda flag"], "u": "1f1fa-1f1ec" }, { "n": ["flag-um", "u.s. outlying islands flag"], "u": "1f1fa-1f1f2" }, { "n": ["flag-un", "united nations flag"], "u": "1f1fa-1f1f3" }, { "n": ["us", "flag-us", "united states flag"], "u": "1f1fa-1f1f8" }, { "n": ["flag-uy", "uruguay flag"], "u": "1f1fa-1f1fe" }, { "n": ["flag-uz", "uzbekistan flag"], "u": "1f1fa-1f1ff" }, { "n": ["flag-va", "vatican city flag"], "u": "1f1fb-1f1e6" }, { "n": ["flag-vc", "st. vincent & grenadines flag"], "u": "1f1fb-1f1e8" }, { "n": ["flag-ve", "venezuela flag"], "u": "1f1fb-1f1ea" }, { "n": ["flag-vg", "british virgin islands flag"], "u": "1f1fb-1f1ec" }, { "n": ["flag-vi", "u.s. virgin islands flag"], "u": "1f1fb-1f1ee" }, { "n": ["flag-vn", "vietnam flag"], "u": "1f1fb-1f1f3" }, { "n": ["flag-vu", "vanuatu flag"], "u": "1f1fb-1f1fa" }, { "n": ["flag-wf", "wallis & futuna flag"], "u": "1f1fc-1f1eb" }, { "n": ["flag-ws", "samoa flag"], "u": "1f1fc-1f1f8" }, { "n": ["flag-xk", "kosovo flag"], "u": "1f1fd-1f1f0" }, { "n": ["flag-ye", "yemen flag"], "u": "1f1fe-1f1ea" }, { "n": ["flag-yt", "mayotte flag"], "u": "1f1fe-1f1f9" }, { "n": ["flag-za", "south africa flag"], "u": "1f1ff-1f1e6" }, { "n": ["flag-zm", "zambia flag"], "u": "1f1ff-1f1f2" }, { "n": ["flag-zw", "zimbabwe flag"], "u": "1f1ff-1f1fc" }, { "n": ["england flag", "flag-england"], "u": "1f3f4-e0067-e0062-e0065-e006e-e0067-e007f" }, { "n": ["scotland flag", "flag-scotland"], "u": "1f3f4-e0067-e0062-e0073-e0063-e0074-e007f" }, { "n": ["wales flag", "flag-wales"], "u": "1f3f4-e0067-e0062-e0077-e006c-e0073-e007f" }] }; - -// src/components/Spaces/FileStickerMenu/FileStickerMenu.tsx -var FileStickerMenu = (props) => { - const [searchString, setSearchString] = p2(""); - const emojiArray = Object.keys(emojis).reduce((p5, c3) => [...p5, ...emojis[c3].map((e5) => ({ label: e5.n[0], desc: e5.n[1], variants: e5.v, unicode: e5.u }))], []); - const filteredArray = emojiArray.filter(({ label }) => label.includes(searchString)); - const ref = _2(null); - h2(() => { - ref == null ? void 0 : ref.current.focus(); - }, []); - const selectEmoji = (emoji) => { - props.setIcon(emoji); - props.close(); - }; - return /* @__PURE__ */ bn.createElement("div", { - className: "mk-sticker-menu menu" - }, /* @__PURE__ */ bn.createElement("input", { - autoFocus: true, - className: "mk-sticker-filter", - ref, - onChange: () => setSearchString(ref.current.value), - placeholder: i18n_default.labels.findStickers - }), /* @__PURE__ */ bn.createElement("div", { - className: "suggestion" - }, (filteredArray.length == 0 ? emojiArray : filteredArray).map((value) => /* @__PURE__ */ bn.createElement("div", { - className: "suggestion-item", - onClick: () => selectEmoji(value.unicode) - }, value.unicode.length > 0 ? unifiedToNative(value.unicode) : i18n_default.commandsSuggest.noResult)))); }; // node_modules/react-popper/lib/esm/utils.js @@ -14341,18 +13822,18 @@ function getBoundingClientRect(element, includeScale, isFixedStrategy) { var _ref = isElement(element) ? getWindow3(element) : window, visualViewport = _ref.visualViewport; var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; var x4 = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; - var y4 = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; + var y3 = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; var width = clientRect.width / scaleX; var height = clientRect.height / scaleY; return { width, height, - top: y4, + top: y3, right: x4 + width, - bottom: y4 + height, + bottom: y3 + height, left: x4, x: x4, - y: y4 + y: y3 }; } @@ -14577,27 +14058,27 @@ var unsetSides = { left: "auto" }; function roundOffsetsByDPR(_ref) { - var x4 = _ref.x, y4 = _ref.y; + var x4 = _ref.x, y3 = _ref.y; var win = window; var dpr = win.devicePixelRatio || 1; return { x: round(x4 * dpr) / dpr || 0, - y: round(y4 * dpr) / dpr || 0 + y: round(y3 * dpr) / dpr || 0 }; } function mapToStyles(_ref2) { var _Object$assign2; var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed2 = _ref2.isFixed; - var _offsets$x = offsets.x, x4 = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y4 = _offsets$y === void 0 ? 0 : _offsets$y; + var _offsets$x = offsets.x, x4 = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y3 = _offsets$y === void 0 ? 0 : _offsets$y; var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ x: x4, - y: y4 + y: y3 }) : { x: x4, - y: y4 + y: y3 }; x4 = _ref3.x; - y4 = _ref3.y; + y3 = _ref3.y; var hasX = offsets.hasOwnProperty("x"); var hasY = offsets.hasOwnProperty("y"); var sideX = left; @@ -14618,8 +14099,8 @@ function mapToStyles(_ref2) { if (placement === top || (placement === left || placement === right) && variation === end) { sideY = bottom; var offsetY = isFixed2 && offsetParent === win && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; - y4 -= offsetY - popperRect.height; - y4 *= gpuAcceleration ? 1 : -1; + y3 -= offsetY - popperRect.height; + y3 *= gpuAcceleration ? 1 : -1; } if (placement === left || (placement === top || placement === bottom) && variation === end) { sideX = right; @@ -14633,18 +14114,18 @@ function mapToStyles(_ref2) { }, adaptive && unsetSides); var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ x: x4, - y: y4 + y: y3 }) : { x: x4, - y: y4 + y: y3 }; x4 = _ref4.x; - y4 = _ref4.y; + y3 = _ref4.y; if (gpuAcceleration) { var _Object$assign; - return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x4 + "px, " + y4 + "px)" : "translate3d(" + x4 + "px, " + y4 + "px, 0)", _Object$assign)); + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x4 + "px, " + y3 + "px)" : "translate3d(" + x4 + "px, " + y3 + "px, 0)", _Object$assign)); } - return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y4 + "px" : "", _Object$assign2[sideX] = hasX ? x4 + "px" : "", _Object$assign2.transform = "", _Object$assign2)); + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y3 + "px" : "", _Object$assign2[sideX] = hasX ? x4 + "px" : "", _Object$assign2.transform = "", _Object$assign2)); } function computeStyles(_ref5) { var state = _ref5.state, options = _ref5.options; @@ -14779,21 +14260,21 @@ function getViewportRect(element, strategy) { var width = html.clientWidth; var height = html.clientHeight; var x4 = 0; - var y4 = 0; + var y3 = 0; if (visualViewport) { width = visualViewport.width; height = visualViewport.height; var layoutViewport = isLayoutViewport(); if (layoutViewport || !layoutViewport && strategy === "fixed") { x4 = visualViewport.offsetLeft; - y4 = visualViewport.offsetTop; + y3 = visualViewport.offsetTop; } } return { width, height, x: x4 + getWindowScrollBarX(element), - y: y4 + y: y3 }; } @@ -14806,7 +14287,7 @@ function getDocumentRect(element) { var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); var x4 = -winScroll.scrollLeft + getWindowScrollBarX(element); - var y4 = -winScroll.scrollTop; + var y3 = -winScroll.scrollTop; if (getComputedStyle(body || html).direction === "rtl") { x4 += max(html.clientWidth, body ? body.clientWidth : 0) - width; } @@ -14814,7 +14295,7 @@ function getDocumentRect(element) { width, height, x: x4, - y: y4 + y: y3 }; } @@ -15026,8 +14507,8 @@ function computeAutoPlacement(state, options) { })[getBasePlacement(placement2)]; return acc; }, {}); - return Object.keys(overflows).sort(function(a5, b4) { - return overflows[a5] - overflows[b4]; + return Object.keys(overflows).sort(function(a3, b3) { + return overflows[a3] - overflows[b3]; }); } @@ -15064,8 +14545,8 @@ function flip(_ref) { var checksMap = /* @__PURE__ */ new Map(); var makeFallbackChecks = true; var firstFittingPlacement = placements2[0]; - for (var i5 = 0; i5 < placements2.length; i5++) { - var placement = placements2[i5]; + for (var i3 = 0; i3 < placements2.length; i3++) { + var placement = placements2[i3]; var _basePlacement = getBasePlacement(placement); var isStartVariation = getVariation(placement) === start; var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; @@ -15215,10 +14696,10 @@ function offset(_ref2) { acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); return acc; }, {}); - var _data$state$placement = data[state.placement], x4 = _data$state$placement.x, y4 = _data$state$placement.y; + var _data$state$placement = data[state.placement], x4 = _data$state$placement.x, y3 = _data$state$placement.y; if (state.modifiersData.popperOffsets != null) { state.modifiersData.popperOffsets.x += x4; - state.modifiersData.popperOffsets.y += y4; + state.modifiersData.popperOffsets.y += y3; } state.modifiersData[name] = data; } @@ -15464,8 +14945,8 @@ function format(str) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return [].concat(args).reduce(function(p5, c3) { - return p5.replace(/%s/, c3); + return [].concat(args).reduce(function(p3, c3) { + return p3.replace(/%s/, c3); }, str); } @@ -15518,8 +14999,8 @@ function validateModifiers(modifiers) { case "data": break; default: - console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s10) { - return '"' + s10 + '"'; + console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s3) { + return '"' + s3 + '"'; }).join(", ") + '; but "' + key2 + '" was provided.'); } modifier.requires && modifier.requires.forEach(function(requirement) { @@ -15610,8 +15091,8 @@ function popperGenerator(generatorOptions) { popper: listScrollParents(popper2) }; var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); - state.orderedModifiers = orderedModifiers.filter(function(m5) { - return m5.enabled; + state.orderedModifiers = orderedModifiers.filter(function(m3) { + return m3.enabled; }); if (true) { var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function(_ref) { @@ -15906,16 +15387,20 @@ var TreeItem = k3(({ const [referenceElement, setReferenceElement] = bn.useState(null); const [popperElement, setPopperElement] = p2(null); const { styles, attributes } = usePopper(referenceElement, popperElement); - const openFile2 = (file, e5) => { - openFile(file, plugin.app, e5.ctrlKey || e5.metaKey); + const openFile2 = (file, e3) => { + openFile(file, plugin.app, e3.ctrlKey || e3.metaKey); setActiveFile(file.path); }; const updateSections = (sections3) => { plugin.settings.spaces = sections3; plugin.saveSettings(); }; - const triggerContextMenu = (file, isFolder, e5) => { - const fileMenu = new import_obsidian6.Menu(); + const triggerStickerMenu = (e3) => { + let vaultChangeModal = new StickerModal(plugin.app, (emoji) => saveFileIcon(emoji)); + vaultChangeModal.open(); + }; + const triggerContextMenu = (file, isFolder, e3) => { + const fileMenu = new import_obsidian7.Menu(); if (isFolder) { fileMenu.addSeparator(); fileMenu.addItem((menuItem) => { @@ -15939,7 +15424,7 @@ var TreeItem = k3(({ menuItem.setTitle(i18n_default.menu.spaceTitle); menuItem.setDisabled(true); }); - sections2.map((f4, i5) => { + sections2.map((f4, i3) => { fileMenu.addItem((menuItem) => { menuItem.setIcon("pin"); if (f4.children.contains(file.path)) { @@ -15950,16 +15435,16 @@ var TreeItem = k3(({ menuItem.setIcon("plus"); } menuItem.onClick((ev) => { - updateSections(!sections2[i5].children.contains(file.path) ? sections2.map((s10, k4) => { - return k4 == i5 ? { - ...s10, - children: [file.path, ...s10.children] - } : s10; - }) : sections2.map((s10, k4) => { - return k4 == i5 ? { - ...s10, - children: s10.children.filter((g4) => g4 != file.path) - } : s10; + updateSections(!sections2[i3].children.contains(file.path) ? sections2.map((s3, k4) => { + return k4 == i3 ? { + ...s3, + children: [file.path, ...s3.children] + } : s3; + }) : sections2.map((s3, k4) => { + return k4 == i3 ? { + ...s3, + children: s3.children.filter((g4) => g4 != file.path) + } : s3; })); }); }); @@ -16013,10 +15498,10 @@ var TreeItem = k3(({ }); } plugin.app.workspace.trigger("file-menu", fileMenu, file, "file-explorer"); - if (isMouseEvent(e5)) { - fileMenu.showAtPosition({ x: e5.pageX, y: e5.pageY }); + if (isMouseEvent(e3)) { + fileMenu.showAtPosition({ x: e3.pageX, y: e3.pageY }); } else { - fileMenu.showAtPosition({ x: e5.nativeEvent.locationX, y: e5.nativeEvent.locationY }); + fileMenu.showAtPosition({ x: e3.nativeEvent.locationX, y: e3.nativeEvent.locationY }); } return false; }; @@ -16045,103 +15530,50 @@ var TreeItem = k3(({ style: { "--spacing": `${indentationWidth * depth - 12}px` }, - onClick: (e5) => openFile2(data, e5), - onContextMenu: (e5) => triggerContextMenu(data, data.isFolder, e5) + onClick: (e3) => openFile2(data, e3), + onContextMenu: (e3) => triggerContextMenu(plugin.app.vault.getAbstractFileByPath(data.path), data.isFolder, e3) }, data.isFolder && /* @__PURE__ */ bn.createElement("button", { "aria-label": `${collapsed ? i18n_default.labels.expand : i18n_default.labels.collapse}`, className: `mk-collapse ${collapsed ? "mk-collapsed" : ""}`, - onClick: (e5) => { + onClick: (e3) => { onCollapse(data); - e5.stopPropagation(); - } - }, /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 2, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M8.25 4.5l7.5 7.5-7.5 7.5" - }))), plugin.settings.spacesStickers && /* @__PURE__ */ bn.createElement("div", { + e3.stopPropagation(); + }, + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-collapse"] } + }), plugin.settings.spacesStickers && /* @__PURE__ */ bn.createElement("div", { className: "mk-file-icon" - }, /* @__PURE__ */ bn.createElement(mt, null, /* @__PURE__ */ bn.createElement(mt.Button, { + }, /* @__PURE__ */ bn.createElement("button", { "aria-label": i18n_default.buttons.changeIcon, - ref: setReferenceElement - }, fileIcon ? unifiedToNative(fileIcon[1]) : data.isFolder ? /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 2, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" - })) : /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 2, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" - }))), bn.createPortal(/* @__PURE__ */ bn.createElement(mt.Panel, { - className: "mk-icon-menu", - ref: setPopperElement, - style: styles.popper, - ...attributes.popper - }, ({ close }) => /* @__PURE__ */ bn.createElement(FileStickerMenu, { - setIcon: (emoji) => saveFileIcon(emoji), - close - })), document.querySelector(".app-container")))), /* @__PURE__ */ bn.createElement("div", { + ref: setReferenceElement, + dangerouslySetInnerHTML: fileIcon ? { __html: unifiedToNative(fileIcon[1]) } : data.isFolder ? { __html: uiIconSet["mk-ui-folder"] } : { __html: uiIconSet["mk-ui-file"] }, + onClick: (e3) => triggerStickerMenu(e3) + })), /* @__PURE__ */ bn.createElement("div", { className: `mk-tree-text ` - }, data.isFolder ? data.name : data.name.substring(0, data.name.lastIndexOf(".")) || data.name)), /* @__PURE__ */ bn.createElement("div", { + }, data.isFolder ? data.name : data.name.substring(0, data.name.lastIndexOf(".")) || data.name)), !clone ? /* @__PURE__ */ bn.createElement("div", { className: "mk-folder-buttons" }, /* @__PURE__ */ bn.createElement("button", { "aria-label": i18n_default.buttons.moreOptions, - onClick: (e5) => { - triggerContextMenu(data, data.isFolder, e5); - e5.stopPropagation(); - } - }, /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 1.5, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M6.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM12.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM18.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0z" - }))), data.isFolder && /* @__PURE__ */ bn.createElement("button", { + onClick: (e3) => { + triggerContextMenu(plugin.app.vault.getAbstractFileByPath(data.path), data.isFolder, e3); + e3.stopPropagation(); + }, + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-options"] } + }), data.isFolder && /* @__PURE__ */ bn.createElement("button", { "aria-label": i18n_default.buttons.newNote, - onClick: (e5) => { + onClick: (e3) => { newFileInFolder(); - e5.stopPropagation(); - } - }, /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 1.5, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M12 4.5v15m7.5-7.5h-15" - }))))))); + e3.stopPropagation(); + }, + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-plus"] } + })) : /* @__PURE__ */ bn.createElement(bn.Fragment, null)))); }); TreeItem.displayName = "TreeItem"; // node_modules/@babel/runtime/helpers/esm/extends.js function _extends() { _extends = Object.assign ? Object.assign.bind() : function(target) { - for (var i5 = 1; i5 < arguments.length; i5++) { - var source = arguments[i5]; + for (var i3 = 1; i3 < arguments.length; i3++) { + var source = arguments[i3]; for (var key2 in source) { if (Object.prototype.hasOwnProperty.call(source, key2)) { target[key2] = source[key2]; @@ -16162,12 +15594,12 @@ function _assertThisInitialized(self2) { } // node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js -function _setPrototypeOf(o6, p5) { - _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o7, p6) { - o7.__proto__ = p6; - return o7; +function _setPrototypeOf(o3, p3) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o4, p4) { + o4.__proto__ = p4; + return o4; }; - return _setPrototypeOf(o6, p5); + return _setPrototypeOf(o3, p3); } // node_modules/@babel/runtime/helpers/esm/inheritsLoose.js @@ -16194,8 +15626,8 @@ function areInputsEqual(newInputs, lastInputs) { if (newInputs.length !== lastInputs.length) { return false; } - for (var i5 = 0; i5 < newInputs.length; i5++) { - if (!isEqual2(newInputs[i5], lastInputs[i5])) { + for (var i3 = 0; i3 < newInputs.length; i3++) { + if (!isEqual2(newInputs[i3], lastInputs[i3])) { return false; } } @@ -16233,9 +15665,9 @@ function _objectWithoutPropertiesLoose(source, excluded) { return {}; var target = {}; var sourceKeys = Object.keys(source); - var key2, i5; - for (i5 = 0; i5 < sourceKeys.length; i5++) { - key2 = sourceKeys[i5]; + var key2, i3; + for (i3 = 0; i3 < sourceKeys.length; i3++) { + key2 = sourceKeys[i3]; if (excluded.indexOf(key2) >= 0) continue; target[key2] = source[key2]; @@ -16679,9 +16111,9 @@ var getItemMetadata$1 = function getItemMetadata(props, index, instanceProps) { var itemMetadata = itemMetadataMap[lastMeasuredIndex]; offset2 = itemMetadata.offset + itemMetadata.size; } - for (var i5 = lastMeasuredIndex + 1; i5 <= index; i5++) { - var size2 = itemSize(i5); - itemMetadataMap[i5] = { + for (var i3 = lastMeasuredIndex + 1; i3 <= index; i3++) { + var size2 = itemSize(i3); + itemMetadataMap[i3] = { offset: offset2, size: size2 }; @@ -16910,8 +16342,8 @@ function createDetectElementResize(nonce) { checkTriggers = function(element) { return element.offsetWidth !== element.__resizeLast__.width || element.offsetHeight !== element.__resizeLast__.height; }; - scrollListener = function(e5) { - if (e5.target.className && typeof e5.target.className.indexOf === "function" && e5.target.className.indexOf("contract-trigger") < 0 && e5.target.className.indexOf("expand-trigger") < 0) { + scrollListener = function(e3) { + if (e3.target.className && typeof e3.target.className.indexOf === "function" && e3.target.className.indexOf("contract-trigger") < 0 && e3.target.className.indexOf("expand-trigger") < 0) { return; } const element = this; @@ -16924,7 +16356,7 @@ function createDetectElementResize(nonce) { element.__resizeLast__.width = element.offsetWidth; element.__resizeLast__.height = element.offsetHeight; element.__resizeListeners__.forEach(function forEachResizeListener(fn3) { - fn3.call(element, e5); + fn3.call(element, e3); }); } }); @@ -16941,11 +16373,11 @@ function createDetectElementResize(nonce) { animation = true; } if (animation === false) { - for (let i5 = 0; i5 < domPrefixes.length; i5++) { - if (elm.style[domPrefixes[i5] + "AnimationName"] !== void 0) { - pfx = domPrefixes[i5]; + for (let i3 = 0; i3 < domPrefixes.length; i3++) { + if (elm.style[domPrefixes[i3] + "AnimationName"] !== void 0) { + pfx = domPrefixes[i3]; keyframeprefix = "-" + pfx.toLowerCase() + "-"; - animationStartEvent = startEvents[i5]; + animationStartEvent = startEvents[i3]; animation = true; break; } @@ -16997,8 +16429,8 @@ function createDetectElementResize(nonce) { resetTriggers(element); element.addEventListener("scroll", scrollListener, true); if (animationStartEvent) { - element.__resizeTriggers__.__animationListener__ = function animationListener(e5) { - if (e5.animationName === animationName) { + element.__resizeTriggers__.__animationListener__ = function animationListener(e3) { + if (e3.animationName === animationName) { resetTriggers(element); } }; @@ -17021,7 +16453,7 @@ function createDetectElementResize(nonce) { } try { element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__); - } catch (e5) { + } catch (e3) { } } } @@ -17141,7 +16573,7 @@ var row = R(({ data, index, style }) => { indicator: (projected == null ? void 0 : projected.overId) == f4.id ? f4.parentId == null && projected.parentId == null ? { state: 1 /* Top */, depth: projected.depth } : { state: 2 /* Bottom */, depth: projected.depth } : null, plugin, style, - collapsed: f4.parentId == null ? f4.id == "/" ? plugin.settings.vaultCollapsed : sections2[f4.index].collapsed : !openFolders2.find((i5) => i5 == f4.id), + collapsed: f4.parentId == null ? f4.id == "/" ? plugin.settings.vaultCollapsed : sections2[f4.index].collapsed : !openFolders2.find((i3) => i3 == f4.id), onCollapse: handleCollapse }); }, areEqual); @@ -17156,7 +16588,6 @@ var FileExplorerComponent = (props) => { const [activeFile2, setActiveFile] = Recoil_index_14(activeFile); const [sections2, setSections] = Recoil_index_14(sections); const [_folderTree, setFolderTree] = Recoil_index_14(folderTree); - const [dropPlaceholderItem, setDropPlaceholderItem] = p2(null); const [offsetLeft, setOffsetLeft] = p2(0); const listRef = _2(); const forceUpdate = useForceUpdate(); @@ -17260,16 +16691,16 @@ var FileExplorerComponent = (props) => { const getChildren = (section, paths, sectionIndex) => { return flattenTrees(paths.map((f4) => plugin.app.vault.getAbstractFileByPath(f4)).filter((f4) => f4 != null), "/" + section + "/", sectionIndex, section, 1); }; - return sectionTrees.reduce((p5, c3, i5) => { - return [...p5, { + return sectionTrees.reduce((p3, c3, i3) => { + return [...p3, { id: c3.section, parentId: null, name: c3.section, depth: 0, - index: i5, - section: i5, + index: i3, + section: i3, isFolder: true - }, ...!c3.collapsed ? getChildren(c3.section, c3.children, i5) : []]; + }, ...!c3.collapsed ? getChildren(c3.section, c3.children, i3) : []]; }, []); }; const flattenedItems = F(() => { @@ -17348,21 +16779,21 @@ var FileExplorerComponent = (props) => { if (parentId != sections2[overItem2.section].section && parentId != null) { return; } - const newSections = sections2.map((s10, k4) => { + const newSections = sections2.map((s3, k4) => { if (k4 == overItem2.section) { const index = sections2[overItem2.section].children.findIndex((f4) => f4 == overItem2.path) + 1; - const activeIndex2 = s10.children.findIndex((g4) => g4 == activeItem.path); - const children = s10.children.filter((g4) => g4 != activeItem.path); + const activeIndex2 = s3.children.findIndex((g4) => g4 == activeItem.path); + const children = s3.children.filter((g4) => g4 != activeItem.path); const toIndex = activeIndex2 <= index && activeIndex2 != -1 ? index - 1 : index; if (activeIndex2 == -1) { - new import_obsidian7.Notice(i18n_default.notice.addedToSection); + new import_obsidian8.Notice(i18n_default.notice.addedToSection); } return { - ...s10, + ...s3, children: [...children.slice(0, toIndex), activeItem.path, ...children.slice(toIndex)] }; } - return s10; + return s3; }); plugin.settings.spaces = newSections; plugin.saveSettings(); @@ -17371,7 +16802,7 @@ var FileExplorerComponent = (props) => { if (parentId != activeTreeItem.parentId) { const newPath = `${parentItem.isFolder ? parentItem.path : parentItem.parent.path}/${activeItem.name}`; if (plugin.app.vault.getAbstractFileByPath(newPath)) { - new import_obsidian7.Notice(i18n_default.notice.duplicateFile); + new import_obsidian8.Notice(i18n_default.notice.duplicateFile); return; } await props.plugin.app.vault.rename(activeTreeItem, newPath); @@ -17404,8 +16835,8 @@ var FileExplorerComponent = (props) => { plugin.saveSettings(); return; } - const newSections = sections2.map((s10, i5) => { - return i5 == folder.index ? { ...s10, collapsed: !s10.collapsed } : s10; + const newSections = sections2.map((s3, i3) => { + return i3 == folder.index ? { ...s3, collapsed: !s3.collapsed } : s3; }); plugin.settings.spaces = newSections; plugin.saveSettings(); @@ -17420,7 +16851,6 @@ var FileExplorerComponent = (props) => { setOverId(null); setActiveId(null); setOffsetLeft(0); - setDropPlaceholderItem(null); document.body.style.setProperty("cursor", ""); } const itemData = F(() => { @@ -17428,7 +16858,7 @@ var FileExplorerComponent = (props) => { listRef.current.resetAfterIndex(0); return { flattenedItems, projected, handleCollapse, plugin, sections: sections2, openFolders: openFolders2, indentationWidth }; }, [flattenedItems, projected, handleCollapse, plugin, sections2, openFolders2, indentationWidth]); - const rowHeight = (index) => platformIsMobile() ? flattenedItems[index].parentId == null ? 60 : 40 : flattenedItems[index].parentId == null ? 44 : 29; + const rowHeight = (index) => isMobile ? flattenedItems[index].parentId == null ? 60 : 40 : flattenedItems[index].parentId == null ? 44 : 29; return /* @__PURE__ */ bn.createElement("div", { className: "mk-file-tree" }, /* @__PURE__ */ bn.createElement(DndContext, { @@ -17482,21 +16912,13 @@ var NewNotes = (props) => { "aria-label": i18n_default.buttons.newNote, className: "mk-new-note", onClick: () => newFile() - }, /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: "1.5", - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10" - })), /* @__PURE__ */ bn.createElement("p", null, i18n_default.buttons.newNote))); + }, /* @__PURE__ */ bn.createElement("div", { + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-new-note"] } + }), /* @__PURE__ */ bn.createElement("p", null, i18n_default.buttons.newNote))); }; // src/components/Spaces/MainMenu.tsx -var import_obsidian8 = require("obsidian"); +var import_obsidian9 = require("obsidian"); var replaceMobileMainMenu = (plugin) => { if (platformIsMobile()) { const header = app.workspace.containerEl.querySelector(".workspace-drawer.mod-left .workspace-drawer-header-left"); @@ -17510,8 +16932,8 @@ var MainMenu = (props) => { const { plugin } = props; const ref = _2(); const toggleSections = (collapse) => { - const newSections = plugin.settings.spaces.map((s10) => { - return { ...s10, collapsed: collapse }; + const newSections = plugin.settings.spaces.map((s3) => { + return { ...s3, collapsed: collapse }; }); plugin.settings.spaces = newSections; plugin.saveSettings(); @@ -17530,21 +16952,20 @@ var MainMenu = (props) => { if (plugin.app.workspace.leftSplit && platformIsMobile()) { const mobileDrawer = plugin.app.workspace.leftSplit; const leaves = mobileDrawer.children; - const index = leaves.reduce((p5, c3, i5) => { - return c3.getViewState().type == FILE_TREE_VIEW_TYPE ? i5 : p5; + const index = leaves.reduce((p3, c3, i3) => { + return c3.getViewState().type == FILE_TREE_VIEW_TYPE ? i3 : p3; }, -1); spaceActive = index == mobileDrawer.currentTab; - leafs.push(...leaves.filter((l4, i5) => i5 != index)); + leafs.push(...leaves.filter((l3, i3) => i3 != index)); } if (plugin.app.workspace.leftRibbon && !props.plugin.settings.sidebarRibbon) { ribbons.push(...plugin.app.workspace.leftRibbon.orderedRibbonActions); } return { ribbons, leafs, spaceActive }; }; - const showMenu = (e5) => { + const showMenu = (e3) => { const { ribbons, spaceActive, leafs } = refreshLeafs(); - const menu = new import_obsidian8.Menu(); - console.log(menu); + const menu = new import_obsidian9.Menu(); !spaceActive && menu.addItem((menuItem) => { menuItem.setIcon("lucide-arrow-left"); menuItem.setTitle(i18n_default.menu.backToSpace); @@ -17556,7 +16977,7 @@ var MainMenu = (props) => { }); }); menu.addItem((menuItem) => { - menuItem.setIcon("edit"); + menuItem.setIcon("plus"); menuItem.setTitle(i18n_default.menu.newSpace); menuItem.onClick((ev) => { newSection(); @@ -17577,11 +16998,11 @@ var MainMenu = (props) => { }); }); menu.addSeparator(); - leafs.map((l4) => menu.addItem((menuItem) => { - menuItem.setIcon(l4.view.icon); - menuItem.setTitle(l4.getDisplayText()); + leafs.map((l3) => menu.addItem((menuItem) => { + menuItem.setIcon(l3.view.icon); + menuItem.setTitle(l3.getDisplayText()); menuItem.onClick((ev) => { - plugin.app.workspace.revealLeaf(l4); + plugin.app.workspace.revealLeaf(l3); }); })); menu.addItem((menuItem) => { @@ -17599,16 +17020,16 @@ var MainMenu = (props) => { }); }); menu.addSeparator(); - ribbons.map((r6) => menu.addItem((menuItem) => { - menuItem.setIcon(r6.icon); - menuItem.setTitle(r6.title); + ribbons.map((r3) => menu.addItem((menuItem) => { + menuItem.setIcon(r3.icon); + menuItem.setTitle(r3.title); menuItem.onClick((ev) => { - r6.callback(); + r3.callback(); }); })); menu.addSeparator(); menu.addItem((menuItem) => { - menuItem.setIcon("edit"); + menuItem.setIcon("mk-logo"); menuItem.setTitle(i18n_default.menu.getHelp); menuItem.onClick((ev) => { window.open("https://make.md/community"); @@ -17622,25 +17043,17 @@ var MainMenu = (props) => { }, /* @__PURE__ */ bn.createElement("div", { className: "mk-main-menu-button", ref, - onClick: (e5) => showMenu(e5) - }, plugin.app.vault.getName(), /* @__PURE__ */ bn.createElement("svg", { - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - viewBox: "0 0 24 24", - strokeWidth: 1.5, - stroke: "currentColor" - }, /* @__PURE__ */ bn.createElement("path", { - strokeLinecap: "round", - strokeLinejoin: "round", - d: "M8.25 15L12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" - })))); + onClick: (e3) => showMenu(e3) + }, plugin.app.vault.getName(), /* @__PURE__ */ bn.createElement("div", { + dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-expand"] } + }))); }; // src/components/Spaces/FileTreeView.tsx var FILE_TREE_VIEW_TYPE = "mk-file-view"; var VIEW_DISPLAY_TEXT = "Spaces"; var ICON = "sheets-in-box"; -var FileTreeView = class extends import_obsidian9.ItemView { +var FileTreeView = class extends import_obsidian10.ItemView { constructor(leaf, plugin) { super(leaf); this.navigation = false; @@ -17692,7 +17105,7 @@ var FileTreeView = class extends import_obsidian9.ItemView { }; // src/settings.ts -var import_obsidian10 = require("obsidian"); +var import_obsidian11 = require("obsidian"); var DEFAULT_SETTINGS = { filePreviewOnHover: false, markSans: true, @@ -17720,7 +17133,7 @@ var DEFAULT_SETTINGS = { menuTriggerChar: "/", emojiTriggerChar: ":" }; -var MakeMDPluginSettingsTab = class extends import_obsidian10.PluginSettingTab { +var MakeMDPluginSettingsTab = class extends import_obsidian11.PluginSettingTab { constructor(app2, plugin) { super(app2, plugin); this.plugin = plugin; @@ -17733,7 +17146,7 @@ var MakeMDPluginSettingsTab = class extends import_obsidian10.PluginSettingTab { let { containerEl } = this; containerEl.empty(); containerEl.createEl("h2", { text: i18n_default.settings.sectionSidebar }); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.spaces.name).setDesc(i18n_default.settings.spaces.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.spacesEnabled).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.spaces.name).setDesc(i18n_default.settings.spaces.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.spacesEnabled).onChange((value) => { this.plugin.settings.spacesEnabled = value; this.plugin.saveSettings(); if (value) { @@ -17743,32 +17156,42 @@ var MakeMDPluginSettingsTab = class extends import_obsidian10.PluginSettingTab { } this.refreshView(); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.spacesStickers.name).setDesc(i18n_default.settings.spacesStickers.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.spacesStickers).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.spacesStickers.name).setDesc(i18n_default.settings.spacesStickers.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.spacesStickers).onChange((value) => { this.plugin.settings.spacesStickers = value; this.plugin.saveSettings(); this.refreshView(); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.sidebarRibbon.name).setDesc(i18n_default.settings.sidebarRibbon.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.sidebarRibbon).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.sidebarRibbon.name).setDesc(i18n_default.settings.sidebarRibbon.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.sidebarRibbon).onChange((value) => { this.plugin.settings.sidebarRibbon = value; this.plugin.saveSettings(); document.body.classList.toggle("mk-hide-ribbon", !value); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.sidebarTabs.name).setDesc(i18n_default.settings.sidebarTabs.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.sidebarTabs).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.sidebarTabs.name).setDesc(i18n_default.settings.sidebarTabs.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.sidebarTabs).onChange((value) => { this.plugin.settings.sidebarTabs = value; this.plugin.saveSettings(); document.body.classList.toggle("mk-hide-tabs", !value); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.spacesPerformance.name).setDesc(i18n_default.settings.spacesPerformance.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.spacesPerformance).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.spacesPerformance.name).setDesc(i18n_default.settings.spacesPerformance.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.spacesPerformance).onChange((value) => { this.plugin.settings.spacesPerformance = value; this.plugin.saveSettings(); })); + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.spacesDeleteOption.name).setDesc(i18n_default.settings.spacesDeleteOption.desc).addDropdown((dropdown) => { + dropdown.addOption("permanent", i18n_default.settings.spacesDeleteOptions.permanant); + dropdown.addOption("trash", i18n_default.settings.spacesDeleteOptions.trash); + dropdown.addOption("system-trash", i18n_default.settings.spacesDeleteOptions["system-trash"]); + dropdown.setValue(this.plugin.settings.deleteFileOption); + dropdown.onChange((option) => { + this.plugin.settings.deleteFileOption = option; + this.plugin.saveSettings(); + }); + }); containerEl.createEl("h2", { text: i18n_default.settings.sectionFlow }); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.editorFlowReplace.name).setDesc(i18n_default.settings.editorFlowReplace.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.editorFlow).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.editorFlowReplace.name).setDesc(i18n_default.settings.editorFlowReplace.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.editorFlow).onChange((value) => { this.plugin.settings.editorFlow = value; this.plugin.saveSettings(); this.refreshView(); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.editorFlowStyle.name).setDesc(i18n_default.settings.editorFlowStyle.desc).addDropdown((dropdown) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.editorFlowStyle.name).setDesc(i18n_default.settings.editorFlowStyle.desc).addDropdown((dropdown) => { dropdown.addOption("classic", i18n_default.settings.editorFlowStyle.classic); dropdown.addOption("seamless", i18n_default.settings.editorFlowStyle.seamless); dropdown.setValue(this.plugin.settings.editorFlowStyle).onChange(async (value) => { @@ -17782,7 +17205,7 @@ var MakeMDPluginSettingsTab = class extends import_obsidian10.PluginSettingTab { }); }); containerEl.createEl("h2", { text: i18n_default.settings.sectionEditor }); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.makeChar.name).setDesc(i18n_default.settings.makeChar.desc).addText((text) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.makeChar.name).setDesc(i18n_default.settings.makeChar.desc).addText((text) => { text.setValue(this.plugin.settings.menuTriggerChar).onChange(async (value) => { if (value.trim().length < 1) { text.setValue(this.plugin.settings.menuTriggerChar); @@ -17797,27 +17220,27 @@ var MakeMDPluginSettingsTab = class extends import_obsidian10.PluginSettingTab { await this.plugin.saveSettings(); }); }); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.editorMakePlacholder.name).setDesc(i18n_default.settings.editorMakePlacholder.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.makeMenuPlaceholder).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.editorMakePlacholder.name).setDesc(i18n_default.settings.editorMakePlacholder.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.makeMenuPlaceholder).onChange((value) => { this.plugin.settings.makeMenuPlaceholder = value; this.plugin.saveSettings(); this.refreshView(); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.mobileMakeBar.name).setDesc(i18n_default.settings.mobileMakeBar.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.mobileMakeBar).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.mobileMakeBar.name).setDesc(i18n_default.settings.mobileMakeBar.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.mobileMakeBar).onChange((value) => { this.plugin.settings.mobileMakeBar = value; this.plugin.saveSettings(); this.refreshView(); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.inlineStyler.name).setDesc(i18n_default.settings.inlineStyler.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.inlineStyler).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.inlineStyler.name).setDesc(i18n_default.settings.inlineStyler.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.inlineStyler).onChange((value) => { this.plugin.settings.inlineStyler = value; this.plugin.saveSettings(); this.refreshView(); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.inlineStylerColor.name).setDesc(i18n_default.settings.inlineStylerColor.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.inlineStylerColors).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.inlineStylerColor.name).setDesc(i18n_default.settings.inlineStylerColor.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.inlineStylerColors).onChange((value) => { this.plugin.settings.inlineStylerColors = value; this.plugin.saveSettings(); this.refreshView(); })); - new import_obsidian10.Setting(containerEl).setName(i18n_default.settings.editorMarkSans.name).setDesc(i18n_default.settings.editorMarkSans.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.markSans).onChange((value) => { + new import_obsidian11.Setting(containerEl).setName(i18n_default.settings.editorMarkSans.name).setDesc(i18n_default.settings.editorMarkSans.desc).addToggle((toggle) => toggle.setValue(this.plugin.settings.markSans).onChange((value) => { this.plugin.settings.markSans = value; this.plugin.saveSettings(); this.refreshView(); @@ -17825,114 +17248,64 @@ var MakeMDPluginSettingsTab = class extends import_obsidian10.PluginSettingTab { } }; -// src/components/Editor/MakeMenu/MakeMenu.tsx -var import_obsidian11 = require("obsidian"); +// src/components/MakeMenu/MakeMenu.tsx +var import_obsidian12 = require("obsidian"); -// src/components/Editor/MakeMenu/commands/default.ts +// src/components/MakeMenu/commands/default.ts var default_default = [ { label: "todo", value: "- [ ] ", - icon: ` - - - - ` + icon: "mk-make-todo" }, { label: "list", value: `- `, - icon: ` - - - - - - - - ` + icon: "mk-make-list" }, { label: "ordered-list", value: `1. `, - icon: ` - - - - - - - - ` + icon: "mk-make-ordered" }, { label: "h1", value: "# ", - icon: ` - - - - ` + icon: "mk-make-h1" }, { label: "h2", value: "## ", - icon: ` - - - - ` + icon: "mk-make-h2" }, { label: "h3", value: "### ", - icon: ` - - - - ` + icon: "mk-make-h3" }, { label: "quote", value: "> ", - icon: ` - - - - - - ` + icon: "mk-make-quote" }, { label: "divider", value: ` --- `, - icon: ` - - -` + icon: "mk-make-hr" }, { label: "link", value: "", offset: [-1, 1], - icon: ` - - - ` + icon: "mk-make-link" }, { label: "image", value: "![](Paste Link)", offset: [-1, 4], - icon: ` - - - - - - ` + icon: "mk-make-image" }, { label: "codeblock", @@ -17941,65 +17314,42 @@ var default_default = [ Type/Paste Your Code \`\`\``, offset: [-3, 3], - icon: ` - - - - - ` + icon: "mk-make-codeblock" }, { label: "callout", value: `> [!NOTE] > Content`, offset: [-7, 12], - icon: ` - - - - ` + icon: "mk-make-callout" }, { label: "note", value: "[[Note Name]]", offset: [-2, 2], - icon: ` - - - - - - ` + icon: "mk-make-note" }, { label: "flow", value: `!![[Note Name]]`, offset: [-2, 4], - icon: ` - - - - ` + icon: "mk-make-flow" }, { label: "tag", value: "#tag", offset: [0, 1], - icon: ` - - - - ` + icon: "mk-make-tag" } ]; -// src/components/Editor/MakeMenu/commands/index.ts +// src/components/MakeMenu/commands/index.ts function resolveCommands(plugin) { return default_default; } -// src/components/Editor/MakeMenu/MakeMenu.tsx -var MakeMenu = class extends import_obsidian11.EditorSuggest { +// src/components/MakeMenu/MakeMenu.tsx +var MakeMenu = class extends import_obsidian12.EditorSuggest { constructor(app2, plugin) { super(app2); this.inCmd = false; @@ -18025,7 +17375,6 @@ var MakeMenu = class extends import_obsidian11.EditorSuggest { this.resetInfos(); return null; } - this.suggestEl.classList.toggle("SlashMenu", true); return { start: cursor, end: cursor, query: currentCmd.slice(1) }; } getSuggestions(context) { @@ -18033,15 +17382,11 @@ var MakeMenu = class extends import_obsidian11.EditorSuggest { return suggestions.length > 0 ? suggestions : [{ label: i18n_default.commandsSuggest.noResult, value: "", icon: "" }]; } renderSuggestion(value, el) { - const div = document.createElement("div"); - const reactElement = createRoot(div); - reactElement.render(/* @__PURE__ */ bn.createElement("div", { - className: "mk-slash-item" - }, /* @__PURE__ */ bn.createElement("div", { - className: "mk-slash-icon", - dangerouslySetInnerHTML: { __html: value.icon } - }), i18n_default.commands[value.label])); - el.appendChild(div); + const div = el.createDiv("mk-slash-item"); + const icon = div.createDiv("mk-slash-icon"); + icon.innerHTML = makeIconSet[value.icon]; + const title = div.createDiv(); + title.setText(i18n_default.commands[value.label]); } selectSuggestion(cmd, _evt) { if (cmd.label === i18n_default.commandsSuggest.noResult) @@ -18055,15 +17400,15 @@ var MakeMenu = class extends import_obsidian11.EditorSuggest { } }; -// src/components/Editor/StickerMenu/StickerMenu.tsx -var import_obsidian12 = require("obsidian"); -var StickerMenu = class extends import_obsidian12.EditorSuggest { +// src/components/StickerMenu/StickerMenu.tsx +var import_obsidian13 = require("obsidian"); +var StickerMenu = class extends import_obsidian13.EditorSuggest { constructor(app2, plugin) { super(app2); this.inCmd = false; this.cmdStartCh = 0; this.plugin = plugin; - this.emojis = Object.keys(emojis).reduce((p5, c3) => [...p5, ...emojis[c3].map((e5) => ({ label: e5.n[0], desc: e5.n[1], variants: e5.v, unicode: e5.u }))], []); + this.emojis = Object.keys(emojis).reduce((p3, c3) => [...p3, ...emojis[c3].map((e3) => ({ label: e3.n[0], desc: e3.n[1], variants: e3.v, unicode: e3.u }))], []); } resetInfos() { this.cmdStartCh = 0; @@ -18531,77 +17876,15 @@ function resolveStyles() { return default_default2; } -// src/utils/icons.ts -var uiIconSet = { - "mk-ui-close": ` - - ` -}; -var markIconSet = { - "mk-mark-strong": ` - - - `, - "mk-mark-em": ` - - `, - "mk-mark-strikethrough": ` - - - - `, - "mk-mark-code": ` - - - - - `, - "mk-mark-link": ` - - `, - "mk-mark-blocklink": ` - - - - - `, - "mk-mark-highlight": ` - - - - - - `, - "mk-make-attach": ` - - - - - `, - "mk-make-keyboard": ` - - - -`, - "mk-make-slash": ` - - - -`, - "mk-make-style": ` - -` -}; - // src/cm-extensions/inlineStylerView/Mark.tsx var Mark = (props) => { - const { i: i5, style, active, toggleMarkAction } = props; + const { i: i3, style, active, toggleMarkAction } = props; return /* @__PURE__ */ bn.createElement("div", { - key: i5, + key: i3, "aria-label": !platformIsMobile() ? i18n_default.styles[style.label] : void 0, className: `mk-mark ${style.mark && active ? "mk-mark-active" : ""}`, dangerouslySetInnerHTML: { __html: markIconSet[style.icon] }, - onMouseDown: (e5) => toggleMarkAction(e5, style) + onMouseDown: (e3) => toggleMarkAction(e3, style) }); }; @@ -18618,9 +17901,9 @@ var InlineMenuComponent = (props) => { const [mode, setMode] = p2(props.mobile ? 0 : 1); const [colorMode, setColorMode] = p2(null); const colors = ["#eb3b5a", "#fa8231", "#f7b731", "#20bf6b", "#0fb9b1", "#2d98da", "#3867d6", "#8854d0", "#4b6584"]; - const makeMenu = (e5) => { + const makeMenu = (e3) => { var _a2; - e5.preventDefault(); + e3.preventDefault(); const cm = (_a2 = props.cm) != null ? _a2 : getActiveCM(); if (!cm) return; @@ -18638,52 +17921,52 @@ var InlineMenuComponent = (props) => { } }); }; - const toggleMarkAction = (e5, s10) => { + const toggleMarkAction = (e3, s3) => { var _a2; - e5.preventDefault(); + e3.preventDefault(); const cm = (_a2 = props.cm) != null ? _a2 : getActiveCM(); if (!cm) return; - if (s10.mark) { + if (s3.mark) { cm.dispatch({ - annotations: toggleMark.of(s10.mark) + annotations: toggleMark.of(s3.mark) }); return; } const selection = cm.state.selection.main; const selectedText = cm.state.sliceDoc(selection.from, selection.to); cm.dispatch({ - changes: { from: selection.from, to: selection.to, insert: s10.value.substring(0, s10.insertOffset) + selectedText + s10.value.substring(s10.insertOffset) }, - selection: s10.cursorOffset ? { anchor: selection.from + s10.value.substring(0, s10.insertOffset).length + selectedText.length + s10.cursorOffset, head: selection.from + s10.value.substring(0, s10.insertOffset).length + selectedText.length + s10.cursorOffset } : { anchor: selection.from + s10.value.substring(0, s10.insertOffset).length, head: selection.from + s10.value.substring(0, s10.insertOffset).length + selectedText.length } + changes: { from: selection.from, to: selection.to, insert: s3.value.substring(0, s3.insertOffset) + selectedText + s3.value.substring(s3.insertOffset) }, + selection: s3.cursorOffset ? { anchor: selection.from + s3.value.substring(0, s3.insertOffset).length + selectedText.length + s3.cursorOffset, head: selection.from + s3.value.substring(0, s3.insertOffset).length + selectedText.length + s3.cursorOffset } : { anchor: selection.from + s3.value.substring(0, s3.insertOffset).length, head: selection.from + s3.value.substring(0, s3.insertOffset).length + selectedText.length } }); }; const makeMode = () => /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", { - "aria-label": !platformIsMobile() ? "Make Menu" : void 0, - onMouseDown: (e5) => { - makeMenu(e5); + "aria-label": !platformIsMobile() ? i18n_default.commands.makeMenu : void 0, + onMouseDown: (e3) => { + makeMenu(e3); }, className: "mk-mark", dangerouslySetInnerHTML: { __html: markIconSet["mk-make-slash"] } }), /* @__PURE__ */ bn.createElement("div", { - "aria-label": !platformIsMobile() ? "Style" : void 0, + "aria-label": !platformIsMobile() ? i18n_default.commands.selectStyle : void 0, onMouseDown: () => { setMode(1); }, className: "mk-mark", dangerouslySetInnerHTML: { __html: markIconSet["mk-make-style"] } }), /* @__PURE__ */ bn.createElement("div", { - "aria-label": !platformIsMobile() ? "Add Image" : void 0, + "aria-label": !platformIsMobile() ? i18n_default.commands.image : void 0, onMouseDown: () => { - const view2 = getActiveMarkdownView(); - window.make.app.commands.commands["editor:attach-file"].editorCallback(view2.editor, view2); + const view = getActiveMarkdownView(); + window.make.app.commands.commands["editor:attach-file"].editorCallback(view.editor, view); }, className: "mk-mark", dangerouslySetInnerHTML: { __html: markIconSet["mk-make-attach"] } }), /* @__PURE__ */ bn.createElement("div", { - "aria-label": !platformIsMobile() ? "Toggle Keyboard" : void 0, + "aria-label": !platformIsMobile() ? i18n_default.commands.toggleKeyboard : void 0, onMouseDown: () => { - const view2 = getActiveMarkdownView(); - window.make.app.commands.commands["editor:toggle-keyboard"].editorCallback(view2.editor, view2); + const view = getActiveMarkdownView(); + window.make.app.commands.commands["editor:toggle-keyboard"].editorCallback(view.editor, view); }, className: "mk-mark", dangerouslySetInnerHTML: { __html: markIconSet["mk-make-keyboard"] } @@ -18695,8 +17978,8 @@ var InlineMenuComponent = (props) => { setMode(1); }, dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] } - }), colors.map((c3, i5) => /* @__PURE__ */ bn.createElement("div", { - key: i5, + }), colors.map((c3, i3) => /* @__PURE__ */ bn.createElement("div", { + key: i3, onMouseDown: () => { var _a2; setMode(1); @@ -18719,39 +18002,25 @@ var InlineMenuComponent = (props) => { setMode(0); }, dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] } - }) : /* @__PURE__ */ bn.createElement(bn.Fragment, null), resolveStyles().map((s10, i5) => { + }) : /* @__PURE__ */ bn.createElement(bn.Fragment, null), resolveStyles().map((s3, i3) => { return /* @__PURE__ */ bn.createElement(Mark, { - i: i5, - style: s10, - active: props.activeMarks.find((f4) => f4 == s10.mark) ? true : false, + i: i3, + style: s3, + active: props.activeMarks.find((f4) => f4 == s3.mark) ? true : false, toggleMarkAction }); }), window.make.settings.inlineStylerColors ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", { className: "mk-divider" }), /* @__PURE__ */ bn.createElement("div", { - "aria-label": !platformIsMobile() ? "Text Color" : void 0, + "aria-label": !platformIsMobile() ? i18n_default.styles.textColor : void 0, onMouseDown: () => { setMode(2); setColorMode({ prefix: ``, closeTag: "" }); }, - className: "mk-mark" - }, /* @__PURE__ */ bn.createElement("svg", { - width: "24", - height: "24", - viewBox: "0 0 24 24", - fill: "none", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ bn.createElement("path", { - d: "M8.47727 17H7L11.2727 5H12.7273L17 17H15.5227L12.0455 6.89844H11.9545L8.47727 17ZM9.02273 12.3125H14.9773V13.6016H9.02273V12.3125Z", - fill: "currentColor" - }), /* @__PURE__ */ bn.createElement("path", { - opacity: "0.2", - fillRule: "evenodd", - clipRule: "evenodd", - d: "M18 21H6V19H18V20Z", - fill: "currentColor" - }))), /* @__PURE__ */ bn.createElement("div", { - "aria-label": !platformIsMobile() ? "Highlight" : void 0, + className: "mk-mark", + dangerouslySetInnerHTML: { __html: markIconSet["mk-mark-color"] } + }), /* @__PURE__ */ bn.createElement("div", { + "aria-label": !platformIsMobile() ? i18n_default.styles.highlight : void 0, onMouseDown: () => { setMode(2); setColorMode({ prefix: ``, closeTag: "" }); @@ -18761,7 +18030,7 @@ var InlineMenuComponent = (props) => { })) : /* @__PURE__ */ bn.createElement(bn.Fragment, null)); return /* @__PURE__ */ bn.createElement("div", { className: (0, import_classnames3.default)("mk-style-menu", props.mobile ? "" : "menu"), - onMouseDown: (e5) => e5.preventDefault() + onMouseDown: (e3) => e3.preventDefault() }, mode == 0 && props.mobile ? makeMode() : mode == 2 ? colorsMode() : marksMode()); }; @@ -18785,12 +18054,12 @@ function getCursorTooltips(state) { above: true, strictSide: true, arrow: false, - create: (view2) => { + create: (view) => { let dom = document.createElement("div"); dom.className = "cm-tooltip-cursor"; const reactElement = createRoot(dom); reactElement.render(/* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement(InlineMenuComponent, { - cm: view2, + cm: view, activeMarks, mobile: false }))); @@ -18913,15 +18182,15 @@ var replaceAllEmbed = (el, ctx) => { } if (dom) { var nodes2 = dom.querySelectorAll(".markdown-embed-link"); - for (var i5 = 0; i5 < nodes2.length; i5++) { - if (nodes2[i5].parentNode === dom) { - dom.removeChild(nodes2[i5]); + for (var i3 = 0; i3 < nodes2.length; i3++) { + if (nodes2[i3].parentNode === dom) { + dom.removeChild(nodes2[i3]); const div = dom.createDiv("mk-floweditor-selector"); const reactEl = createRoot(div); reactEl.render(/* @__PURE__ */ bn.createElement(FlowEditorHover, { toggle: ctx.remainingNestLevel == 4, toggleState: false, - toggleFlow: (e5) => { + toggleFlow: (e3) => { const cm = getCMFromElement(dom); const pos = cm.posAtDOM(dom); iterateTreeInSelection({ from: pos - 3, to: pos + 4 }, cm.state, { @@ -18956,10 +18225,10 @@ var replaceAllEmbed = (el, ctx) => { } } }); - e5.stopPropagation(); + e3.stopPropagation(); }, - openLink: (e5) => { - e5.stopPropagation(); + openLink: (e3) => { + e3.stopPropagation(); openFileFlowEditor(ctx.sourcePath, "/"); } })); @@ -18974,7 +18243,7 @@ var replaceAllEmbed = (el, ctx) => { function around(obj, factories) { const removers = Object.keys(factories).map((key2) => around1(obj, key2, factories[key2])); return removers.length === 1 ? removers[0] : function() { - removers.forEach((r6) => r6()); + removers.forEach((r3) => r3()); }; } function around1(obj, method, createWrapper) { @@ -19005,9 +18274,9 @@ function around1(obj, method, createWrapper) { } // src/utils/patches.ts -var import_obsidian13 = require("obsidian"); +var import_obsidian14 = require("obsidian"); var patchFileExplorer = (plugin) => { - plugin.register(around(import_obsidian13.Workspace.prototype, { + plugin.register(around(import_obsidian14.Workspace.prototype, { getLeavesOfType(old) { return function(type) { if (type == "file-explorer") { @@ -19020,7 +18289,7 @@ var patchFileExplorer = (plugin) => { }; var patchWorkspace = (plugin) => { let layoutChanging = false; - const uninstaller = around(import_obsidian13.Workspace.prototype, { + const uninstaller = around(import_obsidian14.Workspace.prototype, { changeLayout(old) { return async function(workspace) { layoutChanging = true; @@ -19041,7 +18310,7 @@ var patchWorkspace = (plugin) => { return false; if (layoutChanging) return false; - if (parent === app.workspace.rootSplit || import_obsidian13.WorkspaceContainer && parent instanceof import_obsidian13.WorkspaceContainer) { + if (parent === app.workspace.rootSplit || import_obsidian14.WorkspaceContainer && parent instanceof import_obsidian14.WorkspaceContainer) { for (const popover of FlowEditor.popoversForWindow(parent.win)) { if (old.call(this, cb, popover.rootSplit)) return true; @@ -19072,7 +18341,7 @@ var patchWorkspace = (plugin) => { }; // src/main.ts -var MakeMDPlugin = class extends import_obsidian14.Plugin { +var MakeMDPlugin = class extends import_obsidian15.Plugin { constructor() { super(...arguments); this.triggerVaultChangeEvent = (file, changeType, oldPath) => { @@ -19202,6 +18471,7 @@ var MakeMDPlugin = class extends import_obsidian14.Plugin { } async onload() { window.make = this; + (0, import_obsidian15.addIcon)("mk-logo", mkLogo); console.log("Loading Make.md"); this.addSettingTab(new MakeMDPluginSettingsTab(this.app, this)); await this.loadSettings(); @@ -19210,14 +18480,14 @@ var MakeMDPlugin = class extends import_obsidian14.Plugin { this.loadMakerMode(); this.registerEditorExtension(cmExtensions(this, platformIsMobile())); } - openFileFromPortal(e5) { - openFileFromPortal(this, e5); + openFileFromPortal(e3) { + openFileFromPortal(this, e3); } - spawnPortal(e5) { - spawnNewPortal(this, e5); + spawnPortal(e3) { + spawnNewPortal(this, e3); } - focusPortal(e5) { - focusPortal(this, e5); + focusPortal(e3) { + focusPortal(this, e3); } async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); diff --git a/manifest.json b/manifest.json index 8345c37..c364380 100755 --- a/manifest.json +++ b/manifest.json @@ -1,9 +1,9 @@ { "id": "make-md", "name": "MAKE.md", - "version": "0.4.9", + "version": "0.5.0", "minAppVersion": "0.16.0", - "description": "This distribution makes Obsidian easy to use.", + "description": "The ultimate experience for makers on Obsidian", "author": "MAKE.md", "authorUrl": "https://www.make.md", "isDesktopOnly": false diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..16665e9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2295 @@ +{ + "name": "make-md", + "version": "0.5.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "make-md", + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.3.0", + "@dnd-kit/core": "^6.0.5", + "@dnd-kit/sortable": "^7.0.1", + "@lezer/common": "^1.0.1", + "classnames": "^2.3.2", + "common-tags": "^1.8.2", + "dayjs": "^1.10.7", + "monkey-around": "^2.3.0", + "range-analyzer": "^0.1.1-alpha.2", + "react": "npm:@preact/compat@^17.0.2", + "react-dom": "npm:@preact/compat@^17.0.2", + "react-popper": "^2.3.0", + "react-window": "^1.8.8", + "recoil": "^0.4.1" + }, + "devDependencies": { + "@types/common-tags": "^1.8.1", + "@types/node": "^14.14.37", + "@types/react": "17.0.2", + "@types/react-dom": "^18.0.8", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.5", + "builtin-modules": "3.3.0", + "cross-env": "^7", + "dotenv": "^16.0.3", + "esbuild": "^0.14.47", + "esbuild-envfile-plugin": "^1.0.3", + "esbuild-plugin-copy": "^1.6.0", + "obsidian": "^0.16.3", + "prop-types": "^15.7.2", + "tslib": "^2.2.0", + "typescript": "^4.2.4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dependencies": { + "regenerator-runtime": "^0.13.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.3.1.tgz", + "integrity": "sha512-MK+G1QKaGfSEUg9YEFaBkMBI6j1ge4VMBPZv9fDYotw7w695c42x5Ba1mmwBkesYnzYFBfte6Hh9TDcKa6xORQ==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/state": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.3.tgz", + "integrity": "sha512-0Rn7vadZ6EgHaKdIOwyhBWLdPDh1JM5USYqXjxwrvpmTKWu4wQ77twgAYEg1MU282XcrnV4ZqFf+00bu6UPCyg==" + }, + "node_modules/@codemirror/view": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.5.0.tgz", + "integrity": "sha512-dapE7AywjyYoHBHn4n+wCRKFqMEmYZHHlfyoSO+e1P6MK4az1wg9t7mfwbdI9mXuBzmPBX7NmU3Xmq+qmxDOLw==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "style-mod": "^4.0.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.0.5.tgz", + "integrity": "sha512-3nL+Zy5cT+1XwsWdlXIvGIFvbuocMyB4NBxTN74DeBaBqeWdH9JsnKwQv7buZQgAHmAH+eIENfS1ginkvW6bCw==", + "dependencies": { + "@dnd-kit/accessibility": "^3.0.0", + "@dnd-kit/utilities": "^3.2.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core/node_modules/@dnd-kit/accessibility": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.0.1.tgz", + "integrity": "sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core/node_modules/@dnd-kit/utilities": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.0.tgz", + "integrity": "sha512-h65/pn2IPCCIWwdlR2BMLqRkDxpTEONA+HQW3n765HBijLYGyrnTCLa2YQt8VVjjSQD6EfFlTE6aS2Q/b6nb2g==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-7.0.1.tgz", + "integrity": "sha512-n77qAzJQtMMywu25sJzhz3gsHnDOUlEjTtnRl8A87rWIhnu32zuP+7zmFjwGgvqfXmRufqiHOSlH7JPC/tnJ8Q==", + "dependencies": { + "@dnd-kit/utilities": "^3.2.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.0.4", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable/node_modules/@dnd-kit/utilities": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.0.tgz", + "integrity": "sha512-h65/pn2IPCCIWwdlR2BMLqRkDxpTEONA+HQW3n765HBijLYGyrnTCLa2YQt8VVjjSQD6EfFlTE6aS2Q/b6nb2g==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@lezer/common": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.1.tgz", + "integrity": "sha512-8TR5++Q/F//tpDsLd5zkrvEX5xxeemafEaek7mUp7Y+bI8cKQXdSqhzTOBaOogETcMOVr0pT3BBPXp13477ciw==" + }, + "node_modules/@lezer/highlight": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.2.tgz", + "integrity": "sha512-CAun1WR1glxG9ZdOokTZwXbcwB7PXkIEyZRUMFBVwSrhTcogWq634/ByNImrkUnQhjju6xsIaOBIxvcRJtplXQ==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.4.tgz", + "integrity": "sha512-L/52/oMJBFXXx8qBYF4UgktLP2geQ/qn5Fd8+5L/mqlLLCB9+qdKktFAtejd9FdFMaFx6lrP5rmLz4sN3Kplcg==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@types/codemirror": { + "version": "0.0.108", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", + "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", + "dev": true, + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/common-tags": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.1.tgz", + "integrity": "sha512-20R/mDpKSPWdJs5TOpz3e7zqbeCNuMCPhV7Yndk9KU2Rbij2r5W4RzwDPkzC+2lzUqXYu9rFzTktCBnDjHuNQg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz", + "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/tern": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", + "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + }, + "node_modules/dayjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", + "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", + "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.47", + "esbuild-android-arm64": "0.14.47", + "esbuild-darwin-64": "0.14.47", + "esbuild-darwin-arm64": "0.14.47", + "esbuild-freebsd-64": "0.14.47", + "esbuild-freebsd-arm64": "0.14.47", + "esbuild-linux-32": "0.14.47", + "esbuild-linux-64": "0.14.47", + "esbuild-linux-arm": "0.14.47", + "esbuild-linux-arm64": "0.14.47", + "esbuild-linux-mips64le": "0.14.47", + "esbuild-linux-ppc64le": "0.14.47", + "esbuild-linux-riscv64": "0.14.47", + "esbuild-linux-s390x": "0.14.47", + "esbuild-netbsd-64": "0.14.47", + "esbuild-openbsd-64": "0.14.47", + "esbuild-sunos-64": "0.14.47", + "esbuild-windows-32": "0.14.47", + "esbuild-windows-64": "0.14.47", + "esbuild-windows-arm64": "0.14.47" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", + "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", + "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", + "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", + "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-envfile-plugin": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/esbuild-envfile-plugin/-/esbuild-envfile-plugin-1.0.3.tgz", + "integrity": "sha512-opLaUmrg0uSxnd7tETPw/OxzjniY3SOXWYaWFm86a97/U/I9YiVk4cWXlCf+GDdKiS5lGjUjkzOtGmMV9hJYuw==", + "dev": true, + "dependencies": { + "dotenv": "10.0.0" + } + }, + "node_modules/esbuild-envfile-plugin/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", + "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", + "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", + "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", + "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", + "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", + "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", + "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", + "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", + "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", + "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", + "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", + "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-plugin-copy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-copy/-/esbuild-plugin-copy-1.6.0.tgz", + "integrity": "sha512-wN1paBCoE0yRBl9ZY3ZSD6SxGE4Yfr0Em7zh2yTbJv1JaHEIR3FYYN7HU6F+j/peSaGZJNSORSGxJ5QX1a1Sgg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^10.0.1", + "globby": "^11.0.3" + }, + "peerDependencies": { + "esbuild": ">= 0.14.0" + } + }, + "node_modules/esbuild-plugin-copy/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/esbuild-plugin-copy/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/esbuild-plugin-copy/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/esbuild-plugin-copy/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/esbuild-plugin-copy/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esbuild-plugin-copy/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", + "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", + "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", + "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", + "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/hamt_plus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", + "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/monkey-around": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/monkey-around/-/monkey-around-2.3.0.tgz", + "integrity": "sha512-QWcCUWjqE/MCk9cXlSKZ1Qc486LD439xw/Ak8Nt6l2PuL9+yrc9TJakt7OHDuOqPRYY4nTWBAEFKn32PE/SfXA==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obsidian": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-0.16.3.tgz", + "integrity": "sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==", + "dev": true, + "dependencies": { + "@types/codemirror": "0.0.108", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-analyzer": { + "version": "0.1.1-alpha.2", + "resolved": "https://registry.npmjs.org/range-analyzer/-/range-analyzer-0.1.1-alpha.2.tgz", + "integrity": "sha512-Ad9J4t3zljH/DHNSDthAFyQdd5DniHTaqES/oTwAFB7prV7E4u01et6WYCpqbJSmUDC05XlMMR2ycO84Hi1IvA==" + }, + "node_modules/react": { + "name": "@preact/compat", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", + "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", + "peerDependencies": { + "preact": "*" + } + }, + "node_modules/react-dom": { + "name": "@preact/compat", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", + "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", + "peerDependencies": { + "preact": "*" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-window": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.8.tgz", + "integrity": "sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-window/node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/recoil": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.4.1.tgz", + "integrity": "sha512-vp6KPwlHOjJ4bJofmdDchmgI9ilMTCoUisK8/WYLl8dThH7e7KmtZttiLgvDb2Em99dUfTEsk8vT8L1nUMgqXQ==", + "dependencies": { + "hamt_plus": "1.0.2" + }, + "peerDependencies": { + "react": ">=16.13.1" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-mod": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", + "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + } + }, + "dependencies": { + "@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "requires": { + "regenerator-runtime": "^0.13.10" + } + }, + "@codemirror/language": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.3.1.tgz", + "integrity": "sha512-MK+G1QKaGfSEUg9YEFaBkMBI6j1ge4VMBPZv9fDYotw7w695c42x5Ba1mmwBkesYnzYFBfte6Hh9TDcKa6xORQ==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "@codemirror/state": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.3.tgz", + "integrity": "sha512-0Rn7vadZ6EgHaKdIOwyhBWLdPDh1JM5USYqXjxwrvpmTKWu4wQ77twgAYEg1MU282XcrnV4ZqFf+00bu6UPCyg==" + }, + "@codemirror/view": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.5.0.tgz", + "integrity": "sha512-dapE7AywjyYoHBHn4n+wCRKFqMEmYZHHlfyoSO+e1P6MK4az1wg9t7mfwbdI9mXuBzmPBX7NmU3Xmq+qmxDOLw==", + "requires": { + "@codemirror/state": "^6.0.0", + "style-mod": "^4.0.0", + "w3c-keyname": "^2.2.4" + } + }, + "@dnd-kit/core": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.0.5.tgz", + "integrity": "sha512-3nL+Zy5cT+1XwsWdlXIvGIFvbuocMyB4NBxTN74DeBaBqeWdH9JsnKwQv7buZQgAHmAH+eIENfS1ginkvW6bCw==", + "requires": { + "@dnd-kit/accessibility": "^3.0.0", + "@dnd-kit/utilities": "^3.2.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "@dnd-kit/accessibility": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.0.1.tgz", + "integrity": "sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@dnd-kit/utilities": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.0.tgz", + "integrity": "sha512-h65/pn2IPCCIWwdlR2BMLqRkDxpTEONA+HQW3n765HBijLYGyrnTCLa2YQt8VVjjSQD6EfFlTE6aS2Q/b6nb2g==", + "requires": { + "tslib": "^2.0.0" + } + } + } + }, + "@dnd-kit/sortable": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-7.0.1.tgz", + "integrity": "sha512-n77qAzJQtMMywu25sJzhz3gsHnDOUlEjTtnRl8A87rWIhnu32zuP+7zmFjwGgvqfXmRufqiHOSlH7JPC/tnJ8Q==", + "requires": { + "@dnd-kit/utilities": "^3.2.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "@dnd-kit/utilities": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.0.tgz", + "integrity": "sha512-h65/pn2IPCCIWwdlR2BMLqRkDxpTEONA+HQW3n765HBijLYGyrnTCLa2YQt8VVjjSQD6EfFlTE6aS2Q/b6nb2g==", + "requires": { + "tslib": "^2.0.0" + } + } + } + }, + "@lezer/common": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.1.tgz", + "integrity": "sha512-8TR5++Q/F//tpDsLd5zkrvEX5xxeemafEaek7mUp7Y+bI8cKQXdSqhzTOBaOogETcMOVr0pT3BBPXp13477ciw==" + }, + "@lezer/highlight": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.2.tgz", + "integrity": "sha512-CAun1WR1glxG9ZdOokTZwXbcwB7PXkIEyZRUMFBVwSrhTcogWq634/ByNImrkUnQhjju6xsIaOBIxvcRJtplXQ==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@lezer/lr": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.4.tgz", + "integrity": "sha512-L/52/oMJBFXXx8qBYF4UgktLP2geQ/qn5Fd8+5L/mqlLLCB9+qdKktFAtejd9FdFMaFx6lrP5rmLz4sN3Kplcg==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "peer": true + }, + "@types/codemirror": { + "version": "0.0.108", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", + "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", + "dev": true, + "requires": { + "@types/tern": "*" + } + }, + "@types/common-tags": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.1.tgz", + "integrity": "sha512-20R/mDpKSPWdJs5TOpz3e7zqbeCNuMCPhV7Yndk9KU2Rbij2r5W4RzwDPkzC+2lzUqXYu9rFzTktCBnDjHuNQg==", + "dev": true + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz", + "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/tern": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", + "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + }, + "dayjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", + "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true + }, + "esbuild": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", + "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", + "dev": true, + "requires": { + "esbuild-android-64": "0.14.47", + "esbuild-android-arm64": "0.14.47", + "esbuild-darwin-64": "0.14.47", + "esbuild-darwin-arm64": "0.14.47", + "esbuild-freebsd-64": "0.14.47", + "esbuild-freebsd-arm64": "0.14.47", + "esbuild-linux-32": "0.14.47", + "esbuild-linux-64": "0.14.47", + "esbuild-linux-arm": "0.14.47", + "esbuild-linux-arm64": "0.14.47", + "esbuild-linux-mips64le": "0.14.47", + "esbuild-linux-ppc64le": "0.14.47", + "esbuild-linux-riscv64": "0.14.47", + "esbuild-linux-s390x": "0.14.47", + "esbuild-netbsd-64": "0.14.47", + "esbuild-openbsd-64": "0.14.47", + "esbuild-sunos-64": "0.14.47", + "esbuild-windows-32": "0.14.47", + "esbuild-windows-64": "0.14.47", + "esbuild-windows-arm64": "0.14.47" + } + }, + "esbuild-android-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", + "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", + "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", + "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", + "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", + "dev": true, + "optional": true + }, + "esbuild-envfile-plugin": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/esbuild-envfile-plugin/-/esbuild-envfile-plugin-1.0.3.tgz", + "integrity": "sha512-opLaUmrg0uSxnd7tETPw/OxzjniY3SOXWYaWFm86a97/U/I9YiVk4cWXlCf+GDdKiS5lGjUjkzOtGmMV9hJYuw==", + "dev": true, + "requires": { + "dotenv": "10.0.0" + }, + "dependencies": { + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + } + } + }, + "esbuild-freebsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", + "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", + "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", + "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", + "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", + "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", + "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", + "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", + "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", + "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", + "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", + "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", + "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", + "dev": true, + "optional": true + }, + "esbuild-plugin-copy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-copy/-/esbuild-plugin-copy-1.6.0.tgz", + "integrity": "sha512-wN1paBCoE0yRBl9ZY3ZSD6SxGE4Yfr0Em7zh2yTbJv1JaHEIR3FYYN7HU6F+j/peSaGZJNSORSGxJ5QX1a1Sgg==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "fs-extra": "^10.0.1", + "globby": "^11.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "esbuild-sunos-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", + "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", + "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", + "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", + "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", + "dev": true, + "optional": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "hamt_plus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", + "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true + }, + "monkey-around": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/monkey-around/-/monkey-around-2.3.0.tgz", + "integrity": "sha512-QWcCUWjqE/MCk9cXlSKZ1Qc486LD439xw/Ak8Nt6l2PuL9+yrc9TJakt7OHDuOqPRYY4nTWBAEFKn32PE/SfXA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "obsidian": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-0.16.3.tgz", + "integrity": "sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==", + "dev": true, + "requires": { + "@types/codemirror": "0.0.108", + "moment": "2.29.4" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "peer": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-analyzer": { + "version": "0.1.1-alpha.2", + "resolved": "https://registry.npmjs.org/range-analyzer/-/range-analyzer-0.1.1-alpha.2.tgz", + "integrity": "sha512-Ad9J4t3zljH/DHNSDthAFyQdd5DniHTaqES/oTwAFB7prV7E4u01et6WYCpqbJSmUDC05XlMMR2ycO84Hi1IvA==" + }, + "react": { + "version": "npm:@preact/compat@17.1.2", + "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", + "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", + "requires": {} + }, + "react-dom": { + "version": "npm:@preact/compat@17.1.2", + "resolved": "https://registry.npmjs.org/@preact/compat/-/compat-17.1.2.tgz", + "integrity": "sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==", + "requires": {} + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + } + }, + "react-window": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.8.tgz", + "integrity": "sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "dependencies": { + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + } + } + }, + "recoil": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.4.1.tgz", + "integrity": "sha512-vp6KPwlHOjJ4bJofmdDchmgI9ilMTCoUisK8/WYLl8dThH7e7KmtZttiLgvDb2Em99dUfTEsk8vT8L1nUMgqXQ==", + "requires": { + "hamt_plus": "1.0.2" + } + }, + "regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "style-mod": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", + "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "w3c-keyname": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4e6479e --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "make-md", + "version": "0.5.0", + "description": "This plugin allows you to have an alternative file tree view.", + "main": "main.js", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "demo": "node esbuild.config.mjs demo", + "version": "node version-bump.mjs && git add manifest.json versions.json" + }, + "keywords": [], + "author": "", + "license": "MIT", + "devDependencies": { + "@types/common-tags": "^1.8.1", + "@types/node": "^14.14.37", + "@types/react": "17.0.2", + "@types/react-dom": "^18.0.8", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.5", + "builtin-modules": "3.3.0", + "cross-env": "^7", + "dotenv": "^16.0.3", + "esbuild": "^0.14.47", + "esbuild-envfile-plugin": "^1.0.3", + "esbuild-plugin-copy": "^1.6.0", + "obsidian": "^0.16.3", + "prop-types": "^15.7.2", + "tslib": "^2.2.0", + "typescript": "^4.2.4" + }, + "dependencies": { + "@codemirror/language": "^6.3.0", + "@dnd-kit/core": "^6.0.5", + "@dnd-kit/sortable": "^7.0.1", + "@lezer/common": "^1.0.1", + "classnames": "^2.3.2", + "common-tags": "^1.8.2", + "dayjs": "^1.10.7", + "monkey-around": "^2.3.0", + "range-analyzer": "^0.1.1-alpha.2", + "react": "npm:@preact/compat@^17.0.2", + "react-dom": "npm:@preact/compat@^17.0.2", + "react-popper": "^2.3.0", + "react-window": "^1.8.8", + "recoil": "^0.4.1" + } +} diff --git a/src/cm-extensions/cmExtensions.ts b/src/cm-extensions/cmExtensions.ts new file mode 100644 index 0000000..698758e --- /dev/null +++ b/src/cm-extensions/cmExtensions.ts @@ -0,0 +1,43 @@ +import { atomicSelect } from "./flowEditor/atomic"; +import { flowIDStateField, flowTypeStateField } from "./markSans/callout"; +import { flowEditorField, flowEditorInfo, internalLinkHover, preloadFlowEditor } from "./flowEditor/flowEditor"; +import { hrField, hrResetFix } from "./markSans/hr"; +import { toggleMarkExtension } from "./inlineStylerView/marks"; +import { makerDelete, makerSelect } from "./markSans/selection"; +import { editBlockExtensions } from "./flowEditor/selectiveEditor"; +import { cursorTooltip } from "./inlineStylerView/inlineStyler"; +import { flowViewUpdates } from "./flowEditor/flowViewUpdates"; +import { placeholder } from "./placeholder"; +import MakeMDPlugin from "main"; +import { tooltips } from "./tooltip"; + +export const cmExtensions = (plugin: MakeMDPlugin, mobile: boolean) => +{ + let extensions = [toggleMarkExtension, tooltips({parent: document.body})]; + if (!mobile && plugin.settings.inlineStyler) { + extensions.push(cursorTooltip()); + } + if (plugin.settings.markSans) { + if (!mobile) { + extensions.push( + hrResetFix, + makerSelect, + makerDelete, + hrField) + } + } + if (plugin.settings.makeMenuPlaceholder) + extensions.push(placeholder); + if (plugin.settings.editorFlow) { + extensions.push(flowTypeStateField, + atomicSelect, + editBlockExtensions(), + preloadFlowEditor, + flowEditorField, + flowEditorInfo, + flowIDStateField, + internalLinkHover, + flowViewUpdates) + } + return extensions; +}; \ No newline at end of file diff --git a/src/cm-extensions/flowEditor/atomic.ts b/src/cm-extensions/flowEditor/atomic.ts new file mode 100644 index 0000000..fa4ce76 --- /dev/null +++ b/src/cm-extensions/flowEditor/atomic.ts @@ -0,0 +1,56 @@ +import { Range, EditorState, Transaction, EditorSelection, TransactionSpec, StateField, RangeSetBuilder, Annotation } from '@codemirror/state'; +import { + keymap, EditorView, +} from '@codemirror/view'; +import { info } from 'console'; +import { focusFlowEditor, focusFlowEditorParent } from 'dispatch/flowDispatch'; +import { flowIDStateField } from '../markSans/callout'; +import { flowEditorField, flowEditorInfo } from './flowEditor'; +import { lineRangeToPosRange, selectiveLinesFacet } from './selectiveEditor'; + +//Handle selection and keyboard events for floweditor + +export const arrowKeyAnnotation = Annotation.define(); + + +export const atomicSelect = EditorState.transactionFilter.of((tr:Transaction) => { + if (tr.isUserEvent('delete') || tr.isUserEvent('input')) { + return tr; + } + const flowID = tr.startState.field(flowIDStateField, false); + if (tr.annotation(arrowKeyAnnotation) && flowID) { + + const oldSel = tr.startState.selection.main; + const lineRange = tr.state.field(selectiveLinesFacet, false) + const posRange = lineRange && lineRange[0] != undefined ? lineRangeToPosRange(tr.startState, lineRange) : { from: 0, to: tr.startState.doc.length}; + if (oldSel.from <= posRange.from && tr.annotation(arrowKeyAnnotation) == 3) { + focusFlowEditorParent(flowID, true); + } + if (oldSel.to >= posRange.to && tr.annotation(arrowKeyAnnotation) == 4) { + focusFlowEditorParent(flowID, false); + } + return tr; + } + const selection = tr.newSelection.main + if (selection.from == 0 && selection.to == 0 || selection.from != selection.to) + return tr; + const flowEditors = tr.state.field(flowEditorInfo, false); + if (flowEditors) { + for (let info of flowEditors) { + if (info.embed == 1) { + if (info.from-3 <= selection.from && info.to+2 >= selection.to && info.expandedState == 2) { + + const top = tr.annotation(arrowKeyAnnotation) == 1 || tr.startState.selection.main.from > selection.from ? false : true; + focusFlowEditor(info.id, top); + return { + selection: EditorSelection.single(info.from-4) + } + break; + } + } + } + } + +// return tr; + return tr; +}); \ No newline at end of file diff --git a/src/cm-extensions/flowEditor/flowEditor.tsx b/src/cm-extensions/flowEditor/flowEditor.tsx new file mode 100644 index 0000000..331a1b0 --- /dev/null +++ b/src/cm-extensions/flowEditor/flowEditor.tsx @@ -0,0 +1,284 @@ + +import {Decoration, WidgetType, DecorationSet, EditorView,} from '@codemirror/view' +import {StateField, RangeSetBuilder, Annotation, EditorState, Transaction, TransactionSpec, EditorSelection, SelectionRange} from '@codemirror/state' +import { syntaxTree } from '@codemirror/language' +import {iterateTreeInDocument, iterateTreeInSelection} from 'utils/codemirror' +import { genId } from 'components/FlowEditor/FlowEditor'; +import { flowTypeStateField } from '../markSans/callout'; +import {Tooltip, hoverTooltip} from "cm-extensions/tooltip" +import React from 'react' +import ReactDOM from 'react-dom' +import { createRoot } from 'react-dom/client' +import { loadFlowEditorByDOM } from 'utils/flowEditor'; +import { info } from 'console'; +import { openFile } from 'utils/utils'; +import { openFileFlowEditor } from 'dispatch/flowDispatch'; +import { FlowEditorHover } from 'components/FlowEditor/FlowEditorHover'; +import { MarkdownView } from 'obsidian'; +import t from 'i18n' +import { uiIconSet } from 'utils/icons'; + +//flow editor + +export interface FlowEditorInfo { + id: string; + link: string; + from: number; + to: number; + height: number; + embed: number; + startOfLineFix: boolean; + expandedState: number; //0 is closed, 1 is autoopen (prevent infinite nesting), 2 is open, move to enum +} + +export const toggleFlowEditor = Annotation.define<[id: string, state: number]>(); +export const cacheFlowEditorHeight = Annotation.define<[id: string, height: number]>(); + +export const preloadFlowEditor = EditorState.transactionFilter.of((tr:Transaction) => { + + let newTrans = [] as TransactionSpec[]; + const value = tr.state.field(flowEditorInfo, false); + if (value && !tr.annotation(toggleFlowEditor)) { + newTrans.push(...value.filter(f => f.expandedState == 1).map(f => { + if (tr.state.field(flowTypeStateField) == 'doc') { + return { + annotations: toggleFlowEditor.of([f.id, 2]) + } + } else { + return { + annotations: toggleFlowEditor.of([f.id, 0]) + } + } + })) + } + return [tr, ...newTrans]; +}); + + +export const internalLinkHover = hoverTooltip((view, pos, side) => { + let {from: lineFrom, to: lineTo, text} = view.state.doc.lineAt(pos) + let hovObject = null; + iterateTreeInSelection({from: lineFrom, to: lineTo}, view.state, { + enter: ({name, from, to}) => { + if (name.contains('hmd-internal-link') && pos <= to && pos >= from) { + const stateField = view.state.field(flowEditorInfo, false); + const info = stateField.find(f => f.to == to); + if (info) { + hovObject = { + pos: pos-5, + end: to, + above: true, + create(view: EditorView) { + let dom = document.createElement("div") + dom.toggleClass('mk-flow-hover', true); + dom.toggleClass('menu', true); + const openHoverDiv = dom.createDiv(); + openHoverDiv.setAttribute('aria-label', info.expandedState == 0 ? t.buttons.openFlow : t.buttons.hideFlow) + openHoverDiv.addEventListener('click', () => { + view.dispatch({ + annotations: toggleFlowEditor.of([info.id, 2]) + }); + }); + const icon = openHoverDiv.createDiv(); + icon.innerHTML = uiIconSet['mk-ui-flow-hover']; + openHoverDiv.insertAdjacentText('beforeend', info.expandedState == 0 ? t.buttons.openFlow : t.buttons.hideFlow) + return {dom} + } + } + return false; + } + } + } + }) + + return hovObject + }) + + const findFullInternalLink = (posA: number, posB:number, state: EditorState) : SelectionRange | null => { + let {text, from, length} = state.doc.lineAt(posA) + let start = posA - from+1, end = posB - from-1 + while (start > 0) { + let prev = start-1 + if ((text.slice(prev, start)) == '[') break + start = prev + } + while (end < length) { + let next = end+1 + if ((text.slice(end, next)) == ']') break + end = next + } + return start == end ? null : EditorSelection.range(start + from, end + from) + } +export const flowEditorInfo = StateField.define({ + create() { + return []; + }, + update(value, tr) { + let newValues = [] as FlowEditorInfo[]; + const previous = value; + let usedContainers : string[] = []; + let nameContainers : string[] = []; + iterateTreeInDocument(tr.state, { + enter: ({name, from, to}) => { + if (name.contains('hmd-internal-link')) { + nameContainers.push(name) + const fullRange = findFullInternalLink(from, to, tr.state); + const link = tr.state.sliceDoc(fullRange.from, fullRange.to); + const existingLinks = previous.filter(f => f.link == link); + const offset = usedContainers.filter(f => f == link).length; + const existingInfo = existingLinks[offset]; + + const id = existingInfo ? existingInfo.id : genId(8); + + let listEmbed = false; + const embedOverride = tr.state.sliceDoc(fullRange.from-4, fullRange.from-3) == '!'; + const embedType = name.contains('hmd-embed') ? embedOverride ? 1 : 2 : 0; + // if (embedType == 1) { + // iterateTreeInSelection({from: fullRange.from-5, to: fullRange.from-5}, tr.state, {enter: + // (node) => { + // if (node.name.contains('formatting-task') || node.name.contains('formatting-list')) { + // listEmbed = true; + // } + // } + // }) + // } + const reverseExpandedState = (state: number) => + { + const news = state != 2 ? 2 : 0 + return news; + }; + + usedContainers.push(link); + const info = { + id: id, + link: tr.state.sliceDoc(fullRange.from, fullRange.to), + startOfLineFix: listEmbed, + from: fullRange.from, + to: fullRange.to, + embed: embedType, + height: existingInfo ? tr.annotation(cacheFlowEditorHeight)?.[0] == id && tr.annotation(cacheFlowEditorHeight)?.[1] != 0 ? tr.annotation(cacheFlowEditorHeight)?.[1] : existingInfo.height : -1, + expandedState: existingInfo ? tr.annotation(toggleFlowEditor)?.[0] == id ? reverseExpandedState(existingInfo.expandedState) : + existingInfo.expandedState : embedType >= 1 ? 1 : 0, + } + newValues.push(info); + } + } + }) + return newValues; + } +}) + +const flowEditorRangeset = (state: EditorState) => { + let builder = new RangeSetBuilder() + const infoFields = state.field(flowEditorInfo) + for (let info of infoFields) { + + const {from, to, embed: embedType, expandedState} = info; + const lineFix = from-3 == state.doc.lineAt(from).from && to+2 == state.doc.lineAt(from).to + if (expandedState == 2) { + if (embedType == 1) { + if (!((state.selection.main.from == from-4 && state.selection.main.to == to+2) || (state.selection.main.from >= from-3 && state.selection.main.to <= to+1))) { + builder.add(from-4, from-3, flowEditorSelector(info)) + if (lineFix) { + builder.add(from-3, to+2, flowEditorWidgetDecoration(info)) + } else { + builder.add(from-3, to+2, flowEditorDecoration(info)) + } + + } + } else if (embedType == 0) { + //if (!(tr.newSelection.main.from >= from+2 && tr.newSelection.main.to <= to-2)) { + builder.add(to+2, to+2, flowEditorDecoration(info)) + //} + } + } + } + const dec = builder.finish() + return dec; +} + +export const flowEditorField = StateField.define({ + + create(state) { + return flowEditorRangeset(state) + }, + update(value, tr) { + return flowEditorRangeset(tr.state) + + }, + provide: f => EditorView.decorations.from(f) + }) + + +class FlowEditorWidget extends WidgetType { + constructor(readonly info: FlowEditorInfo) { + super(); + } + + eq(other: WidgetType) { + return (other as unknown as FlowEditorWidget).info.id === this.info.id; + } + + toDOM(view: EditorView) { + const div = document.createElement('div'); + div.toggleClass('mk-floweditor-container', true) + div.toggleClass('mk-floweditor-fix', this.info.startOfLineFix) + div.setAttribute('id', "mk-flow-"+this.info.id) + const placeholder = div.createDiv('mk-floweditor-placeholder'); + placeholder.style.setProperty("height", this.info.height+'px') + loadFlowEditorByDOM(div, view, this.info.id) + return div; + } + get estimatedHeight(): number { + return this.info.height; + } + } + + class FlowEditorSelector extends WidgetType { + constructor(readonly info: FlowEditorInfo) { + super(); + } + + eq(other: WidgetType) { + return false; + } + + toDOM(view: EditorView) { + const div = document.createElement('div'); + div.toggleClass('mk-floweditor-selector', true) + const reactEl = createRoot(div); + reactEl.render( { + view.dispatch({ + changes:{from:this.info.from-4, to:this.info.from-3} + }); + }} openLink={() => { + app.workspace.iterateLeaves((leaf) => { + const cm = (leaf.view as MarkdownView).editor?.cm as EditorView + if (cm && view.dom == cm.dom) { + openFileFlowEditor(this.info.link, (leaf.view as MarkdownView).file?.path); + // return true; + } + }, app.workspace["rootSplit"]!) + + }} + >) + return div; + } + } + + export const flowEditorSelector = (info: FlowEditorInfo) => Decoration.replace({ + widget: new FlowEditorSelector(info), + inclusive: true, + block: false, + }) + + export const flowEditorDecoration = (info: FlowEditorInfo) => Decoration.replace({ + widget: new FlowEditorWidget(info), + inclusive: true, + block: false, + }) + + export const flowEditorWidgetDecoration = (info: FlowEditorInfo) => Decoration.widget({ + widget: new FlowEditorWidget(info), + block: true, + }) diff --git a/src/cm-extensions/flowEditor/flowViewUpdates.ts b/src/cm-extensions/flowEditor/flowViewUpdates.ts new file mode 100644 index 0000000..23a9fae --- /dev/null +++ b/src/cm-extensions/flowEditor/flowViewUpdates.ts @@ -0,0 +1,46 @@ +import { ViewUpdate, EditorView } from '@codemirror/view' +import { flowIDStateField, flowTypeStateField, portalTypeAnnotation } from 'cm-extensions/markSans/callout'; +import { MarkdownView } from 'obsidian'; +import { loadFlowEditorsForLeaf } from 'utils/flowEditor'; +import { cacheFlowEditorHeight, flowEditorInfo, toggleFlowEditor } from './flowEditor'; + +//flow view editor viewupdates + +export const flowViewUpdates = EditorView.updateListener.of((v:ViewUpdate) => { + + if (v.heightChanged ) { + app.workspace.iterateRootLeaves((leaf) => { + const cm = (leaf.view as MarkdownView).editor?.cm as EditorView + + if (cm && v.view.dom == cm.dom && cm.state.field(flowTypeStateField, false)) { + if(leaf.containerEl.parentElement?.hasClass('workspace-tab-container')) { + if (cm.state.field(flowTypeStateField, false) != 'doc') { + cm.dispatch({ + annotations: portalTypeAnnotation.of('doc') + }); + } + } + } + }) + } + if (v.heightChanged) { + const flowID = v.state.field(flowIDStateField, false); + if (flowID) { + app.workspace.iterateLeaves((leaf) => { + const cm = (leaf.view as MarkdownView).editor?.cm as EditorView + if (cm) { + const stateField = cm.state.field(flowEditorInfo, false); + if (stateField) { + if(stateField.find(f => f.id == flowID)){ + cm.dispatch({ + annotations: cacheFlowEditorHeight.of([flowID, v.view.contentHeight]) + }) + } + } + } + }, app.workspace["rootSplit"]!) + } + + + } +}); \ No newline at end of file diff --git a/src/cm-extensions/flowEditor/selectiveEditor.ts b/src/cm-extensions/flowEditor/selectiveEditor.ts new file mode 100644 index 0000000..dfa9e10 --- /dev/null +++ b/src/cm-extensions/flowEditor/selectiveEditor.ts @@ -0,0 +1,158 @@ +import { EditorState, Extension, Transaction, Annotation, StateField, RangeSetBuilder } from "@codemirror/state"; +import { EditorView, Decoration, DecorationSet, } from "@codemirror/view"; +import { getAvailableRanges } from "range-analyzer"; + +export const editableRange = Annotation.define<[number | undefined, number | undefined]>(); +export const hiddenLine = Decoration.replace({inclusive: true}) + +//partial note editor + +export const hideLine = StateField.define({ + create() { + return Decoration.none + }, + update(value, tr) { + let builder = new RangeSetBuilder() + + if (tr.state.field(selectiveLinesFacet)?.[0] != undefined) { + builder.add(tr.state.doc.line(1).from, + tr.state.doc.line(tr.state.field(selectiveLinesFacet)[0]).from, hiddenLine); + builder.add(tr.state.doc.line(tr.state.field(selectiveLinesFacet)[1]).to, + tr.state.doc.line(tr.newDoc.lines).to, hiddenLine); + } + const dec = builder.finish() + return dec; + }, + provide: f => EditorView.decorations.from(f) +}) + + + export const selectiveLinesFacet = StateField.define<[number | undefined, number | undefined]>({ + create: () => [undefined, undefined], + update(value, tr) { + if (tr.annotation(editableRange)) { + if (tr.annotation(editableRange)[0]) { + return [tr.annotation(editableRange)[0], Math.min(tr.state.doc.lines, tr.annotation(editableRange)[1])]; + } + return tr.annotation(editableRange) + } + return value; + }, + +}) + +export const lineRangeToPosRange = (state: EditorState, range: [number, number]) => { + return { + from: state.doc.line(range[0]).from, + to: state.doc.line(range[1]+1).from, + } +} + +export const smartDelete = EditorState.transactionFilter.of((tr:Transaction) => { + if(tr.isUserEvent('delete') && !tr.isUserEvent('delete.smart')){ + + const initialSelections = tr.startState.selection.ranges.map(range => ({ + from: range.from, + to: range.to + })) + + if(initialSelections.length > 0 && tr.startState.field(selectiveLinesFacet)?.[0]) + { + const posRange = lineRangeToPosRange(tr.startState, tr.startState.field(selectiveLinesFacet)); + + tr.startState.update( + { + changes:{ + from:Math.max(posRange.from, initialSelections[0].from), + to:Math.min(posRange.to, initialSelections[0].to), + }, + annotations: Transaction.userEvent.of(`${tr.annotation(Transaction.userEvent)}.smart`) + }); + } + + } + return tr; + + }) + + export const preventModifyTargetRanges = EditorState.transactionFilter.of((tr:Transaction) => { + +let newTrans = []; + try{ + const selectiveLines = tr.startState.field(selectiveLinesFacet) + + + if (tr.isUserEvent('input') || tr.isUserEvent('delete') || tr.isUserEvent('move')) { + if (selectiveLines?.[0]) { + const posRange = lineRangeToPosRange(tr.startState, tr.startState.field(selectiveLinesFacet)); + if (tr.changes.touchesRange(0, posRange.from-1) || !tr.changes.touchesRange(posRange.from, posRange.to)) { + return []; + } + } + } + if (tr.state.doc.lines != tr.startState.doc.lines) { + + + const numberNewLines = tr.state.doc.lines-tr.startState.doc.lines; + if (selectiveLines?.[0]) { + const posRange = lineRangeToPosRange(tr.startState, tr.startState.field(selectiveLinesFacet)); + if (tr.changes.touchesRange(0, posRange.from-1)) { + newTrans.push( + { + annotations: [editableRange.of([selectiveLines[0]+numberNewLines, selectiveLines[1]+numberNewLines])] + }) + } else + if (tr.changes.touchesRange(posRange.from-1, posRange.to)) { + newTrans.push( + { + annotations: [editableRange.of([selectiveLines[0], selectiveLines[1]+numberNewLines])] + }); + } + } + } + + +} +catch(e){ + return []; +} +return [tr, ...newTrans]; + }); + + export const smartPaste = (getReadOnlyRanges:(targetState:EditorState)=>Array<{from:number|undefined, to:number|undefined}>) => EditorView.domEventHandlers({ + + paste(event, view) + { + + const clipboardData = event.clipboardData || (window as any).clipboardData; + const pastedData = clipboardData.getData('Text'); + const initialSelections = view.state.selection.ranges.map(range => ({ + from: range.from, + to: range.to + })); + + if(initialSelections.length > 0) + { + const readOnlyRanges = getReadOnlyRanges(view.state); + const result = getAvailableRanges(readOnlyRanges, initialSelections[0], {from: 0, to: view.state.doc.line(view.state.doc.lines).to}) as Array<{from:number, to:number}>; + if(result.length > 0) + { + view.dispatch( + { + changes:{ + from: result[0].from, + to: result[0].to, + insert: pastedData + }, + annotations: Transaction.userEvent.of(`input.paste.smart`) + }) + } + } + } + + }) + + + const readOnlyRangesExtension = [smartDelete, preventModifyTargetRanges]; + export const editBlockExtensions = () => [readOnlyRangesExtension, hideLine, selectiveLinesFacet] + export default readOnlyRangesExtension; \ No newline at end of file diff --git a/src/cm-extensions/inlineStylerView/InlineMenu.tsx b/src/cm-extensions/inlineStylerView/InlineMenu.tsx new file mode 100644 index 0000000..47ae6e0 --- /dev/null +++ b/src/cm-extensions/inlineStylerView/InlineMenu.tsx @@ -0,0 +1,146 @@ + +import MakeMDPlugin from "main" +import { renderToStaticMarkup } from "react-dom/server" +import * as ReactDOM from 'react-dom'; +import React, { useEffect, useMemo, useState } from 'react' +import { EditorView } from '@codemirror/view' +import 'css/InlineMenu.css' +import t from "i18n" +import { resolveStyles, InlineStyle } from "./styles"; +import { toggleMark } from "cm-extensions/inlineStylerView/marks"; +import { createRoot } from "react-dom/client"; +import { getActiveCM, getActiveMarkdownView } from "utils/codemirror"; +import { platformIsMobile } from "utils/utils"; +import { Mark } from "./Mark"; +import { markIconSet, uiIconSet } from "utils/icons"; +import MakeMenu from "components/MakeMenu/MakeMenu"; +import classNames from "classnames"; + +export const loadStylerIntoContainer = (el: HTMLElement) => { + // el.removeChild(el.querySelector('.mobile-toolbar-options-container')) + const root = createRoot(el) + root.render() +} + +export const InlineMenuComponent: React.FC <{cm?: EditorView, activeMarks: string[], mobile: boolean}> = (props) => { + const [mode, setMode] = useState(props.mobile ? 0 : 1); + const [colorMode, setColorMode] = useState<{prefix: string, suffix: string, closeTag: string} | null>(null); + + const colors = ['#eb3b5a', '#fa8231', '#f7b731', '#20bf6b', '#0fb9b1', '#2d98da', '#3867d6', '#8854d0', '#4b6584'] + const makeMenu = (e: React.MouseEvent) => { + e.preventDefault(); + const cm = props.cm ?? getActiveCM(); + if (!cm) + return; + const end = cm.state.selection.main.to; + const insertChars = cm.state.sliceDoc(end-1, end) == cm.state.lineBreak ? window.make.settings.menuTriggerChar : cm.state.lineBreak+window.make.settings.menuTriggerChar; + cm.dispatch({ + changes: { + from: end, to: end, insert: insertChars + }, selection: { + head: end+insertChars.length, + anchor: end+insertChars.length, + } + }) + } + const toggleMarkAction = (e: React.MouseEvent, s: InlineStyle) => { + e.preventDefault(); + const cm = props.cm ?? getActiveCM(); + if (!cm) + return; + if (s.mark) { + cm.dispatch({ + annotations: toggleMark.of(s.mark) + }) + return; + } + const selection = cm.state.selection.main + const selectedText = cm.state.sliceDoc(selection.from, selection.to) + // cm.focus(); + cm.dispatch({ + changes: {from: selection.from, to: selection.to, insert: s.value.substring(0, s.insertOffset)+selectedText+s.value.substring(s.insertOffset)}, + selection: s.cursorOffset ? + {anchor: selection.from+s.value.substring(0, s.insertOffset).length+selectedText.length+s.cursorOffset, head: selection.from+s.value.substring(0, s.insertOffset).length+selectedText.length+s.cursorOffset} + : + {anchor: selection.from+s.value.substring(0, s.insertOffset).length, head: selection.from+s.value.substring(0, s.insertOffset).length+selectedText.length}}) + } + + const makeMode = () => <> +
{ + makeMenu(e); + }} className='mk-mark' dangerouslySetInnerHTML={{__html: markIconSet['mk-make-slash']}}> +
+
{ + setMode(1); + }} className='mk-mark' dangerouslySetInnerHTML={{__html: markIconSet['mk-make-style']}}> +
+
{ + const view = getActiveMarkdownView(); + window.make.app.commands.commands['editor:attach-file'].editorCallback(view.editor, view) + }} className='mk-mark' dangerouslySetInnerHTML={{__html: markIconSet['mk-make-attach']}}> +
+
{ + const view = getActiveMarkdownView(); + window.make.app.commands.commands['editor:toggle-keyboard'].editorCallback(view.editor, view) + }} className='mk-mark' dangerouslySetInnerHTML={{__html: markIconSet['mk-make-keyboard']}}> +
+ + +const colorsMode = () => <> +
{ + setColorMode(null); + setMode(1); + }} dangerouslySetInnerHTML={{__html: uiIconSet['mk-ui-close']}}> +
+{ colors.map((c, i) =>
{ + setMode(1); + setColorMode(null) + const cm = props.cm ?? getActiveCM(); + if (!cm) + return; + const selection = cm.state.selection.main + const selectedText = cm.state.sliceDoc(selection.from, selection.to) + cm.dispatch({ + changes: {from: selection.from, to: selection.to, insert: colorMode.prefix+c+colorMode.suffix+selectedText+colorMode.closeTag}, + }) + +}} className='mk-color' style={{background: c}}>
) } + + const marksMode = () => <> + { + props.mobile ?
{ + setMode(0); + }} dangerouslySetInnerHTML={{__html: uiIconSet['mk-ui-close']}}> +
: <>}{ + resolveStyles().map((s, i) => + { + return f == s.mark) ? true : false} toggleMarkAction={toggleMarkAction}> + }) } + { window.make.settings.inlineStylerColors ? + <>
+
+ { + setMode(2); + setColorMode({prefix:``, closeTag:''}) + }} className='mk-mark' dangerouslySetInnerHTML={{__html: markIconSet['mk-mark-color']}}> +
+
{ + setMode(2); + setColorMode({prefix:``, closeTag:''}) + }} className='mk-mark' dangerouslySetInnerHTML={{__html: markIconSet['mk-mark-highlight']}}> +
+ + : <>} + + + + return
e.preventDefault()}> + { + mode == 0 && props.mobile ? + makeMode() : + mode == 2 ? + colorsMode() + : marksMode() + } +
+} diff --git a/src/cm-extensions/inlineStylerView/Mark.tsx b/src/cm-extensions/inlineStylerView/Mark.tsx new file mode 100644 index 0000000..af0df67 --- /dev/null +++ b/src/cm-extensions/inlineStylerView/Mark.tsx @@ -0,0 +1,14 @@ +import React from 'react' +import t from 'i18n' +import { platformIsMobile } from 'utils/utils' +import { InlineStyle } from './styles' +import { markIconSet } from 'utils/icons' +export const Mark = (props: {i: number, style: InlineStyle, active: boolean, toggleMarkAction: (e: React.MouseEvent, s: InlineStyle) => void}) => { + const {i, style, active, toggleMarkAction} = props; + //@ts-ignore + return
toggleMarkAction(e, style)} + > +
+} \ No newline at end of file diff --git a/src/cm-extensions/inlineStylerView/inlineStyler.tsx b/src/cm-extensions/inlineStylerView/inlineStyler.tsx new file mode 100644 index 0000000..7354971 --- /dev/null +++ b/src/cm-extensions/inlineStylerView/inlineStyler.tsx @@ -0,0 +1,53 @@ +import {Tooltip, showTooltip, tooltips} from "cm-extensions/tooltip" +import {StateField} from "@codemirror/state" +import {EditorView} from "@codemirror/view" +import React from 'react' +import ReactDOM from 'react-dom' +import { createRoot } from 'react-dom/client' + +const cursorTooltipField = StateField.define({ + create: getCursorTooltips, + + update(tooltips, tr) { + + if (!tr.docChanged && !tr.selection) return tooltips + return getCursorTooltips(tr.state) + }, + + provide: f => showTooltip.computeN([f], state => state.field(f)) +}) +import {EditorState} from "@codemirror/state" +import { InlineMenuComponent } from "cm-extensions/inlineStylerView/InlineMenu" +import { oMarks } from "cm-extensions/markSans/obsidianSyntax" +import { rangeIsMark, expandRange } from "./marks" + + + +function getCursorTooltips(state: EditorState): readonly Tooltip[] { + return state.selection.ranges + .filter(range => !range.empty) + .map(range => { + const expandedRange = expandRange(range, state) + let line = state.doc.lineAt(range.head) + let activeMarks = oMarks.map(f => rangeIsMark(state, f, expandedRange) ? f.mark : '').filter(f => f != '') + return { + pos: Math.min(range.head, range.anchor), + above: true, + strictSide: true, + arrow: false, + create: (view: EditorView) => { + let dom = document.createElement("div") + dom.className = "cm-tooltip-cursor" + const reactElement = createRoot(dom) + reactElement.render(<>) + return {dom} + } + } + }) +} + + +export function cursorTooltip() { + return cursorTooltipField + } + \ No newline at end of file diff --git a/src/cm-extensions/inlineStylerView/marks.ts b/src/cm-extensions/inlineStylerView/marks.ts new file mode 100644 index 0000000..858c8ff --- /dev/null +++ b/src/cm-extensions/inlineStylerView/marks.ts @@ -0,0 +1,163 @@ +import { syntaxTree } from '@codemirror/language'; +import { Annotation, EditorState, Transaction, SelectionRange, TransactionSpec, ChangeSpec } from '@codemirror/state' +import { TransactionRange } from 'types/types'; +import { iterateTreeAtPos, iterateTreeInSelection } from 'utils/codemirror'; +import { oMark, oMarks } from '../markSans/obsidianSyntax'; + +export const toggleMark = Annotation.define(); + +const trimSpace = (pos: number, moveDirLeft: boolean, state: EditorState) => { + if (moveDirLeft && state.sliceDoc(pos, pos+1) == ' ') + return pos+1 + if (!moveDirLeft && state.sliceDoc(pos-1, pos) == ' ') + return pos-1; + return pos +} + +const newPosAfterFormatting = (pos: number, moveDirLeft: boolean, state: EditorState) => { + const line = state.doc.lineAt(pos); + const start = moveDirLeft ? line.from : pos + const end = moveDirLeft ? pos : line.to + let newPos = start; + let lastFormatPos = start; + let exitFormatRange = false; + iterateTreeInSelection({from: start, to: end}, state, { + enter: (node) => { + + if (exitFormatRange) + return false; + if (node.name.contains('formatting')) { + if (!moveDirLeft && node.from > start) { + return false; + } + if (moveDirLeft) { + newPos = node.from + lastFormatPos = node.to; + } else { + newPos = node.to; + } + } + + } + }) + if (moveDirLeft && lastFormatPos < pos) { + newPos = pos; + } + return newPos +} + +//move position to outside adjacent formatting marks, used for properly detect marked content ranges +export const expandRange = (selection: TransactionRange, state: EditorState) : TransactionRange => { + const from = trimSpace(newPosAfterFormatting(selection.from, true, state), true, state) + const to = trimSpace(newPosAfterFormatting(selection.to, false, state), false, state) + return {from, to} +} +export const addMarkAtPos = (pos: number, mark: oMark) : TransactionSpec => ({changes: {from: pos, to: pos, insert: mark.formatChar}}) + +export const rangeIsMark = (state: EditorState, mark: oMark, selection: TransactionRange) : boolean => posIsMark(selection.from, state, mark.mark) && posIsMark(selection.to, state, mark.mark); +const posIsMark = (pos: number, state: EditorState, markString: string) : boolean => { + let isMark = false; + iterateTreeAtPos(pos, state, { + enter: ({name, from, to}) => { + if (nodeNameContainsMark(name, markString)) + isMark = true; + } + }) + return isMark +} +const nodeNameContainsMark = (name: string, markString: string) => { + return name.contains(markString) +} +export const edgeIsMark = (pos: number, state: EditorState, mark: oMark) => posIsMark(pos, state, mark.mark); + export const edgeIsMarkFormat = (pos: number, state: EditorState, mark: oMark) => posIsMark(pos, state, mark.formatting) ? true : (mark.altFormatting ? posIsMark(pos, state, mark.altFormatting) : false); + +export const transactionChangesForMark = (range: TransactionRange, mark: oMark, state: EditorState) => { + let newTrans = []; + if (rangeIsMark(state, mark, range)) { + if (edgeIsMarkFormat(range.from, state, mark) && !edgeIsMarkFormat(range.to, state, mark)) { + newTrans.push(addMarkAtPos(range.to, mark)) + } + if (edgeIsMarkFormat(range.to, state, mark) && !edgeIsMarkFormat(range.from, state, mark)) { + newTrans.push(addMarkAtPos(range.from, mark)) + } + } else + if (edgeIsMark(range.from, state, mark)) { + if (edgeIsMarkFormat(range.from, state, mark) && !edgeIsMark(range.from-1, state, mark)) { + newTrans.push(addMarkAtPos(range.from, mark)) + } + newTrans.push(addMarkAtPos(range.to, mark)) + } else + if (edgeIsMark(range.to, state, mark)) { + if (edgeIsMarkFormat(range.to, state, mark) && !edgeIsMark(range.to+1, state, mark)) { + newTrans.push(addMarkAtPos(range.to, mark)) + } + newTrans.push(addMarkAtPos(range.from, mark)) + } else { + newTrans.push(addMarkAtPos(range.to, mark)) + newTrans.push(addMarkAtPos(range.from, mark)) + } + return newTrans; + } + + const removeAllInternalMarks = (sel: TransactionRange, state: EditorState, mark: oMark) : TransactionSpec => { + let returnTrans : ChangeSpec[] = []; + iterateTreeInSelection({from: sel.from, to: sel.to}, state, { + enter: ({name, from, to}) => { + if (nodeNameContainsMark(name, mark.formatting) || (mark.altFormatting ? nodeNameContainsMark(name, mark.altFormatting) : false)) + returnTrans.push({ + from, to: from+mark.formatChar.length + }) + } + }) + return { + changes: returnTrans + } + } +export const toggleMarkExtension = EditorState.transactionFilter.of((tr: Transaction) => { + if (!tr.annotation(toggleMark)) + return tr; + + const markToggle = tr.annotation(toggleMark); + const mark = oMarks.find(f => f.mark == markToggle); + if (!mark) { + return tr; + } + const selection = tr.startState.selection.main; + let newTrans : TransactionSpec[] = []; + if (selection.head == selection.anchor) { + + if (tr.startState.sliceDoc(selection.head-mark.formatChar.length, selection.head) == mark.formatChar && tr.startState.sliceDoc(selection.head, selection.head+mark.formatChar.length) == mark.formatChar) { + newTrans.push({ + changes: { + from: selection.head-mark.formatChar.length, + to: selection.head+mark.formatChar.length + } + }); + } else { + newTrans.push({ + changes: { + from: selection.head, + insert: mark.formatChar + mark.formatChar + }, + selection: { + anchor: selection.head+mark.formatChar.length, + head: selection.head+ mark.formatChar.length + } + }) + } + return [tr, ...newTrans]; + + } + + + + const range = expandRange(selection, tr.startState); + + + newTrans.push(removeAllInternalMarks(range, tr.startState, mark)) + let newFrom = range.from; + let newTo = range.to; + + newTrans.push(...transactionChangesForMark(range, mark, tr.startState)) + return [tr, ...newTrans, {selection: {anchor: newFrom, head: newTo}}]; +}); \ No newline at end of file diff --git a/src/cm-extensions/inlineStylerView/styles/default.ts b/src/cm-extensions/inlineStylerView/styles/default.ts new file mode 100644 index 0000000..805792e --- /dev/null +++ b/src/cm-extensions/inlineStylerView/styles/default.ts @@ -0,0 +1,45 @@ +export default [ + { + label: "bold", + value: `****`, + insertOffset: 2, + icon: 'mk-mark-strong', + mark: 'strong' + }, + { + label: "italics", + value: "**", + insertOffset: 1, + icon: 'mk-mark-em', + mark: 'em' + + }, + { + label: "strikethrough", + value: "~~~~", + insertOffset: 2, + icon: 'mk-mark-strikethrough', + mark: 'strikethrough' + }, + { + label: "code", + value: "``", + insertOffset: 1, + icon: 'mk-mark-code', + mark: 'inline-code' + }, + { + label: "link", + value: "[]()", + insertOffset: 1, + cursorOffset: 2, + icon: 'mk-mark-link' + }, + { + label: "blocklink", + value: "[[]]", + insertOffset: 2, + icon: 'mk-mark-blocklink' + }, + +] diff --git a/src/cm-extensions/inlineStylerView/styles/index.ts b/src/cm-extensions/inlineStylerView/styles/index.ts new file mode 100644 index 0000000..89ce466 --- /dev/null +++ b/src/cm-extensions/inlineStylerView/styles/index.ts @@ -0,0 +1,15 @@ +import MakeMDPlugin from "main" +import defaultStyles from "./default" + +export type InlineStyle = { + label: string, + value: string, + insertOffset: number, + cursorOffset?: number, + icon: string, + mark?: string, +} + +export function resolveStyles() { + return defaultStyles +} diff --git a/src/cm-extensions/markSans/callout.tsx b/src/cm-extensions/markSans/callout.tsx new file mode 100644 index 0000000..20b6d9c --- /dev/null +++ b/src/cm-extensions/markSans/callout.tsx @@ -0,0 +1,133 @@ +import {Decoration, WidgetType, EditorView} from '@codemirror/view' +import {syntaxTree} from '@codemirror/language' +import {ViewUpdate, ViewPlugin, DecorationSet} from "@codemirror/view" +import {StateField, RangeSetBuilder, EditorState, Annotation } from '@codemirror/state' +import { Editor } from 'obsidian'; +import { SyntaxNodeRef } from '@lezer/common'; +import { iterateTreeInDocument } from 'utils/codemirror'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { createFlowEditorInElement } from 'dispatch/flowDispatch'; +import { genId } from 'components/FlowEditor/FlowEditor'; +import { PortalType } from 'types/types'; + +export const portalTypeAnnotation = Annotation.define(); +export const flowIDAnnotation = Annotation.define(); +export const flowIDStateField = StateField.define({ + create: () => undefined, + update(value, tr) { + if (tr.annotation(flowIDAnnotation)) + return tr.annotation(flowIDAnnotation) + return value; + }, +}) + +export const flowTypeStateField = StateField.define({ + create: () => 'none', + update(value, tr) { + if (tr.annotation(portalTypeAnnotation)) + return tr.annotation(portalTypeAnnotation) + return value; + }, +}) + +export const calloutField = StateField.define({ + create() { + return Decoration.none + }, + update(value, tr) { + if (tr.state.field(flowTypeStateField) != 'doc') { + return value; + } + + let builder = new RangeSetBuilder() + let nodes = [] as {name: string, from: number, to: number}[]; + syntaxTree(tr.state).iterate({ + + enter: ({name, from, to}) => { + nodes.push({name, from, to}); + }, + }) + const nextQuote = (ns: {name: string, from: number, to: number}[], to: number) : number => { + const nq = ns.find(f => f.from == to+1 && f.name.contains('HyperMD-quote')) + if (nq) { + return nextQuote(ns, nq.to) + } + return to; + } + const previous = value.iter(); + const previousSpecs = [] as {id: string, from: number, to: number}[]; + while (previous.value !== null) { + previousSpecs.push(previous.value.spec.widget.info); + previous.next(); + } + let index = 0; + nodes.map(({name, from, to}) => { + if (name.contains('HyperMD-callout')) { + + const existingCallout = previousSpecs[index]; + const endQuote = nextQuote(nodes, to) + const lineStart = tr.state.doc.lineAt(from).number + const lineEnd = tr.state.doc.lineAt(endQuote).number + if (existingCallout) { + builder.add(from, endQuote+1, calloutBlock({from: lineStart, to: lineEnd}, tr.state.sliceDoc(from, endQuote), existingCallout.id)) + } else { + builder.add(from, endQuote+1, calloutBlock({from: lineStart, to: lineEnd}, tr.state.sliceDoc(from, endQuote), genId(8))) + } + index++; + } + }) + const dec = builder.finish() + return dec; + }, + provide: f => EditorView.decorations.from(f) + }) + +export interface CalloutInfo { + range: {from: number, to: number}, readonly text: string, readonly id: string; +} + +class CalloutWidget extends WidgetType { + constructor(readonly info: CalloutInfo) { + super(); + } + + eq(other: WidgetType) { + return (other as unknown as CalloutWidget).info.id === this.info.id; + } + + toDOM() { + const parseTextToCallout = (text: string) : {icon: string, title: string} => { + if (!this.info.text) { + return {icon: '', title: ''}; + } + const stringArray = text.split('\n'); + const titleRegex = RegExp(/.*\[!(\w*)\]\s(.*)/) + const title = titleRegex.exec(stringArray[0]); + if (!title || title.length < 3) { + return {icon: '', title: ''}; + } + return { + icon: title[1], + title: title[2], + } + } + const callOutData = parseTextToCallout(this.info.text); + const div = document.createElement('div'); + div.toggleClass('callout', true); + const divTitle = div.createDiv('div'); + divTitle.toggleClass('callout-title', true) + const div2 = div.createDiv('div'); + div2.toggleClass('callout-content', true) + div2.setAttribute('id', "mk-callout-"+this.info.id) + // loadCalloutByDOM(div2, this.info.id) + return div; + } + } + + const calloutBlock = (range: {from: number, to: number}, text: string, id: string) => Decoration.widget({ + widget: new CalloutWidget({range, text, id}), + block: true, + }) + + diff --git a/src/cm-extensions/markSans/hr.ts b/src/cm-extensions/markSans/hr.ts new file mode 100644 index 0000000..f32246b --- /dev/null +++ b/src/cm-extensions/markSans/hr.ts @@ -0,0 +1,95 @@ +import {Decoration, WidgetType, DecorationSet, EditorView} from '@codemirror/view' +import {StateField, RangeSetBuilder, EditorState} from '@codemirror/state' +import { syntaxTree } from '@codemirror/language' +import {iterateTreeInDocument, iterateTreeInSelection} from 'utils/codemirror' + +export const resetLine = Decoration.line({class: "mk-reset"}) + +const needsReset = (state: EditorState, typeString: string, from: number, to: number) : boolean => { + const length = to-from; + + if (typeString.contains('HyperMD-header')) { + //reset auto header without space + if (parseInt(typeString.replace(/.*HyperMD-header-(\d+).*/, '$1')) == length) { + return true; + } + let truefalse = true; + // reset Autoheader before hr + iterateTreeInSelection({from: from, to: to}, state, { + enter: ({type, from, to}) => { + if (type.name.contains('formatting-header')) { + truefalse = false; + } + } + }) + return truefalse; + } + return false; +} + +export const hrResetFix = StateField.define({ + create() { + return Decoration.none + }, + update(value, tr) { + let builder = new RangeSetBuilder() + + iterateTreeInDocument(tr.state, { + enter: ({ type, from, to }) => { + if (needsReset(tr.state, type.name, from, to)) { + builder.add(from, from, resetLine) + } + } + }); + const dec = builder.finish() + return dec; + }, + provide: f => EditorView.decorations.from(f) + }) + +const hrDecorations = (state: EditorState) : DecorationSet => { + let builder = new RangeSetBuilder() + let nodes = [] as {name: string, from: number, to: number}[]; + iterateTreeInDocument(state, { + enter: ({name, from, to}) => { + if (name.contains('formatting-header') && state.sliceDoc(from, to) == '---' && !(state.selection.main.from >= from && state.selection.main.to <= to)) { + builder.add(from, to, hr) + } + } + }) + const dec = builder.finish() + return dec; +} + +export const hrField = StateField.define({ + create(state) { + return hrDecorations(state) + }, + update(value, tr) { + if (!tr.docChanged) + return value; + return hrDecorations(tr.state); + }, + provide: f => EditorView.decorations.from(f) + }) + + +class HRWidget extends WidgetType { + constructor() { + super(); + } + + eq(other: WidgetType) { + return true; + } + + toDOM() { + const div = document.createElement('hr'); + return div; + } + } + +export const hr = Decoration.replace({ + widget: new HRWidget(), + block: false, + }) \ No newline at end of file diff --git a/src/cm-extensions/markSans/inlineSelection.ts b/src/cm-extensions/markSans/inlineSelection.ts new file mode 100644 index 0000000..29be559 --- /dev/null +++ b/src/cm-extensions/markSans/inlineSelection.ts @@ -0,0 +1,161 @@ +import { Range, EditorState, Transaction, EditorSelection, TransactionSpec, StateField, RangeSetBuilder } from '@codemirror/state'; +import { expandRange, rangeIsMark, transactionChangesForMark } from 'cm-extensions/inlineStylerView/marks'; +import { TransactionRange } from 'types/types'; +import { checkRangeOverlap, iterateTreeAtPos, iterateTreeInDocument, iterateTreeInSelection, iterateTreeInVisibleRanges } from 'utils/codemirror'; +import { oMarks } from './obsidianSyntax'; + + + export const inlineMakerDelete = EditorState.transactionFilter.of((tr: Transaction) => { + let newTrans = [] as TransactionSpec[]; + + if (!tr.isUserEvent('delete') || (!tr.isUserEvent('input') && tr.startState.selection.main.from != tr.startState.selection.main.to)){ + return tr; + } + + const changes = tr.changes; + + changes.iterChanges((fromA, fromB, toA, toB, inserted) => { + const minFrom = Math.min(fromA, toA); + const maxTo = Math.max(fromA, toA); + const expandedRange = expandRange({from: minFrom, to: maxTo}, tr.startState); + let activeMarks = oMarks.filter(f => rangeIsMark(tr.startState, f, expandedRange)) + + const transactions = activeMarks.map(m => transactionChangesForMark(expandedRange, m, tr.startState)) + + newTrans.push({ + changes: { + from: expandedRange.from, + to: expandedRange.to, + insert: inserted + } + }) + newTrans.push(...transactions.reduce((p, c) => [...p, ...c], [])); + + return newTrans; + }) + + return [tr, ...newTrans]; + }); + + const reverseSel = (t: TransactionRange) : TransactionRange => { + return { + from: t.to, to: t.from + } + } + + const selFromTo = (from: number, to: number) : TransactionRange => { + return { from: from, to: to} + } + + + + const pointSelection = (from: number, to: number, markLeft: boolean, pos: number, posDiff: number, userSelect: boolean) : TransactionRange | undefined => + + { + + return checkLeftOfMark(from, pos) ? undefined : + checkMarkMiddle(from, to, pos) ? (markLeft && posDiff >= 1 || !markLeft && (posDiff != -1 || posDiff == -1 && !userSelect)) ? + selectBeforeMark(from, pos) : selectAfterMark(to+1) : undefined; + } + + const checkLeftOfMark = (from: number, pos: number) : boolean => from == pos; + const checkMarkMiddle = (from: number, to: number, pos: number) : boolean => pos > from && pos <= to; + const selectBeforeMark = (from: number, pos: number) : TransactionRange => selFromTo(from, from) + const selectAfterMark = (to: number) : TransactionRange => selFromTo(to, to) + + const inlinePositionMarkOffset = (typeString: string, from: number, to: number, state: EditorState) :{from: number, to: number, left: boolean, node: string} | undefined => { + + const checkLeft = (from: number, to: number, formatString: string) : boolean => { + let left = true; + iterateTreeInSelection({from: from-2, to: to+2}, state, { enter: (node) => { + + if (node.name.contains(formatString) && !(node.name.contains('formatting-'+formatString))) { + if (node.from < from) { + left = false; + } + if (node.to > to) { + left = true; + } + + } + }}) + return left; + } + + if (typeString.contains('formatting-em') && !typeString.contains('formatting-embed')) { + return {from, to, left: checkLeft(from, to, 'em'), node: 'em'} + } + if (typeString.contains('formatting-strong')) { + return {from, to, left: checkLeft(from, to, 'strong'), node: 'strong'} + } + if (typeString.contains('formatting-strikethrough')) { + return {from, to, left: checkLeft(from, to, 'strikethrough'), node: 'strikethrough'} + } + + if (typeString.contains('formatting-code')) { + if (!typeString.contains('hmd-codeblock')) { + return {from, to, left: checkLeft(from, to, 'inline-code'), node: 'inline-code'} + } + // return {from: from, to, left: checkLeft(from, to, 'HyperMD-codeblock')} + + } + + return undefined; + } + + + +export const inlineMakerSelect = EditorState.transactionFilter.of((tr:Transaction) => { + + let newTrans : TransactionSpec[] = []; + if (!tr.isUserEvent('select')) { + return tr; + } + const selection = tr.newSelection.main + let lineNodes : {type: string, from: number, to: number}[] = []; + const minFrom = Math.min(selection.from, selection.to); + const maxTo = Math.max(selection.from, selection.to); + if (minFrom != maxTo) { + const newRange = expandRange({from: minFrom, to: maxTo}, tr.state); + const fixedRange = (minFrom == selection.anchor) ? newRange : reverseSel(newRange); + newTrans.push({selection: {anchor: fixedRange.from, head: fixedRange.to}}) + } else { + iterateTreeInSelection({from: tr.state.doc.lineAt(minFrom).from, to: tr.state.doc.lineAt(maxTo).to}, tr.state, { + enter: ({ type, from, to }) => { + lineNodes.push({type: type.name, from, to}); + } + }) + const fixSel = (oldSel: TransactionRange | undefined, anchor: number) : TransactionRange | undefined => { + let mark : {from: number, to: number, left: boolean, node: string}; + let newSel : TransactionRange; + const head = oldSel.from == anchor ? oldSel.to : oldSel.from; + for (let node of lineNodes) { + if (node.from <= head && node.to >= head) { + mark = inlinePositionMarkOffset(node.type, node.from, node.to, tr.state); + if (mark) + break; + } + } + if (mark) { + newSel = pointSelection(mark.from, mark.to, mark.left, oldSel.from, tr.startState.selection.main.from-selection.from, tr.isUserEvent('select')) + } + if (!newSel || newSel.from == oldSel.from && newSel.to == oldSel.to) { + + if (oldSel.to == anchor) + return reverseSel(oldSel) + return oldSel; + } + return fixSel(newSel, anchor); + } + + const selChange = fixSel({from: minFrom, to: maxTo}, selection.anchor); + + if (selChange) { + newTrans.push({ + selection: {anchor: selChange.from, head: selChange.to} + }) + } + } + return [tr, ...newTrans]; +}); + diff --git a/src/cm-extensions/markSans/obsidianSyntax.ts b/src/cm-extensions/markSans/obsidianSyntax.ts new file mode 100644 index 0000000..72d41ac --- /dev/null +++ b/src/cm-extensions/markSans/obsidianSyntax.ts @@ -0,0 +1,35 @@ +export type oMark = { + mark: string; + formatting: string; + formatChar: string; + altFormatting?: string; +} +export const oMarks : oMark[] = [ + { + mark: 'em', + formatting: 'formatting-em', + altFormatting: 'em_formatting_formatting-strong', + formatChar: '*' + }, + { + mark: 'strong', + formatting: 'formatting-strong', + formatChar: '**' + }, + { + mark: 'strikethrough', + formatting: 'formatting-strikethrough', + formatChar: '~~' + }, + { + mark: 'inline-code', + formatting: 'formatting-code', + formatChar: '`' + } +] + +export type oBlock = { + block: string; + formatting: string; + blockChar: string; +} \ No newline at end of file diff --git a/src/cm-extensions/markSans/selection.ts b/src/cm-extensions/markSans/selection.ts new file mode 100644 index 0000000..2dd0bd2 --- /dev/null +++ b/src/cm-extensions/markSans/selection.ts @@ -0,0 +1,161 @@ +import { Range, EditorState, Transaction, EditorSelection, TransactionSpec, StateField, RangeSetBuilder } from '@codemirror/state'; +import { + Decoration, + DecorationSet, + EditorView, + ViewPlugin, + ViewUpdate +} from '@codemirror/view'; +import { checkRangeOverlap, iterateTreeInDocument, iterateTreeInSelection, iterateTreeInVisibleRanges } from 'utils/codemirror'; +import { hrResetFix } from './hr'; + + + + + export const makerDelete = EditorState.transactionFilter.of((tr: Transaction) => { + let newTrans = [] as TransactionSpec[]; + + + if (tr.isUserEvent('delete.forward')){ + } + + if (tr.isUserEvent('delete.backward') && !tr.isUserEvent('delete.selection') && !tr.isUserEvent('delete.selection.smart')) { + + const selection = tr.newSelection.main; + iterateTreeInSelection(selection, tr.startState, { + enter: ({ type, from, to }) => { + + const mark = positionMarkOffset(type.name, from, to, tr.startState); + + if (mark) { + if (!hasReset(tr.startState, from, to)) { + newTrans.push(pointDeletion(tr, mark.from, mark.to, selection.from)) + } + } + } + }); + } + return [tr, ...newTrans]; + }); + + const reverseSel = (t: TransactionSpec) => { + const sel = t.selection as EditorSelection; + return {selection: EditorSelection.single(sel.main.head, sel.main.anchor) + } + } + + const selFromTo = (from: number, to: number) => { + return { selection: EditorSelection.single(from, to) + } + } + const delFromTo = (tr: Transaction, from: number, to: number) => { + return { changes: {from, to}, + annotations: Transaction.userEvent.of(`${tr.annotation(Transaction.userEvent)}.smart`) + } + } + const pointDeletion = (tr: Transaction, from: number, to: number, pos: number) : TransactionSpec => + checkMarkMiddle(from, to, pos) ? deleteMark(tr, from, pos) : {}; + const deleteMark = (tr: Transaction, from: number, pos: number) : TransactionSpec => from == 0 ? delFromTo(tr, from, pos) : delFromTo(tr, from, pos) + const changeSelectionToPrevLine = (from: number, head: number) : TransactionSpec => selFromTo(from, head); + const changeSelectionToEndPrevLine = (from: number, head: number) : TransactionSpec => selFromTo(from, head-1); + const changeSelectionToAfterMark = (head: number, to: number) : TransactionSpec => selFromTo(head, to); + const changeSelectionToMark = (to: number, head: number) : TransactionSpec => selFromTo(to, head); + const rangeBeginsInMark = (from: number, to: number, pos: number, ) : boolean => pos >= from && pos < to; + const rangeEndsAtMark = (from: number, to: number, pos: number, ) : boolean => pos == from; + const rangeBeginsBefore = (from: number, to: number, anchor: number, head: number, ) : boolean => head == from-1; + const pointSelection = (from: number, to: number, pos: number, left: boolean) : TransactionSpec => checkLineStart(from, pos) ? to-from == 1 && + left ? selectPreviousLine(from, pos) : selectLineStart(to) : + checkMarkMiddle(from, to, pos) ? left && checkMarkMiddleRightMost(from, to, pos) ? selectPreviousLine(from, pos) : selectLineStart(to) : {}; + + const checkLineStart = (from: number, pos: number) : boolean => from == pos; + const checkMarkMiddle = (from: number, to: number, pos: number) : boolean => pos > from && pos < to; + const checkMarkMiddleRightMost = (from: number, to: number, pos: number) : boolean => pos == to-1; + const selectPreviousLine = (from: number, pos: number) : TransactionSpec => from == 0 ? selFromTo(pos, pos) : selFromTo(from-1, from-1) + const selectLineStart = (to: number) : TransactionSpec => selFromTo(to, to) + + const positionMarkOffset = (typeString: string, from: number, to: number, state: EditorState) : {from: number, to: number} | undefined => { + + + if (typeString.contains('HyperMD-header')) { + return {from, to: from+parseInt(typeString.replace(/.*HyperMD-header-(\d+).*/, '$1'))+1} + } + if (typeString.contains('HyperMD-task-line')) { + return {from, to: from+parseInt(typeString.replace(/.*HyperMD-list-line-(\d+).*/, '$1'))+5} + } + if (typeString.contains('formatting-list-ol')) { + let returnMark = undefined; + iterateTreeInSelection({from: from, to: to}, state, { + enter: ({type, from, to}) => { + if (type.name.contains('HyperMD-list-line')) { + returnMark = {from, to: from+parseInt(type.name.replace(/.*HyperMD-list-line-(\d+).*/, '$1'))+2}; + } + } + }) + return returnMark; + } + if (typeString.contains('HyperMD-list-line')) { + return {from, to: from+parseInt(typeString.replace(/.*HyperMD-list-line-(\d+).*/, '$1'))+1} + } + if (typeString.contains('HyperMD-quote') && !typeString.contains('HyperMD-quote-lazy')) { + return {from, to: from+1} + } + + return undefined; + } + const rangeSelection = (from: number, to: number, anchor: number, head: number, ) : TransactionSpec => { + const minFrom = Math.min(anchor, head); + const maxTo = Math.max(anchor, head); + + /*if (rangeBeginsBefore(from, to, maxTo, minFrom)) { + const newSel = changeSelectionToMark(to, maxTo); + return minFrom == head ? newSel : reverseSel(newSel); + }*/ + if (rangeEndsAtMark(from, to, maxTo)) { + const newSel = changeSelectionToAfterMark(minFrom, to); + return minFrom == anchor ? newSel : reverseSel(newSel); + } + if (rangeBeginsInMark(from, to, maxTo)) { + const newSel = changeSelectionToEndPrevLine(minFrom, from); + return minFrom == anchor ? newSel : reverseSel(newSel); + } + if (rangeBeginsInMark(from, to, minFrom)) { + const newSel = changeSelectionToMark(to, maxTo); + return minFrom == head ? newSel : reverseSel(newSel); + } + return {}; + } + + + const hasReset = (state: EditorState, from: number, to: number) : boolean => { + let trueFalse = false; + state.field(hrResetFix, false)?.between(from, to, (f,t,v) => { + trueFalse = true; + }); + return trueFalse; + } + +export const makerSelect = EditorState.transactionFilter.of((tr:Transaction) => { + let newTrans = [] as TransactionSpec[]; + if (tr.isUserEvent('delete') || tr.isUserEvent('input')) { + return tr; + } + const selection = tr.newSelection.main + if (selection.from == 0 && selection.to == 0) + return tr; + iterateTreeInSelection(selection, tr.state, { + enter: ({ type, from, to }) => { + + const mark = positionMarkOffset(type.name, from, to, tr.state); + + if (mark) { + if (!hasReset(tr.state, from, to)) + newTrans.push((selection.from != selection.to) ? + rangeSelection(mark.from, mark.to, selection.from, selection.to) : + pointSelection(mark.from, mark.to, selection.from, tr.startState.selection.main.from == selection.from+1)) + } + } + }); +// return tr; + return [tr, ...newTrans]; +}); + diff --git a/src/cm-extensions/placeholder.ts b/src/cm-extensions/placeholder.ts new file mode 100644 index 0000000..3e0b239 --- /dev/null +++ b/src/cm-extensions/placeholder.ts @@ -0,0 +1,20 @@ +import { EditorView, Decoration, DecorationSet, } from "@codemirror/view"; +import t from 'i18n' +import { StateField, RangeSetBuilder } from "@codemirror/state"; +const placeholderLine = Decoration.line({attributes: {'data-ph': t.labels.placeholder}, class: 'cm-placeholder'}) + +export const placeholder = StateField.define({ + create() { + return Decoration.none + }, + update(value, tr) { + let builder = new RangeSetBuilder() + const currentLine = tr.state.doc.lineAt(tr.state.selection.main.head); + + if (currentLine?.length == 0) + builder.add(currentLine.from, currentLine.from, placeholderLine); + const dec = builder.finish() + return dec; + }, + provide: f => EditorView.decorations.from(f) + }) \ No newline at end of file diff --git a/src/cm-extensions/tooltip.ts b/src/cm-extensions/tooltip.ts new file mode 100644 index 0000000..0b3265e --- /dev/null +++ b/src/cm-extensions/tooltip.ts @@ -0,0 +1,679 @@ +import {EditorView, ViewPlugin, ViewUpdate, Direction, logException} from "@codemirror/view" +import {EditorState, StateEffect, StateEffectType, Facet, StateField, Extension, MapMode} from "@codemirror/state" + +//FORK OF CODEMIRROR TOOLTIP TO FIX HOVER + +const ios = typeof navigator != "undefined" && + !/Edge\/(\d+)/.exec(navigator.userAgent) && /Apple Computer/.test(navigator.vendor) && + (/Mobile\/\w+/.test(navigator.userAgent) || navigator.maxTouchPoints > 2) + +type Rect = {left: number, right: number, top: number, bottom: number} + +type Measured = { + editor: DOMRect, + parent: DOMRect, + pos: (Rect | null)[], + size: DOMRect[], + space: {left: number, top: number, right: number, bottom: number} +} + +const Outside = "-10000px" + +const enum Arrow { Size = 7, Offset = 14 } + +class TooltipViewManager { + private input: readonly (Tooltip | null)[] + tooltips: readonly Tooltip[] + tooltipViews: readonly TooltipView[] + + constructor( + view: EditorView, + private readonly facet: Facet, + private readonly createTooltipView: (tooltip: Tooltip) => TooltipView + ) { + this.input = view.state.facet(facet) + this.tooltips = this.input.filter(t => t) as Tooltip[] + this.tooltipViews = this.tooltips.map(createTooltipView) + } + + update(update: ViewUpdate) { + let input = update.state.facet(this.facet) + let tooltips = input.filter(x => x) as Tooltip[] + if (input === this.input) { + for (let t of this.tooltipViews) if (t.update) t.update(update) + return false + } + + let tooltipViews = [] + for (let i = 0; i < tooltips.length; i++) { + let tip = tooltips[i], known = -1 + if (!tip) continue + for (let i = 0; i < this.tooltips.length; i++) { + let other = this.tooltips[i] + if (other && other.create == tip.create) known = i + } + if (known < 0) { + tooltipViews[i] = this.createTooltipView(tip) + } else { + let tooltipView = tooltipViews[i] = this.tooltipViews[known] + if (tooltipView.update) tooltipView.update(update) + } + } + for (let t of this.tooltipViews) if (tooltipViews.indexOf(t) < 0) t.dom.remove() + + this.input = input + this.tooltips = tooltips + this.tooltipViews = tooltipViews + return true + } +} + +/// Return an extension that configures tooltip behavior. +export function tooltips(config: { + /// By default, tooltips use `"fixed"` + /// [positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/position), + /// which has the advantage that tooltips don't get cut off by + /// scrollable parent elements. However, CSS rules like `contain: + /// layout` can break fixed positioning in child nodes, which can be + /// worked about by using `"absolute"` here. + /// + /// On iOS, which at the time of writing still doesn't properly + /// support fixed positioning, the library always uses absolute + /// positioning. + position?: "fixed" | "absolute", + /// The element to put the tooltips into. By default, they are put + /// in the editor (`cm-editor`) element, and that is usually what + /// you want. But in some layouts that can lead to positioning + /// issues, and you need to use a different parent to work around + /// those. + parent?: HTMLElement + /// By default, when figuring out whether there is room for a + /// tooltip at a given position, the extension considers the entire + /// space between 0,0 and `innerWidth`,`innerHeight` to be available + /// for showing tooltips. You can provide a function here that + /// returns an alternative rectangle. + tooltipSpace?: (view: EditorView) => {top: number, left: number, bottom: number, right: number} +} = {}): Extension { + return tooltipConfig.of(config) +} + +type TooltipConfig = { + position: "fixed" | "absolute", + parent: ParentNode | null, + tooltipSpace: (view: EditorView) => {top: number, left: number, bottom: number, right: number} +} + +function windowSpace() { + return {top: 0, left: 0, bottom: innerHeight, right: innerWidth} +} + +const tooltipConfig = Facet.define, TooltipConfig>({ + combine: values => ({ + position: ios ? "absolute" : values.find(conf => conf.position)?.position || "fixed", + parent: values.find(conf => conf.parent)?.parent || null, + tooltipSpace: values.find(conf => conf.tooltipSpace)?.tooltipSpace || windowSpace, + }) +}) + +const tooltipPlugin = ViewPlugin.fromClass(class { + manager: TooltipViewManager + measureReq: {read: () => Measured, write: (m: Measured) => void, key: any} + inView = true + position: "fixed" | "absolute" + parent: ParentNode | null + container!: HTMLElement + classes: string + intersectionObserver: IntersectionObserver | null + lastTransaction = 0 + measureTimeout = -1 + + constructor(readonly view: EditorView) { + let config = view.state.facet(tooltipConfig) + this.position = config.position + this.parent = config.parent + this.classes = view.themeClasses + this.createContainer() + this.measureReq = {read: this.readMeasure.bind(this), write: this.writeMeasure.bind(this), key: this} + this.manager = new TooltipViewManager(view, showTooltip, t => this.createTooltip(t)) + this.intersectionObserver = typeof IntersectionObserver == "function" ? new IntersectionObserver(entries => { + if (Date.now() > this.lastTransaction - 50 && + entries.length > 0 && entries[entries.length - 1].intersectionRatio < 1) + this.measureSoon() + }, {threshold: [1]}) : null + this.observeIntersection() + view.dom.ownerDocument.defaultView?.addEventListener("resize", this.measureSoon = this.measureSoon.bind(this)) + this.maybeMeasure() + } + + createContainer() { + if (this.parent) { + this.container = document.createElement("div") + this.container.style.position = "relative" + this.container.className = this.view.themeClasses + this.parent.appendChild(this.container) + } else { + this.container = this.view.dom + } + } + + observeIntersection() { + if (this.intersectionObserver) { + this.intersectionObserver.disconnect() + for (let tooltip of this.manager.tooltipViews) + this.intersectionObserver.observe(tooltip.dom) + } + } + + measureSoon() { + //@ts-ignore + if (this.measureTimeout < 0) this.measureTimeout = setTimeout(() => { + this.measureTimeout = -1 + this.maybeMeasure() + }, 50) + } + + update(update: ViewUpdate) { + if (update.transactions.length) this.lastTransaction = Date.now() + let updated = this.manager.update(update) + if (updated) this.observeIntersection() + let shouldMeasure = updated || update.geometryChanged + let newConfig = update.state.facet(tooltipConfig) + if (newConfig.position != this.position) { + this.position = newConfig.position + for (let t of this.manager.tooltipViews) t.dom.style.position = this.position + shouldMeasure = true + } + if (newConfig.parent != this.parent) { + if (this.parent) this.container.remove() + this.parent = newConfig.parent + this.createContainer() + for (let t of this.manager.tooltipViews) this.container.appendChild(t.dom) + shouldMeasure = true + } else if (this.parent && this.view.themeClasses != this.classes) { + this.classes = this.container.className = this.view.themeClasses + } + if (shouldMeasure) this.maybeMeasure() + } + + createTooltip(tooltip: Tooltip) { + let tooltipView = tooltip.create(this.view) + tooltipView.dom.classList.add("cm-tooltip") + if (tooltip.arrow && !tooltipView.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")) { + let arrow = document.createElement("div") + arrow.className = "cm-tooltip-arrow" + tooltipView.dom.appendChild(arrow) + } + tooltipView.dom.style.position = this.position + tooltipView.dom.style.top = Outside + this.container.appendChild(tooltipView.dom) + if (tooltipView.mount) tooltipView.mount(this.view) + return tooltipView + } + + destroy() { + this.view.dom.ownerDocument.defaultView?.removeEventListener("resize", this.measureSoon) + for (let {dom} of this.manager.tooltipViews) dom.remove() + this.intersectionObserver?.disconnect() + clearTimeout(this.measureTimeout) + } + + readMeasure() { + let editor = this.view.dom.getBoundingClientRect() + return { + editor, + parent: this.parent ? this.container.getBoundingClientRect() : editor, + pos: this.manager.tooltips.map((t, i) => { + let tv = this.manager.tooltipViews[i] + return tv.getCoords ? tv.getCoords(t.pos) : this.view.coordsAtPos(t.pos) + }), + size: this.manager.tooltipViews.map(({dom}) => dom.getBoundingClientRect()), + space: this.view.state.facet(tooltipConfig).tooltipSpace(this.view), + } + } + + writeMeasure(measured: Measured) { + let {editor, space} = measured + let others = [] + for (let i = 0; i < this.manager.tooltips.length; i++) { + let tooltip = this.manager.tooltips[i], tView = this.manager.tooltipViews[i], {dom} = tView + let pos = measured.pos[i], size = measured.size[i] + // Hide tooltips that are outside of the editor. + if (!pos || pos.bottom <= Math.max(editor.top, space.top) || + pos.top >= Math.min(editor.bottom, space.bottom) || + pos.right < Math.max(editor.left, space.left) - .1 || + pos.left > Math.min(editor.right, space.right) + .1) { + dom.style.top = Outside + continue + } + let arrow: HTMLElement | null = tooltip.arrow ? tView.dom.querySelector(".cm-tooltip-arrow") : null + let arrowHeight = arrow ? Arrow.Size : 0 + let width = size.right - size.left, height = size.bottom - size.top + let offset = tView.offset || noOffset, ltr = this.view.textDirection == Direction.LTR + let left = size.width > space.right - space.left ? (ltr ? space.left : space.right - size.width) + : ltr ? Math.min(pos.left - (arrow ? Arrow.Offset : 0) + offset.x, space.right - width) + : Math.max(space.left, pos.left - width + (arrow ? Arrow.Offset : 0) - offset.x) + let above = !!tooltip.above + if (!tooltip.strictSide && (above + ? pos.top - (size.bottom - size.top) - offset.y < space.top + : pos.bottom + (size.bottom - size.top) + offset.y > space.bottom) && + above == (space.bottom - pos.bottom > pos.top - space.top)) + above = !above + let top = above ? pos.top - height - arrowHeight - offset.y : pos.bottom + arrowHeight + offset.y + let right = left + width + if (tView.overlap !== true) for (let r of others) + if (r.left < right && r.right > left && r.top < top + height && r.bottom > top) + top = above ? r.top - height - 2 - arrowHeight : r.bottom + arrowHeight + 2 + if (this.position == "absolute") { + dom.style.top = (top - measured.parent.top) + "px" + dom.style.left = (left - measured.parent.left) + "px" + } else { + dom.style.top = top + "px" + dom.style.left = left + "px" + } + if (arrow) arrow.style.left = `${pos.left + (ltr ? offset.x : -offset.x) - (left + Arrow.Offset - Arrow.Size)}px` + + if (tView.overlap !== true) + others.push({left, top, right, bottom: top + height}) + dom.classList.toggle("cm-tooltip-above", above) + dom.classList.toggle("cm-tooltip-below", !above) + if (tView.positioned) tView.positioned() + } + } + + maybeMeasure() { + if (this.manager.tooltips.length) { + if (this.view.inView) this.view.requestMeasure(this.measureReq) + if (this.inView != this.view.inView) { + this.inView = this.view.inView + if (!this.inView) for (let tv of this.manager.tooltipViews) tv.dom.style.top = Outside + } + } + } +}, { + eventHandlers: { + scroll() { this.maybeMeasure() } + } +}) + +const baseTheme = EditorView.baseTheme({ + ".cm-tooltip": { + zIndex: 100 + }, + "&light .cm-tooltip": { + border: "1px solid #bbb", + backgroundColor: "#f5f5f5" + }, + "&light .cm-tooltip-section:not(:first-child)": { + borderTop: "1px solid #bbb", + }, + "&dark .cm-tooltip": { + backgroundColor: "#333338", + color: "white" + }, + ".cm-tooltip-arrow": { + height: `${Arrow.Size}px`, + width: `${Arrow.Size * 2}px`, + position: "absolute", + zIndex: -1, + overflow: "hidden", + "&:before, &:after": { + content: "''", + position: "absolute", + width: 0, + height: 0, + borderLeft: `${Arrow.Size}px solid transparent`, + borderRight: `${Arrow.Size}px solid transparent`, + }, + ".cm-tooltip-above &": { + bottom: `-${Arrow.Size}px`, + "&:before": { + borderTop: `${Arrow.Size}px solid #bbb`, + }, + "&:after": { + borderTop: `${Arrow.Size}px solid #f5f5f5`, + bottom: "1px" + } + }, + ".cm-tooltip-below &": { + top: `-${Arrow.Size}px`, + "&:before": { + borderBottom: `${Arrow.Size}px solid #bbb`, + }, + "&:after": { + borderBottom: `${Arrow.Size}px solid #f5f5f5`, + top: "1px" + } + }, + }, + "&dark .cm-tooltip .cm-tooltip-arrow": { + "&:before": { + borderTopColor: "#333338", + borderBottomColor: "#333338" + }, + "&:after": { + borderTopColor: "transparent", + borderBottomColor: "transparent" + } + } +}) + +/// Describes a tooltip. Values of this type, when provided through +/// the [`showTooltip`](#tooltip.showTooltip) facet, control the +/// individual tooltips on the editor. +export interface Tooltip { + /// The document position at which to show the tooltip. + pos: number + /// The end of the range annotated by this tooltip, if different + /// from `pos`. + end?: number + /// A constructor function that creates the tooltip's [DOM + /// representation](#tooltip.TooltipView). + create(view: EditorView): TooltipView + /// Whether the tooltip should be shown above or below the target + /// position. Not guaranteed for hover tooltips since all hover + /// tooltips for the same range are always positioned together. + /// Defaults to false. + above?: boolean + /// Whether the `above` option should be honored when there isn't + /// enough space on that side to show the tooltip inside the + /// viewport. Not guaranteed for hover tooltips. Defaults to false. + strictSide?: boolean, + /// When set to true, show a triangle connecting the tooltip element + /// to position `pos`. + arrow?: boolean +} + +/// Describes the way a tooltip is displayed. +export interface TooltipView { + /// The DOM element to position over the editor. + dom: HTMLElement + /// Adjust the position of the tooltip relative to its anchor + /// position. A positive `x` value will move the tooltip + /// horizontally along with the text direction (so right in + /// left-to-right context, left in right-to-left). A positive `y` + /// will move the tooltip up when it is above its anchor, and down + /// otherwise. + offset?: {x: number, y: number} + /// By default, a tooltip's screen position will be based on the + /// text position of its `pos` property. This method can be provided + /// to make the tooltip view itself responsible for finding its + /// screen position. + getCoords?: (pos: number) => Rect + /// By default, tooltips are moved when they overlap with other + /// tooltips. Set this to `true` to disable that behavior for this + /// tooltip. + overlap?: boolean + /// Called after the tooltip is added to the DOM for the first time. + mount?(view: EditorView): void + /// Update the DOM element for a change in the view's state. + update?(update: ViewUpdate): void + /// Called when the tooltip has been (re)positioned. + positioned?(): void, +} + +const noOffset = {x: 0, y: 0} + +/// Behavior by which an extension can provide a tooltip to be shown. +export const showTooltip = Facet.define({ + enables: [tooltipPlugin, baseTheme] +}) + +const showHoverTooltip = Facet.define() + +class HoverTooltipHost implements TooltipView { + private readonly manager: TooltipViewManager + dom: HTMLElement + mounted: boolean = false + + // Needs to be static so that host tooltip instances always match + static create(view: EditorView) { + return new HoverTooltipHost(view) + } + + private constructor(readonly view: EditorView) { + this.dom = document.createElement("div") + this.dom.classList.add("cm-tooltip-hover") + this.manager = new TooltipViewManager(view, showHoverTooltip, t => this.createHostedView(t)) + } + + createHostedView(tooltip: Tooltip) { + let hostedView = tooltip.create(this.view) + hostedView.dom.classList.add("cm-tooltip-section") + this.dom.appendChild(hostedView.dom) + if (this.mounted && hostedView.mount) + hostedView.mount(this.view) + return hostedView + } + + mount(view: EditorView) { + for (let hostedView of this.manager.tooltipViews) { + if (hostedView.mount) hostedView.mount(view) + } + this.mounted = true + } + + positioned() { + for (let hostedView of this.manager.tooltipViews) { + if (hostedView.positioned) hostedView.positioned() + } + } + + update(update: ViewUpdate) { + this.manager.update(update) + } +} + +const showHoverTooltipHost = showTooltip.compute([showHoverTooltip], state => { + let tooltips = state.facet(showHoverTooltip).filter(t => t) as Tooltip[] + if (tooltips.length === 0) return null + + return { + pos: Math.min(...tooltips.map(t => t.pos)), + end: Math.max(...tooltips.filter(t => t.end != null).map(t => t.end!)), + create: HoverTooltipHost.create, + above: tooltips[0].above, + arrow: tooltips.some(t => t.arrow), + } +}) + +const enum Hover { Time = 300, MaxDist = 6 } + +class HoverPlugin { + lastMove: {x: number, y: number, target: HTMLElement, time: number} + hoverTimeout = -1 + restartTimeout = -1 + pending: {pos: number} | null = null + + constructor(readonly view: EditorView, + readonly source: (view: EditorView, pos: number, side: -1 | 1) => Tooltip | null | Promise, + readonly field: StateField, + readonly setHover: StateEffectType, + readonly hoverTime: number) { + this.lastMove = {x: 0, y: 0, target: view.dom, time: 0} + this.checkHover = this.checkHover.bind(this) + view.dom.addEventListener("mouseleave", this.mouseleave = this.mouseleave.bind(this)) + view.dom.addEventListener("mousemove", this.mousemove = this.mousemove.bind(this)) + } + + update() { + if (this.pending) { + this.pending = null + clearTimeout(this.restartTimeout) + //@ts-ignore + this.restartTimeout = setTimeout(() => this.startHover(), 20) + } + } + + get active() { + return this.view.state.field(this.field) + } + + checkHover() { + this.hoverTimeout = -1 + if (this.active) return + let hovered = Date.now() - this.lastMove.time + if (hovered < this.hoverTime) + //@ts-ignore + this.hoverTimeout = setTimeout(this.checkHover, this.hoverTime - hovered) + else + this.startHover() + } + + startHover() { + clearTimeout(this.restartTimeout) + let {lastMove} = this + let pos = this.view.contentDOM.contains(lastMove.target) ? this.view.posAtCoords(lastMove) : null + if (pos == null) return + let posCoords = this.view.coordsAtPos(pos) + if (posCoords == null || lastMove.y < posCoords.top || lastMove.y > posCoords.bottom || + lastMove.x < posCoords.left - this.view.defaultCharacterWidth || + lastMove.x > posCoords.right + this.view.defaultCharacterWidth) return + let bidi = this.view.bidiSpans(this.view.state.doc.lineAt(pos)).find(s => s.from <= pos! && s.to >= pos!) + let rtl = bidi && bidi.dir == Direction.RTL ? -1 : 1 + let open = this.source(this.view, pos, (lastMove.x < posCoords.left ? -rtl : rtl) as -1 | 1) + if ((open as any)?.then) { + let pending = this.pending = {pos} + ;(open as Promise).then(result => { + if (this.pending == pending) { + this.pending = null + if (result) this.view.dispatch({effects: this.setHover.of(result)}) + } + }, e => logException(this.view.state, e, "hover tooltip")) + } else if (open) { + this.view.dispatch({effects: this.setHover.of(open as Tooltip)}) + } + } + + mousemove(event: MouseEvent) { + this.lastMove = {x: event.clientX, y: event.clientY, target: event.target as HTMLElement, time: Date.now()} + //@ts-ignore + if (this.hoverTimeout < 0) this.hoverTimeout = setTimeout(this.checkHover, this.hoverTime) + let tooltip = this.active + if (tooltip && !isInTooltip(this.lastMove.target) || this.pending) { + let {pos} = tooltip || this.pending!, end = tooltip?.end ?? pos + if ((pos == end ? this.view.posAtCoords(this.lastMove) != pos + : !isOverRange(this.view, pos, end, event.clientX, event.clientY, Hover.MaxDist))) { + this.view.dispatch({effects: this.setHover.of(null)}) + this.pending = null + } + } + } + + mouseleave(e: MouseEvent) { + clearTimeout(this.hoverTimeout) + this.hoverTimeout = -1 + // return; + if (this.active && !isInTooltip(e.relatedTarget as HTMLElement)) + this.view.dispatch({effects: this.setHover.of(null)}) + } + + destroy() { + clearTimeout(this.hoverTimeout) + this.view.dom.removeEventListener("mouseleave", this.mouseleave) + this.view.dom.removeEventListener("mousemove", this.mousemove) + } +} + +function isInTooltip(elt: HTMLElement) { + for (let cur: Node | null = elt; cur; cur = cur.parentNode) + if (cur.nodeType == 1 && (cur as HTMLElement).classList.contains("cm-tooltip")) return true + return false +} + +function isOverRange(view: EditorView, from: number, to: number, x: number, y: number, margin: number) { + let range = document.createRange() + let fromDOM = view.domAtPos(from), toDOM = view.domAtPos(to) + range.setEnd(toDOM.node, toDOM.offset) + range.setStart(fromDOM.node, fromDOM.offset) + let rects = range.getClientRects() + range.detach() + for (let i = 0; i < rects.length; i++) { + let rect = rects[i] + let dist = Math.max(rect.top - y, y - rect.bottom, rect.left - x, x - rect.right) + if (dist <= margin) return true + } + return false +} + +/// Enable a hover tooltip, which shows up when the pointer hovers +/// over ranges of text. The callback is called when the mouse hovers +/// over the document text. It should, if there is a tooltip +/// associated with position `pos` return the tooltip description +/// (either directly or in a promise). The `side` argument indicates +/// on which side of the position the pointer is—it will be -1 if the +/// pointer is before the position, 1 if after the position. +/// +/// Note that all hover tooltips are hosted within a single tooltip +/// container element. This allows multiple tooltips over the same +/// range to be "merged" together without overlapping. +export function hoverTooltip( + source: (view: EditorView, pos: number, side: -1 | 1) => Tooltip | null | Promise, + options: { + /// When enabled (this defaults to false), close the tooltip + /// whenever the document changes. + hideOnChange?: boolean, + /// Hover time after which the tooltip should appear, in + /// milliseconds. Defaults to 300ms. + hoverTime?: number + } = {} +): Extension { + let setHover = StateEffect.define() + let hoverState = StateField.define({ + create() { return null }, + + update(value, tr) { + + if (value && (options.hideOnChange && (tr.docChanged || tr.selection))) return null + for (let effect of tr.effects) { + if (effect.is(setHover)) + { + return effect.value + } + if (effect.is(closeHoverTooltipEffect)) return null + } + if (value && tr.docChanged) { + let newPos = tr.changes.mapPos(value.pos, -1, MapMode.TrackDel) + if (newPos == null) return null + let copy: Tooltip = Object.assign(Object.create(null), value) + copy.pos = newPos + if (value.end != null) copy.end = tr.changes.mapPos(value.end) + return copy + } + return value + }, + + provide: f => showHoverTooltip.from(f) + }) + + return [ + hoverState, + ViewPlugin.define(view => new HoverPlugin(view, source, hoverState, setHover, options.hoverTime || Hover.Time)), + showHoverTooltipHost + ] +} + +/// Get the active tooltip view for a given tooltip, if available. +export function getTooltip(view: EditorView, tooltip: Tooltip): TooltipView | null { + let plugin = view.plugin(tooltipPlugin) + if (!plugin) return null + let found = plugin.manager.tooltips.indexOf(tooltip) + return found < 0 ? null : plugin.manager.tooltipViews[found] +} + +/// Returns true if any hover tooltips are currently active. +export function hasHoverTooltips(state: EditorState) { + return state.facet(showHoverTooltip).some(x => x) +} + +const closeHoverTooltipEffect = StateEffect.define() + +/// Transaction effect that closes all hover tooltips. +export const closeHoverTooltips = closeHoverTooltipEffect.of(null) + +/// Tell the tooltip extension to recompute the position of the active +/// tooltips. This can be useful when something happens (such as a +/// re-positioning or CSS change affecting the editor) that could +/// invalidate the existing tooltip positions. +export function repositionTooltips(view: EditorView) { + view.plugin(tooltipPlugin)?.maybeMeasure() +} \ No newline at end of file diff --git a/src/components/FlowEditor/FlowEditor.tsx b/src/components/FlowEditor/FlowEditor.tsx new file mode 100644 index 0000000..d1618dd --- /dev/null +++ b/src/components/FlowEditor/FlowEditor.tsx @@ -0,0 +1,459 @@ + +import MakeMDPlugin from "main"; +import { + Component, + MarkdownEditView, + OpenViewState, + parseLinktext, + requireApiVersion, + resolveSubpath, + setIcon, + TFile, + View, + Workspace, + WorkspaceLeaf, + WorkspaceSplit, + MarkdownView, + WorkspaceTabs, + Loc, + HoverPopover, + PopoverState, + MousePos, + EphemeralState, +} from "obsidian"; + +export function genId(size: number) { + const chars = []; + for (let n = 0; n < size; n++) chars.push(((16 * Math.random()) | 0).toString(16)); + return chars.join(""); + } + + +import 'css/FlowEditor.css' + +export interface FlowEditorParent { + flowEditor: FlowEditor | null; + containerEl?: HTMLElement; + view?: View; + dom?: HTMLElement; + } +const popovers = new WeakMap(); +type ConstructableWorkspaceSplit = new (ws: Workspace, dir: "horizontal"|"vertical") => WorkspaceSplit; + +let mouseCoords: MousePos = { x: 0, y: 0 }; + +function nosuper(base: new (...args: unknown[]) => T): new () => T { + const derived = function () { + return Object.setPrototypeOf(new Component, new.target.prototype); + }; + derived.prototype = base.prototype; + return Object.setPrototypeOf(derived, base); +} + + +export class FlowEditor extends nosuper(HoverPopover) { + onTarget: boolean; + setActive: (event: MouseEvent) => void; + shownPos: MousePos | null; + + + lockedOut: boolean; + + abortController? = this.addChild(new Component()); + + detaching = false; + + opening = false; + + rootSplit: WorkspaceSplit = new (WorkspaceSplit as ConstructableWorkspaceSplit)(window.app.workspace, "vertical"); + + targetRect = this.targetEl?.getBoundingClientRect(); + + pinEl: HTMLElement; + + titleEl: HTMLElement; + + containerEl: HTMLElement; + + hideNavBarEl: HTMLElement; + + + + oldPopover = this.parent?.flowEditor; + + document: Document = this.targetEl?.ownerDocument ?? window.activeDocument ?? window.document; + + id = genId(8); + + bounce?: NodeJS.Timeout; + + boundOnZoomOut: () => void; + + originalPath: string; // these are kept to avoid adopting targets w/a different link + originalLinkText: string; + + static activePopover?: FlowEditor; + + static activeWindows() { + const windows: Window[] = [window]; + const { floatingSplit } = app.workspace; + if (floatingSplit) { + for (const split of floatingSplit.children) { + if (split.win) windows.push(split.win); + } + } + return windows; + } + + static containerForDocument(doc: Document) { + if (doc !== document && app.workspace.floatingSplit) + for (const container of app.workspace.floatingSplit.children) { + if (container.doc === doc) return container; + } + return app.workspace.rootSplit; + } + + static activePopovers() { + //@ts-ignore + return this.activeWindows().flatMap(this.popoversForWindow); + } + + static popoversForWindow(win?: Window) { + return (Array.prototype.slice.call(win?.document?.body.querySelectorAll(".mk-hover-popover") ?? []) as HTMLElement[]) + .map(el => popovers.get(el)!) + .filter(he => he); + } + + static forLeaf(leaf: WorkspaceLeaf | undefined) { + // leaf can be null such as when right clicking on an internal link + //@ts-ignore + const el = leaf && document.body.matchParent.call(leaf.containerEl, ".mk-hover-popover"); // work around matchParent race condition + return el ? popovers.get(el) : undefined; + } + + hoverEl: HTMLElement = this.document.defaultView!.createDiv({ + cls: "mk-floweditor mk-hover-popover", + attr: { id: "he" + this.id }, + }); + + constructor( + parent: FlowEditorParent, + public targetEl: HTMLElement, + public plugin: MakeMDPlugin, + waitTime?: number, + public onShowCallback?: () => unknown, + ) { + // + super(); + + if (waitTime === undefined) { + waitTime = 300; + } + this.onTarget = true; + + this.parent = parent; + this.waitTime = waitTime; + //@ts-ignore + this.state = PopoverState.Showing; + const { hoverEl } = this; + + this.abortController!.load(); + this.timer = window.setTimeout(this.show.bind(this), waitTime); + this.setActive = this._setActive.bind(this); + if (hoverEl) { + hoverEl.addEventListener("mousedown", this.setActive); + } + // custom logic begin + popovers.set(this.hoverEl, this); + this.hoverEl.addClass("hover-editor"); + this.containerEl = this.hoverEl.createDiv("popover-content"); + this.setTitleBar(); + this.hoverEl.style.height = 'auto'; + this.hoverEl.style.width = "100%"; + + } + + _setActive() { + this.plugin.app.workspace.setActiveLeaf(this.leaves()[0], {focus: true}) + + } + + getDefaultMode() { + //@ts-ignore + return this.parent?.view?.getMode ? this.parent.view.getMode() : "preview"; + } + + updateLeaves() { + if (this.onTarget && this.targetEl && !this.document.contains(this.targetEl)) { + this.onTarget = false; + this.transition(); + } + let leafCount = 0; + this.plugin.app.workspace.iterateLeaves(leaf => { + leafCount++; + }, this.rootSplit); + if (leafCount === 0) { + this.hide(); // close if we have no leaves + } else if (leafCount > 1) { + } + this.hoverEl.setAttribute("data-leaf-count", leafCount.toString()); + } + + + setTitleBar() { + this.titleEl = this.document.defaultView!.createDiv("mk-flow-titlebar"); + this.containerEl.prepend(this.titleEl); + + } + + attachLeaf(): WorkspaceLeaf { + //@ts-ignore + this.rootSplit.getRoot = () => this.plugin.app.workspace[this.document === document ? "rootSplit" : "floatingSplit"]!; + this.rootSplit.getContainer = () => FlowEditor.containerForDocument(this.document); + + this.titleEl.insertAdjacentElement("afterend", this.rootSplit.containerEl); + const leaf = this.plugin.app.workspace.createLeafInParent(this.rootSplit, 0); + this.updateLeaves(); + return leaf; + } + + onload(): void { + super.onload(); + this.registerEvent(this.plugin.app.workspace.on("layout-change", this.updateLeaves, this)); + this.registerEvent(app.workspace.on("layout-change", () => { + // Ensure that top-level items in a popover are not tabbed + //@ts-ignore + this.rootSplit.children.forEach((item, index) => { + if (item instanceof WorkspaceTabs) { + //@ts-ignore + this.rootSplit.replaceChild(index, item.children[0]); + } + }) + })); + } + + leaves() { + const leaves: WorkspaceLeaf[] = []; + this.plugin.app.workspace.iterateLeaves(leaf => { + leaves.push(leaf); + }, this.rootSplit); + return leaves; + } + + + onShow() { + const closeDelay = 600; + setTimeout(() => (this.waitTime = closeDelay), closeDelay); + + this.oldPopover?.hide(); + this.oldPopover = null; + + this.hoverEl.toggleClass("is-new", true); + + this.document.body.addEventListener( + "click", + () => { + this.hoverEl.toggleClass("is-new", false); + }, + { once: true, capture: true }, + ); + + if (this.parent) { + this.parent.flowEditor = this; + } + const viewHeaderEl = this.hoverEl.querySelector(".view-header"); + viewHeaderEl?.remove(); + + const sizer = this.hoverEl.querySelector(".workspace-leaf"); + this.hoverEl.appendChild(sizer); + const inlineTitle = this.hoverEl.querySelector(".inline-title"); + inlineTitle.remove(); + this.onShowCallback?.(); + this.onShowCallback = undefined; // only call it once + } + + + transition() { + if (this.shouldShow()) { + //@ts-ignore + if (this.state === PopoverState.Hiding) { + //@ts-ignore + this.state = PopoverState.Shown; + clearTimeout(this.timer); + } + } else { + //@ts-ignore + if (this.state === PopoverState.Showing) { + this.hide(); + } else { + //@ts-ignore + if (this.state === PopoverState.Shown) { + //@ts-ignore + this.state = PopoverState.Hiding; + this.timer = window.setTimeout(() => { + if (this.shouldShow()) { + this.transition(); + } else { + this.hide(); + } + }, this.waitTime); + } + } + } + } + + shouldShow() { + return this.shouldShowSelf() || this.shouldShowChild(); + } + + shouldShowChild(): boolean { + //@ts-ignore + return FlowEditor.activePopovers().some(popover => { + if (popover !== this && popover.targetEl && this.hoverEl.contains(popover.targetEl)) { + return popover.shouldShow(); + } + return false; + }); + } + + shouldShowSelf() { + return ( + !this.detaching && + !!( + this.onTarget || + //@ts-ignore + (this.state == PopoverState.Shown) || + this.document.querySelector(`body>.modal-container, body > #he${this.id} ~ .menu, body > #he${this.id} ~ .suggestion-container`) + ) + ); + } + + show() { + if (!this.targetEl || this.document.body.contains(this.targetEl)) { + //@ts-ignore + this.state = PopoverState.Shown; + this.timer = 0; + this.shownPos = mouseCoords; + this.targetEl.replaceChildren(this.hoverEl); + this.onShow(); + app.workspace.onLayoutChange(); + this.load(); + } else { + this.hide(); + } + } + + onHide() { + this.oldPopover = null; + if (this.parent?.flowEditor === this) { + this.parent.flowEditor = null; + } + } + + hide() { + this.onTarget = false; + this.detaching = true; + // Once we reach this point, we're committed to closing + + // in case we didn't ever call show() + + + // A timer might be pending to call show() for the first time, make sure + // it doesn't bring us back up after we close + if (this.timer) { + clearTimeout(this.timer); + this.timer = 0; + } + + // Hide our HTML element immediately, even if our leaves might not be + // detachable yet. This makes things more responsive and improves the + // odds of not showing an empty popup that's just going to disappear + // momentarily. + this.hoverEl.hide(); + + // If a file load is in progress, we need to wait until it's finished before + // detaching leaves. Because we set .detaching, The in-progress openFile() + // will call us again when it finishes. + if (this.opening) return; + + const leaves = this.leaves(); + if (leaves.length) { + // Detach all leaves before we unload the popover and remove it from the DOM. + // Each leaf.detach() will trigger layout-changed and the updateLeaves() + // method will then call hide() again when the last one is gone. + leaves.forEach(leaf => leaf.detach()); + } else { + this.parent = null; + this.abortController?.unload(); + this.abortController = undefined; + return this.nativeHide(); + } + } + + nativeHide() { + const { hoverEl, targetEl } = this; +//@ts-ignore + this.state = PopoverState.Hidden; + + hoverEl.detach(); + + if (targetEl) { + const parent = targetEl.matchParent(".mk-hover-popover"); + if (parent) popovers.get(parent)?.transition(); + } + + this.onHide(); + this.unload(); + } + + resolveLink(linkText: string, sourcePath: string): TFile | null { + const link = parseLinktext(linkText); + const tFile = link ? this.plugin.app.metadataCache.getFirstLinkpathDest(link.path, sourcePath) : null; + return tFile; + } + + + async openFile(file: TFile, openState?: OpenViewState, useLeaf?: WorkspaceLeaf) { + if (this.detaching) return; + const leaf = useLeaf ?? this.attachLeaf(); + this.opening = true; + try { + await leaf.openFile(file, openState); + } catch (e) { + console.error(e); + } finally { + this.opening = false; + if (this.detaching) this.hide(); + } + this.plugin.app.workspace.setActiveLeaf(leaf); + + return leaf; + } + + buildState(parentMode: string, eState?: EphemeralState) { + return { + active: false, + state: { }, + eState: eState, + }; + } + + buildEphemeralState( + file: TFile, + link?: { + path: string; + subpath: string; + }, + ) { + const cache = this.plugin.app.metadataCache.getFileCache(file); + const subpath = cache ? resolveSubpath(cache, link?.subpath || "") : undefined; + const eState: EphemeralState = { subpath: link?.subpath }; + if (subpath) { + eState.line = subpath.start.line; + eState.startLoc = subpath.start; + eState.endLoc = subpath.end || undefined; + } + return eState; + } +} + diff --git a/src/components/FlowEditor/FlowEditorHover.tsx b/src/components/FlowEditor/FlowEditorHover.tsx new file mode 100644 index 0000000..38960d0 --- /dev/null +++ b/src/components/FlowEditor/FlowEditorHover.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import t from 'i18n' +import { uiIconSet } from 'utils/icons' +export const FlowEditorHover = (props: {toggle: boolean, toggleState: boolean, toggleFlow: (e: React.MouseEvent) => void, openLink: (e: React.MouseEvent) => void}) => { + return <> + { props.toggle && +
+
} +
+
+ +} \ No newline at end of file diff --git a/src/components/FlowView/FileRow.tsx b/src/components/FlowView/FileRow.tsx new file mode 100644 index 0000000..5e02604 --- /dev/null +++ b/src/components/FlowView/FileRow.tsx @@ -0,0 +1,44 @@ +import dayjs from 'dayjs'; +import * as relativeTime from 'dayjs/plugin/relativeTime' +import MakeMDPlugin from 'main'; +import { TAbstractFile, TFile, TFolder } from 'obsidian'; +import React, { useEffect, useState } from 'react' +import { openFile, unifiedToNative } from 'utils/utils'; +import t from 'i18n' +import { FolderObject } from './FlowComponent'; +import {uiIconSet} from 'utils/icons' +interface FileRowProps { + item: FolderObject; + plugin: MakeMDPlugin +} +dayjs.extend(require('dayjs/plugin/relativeTime')) + +export const FileRow = (props: FileRowProps) => { + const [fileCache, setFileCache] = useState(''); + useEffect(() => { + const setFileC = async (file: TFile) => { + const fc = await props.plugin.app.vault.cachedRead(file); + setFileCache(fc) + } + if (props.item.file instanceof TFile) + setFileC(props.item.file); + + if (props.item.file instanceof TFolder) + setFileCache(props.item.children.length + t.flowView.itemsCount) + }) + + const {item} = props + + return + + { item.icon && unifiedToNative(item.icon[1]) } + + + //@ts-ignore + openFile({ ...props.item.file, isFolder: item.type == 'folder' }, props.plugin, false)}> +
{item.name}
+

{fileCache.length == 0 ? t.flowView.emptyDoc : fileCache}

+ + {item.created && dayjs(item.created).fromNow()} +} \ No newline at end of file diff --git a/src/components/FlowView/FlowComponent.tsx b/src/components/FlowView/FlowComponent.tsx new file mode 100644 index 0000000..b0c41ae --- /dev/null +++ b/src/components/FlowView/FlowComponent.tsx @@ -0,0 +1,58 @@ +import dayjs from 'dayjs' +import MakeMDPlugin from 'main' +import { TAbstractFile, TFile, TFolder } from 'obsidian' +import React, { useState } from 'react' +import { openFile } from 'utils/utils' +import { FileRow } from './FileRow' +import { FlowRow } from './FlowRow' +import 'css/FlowComponent.css' +import t from 'i18n' +interface FolderComponentProps { + folder: TFolder + plugin: MakeMDPlugin +} + +export type FolderObject = { + children?: TAbstractFile[], + file: TAbstractFile, + type: string, + icon: string, + name: string, + path: string, + created?: number, +} + +export const FolderComponent = (props: FolderComponentProps) => { + + // @ts-ignore + const filteredNotes : FolderObject[] = props.folder.children.map(f => { + return { + //@ts-ignore + type: f.children ? 'folder' : f.extension, + file: f, + name: f.name, + path: f.path, + icon: props.plugin.settings.fileIcons.find(([path, icon]) => path == f.path), + //@ts-ignore + children: f.children, + //@ts-ignore + created: f.stat ? f.stat.ctime : undefined + } + }) + return
+
+
+ {props.folder.name} +
+ +
+ {filteredNotes.length > 0 ? +
{filteredNotes.map((f, i) => )}
+ : +
{t.flowView.emptyFolder}
+ } + + +
+
+} \ No newline at end of file diff --git a/src/components/FlowView/FlowRow.tsx b/src/components/FlowView/FlowRow.tsx new file mode 100644 index 0000000..6df62d8 --- /dev/null +++ b/src/components/FlowView/FlowRow.tsx @@ -0,0 +1,55 @@ +import { FlowEditor, FlowEditorParent } from 'components/FlowEditor/FlowEditor'; +import dayjs from 'dayjs'; +import * as relativeTime from 'dayjs/plugin/relativeTime' +import MakeMDPlugin from 'main'; +import { TAbstractFile, TFile, TFolder, WorkspaceLeaf } from 'obsidian'; +import React, { useEffect, useRef, useState } from 'react' +import { openFile, unifiedToNative } from 'utils/utils'; +import { FolderObject } from './FlowComponent'; +import { spawnPortal } from 'utils/flowEditor'; +import { uiIconSet } from 'utils/icons'; +dayjs.extend(require('dayjs/plugin/relativeTime')) +interface FileRowProps { + item: FolderObject; + plugin: MakeMDPlugin +} + +export const FlowRow = (props: FileRowProps) => { + const ref = useRef(null); + const [flowOpen, setFlowOpen] = useState(false); + const loadFile = () => { + const file = props.item.file; + const div = ref.current; + const newLeaf = spawnPortal(props.plugin, div); + newLeaf.openFile(file as TFile); + } + + const toggleFlow = (event: React.MouseEvent) => { + event.stopPropagation(); + const newState = !flowOpen + if (newState) { + loadFile(); + } else { + ref.current.empty(); + } + setFlowOpen(newState); + } + const {item} = props + + return
+
+ //@ts-ignore + openFile({ ...props.item.file, isFolder: item.type == 'folder' }, props.plugin.app, false)}> +
+ { item.icon && unifiedToNative(item.icon[1]) }
+

{item.name}

+

{item.created && dayjs(item.created).fromNow()}

+
+ + +
+
+
+} \ No newline at end of file diff --git a/src/components/FlowView/FlowView.tsx b/src/components/FlowView/FlowView.tsx new file mode 100644 index 0000000..c1b0c6a --- /dev/null +++ b/src/components/FlowView/FlowView.tsx @@ -0,0 +1,83 @@ +import { ItemView, TFolder, ViewStateResult, WorkspaceLeaf } from 'obsidian'; +import React, { cloneElement, useEffect, useRef } from 'react'; +import ReactDOM from 'react-dom'; +import { createRoot, Root } from 'react-dom/client' +import MakeMDPlugin from '../../main'; +export const FOLDER_VIEW_TYPE = 'make-folder-view'; +export const ICON = 'sheets-in-box'; +import { FolderComponent } from './FlowComponent'; + + +export class FlowView extends ItemView { + plugin: MakeMDPlugin; + currentFolderPath: string; + navigation = true; + folder: TFolder; + root: Root; + + constructor(leaf: WorkspaceLeaf, plugin: MakeMDPlugin) { + super(leaf); + this.plugin = plugin; + } + + getViewType(): string { + return FOLDER_VIEW_TYPE; + } + + getDisplayText(): string { + return this.folder?.name; + } + + + + async onClose() { + this.destroy(); + } + + destroy() { + if (this.root) + this.root.unmount(); + } + + async onOpen(): Promise { + this.destroy(); + } + + async setState(state: any, result: ViewStateResult): Promise { + + const folder = this.plugin.app.vault.getAbstractFileByPath(state.folder) as TFolder; + + this.folder = folder; + + this.constructFileTree(folder); + await super.setState(state, result); + + this.leaf.tabHeaderInnerTitleEl.innerText = folder.name; + //@ts-ignore + this.leaf.view.titleEl = folder.name; + const headerEl = this.leaf.view.headerEl; + if (headerEl) { + //@ts-ignore + headerEl.querySelector('.view-header-title').innerText = folder.name + } + + return; + } + getState(): any { + let state = super.getState(); + state.folder = this.folder?.path; + // Store information to the state, whenever the workspace changes (opening a new note,...), the view's `getState` will be called, and the resulting state will be saved in the 'workspace' file + + return state; + } + + constructFileTree(folder: TFolder) { + this.destroy(); + this.root = createRoot(this.contentEl); + this.root.render( +
+ +
+ ); + } +} diff --git a/src/components/MakeMenu/MakeMenu.tsx b/src/components/MakeMenu/MakeMenu.tsx new file mode 100644 index 0000000..09fa524 --- /dev/null +++ b/src/components/MakeMenu/MakeMenu.tsx @@ -0,0 +1,106 @@ + +import MakeMDPlugin from "main" +import { + App, + Editor, + EditorPosition, + EditorSuggest, + EditorSuggestContext, + EditorSuggestTriggerInfo, + TFile, +} from "obsidian" +import 'css/MakeMenu.css' +import { resolveCommands, Command } from "./commands" +import t from "i18n" +import { makeIconSet, markIconSet } from "utils/icons"; + +export default class MakeMenu extends EditorSuggest { + inCmd = false + cmdStartCh = 0 + plugin: MakeMDPlugin + + constructor(app: App, plugin: MakeMDPlugin) { + super(app) + this.plugin = plugin + + } + resetInfos() { + this.cmdStartCh = 0 + this.inCmd = false + } + + onTrigger( + cursor: EditorPosition, + editor: Editor, + _file: TFile + ): EditorSuggestTriggerInfo { + const currentLine = editor.getLine(cursor.line).slice(0, cursor.ch) + + if ( + !this.inCmd && + currentLine[0] !== + this.plugin.settings.menuTriggerChar + ) { + this.resetInfos() + return null + } + + if (!this.inCmd) { + this.cmdStartCh = currentLine.length - 1 + this.inCmd = true + } + + const currentCmd = currentLine.slice(this.cmdStartCh, cursor.ch) + + if ( + currentCmd.includes(" ") || + !currentCmd.includes(this.plugin.settings.menuTriggerChar) + ) { + this.resetInfos() + return null + } + return { start: cursor, end: cursor, query: currentCmd.slice(1) } + } + + getSuggestions( + context: EditorSuggestContext + ): Command[] | Promise { + const suggestions = resolveCommands(this.plugin).filter(({ label }) => + //@ts-ignore + label.toLowerCase().includes(context.query.toLowerCase()) || (t.commands[label] && t.commands[label].toLowerCase().includes(context.query.toLowerCase())) + ) + + return suggestions.length > 0 + ? suggestions + : [{ label: t.commandsSuggest.noResult, value: "", icon: ''}] + } + + renderSuggestion(value: Command, el: HTMLElement): void { + + const div = el.createDiv("mk-slash-item") + const icon = div.createDiv('mk-slash-icon'); + icon.innerHTML = makeIconSet[value.icon]; + const title = div.createDiv() + //@ts-ignore + title.setText(t.commands[value.label]) + + } + + selectSuggestion(cmd: Command, _evt: MouseEvent | KeyboardEvent): void { + if (cmd.label === t.commandsSuggest.noResult) return + + this.context.editor.replaceRange( + cmd.value, + { ...this.context.start, ch: this.cmdStartCh }, + this.context.end + ) + if (cmd.offset) { + this.context.editor.setSelection({ ...this.context.start, ch: cmd.offset[1] }, { ...this.context.end, ch: cmd.value.length+cmd.offset[0] }) + } + + + this.resetInfos() + + this.close() + } +} diff --git a/src/components/MakeMenu/commands/default.ts b/src/components/MakeMenu/commands/default.ts new file mode 100644 index 0000000..df8f182 --- /dev/null +++ b/src/components/MakeMenu/commands/default.ts @@ -0,0 +1,93 @@ +import { Command } from "."; + +export default [ + { + label: "todo", + value: "- [ ] ", + icon: 'mk-make-todo' + }, + { + label: "list", + value: `- `, + icon: 'mk-make-list' + }, + { + label: "ordered-list", + value: `1. `, + icon: 'mk-make-ordered' + }, + { + label: "h1", + value: "# ", + icon: 'mk-make-h1' + }, + { + label: "h2", + value: "## ", + icon: 'mk-make-h2' + }, + { + label: "h3", + value: "### ", + icon: 'mk-make-h3' + }, + { + label: "quote", + value: "> ", + icon: 'mk-make-quote' + }, + { + label: "divider", + value: ` +--- +`, +icon: 'mk-make-hr' + }, + { + label: "link", + value: "", + offset: [-1, 1], + icon: 'mk-make-link' + }, + { + label: "image", + value: "![](Paste Link)", + offset: [-1, 4], + icon: 'mk-make-image' + }, + { + label: "codeblock", + value: ` +\`\`\` +Type/Paste Your Code +\`\`\``, + offset:[-3, 3], + icon: 'mk-make-codeblock' + + }, + { + label: "callout", + value: `> [!NOTE] +> Content`, + offset: [-7, 12], + icon: 'mk-make-callout' + }, + { + label: "note", + value: "[[Note Name]]", + offset: [-2, 2], + icon: 'mk-make-note' + }, + { + label: "flow", + value: `!![[Note Name]]`, + offset: [-2, 4], + icon: 'mk-make-flow' + }, + { + label: "tag", + value: "#tag", + offset: [0, 1], + icon: 'mk-make-tag' + }, +] as Command[] diff --git a/src/components/MakeMenu/commands/index.ts b/src/components/MakeMenu/commands/index.ts new file mode 100644 index 0000000..224775a --- /dev/null +++ b/src/components/MakeMenu/commands/index.ts @@ -0,0 +1,14 @@ +import MakeMDPlugin from "main" +import React from "react" +import defaultCommands from "./default" + +export type Command = { + label: string + value: string + offset?: [number, number] + icon: string +} + +export function resolveCommands(plugin: MakeMDPlugin) : Command[] { + return defaultCommands +} diff --git a/src/components/Spaces/FileExplorerVirtualized.tsx b/src/components/Spaces/FileExplorerVirtualized.tsx new file mode 100644 index 0000000..72c2a5a --- /dev/null +++ b/src/components/Spaces/FileExplorerVirtualized.tsx @@ -0,0 +1,456 @@ +import { FileTreeView } from "components/Spaces/FileTreeView"; +import React, { LegacyRef, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import MakeMDPlugin from 'main'; +import { CustomVaultChangeEvent, eventTypes, FlattenedTreeNode, FolderTree, SectionTree, VaultChange } from "types/types"; +import useForceUpdate from "hooks/ForceUpdate"; +import { Notice, Platform, TAbstractFile, TFile, TFolder } from "obsidian"; +import { useRecoilState } from "recoil"; +import * as recoilState from 'recoil/pluginState'; +import * as FileTreeUtils from 'utils/utils'; +import { IndicatorState, SortableTreeItem, SortableTreeItemProps, TreeItem } from "components/Spaces/TreeView/FolderTreeView"; +import { Active, closestCenter, CollisionDetection, DndContext as DndKitContext, DragEndEvent, DragMoveEvent, DragOverEvent, DragOverlay, DragStartEvent, getFirstCollision, MeasuringStrategy, Modifier, MouseSensor, Over, PointerSensor, pointerWithin, rectIntersection, TouchSensor, UniqueIdentifier, useDndMonitor, useSensor, useSensors } from "@dnd-kit/core"; +import { arrayMove, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; +import { createPortal } from "react-dom"; +import { FOLDER_VIEW_TYPE } from "components/FlowView/FlowView"; +import t from 'i18n' +import { VariableSizeList as List, areEqual, ListChildComponentProps, VariableSizeList } from "react-window"; +import AutoSizer from 'utils/autosizer' +interface FileExplorerComponentProps { + fileTreeView: FileTreeView; + plugin: MakeMDPlugin; +} + + +const row: React.FC = memo(({data, index, style}) => + { + const {flattenedItems, projected, handleCollapse, plugin, sections, openFolders, indentationWidth} = data; + const f = flattenedItems[index]; + return i == f.id)} + onCollapse={ + handleCollapse + } + > + }, areEqual + ) + +export const FileExplorerComponent = (props: FileExplorerComponentProps) => { + + + + const { plugin } = props; + const indentationWidth = 24; + const isMobile = FileTreeUtils.platformIsMobile(); + const [vaultCollapsed, setVaultCollapsed] = useState(plugin.settings.vaultCollapsed); + const [openFolders, setOpenFolders] = useRecoilState(recoilState.openFolders); + const [fileIcons, setFileIcons] = useRecoilState(recoilState.fileIcons); + const [focusedFolder, setFocusedFolder] = useRecoilState(recoilState.focusedFolder); + const [activeFile, setActiveFile] = useRecoilState(recoilState.activeFile); + const [sections, setSections] = useRecoilState(recoilState.sections); + const [_folderTree, setFolderTree] = useRecoilState(recoilState.folderTree); + // const [dropPlaceholderItem, setDropPlaceholderItem] = useState<[Record, number] | null>(null); + const [offsetLeft, setOffsetLeft] = useState(0); + + const listRef = useRef(); + const forceUpdate = useForceUpdate(); + + // Persistant Settings + const loadFolderTree = async (folder: TFolder) => { + setFolderTree(await FileTreeUtils.sortFolderTree(folder, plugin)); + } + + + useEffect(() => { + window.addEventListener(eventTypes.vaultChange, vaultChangeEvent); + window.addEventListener(eventTypes.activeFileChange, changeActiveFile); + window.addEventListener(eventTypes.refreshView, forceUpdate); + window.addEventListener(eventTypes.settingsChanged, settingsChanged); + // window.addEventListener(eventTypes.revealFile, handleRevealFileEvent); + return () => { + window.removeEventListener(eventTypes.vaultChange, vaultChangeEvent); + window.removeEventListener(eventTypes.activeFileChange, changeActiveFile); + window.removeEventListener(eventTypes.refreshView, forceUpdate); + window.removeEventListener(eventTypes.settingsChanged, settingsChanged); + // window.removeEventListener(eventTypes.revealFile, handleRevealFileEvent); + }; + }, []); + + const handleRevealFileEvent = (evt: CustomVaultChangeEvent) => { + // todo reveal file + } + const vaultChangeEvent = (evt: CustomVaultChangeEvent) => { + + if (evt.detail) { + handleVaultChanges(evt.detail.file, evt.detail.changeType, evt.detail.oldPath); + } + const loadFolderTree = async () => { + setFolderTree(await FileTreeUtils.sortFolderTree(plugin.app.vault.getRoot(), plugin)); + } + cleanData(); + plugin.saveSettings(); + loadFolderTree(); + }; + + const changeActiveFile = (evt: CustomEvent) => { + let filePath: string = evt.detail.filePath; + const activeLeaf = plugin.app.workspace.activeLeaf + if (activeLeaf.view.getViewType() == FOLDER_VIEW_TYPE) { + setActiveFile(activeLeaf.view.getState().folder) + } else { + let file = plugin.app.vault.getAbstractFileByPath(filePath); + if (file) { setActiveFile(file.path) } else { setActiveFile(null) }; + } + + }; + + function handleVaultChanges(file: TAbstractFile, changeType: VaultChange, oldPathBeforeRename?: string) { + // Get Current States from Setters + if (changeType == 'rename') { + FileTreeUtils.renamePathInStringTree(oldPathBeforeRename, file, plugin); + } + if (changeType == 'delete') { + + } + + // File Event Handlers + } + + const settingsChanged = () => { + + setSections(plugin.settings.spaces); + setOpenFolders(plugin.settings.openFolders); + setFileIcons(plugin.settings.fileIcons) + setVaultCollapsed(plugin.settings.vaultCollapsed) + } + + useEffect(() => { + setInitialFocusedFolder(); + settingsChanged(); + + }, []); + + const cleanData = () => { + const cleanedSections = plugin.settings.spaces.map(f => {return { + ...f, + children: f.children.filter(f => plugin.app.vault.getAbstractFileByPath(f)) + }}) + + const cleanedCollapse = plugin.settings.openFolders + const cleanedFileIcons = plugin.settings.fileIcons.filter(f => plugin.app.vault.getAbstractFileByPath(f[0])) + plugin.settings.spaces = cleanedSections; + plugin.settings.openFolders = cleanedCollapse; + plugin.settings.fileIcons = cleanedFileIcons; + } + const setInitialFocusedFolder = () => { + cleanData(); + loadFolderTree(plugin.app.vault.getRoot()) + setFocusedFolder(plugin.app.vault.getRoot()); + }; + const sensors = useSensors( + useSensor(MouseSensor, { + activationConstraint: { + distance: 10 + } + }), + useSensor(TouchSensor, { + activationConstraint: { + delay: 250, + tolerance: 5 + }, + }) + + ); + const measuring = { + droppable: { + strategy: MeasuringStrategy.Always, + }, + }; + const [activeId, setActiveId] = useState(null); + const [overId, setOverId] = useState(null); + const [currentPosition, setCurrentPosition] = useState<{ + parentId: UniqueIdentifier | null; + overId: UniqueIdentifier; + } | null>(null); + + + + + + const flattenSectionTree = (sectionTrees: SectionTree[]) : FlattenedTreeNode[] => { + const getChildren = (section: string, paths: string[], sectionIndex: number) => { + return FileTreeUtils.flattenTrees(paths.map(f => plugin.app.vault.getAbstractFileByPath(f)).filter(f => f != null), '/'+section+'/', sectionIndex, section, 1) + } + + return sectionTrees.reduce((p, c, i) => { + return [...p, { + id: c.section, + parentId: null, + name: c.section, + depth: 0, + index: i, + section: i, + isFolder: true, + }, ...!c.collapsed ? getChildren(c.section, c.children, i) : []] + }, []) + } + + const flattenedItems = useMemo(() => { + const flattenedTree = [...flattenSectionTree(sections), + ..._folderTree ? FileTreeUtils.flattenTree(_folderTree, '/', -1, vaultCollapsed) : [],]; + return FileTreeUtils.includeChildrenOf(flattenedTree, openFolders) + + }, [_folderTree, openFolders, sections, vaultCollapsed]); + const sortedIds = useMemo(() => flattenedItems.map(({id}) => id), [flattenedItems]); + + const activeItem = activeId + ? flattenedItems.find(({id}) => id === activeId) + : null; + + const overIndex = overId + ? flattenedItems.findIndex(({id}) => id === overId) + : null; + + const overItem = flattenedItems[overIndex]; + const nextItem = flattenedItems[overIndex+1]; + + const dragDepth = useMemo(() => { + return FileTreeUtils.getDragDepth(offsetLeft, indentationWidth)}, [offsetLeft]) + + const projected = useMemo(() => { + return activeId && overId + ? FileTreeUtils.getProjection( + flattenedItems, + activeItem, + overIndex, + overItem, + nextItem, + dragDepth + ) + : null; + }, [flattenedItems, activeItem, overItem, nextItem, overIndex, dragDepth]) + + + function handleDragStart(event: DragStartEvent) { + const {active: {id: activeId}} = event; + const activeItem = flattenedItems.find(({id}) => id === activeId); + //Dont drag vault + if (activeItem.parentId == null && activeItem.section == -1) + return; + setActiveId(activeId); + setOverId(activeId); + + if (activeItem) { + setCurrentPosition({ + parentId: activeItem.parentId, + overId: activeId, + }); + } + + document.body.style.setProperty('cursor', 'grabbing'); + + } + + function handleDragMove({delta}: DragMoveEvent) { + + setOffsetLeft(Math.max(1, delta.x)); + } + + function handleDragOver({over}: DragOverEvent) { + const overId = over?.id; + if (overId) { + // if (!FileTreeUtils.nodeIsAncestorOfTarget(activeItem, flattenedItems.find(f => f.id == overId))) { + setOverId(over?.id ?? null); + // } + } + } + + function handleDragEnd({active, over}: DragEndEvent) { + resetState(); + moveFile(active, over) + } + const moveFile = async (active: Active, over: Over) => { + if (projected) { + const clonedItems: FlattenedTreeNode[] = [...flattenSectionTree(sections), + ..._folderTree ? FileTreeUtils.flattenTree(_folderTree, '/', -1, false) : [],] + const overIndex = clonedItems.findIndex(({id}) => id === over.id); + const overItem = clonedItems[overIndex]; + const activeIndex = clonedItems.findIndex(({id}) => id === active.id); + const activeTreeItem = clonedItems[activeIndex]; + + const activeIsSection = activeTreeItem.parentId == null; + const overIsSection = overItem.parentId == null; + if (activeIsSection) { + if (overIsSection) { + const newSections = overItem.section == -1 ? arrayMove(sections, activeTreeItem.index, sections.length-1) : overItem.index > activeIndex ? arrayMove(sections, activeTreeItem.index, overItem.index-1) : arrayMove(sections, activeTreeItem.index, overItem.index) + plugin.settings.spaces = newSections; + plugin.saveSettings(); + return; + } + } + const {depth, overId, parentId} = projected; + const parentItem = clonedItems.find(({id}) => id === parentId); + + if (overItem.section != activeItem.section || overItem.section != -1) { + if (overItem.section == -1) { + return; + } + if (parentId != sections[overItem.section].section && parentId != null) { + return; + } + + const newSections = sections.map((s,k) => { + if (k == overItem.section) { + const index = sections[overItem.section].children.findIndex(f => f == overItem.path) + 1; + const activeIndex = s.children.findIndex(g => g == activeItem.path); + const children = s.children.filter(g => g != activeItem.path); + const toIndex = activeIndex <= index && activeIndex != -1 ? index - 1 : index + if(activeIndex == -1) { + new Notice(t.notice.addedToSection) + } + return { + ...s, + children: [...children.slice(0, toIndex), activeItem.path, ...children.slice(toIndex)] + } + } + return s + }) + + plugin.settings.spaces = newSections; + plugin.saveSettings(); + return; + } + if (parentId != activeTreeItem.parentId) { + const newPath = `${parentItem.isFolder ? parentItem.path : parentItem.parent.path}/${activeItem.name}`; + if (plugin.app.vault.getAbstractFileByPath(newPath)) { + + new Notice(t.notice.duplicateFile) + return + } + await props.plugin.app.vault.rename(activeTreeItem, newPath); + clonedItems[activeIndex] = { ...activeTreeItem, depth, parentId, ...plugin.app.vault.getAbstractFileByPath(newPath)} as FlattenedTreeNode; + } else { + clonedItems[activeIndex] = { ...activeTreeItem, depth, parentId} as FlattenedTreeNode; + } + + + + const sortedItems = overIndex > activeIndex ? arrayMove(clonedItems, activeIndex, overIndex) : overIndex < activeIndex ? arrayMove(clonedItems, activeIndex, overIndex+1) : clonedItems; + const newItems = FileTreeUtils.buildTree(sortedItems); + const newFolderRank = FileTreeUtils.folderTreeToStringTree(newItems); + plugin.settings.folderRank = newFolderRank + + await plugin.saveSettings(); + loadFolderTree(plugin.app.vault.getRoot()) + } +} + const adjustTranslate: Modifier = ({transform}) => { + return { + ...transform, + x: transform.x, + y: transform.y - 10, + }; + }; + + + function handleDragCancel() { + resetState(); + } + + const handleCollapse = useCallback((folder: FlattenedTreeNode) => { + if(folder.parentId == null) { + if (folder.id == '/') { + + plugin.settings.vaultCollapsed = !plugin.settings.vaultCollapsed; + plugin.saveSettings(); + return; + } + const newSections = sections.map((s, i) => { + return i == folder.index ? {...s, collapsed: !s.collapsed} : s + }); + plugin.settings.spaces = newSections; + plugin.saveSettings(); + } else { + const folderOpen = openFolders.find(f => f == folder.id); + const newOpenFolders : string[] = !folderOpen ? [...openFolders, folder.id] as string[] : openFolders.filter((openFolder) => folder.id !== openFolder) as string[]; + plugin.settings.openFolders = newOpenFolders; + plugin.saveSettings(); + } + }, [plugin, openFolders, sections]) + + function resetState() { + setOverId(null); + setActiveId(null); + setOffsetLeft(0); + // setDropPlaceholderItem(null); + document.body.style.setProperty('cursor', ''); + } + + + const itemData = useMemo(() => + { + if (listRef?.current) + listRef.current.resetAfterIndex(0); + return {flattenedItems, projected, handleCollapse, plugin, sections, openFolders, indentationWidth} + }, + [flattenedItems, projected, handleCollapse, plugin, sections, openFolders, indentationWidth] + ); + + const rowHeight = (index: number) => isMobile ? flattenedItems[index].parentId == null ? 60 : 40 : flattenedItems[index].parentId == null ? 44 : 29; + + return
+ + + + {({ height, width}) => + + {row} + + } + + {createPortal( + + {activeId ? ( + f.id == activeId)} + indicator={null} + depth={0} + disabled={false} + plugin={plugin} + clone + childCount={0} + style={{}} + indentationWidth={indentationWidth} + /> + ) : null} + , + document.body + )} + + +
+ +} \ No newline at end of file diff --git a/src/components/Spaces/FileStickerMenu/FileStickerMenu.tsx b/src/components/Spaces/FileStickerMenu/FileStickerMenu.tsx new file mode 100644 index 0000000..7e2df01 --- /dev/null +++ b/src/components/Spaces/FileStickerMenu/FileStickerMenu.tsx @@ -0,0 +1,45 @@ +import { EmojiData } from 'components/StickerMenu/emojis' +import { emojis } from 'components/StickerMenu/emojis/default' +import React, { useEffect, useRef, useState } from 'react' +import { unifiedToNative } from 'utils/utils'; +import t from "i18n" +import { App, FuzzyMatch, FuzzySuggestModal } from 'obsidian'; + + +export class StickerModal extends FuzzySuggestModal { + + setIcon: (emoji: string) => void; + constructor(app: App, setIcon: (emoji: string) => void) { + super(app); + this.setIcon = setIcon; + this.resultContainerEl.toggleClass('mk-sticker-modal', true) + this.inputEl.focus(); + this.emptyStateText = t.labels.findStickers + this.limit = 0; + } + + renderSuggestion(item: FuzzyMatch, el: HTMLElement): void { + el.innerHTML = unifiedToNative(item.item.unicode); + el.setAttr('aria-label', item.item.label) + } + + getItemText(item: Emoji): string { + return item.label+item.desc; + } + + getItems(): Emoji[] { + const allEmojis : Emoji[] = Object.keys(emojis as EmojiData).reduce((p,c: string) => [...p, ...emojis[c].map(e => ({ label: e.n[0], desc: e.n[1], variants: e.v, unicode: e.u}))], []) + return allEmojis; + } + + onChooseItem(item: Emoji, evt: MouseEvent | KeyboardEvent) { + this.setIcon(item.unicode) + } +} + +interface Emoji { + label: string, + desc: string, + variants: string[], + unicode: string +} diff --git a/src/components/Spaces/FileTreeView.tsx b/src/components/Spaces/FileTreeView.tsx new file mode 100644 index 0000000..93f84ff --- /dev/null +++ b/src/components/Spaces/FileTreeView.tsx @@ -0,0 +1,82 @@ +import { ItemView, TAbstractFile, TFile, WorkspaceLeaf } from 'obsidian'; +import React, { cloneElement, useEffect, useRef } from 'react'; +import ReactDOM from 'react-dom'; +import { createRoot, Root } from 'react-dom/client' +import MakeMDPlugin from '../../main'; +import { RecoilRoot } from 'recoil'; +import { FileExplorerComponent as VirtualizedFileExplorer } from 'components/Spaces/FileExplorerVirtualized'; +import { NewNotes } from 'components/Spaces/NewNote'; +import 'css/FileTree.css' +export const FILE_TREE_VIEW_TYPE = 'mk-file-view'; +export const SETS_VIEW_TYPE = 'mk-sets-view'; +export const VIEW_DISPLAY_TEXT = 'Spaces'; +export const ICON = 'sheets-in-box'; + +import { MainMenu } from 'components/Spaces/MainMenu'; +import { FOLDER_VIEW_TYPE } from 'components/FlowView/FlowView'; +import { platformIsMobile } from 'utils/utils'; + + +export class FileTreeView extends ItemView { + plugin: MakeMDPlugin; + currentFolderPath: string; + navigation = false; + root: Root; + + constructor(leaf: WorkspaceLeaf, plugin: MakeMDPlugin) { + super(leaf); + this.plugin = plugin; + } + + revealInFolder(folder: TAbstractFile) { + this.plugin.app.workspace.activeLeaf.setViewState({ type: FOLDER_VIEW_TYPE, state: { folder: folder.path }}) + this.plugin.app.workspace.requestSaveLayout() + + } + getViewType(): string { + return FILE_TREE_VIEW_TYPE; + } + + getDisplayText(): string { + return VIEW_DISPLAY_TEXT; + } + + getIcon(): string { + return ICON; + } + + async onClose() { + let leafs = this.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE); + if (leafs.length == 0) { + let leaf = this.app.workspace.getLeftLeaf(false); + await leaf.setViewState({ type: FILE_TREE_VIEW_TYPE }); + } + this.destroy(); + } + + destroy() { + if (this.root) + this.root.unmount(); + } + + async onOpen(): Promise { + this.destroy(); + this.constructFileTree(this.app.vault.getRoot().path, ''); + } + + + constructFileTree(folderPath: string, vaultChange: string) { + this.destroy(); + this.root = createRoot(this.contentEl) + this.root.render( +
+ + { + !platformIsMobile() ? : null + } + + + +
) + } +} diff --git a/src/components/Spaces/MainMenu.tsx b/src/components/Spaces/MainMenu.tsx new file mode 100644 index 0000000..efa5c32 --- /dev/null +++ b/src/components/Spaces/MainMenu.tsx @@ -0,0 +1,164 @@ +import MakeMDPlugin from "main"; +import 'css/MainMenu.css'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { SectionChangeModal } from "components/Spaces/modals"; +import t from "i18n" +import { createRoot } from "react-dom/client"; +import { platformIsMobile } from "utils/utils"; +import { Menu, setIcon, WorkspaceLeaf, WorkspaceMobileDrawer } from "obsidian"; +import { FILE_TREE_VIEW_TYPE } from "./FileTreeView"; +import { uiIconSet } from "utils/icons"; +interface MainMenuComponentProps { + plugin: MakeMDPlugin; +} +export const replaceMobileMainMenu = (plugin: MakeMDPlugin) => { + if (platformIsMobile()) { + const header = app.workspace.containerEl.querySelector('.workspace-drawer.mod-left .workspace-drawer-header-left'); + const reactEl = createRoot(header); + reactEl.render() + } + +} + +export const MainMenu = (props: MainMenuComponentProps) => { + const {plugin} = props; + const ref = useRef(); + const toggleSections = (collapse: boolean) => { + const newSections = plugin.settings.spaces.map((s) => { + return {...s, collapsed: collapse} + }); + plugin.settings.spaces = newSections; + plugin.saveSettings(); + } + + const newSection = () => { + + let vaultChangeModal = new SectionChangeModal(plugin, '', 0, 'create'); + vaultChangeModal.open(); + } + + + useEffect(() => { + refreshLeafs(); + }, []) + + const refreshLeafs = () => { + // plugin.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE) + let ribbons = []; + let leafs = []; + let spaceActive = true; + if (plugin.app.workspace.leftSplit && platformIsMobile()) { + const mobileDrawer = (plugin.app.workspace.leftSplit as WorkspaceMobileDrawer); + const leaves = mobileDrawer.children as WorkspaceLeaf[] + const index = leaves.reduce((p: number,c,i) => { + return c.getViewState().type == FILE_TREE_VIEW_TYPE ? i : p + }, -1) + spaceActive = index == mobileDrawer.currentTab + leafs.push(...leaves.filter((l, i) => i != index)) + + } + if (plugin.app.workspace.leftRibbon && !props.plugin.settings.sidebarRibbon) { + ribbons.push(...plugin.app.workspace.leftRibbon.orderedRibbonActions) + } + return {ribbons, leafs, spaceActive} + } + + const showMenu = (e: React.MouseEvent) => { + const {ribbons, spaceActive, leafs} = refreshLeafs(); + const menu = new Menu(); + !spaceActive && menu.addItem((menuItem) => { + menuItem.setIcon('lucide-arrow-left'); + menuItem.setTitle(t.menu.backToSpace); + menuItem.onClick((ev: MouseEvent) => { + const leaves = plugin.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE) + if(leaves.length > 0){ + plugin.app.workspace.revealLeaf(leaves[0]) + } + + }); + }) + menu.addItem((menuItem) => { + menuItem.setIcon('plus'); + menuItem.setTitle(t.menu.newSpace); + menuItem.onClick((ev: MouseEvent) => { + newSection() + }); + }) + + menu.addItem((menuItem) => { + menuItem.setIcon('lucide-chevrons-down-up'); + menuItem.setTitle(t.menu.collapseAllSections); + menuItem.onClick((ev: MouseEvent) => { + toggleSections(true) + }); + }) + + menu.addItem((menuItem) => { + menuItem.setIcon('lucide-chevrons-up-down'); + menuItem.setTitle(t.menu.expandAllSections); + menuItem.onClick((ev: MouseEvent) => { + toggleSections(false) + }); + }) + menu.addSeparator(); + + leafs.map(l => + menu.addItem((menuItem) => { + menuItem.setIcon(l.view.icon); + menuItem.setTitle(l.getDisplayText()); + menuItem.onClick((ev: MouseEvent) => { + plugin.app.workspace.revealLeaf(l) + }); + }) + ) + + menu.addItem((menuItem) => { + menuItem.setIcon('lucide-settings'); + menuItem.setTitle(t.menu.obSettings); + menuItem.onClick((ev: MouseEvent) => { + plugin.app.commands.commands['app:open-settings'].callback() + }); + }) + + menu.addItem((menuItem) => { + menuItem.setIcon('vault'); + menuItem.setTitle(t.menu.openVault); + menuItem.onClick((ev: MouseEvent) => { + plugin.app.commands.commands['app:open-vault'].callback() + }); + }) + + + + menu.addSeparator(); + ribbons.map(r => + menu.addItem((menuItem) => { + menuItem.setIcon(r.icon); + menuItem.setTitle(r.title); + menuItem.onClick((ev: MouseEvent) => { + r.callback(); + }); + }) + ) + menu.addSeparator(); + menu.addItem((menuItem) => { + menuItem.setIcon('mk-logo'); + menuItem.setTitle(t.menu.getHelp); + menuItem.onClick((ev: MouseEvent) => { + window.open('https://make.md/community') + }); + }) + // if (isMouseEvent(e)) { + const offset = ref.current.getBoundingClientRect(); + menu.showAtPosition({ x: offset.left, y: offset.top+30 }); + + } + + return
+
showMenu(e)}> + {plugin.app.vault.getName()} +
+ +
+
+} \ No newline at end of file diff --git a/src/components/Spaces/NewNote.tsx b/src/components/Spaces/NewNote.tsx new file mode 100644 index 0000000..e577361 --- /dev/null +++ b/src/components/Spaces/NewNote.tsx @@ -0,0 +1,31 @@ +import MakeMDPlugin from "main"; +import { useRecoilState } from "recoil"; +import { createNewMarkdownFile } from "utils/utils" +import * as recoilState from 'recoil/pluginState'; +import React from 'react'; +import 'css/NewNote.css' +import t from "i18n" +import { uiIconSet } from "utils/icons"; +interface NewNotesComponentProps { + plugin: MakeMDPlugin; +} + +export const NewNotes = (props: NewNotesComponentProps) => { + const [focusedFolder, setFocusedFolder] = useRecoilState(recoilState.focusedFolder); + const {plugin} = props + const newFile = async () => { + await createNewMarkdownFile( + props.plugin.app, + focusedFolder, + '', + '' + ) + } + return
+ + +
+} \ No newline at end of file diff --git a/src/components/Spaces/TreeView/FolderTreeView.tsx b/src/components/Spaces/TreeView/FolderTreeView.tsx new file mode 100644 index 0000000..0d801b2 --- /dev/null +++ b/src/components/Spaces/TreeView/FolderTreeView.tsx @@ -0,0 +1,392 @@ +import MakeMDPlugin from 'main'; +import { addIcon, ButtonComponent, Component, Menu, SearchComponent, TAbstractFile, TFile, TFolder } from 'obsidian'; +import React, { useState, useMemo, useEffect, forwardRef, HTMLAttributes, useRef, CSSProperties } from 'react'; +import ReactDOM from 'react-dom' +import { useRecoilState } from 'recoil'; +import { FlattenedTreeNode, FolderTree, SectionTree } from 'types/types'; +import * as Util from 'utils/utils'; +import * as recoilState from 'recoil/pluginState'; +import { AnimateLayoutChanges, useSortable } from '@dnd-kit/sortable'; +import { UniqueIdentifier } from '@dnd-kit/core'; +import 'css/FolderTreeView.css'; +import classNames from 'classnames'; +import { MoveSuggestionModal, SectionChangeModal, VaultChangeModal } from 'components/Spaces/modals'; +import { isMouseEvent } from 'hooks/useLongPress' +import { SectionItem } from 'components/Spaces/TreeView/SectionView'; +import { StickerModal } from '../FileStickerMenu/FileStickerMenu'; +import t from "i18n" +import { usePopper } from 'react-popper'; +import { uiIconSet } from 'utils/icons'; + + +export enum IndicatorState { + None, + Top, + Bottom, + Row, +} + +export type Indicator = { + state: IndicatorState; + depth: number +} | undefined; + +export interface SortableTreeItemProps extends TreeItemProps { + id: UniqueIdentifier; + disabled: boolean; + } + + const animateLayoutChanges: AnimateLayoutChanges = ({isSorting, wasDragging}) => + isSorting || wasDragging ? false : true; + + export const SortableTreeItem = ({id, data, depth, disabled, style, ...props}: SortableTreeItemProps) => { + const { + attributes, + isDragging, + isSorting, + listeners, + setDraggableNodeRef, + setDroppableNodeRef, + transform, + transition, + } = useSortable({ + id, + animateLayoutChanges, + disabled, + data + }); + + const memoListeners = useMemo(() => { + return { + ...attributes, + ...listeners + } + }, [isSorting]) + + + + if (data.parentId == null) { + return + } else + { + return ( + + ); + } + } + +export interface TreeItemProps { + childCount?: number; + clone?: boolean; + collapsed?: boolean; + depth: number; + disableInteraction?: boolean; + disableSelection?: boolean; + disabled: boolean; + ghost?: boolean; + handleProps?: any; + indicator: Indicator; + indentationWidth: number; + data: FlattenedTreeNode; + plugin: MakeMDPlugin; + style: CSSProperties; + onCollapse?(folder: TFolder): void; + wrapperRef?(node: HTMLDivElement): void; + } + + +export const TreeItem = forwardRef( + ( + { + childCount, + clone, + data, + depth, + disableSelection, + disableInteraction, + ghost, + handleProps, + indentationWidth, + indicator, + collapsed, + onCollapse, + wrapperRef, + style, + plugin, + disabled, + }, + ref + ) => { + + const [activeFile, setActiveFile] = useRecoilState(recoilState.activeFile); + const [sections, setSections] = useRecoilState(recoilState.sections); + const [fileIcons, setFileIcons] = useRecoilState(recoilState.fileIcons); + const [referenceElement, setReferenceElement] = React.useState(null); + const [popperElement, setPopperElement] = useState(null) + const { styles, attributes } = usePopper(referenceElement, popperElement) + + const openFile = (file: FlattenedTreeNode, e: React.MouseEvent) => { + Util.openFile(file, plugin.app, e.ctrlKey || e.metaKey); + setActiveFile(file.path); + }; + + + const updateSections = (sections: SectionTree[]) => { + plugin.settings.spaces = sections; + plugin.saveSettings(); + } + + const triggerStickerMenu = (e: React.MouseEvent | React.TouchEvent) => { + let vaultChangeModal = new StickerModal(plugin.app, (emoji) => saveFileIcon(emoji)); + vaultChangeModal.open(); + } + const triggerContextMenu = (file: TAbstractFile, isFolder: boolean, e: React.MouseEvent | React.TouchEvent) => { + const fileMenu = new Menu(); + if (isFolder) { + fileMenu.addSeparator(); + fileMenu.addItem((menuItem) => { + menuItem.setIcon('edit'); + menuItem.setTitle(t.buttons.createNote); + menuItem.onClick((ev: MouseEvent) => { + newFileInFolder(); + }); + }) + fileMenu.addItem((menuItem) => { + menuItem.setIcon('folder-plus'); + menuItem.setTitle(t.buttons.createFolder); + menuItem.onClick((ev: MouseEvent) => { + let vaultChangeModal = new VaultChangeModal(plugin, data, 'create folder', -1); + vaultChangeModal.open(); + }); + }) + } + + // Pin - Unpin Item + fileMenu.addSeparator(); + fileMenu.addItem((menuItem) => { + menuItem.setTitle(t.menu.spaceTitle); + menuItem.setDisabled(true); + + }) + sections.map((f, i) => { + fileMenu.addItem((menuItem) => { + menuItem.setIcon('pin'); + if (f.children.contains(file.path)) { + menuItem.setIcon('checkmark');menuItem.setTitle(f.section); + } + else { menuItem.setTitle(f.section); + menuItem.setIcon('plus'); + } + menuItem.onClick((ev: MouseEvent) => { + updateSections(!sections[i].children.contains(file.path) ? sections.map((s,k) => { + return k == i ? + { + ...s, + children: [file.path, ...s.children] + } : s + }) : sections.map((s,k) => { + return k == i ? + { + ...s, + children: s.children.filter(g => g != file.path) + } : s + })) + // const newPinnedFiles = (pinnedFiles.contains(file)) ?pinnedFiles.filter((pinnedFile) => pinnedFile !== file) : [...pinnedFiles, file]; + // setPinnedFiles(newPinnedFiles); + // plugin.settings.sections = newPinnedFiles.map(f => f.path); + // plugin.saveSettings(); + }); + }); + }) + + fileMenu.addSeparator(); + // Rename Item + fileMenu.addItem((menuItem) => { + menuItem.setTitle(t.menu.rename); + menuItem.setIcon('pencil'); + menuItem.onClick((ev: MouseEvent) => { + let vaultChangeModal = new VaultChangeModal(plugin, file, 'rename'); + vaultChangeModal.open(); + }); + }); + + // Delete Item + fileMenu.addItem((menuItem) => { + menuItem.setTitle('Delete'); + menuItem.setIcon('trash'); + menuItem.onClick((ev: MouseEvent) => { + let deleteOption = plugin.settings.deleteFileOption; + if (deleteOption === 'permanent') { + plugin.app.vault.delete(file, true); + } else if (deleteOption === 'system-trash') { + plugin.app.vault.trash(file, true); + } else if (deleteOption === 'trash') { + plugin.app.vault.trash(file, false); + } + }); + }); + + // Open in a New Pane + fileMenu.addItem((menuItem) => { + menuItem.setIcon('go-to-file'); + menuItem.setTitle(t.menu.openFilePane); + menuItem.onClick((ev: MouseEvent) => { + // @ts-ignore + Util.openFileInNewPane(plugin, {...file, isFolder: isFolder}); + }); + }); + + // Make a Copy Item + fileMenu.addItem((menuItem) => { + menuItem.setTitle(t.menu.duplicate); + menuItem.setIcon('documents'); + menuItem.onClick((ev: MouseEvent) => { + if ((file as TFile).basename && (file as TFile).extension) + plugin.app.vault.copy(file as TFile, `${file.parent.path}/${(file as TFile).basename} 1.${(file as TFile).extension}`); + }); + }); + + // Move Item + if (!Util.internalPluginLoaded('file-explorer', plugin.app)) { + fileMenu.addItem((menuItem) => { + menuItem.setTitle(t.menu.moveFile); + menuItem.setIcon('paper-plane'); + menuItem.onClick((ev: MouseEvent) => { + let fileMoveSuggester = new MoveSuggestionModal(plugin.app, file as TFile); + fileMoveSuggester.open(); + }); + }); + } + // Trigger + plugin.app.workspace.trigger('file-menu', fileMenu, file, 'file-explorer'); + if (isMouseEvent(e)) { + fileMenu.showAtPosition({ x: e.pageX, y: e.pageY }); + } else { + // @ts-ignore + fileMenu.showAtPosition({ x: e.nativeEvent.locationX, y: e.nativeEvent.locationY }); + } + return false; + }; + + const newFileInFolder = async () => { + await Util.createNewMarkdownFile( + plugin.app, + data.parent.children.find(f => f.name == data.name) as TFolder, + '', + '' + ) + } + + const fileIcon = fileIcons.find(([path, icon]) => path == data.path); + const saveFileIcon = (icon: string) => + { + const newFileIcons = [...fileIcons.filter(f => f[0] != data.path), [data.path, icon]] as [string, string][] + plugin.settings.fileIcons = newFileIcons; + plugin.saveSettings(); + } + + return (<> +
+
+
openFile(data, e)} + + onContextMenu={(e) => triggerContextMenu(plugin.app.vault.getAbstractFileByPath(data.path), data.isFolder, e)} + + > + + { data.isFolder && + + } + { plugin.settings.spacesStickers && +
+ +
} +
{ + data.isFolder ? data.name : data.name.substring(0, data.name.lastIndexOf('.')) || data.name + }
+
+ { !clone ? +
+ + {data.isFolder && + + } +
: <> + } +
+
+ {/* {data.isFolder && !collapsed && data.children.length == 0 && +
No Notes Inside
} */} + + ); + } + ); + + + TreeItem.displayName = 'TreeItem'; diff --git a/src/components/Spaces/TreeView/SectionView.tsx b/src/components/Spaces/TreeView/SectionView.tsx new file mode 100644 index 0000000..e6ea2ee --- /dev/null +++ b/src/components/Spaces/TreeView/SectionView.tsx @@ -0,0 +1,208 @@ +import { Menu } from 'obsidian'; +import React, { forwardRef } from 'react'; +import { useRecoilState } from 'recoil'; +import { SectionTree } from 'types/types'; +import * as Util from 'utils/utils'; +import * as recoilState from 'recoil/pluginState'; +import 'css/SectionView.css'; +import classNames from 'classnames'; +import { SectionChangeModal, VaultChangeModal } from 'components/Spaces/modals'; + +import path from 'path'; +import { IndicatorState, TreeItemProps } from 'components/Spaces/TreeView/FolderTreeView'; +import t from "i18n" +import { isMouseEvent } from 'hooks/useLongPress'; +import { uiIconSet } from 'utils/icons'; + + +export const SectionItem = forwardRef( + ( + { + childCount, + clone, + data, + depth, + disableSelection, + disableInteraction, + ghost, + handleProps, + indentationWidth, + indicator, + collapsed, + style, + onCollapse, + wrapperRef, + plugin, + disabled, + }, + ref + ) => { + const [sections, setSections] = useRecoilState(recoilState.sections); + const [focusedFolder, setFocusedFolder] = useRecoilState(recoilState.focusedFolder) + const section = sections.find((s, i) => { + return i == data.section + }) + const newFolderInSection = () => { + let vaultChangeModal = new VaultChangeModal(plugin, focusedFolder, 'create folder', data.section); + vaultChangeModal.open(); + } + const newFileInSection = async () => { + + const newFile = await Util.createNewMarkdownFile( + plugin.app, + focusedFolder, + '') + if (data.section != -1) + updateSections(sections.map((f, i) => { + return i == data.section ? { + ...f, + children: [newFile.path, ...f.children] + } : f + })) + } + const updateSections = (sections: SectionTree[]) => { + plugin.settings.spaces = sections; + plugin.saveSettings(); + } + + +const triggerMenu = (e: React.MouseEvent | React.TouchEvent) => { + data.section == -1 ? triggerVaultMenu(e) : triggerSectionMenu(data.name, data.index, e) +} + const triggerSectionMenu = (section: string, index: number, e: React.MouseEvent | React.TouchEvent) => { + const fileMenu = new Menu(); + +// fileMenu.addItem((menuItem) => { +// menuItem.setTitle(t.menu.collapseAllFolders); +// menuItem.setIcon('lucide-chevrons-down-up'); +// menuItem.onClick((ev: MouseEvent) => { + +// }); +// }); + + +// fileMenu.addItem((menuItem) => { +// menuItem.setTitle(t.menu.expandAllFolders); +// menuItem.setIcon('lucide-chevrons-down-dow '); +// menuItem.onClick((ev: MouseEvent) => { + +// }); +// }); + + // Rename Item + fileMenu.addItem((menuItem) => { + menuItem.setTitle(t.menu.edit); + menuItem.setIcon('pencil'); + menuItem.onClick((ev: MouseEvent) => { + let vaultChangeModal = new SectionChangeModal(plugin, section, index, 'rename'); + vaultChangeModal.open(); + }); + }); + + // Delete Item + fileMenu.addItem((menuItem) => { + menuItem.setTitle(t.menu.delete); + menuItem.setIcon('trash'); + menuItem.onClick((ev: MouseEvent) => { + updateSections(sections.filter((s, i) => { + return i != index + })) + }); + }); + + + + if (isMouseEvent(e)) { + fileMenu.showAtPosition({ x: e.pageX, y: e.pageY }); + } else { + // @ts-ignore + fileMenu.showAtPosition({ x: e.nativeEvent.locationX, y: e.nativeEvent.locationY }); + } + return false; +}; + +const triggerVaultMenu = (e: React.MouseEvent | React.TouchEvent) => { + const fileMenu = new Menu(); + + // Rename Item + fileMenu.addItem((menuItem) => { + menuItem.setTitle(t.menu.newSpace); + menuItem.setIcon('plus'); + menuItem.onClick((ev: MouseEvent) => { + let vaultChangeModal = new SectionChangeModal(plugin, '', 0, 'create'); + vaultChangeModal.open(); + }); + if (isMouseEvent(e)) { + fileMenu.showAtPosition({ x: e.pageX, y: e.pageY }); + } else { + // @ts-ignore + fileMenu.showAtPosition({ x: e.nativeEvent.locationX, y: e.nativeEvent.locationY }); + } + return false; + }); +} + return (<> +
+ +
+
triggerMenu(e)} + onClick={(e) => onCollapse(data)} + ref={ref} + { ...handleProps}> +
{data.id == '/' ? plugin.app.vault.getName() : data.name} +
+
+
+
+
+ + +
+
+ +
+ {section && !collapsed && section.children.length == 0 && +
No Notes Inside
} + + ); + } + ); + + + SectionItem.displayName = 'SectionItem'; diff --git a/src/components/Spaces/modals.ts b/src/components/Spaces/modals.ts new file mode 100644 index 0000000..bcd3d7d --- /dev/null +++ b/src/components/Spaces/modals.ts @@ -0,0 +1,248 @@ +import { Modal, App, TFolder, TFile, TAbstractFile, FuzzySuggestModal } from 'obsidian'; +import MakeMDPlugin from 'main'; +import { createNewMarkdownFile } from 'utils/utils'; +import { SectionTree, eventTypes } from 'types/types'; +import t from 'i18n' +type Action = 'rename' | 'create folder' | 'create note'; +type SectionAction = 'rename' | 'create'; + +export class VaultChangeModal extends Modal { + file: TFolder | TFile | TAbstractFile; + action: Action; + plugin: MakeMDPlugin; + section: number; + + constructor(plugin: MakeMDPlugin, file: TFolder | TFile | TAbstractFile, action: Action, section?: number) { + super(plugin.app); + this.file = file; + this.action = action; + this.plugin = plugin; + this.section = section; + } + + onOpen() { + let { contentEl } = this; + let myModal = this; + + // Header + let headerText: string; + + if (this.action === 'rename') { + headerText = t.labels.rename; + } else if (this.action === 'create folder') { + headerText = t.labels.createFolder; + } else if (this.action === 'create note') { + headerText = t.labels.createNote; + } + + const headerEl = contentEl.createEl('div', { text: headerText }); + headerEl.addClass('modal-title'); + + // Input El + const inputEl = contentEl.createEl('input'); + + inputEl.style.cssText = 'width: 100%; height: 2.5em; margin-bottom: 15px;'; + if (this.action === 'rename') { + // Manual Rename Handler For md Files + if (this.file.name.endsWith('.md')) { + inputEl.value = this.file.name.substring(0, this.file.name.lastIndexOf('.')); + } else { + inputEl.value = this.file.name; + } + } + + inputEl.focus(); + + // Buttons + let changeButtonText: string; + + if (this.action === 'rename') { + changeButtonText = t.buttons.rename; + } else if (this.action === 'create folder') { + changeButtonText = t.buttons.createFolder; + } else if (this.action === 'create note') { + changeButtonText = t.buttons.createNote; + } + + const changeButton = contentEl.createEl('button', { text: changeButtonText }); + + const cancelButton = contentEl.createEl('button', { text: t.buttons.cancel }); + cancelButton.style.cssText = 'float: right;'; + cancelButton.addEventListener('click', () => { + myModal.close(); + }); + + const updateSections = (sections: SectionTree[]) => { + this.plugin.settings.spaces = sections; + this.plugin.saveSettings(); + + } + + const onClickAction = async () => { + let newName = inputEl.value; + if (this.action === 'rename') { + // Manual Rename Handler For md Files + if (this.file.name.endsWith('.md')) newName = newName + '.md'; + this.app.fileManager.renameFile(this.file, this.file.parent.path + '/' + newName); + } else if (this.action === 'create folder') { + const path = this.file.path + '/' + newName; + this.app.vault.createFolder(path); + if (this.section >= 0) + updateSections(this.plugin.settings.spaces.map((s,k) => { + return k == this.section ? + { + ...s, + children: [newName, ...s.children] + } : s + })) + } else if (this.action === 'create note') { + await createNewMarkdownFile( + this.plugin.app, + this.file as TFolder, + newName, + '' + ); + } + myModal.close(); + }; + + // Event Listener + changeButton.addEventListener('click', onClickAction); + inputEl.addEventListener('keydown', (e) => { + if (e.key === 'Enter') onClickAction(); + }); + } + + onClose() { + let { contentEl } = this; + contentEl.empty(); + } +} + +export class MoveSuggestionModal extends FuzzySuggestModal { + app: App; + fileOrFolderToMove: TFile | TFolder; + + constructor(app: App, fileOrFolderToMove: TFile | TFolder) { + super(app); + this.fileOrFolderToMove = fileOrFolderToMove; + } + + getItemText(item: TFolder): string { + return item.path; + } + + getItems(): TFolder[] { + return getAllFoldersInVault(this.app); + } + + onChooseItem(item: TFolder, evt: MouseEvent | KeyboardEvent) { + this.app.vault.rename(this.fileOrFolderToMove, item.path + '/' + this.fileOrFolderToMove.name); + } +} + +function getAllFoldersInVault(app: App): TFolder[] { + let folders: TFolder[] = []; + let rootFolder = app.vault.getRoot(); + folders.push(rootFolder); + function recursiveFx(folder: TFolder) { + for (let child of folder.children) { + if (child instanceof TFolder) { + let childFolder: TFolder = child as TFolder; + folders.push(childFolder); + if (childFolder.children) recursiveFx(childFolder); + } + } + } + recursiveFx(rootFolder); + return folders; +} + +export class SectionChangeModal extends Modal { + section: string; + sectionIndex: number; + action: SectionAction; + plugin: MakeMDPlugin; + + constructor(plugin: MakeMDPlugin, section: string, sectionIndex: number, action: SectionAction) { + super(plugin.app); + this.section = section; + this.sectionIndex = sectionIndex; + this.action = action; + this.plugin = plugin; + } + + onOpen() { + let { contentEl } = this; + let myModal = this; + + // Header + let headerText: string; + + if (this.action === 'rename') { + headerText = t.labels.renameSection; + } else if (this.action === 'create') { + headerText = t.labels.createSection; + } + + const headerEl = contentEl.createEl('div', { text: headerText }); + headerEl.addClass('modal-title'); + + // Input El + const inputEl = contentEl.createEl('input'); + + inputEl.style.cssText = 'width: 100%; height: 2.5em; margin-bottom: 15px;'; + if (this.action === 'rename') { + inputEl.value = this.section; + } + + inputEl.focus(); + + // Buttons + let changeButtonText: string; + + if (this.action === 'rename') { + changeButtonText = t.buttons.rename; + } else if (this.action === 'create') { + changeButtonText = t.buttons.createSection; + } + + const changeButton = contentEl.createEl('button', { text: changeButtonText }); + + const cancelButton = contentEl.createEl('button', { text: t.buttons.cancel }); + cancelButton.style.cssText = 'float: right;'; + cancelButton.addEventListener('click', () => { + myModal.close(); + }); + + const updateSections = (sections: SectionTree[]) => { + this.plugin.settings.spaces = sections; + this.plugin.saveSettings(); + + } + const onClickAction = async () => { + let newName = inputEl.value; + if (this.action === 'rename') { + updateSections(this.plugin.settings.spaces.map((s, i) => { + return i == this.sectionIndex ? { + ...s, section: newName + } : s + })); + } else if (this.action === 'create') { + updateSections([{section: newName, children: [], collapsed: false}, ...this.plugin.settings.spaces]); + } + myModal.close(); + }; + + // Event Listener + changeButton.addEventListener('click', onClickAction); + inputEl.addEventListener('keydown', (e) => { + if (e.key === 'Enter') onClickAction(); + }); + } + + onClose() { + let { contentEl } = this; + contentEl.empty(); + } +} \ No newline at end of file diff --git a/src/components/StickerMenu/StickerMenu.tsx b/src/components/StickerMenu/StickerMenu.tsx new file mode 100644 index 0000000..41c908e --- /dev/null +++ b/src/components/StickerMenu/StickerMenu.tsx @@ -0,0 +1,112 @@ + +import MakeMDPlugin from "main" +import { renderToStaticMarkup } from "react-dom/server" +import React from 'react' +import 'css/StickerMenu.css' +import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client' +import { + App, + Editor, + EditorPosition, + EditorSuggest, + EditorSuggestContext, + EditorSuggestTriggerInfo, + TFile, +} from "obsidian" +import { Emoji, EmojiData } from "./emojis" +import t from "i18n" +import { emojis } from "./emojis/default" +import { unifiedToNative } from "utils/utils"; + +export default class StickerMenu extends EditorSuggest { + inCmd = false + cmdStartCh = 0 + plugin: MakeMDPlugin + + constructor(app: App, plugin: MakeMDPlugin) { + super(app) + this.plugin = plugin + this.emojis = Object.keys(emojis as EmojiData).reduce((p,c) => [...p, ...emojis[c].map(e => ({ label: e.n[0], desc: e.n[1], variants: e.v, unicode: e.u}))], []) + + } + resetInfos() { + this.cmdStartCh = 0 + this.inCmd = false + } + + onTrigger( + cursor: EditorPosition, + editor: Editor, + _file: TFile + ): EditorSuggestTriggerInfo { + const currentLine = editor.getLine(cursor.line).slice(0, cursor.ch) + + if ( + !this.inCmd && + !(currentLine.slice(-2) == + " "+this.plugin.settings.emojiTriggerChar || currentLine[0] == + this.plugin.settings.emojiTriggerChar) + ) { + this.resetInfos() + return null + } + + if (!this.inCmd) { + this.cmdStartCh = currentLine.length - 1 + this.inCmd = true + } + + const currentCmd = currentLine.slice(this.cmdStartCh, cursor.ch) + + if ( + currentCmd.includes(" ") || + !currentCmd.includes(this.plugin.settings.emojiTriggerChar) + ) { + this.resetInfos() + return null + } + // @ts-ignore + this.suggestEl.classList.toggle('mk-emoji-menu', true); + return { start: cursor, end: cursor, query: currentCmd.slice(1) } + } + + emojis: Emoji[] + + + + getSuggestions( + context: EditorSuggestContext + ): Emoji[] | Promise { + const suggestions = this.emojis.filter(({ label, desc }) => + label.includes(context.query) || desc?.includes(context.query) + ) + + return suggestions.length > 0 + ? suggestions + : [{ label: t.commandsSuggest.noResult, unicode: '', desc: '' }] + } + + + renderSuggestion(value: Emoji, el: HTMLElement): void { + const div = document.createElement("div") + div.setAttribute('aria-label', value.label) + const reactElement = createRoot(div) + reactElement.render(<>{value.unicode.length > 0 ? unifiedToNative(value.unicode): t.commandsSuggest.noResult}) + el.appendChild(div) + } + + selectSuggestion(cmd: Emoji, _evt: MouseEvent | KeyboardEvent): void { + if (cmd.label === t.commandsSuggest.noResult) return + + this.context.editor.replaceRange( + unifiedToNative(cmd.unicode), + { ...this.context.start, ch: this.cmdStartCh }, + this.context.end + ) + + this.resetInfos() + + this.close() + } +} diff --git a/src/components/StickerMenu/emojis/default.ts b/src/components/StickerMenu/emojis/default.ts new file mode 100644 index 0000000..fe69dc4 --- /dev/null +++ b/src/components/StickerMenu/emojis/default.ts @@ -0,0 +1,3 @@ +import { EmojiData } from "."; + +export const emojis = {"smileys_people":[{"n":["grinning","grinning face"],"u":"1f600"},{"n":["smiley","smiling face with open mouth"],"u":"1f603"},{"n":["smile","smiling face with open mouth and smiling eyes"],"u":"1f604"},{"n":["grin","grinning face with smiling eyes"],"u":"1f601"},{"n":["laughing","satisfied","smiling face with open mouth and tightly-closed eyes"],"u":"1f606"},{"n":["sweat smile","smiling face with open mouth and cold sweat"],"u":"1f605"},{"n":["rolling on the floor laughing"],"u":"1f923"},{"n":["joy","face with tears of joy"],"u":"1f602"},{"n":["slightly smiling face"],"u":"1f642"},{"n":["upside-down face","upside down face"],"u":"1f643"},{"n":["melting face"],"u":"1fae0"},{"n":["wink","winking face"],"u":"1f609"},{"n":["blush","smiling face with smiling eyes"],"u":"1f60a"},{"n":["innocent","smiling face with halo"],"u":"1f607"},{"n":["smiling face with 3 hearts","smiling face with smiling eyes and three hearts"],"u":"1f970"},{"n":["heart eyes","smiling face with heart-shaped eyes"],"u":"1f60d"},{"n":["star-struck","grinning face with star eyes"],"u":"1f929"},{"n":["kissing heart","face throwing a kiss"],"u":"1f618"},{"n":["kissing","kissing face"],"u":"1f617"},{"n":["relaxed","white smiling face"],"u":"263a-fe0f"},{"n":["kissing closed eyes","kissing face with closed eyes"],"u":"1f61a"},{"n":["kissing smiling eyes","kissing face with smiling eyes"],"u":"1f619"},{"n":["smiling face with tear"],"u":"1f972"},{"n":["yum","face savouring delicious food"],"u":"1f60b"},{"n":["stuck out tongue","face with stuck-out tongue"],"u":"1f61b"},{"n":["stuck out tongue winking eye","face with stuck-out tongue and winking eye"],"u":"1f61c"},{"n":["zany face","grinning face with one large and one small eye"],"u":"1f92a"},{"n":["stuck out tongue closed eyes","face with stuck-out tongue and tightly-closed eyes"],"u":"1f61d"},{"n":["money-mouth face","money mouth face"],"u":"1f911"},{"n":["hugging face"],"u":"1f917"},{"n":["face with hand over mouth","smiling face with smiling eyes and hand covering mouth"],"u":"1f92d"},{"n":["face with open eyes and hand over mouth"],"u":"1fae2"},{"n":["face with peeking eye"],"u":"1fae3"},{"n":["shushing face","face with finger covering closed lips"],"u":"1f92b"},{"n":["thinking face"],"u":"1f914"},{"n":["saluting face"],"u":"1fae1"},{"n":["zipper-mouth face","zipper mouth face"],"u":"1f910"},{"n":["face with raised eyebrow","face with one eyebrow raised"],"u":"1f928"},{"n":["neutral face"],"u":"1f610"},{"n":["expressionless","expressionless face"],"u":"1f611"},{"n":["no mouth","face without mouth"],"u":"1f636"},{"n":["dotted line face"],"u":"1fae5"},{"n":["face in clouds"],"u":"1f636-200d-1f32b-fe0f"},{"n":["smirk","smirking face"],"u":"1f60f"},{"n":["unamused","unamused face"],"u":"1f612"},{"n":["face with rolling eyes"],"u":"1f644"},{"n":["grimacing","grimacing face"],"u":"1f62c"},{"n":["face exhaling"],"u":"1f62e-200d-1f4a8"},{"n":["lying face"],"u":"1f925"},{"n":["relieved","relieved face"],"u":"1f60c"},{"n":["pensive","pensive face"],"u":"1f614"},{"n":["sleepy","sleepy face"],"u":"1f62a"},{"n":["drooling face"],"u":"1f924"},{"n":["sleeping","sleeping face"],"u":"1f634"},{"n":["mask","face with medical mask"],"u":"1f637"},{"n":["face with thermometer"],"u":"1f912"},{"n":["face with head-bandage","face with head bandage"],"u":"1f915"},{"n":["nauseated face"],"u":"1f922"},{"n":["face vomiting","face with open mouth vomiting"],"u":"1f92e"},{"n":["sneezing face"],"u":"1f927"},{"n":["hot face","overheated face"],"u":"1f975"},{"n":["cold face","freezing face"],"u":"1f976"},{"n":["woozy face","face with uneven eyes and wavy mouth"],"u":"1f974"},{"n":["dizzy face"],"u":"1f635"},{"n":["face with spiral eyes"],"u":"1f635-200d-1f4ab"},{"n":["exploding head","shocked face with exploding head"],"u":"1f92f"},{"n":["face with cowboy hat"],"u":"1f920"},{"n":["partying face","face with party horn and party hat"],"u":"1f973"},{"n":["disguised face"],"u":"1f978"},{"n":["sunglasses","smiling face with sunglasses"],"u":"1f60e"},{"n":["nerd face"],"u":"1f913"},{"n":["face with monocle"],"u":"1f9d0"},{"n":["confused","confused face"],"u":"1f615"},{"n":["face with diagonal mouth"],"u":"1fae4"},{"n":["worried","worried face"],"u":"1f61f"},{"n":["slightly frowning face"],"u":"1f641"},{"n":["frowning face","white frowning face"],"u":"2639-fe0f"},{"n":["open mouth","face with open mouth"],"u":"1f62e"},{"n":["hushed","hushed face"],"u":"1f62f"},{"n":["astonished","astonished face"],"u":"1f632"},{"n":["flushed","flushed face"],"u":"1f633"},{"n":["pleading face","face with pleading eyes"],"u":"1f97a"},{"n":["face holding back tears"],"u":"1f979"},{"n":["frowning","frowning face with open mouth"],"u":"1f626"},{"n":["anguished","anguished face"],"u":"1f627"},{"n":["fearful","fearful face"],"u":"1f628"},{"n":["cold sweat","face with open mouth and cold sweat"],"u":"1f630"},{"n":["disappointed relieved","disappointed but relieved face"],"u":"1f625"},{"n":["cry","crying face"],"u":"1f622"},{"n":["sob","loudly crying face"],"u":"1f62d"},{"n":["scream","face screaming in fear"],"u":"1f631"},{"n":["confounded","confounded face"],"u":"1f616"},{"n":["persevere","persevering face"],"u":"1f623"},{"n":["disappointed","disappointed face"],"u":"1f61e"},{"n":["sweat","face with cold sweat"],"u":"1f613"},{"n":["weary","weary face"],"u":"1f629"},{"n":["tired face"],"u":"1f62b"},{"n":["yawning face"],"u":"1f971"},{"n":["triumph","face with look of triumph"],"u":"1f624"},{"n":["rage","pouting face"],"u":"1f621"},{"n":["angry","angry face"],"u":"1f620"},{"n":["face with symbols on mouth","serious face with symbols covering mouth"],"u":"1f92c"},{"n":["smiling imp","smiling face with horns"],"u":"1f608"},{"n":["imp"],"u":"1f47f"},{"n":["skull"],"u":"1f480"},{"n":["skull and crossbones"],"u":"2620-fe0f"},{"n":["poop","shit","hankey","pile of poo"],"u":"1f4a9"},{"n":["clown face"],"u":"1f921"},{"n":["japanese ogre"],"u":"1f479"},{"n":["japanese goblin"],"u":"1f47a"},{"n":["ghost"],"u":"1f47b"},{"n":["alien","extraterrestrial alien"],"u":"1f47d"},{"n":["alien monster","space invader"],"u":"1f47e"},{"n":["robot face"],"u":"1f916"},{"n":["smiley cat","smiling cat face with open mouth"],"u":"1f63a"},{"n":["smile cat","grinning cat face with smiling eyes"],"u":"1f638"},{"n":["joy cat","cat face with tears of joy"],"u":"1f639"},{"n":["heart eyes cat","smiling cat face with heart-shaped eyes"],"u":"1f63b"},{"n":["smirk cat","cat face with wry smile"],"u":"1f63c"},{"n":["kissing cat","kissing cat face with closed eyes"],"u":"1f63d"},{"n":["scream cat","weary cat face"],"u":"1f640"},{"n":["crying cat face"],"u":"1f63f"},{"n":["pouting cat","pouting cat face"],"u":"1f63e"},{"n":["see no evil","see-no-evil monkey"],"u":"1f648"},{"n":["hear no evil","hear-no-evil monkey"],"u":"1f649"},{"n":["speak no evil","speak-no-evil monkey"],"u":"1f64a"},{"n":["kiss","kiss mark"],"u":"1f48b"},{"n":["love letter"],"u":"1f48c"},{"n":["cupid","heart with arrow"],"u":"1f498"},{"n":["gift heart","heart with ribbon"],"u":"1f49d"},{"n":["sparkling heart"],"u":"1f496"},{"n":["heartpulse","growing heart"],"u":"1f497"},{"n":["heartbeat","beating heart"],"u":"1f493"},{"n":["revolving hearts"],"u":"1f49e"},{"n":["two hearts"],"u":"1f495"},{"n":["heart decoration"],"u":"1f49f"},{"n":["heart exclamation","heavy heart exclamation mark ornament"],"u":"2763-fe0f"},{"n":["broken heart"],"u":"1f494"},{"n":["heart on fire"],"u":"2764-fe0f-200d-1f525"},{"n":["mending heart"],"u":"2764-fe0f-200d-1fa79"},{"n":["heart","heavy black heart"],"u":"2764-fe0f"},{"n":["orange heart"],"u":"1f9e1"},{"n":["yellow heart"],"u":"1f49b"},{"n":["green heart"],"u":"1f49a"},{"n":["blue heart"],"u":"1f499"},{"n":["purple heart"],"u":"1f49c"},{"n":["brown heart"],"u":"1f90e"},{"n":["black heart"],"u":"1f5a4"},{"n":["white heart"],"u":"1f90d"},{"n":["100","hundred points symbol"],"u":"1f4af"},{"n":["anger","anger symbol"],"u":"1f4a2"},{"n":["boom","collision","collision symbol"],"u":"1f4a5"},{"n":["dizzy","dizzy symbol"],"u":"1f4ab"},{"n":["sweat drops","splashing sweat symbol"],"u":"1f4a6"},{"n":["dash","dash symbol"],"u":"1f4a8"},{"n":["hole"],"u":"1f573-fe0f"},{"n":["bomb"],"u":"1f4a3"},{"n":["speech balloon"],"u":"1f4ac"},{"n":["eye in speech bubble","eye-in-speech-bubble"],"u":"1f441-fe0f-200d-1f5e8-fe0f"},{"n":["left speech bubble"],"u":"1f5e8-fe0f"},{"n":["right anger bubble"],"u":"1f5ef-fe0f"},{"n":["thought balloon"],"u":"1f4ad"},{"n":["zzz","sleeping symbol"],"u":"1f4a4"},{"n":["wave","waving hand sign"],"u":"1f44b","v":["1f44b-1f3fb","1f44b-1f3fc","1f44b-1f3fd","1f44b-1f3fe","1f44b-1f3ff"]},{"n":["raised back of hand"],"u":"1f91a","v":["1f91a-1f3fb","1f91a-1f3fc","1f91a-1f3fd","1f91a-1f3fe","1f91a-1f3ff"]},{"n":["hand with fingers splayed","raised hand with fingers splayed"],"u":"1f590-fe0f","v":["1f590-1f3fb","1f590-1f3fc","1f590-1f3fd","1f590-1f3fe","1f590-1f3ff"]},{"n":["hand","raised hand"],"u":"270b","v":["270b-1f3fb","270b-1f3fc","270b-1f3fd","270b-1f3fe","270b-1f3ff"]},{"n":["spock-hand","raised hand with part between middle and ring fingers"],"u":"1f596","v":["1f596-1f3fb","1f596-1f3fc","1f596-1f3fd","1f596-1f3fe","1f596-1f3ff"]},{"n":["rightwards hand"],"u":"1faf1","v":["1faf1-1f3fb","1faf1-1f3fc","1faf1-1f3fd","1faf1-1f3fe","1faf1-1f3ff"]},{"n":["leftwards hand"],"u":"1faf2","v":["1faf2-1f3fb","1faf2-1f3fc","1faf2-1f3fd","1faf2-1f3fe","1faf2-1f3ff"]},{"n":["palm down hand"],"u":"1faf3","v":["1faf3-1f3fb","1faf3-1f3fc","1faf3-1f3fd","1faf3-1f3fe","1faf3-1f3ff"]},{"n":["palm up hand"],"u":"1faf4","v":["1faf4-1f3fb","1faf4-1f3fc","1faf4-1f3fd","1faf4-1f3fe","1faf4-1f3ff"]},{"n":["ok hand","ok hand sign"],"u":"1f44c","v":["1f44c-1f3fb","1f44c-1f3fc","1f44c-1f3fd","1f44c-1f3fe","1f44c-1f3ff"]},{"n":["pinched fingers"],"u":"1f90c","v":["1f90c-1f3fb","1f90c-1f3fc","1f90c-1f3fd","1f90c-1f3fe","1f90c-1f3ff"]},{"n":["pinching hand"],"u":"1f90f","v":["1f90f-1f3fb","1f90f-1f3fc","1f90f-1f3fd","1f90f-1f3fe","1f90f-1f3ff"]},{"n":["v","victory hand"],"u":"270c-fe0f","v":["270c-1f3fb","270c-1f3fc","270c-1f3fd","270c-1f3fe","270c-1f3ff"]},{"n":["crossed fingers","hand with index and middle fingers crossed"],"u":"1f91e","v":["1f91e-1f3fb","1f91e-1f3fc","1f91e-1f3fd","1f91e-1f3fe","1f91e-1f3ff"]},{"n":["hand with index finger and thumb crossed"],"u":"1faf0","v":["1faf0-1f3fb","1faf0-1f3fc","1faf0-1f3fd","1faf0-1f3fe","1faf0-1f3ff"]},{"n":["i love you hand sign"],"u":"1f91f","v":["1f91f-1f3fb","1f91f-1f3fc","1f91f-1f3fd","1f91f-1f3fe","1f91f-1f3ff"]},{"n":["the horns","sign of the horns"],"u":"1f918","v":["1f918-1f3fb","1f918-1f3fc","1f918-1f3fd","1f918-1f3fe","1f918-1f3ff"]},{"n":["call me hand"],"u":"1f919","v":["1f919-1f3fb","1f919-1f3fc","1f919-1f3fd","1f919-1f3fe","1f919-1f3ff"]},{"n":["point left","white left pointing backhand index"],"u":"1f448","v":["1f448-1f3fb","1f448-1f3fc","1f448-1f3fd","1f448-1f3fe","1f448-1f3ff"]},{"n":["point right","white right pointing backhand index"],"u":"1f449","v":["1f449-1f3fb","1f449-1f3fc","1f449-1f3fd","1f449-1f3fe","1f449-1f3ff"]},{"n":["point up 2","white up pointing backhand index"],"u":"1f446","v":["1f446-1f3fb","1f446-1f3fc","1f446-1f3fd","1f446-1f3fe","1f446-1f3ff"]},{"n":["middle finger","reversed hand with middle finger extended"],"u":"1f595","v":["1f595-1f3fb","1f595-1f3fc","1f595-1f3fd","1f595-1f3fe","1f595-1f3ff"]},{"n":["point down","white down pointing backhand index"],"u":"1f447","v":["1f447-1f3fb","1f447-1f3fc","1f447-1f3fd","1f447-1f3fe","1f447-1f3ff"]},{"n":["point up","white up pointing index"],"u":"261d-fe0f","v":["261d-1f3fb","261d-1f3fc","261d-1f3fd","261d-1f3fe","261d-1f3ff"]},{"n":["index pointing at the viewer"],"u":"1faf5","v":["1faf5-1f3fb","1faf5-1f3fc","1faf5-1f3fd","1faf5-1f3fe","1faf5-1f3ff"]},{"n":["+1","thumbsup","thumbs up sign"],"u":"1f44d","v":["1f44d-1f3fb","1f44d-1f3fc","1f44d-1f3fd","1f44d-1f3fe","1f44d-1f3ff"]},{"n":["-1","thumbsdown","thumbs down sign"],"u":"1f44e","v":["1f44e-1f3fb","1f44e-1f3fc","1f44e-1f3fd","1f44e-1f3fe","1f44e-1f3ff"]},{"n":["fist","raised fist"],"u":"270a","v":["270a-1f3fb","270a-1f3fc","270a-1f3fd","270a-1f3fe","270a-1f3ff"]},{"n":["punch","facepunch","fisted hand sign"],"u":"1f44a","v":["1f44a-1f3fb","1f44a-1f3fc","1f44a-1f3fd","1f44a-1f3fe","1f44a-1f3ff"]},{"n":["left-facing fist"],"u":"1f91b","v":["1f91b-1f3fb","1f91b-1f3fc","1f91b-1f3fd","1f91b-1f3fe","1f91b-1f3ff"]},{"n":["right-facing fist"],"u":"1f91c","v":["1f91c-1f3fb","1f91c-1f3fc","1f91c-1f3fd","1f91c-1f3fe","1f91c-1f3ff"]},{"n":["clap","clapping hands sign"],"u":"1f44f","v":["1f44f-1f3fb","1f44f-1f3fc","1f44f-1f3fd","1f44f-1f3fe","1f44f-1f3ff"]},{"n":["raised hands","person raising both hands in celebration"],"u":"1f64c","v":["1f64c-1f3fb","1f64c-1f3fc","1f64c-1f3fd","1f64c-1f3fe","1f64c-1f3ff"]},{"n":["heart hands"],"u":"1faf6","v":["1faf6-1f3fb","1faf6-1f3fc","1faf6-1f3fd","1faf6-1f3fe","1faf6-1f3ff"]},{"n":["open hands","open hands sign"],"u":"1f450","v":["1f450-1f3fb","1f450-1f3fc","1f450-1f3fd","1f450-1f3fe","1f450-1f3ff"]},{"n":["palms up together"],"u":"1f932","v":["1f932-1f3fb","1f932-1f3fc","1f932-1f3fd","1f932-1f3fe","1f932-1f3ff"]},{"n":["handshake"],"u":"1f91d","v":["1f91d-1f3fb","1f91d-1f3fc","1f91d-1f3fd","1f91d-1f3fe","1f91d-1f3ff","1faf1-1f3fb-200d-1faf2-1f3fc","1faf1-1f3fb-200d-1faf2-1f3fd","1faf1-1f3fb-200d-1faf2-1f3fe","1faf1-1f3fb-200d-1faf2-1f3ff","1faf1-1f3fc-200d-1faf2-1f3fb","1faf1-1f3fc-200d-1faf2-1f3fd","1faf1-1f3fc-200d-1faf2-1f3fe","1faf1-1f3fc-200d-1faf2-1f3ff","1faf1-1f3fd-200d-1faf2-1f3fb","1faf1-1f3fd-200d-1faf2-1f3fc","1faf1-1f3fd-200d-1faf2-1f3fe","1faf1-1f3fd-200d-1faf2-1f3ff","1faf1-1f3fe-200d-1faf2-1f3fb","1faf1-1f3fe-200d-1faf2-1f3fc","1faf1-1f3fe-200d-1faf2-1f3fd","1faf1-1f3fe-200d-1faf2-1f3ff","1faf1-1f3ff-200d-1faf2-1f3fb","1faf1-1f3ff-200d-1faf2-1f3fc","1faf1-1f3ff-200d-1faf2-1f3fd","1faf1-1f3ff-200d-1faf2-1f3fe"]},{"n":["pray","person with folded hands"],"u":"1f64f","v":["1f64f-1f3fb","1f64f-1f3fc","1f64f-1f3fd","1f64f-1f3fe","1f64f-1f3ff"]},{"n":["writing hand"],"u":"270d-fe0f","v":["270d-1f3fb","270d-1f3fc","270d-1f3fd","270d-1f3fe","270d-1f3ff"]},{"n":["nail care","nail polish"],"u":"1f485","v":["1f485-1f3fb","1f485-1f3fc","1f485-1f3fd","1f485-1f3fe","1f485-1f3ff"]},{"n":["selfie"],"u":"1f933","v":["1f933-1f3fb","1f933-1f3fc","1f933-1f3fd","1f933-1f3fe","1f933-1f3ff"]},{"n":["muscle","flexed biceps"],"u":"1f4aa","v":["1f4aa-1f3fb","1f4aa-1f3fc","1f4aa-1f3fd","1f4aa-1f3fe","1f4aa-1f3ff"]},{"n":["mechanical arm"],"u":"1f9be"},{"n":["mechanical leg"],"u":"1f9bf"},{"n":["leg"],"u":"1f9b5","v":["1f9b5-1f3fb","1f9b5-1f3fc","1f9b5-1f3fd","1f9b5-1f3fe","1f9b5-1f3ff"]},{"n":["foot"],"u":"1f9b6","v":["1f9b6-1f3fb","1f9b6-1f3fc","1f9b6-1f3fd","1f9b6-1f3fe","1f9b6-1f3ff"]},{"n":["ear"],"u":"1f442","v":["1f442-1f3fb","1f442-1f3fc","1f442-1f3fd","1f442-1f3fe","1f442-1f3ff"]},{"n":["ear with hearing aid"],"u":"1f9bb","v":["1f9bb-1f3fb","1f9bb-1f3fc","1f9bb-1f3fd","1f9bb-1f3fe","1f9bb-1f3ff"]},{"n":["nose"],"u":"1f443","v":["1f443-1f3fb","1f443-1f3fc","1f443-1f3fd","1f443-1f3fe","1f443-1f3ff"]},{"n":["brain"],"u":"1f9e0"},{"n":["anatomical heart"],"u":"1fac0"},{"n":["lungs"],"u":"1fac1"},{"n":["tooth"],"u":"1f9b7"},{"n":["bone"],"u":"1f9b4"},{"n":["eyes"],"u":"1f440"},{"n":["eye"],"u":"1f441-fe0f"},{"n":["tongue"],"u":"1f445"},{"n":["lips","mouth"],"u":"1f444"},{"n":["biting lip"],"u":"1fae6"},{"n":["baby"],"u":"1f476","v":["1f476-1f3fb","1f476-1f3fc","1f476-1f3fd","1f476-1f3fe","1f476-1f3ff"]},{"n":["child"],"u":"1f9d2","v":["1f9d2-1f3fb","1f9d2-1f3fc","1f9d2-1f3fd","1f9d2-1f3fe","1f9d2-1f3ff"]},{"n":["boy"],"u":"1f466","v":["1f466-1f3fb","1f466-1f3fc","1f466-1f3fd","1f466-1f3fe","1f466-1f3ff"]},{"n":["girl"],"u":"1f467","v":["1f467-1f3fb","1f467-1f3fc","1f467-1f3fd","1f467-1f3fe","1f467-1f3ff"]},{"n":["adult"],"u":"1f9d1","v":["1f9d1-1f3fb","1f9d1-1f3fc","1f9d1-1f3fd","1f9d1-1f3fe","1f9d1-1f3ff"]},{"n":["person with blond hair"],"u":"1f471","v":["1f471-1f3fb","1f471-1f3fc","1f471-1f3fd","1f471-1f3fe","1f471-1f3ff"]},{"n":["man"],"u":"1f468","v":["1f468-1f3fb","1f468-1f3fc","1f468-1f3fd","1f468-1f3fe","1f468-1f3ff"]},{"n":["bearded person"],"u":"1f9d4","v":["1f9d4-1f3fb","1f9d4-1f3fc","1f9d4-1f3fd","1f9d4-1f3fe","1f9d4-1f3ff"]},{"n":["man: beard","man with beard"],"u":"1f9d4-200d-2642-fe0f","v":["1f9d4-1f3fb-200d-2642-fe0f","1f9d4-1f3fc-200d-2642-fe0f","1f9d4-1f3fd-200d-2642-fe0f","1f9d4-1f3fe-200d-2642-fe0f","1f9d4-1f3ff-200d-2642-fe0f"]},{"n":["woman: beard","woman with beard"],"u":"1f9d4-200d-2640-fe0f","v":["1f9d4-1f3fb-200d-2640-fe0f","1f9d4-1f3fc-200d-2640-fe0f","1f9d4-1f3fd-200d-2640-fe0f","1f9d4-1f3fe-200d-2640-fe0f","1f9d4-1f3ff-200d-2640-fe0f"]},{"n":["man: red hair","red haired man"],"u":"1f468-200d-1f9b0","v":["1f468-1f3fb-200d-1f9b0","1f468-1f3fc-200d-1f9b0","1f468-1f3fd-200d-1f9b0","1f468-1f3fe-200d-1f9b0","1f468-1f3ff-200d-1f9b0"]},{"n":["man: curly hair","curly haired man"],"u":"1f468-200d-1f9b1","v":["1f468-1f3fb-200d-1f9b1","1f468-1f3fc-200d-1f9b1","1f468-1f3fd-200d-1f9b1","1f468-1f3fe-200d-1f9b1","1f468-1f3ff-200d-1f9b1"]},{"n":["man: white hair","white haired man"],"u":"1f468-200d-1f9b3","v":["1f468-1f3fb-200d-1f9b3","1f468-1f3fc-200d-1f9b3","1f468-1f3fd-200d-1f9b3","1f468-1f3fe-200d-1f9b3","1f468-1f3ff-200d-1f9b3"]},{"n":["bald man","man: bald"],"u":"1f468-200d-1f9b2","v":["1f468-1f3fb-200d-1f9b2","1f468-1f3fc-200d-1f9b2","1f468-1f3fd-200d-1f9b2","1f468-1f3fe-200d-1f9b2","1f468-1f3ff-200d-1f9b2"]},{"n":["woman"],"u":"1f469","v":["1f469-1f3fb","1f469-1f3fc","1f469-1f3fd","1f469-1f3fe","1f469-1f3ff"]},{"n":["woman: red hair","red haired woman"],"u":"1f469-200d-1f9b0","v":["1f469-1f3fb-200d-1f9b0","1f469-1f3fc-200d-1f9b0","1f469-1f3fd-200d-1f9b0","1f469-1f3fe-200d-1f9b0","1f469-1f3ff-200d-1f9b0"]},{"n":["person: red hair","red haired person"],"u":"1f9d1-200d-1f9b0","v":["1f9d1-1f3fb-200d-1f9b0","1f9d1-1f3fc-200d-1f9b0","1f9d1-1f3fd-200d-1f9b0","1f9d1-1f3fe-200d-1f9b0","1f9d1-1f3ff-200d-1f9b0"]},{"n":["woman: curly hair","curly haired woman"],"u":"1f469-200d-1f9b1","v":["1f469-1f3fb-200d-1f9b1","1f469-1f3fc-200d-1f9b1","1f469-1f3fd-200d-1f9b1","1f469-1f3fe-200d-1f9b1","1f469-1f3ff-200d-1f9b1"]},{"n":["person: curly hair","curly haired person"],"u":"1f9d1-200d-1f9b1","v":["1f9d1-1f3fb-200d-1f9b1","1f9d1-1f3fc-200d-1f9b1","1f9d1-1f3fd-200d-1f9b1","1f9d1-1f3fe-200d-1f9b1","1f9d1-1f3ff-200d-1f9b1"]},{"n":["woman: white hair","white haired woman"],"u":"1f469-200d-1f9b3","v":["1f469-1f3fb-200d-1f9b3","1f469-1f3fc-200d-1f9b3","1f469-1f3fd-200d-1f9b3","1f469-1f3fe-200d-1f9b3","1f469-1f3ff-200d-1f9b3"]},{"n":["person: white hair","white haired person"],"u":"1f9d1-200d-1f9b3","v":["1f9d1-1f3fb-200d-1f9b3","1f9d1-1f3fc-200d-1f9b3","1f9d1-1f3fd-200d-1f9b3","1f9d1-1f3fe-200d-1f9b3","1f9d1-1f3ff-200d-1f9b3"]},{"n":["bald woman","woman: bald"],"u":"1f469-200d-1f9b2","v":["1f469-1f3fb-200d-1f9b2","1f469-1f3fc-200d-1f9b2","1f469-1f3fd-200d-1f9b2","1f469-1f3fe-200d-1f9b2","1f469-1f3ff-200d-1f9b2"]},{"n":["bald person","person: bald"],"u":"1f9d1-200d-1f9b2","v":["1f9d1-1f3fb-200d-1f9b2","1f9d1-1f3fc-200d-1f9b2","1f9d1-1f3fd-200d-1f9b2","1f9d1-1f3fe-200d-1f9b2","1f9d1-1f3ff-200d-1f9b2"]},{"n":["woman: blond hair","blond-haired-woman"],"u":"1f471-200d-2640-fe0f","v":["1f471-1f3fb-200d-2640-fe0f","1f471-1f3fc-200d-2640-fe0f","1f471-1f3fd-200d-2640-fe0f","1f471-1f3fe-200d-2640-fe0f","1f471-1f3ff-200d-2640-fe0f"]},{"n":["man: blond hair","blond-haired-man"],"u":"1f471-200d-2642-fe0f","v":["1f471-1f3fb-200d-2642-fe0f","1f471-1f3fc-200d-2642-fe0f","1f471-1f3fd-200d-2642-fe0f","1f471-1f3fe-200d-2642-fe0f","1f471-1f3ff-200d-2642-fe0f"]},{"n":["older adult"],"u":"1f9d3","v":["1f9d3-1f3fb","1f9d3-1f3fc","1f9d3-1f3fd","1f9d3-1f3fe","1f9d3-1f3ff"]},{"n":["older man"],"u":"1f474","v":["1f474-1f3fb","1f474-1f3fc","1f474-1f3fd","1f474-1f3fe","1f474-1f3ff"]},{"n":["older woman"],"u":"1f475","v":["1f475-1f3fb","1f475-1f3fc","1f475-1f3fd","1f475-1f3fe","1f475-1f3ff"]},{"n":["person frowning"],"u":"1f64d","v":["1f64d-1f3fb","1f64d-1f3fc","1f64d-1f3fd","1f64d-1f3fe","1f64d-1f3ff"]},{"n":["man frowning","man-frowning"],"u":"1f64d-200d-2642-fe0f","v":["1f64d-1f3fb-200d-2642-fe0f","1f64d-1f3fc-200d-2642-fe0f","1f64d-1f3fd-200d-2642-fe0f","1f64d-1f3fe-200d-2642-fe0f","1f64d-1f3ff-200d-2642-fe0f"]},{"n":["woman frowning","woman-frowning"],"u":"1f64d-200d-2640-fe0f","v":["1f64d-1f3fb-200d-2640-fe0f","1f64d-1f3fc-200d-2640-fe0f","1f64d-1f3fd-200d-2640-fe0f","1f64d-1f3fe-200d-2640-fe0f","1f64d-1f3ff-200d-2640-fe0f"]},{"n":["person with pouting face"],"u":"1f64e","v":["1f64e-1f3fb","1f64e-1f3fc","1f64e-1f3fd","1f64e-1f3fe","1f64e-1f3ff"]},{"n":["man pouting","man-pouting"],"u":"1f64e-200d-2642-fe0f","v":["1f64e-1f3fb-200d-2642-fe0f","1f64e-1f3fc-200d-2642-fe0f","1f64e-1f3fd-200d-2642-fe0f","1f64e-1f3fe-200d-2642-fe0f","1f64e-1f3ff-200d-2642-fe0f"]},{"n":["woman pouting","woman-pouting"],"u":"1f64e-200d-2640-fe0f","v":["1f64e-1f3fb-200d-2640-fe0f","1f64e-1f3fc-200d-2640-fe0f","1f64e-1f3fd-200d-2640-fe0f","1f64e-1f3fe-200d-2640-fe0f","1f64e-1f3ff-200d-2640-fe0f"]},{"n":["no good","face with no good gesture"],"u":"1f645","v":["1f645-1f3fb","1f645-1f3fc","1f645-1f3fd","1f645-1f3fe","1f645-1f3ff"]},{"n":["man gesturing no","man-gesturing-no"],"u":"1f645-200d-2642-fe0f","v":["1f645-1f3fb-200d-2642-fe0f","1f645-1f3fc-200d-2642-fe0f","1f645-1f3fd-200d-2642-fe0f","1f645-1f3fe-200d-2642-fe0f","1f645-1f3ff-200d-2642-fe0f"]},{"n":["woman gesturing no","woman-gesturing-no"],"u":"1f645-200d-2640-fe0f","v":["1f645-1f3fb-200d-2640-fe0f","1f645-1f3fc-200d-2640-fe0f","1f645-1f3fd-200d-2640-fe0f","1f645-1f3fe-200d-2640-fe0f","1f645-1f3ff-200d-2640-fe0f"]},{"n":["ok woman","face with ok gesture"],"u":"1f646","v":["1f646-1f3fb","1f646-1f3fc","1f646-1f3fd","1f646-1f3fe","1f646-1f3ff"]},{"n":["man gesturing ok","man-gesturing-ok"],"u":"1f646-200d-2642-fe0f","v":["1f646-1f3fb-200d-2642-fe0f","1f646-1f3fc-200d-2642-fe0f","1f646-1f3fd-200d-2642-fe0f","1f646-1f3fe-200d-2642-fe0f","1f646-1f3ff-200d-2642-fe0f"]},{"n":["woman gesturing ok","woman-gesturing-ok"],"u":"1f646-200d-2640-fe0f","v":["1f646-1f3fb-200d-2640-fe0f","1f646-1f3fc-200d-2640-fe0f","1f646-1f3fd-200d-2640-fe0f","1f646-1f3fe-200d-2640-fe0f","1f646-1f3ff-200d-2640-fe0f"]},{"n":["information desk person"],"u":"1f481","v":["1f481-1f3fb","1f481-1f3fc","1f481-1f3fd","1f481-1f3fe","1f481-1f3ff"]},{"n":["man tipping hand","man-tipping-hand"],"u":"1f481-200d-2642-fe0f","v":["1f481-1f3fb-200d-2642-fe0f","1f481-1f3fc-200d-2642-fe0f","1f481-1f3fd-200d-2642-fe0f","1f481-1f3fe-200d-2642-fe0f","1f481-1f3ff-200d-2642-fe0f"]},{"n":["woman tipping hand","woman-tipping-hand"],"u":"1f481-200d-2640-fe0f","v":["1f481-1f3fb-200d-2640-fe0f","1f481-1f3fc-200d-2640-fe0f","1f481-1f3fd-200d-2640-fe0f","1f481-1f3fe-200d-2640-fe0f","1f481-1f3ff-200d-2640-fe0f"]},{"n":["raising hand","happy person raising one hand"],"u":"1f64b","v":["1f64b-1f3fb","1f64b-1f3fc","1f64b-1f3fd","1f64b-1f3fe","1f64b-1f3ff"]},{"n":["man raising hand","man-raising-hand"],"u":"1f64b-200d-2642-fe0f","v":["1f64b-1f3fb-200d-2642-fe0f","1f64b-1f3fc-200d-2642-fe0f","1f64b-1f3fd-200d-2642-fe0f","1f64b-1f3fe-200d-2642-fe0f","1f64b-1f3ff-200d-2642-fe0f"]},{"n":["woman raising hand","woman-raising-hand"],"u":"1f64b-200d-2640-fe0f","v":["1f64b-1f3fb-200d-2640-fe0f","1f64b-1f3fc-200d-2640-fe0f","1f64b-1f3fd-200d-2640-fe0f","1f64b-1f3fe-200d-2640-fe0f","1f64b-1f3ff-200d-2640-fe0f"]},{"n":["deaf person"],"u":"1f9cf","v":["1f9cf-1f3fb","1f9cf-1f3fc","1f9cf-1f3fd","1f9cf-1f3fe","1f9cf-1f3ff"]},{"n":["deaf man"],"u":"1f9cf-200d-2642-fe0f","v":["1f9cf-1f3fb-200d-2642-fe0f","1f9cf-1f3fc-200d-2642-fe0f","1f9cf-1f3fd-200d-2642-fe0f","1f9cf-1f3fe-200d-2642-fe0f","1f9cf-1f3ff-200d-2642-fe0f"]},{"n":["deaf woman"],"u":"1f9cf-200d-2640-fe0f","v":["1f9cf-1f3fb-200d-2640-fe0f","1f9cf-1f3fc-200d-2640-fe0f","1f9cf-1f3fd-200d-2640-fe0f","1f9cf-1f3fe-200d-2640-fe0f","1f9cf-1f3ff-200d-2640-fe0f"]},{"n":["bow","person bowing deeply"],"u":"1f647","v":["1f647-1f3fb","1f647-1f3fc","1f647-1f3fd","1f647-1f3fe","1f647-1f3ff"]},{"n":["man bowing","man-bowing"],"u":"1f647-200d-2642-fe0f","v":["1f647-1f3fb-200d-2642-fe0f","1f647-1f3fc-200d-2642-fe0f","1f647-1f3fd-200d-2642-fe0f","1f647-1f3fe-200d-2642-fe0f","1f647-1f3ff-200d-2642-fe0f"]},{"n":["woman bowing","woman-bowing"],"u":"1f647-200d-2640-fe0f","v":["1f647-1f3fb-200d-2640-fe0f","1f647-1f3fc-200d-2640-fe0f","1f647-1f3fd-200d-2640-fe0f","1f647-1f3fe-200d-2640-fe0f","1f647-1f3ff-200d-2640-fe0f"]},{"n":["face palm"],"u":"1f926","v":["1f926-1f3fb","1f926-1f3fc","1f926-1f3fd","1f926-1f3fe","1f926-1f3ff"]},{"n":["man facepalming","man-facepalming"],"u":"1f926-200d-2642-fe0f","v":["1f926-1f3fb-200d-2642-fe0f","1f926-1f3fc-200d-2642-fe0f","1f926-1f3fd-200d-2642-fe0f","1f926-1f3fe-200d-2642-fe0f","1f926-1f3ff-200d-2642-fe0f"]},{"n":["woman facepalming","woman-facepalming"],"u":"1f926-200d-2640-fe0f","v":["1f926-1f3fb-200d-2640-fe0f","1f926-1f3fc-200d-2640-fe0f","1f926-1f3fd-200d-2640-fe0f","1f926-1f3fe-200d-2640-fe0f","1f926-1f3ff-200d-2640-fe0f"]},{"n":["shrug"],"u":"1f937","v":["1f937-1f3fb","1f937-1f3fc","1f937-1f3fd","1f937-1f3fe","1f937-1f3ff"]},{"n":["man shrugging","man-shrugging"],"u":"1f937-200d-2642-fe0f","v":["1f937-1f3fb-200d-2642-fe0f","1f937-1f3fc-200d-2642-fe0f","1f937-1f3fd-200d-2642-fe0f","1f937-1f3fe-200d-2642-fe0f","1f937-1f3ff-200d-2642-fe0f"]},{"n":["woman shrugging","woman-shrugging"],"u":"1f937-200d-2640-fe0f","v":["1f937-1f3fb-200d-2640-fe0f","1f937-1f3fc-200d-2640-fe0f","1f937-1f3fd-200d-2640-fe0f","1f937-1f3fe-200d-2640-fe0f","1f937-1f3ff-200d-2640-fe0f"]},{"n":["health worker"],"u":"1f9d1-200d-2695-fe0f","v":["1f9d1-1f3fb-200d-2695-fe0f","1f9d1-1f3fc-200d-2695-fe0f","1f9d1-1f3fd-200d-2695-fe0f","1f9d1-1f3fe-200d-2695-fe0f","1f9d1-1f3ff-200d-2695-fe0f"]},{"n":["male-doctor","man health worker"],"u":"1f468-200d-2695-fe0f","v":["1f468-1f3fb-200d-2695-fe0f","1f468-1f3fc-200d-2695-fe0f","1f468-1f3fd-200d-2695-fe0f","1f468-1f3fe-200d-2695-fe0f","1f468-1f3ff-200d-2695-fe0f"]},{"n":["female-doctor","woman health worker"],"u":"1f469-200d-2695-fe0f","v":["1f469-1f3fb-200d-2695-fe0f","1f469-1f3fc-200d-2695-fe0f","1f469-1f3fd-200d-2695-fe0f","1f469-1f3fe-200d-2695-fe0f","1f469-1f3ff-200d-2695-fe0f"]},{"n":["student"],"u":"1f9d1-200d-1f393","v":["1f9d1-1f3fb-200d-1f393","1f9d1-1f3fc-200d-1f393","1f9d1-1f3fd-200d-1f393","1f9d1-1f3fe-200d-1f393","1f9d1-1f3ff-200d-1f393"]},{"n":["man student","male-student"],"u":"1f468-200d-1f393","v":["1f468-1f3fb-200d-1f393","1f468-1f3fc-200d-1f393","1f468-1f3fd-200d-1f393","1f468-1f3fe-200d-1f393","1f468-1f3ff-200d-1f393"]},{"n":["woman student","female-student"],"u":"1f469-200d-1f393","v":["1f469-1f3fb-200d-1f393","1f469-1f3fc-200d-1f393","1f469-1f3fd-200d-1f393","1f469-1f3fe-200d-1f393","1f469-1f3ff-200d-1f393"]},{"n":["teacher"],"u":"1f9d1-200d-1f3eb","v":["1f9d1-1f3fb-200d-1f3eb","1f9d1-1f3fc-200d-1f3eb","1f9d1-1f3fd-200d-1f3eb","1f9d1-1f3fe-200d-1f3eb","1f9d1-1f3ff-200d-1f3eb"]},{"n":["man teacher","male-teacher"],"u":"1f468-200d-1f3eb","v":["1f468-1f3fb-200d-1f3eb","1f468-1f3fc-200d-1f3eb","1f468-1f3fd-200d-1f3eb","1f468-1f3fe-200d-1f3eb","1f468-1f3ff-200d-1f3eb"]},{"n":["woman teacher","female-teacher"],"u":"1f469-200d-1f3eb","v":["1f469-1f3fb-200d-1f3eb","1f469-1f3fc-200d-1f3eb","1f469-1f3fd-200d-1f3eb","1f469-1f3fe-200d-1f3eb","1f469-1f3ff-200d-1f3eb"]},{"n":["judge"],"u":"1f9d1-200d-2696-fe0f","v":["1f9d1-1f3fb-200d-2696-fe0f","1f9d1-1f3fc-200d-2696-fe0f","1f9d1-1f3fd-200d-2696-fe0f","1f9d1-1f3fe-200d-2696-fe0f","1f9d1-1f3ff-200d-2696-fe0f"]},{"n":["man judge","male-judge"],"u":"1f468-200d-2696-fe0f","v":["1f468-1f3fb-200d-2696-fe0f","1f468-1f3fc-200d-2696-fe0f","1f468-1f3fd-200d-2696-fe0f","1f468-1f3fe-200d-2696-fe0f","1f468-1f3ff-200d-2696-fe0f"]},{"n":["woman judge","female-judge"],"u":"1f469-200d-2696-fe0f","v":["1f469-1f3fb-200d-2696-fe0f","1f469-1f3fc-200d-2696-fe0f","1f469-1f3fd-200d-2696-fe0f","1f469-1f3fe-200d-2696-fe0f","1f469-1f3ff-200d-2696-fe0f"]},{"n":["farmer"],"u":"1f9d1-200d-1f33e","v":["1f9d1-1f3fb-200d-1f33e","1f9d1-1f3fc-200d-1f33e","1f9d1-1f3fd-200d-1f33e","1f9d1-1f3fe-200d-1f33e","1f9d1-1f3ff-200d-1f33e"]},{"n":["man farmer","male-farmer"],"u":"1f468-200d-1f33e","v":["1f468-1f3fb-200d-1f33e","1f468-1f3fc-200d-1f33e","1f468-1f3fd-200d-1f33e","1f468-1f3fe-200d-1f33e","1f468-1f3ff-200d-1f33e"]},{"n":["woman farmer","female-farmer"],"u":"1f469-200d-1f33e","v":["1f469-1f3fb-200d-1f33e","1f469-1f3fc-200d-1f33e","1f469-1f3fd-200d-1f33e","1f469-1f3fe-200d-1f33e","1f469-1f3ff-200d-1f33e"]},{"n":["cook"],"u":"1f9d1-200d-1f373","v":["1f9d1-1f3fb-200d-1f373","1f9d1-1f3fc-200d-1f373","1f9d1-1f3fd-200d-1f373","1f9d1-1f3fe-200d-1f373","1f9d1-1f3ff-200d-1f373"]},{"n":["man cook","male-cook"],"u":"1f468-200d-1f373","v":["1f468-1f3fb-200d-1f373","1f468-1f3fc-200d-1f373","1f468-1f3fd-200d-1f373","1f468-1f3fe-200d-1f373","1f468-1f3ff-200d-1f373"]},{"n":["woman cook","female-cook"],"u":"1f469-200d-1f373","v":["1f469-1f3fb-200d-1f373","1f469-1f3fc-200d-1f373","1f469-1f3fd-200d-1f373","1f469-1f3fe-200d-1f373","1f469-1f3ff-200d-1f373"]},{"n":["mechanic"],"u":"1f9d1-200d-1f527","v":["1f9d1-1f3fb-200d-1f527","1f9d1-1f3fc-200d-1f527","1f9d1-1f3fd-200d-1f527","1f9d1-1f3fe-200d-1f527","1f9d1-1f3ff-200d-1f527"]},{"n":["man mechanic","male-mechanic"],"u":"1f468-200d-1f527","v":["1f468-1f3fb-200d-1f527","1f468-1f3fc-200d-1f527","1f468-1f3fd-200d-1f527","1f468-1f3fe-200d-1f527","1f468-1f3ff-200d-1f527"]},{"n":["woman mechanic","female-mechanic"],"u":"1f469-200d-1f527","v":["1f469-1f3fb-200d-1f527","1f469-1f3fc-200d-1f527","1f469-1f3fd-200d-1f527","1f469-1f3fe-200d-1f527","1f469-1f3ff-200d-1f527"]},{"n":["factory worker"],"u":"1f9d1-200d-1f3ed","v":["1f9d1-1f3fb-200d-1f3ed","1f9d1-1f3fc-200d-1f3ed","1f9d1-1f3fd-200d-1f3ed","1f9d1-1f3fe-200d-1f3ed","1f9d1-1f3ff-200d-1f3ed"]},{"n":["man factory worker","male-factory-worker"],"u":"1f468-200d-1f3ed","v":["1f468-1f3fb-200d-1f3ed","1f468-1f3fc-200d-1f3ed","1f468-1f3fd-200d-1f3ed","1f468-1f3fe-200d-1f3ed","1f468-1f3ff-200d-1f3ed"]},{"n":["woman factory worker","female-factory-worker"],"u":"1f469-200d-1f3ed","v":["1f469-1f3fb-200d-1f3ed","1f469-1f3fc-200d-1f3ed","1f469-1f3fd-200d-1f3ed","1f469-1f3fe-200d-1f3ed","1f469-1f3ff-200d-1f3ed"]},{"n":["office worker"],"u":"1f9d1-200d-1f4bc","v":["1f9d1-1f3fb-200d-1f4bc","1f9d1-1f3fc-200d-1f4bc","1f9d1-1f3fd-200d-1f4bc","1f9d1-1f3fe-200d-1f4bc","1f9d1-1f3ff-200d-1f4bc"]},{"n":["man office worker","male-office-worker"],"u":"1f468-200d-1f4bc","v":["1f468-1f3fb-200d-1f4bc","1f468-1f3fc-200d-1f4bc","1f468-1f3fd-200d-1f4bc","1f468-1f3fe-200d-1f4bc","1f468-1f3ff-200d-1f4bc"]},{"n":["woman office worker","female-office-worker"],"u":"1f469-200d-1f4bc","v":["1f469-1f3fb-200d-1f4bc","1f469-1f3fc-200d-1f4bc","1f469-1f3fd-200d-1f4bc","1f469-1f3fe-200d-1f4bc","1f469-1f3ff-200d-1f4bc"]},{"n":["scientist"],"u":"1f9d1-200d-1f52c","v":["1f9d1-1f3fb-200d-1f52c","1f9d1-1f3fc-200d-1f52c","1f9d1-1f3fd-200d-1f52c","1f9d1-1f3fe-200d-1f52c","1f9d1-1f3ff-200d-1f52c"]},{"n":["man scientist","male-scientist"],"u":"1f468-200d-1f52c","v":["1f468-1f3fb-200d-1f52c","1f468-1f3fc-200d-1f52c","1f468-1f3fd-200d-1f52c","1f468-1f3fe-200d-1f52c","1f468-1f3ff-200d-1f52c"]},{"n":["woman scientist","female-scientist"],"u":"1f469-200d-1f52c","v":["1f469-1f3fb-200d-1f52c","1f469-1f3fc-200d-1f52c","1f469-1f3fd-200d-1f52c","1f469-1f3fe-200d-1f52c","1f469-1f3ff-200d-1f52c"]},{"n":["technologist"],"u":"1f9d1-200d-1f4bb","v":["1f9d1-1f3fb-200d-1f4bb","1f9d1-1f3fc-200d-1f4bb","1f9d1-1f3fd-200d-1f4bb","1f9d1-1f3fe-200d-1f4bb","1f9d1-1f3ff-200d-1f4bb"]},{"n":["man technologist","male-technologist"],"u":"1f468-200d-1f4bb","v":["1f468-1f3fb-200d-1f4bb","1f468-1f3fc-200d-1f4bb","1f468-1f3fd-200d-1f4bb","1f468-1f3fe-200d-1f4bb","1f468-1f3ff-200d-1f4bb"]},{"n":["woman technologist","female-technologist"],"u":"1f469-200d-1f4bb","v":["1f469-1f3fb-200d-1f4bb","1f469-1f3fc-200d-1f4bb","1f469-1f3fd-200d-1f4bb","1f469-1f3fe-200d-1f4bb","1f469-1f3ff-200d-1f4bb"]},{"n":["singer"],"u":"1f9d1-200d-1f3a4","v":["1f9d1-1f3fb-200d-1f3a4","1f9d1-1f3fc-200d-1f3a4","1f9d1-1f3fd-200d-1f3a4","1f9d1-1f3fe-200d-1f3a4","1f9d1-1f3ff-200d-1f3a4"]},{"n":["man singer","male-singer"],"u":"1f468-200d-1f3a4","v":["1f468-1f3fb-200d-1f3a4","1f468-1f3fc-200d-1f3a4","1f468-1f3fd-200d-1f3a4","1f468-1f3fe-200d-1f3a4","1f468-1f3ff-200d-1f3a4"]},{"n":["woman singer","female-singer"],"u":"1f469-200d-1f3a4","v":["1f469-1f3fb-200d-1f3a4","1f469-1f3fc-200d-1f3a4","1f469-1f3fd-200d-1f3a4","1f469-1f3fe-200d-1f3a4","1f469-1f3ff-200d-1f3a4"]},{"n":["artist"],"u":"1f9d1-200d-1f3a8","v":["1f9d1-1f3fb-200d-1f3a8","1f9d1-1f3fc-200d-1f3a8","1f9d1-1f3fd-200d-1f3a8","1f9d1-1f3fe-200d-1f3a8","1f9d1-1f3ff-200d-1f3a8"]},{"n":["man artist","male-artist"],"u":"1f468-200d-1f3a8","v":["1f468-1f3fb-200d-1f3a8","1f468-1f3fc-200d-1f3a8","1f468-1f3fd-200d-1f3a8","1f468-1f3fe-200d-1f3a8","1f468-1f3ff-200d-1f3a8"]},{"n":["woman artist","female-artist"],"u":"1f469-200d-1f3a8","v":["1f469-1f3fb-200d-1f3a8","1f469-1f3fc-200d-1f3a8","1f469-1f3fd-200d-1f3a8","1f469-1f3fe-200d-1f3a8","1f469-1f3ff-200d-1f3a8"]},{"n":["pilot"],"u":"1f9d1-200d-2708-fe0f","v":["1f9d1-1f3fb-200d-2708-fe0f","1f9d1-1f3fc-200d-2708-fe0f","1f9d1-1f3fd-200d-2708-fe0f","1f9d1-1f3fe-200d-2708-fe0f","1f9d1-1f3ff-200d-2708-fe0f"]},{"n":["man pilot","male-pilot"],"u":"1f468-200d-2708-fe0f","v":["1f468-1f3fb-200d-2708-fe0f","1f468-1f3fc-200d-2708-fe0f","1f468-1f3fd-200d-2708-fe0f","1f468-1f3fe-200d-2708-fe0f","1f468-1f3ff-200d-2708-fe0f"]},{"n":["woman pilot","female-pilot"],"u":"1f469-200d-2708-fe0f","v":["1f469-1f3fb-200d-2708-fe0f","1f469-1f3fc-200d-2708-fe0f","1f469-1f3fd-200d-2708-fe0f","1f469-1f3fe-200d-2708-fe0f","1f469-1f3ff-200d-2708-fe0f"]},{"n":["astronaut"],"u":"1f9d1-200d-1f680","v":["1f9d1-1f3fb-200d-1f680","1f9d1-1f3fc-200d-1f680","1f9d1-1f3fd-200d-1f680","1f9d1-1f3fe-200d-1f680","1f9d1-1f3ff-200d-1f680"]},{"n":["man astronaut","male-astronaut"],"u":"1f468-200d-1f680","v":["1f468-1f3fb-200d-1f680","1f468-1f3fc-200d-1f680","1f468-1f3fd-200d-1f680","1f468-1f3fe-200d-1f680","1f468-1f3ff-200d-1f680"]},{"n":["woman astronaut","female-astronaut"],"u":"1f469-200d-1f680","v":["1f469-1f3fb-200d-1f680","1f469-1f3fc-200d-1f680","1f469-1f3fd-200d-1f680","1f469-1f3fe-200d-1f680","1f469-1f3ff-200d-1f680"]},{"n":["firefighter"],"u":"1f9d1-200d-1f692","v":["1f9d1-1f3fb-200d-1f692","1f9d1-1f3fc-200d-1f692","1f9d1-1f3fd-200d-1f692","1f9d1-1f3fe-200d-1f692","1f9d1-1f3ff-200d-1f692"]},{"n":["man firefighter","male-firefighter"],"u":"1f468-200d-1f692","v":["1f468-1f3fb-200d-1f692","1f468-1f3fc-200d-1f692","1f468-1f3fd-200d-1f692","1f468-1f3fe-200d-1f692","1f468-1f3ff-200d-1f692"]},{"n":["woman firefighter","female-firefighter"],"u":"1f469-200d-1f692","v":["1f469-1f3fb-200d-1f692","1f469-1f3fc-200d-1f692","1f469-1f3fd-200d-1f692","1f469-1f3fe-200d-1f692","1f469-1f3ff-200d-1f692"]},{"n":["cop","police officer"],"u":"1f46e","v":["1f46e-1f3fb","1f46e-1f3fc","1f46e-1f3fd","1f46e-1f3fe","1f46e-1f3ff"]},{"n":["man police officer","male-police-officer"],"u":"1f46e-200d-2642-fe0f","v":["1f46e-1f3fb-200d-2642-fe0f","1f46e-1f3fc-200d-2642-fe0f","1f46e-1f3fd-200d-2642-fe0f","1f46e-1f3fe-200d-2642-fe0f","1f46e-1f3ff-200d-2642-fe0f"]},{"n":["woman police officer","female-police-officer"],"u":"1f46e-200d-2640-fe0f","v":["1f46e-1f3fb-200d-2640-fe0f","1f46e-1f3fc-200d-2640-fe0f","1f46e-1f3fd-200d-2640-fe0f","1f46e-1f3fe-200d-2640-fe0f","1f46e-1f3ff-200d-2640-fe0f"]},{"n":["detective","sleuth or spy"],"u":"1f575-fe0f","v":["1f575-1f3fb","1f575-1f3fc","1f575-1f3fd","1f575-1f3fe","1f575-1f3ff"]},{"n":["man detective","male-detective"],"u":"1f575-fe0f-200d-2642-fe0f","v":["1f575-1f3fb-200d-2642-fe0f","1f575-1f3fc-200d-2642-fe0f","1f575-1f3fd-200d-2642-fe0f","1f575-1f3fe-200d-2642-fe0f","1f575-1f3ff-200d-2642-fe0f"]},{"n":["woman detective","female-detective"],"u":"1f575-fe0f-200d-2640-fe0f","v":["1f575-1f3fb-200d-2640-fe0f","1f575-1f3fc-200d-2640-fe0f","1f575-1f3fd-200d-2640-fe0f","1f575-1f3fe-200d-2640-fe0f","1f575-1f3ff-200d-2640-fe0f"]},{"n":["guardsman"],"u":"1f482","v":["1f482-1f3fb","1f482-1f3fc","1f482-1f3fd","1f482-1f3fe","1f482-1f3ff"]},{"n":["man guard","male-guard"],"u":"1f482-200d-2642-fe0f","v":["1f482-1f3fb-200d-2642-fe0f","1f482-1f3fc-200d-2642-fe0f","1f482-1f3fd-200d-2642-fe0f","1f482-1f3fe-200d-2642-fe0f","1f482-1f3ff-200d-2642-fe0f"]},{"n":["woman guard","female-guard"],"u":"1f482-200d-2640-fe0f","v":["1f482-1f3fb-200d-2640-fe0f","1f482-1f3fc-200d-2640-fe0f","1f482-1f3fd-200d-2640-fe0f","1f482-1f3fe-200d-2640-fe0f","1f482-1f3ff-200d-2640-fe0f"]},{"n":["ninja"],"u":"1f977","v":["1f977-1f3fb","1f977-1f3fc","1f977-1f3fd","1f977-1f3fe","1f977-1f3ff"]},{"n":["construction worker"],"u":"1f477","v":["1f477-1f3fb","1f477-1f3fc","1f477-1f3fd","1f477-1f3fe","1f477-1f3ff"]},{"n":["man construction worker","male-construction-worker"],"u":"1f477-200d-2642-fe0f","v":["1f477-1f3fb-200d-2642-fe0f","1f477-1f3fc-200d-2642-fe0f","1f477-1f3fd-200d-2642-fe0f","1f477-1f3fe-200d-2642-fe0f","1f477-1f3ff-200d-2642-fe0f"]},{"n":["woman construction worker","female-construction-worker"],"u":"1f477-200d-2640-fe0f","v":["1f477-1f3fb-200d-2640-fe0f","1f477-1f3fc-200d-2640-fe0f","1f477-1f3fd-200d-2640-fe0f","1f477-1f3fe-200d-2640-fe0f","1f477-1f3ff-200d-2640-fe0f"]},{"n":["person with crown"],"u":"1fac5","v":["1fac5-1f3fb","1fac5-1f3fc","1fac5-1f3fd","1fac5-1f3fe","1fac5-1f3ff"]},{"n":["prince"],"u":"1f934","v":["1f934-1f3fb","1f934-1f3fc","1f934-1f3fd","1f934-1f3fe","1f934-1f3ff"]},{"n":["princess"],"u":"1f478","v":["1f478-1f3fb","1f478-1f3fc","1f478-1f3fd","1f478-1f3fe","1f478-1f3ff"]},{"n":["man with turban"],"u":"1f473","v":["1f473-1f3fb","1f473-1f3fc","1f473-1f3fd","1f473-1f3fe","1f473-1f3ff"]},{"n":["man wearing turban","man-wearing-turban"],"u":"1f473-200d-2642-fe0f","v":["1f473-1f3fb-200d-2642-fe0f","1f473-1f3fc-200d-2642-fe0f","1f473-1f3fd-200d-2642-fe0f","1f473-1f3fe-200d-2642-fe0f","1f473-1f3ff-200d-2642-fe0f"]},{"n":["woman wearing turban","woman-wearing-turban"],"u":"1f473-200d-2640-fe0f","v":["1f473-1f3fb-200d-2640-fe0f","1f473-1f3fc-200d-2640-fe0f","1f473-1f3fd-200d-2640-fe0f","1f473-1f3fe-200d-2640-fe0f","1f473-1f3ff-200d-2640-fe0f"]},{"n":["man with gua pi mao"],"u":"1f472","v":["1f472-1f3fb","1f472-1f3fc","1f472-1f3fd","1f472-1f3fe","1f472-1f3ff"]},{"n":["person with headscarf"],"u":"1f9d5","v":["1f9d5-1f3fb","1f9d5-1f3fc","1f9d5-1f3fd","1f9d5-1f3fe","1f9d5-1f3ff"]},{"n":["man in tuxedo","person in tuxedo"],"u":"1f935","v":["1f935-1f3fb","1f935-1f3fc","1f935-1f3fd","1f935-1f3fe","1f935-1f3ff"]},{"n":["man in tuxedo"],"u":"1f935-200d-2642-fe0f","v":["1f935-1f3fb-200d-2642-fe0f","1f935-1f3fc-200d-2642-fe0f","1f935-1f3fd-200d-2642-fe0f","1f935-1f3fe-200d-2642-fe0f","1f935-1f3ff-200d-2642-fe0f"]},{"n":["woman in tuxedo"],"u":"1f935-200d-2640-fe0f","v":["1f935-1f3fb-200d-2640-fe0f","1f935-1f3fc-200d-2640-fe0f","1f935-1f3fd-200d-2640-fe0f","1f935-1f3fe-200d-2640-fe0f","1f935-1f3ff-200d-2640-fe0f"]},{"n":["bride with veil"],"u":"1f470","v":["1f470-1f3fb","1f470-1f3fc","1f470-1f3fd","1f470-1f3fe","1f470-1f3ff"]},{"n":["man with veil"],"u":"1f470-200d-2642-fe0f","v":["1f470-1f3fb-200d-2642-fe0f","1f470-1f3fc-200d-2642-fe0f","1f470-1f3fd-200d-2642-fe0f","1f470-1f3fe-200d-2642-fe0f","1f470-1f3ff-200d-2642-fe0f"]},{"n":["woman with veil"],"u":"1f470-200d-2640-fe0f","v":["1f470-1f3fb-200d-2640-fe0f","1f470-1f3fc-200d-2640-fe0f","1f470-1f3fd-200d-2640-fe0f","1f470-1f3fe-200d-2640-fe0f","1f470-1f3ff-200d-2640-fe0f"]},{"n":["pregnant woman"],"u":"1f930","v":["1f930-1f3fb","1f930-1f3fc","1f930-1f3fd","1f930-1f3fe","1f930-1f3ff"]},{"n":["pregnant man"],"u":"1fac3","v":["1fac3-1f3fb","1fac3-1f3fc","1fac3-1f3fd","1fac3-1f3fe","1fac3-1f3ff"]},{"n":["pregnant person"],"u":"1fac4","v":["1fac4-1f3fb","1fac4-1f3fc","1fac4-1f3fd","1fac4-1f3fe","1fac4-1f3ff"]},{"n":["breast-feeding"],"u":"1f931","v":["1f931-1f3fb","1f931-1f3fc","1f931-1f3fd","1f931-1f3fe","1f931-1f3ff"]},{"n":["woman feeding baby"],"u":"1f469-200d-1f37c","v":["1f469-1f3fb-200d-1f37c","1f469-1f3fc-200d-1f37c","1f469-1f3fd-200d-1f37c","1f469-1f3fe-200d-1f37c","1f469-1f3ff-200d-1f37c"]},{"n":["man feeding baby"],"u":"1f468-200d-1f37c","v":["1f468-1f3fb-200d-1f37c","1f468-1f3fc-200d-1f37c","1f468-1f3fd-200d-1f37c","1f468-1f3fe-200d-1f37c","1f468-1f3ff-200d-1f37c"]},{"n":["person feeding baby"],"u":"1f9d1-200d-1f37c","v":["1f9d1-1f3fb-200d-1f37c","1f9d1-1f3fc-200d-1f37c","1f9d1-1f3fd-200d-1f37c","1f9d1-1f3fe-200d-1f37c","1f9d1-1f3ff-200d-1f37c"]},{"n":["angel","baby angel"],"u":"1f47c","v":["1f47c-1f3fb","1f47c-1f3fc","1f47c-1f3fd","1f47c-1f3fe","1f47c-1f3ff"]},{"n":["santa","father christmas"],"u":"1f385","v":["1f385-1f3fb","1f385-1f3fc","1f385-1f3fd","1f385-1f3fe","1f385-1f3ff"]},{"n":["mrs claus","mother christmas"],"u":"1f936","v":["1f936-1f3fb","1f936-1f3fc","1f936-1f3fd","1f936-1f3fe","1f936-1f3ff"]},{"n":["mx claus"],"u":"1f9d1-200d-1f384","v":["1f9d1-1f3fb-200d-1f384","1f9d1-1f3fc-200d-1f384","1f9d1-1f3fd-200d-1f384","1f9d1-1f3fe-200d-1f384","1f9d1-1f3ff-200d-1f384"]},{"n":["superhero"],"u":"1f9b8","v":["1f9b8-1f3fb","1f9b8-1f3fc","1f9b8-1f3fd","1f9b8-1f3fe","1f9b8-1f3ff"]},{"n":["man superhero","male superhero"],"u":"1f9b8-200d-2642-fe0f","v":["1f9b8-1f3fb-200d-2642-fe0f","1f9b8-1f3fc-200d-2642-fe0f","1f9b8-1f3fd-200d-2642-fe0f","1f9b8-1f3fe-200d-2642-fe0f","1f9b8-1f3ff-200d-2642-fe0f"]},{"n":["woman superhero","female superhero"],"u":"1f9b8-200d-2640-fe0f","v":["1f9b8-1f3fb-200d-2640-fe0f","1f9b8-1f3fc-200d-2640-fe0f","1f9b8-1f3fd-200d-2640-fe0f","1f9b8-1f3fe-200d-2640-fe0f","1f9b8-1f3ff-200d-2640-fe0f"]},{"n":["supervillain"],"u":"1f9b9","v":["1f9b9-1f3fb","1f9b9-1f3fc","1f9b9-1f3fd","1f9b9-1f3fe","1f9b9-1f3ff"]},{"n":["man supervillain","male supervillain"],"u":"1f9b9-200d-2642-fe0f","v":["1f9b9-1f3fb-200d-2642-fe0f","1f9b9-1f3fc-200d-2642-fe0f","1f9b9-1f3fd-200d-2642-fe0f","1f9b9-1f3fe-200d-2642-fe0f","1f9b9-1f3ff-200d-2642-fe0f"]},{"n":["woman supervillain","female supervillain"],"u":"1f9b9-200d-2640-fe0f","v":["1f9b9-1f3fb-200d-2640-fe0f","1f9b9-1f3fc-200d-2640-fe0f","1f9b9-1f3fd-200d-2640-fe0f","1f9b9-1f3fe-200d-2640-fe0f","1f9b9-1f3ff-200d-2640-fe0f"]},{"n":["mage"],"u":"1f9d9","v":["1f9d9-1f3fb","1f9d9-1f3fc","1f9d9-1f3fd","1f9d9-1f3fe","1f9d9-1f3ff"]},{"n":["man mage","male mage"],"u":"1f9d9-200d-2642-fe0f","v":["1f9d9-1f3fb-200d-2642-fe0f","1f9d9-1f3fc-200d-2642-fe0f","1f9d9-1f3fd-200d-2642-fe0f","1f9d9-1f3fe-200d-2642-fe0f","1f9d9-1f3ff-200d-2642-fe0f"]},{"n":["woman mage","female mage"],"u":"1f9d9-200d-2640-fe0f","v":["1f9d9-1f3fb-200d-2640-fe0f","1f9d9-1f3fc-200d-2640-fe0f","1f9d9-1f3fd-200d-2640-fe0f","1f9d9-1f3fe-200d-2640-fe0f","1f9d9-1f3ff-200d-2640-fe0f"]},{"n":["fairy"],"u":"1f9da","v":["1f9da-1f3fb","1f9da-1f3fc","1f9da-1f3fd","1f9da-1f3fe","1f9da-1f3ff"]},{"n":["man fairy","male fairy"],"u":"1f9da-200d-2642-fe0f","v":["1f9da-1f3fb-200d-2642-fe0f","1f9da-1f3fc-200d-2642-fe0f","1f9da-1f3fd-200d-2642-fe0f","1f9da-1f3fe-200d-2642-fe0f","1f9da-1f3ff-200d-2642-fe0f"]},{"n":["woman fairy","female fairy"],"u":"1f9da-200d-2640-fe0f","v":["1f9da-1f3fb-200d-2640-fe0f","1f9da-1f3fc-200d-2640-fe0f","1f9da-1f3fd-200d-2640-fe0f","1f9da-1f3fe-200d-2640-fe0f","1f9da-1f3ff-200d-2640-fe0f"]},{"n":["vampire"],"u":"1f9db","v":["1f9db-1f3fb","1f9db-1f3fc","1f9db-1f3fd","1f9db-1f3fe","1f9db-1f3ff"]},{"n":["man vampire","male vampire"],"u":"1f9db-200d-2642-fe0f","v":["1f9db-1f3fb-200d-2642-fe0f","1f9db-1f3fc-200d-2642-fe0f","1f9db-1f3fd-200d-2642-fe0f","1f9db-1f3fe-200d-2642-fe0f","1f9db-1f3ff-200d-2642-fe0f"]},{"n":["woman vampire","female vampire"],"u":"1f9db-200d-2640-fe0f","v":["1f9db-1f3fb-200d-2640-fe0f","1f9db-1f3fc-200d-2640-fe0f","1f9db-1f3fd-200d-2640-fe0f","1f9db-1f3fe-200d-2640-fe0f","1f9db-1f3ff-200d-2640-fe0f"]},{"n":["merperson"],"u":"1f9dc","v":["1f9dc-1f3fb","1f9dc-1f3fc","1f9dc-1f3fd","1f9dc-1f3fe","1f9dc-1f3ff"]},{"n":["merman"],"u":"1f9dc-200d-2642-fe0f","v":["1f9dc-1f3fb-200d-2642-fe0f","1f9dc-1f3fc-200d-2642-fe0f","1f9dc-1f3fd-200d-2642-fe0f","1f9dc-1f3fe-200d-2642-fe0f","1f9dc-1f3ff-200d-2642-fe0f"]},{"n":["mermaid"],"u":"1f9dc-200d-2640-fe0f","v":["1f9dc-1f3fb-200d-2640-fe0f","1f9dc-1f3fc-200d-2640-fe0f","1f9dc-1f3fd-200d-2640-fe0f","1f9dc-1f3fe-200d-2640-fe0f","1f9dc-1f3ff-200d-2640-fe0f"]},{"n":["elf"],"u":"1f9dd","v":["1f9dd-1f3fb","1f9dd-1f3fc","1f9dd-1f3fd","1f9dd-1f3fe","1f9dd-1f3ff"]},{"n":["man elf","male elf"],"u":"1f9dd-200d-2642-fe0f","v":["1f9dd-1f3fb-200d-2642-fe0f","1f9dd-1f3fc-200d-2642-fe0f","1f9dd-1f3fd-200d-2642-fe0f","1f9dd-1f3fe-200d-2642-fe0f","1f9dd-1f3ff-200d-2642-fe0f"]},{"n":["woman elf","female elf"],"u":"1f9dd-200d-2640-fe0f","v":["1f9dd-1f3fb-200d-2640-fe0f","1f9dd-1f3fc-200d-2640-fe0f","1f9dd-1f3fd-200d-2640-fe0f","1f9dd-1f3fe-200d-2640-fe0f","1f9dd-1f3ff-200d-2640-fe0f"]},{"n":["genie"],"u":"1f9de"},{"n":["man genie","male genie"],"u":"1f9de-200d-2642-fe0f"},{"n":["woman genie","female genie"],"u":"1f9de-200d-2640-fe0f"},{"n":["zombie"],"u":"1f9df"},{"n":["man zombie","male zombie"],"u":"1f9df-200d-2642-fe0f"},{"n":["woman zombie","female zombie"],"u":"1f9df-200d-2640-fe0f"},{"n":["troll"],"u":"1f9cc"},{"n":["massage","face massage"],"u":"1f486","v":["1f486-1f3fb","1f486-1f3fc","1f486-1f3fd","1f486-1f3fe","1f486-1f3ff"]},{"n":["man getting massage","man-getting-massage"],"u":"1f486-200d-2642-fe0f","v":["1f486-1f3fb-200d-2642-fe0f","1f486-1f3fc-200d-2642-fe0f","1f486-1f3fd-200d-2642-fe0f","1f486-1f3fe-200d-2642-fe0f","1f486-1f3ff-200d-2642-fe0f"]},{"n":["woman getting massage","woman-getting-massage"],"u":"1f486-200d-2640-fe0f","v":["1f486-1f3fb-200d-2640-fe0f","1f486-1f3fc-200d-2640-fe0f","1f486-1f3fd-200d-2640-fe0f","1f486-1f3fe-200d-2640-fe0f","1f486-1f3ff-200d-2640-fe0f"]},{"n":["haircut"],"u":"1f487","v":["1f487-1f3fb","1f487-1f3fc","1f487-1f3fd","1f487-1f3fe","1f487-1f3ff"]},{"n":["man getting haircut","man-getting-haircut"],"u":"1f487-200d-2642-fe0f","v":["1f487-1f3fb-200d-2642-fe0f","1f487-1f3fc-200d-2642-fe0f","1f487-1f3fd-200d-2642-fe0f","1f487-1f3fe-200d-2642-fe0f","1f487-1f3ff-200d-2642-fe0f"]},{"n":["woman getting haircut","woman-getting-haircut"],"u":"1f487-200d-2640-fe0f","v":["1f487-1f3fb-200d-2640-fe0f","1f487-1f3fc-200d-2640-fe0f","1f487-1f3fd-200d-2640-fe0f","1f487-1f3fe-200d-2640-fe0f","1f487-1f3ff-200d-2640-fe0f"]},{"n":["walking","pedestrian"],"u":"1f6b6","v":["1f6b6-1f3fb","1f6b6-1f3fc","1f6b6-1f3fd","1f6b6-1f3fe","1f6b6-1f3ff"]},{"n":["man walking","man-walking"],"u":"1f6b6-200d-2642-fe0f","v":["1f6b6-1f3fb-200d-2642-fe0f","1f6b6-1f3fc-200d-2642-fe0f","1f6b6-1f3fd-200d-2642-fe0f","1f6b6-1f3fe-200d-2642-fe0f","1f6b6-1f3ff-200d-2642-fe0f"]},{"n":["woman walking","woman-walking"],"u":"1f6b6-200d-2640-fe0f","v":["1f6b6-1f3fb-200d-2640-fe0f","1f6b6-1f3fc-200d-2640-fe0f","1f6b6-1f3fd-200d-2640-fe0f","1f6b6-1f3fe-200d-2640-fe0f","1f6b6-1f3ff-200d-2640-fe0f"]},{"n":["standing person"],"u":"1f9cd","v":["1f9cd-1f3fb","1f9cd-1f3fc","1f9cd-1f3fd","1f9cd-1f3fe","1f9cd-1f3ff"]},{"n":["man standing"],"u":"1f9cd-200d-2642-fe0f","v":["1f9cd-1f3fb-200d-2642-fe0f","1f9cd-1f3fc-200d-2642-fe0f","1f9cd-1f3fd-200d-2642-fe0f","1f9cd-1f3fe-200d-2642-fe0f","1f9cd-1f3ff-200d-2642-fe0f"]},{"n":["woman standing"],"u":"1f9cd-200d-2640-fe0f","v":["1f9cd-1f3fb-200d-2640-fe0f","1f9cd-1f3fc-200d-2640-fe0f","1f9cd-1f3fd-200d-2640-fe0f","1f9cd-1f3fe-200d-2640-fe0f","1f9cd-1f3ff-200d-2640-fe0f"]},{"n":["kneeling person"],"u":"1f9ce","v":["1f9ce-1f3fb","1f9ce-1f3fc","1f9ce-1f3fd","1f9ce-1f3fe","1f9ce-1f3ff"]},{"n":["man kneeling"],"u":"1f9ce-200d-2642-fe0f","v":["1f9ce-1f3fb-200d-2642-fe0f","1f9ce-1f3fc-200d-2642-fe0f","1f9ce-1f3fd-200d-2642-fe0f","1f9ce-1f3fe-200d-2642-fe0f","1f9ce-1f3ff-200d-2642-fe0f"]},{"n":["woman kneeling"],"u":"1f9ce-200d-2640-fe0f","v":["1f9ce-1f3fb-200d-2640-fe0f","1f9ce-1f3fc-200d-2640-fe0f","1f9ce-1f3fd-200d-2640-fe0f","1f9ce-1f3fe-200d-2640-fe0f","1f9ce-1f3ff-200d-2640-fe0f"]},{"n":["person with white cane","person with probing cane"],"u":"1f9d1-200d-1f9af","v":["1f9d1-1f3fb-200d-1f9af","1f9d1-1f3fc-200d-1f9af","1f9d1-1f3fd-200d-1f9af","1f9d1-1f3fe-200d-1f9af","1f9d1-1f3ff-200d-1f9af"]},{"n":["man with white cane","man with probing cane"],"u":"1f468-200d-1f9af","v":["1f468-1f3fb-200d-1f9af","1f468-1f3fc-200d-1f9af","1f468-1f3fd-200d-1f9af","1f468-1f3fe-200d-1f9af","1f468-1f3ff-200d-1f9af"]},{"n":["woman with white cane","woman with probing cane"],"u":"1f469-200d-1f9af","v":["1f469-1f3fb-200d-1f9af","1f469-1f3fc-200d-1f9af","1f469-1f3fd-200d-1f9af","1f469-1f3fe-200d-1f9af","1f469-1f3ff-200d-1f9af"]},{"n":["person in motorized wheelchair"],"u":"1f9d1-200d-1f9bc","v":["1f9d1-1f3fb-200d-1f9bc","1f9d1-1f3fc-200d-1f9bc","1f9d1-1f3fd-200d-1f9bc","1f9d1-1f3fe-200d-1f9bc","1f9d1-1f3ff-200d-1f9bc"]},{"n":["man in motorized wheelchair"],"u":"1f468-200d-1f9bc","v":["1f468-1f3fb-200d-1f9bc","1f468-1f3fc-200d-1f9bc","1f468-1f3fd-200d-1f9bc","1f468-1f3fe-200d-1f9bc","1f468-1f3ff-200d-1f9bc"]},{"n":["woman in motorized wheelchair"],"u":"1f469-200d-1f9bc","v":["1f469-1f3fb-200d-1f9bc","1f469-1f3fc-200d-1f9bc","1f469-1f3fd-200d-1f9bc","1f469-1f3fe-200d-1f9bc","1f469-1f3ff-200d-1f9bc"]},{"n":["person in manual wheelchair"],"u":"1f9d1-200d-1f9bd","v":["1f9d1-1f3fb-200d-1f9bd","1f9d1-1f3fc-200d-1f9bd","1f9d1-1f3fd-200d-1f9bd","1f9d1-1f3fe-200d-1f9bd","1f9d1-1f3ff-200d-1f9bd"]},{"n":["man in manual wheelchair"],"u":"1f468-200d-1f9bd","v":["1f468-1f3fb-200d-1f9bd","1f468-1f3fc-200d-1f9bd","1f468-1f3fd-200d-1f9bd","1f468-1f3fe-200d-1f9bd","1f468-1f3ff-200d-1f9bd"]},{"n":["woman in manual wheelchair"],"u":"1f469-200d-1f9bd","v":["1f469-1f3fb-200d-1f9bd","1f469-1f3fc-200d-1f9bd","1f469-1f3fd-200d-1f9bd","1f469-1f3fe-200d-1f9bd","1f469-1f3ff-200d-1f9bd"]},{"n":["runner","running"],"u":"1f3c3","v":["1f3c3-1f3fb","1f3c3-1f3fc","1f3c3-1f3fd","1f3c3-1f3fe","1f3c3-1f3ff"]},{"n":["man running","man-running"],"u":"1f3c3-200d-2642-fe0f","v":["1f3c3-1f3fb-200d-2642-fe0f","1f3c3-1f3fc-200d-2642-fe0f","1f3c3-1f3fd-200d-2642-fe0f","1f3c3-1f3fe-200d-2642-fe0f","1f3c3-1f3ff-200d-2642-fe0f"]},{"n":["woman running","woman-running"],"u":"1f3c3-200d-2640-fe0f","v":["1f3c3-1f3fb-200d-2640-fe0f","1f3c3-1f3fc-200d-2640-fe0f","1f3c3-1f3fd-200d-2640-fe0f","1f3c3-1f3fe-200d-2640-fe0f","1f3c3-1f3ff-200d-2640-fe0f"]},{"n":["dancer"],"u":"1f483","v":["1f483-1f3fb","1f483-1f3fc","1f483-1f3fd","1f483-1f3fe","1f483-1f3ff"]},{"n":["man dancing"],"u":"1f57a","v":["1f57a-1f3fb","1f57a-1f3fc","1f57a-1f3fd","1f57a-1f3fe","1f57a-1f3ff"]},{"n":["person in suit levitating","man in business suit levitating"],"u":"1f574-fe0f","v":["1f574-1f3fb","1f574-1f3fc","1f574-1f3fd","1f574-1f3fe","1f574-1f3ff"]},{"n":["dancers","woman with bunny ears"],"u":"1f46f"},{"n":["men with bunny ears","men-with-bunny-ears-partying","man-with-bunny-ears-partying"],"u":"1f46f-200d-2642-fe0f"},{"n":["women with bunny ears","women-with-bunny-ears-partying","woman-with-bunny-ears-partying"],"u":"1f46f-200d-2640-fe0f"},{"n":["person in steamy room"],"u":"1f9d6","v":["1f9d6-1f3fb","1f9d6-1f3fc","1f9d6-1f3fd","1f9d6-1f3fe","1f9d6-1f3ff"]},{"n":["man in steamy room"],"u":"1f9d6-200d-2642-fe0f","v":["1f9d6-1f3fb-200d-2642-fe0f","1f9d6-1f3fc-200d-2642-fe0f","1f9d6-1f3fd-200d-2642-fe0f","1f9d6-1f3fe-200d-2642-fe0f","1f9d6-1f3ff-200d-2642-fe0f"]},{"n":["woman in steamy room"],"u":"1f9d6-200d-2640-fe0f","v":["1f9d6-1f3fb-200d-2640-fe0f","1f9d6-1f3fc-200d-2640-fe0f","1f9d6-1f3fd-200d-2640-fe0f","1f9d6-1f3fe-200d-2640-fe0f","1f9d6-1f3ff-200d-2640-fe0f"]},{"n":["person climbing"],"u":"1f9d7","v":["1f9d7-1f3fb","1f9d7-1f3fc","1f9d7-1f3fd","1f9d7-1f3fe","1f9d7-1f3ff"]},{"n":["man climbing"],"u":"1f9d7-200d-2642-fe0f","v":["1f9d7-1f3fb-200d-2642-fe0f","1f9d7-1f3fc-200d-2642-fe0f","1f9d7-1f3fd-200d-2642-fe0f","1f9d7-1f3fe-200d-2642-fe0f","1f9d7-1f3ff-200d-2642-fe0f"]},{"n":["woman climbing"],"u":"1f9d7-200d-2640-fe0f","v":["1f9d7-1f3fb-200d-2640-fe0f","1f9d7-1f3fc-200d-2640-fe0f","1f9d7-1f3fd-200d-2640-fe0f","1f9d7-1f3fe-200d-2640-fe0f","1f9d7-1f3ff-200d-2640-fe0f"]},{"n":["fencer"],"u":"1f93a"},{"n":["horse racing"],"u":"1f3c7","v":["1f3c7-1f3fb","1f3c7-1f3fc","1f3c7-1f3fd","1f3c7-1f3fe","1f3c7-1f3ff"]},{"n":["skier"],"u":"26f7-fe0f"},{"n":["snowboarder"],"u":"1f3c2","v":["1f3c2-1f3fb","1f3c2-1f3fc","1f3c2-1f3fd","1f3c2-1f3fe","1f3c2-1f3ff"]},{"n":["golfer","person golfing"],"u":"1f3cc-fe0f","v":["1f3cc-1f3fb","1f3cc-1f3fc","1f3cc-1f3fd","1f3cc-1f3fe","1f3cc-1f3ff"]},{"n":["man golfing","man-golfing"],"u":"1f3cc-fe0f-200d-2642-fe0f","v":["1f3cc-1f3fb-200d-2642-fe0f","1f3cc-1f3fc-200d-2642-fe0f","1f3cc-1f3fd-200d-2642-fe0f","1f3cc-1f3fe-200d-2642-fe0f","1f3cc-1f3ff-200d-2642-fe0f"]},{"n":["woman golfing","woman-golfing"],"u":"1f3cc-fe0f-200d-2640-fe0f","v":["1f3cc-1f3fb-200d-2640-fe0f","1f3cc-1f3fc-200d-2640-fe0f","1f3cc-1f3fd-200d-2640-fe0f","1f3cc-1f3fe-200d-2640-fe0f","1f3cc-1f3ff-200d-2640-fe0f"]},{"n":["surfer"],"u":"1f3c4","v":["1f3c4-1f3fb","1f3c4-1f3fc","1f3c4-1f3fd","1f3c4-1f3fe","1f3c4-1f3ff"]},{"n":["man surfing","man-surfing"],"u":"1f3c4-200d-2642-fe0f","v":["1f3c4-1f3fb-200d-2642-fe0f","1f3c4-1f3fc-200d-2642-fe0f","1f3c4-1f3fd-200d-2642-fe0f","1f3c4-1f3fe-200d-2642-fe0f","1f3c4-1f3ff-200d-2642-fe0f"]},{"n":["woman surfing","woman-surfing"],"u":"1f3c4-200d-2640-fe0f","v":["1f3c4-1f3fb-200d-2640-fe0f","1f3c4-1f3fc-200d-2640-fe0f","1f3c4-1f3fd-200d-2640-fe0f","1f3c4-1f3fe-200d-2640-fe0f","1f3c4-1f3ff-200d-2640-fe0f"]},{"n":["rowboat"],"u":"1f6a3","v":["1f6a3-1f3fb","1f6a3-1f3fc","1f6a3-1f3fd","1f6a3-1f3fe","1f6a3-1f3ff"]},{"n":["man rowing boat","man-rowing-boat"],"u":"1f6a3-200d-2642-fe0f","v":["1f6a3-1f3fb-200d-2642-fe0f","1f6a3-1f3fc-200d-2642-fe0f","1f6a3-1f3fd-200d-2642-fe0f","1f6a3-1f3fe-200d-2642-fe0f","1f6a3-1f3ff-200d-2642-fe0f"]},{"n":["woman rowing boat","woman-rowing-boat"],"u":"1f6a3-200d-2640-fe0f","v":["1f6a3-1f3fb-200d-2640-fe0f","1f6a3-1f3fc-200d-2640-fe0f","1f6a3-1f3fd-200d-2640-fe0f","1f6a3-1f3fe-200d-2640-fe0f","1f6a3-1f3ff-200d-2640-fe0f"]},{"n":["swimmer"],"u":"1f3ca","v":["1f3ca-1f3fb","1f3ca-1f3fc","1f3ca-1f3fd","1f3ca-1f3fe","1f3ca-1f3ff"]},{"n":["man swimming","man-swimming"],"u":"1f3ca-200d-2642-fe0f","v":["1f3ca-1f3fb-200d-2642-fe0f","1f3ca-1f3fc-200d-2642-fe0f","1f3ca-1f3fd-200d-2642-fe0f","1f3ca-1f3fe-200d-2642-fe0f","1f3ca-1f3ff-200d-2642-fe0f"]},{"n":["woman swimming","woman-swimming"],"u":"1f3ca-200d-2640-fe0f","v":["1f3ca-1f3fb-200d-2640-fe0f","1f3ca-1f3fc-200d-2640-fe0f","1f3ca-1f3fd-200d-2640-fe0f","1f3ca-1f3fe-200d-2640-fe0f","1f3ca-1f3ff-200d-2640-fe0f"]},{"n":["person with ball","person bouncing ball"],"u":"26f9-fe0f","v":["26f9-1f3fb","26f9-1f3fc","26f9-1f3fd","26f9-1f3fe","26f9-1f3ff"]},{"n":["man bouncing ball","man-bouncing-ball"],"u":"26f9-fe0f-200d-2642-fe0f","v":["26f9-1f3fb-200d-2642-fe0f","26f9-1f3fc-200d-2642-fe0f","26f9-1f3fd-200d-2642-fe0f","26f9-1f3fe-200d-2642-fe0f","26f9-1f3ff-200d-2642-fe0f"]},{"n":["woman bouncing ball","woman-bouncing-ball"],"u":"26f9-fe0f-200d-2640-fe0f","v":["26f9-1f3fb-200d-2640-fe0f","26f9-1f3fc-200d-2640-fe0f","26f9-1f3fd-200d-2640-fe0f","26f9-1f3fe-200d-2640-fe0f","26f9-1f3ff-200d-2640-fe0f"]},{"n":["weight lifter","person lifting weights"],"u":"1f3cb-fe0f","v":["1f3cb-1f3fb","1f3cb-1f3fc","1f3cb-1f3fd","1f3cb-1f3fe","1f3cb-1f3ff"]},{"n":["man lifting weights","man-lifting-weights"],"u":"1f3cb-fe0f-200d-2642-fe0f","v":["1f3cb-1f3fb-200d-2642-fe0f","1f3cb-1f3fc-200d-2642-fe0f","1f3cb-1f3fd-200d-2642-fe0f","1f3cb-1f3fe-200d-2642-fe0f","1f3cb-1f3ff-200d-2642-fe0f"]},{"n":["woman lifting weights","woman-lifting-weights"],"u":"1f3cb-fe0f-200d-2640-fe0f","v":["1f3cb-1f3fb-200d-2640-fe0f","1f3cb-1f3fc-200d-2640-fe0f","1f3cb-1f3fd-200d-2640-fe0f","1f3cb-1f3fe-200d-2640-fe0f","1f3cb-1f3ff-200d-2640-fe0f"]},{"n":["bicyclist"],"u":"1f6b4","v":["1f6b4-1f3fb","1f6b4-1f3fc","1f6b4-1f3fd","1f6b4-1f3fe","1f6b4-1f3ff"]},{"n":["man biking","man-biking"],"u":"1f6b4-200d-2642-fe0f","v":["1f6b4-1f3fb-200d-2642-fe0f","1f6b4-1f3fc-200d-2642-fe0f","1f6b4-1f3fd-200d-2642-fe0f","1f6b4-1f3fe-200d-2642-fe0f","1f6b4-1f3ff-200d-2642-fe0f"]},{"n":["woman biking","woman-biking"],"u":"1f6b4-200d-2640-fe0f","v":["1f6b4-1f3fb-200d-2640-fe0f","1f6b4-1f3fc-200d-2640-fe0f","1f6b4-1f3fd-200d-2640-fe0f","1f6b4-1f3fe-200d-2640-fe0f","1f6b4-1f3ff-200d-2640-fe0f"]},{"n":["mountain bicyclist"],"u":"1f6b5","v":["1f6b5-1f3fb","1f6b5-1f3fc","1f6b5-1f3fd","1f6b5-1f3fe","1f6b5-1f3ff"]},{"n":["man mountain biking","man-mountain-biking"],"u":"1f6b5-200d-2642-fe0f","v":["1f6b5-1f3fb-200d-2642-fe0f","1f6b5-1f3fc-200d-2642-fe0f","1f6b5-1f3fd-200d-2642-fe0f","1f6b5-1f3fe-200d-2642-fe0f","1f6b5-1f3ff-200d-2642-fe0f"]},{"n":["woman mountain biking","woman-mountain-biking"],"u":"1f6b5-200d-2640-fe0f","v":["1f6b5-1f3fb-200d-2640-fe0f","1f6b5-1f3fc-200d-2640-fe0f","1f6b5-1f3fd-200d-2640-fe0f","1f6b5-1f3fe-200d-2640-fe0f","1f6b5-1f3ff-200d-2640-fe0f"]},{"n":["person doing cartwheel"],"u":"1f938","v":["1f938-1f3fb","1f938-1f3fc","1f938-1f3fd","1f938-1f3fe","1f938-1f3ff"]},{"n":["man cartwheeling","man-cartwheeling"],"u":"1f938-200d-2642-fe0f","v":["1f938-1f3fb-200d-2642-fe0f","1f938-1f3fc-200d-2642-fe0f","1f938-1f3fd-200d-2642-fe0f","1f938-1f3fe-200d-2642-fe0f","1f938-1f3ff-200d-2642-fe0f"]},{"n":["woman cartwheeling","woman-cartwheeling"],"u":"1f938-200d-2640-fe0f","v":["1f938-1f3fb-200d-2640-fe0f","1f938-1f3fc-200d-2640-fe0f","1f938-1f3fd-200d-2640-fe0f","1f938-1f3fe-200d-2640-fe0f","1f938-1f3ff-200d-2640-fe0f"]},{"n":["wrestlers"],"u":"1f93c"},{"n":["men wrestling","man-wrestling"],"u":"1f93c-200d-2642-fe0f"},{"n":["women wrestling","woman-wrestling"],"u":"1f93c-200d-2640-fe0f"},{"n":["water polo"],"u":"1f93d","v":["1f93d-1f3fb","1f93d-1f3fc","1f93d-1f3fd","1f93d-1f3fe","1f93d-1f3ff"]},{"n":["man playing water polo","man-playing-water-polo"],"u":"1f93d-200d-2642-fe0f","v":["1f93d-1f3fb-200d-2642-fe0f","1f93d-1f3fc-200d-2642-fe0f","1f93d-1f3fd-200d-2642-fe0f","1f93d-1f3fe-200d-2642-fe0f","1f93d-1f3ff-200d-2642-fe0f"]},{"n":["woman playing water polo","woman-playing-water-polo"],"u":"1f93d-200d-2640-fe0f","v":["1f93d-1f3fb-200d-2640-fe0f","1f93d-1f3fc-200d-2640-fe0f","1f93d-1f3fd-200d-2640-fe0f","1f93d-1f3fe-200d-2640-fe0f","1f93d-1f3ff-200d-2640-fe0f"]},{"n":["handball"],"u":"1f93e","v":["1f93e-1f3fb","1f93e-1f3fc","1f93e-1f3fd","1f93e-1f3fe","1f93e-1f3ff"]},{"n":["man playing handball","man-playing-handball"],"u":"1f93e-200d-2642-fe0f","v":["1f93e-1f3fb-200d-2642-fe0f","1f93e-1f3fc-200d-2642-fe0f","1f93e-1f3fd-200d-2642-fe0f","1f93e-1f3fe-200d-2642-fe0f","1f93e-1f3ff-200d-2642-fe0f"]},{"n":["woman playing handball","woman-playing-handball"],"u":"1f93e-200d-2640-fe0f","v":["1f93e-1f3fb-200d-2640-fe0f","1f93e-1f3fc-200d-2640-fe0f","1f93e-1f3fd-200d-2640-fe0f","1f93e-1f3fe-200d-2640-fe0f","1f93e-1f3ff-200d-2640-fe0f"]},{"n":["juggling"],"u":"1f939","v":["1f939-1f3fb","1f939-1f3fc","1f939-1f3fd","1f939-1f3fe","1f939-1f3ff"]},{"n":["man juggling","man-juggling"],"u":"1f939-200d-2642-fe0f","v":["1f939-1f3fb-200d-2642-fe0f","1f939-1f3fc-200d-2642-fe0f","1f939-1f3fd-200d-2642-fe0f","1f939-1f3fe-200d-2642-fe0f","1f939-1f3ff-200d-2642-fe0f"]},{"n":["woman juggling","woman-juggling"],"u":"1f939-200d-2640-fe0f","v":["1f939-1f3fb-200d-2640-fe0f","1f939-1f3fc-200d-2640-fe0f","1f939-1f3fd-200d-2640-fe0f","1f939-1f3fe-200d-2640-fe0f","1f939-1f3ff-200d-2640-fe0f"]},{"n":["person in lotus position"],"u":"1f9d8","v":["1f9d8-1f3fb","1f9d8-1f3fc","1f9d8-1f3fd","1f9d8-1f3fe","1f9d8-1f3ff"]},{"n":["man in lotus position"],"u":"1f9d8-200d-2642-fe0f","v":["1f9d8-1f3fb-200d-2642-fe0f","1f9d8-1f3fc-200d-2642-fe0f","1f9d8-1f3fd-200d-2642-fe0f","1f9d8-1f3fe-200d-2642-fe0f","1f9d8-1f3ff-200d-2642-fe0f"]},{"n":["woman in lotus position"],"u":"1f9d8-200d-2640-fe0f","v":["1f9d8-1f3fb-200d-2640-fe0f","1f9d8-1f3fc-200d-2640-fe0f","1f9d8-1f3fd-200d-2640-fe0f","1f9d8-1f3fe-200d-2640-fe0f","1f9d8-1f3ff-200d-2640-fe0f"]},{"n":["bath"],"u":"1f6c0","v":["1f6c0-1f3fb","1f6c0-1f3fc","1f6c0-1f3fd","1f6c0-1f3fe","1f6c0-1f3ff"]},{"n":["sleeping accommodation"],"u":"1f6cc","v":["1f6cc-1f3fb","1f6cc-1f3fc","1f6cc-1f3fd","1f6cc-1f3fe","1f6cc-1f3ff"]},{"n":["people holding hands"],"u":"1f9d1-200d-1f91d-200d-1f9d1","v":["1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe","1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff"]},{"n":["women holding hands","two women holding hands"],"u":"1f46d","v":["1f46d-1f3fb","1f46d-1f3fc","1f46d-1f3fd","1f46d-1f3fe","1f46d-1f3ff","1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc","1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd","1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe","1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff","1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb","1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd","1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe","1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff","1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb","1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc","1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe","1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff","1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb","1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc","1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd","1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd","1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe"]},{"n":["couple","man and woman holding hands","woman and man holding hands"],"u":"1f46b","v":["1f46b-1f3fb","1f46b-1f3fc","1f46b-1f3fd","1f46b-1f3fe","1f46b-1f3ff","1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc","1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd","1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe","1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff","1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb","1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd","1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe","1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff","1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb","1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc","1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe","1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff","1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb","1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc","1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd","1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd","1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe"]},{"n":["men holding hands","two men holding hands"],"u":"1f46c","v":["1f46c-1f3fb","1f46c-1f3fc","1f46c-1f3fd","1f46c-1f3fe","1f46c-1f3ff","1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc","1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd","1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe","1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff","1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb","1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd","1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe","1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff","1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb","1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc","1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe","1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff","1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb","1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc","1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd","1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd","1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe"]},{"n":["kiss","couplekiss"],"u":"1f48f","v":["1f48f-1f3fb","1f48f-1f3fc","1f48f-1f3fd","1f48f-1f3fe","1f48f-1f3ff","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe","1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe","1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe","1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd","1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe"]},{"n":["woman-kiss-man","kiss: woman, man"],"u":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468","v":["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"]},{"n":["man-kiss-man","kiss: man, man"],"u":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","v":["1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"]},{"n":["woman-kiss-woman","kiss: woman, woman"],"u":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","v":["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff"]},{"n":["couple with heart"],"u":"1f491","v":["1f491-1f3fb","1f491-1f3fc","1f491-1f3fd","1f491-1f3fe","1f491-1f3ff","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe","1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe","1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe","1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd","1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe"]},{"n":["woman-heart-man","couple with heart: woman, man"],"u":"1f469-200d-2764-fe0f-200d-1f468","v":["1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"]},{"n":["man-heart-man","couple with heart: man, man"],"u":"1f468-200d-2764-fe0f-200d-1f468","v":["1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe","1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"]},{"n":["woman-heart-woman","couple with heart: woman, woman"],"u":"1f469-200d-2764-fe0f-200d-1f469","v":["1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe","1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff"]},{"n":["family"],"u":"1f46a"},{"n":["man-woman-boy","family: man, woman, boy"],"u":"1f468-200d-1f469-200d-1f466"},{"n":["man-woman-girl","family: man, woman, girl"],"u":"1f468-200d-1f469-200d-1f467"},{"n":["man-woman-girl-boy","family: man, woman, girl, boy"],"u":"1f468-200d-1f469-200d-1f467-200d-1f466"},{"n":["man-woman-boy-boy","family: man, woman, boy, boy"],"u":"1f468-200d-1f469-200d-1f466-200d-1f466"},{"n":["man-woman-girl-girl","family: man, woman, girl, girl"],"u":"1f468-200d-1f469-200d-1f467-200d-1f467"},{"n":["man-man-boy","family: man, man, boy"],"u":"1f468-200d-1f468-200d-1f466"},{"n":["man-man-girl","family: man, man, girl"],"u":"1f468-200d-1f468-200d-1f467"},{"n":["man-man-girl-boy","family: man, man, girl, boy"],"u":"1f468-200d-1f468-200d-1f467-200d-1f466"},{"n":["man-man-boy-boy","family: man, man, boy, boy"],"u":"1f468-200d-1f468-200d-1f466-200d-1f466"},{"n":["man-man-girl-girl","family: man, man, girl, girl"],"u":"1f468-200d-1f468-200d-1f467-200d-1f467"},{"n":["woman-woman-boy","family: woman, woman, boy"],"u":"1f469-200d-1f469-200d-1f466"},{"n":["woman-woman-girl","family: woman, woman, girl"],"u":"1f469-200d-1f469-200d-1f467"},{"n":["woman-woman-girl-boy","family: woman, woman, girl, boy"],"u":"1f469-200d-1f469-200d-1f467-200d-1f466"},{"n":["woman-woman-boy-boy","family: woman, woman, boy, boy"],"u":"1f469-200d-1f469-200d-1f466-200d-1f466"},{"n":["woman-woman-girl-girl","family: woman, woman, girl, girl"],"u":"1f469-200d-1f469-200d-1f467-200d-1f467"},{"n":["man-boy","family: man, boy"],"u":"1f468-200d-1f466"},{"n":["man-boy-boy","family: man, boy, boy"],"u":"1f468-200d-1f466-200d-1f466"},{"n":["man-girl","family: man, girl"],"u":"1f468-200d-1f467"},{"n":["man-girl-boy","family: man, girl, boy"],"u":"1f468-200d-1f467-200d-1f466"},{"n":["man-girl-girl","family: man, girl, girl"],"u":"1f468-200d-1f467-200d-1f467"},{"n":["woman-boy","family: woman, boy"],"u":"1f469-200d-1f466"},{"n":["woman-boy-boy","family: woman, boy, boy"],"u":"1f469-200d-1f466-200d-1f466"},{"n":["woman-girl","family: woman, girl"],"u":"1f469-200d-1f467"},{"n":["woman-girl-boy","family: woman, girl, boy"],"u":"1f469-200d-1f467-200d-1f466"},{"n":["woman-girl-girl","family: woman, girl, girl"],"u":"1f469-200d-1f467-200d-1f467"},{"n":["speaking head","speaking head in silhouette"],"u":"1f5e3-fe0f"},{"n":["bust in silhouette"],"u":"1f464"},{"n":["busts in silhouette"],"u":"1f465"},{"n":["people hugging"],"u":"1fac2"},{"n":["footprints"],"u":"1f463"}],"animals_nature":[{"n":["monkey face"],"u":"1f435"},{"n":["monkey"],"u":"1f412"},{"n":["gorilla"],"u":"1f98d"},{"n":["orangutan"],"u":"1f9a7"},{"n":["dog","dog face"],"u":"1f436"},{"n":["dog","dog2"],"u":"1f415"},{"n":["guide dog"],"u":"1f9ae"},{"n":["service dog"],"u":"1f415-200d-1f9ba"},{"n":["poodle"],"u":"1f429"},{"n":["wolf","wolf face"],"u":"1f43a"},{"n":["fox face"],"u":"1f98a"},{"n":["raccoon"],"u":"1f99d"},{"n":["cat","cat face"],"u":"1f431"},{"n":["cat","cat2"],"u":"1f408"},{"n":["black cat"],"u":"1f408-200d-2b1b"},{"n":["lion face"],"u":"1f981"},{"n":["tiger","tiger face"],"u":"1f42f"},{"n":["tiger","tiger2"],"u":"1f405"},{"n":["leopard"],"u":"1f406"},{"n":["horse","horse face"],"u":"1f434"},{"n":["horse","racehorse"],"u":"1f40e"},{"n":["unicorn face"],"u":"1f984"},{"n":["zebra face"],"u":"1f993"},{"n":["deer"],"u":"1f98c"},{"n":["bison"],"u":"1f9ac"},{"n":["cow","cow face"],"u":"1f42e"},{"n":["ox"],"u":"1f402"},{"n":["water buffalo"],"u":"1f403"},{"n":["cow","cow2"],"u":"1f404"},{"n":["pig","pig face"],"u":"1f437"},{"n":["pig","pig2"],"u":"1f416"},{"n":["boar"],"u":"1f417"},{"n":["pig nose"],"u":"1f43d"},{"n":["ram"],"u":"1f40f"},{"n":["sheep"],"u":"1f411"},{"n":["goat"],"u":"1f410"},{"n":["dromedary camel"],"u":"1f42a"},{"n":["camel","bactrian camel"],"u":"1f42b"},{"n":["llama"],"u":"1f999"},{"n":["giraffe face"],"u":"1f992"},{"n":["elephant"],"u":"1f418"},{"n":["mammoth"],"u":"1f9a3"},{"n":["rhinoceros"],"u":"1f98f"},{"n":["hippopotamus"],"u":"1f99b"},{"n":["mouse","mouse face"],"u":"1f42d"},{"n":["mouse","mouse2"],"u":"1f401"},{"n":["rat"],"u":"1f400"},{"n":["hamster","hamster face"],"u":"1f439"},{"n":["rabbit","rabbit face"],"u":"1f430"},{"n":["rabbit","rabbit2"],"u":"1f407"},{"n":["chipmunk"],"u":"1f43f-fe0f"},{"n":["beaver"],"u":"1f9ab"},{"n":["hedgehog"],"u":"1f994"},{"n":["bat"],"u":"1f987"},{"n":["bear","bear face"],"u":"1f43b"},{"n":["polar bear"],"u":"1f43b-200d-2744-fe0f"},{"n":["koala"],"u":"1f428"},{"n":["panda face"],"u":"1f43c"},{"n":["sloth"],"u":"1f9a5"},{"n":["otter"],"u":"1f9a6"},{"n":["skunk"],"u":"1f9a8"},{"n":["kangaroo"],"u":"1f998"},{"n":["badger"],"u":"1f9a1"},{"n":["feet","paw prints"],"u":"1f43e"},{"n":["turkey"],"u":"1f983"},{"n":["chicken"],"u":"1f414"},{"n":["rooster"],"u":"1f413"},{"n":["hatching chick"],"u":"1f423"},{"n":["baby chick"],"u":"1f424"},{"n":["hatched chick","front-facing baby chick"],"u":"1f425"},{"n":["bird"],"u":"1f426"},{"n":["penguin"],"u":"1f427"},{"n":["dove","dove of peace"],"u":"1f54a-fe0f"},{"n":["eagle"],"u":"1f985"},{"n":["duck"],"u":"1f986"},{"n":["swan"],"u":"1f9a2"},{"n":["owl"],"u":"1f989"},{"n":["dodo"],"u":"1f9a4"},{"n":["feather"],"u":"1fab6"},{"n":["flamingo"],"u":"1f9a9"},{"n":["peacock"],"u":"1f99a"},{"n":["parrot"],"u":"1f99c"},{"n":["frog","frog face"],"u":"1f438"},{"n":["crocodile"],"u":"1f40a"},{"n":["turtle"],"u":"1f422"},{"n":["lizard"],"u":"1f98e"},{"n":["snake"],"u":"1f40d"},{"n":["dragon face"],"u":"1f432"},{"n":["dragon"],"u":"1f409"},{"n":["sauropod"],"u":"1f995"},{"n":["t-rex"],"u":"1f996"},{"n":["whale","spouting whale"],"u":"1f433"},{"n":["whale","whale2"],"u":"1f40b"},{"n":["dolphin","flipper"],"u":"1f42c"},{"n":["seal"],"u":"1f9ad"},{"n":["fish"],"u":"1f41f"},{"n":["tropical fish"],"u":"1f420"},{"n":["blowfish"],"u":"1f421"},{"n":["shark"],"u":"1f988"},{"n":["octopus"],"u":"1f419"},{"n":["shell","spiral shell"],"u":"1f41a"},{"n":["coral"],"u":"1fab8"},{"n":["snail"],"u":"1f40c"},{"n":["butterfly"],"u":"1f98b"},{"n":["bug"],"u":"1f41b"},{"n":["ant"],"u":"1f41c"},{"n":["bee","honeybee"],"u":"1f41d"},{"n":["beetle"],"u":"1fab2"},{"n":["ladybug","lady beetle"],"u":"1f41e"},{"n":["cricket"],"u":"1f997"},{"n":["cockroach"],"u":"1fab3"},{"n":["spider"],"u":"1f577-fe0f"},{"n":["spider web"],"u":"1f578-fe0f"},{"n":["scorpion"],"u":"1f982"},{"n":["mosquito"],"u":"1f99f"},{"n":["fly"],"u":"1fab0"},{"n":["worm"],"u":"1fab1"},{"n":["microbe"],"u":"1f9a0"},{"n":["bouquet"],"u":"1f490"},{"n":["cherry blossom"],"u":"1f338"},{"n":["white flower"],"u":"1f4ae"},{"n":["lotus"],"u":"1fab7"},{"n":["rosette"],"u":"1f3f5-fe0f"},{"n":["rose"],"u":"1f339"},{"n":["wilted flower"],"u":"1f940"},{"n":["hibiscus"],"u":"1f33a"},{"n":["sunflower"],"u":"1f33b"},{"n":["blossom"],"u":"1f33c"},{"n":["tulip"],"u":"1f337"},{"n":["seedling"],"u":"1f331"},{"n":["potted plant"],"u":"1fab4"},{"n":["evergreen tree"],"u":"1f332"},{"n":["deciduous tree"],"u":"1f333"},{"n":["palm tree"],"u":"1f334"},{"n":["cactus"],"u":"1f335"},{"n":["ear of rice"],"u":"1f33e"},{"n":["herb"],"u":"1f33f"},{"n":["shamrock"],"u":"2618-fe0f"},{"n":["four leaf clover"],"u":"1f340"},{"n":["maple leaf"],"u":"1f341"},{"n":["fallen leaf"],"u":"1f342"},{"n":["leaves","leaf fluttering in wind"],"u":"1f343"},{"n":["empty nest"],"u":"1fab9"},{"n":["nest with eggs"],"u":"1faba"}],"food_drink":[{"n":["grapes"],"u":"1f347"},{"n":["melon"],"u":"1f348"},{"n":["watermelon"],"u":"1f349"},{"n":["tangerine"],"u":"1f34a"},{"n":["lemon"],"u":"1f34b"},{"n":["banana"],"u":"1f34c"},{"n":["pineapple"],"u":"1f34d"},{"n":["mango"],"u":"1f96d"},{"n":["apple","red apple"],"u":"1f34e"},{"n":["green apple"],"u":"1f34f"},{"n":["pear"],"u":"1f350"},{"n":["peach"],"u":"1f351"},{"n":["cherries"],"u":"1f352"},{"n":["strawberry"],"u":"1f353"},{"n":["blueberries"],"u":"1fad0"},{"n":["kiwifruit"],"u":"1f95d"},{"n":["tomato"],"u":"1f345"},{"n":["olive"],"u":"1fad2"},{"n":["coconut"],"u":"1f965"},{"n":["avocado"],"u":"1f951"},{"n":["eggplant","aubergine"],"u":"1f346"},{"n":["potato"],"u":"1f954"},{"n":["carrot"],"u":"1f955"},{"n":["corn","ear of maize"],"u":"1f33d"},{"n":["hot pepper"],"u":"1f336-fe0f"},{"n":["bell pepper"],"u":"1fad1"},{"n":["cucumber"],"u":"1f952"},{"n":["leafy green"],"u":"1f96c"},{"n":["broccoli"],"u":"1f966"},{"n":["garlic"],"u":"1f9c4"},{"n":["onion"],"u":"1f9c5"},{"n":["mushroom"],"u":"1f344"},{"n":["peanuts"],"u":"1f95c"},{"n":["beans"],"u":"1fad8"},{"n":["chestnut"],"u":"1f330"},{"n":["bread"],"u":"1f35e"},{"n":["croissant"],"u":"1f950"},{"n":["baguette bread"],"u":"1f956"},{"n":["flatbread"],"u":"1fad3"},{"n":["pretzel"],"u":"1f968"},{"n":["bagel"],"u":"1f96f"},{"n":["pancakes"],"u":"1f95e"},{"n":["waffle"],"u":"1f9c7"},{"n":["cheese wedge"],"u":"1f9c0"},{"n":["meat on bone"],"u":"1f356"},{"n":["poultry leg"],"u":"1f357"},{"n":["cut of meat"],"u":"1f969"},{"n":["bacon"],"u":"1f953"},{"n":["hamburger"],"u":"1f354"},{"n":["fries","french fries"],"u":"1f35f"},{"n":["pizza","slice of pizza"],"u":"1f355"},{"n":["hotdog","hot dog"],"u":"1f32d"},{"n":["sandwich"],"u":"1f96a"},{"n":["taco"],"u":"1f32e"},{"n":["burrito"],"u":"1f32f"},{"n":["tamale"],"u":"1fad4"},{"n":["stuffed flatbread"],"u":"1f959"},{"n":["falafel"],"u":"1f9c6"},{"n":["egg"],"u":"1f95a"},{"n":["cooking","fried egg"],"u":"1f373"},{"n":["shallow pan of food"],"u":"1f958"},{"n":["stew","pot of food"],"u":"1f372"},{"n":["fondue"],"u":"1fad5"},{"n":["bowl with spoon"],"u":"1f963"},{"n":["green salad"],"u":"1f957"},{"n":["popcorn"],"u":"1f37f"},{"n":["butter"],"u":"1f9c8"},{"n":["salt","salt shaker"],"u":"1f9c2"},{"n":["canned food"],"u":"1f96b"},{"n":["bento","bento box"],"u":"1f371"},{"n":["rice cracker"],"u":"1f358"},{"n":["rice ball"],"u":"1f359"},{"n":["rice","cooked rice"],"u":"1f35a"},{"n":["curry","curry and rice"],"u":"1f35b"},{"n":["ramen","steaming bowl"],"u":"1f35c"},{"n":["spaghetti"],"u":"1f35d"},{"n":["sweet potato","roasted sweet potato"],"u":"1f360"},{"n":["oden"],"u":"1f362"},{"n":["sushi"],"u":"1f363"},{"n":["fried shrimp"],"u":"1f364"},{"n":["fish cake","fish cake with swirl design"],"u":"1f365"},{"n":["moon cake"],"u":"1f96e"},{"n":["dango"],"u":"1f361"},{"n":["dumpling"],"u":"1f95f"},{"n":["fortune cookie"],"u":"1f960"},{"n":["takeout box"],"u":"1f961"},{"n":["crab"],"u":"1f980"},{"n":["lobster"],"u":"1f99e"},{"n":["shrimp"],"u":"1f990"},{"n":["squid"],"u":"1f991"},{"n":["oyster"],"u":"1f9aa"},{"n":["icecream","soft ice cream"],"u":"1f366"},{"n":["shaved ice"],"u":"1f367"},{"n":["ice cream"],"u":"1f368"},{"n":["doughnut"],"u":"1f369"},{"n":["cookie"],"u":"1f36a"},{"n":["birthday","birthday cake"],"u":"1f382"},{"n":["cake","shortcake"],"u":"1f370"},{"n":["cupcake"],"u":"1f9c1"},{"n":["pie"],"u":"1f967"},{"n":["chocolate bar"],"u":"1f36b"},{"n":["candy"],"u":"1f36c"},{"n":["lollipop"],"u":"1f36d"},{"n":["custard"],"u":"1f36e"},{"n":["honey pot"],"u":"1f36f"},{"n":["baby bottle"],"u":"1f37c"},{"n":["glass of milk"],"u":"1f95b"},{"n":["coffee","hot beverage"],"u":"2615"},{"n":["teapot"],"u":"1fad6"},{"n":["tea","teacup without handle"],"u":"1f375"},{"n":["sake","sake bottle and cup"],"u":"1f376"},{"n":["champagne","bottle with popping cork"],"u":"1f37e"},{"n":["wine glass"],"u":"1f377"},{"n":["cocktail","cocktail glass"],"u":"1f378"},{"n":["tropical drink"],"u":"1f379"},{"n":["beer","beer mug"],"u":"1f37a"},{"n":["beers","clinking beer mugs"],"u":"1f37b"},{"n":["clinking glasses"],"u":"1f942"},{"n":["tumbler glass"],"u":"1f943"},{"n":["pouring liquid"],"u":"1fad7"},{"n":["cup with straw"],"u":"1f964"},{"n":["bubble tea"],"u":"1f9cb"},{"n":["beverage box"],"u":"1f9c3"},{"n":["mate drink"],"u":"1f9c9"},{"n":["ice cube"],"u":"1f9ca"},{"n":["chopsticks"],"u":"1f962"},{"n":["knife fork plate","fork and knife with plate"],"u":"1f37d-fe0f"},{"n":["fork and knife"],"u":"1f374"},{"n":["spoon"],"u":"1f944"},{"n":["hocho","knife"],"u":"1f52a"},{"n":["jar"],"u":"1fad9"},{"n":["amphora"],"u":"1f3fa"}],"travel_places":[{"n":["earth africa","earth globe europe-africa"],"u":"1f30d"},{"n":["earth americas","earth globe americas"],"u":"1f30e"},{"n":["earth asia","earth globe asia-australia"],"u":"1f30f"},{"n":["globe with meridians"],"u":"1f310"},{"n":["world map"],"u":"1f5fa-fe0f"},{"n":["japan","silhouette of japan"],"u":"1f5fe"},{"n":["compass"],"u":"1f9ed"},{"n":["snow-capped mountain","snow capped mountain"],"u":"1f3d4-fe0f"},{"n":["mountain"],"u":"26f0-fe0f"},{"n":["volcano"],"u":"1f30b"},{"n":["mount fuji"],"u":"1f5fb"},{"n":["camping"],"u":"1f3d5-fe0f"},{"n":["beach with umbrella"],"u":"1f3d6-fe0f"},{"n":["desert"],"u":"1f3dc-fe0f"},{"n":["desert island"],"u":"1f3dd-fe0f"},{"n":["national park"],"u":"1f3de-fe0f"},{"n":["stadium"],"u":"1f3df-fe0f"},{"n":["classical building"],"u":"1f3db-fe0f"},{"n":["building construction"],"u":"1f3d7-fe0f"},{"n":["brick","bricks"],"u":"1f9f1"},{"n":["rock"],"u":"1faa8"},{"n":["wood"],"u":"1fab5"},{"n":["hut"],"u":"1f6d6"},{"n":["houses","house buildings"],"u":"1f3d8-fe0f"},{"n":["derelict house","derelict house building"],"u":"1f3da-fe0f"},{"n":["house","house building"],"u":"1f3e0"},{"n":["house with garden"],"u":"1f3e1"},{"n":["office","office building"],"u":"1f3e2"},{"n":["post office","japanese post office"],"u":"1f3e3"},{"n":["european post office"],"u":"1f3e4"},{"n":["hospital"],"u":"1f3e5"},{"n":["bank"],"u":"1f3e6"},{"n":["hotel"],"u":"1f3e8"},{"n":["love hotel"],"u":"1f3e9"},{"n":["convenience store"],"u":"1f3ea"},{"n":["school"],"u":"1f3eb"},{"n":["department store"],"u":"1f3ec"},{"n":["factory"],"u":"1f3ed"},{"n":["japanese castle"],"u":"1f3ef"},{"n":["european castle"],"u":"1f3f0"},{"n":["wedding"],"u":"1f492"},{"n":["tokyo tower"],"u":"1f5fc"},{"n":["statue of liberty"],"u":"1f5fd"},{"n":["church"],"u":"26ea"},{"n":["mosque"],"u":"1f54c"},{"n":["hindu temple"],"u":"1f6d5"},{"n":["synagogue"],"u":"1f54d"},{"n":["shinto shrine"],"u":"26e9-fe0f"},{"n":["kaaba"],"u":"1f54b"},{"n":["fountain"],"u":"26f2"},{"n":["tent"],"u":"26fa"},{"n":["foggy"],"u":"1f301"},{"n":["night with stars"],"u":"1f303"},{"n":["cityscape"],"u":"1f3d9-fe0f"},{"n":["sunrise over mountains"],"u":"1f304"},{"n":["sunrise"],"u":"1f305"},{"n":["city sunset","cityscape at dusk"],"u":"1f306"},{"n":["city sunrise","sunset over buildings"],"u":"1f307"},{"n":["bridge at night"],"u":"1f309"},{"n":["hotsprings","hot springs"],"u":"2668-fe0f"},{"n":["carousel horse"],"u":"1f3a0"},{"n":["playground slide"],"u":"1f6dd"},{"n":["ferris wheel"],"u":"1f3a1"},{"n":["roller coaster"],"u":"1f3a2"},{"n":["barber","barber pole"],"u":"1f488"},{"n":["circus tent"],"u":"1f3aa"},{"n":["steam locomotive"],"u":"1f682"},{"n":["railway car"],"u":"1f683"},{"n":["high-speed train","bullettrain side"],"u":"1f684"},{"n":["bullettrain front","high-speed train with bullet nose"],"u":"1f685"},{"n":["train","train2"],"u":"1f686"},{"n":["metro"],"u":"1f687"},{"n":["light rail"],"u":"1f688"},{"n":["station"],"u":"1f689"},{"n":["tram"],"u":"1f68a"},{"n":["monorail"],"u":"1f69d"},{"n":["mountain railway"],"u":"1f69e"},{"n":["train","tram car"],"u":"1f68b"},{"n":["bus"],"u":"1f68c"},{"n":["oncoming bus"],"u":"1f68d"},{"n":["trolleybus"],"u":"1f68e"},{"n":["minibus"],"u":"1f690"},{"n":["ambulance"],"u":"1f691"},{"n":["fire engine"],"u":"1f692"},{"n":["police car"],"u":"1f693"},{"n":["oncoming police car"],"u":"1f694"},{"n":["taxi"],"u":"1f695"},{"n":["oncoming taxi"],"u":"1f696"},{"n":["car","red car","automobile"],"u":"1f697"},{"n":["oncoming automobile"],"u":"1f698"},{"n":["blue car","recreational vehicle"],"u":"1f699"},{"n":["pickup truck"],"u":"1f6fb"},{"n":["truck","delivery truck"],"u":"1f69a"},{"n":["articulated lorry"],"u":"1f69b"},{"n":["tractor"],"u":"1f69c"},{"n":["racing car"],"u":"1f3ce-fe0f"},{"n":["motorcycle","racing motorcycle"],"u":"1f3cd-fe0f"},{"n":["motor scooter"],"u":"1f6f5"},{"n":["manual wheelchair"],"u":"1f9bd"},{"n":["motorized wheelchair"],"u":"1f9bc"},{"n":["auto rickshaw"],"u":"1f6fa"},{"n":["bike","bicycle"],"u":"1f6b2"},{"n":["scooter"],"u":"1f6f4"},{"n":["skateboard"],"u":"1f6f9"},{"n":["roller skate"],"u":"1f6fc"},{"n":["busstop","bus stop"],"u":"1f68f"},{"n":["motorway"],"u":"1f6e3-fe0f"},{"n":["railway track"],"u":"1f6e4-fe0f"},{"n":["oil drum"],"u":"1f6e2-fe0f"},{"n":["fuelpump","fuel pump"],"u":"26fd"},{"n":["wheel"],"u":"1f6de"},{"n":["rotating light","police cars revolving light"],"u":"1f6a8"},{"n":["traffic light","horizontal traffic light"],"u":"1f6a5"},{"n":["vertical traffic light"],"u":"1f6a6"},{"n":["octagonal sign"],"u":"1f6d1"},{"n":["construction","construction sign"],"u":"1f6a7"},{"n":["anchor"],"u":"2693"},{"n":["ring buoy"],"u":"1f6df"},{"n":["boat","sailboat"],"u":"26f5"},{"n":["canoe"],"u":"1f6f6"},{"n":["speedboat"],"u":"1f6a4"},{"n":["passenger ship"],"u":"1f6f3-fe0f"},{"n":["ferry"],"u":"26f4-fe0f"},{"n":["motor boat"],"u":"1f6e5-fe0f"},{"n":["ship"],"u":"1f6a2"},{"n":["airplane"],"u":"2708-fe0f"},{"n":["small airplane"],"u":"1f6e9-fe0f"},{"n":["airplane departure"],"u":"1f6eb"},{"n":["airplane arriving"],"u":"1f6ec"},{"n":["parachute"],"u":"1fa82"},{"n":["seat"],"u":"1f4ba"},{"n":["helicopter"],"u":"1f681"},{"n":["suspension railway"],"u":"1f69f"},{"n":["mountain cableway"],"u":"1f6a0"},{"n":["aerial tramway"],"u":"1f6a1"},{"n":["satellite"],"u":"1f6f0-fe0f"},{"n":["rocket"],"u":"1f680"},{"n":["flying saucer"],"u":"1f6f8"},{"n":["bellhop bell"],"u":"1f6ce-fe0f"},{"n":["luggage"],"u":"1f9f3"},{"n":["hourglass"],"u":"231b"},{"n":["hourglass flowing sand","hourglass with flowing sand"],"u":"23f3"},{"n":["watch"],"u":"231a"},{"n":["alarm clock"],"u":"23f0"},{"n":["stopwatch"],"u":"23f1-fe0f"},{"n":["timer clock"],"u":"23f2-fe0f"},{"n":["mantelpiece clock"],"u":"1f570-fe0f"},{"n":["clock12","clock face twelve oclock"],"u":"1f55b"},{"n":["clock1230","clock face twelve-thirty"],"u":"1f567"},{"n":["clock1","clock face one oclock"],"u":"1f550"},{"n":["clock130","clock face one-thirty"],"u":"1f55c"},{"n":["clock2","clock face two oclock"],"u":"1f551"},{"n":["clock230","clock face two-thirty"],"u":"1f55d"},{"n":["clock3","clock face three oclock"],"u":"1f552"},{"n":["clock330","clock face three-thirty"],"u":"1f55e"},{"n":["clock4","clock face four oclock"],"u":"1f553"},{"n":["clock430","clock face four-thirty"],"u":"1f55f"},{"n":["clock5","clock face five oclock"],"u":"1f554"},{"n":["clock530","clock face five-thirty"],"u":"1f560"},{"n":["clock6","clock face six oclock"],"u":"1f555"},{"n":["clock630","clock face six-thirty"],"u":"1f561"},{"n":["clock7","clock face seven oclock"],"u":"1f556"},{"n":["clock730","clock face seven-thirty"],"u":"1f562"},{"n":["clock8","clock face eight oclock"],"u":"1f557"},{"n":["clock830","clock face eight-thirty"],"u":"1f563"},{"n":["clock9","clock face nine oclock"],"u":"1f558"},{"n":["clock930","clock face nine-thirty"],"u":"1f564"},{"n":["clock10","clock face ten oclock"],"u":"1f559"},{"n":["clock1030","clock face ten-thirty"],"u":"1f565"},{"n":["clock11","clock face eleven oclock"],"u":"1f55a"},{"n":["clock1130","clock face eleven-thirty"],"u":"1f566"},{"n":["new moon","new moon symbol"],"u":"1f311"},{"n":["waxing crescent moon","waxing crescent moon symbol"],"u":"1f312"},{"n":["first quarter moon","first quarter moon symbol"],"u":"1f313"},{"n":["moon","waxing gibbous moon","waxing gibbous moon symbol"],"u":"1f314"},{"n":["full moon","full moon symbol"],"u":"1f315"},{"n":["waning gibbous moon","waning gibbous moon symbol"],"u":"1f316"},{"n":["last quarter moon","last quarter moon symbol"],"u":"1f317"},{"n":["waning crescent moon","waning crescent moon symbol"],"u":"1f318"},{"n":["crescent moon"],"u":"1f319"},{"n":["new moon with face"],"u":"1f31a"},{"n":["first quarter moon with face"],"u":"1f31b"},{"n":["last quarter moon with face"],"u":"1f31c"},{"n":["thermometer"],"u":"1f321-fe0f"},{"n":["sunny","black sun with rays"],"u":"2600-fe0f"},{"n":["full moon with face"],"u":"1f31d"},{"n":["sun with face"],"u":"1f31e"},{"n":["ringed planet"],"u":"1fa90"},{"n":["star","white medium star"],"u":"2b50"},{"n":["star2","glowing star"],"u":"1f31f"},{"n":["stars","shooting star"],"u":"1f320"},{"n":["milky way"],"u":"1f30c"},{"n":["cloud"],"u":"2601-fe0f"},{"n":["partly sunny","sun behind cloud"],"u":"26c5"},{"n":["thunder cloud and rain","cloud with lightning and rain"],"u":"26c8-fe0f"},{"n":["mostly sunny","sun small cloud","sun behind small cloud"],"u":"1f324-fe0f"},{"n":["barely sunny","sun behind cloud","sun behind large cloud"],"u":"1f325-fe0f"},{"n":["partly sunny rain","sun behind rain cloud"],"u":"1f326-fe0f"},{"n":["rain cloud","cloud with rain"],"u":"1f327-fe0f"},{"n":["snow cloud","cloud with snow"],"u":"1f328-fe0f"},{"n":["lightning","lightning cloud","cloud with lightning"],"u":"1f329-fe0f"},{"n":["tornado","tornado cloud"],"u":"1f32a-fe0f"},{"n":["fog"],"u":"1f32b-fe0f"},{"n":["wind face","wind blowing face"],"u":"1f32c-fe0f"},{"n":["cyclone"],"u":"1f300"},{"n":["rainbow"],"u":"1f308"},{"n":["closed umbrella"],"u":"1f302"},{"n":["umbrella"],"u":"2602-fe0f"},{"n":["umbrella with rain drops"],"u":"2614"},{"n":["umbrella on ground"],"u":"26f1-fe0f"},{"n":["zap","high voltage sign"],"u":"26a1"},{"n":["snowflake"],"u":"2744-fe0f"},{"n":["snowman"],"u":"2603-fe0f"},{"n":["snowman without snow"],"u":"26c4"},{"n":["comet"],"u":"2604-fe0f"},{"n":["fire"],"u":"1f525"},{"n":["droplet"],"u":"1f4a7"},{"n":["ocean","water wave"],"u":"1f30a"}],"activities":[{"n":["jack-o-lantern","jack o lantern"],"u":"1f383"},{"n":["christmas tree"],"u":"1f384"},{"n":["fireworks"],"u":"1f386"},{"n":["sparkler","firework sparkler"],"u":"1f387"},{"n":["firecracker"],"u":"1f9e8"},{"n":["sparkles"],"u":"2728"},{"n":["balloon"],"u":"1f388"},{"n":["tada","party popper"],"u":"1f389"},{"n":["confetti ball"],"u":"1f38a"},{"n":["tanabata tree"],"u":"1f38b"},{"n":["bamboo","pine decoration"],"u":"1f38d"},{"n":["dolls","japanese dolls"],"u":"1f38e"},{"n":["flags","carp streamer"],"u":"1f38f"},{"n":["wind chime"],"u":"1f390"},{"n":["rice scene","moon viewing ceremony"],"u":"1f391"},{"n":["red envelope","red gift envelope"],"u":"1f9e7"},{"n":["ribbon"],"u":"1f380"},{"n":["gift","wrapped present"],"u":"1f381"},{"n":["reminder ribbon"],"u":"1f397-fe0f"},{"n":["admission tickets"],"u":"1f39f-fe0f"},{"n":["ticket"],"u":"1f3ab"},{"n":["medal","military medal"],"u":"1f396-fe0f"},{"n":["trophy"],"u":"1f3c6"},{"n":["sports medal"],"u":"1f3c5"},{"n":["first place medal"],"u":"1f947"},{"n":["second place medal"],"u":"1f948"},{"n":["third place medal"],"u":"1f949"},{"n":["soccer","soccer ball"],"u":"26bd"},{"n":["baseball"],"u":"26be"},{"n":["softball"],"u":"1f94e"},{"n":["basketball","basketball and hoop"],"u":"1f3c0"},{"n":["volleyball"],"u":"1f3d0"},{"n":["football","american football"],"u":"1f3c8"},{"n":["rugby football"],"u":"1f3c9"},{"n":["tennis","tennis racquet and ball"],"u":"1f3be"},{"n":["flying disc"],"u":"1f94f"},{"n":["bowling"],"u":"1f3b3"},{"n":["cricket bat and ball"],"u":"1f3cf"},{"n":["field hockey stick and ball"],"u":"1f3d1"},{"n":["ice hockey stick and puck"],"u":"1f3d2"},{"n":["lacrosse","lacrosse stick and ball"],"u":"1f94d"},{"n":["table tennis paddle and ball"],"u":"1f3d3"},{"n":["badminton racquet and shuttlecock"],"u":"1f3f8"},{"n":["boxing glove"],"u":"1f94a"},{"n":["martial arts uniform"],"u":"1f94b"},{"n":["goal net"],"u":"1f945"},{"n":["golf","flag in hole"],"u":"26f3"},{"n":["ice skate"],"u":"26f8-fe0f"},{"n":["fishing pole and fish"],"u":"1f3a3"},{"n":["diving mask"],"u":"1f93f"},{"n":["running shirt with sash"],"u":"1f3bd"},{"n":["ski","ski and ski boot"],"u":"1f3bf"},{"n":["sled"],"u":"1f6f7"},{"n":["curling stone"],"u":"1f94c"},{"n":["dart","direct hit"],"u":"1f3af"},{"n":["yo-yo"],"u":"1fa80"},{"n":["kite"],"u":"1fa81"},{"n":["8ball","billiards"],"u":"1f3b1"},{"n":["crystal ball"],"u":"1f52e"},{"n":["magic wand"],"u":"1fa84"},{"n":["nazar amulet"],"u":"1f9ff"},{"n":["hamsa"],"u":"1faac"},{"n":["video game"],"u":"1f3ae"},{"n":["joystick"],"u":"1f579-fe0f"},{"n":["slot machine"],"u":"1f3b0"},{"n":["game die"],"u":"1f3b2"},{"n":["jigsaw","jigsaw puzzle piece"],"u":"1f9e9"},{"n":["teddy bear"],"u":"1f9f8"},{"n":["pinata"],"u":"1fa85"},{"n":["mirror ball"],"u":"1faa9"},{"n":["nesting dolls"],"u":"1fa86"},{"n":["spades","black spade suit"],"u":"2660-fe0f"},{"n":["hearts","black heart suit"],"u":"2665-fe0f"},{"n":["diamonds","black diamond suit"],"u":"2666-fe0f"},{"n":["clubs","black club suit"],"u":"2663-fe0f"},{"n":["chess pawn"],"u":"265f-fe0f"},{"n":["black joker","playing card black joker"],"u":"1f0cf"},{"n":["mahjong","mahjong tile red dragon"],"u":"1f004"},{"n":["flower playing cards"],"u":"1f3b4"},{"n":["performing arts"],"u":"1f3ad"},{"n":["framed picture","frame with picture"],"u":"1f5bc-fe0f"},{"n":["art","artist palette"],"u":"1f3a8"},{"n":["thread","spool of thread"],"u":"1f9f5"},{"n":["sewing needle"],"u":"1faa1"},{"n":["yarn","ball of yarn"],"u":"1f9f6"},{"n":["knot"],"u":"1faa2"}],"objects":[{"n":["eyeglasses"],"u":"1f453"},{"n":["sunglasses","dark sunglasses"],"u":"1f576-fe0f"},{"n":["goggles"],"u":"1f97d"},{"n":["lab coat"],"u":"1f97c"},{"n":["safety vest"],"u":"1f9ba"},{"n":["necktie"],"u":"1f454"},{"n":["shirt","tshirt","t-shirt"],"u":"1f455"},{"n":["jeans"],"u":"1f456"},{"n":["scarf"],"u":"1f9e3"},{"n":["gloves"],"u":"1f9e4"},{"n":["coat"],"u":"1f9e5"},{"n":["socks"],"u":"1f9e6"},{"n":["dress"],"u":"1f457"},{"n":["kimono"],"u":"1f458"},{"n":["sari"],"u":"1f97b"},{"n":["one-piece swimsuit"],"u":"1fa71"},{"n":["briefs"],"u":"1fa72"},{"n":["shorts"],"u":"1fa73"},{"n":["bikini"],"u":"1f459"},{"n":["womans clothes"],"u":"1f45a"},{"n":["purse"],"u":"1f45b"},{"n":["handbag"],"u":"1f45c"},{"n":["pouch"],"u":"1f45d"},{"n":["shopping bags"],"u":"1f6cd-fe0f"},{"n":["school satchel"],"u":"1f392"},{"n":["thong sandal"],"u":"1fa74"},{"n":["shoe","mans shoe"],"u":"1f45e"},{"n":["athletic shoe"],"u":"1f45f"},{"n":["hiking boot"],"u":"1f97e"},{"n":["flat shoe","womans flat shoe"],"u":"1f97f"},{"n":["high heel","high-heeled shoe"],"u":"1f460"},{"n":["sandal","womans sandal"],"u":"1f461"},{"n":["ballet shoes"],"u":"1fa70"},{"n":["boot","womans boots"],"u":"1f462"},{"n":["crown"],"u":"1f451"},{"n":["womans hat"],"u":"1f452"},{"n":["tophat","top hat"],"u":"1f3a9"},{"n":["mortar board","graduation cap"],"u":"1f393"},{"n":["billed cap"],"u":"1f9e2"},{"n":["military helmet"],"u":"1fa96"},{"n":["rescue worker’s helmet","helmet with white cross"],"u":"26d1-fe0f"},{"n":["prayer beads"],"u":"1f4ff"},{"n":["lipstick"],"u":"1f484"},{"n":["ring"],"u":"1f48d"},{"n":["gem","gem stone"],"u":"1f48e"},{"n":["mute","speaker with cancellation stroke"],"u":"1f507"},{"n":["speaker"],"u":"1f508"},{"n":["sound","speaker with one sound wave"],"u":"1f509"},{"n":["loud sound","speaker with three sound waves"],"u":"1f50a"},{"n":["loudspeaker","public address loudspeaker"],"u":"1f4e2"},{"n":["mega","cheering megaphone"],"u":"1f4e3"},{"n":["postal horn"],"u":"1f4ef"},{"n":["bell"],"u":"1f514"},{"n":["no bell","bell with cancellation stroke"],"u":"1f515"},{"n":["musical score"],"u":"1f3bc"},{"n":["musical note"],"u":"1f3b5"},{"n":["notes","multiple musical notes"],"u":"1f3b6"},{"n":["studio microphone"],"u":"1f399-fe0f"},{"n":["level slider"],"u":"1f39a-fe0f"},{"n":["control knobs"],"u":"1f39b-fe0f"},{"n":["microphone"],"u":"1f3a4"},{"n":["headphone","headphones"],"u":"1f3a7"},{"n":["radio"],"u":"1f4fb"},{"n":["saxophone"],"u":"1f3b7"},{"n":["accordion"],"u":"1fa97"},{"n":["guitar"],"u":"1f3b8"},{"n":["musical keyboard"],"u":"1f3b9"},{"n":["trumpet"],"u":"1f3ba"},{"n":["violin"],"u":"1f3bb"},{"n":["banjo"],"u":"1fa95"},{"n":["drum with drumsticks"],"u":"1f941"},{"n":["long drum"],"u":"1fa98"},{"n":["iphone","mobile phone"],"u":"1f4f1"},{"n":["calling","mobile phone with rightwards arrow at left"],"u":"1f4f2"},{"n":["phone","telephone","black telephone"],"u":"260e-fe0f"},{"n":["telephone receiver"],"u":"1f4de"},{"n":["pager"],"u":"1f4df"},{"n":["fax","fax machine"],"u":"1f4e0"},{"n":["battery"],"u":"1f50b"},{"n":["low battery"],"u":"1faab"},{"n":["electric plug"],"u":"1f50c"},{"n":["computer","personal computer"],"u":"1f4bb"},{"n":["desktop computer"],"u":"1f5a5-fe0f"},{"n":["printer"],"u":"1f5a8-fe0f"},{"n":["keyboard"],"u":"2328-fe0f"},{"n":["computer mouse","three button mouse"],"u":"1f5b1-fe0f"},{"n":["trackball"],"u":"1f5b2-fe0f"},{"n":["minidisc"],"u":"1f4bd"},{"n":["floppy disk"],"u":"1f4be"},{"n":["cd","optical disc"],"u":"1f4bf"},{"n":["dvd"],"u":"1f4c0"},{"n":["abacus"],"u":"1f9ee"},{"n":["movie camera"],"u":"1f3a5"},{"n":["film frames"],"u":"1f39e-fe0f"},{"n":["film projector"],"u":"1f4fd-fe0f"},{"n":["clapper","clapper board"],"u":"1f3ac"},{"n":["tv","television"],"u":"1f4fa"},{"n":["camera"],"u":"1f4f7"},{"n":["camera with flash"],"u":"1f4f8"},{"n":["video camera"],"u":"1f4f9"},{"n":["vhs","videocassette"],"u":"1f4fc"},{"n":["mag","left-pointing magnifying glass"],"u":"1f50d"},{"n":["mag right","right-pointing magnifying glass"],"u":"1f50e"},{"n":["candle"],"u":"1f56f-fe0f"},{"n":["bulb","electric light bulb"],"u":"1f4a1"},{"n":["flashlight","electric torch"],"u":"1f526"},{"n":["lantern","izakaya lantern"],"u":"1f3ee"},{"n":["diya lamp"],"u":"1fa94"},{"n":["notebook with decorative cover"],"u":"1f4d4"},{"n":["closed book"],"u":"1f4d5"},{"n":["book","open book"],"u":"1f4d6"},{"n":["green book"],"u":"1f4d7"},{"n":["blue book"],"u":"1f4d8"},{"n":["orange book"],"u":"1f4d9"},{"n":["books"],"u":"1f4da"},{"n":["notebook"],"u":"1f4d3"},{"n":["ledger"],"u":"1f4d2"},{"n":["page with curl"],"u":"1f4c3"},{"n":["scroll"],"u":"1f4dc"},{"n":["page facing up"],"u":"1f4c4"},{"n":["newspaper"],"u":"1f4f0"},{"n":["rolled-up newspaper","rolled up newspaper"],"u":"1f5de-fe0f"},{"n":["bookmark tabs"],"u":"1f4d1"},{"n":["bookmark"],"u":"1f516"},{"n":["label"],"u":"1f3f7-fe0f"},{"n":["moneybag","money bag"],"u":"1f4b0"},{"n":["coin"],"u":"1fa99"},{"n":["yen","banknote with yen sign"],"u":"1f4b4"},{"n":["dollar","banknote with dollar sign"],"u":"1f4b5"},{"n":["euro","banknote with euro sign"],"u":"1f4b6"},{"n":["pound","banknote with pound sign"],"u":"1f4b7"},{"n":["money with wings"],"u":"1f4b8"},{"n":["credit card"],"u":"1f4b3"},{"n":["receipt"],"u":"1f9fe"},{"n":["chart","chart with upwards trend and yen sign"],"u":"1f4b9"},{"n":["email","envelope"],"u":"2709-fe0f"},{"n":["e-mail","e-mail symbol"],"u":"1f4e7"},{"n":["incoming envelope"],"u":"1f4e8"},{"n":["envelope with arrow","envelope with downwards arrow above"],"u":"1f4e9"},{"n":["outbox tray"],"u":"1f4e4"},{"n":["inbox tray"],"u":"1f4e5"},{"n":["package"],"u":"1f4e6"},{"n":["mailbox","closed mailbox with raised flag"],"u":"1f4eb"},{"n":["mailbox closed","closed mailbox with lowered flag"],"u":"1f4ea"},{"n":["mailbox with mail","open mailbox with raised flag"],"u":"1f4ec"},{"n":["mailbox with no mail","open mailbox with lowered flag"],"u":"1f4ed"},{"n":["postbox"],"u":"1f4ee"},{"n":["ballot box with ballot"],"u":"1f5f3-fe0f"},{"n":["pencil","pencil2"],"u":"270f-fe0f"},{"n":["black nib"],"u":"2712-fe0f"},{"n":["fountain pen","lower left fountain pen"],"u":"1f58b-fe0f"},{"n":["pen","lower left ballpoint pen"],"u":"1f58a-fe0f"},{"n":["paintbrush","lower left paintbrush"],"u":"1f58c-fe0f"},{"n":["crayon","lower left crayon"],"u":"1f58d-fe0f"},{"n":["memo","pencil"],"u":"1f4dd"},{"n":["briefcase"],"u":"1f4bc"},{"n":["file folder"],"u":"1f4c1"},{"n":["open file folder"],"u":"1f4c2"},{"n":["card index dividers"],"u":"1f5c2-fe0f"},{"n":["date","calendar"],"u":"1f4c5"},{"n":["calendar","tear-off calendar"],"u":"1f4c6"},{"n":["spiral notepad","spiral note pad"],"u":"1f5d2-fe0f"},{"n":["spiral calendar","spiral calendar pad"],"u":"1f5d3-fe0f"},{"n":["card index"],"u":"1f4c7"},{"n":["chart with upwards trend"],"u":"1f4c8"},{"n":["chart with downwards trend"],"u":"1f4c9"},{"n":["bar chart"],"u":"1f4ca"},{"n":["clipboard"],"u":"1f4cb"},{"n":["pushpin"],"u":"1f4cc"},{"n":["round pushpin"],"u":"1f4cd"},{"n":["paperclip"],"u":"1f4ce"},{"n":["linked paperclips"],"u":"1f587-fe0f"},{"n":["straight ruler"],"u":"1f4cf"},{"n":["triangular ruler"],"u":"1f4d0"},{"n":["scissors","black scissors"],"u":"2702-fe0f"},{"n":["card file box"],"u":"1f5c3-fe0f"},{"n":["file cabinet"],"u":"1f5c4-fe0f"},{"n":["wastebasket"],"u":"1f5d1-fe0f"},{"n":["lock"],"u":"1f512"},{"n":["unlock","open lock"],"u":"1f513"},{"n":["lock with ink pen"],"u":"1f50f"},{"n":["closed lock with key"],"u":"1f510"},{"n":["key"],"u":"1f511"},{"n":["old key"],"u":"1f5dd-fe0f"},{"n":["hammer"],"u":"1f528"},{"n":["axe"],"u":"1fa93"},{"n":["pick"],"u":"26cf-fe0f"},{"n":["hammer and pick"],"u":"2692-fe0f"},{"n":["hammer and wrench"],"u":"1f6e0-fe0f"},{"n":["dagger","dagger knife"],"u":"1f5e1-fe0f"},{"n":["crossed swords"],"u":"2694-fe0f"},{"n":["gun","pistol"],"u":"1f52b"},{"n":["boomerang"],"u":"1fa83"},{"n":["bow and arrow"],"u":"1f3f9"},{"n":["shield"],"u":"1f6e1-fe0f"},{"n":["carpentry saw"],"u":"1fa9a"},{"n":["wrench"],"u":"1f527"},{"n":["screwdriver"],"u":"1fa9b"},{"n":["nut and bolt"],"u":"1f529"},{"n":["gear"],"u":"2699-fe0f"},{"n":["clamp","compression"],"u":"1f5dc-fe0f"},{"n":["scales","balance scale"],"u":"2696-fe0f"},{"n":["probing cane"],"u":"1f9af"},{"n":["link","link symbol"],"u":"1f517"},{"n":["chains"],"u":"26d3-fe0f"},{"n":["hook"],"u":"1fa9d"},{"n":["toolbox"],"u":"1f9f0"},{"n":["magnet"],"u":"1f9f2"},{"n":["ladder"],"u":"1fa9c"},{"n":["alembic"],"u":"2697-fe0f"},{"n":["test tube"],"u":"1f9ea"},{"n":["petri dish"],"u":"1f9eb"},{"n":["dna","dna double helix"],"u":"1f9ec"},{"n":["microscope"],"u":"1f52c"},{"n":["telescope"],"u":"1f52d"},{"n":["satellite antenna"],"u":"1f4e1"},{"n":["syringe"],"u":"1f489"},{"n":["drop of blood"],"u":"1fa78"},{"n":["pill"],"u":"1f48a"},{"n":["adhesive bandage"],"u":"1fa79"},{"n":["crutch"],"u":"1fa7c"},{"n":["stethoscope"],"u":"1fa7a"},{"n":["x-ray"],"u":"1fa7b"},{"n":["door"],"u":"1f6aa"},{"n":["elevator"],"u":"1f6d7"},{"n":["mirror"],"u":"1fa9e"},{"n":["window"],"u":"1fa9f"},{"n":["bed"],"u":"1f6cf-fe0f"},{"n":["couch and lamp"],"u":"1f6cb-fe0f"},{"n":["chair"],"u":"1fa91"},{"n":["toilet"],"u":"1f6bd"},{"n":["plunger"],"u":"1faa0"},{"n":["shower"],"u":"1f6bf"},{"n":["bathtub"],"u":"1f6c1"},{"n":["mouse trap"],"u":"1faa4"},{"n":["razor"],"u":"1fa92"},{"n":["lotion bottle"],"u":"1f9f4"},{"n":["safety pin"],"u":"1f9f7"},{"n":["broom"],"u":"1f9f9"},{"n":["basket"],"u":"1f9fa"},{"n":["roll of paper"],"u":"1f9fb"},{"n":["bucket"],"u":"1faa3"},{"n":["soap","bar of soap"],"u":"1f9fc"},{"n":["bubbles"],"u":"1fae7"},{"n":["toothbrush"],"u":"1faa5"},{"n":["sponge"],"u":"1f9fd"},{"n":["fire extinguisher"],"u":"1f9ef"},{"n":["shopping trolley"],"u":"1f6d2"},{"n":["smoking","smoking symbol"],"u":"1f6ac"},{"n":["coffin"],"u":"26b0-fe0f"},{"n":["headstone"],"u":"1faa6"},{"n":["funeral urn"],"u":"26b1-fe0f"},{"n":["moyai"],"u":"1f5ff"},{"n":["placard"],"u":"1faa7"},{"n":["identification card"],"u":"1faaa"}],"symbols":[{"n":["atm","automated teller machine"],"u":"1f3e7"},{"n":["put litter in its place","put litter in its place symbol"],"u":"1f6ae"},{"n":["potable water","potable water symbol"],"u":"1f6b0"},{"n":["wheelchair","wheelchair symbol"],"u":"267f"},{"n":["mens","mens symbol"],"u":"1f6b9"},{"n":["womens","womens symbol"],"u":"1f6ba"},{"n":["restroom"],"u":"1f6bb"},{"n":["baby symbol"],"u":"1f6bc"},{"n":["wc","water closet"],"u":"1f6be"},{"n":["passport control"],"u":"1f6c2"},{"n":["customs"],"u":"1f6c3"},{"n":["baggage claim"],"u":"1f6c4"},{"n":["left luggage"],"u":"1f6c5"},{"n":["warning","warning sign"],"u":"26a0-fe0f"},{"n":["children crossing"],"u":"1f6b8"},{"n":["no entry"],"u":"26d4"},{"n":["no entry sign"],"u":"1f6ab"},{"n":["no bicycles"],"u":"1f6b3"},{"n":["no smoking","no smoking symbol"],"u":"1f6ad"},{"n":["do not litter","do not litter symbol"],"u":"1f6af"},{"n":["non-potable water","non-potable water symbol"],"u":"1f6b1"},{"n":["no pedestrians"],"u":"1f6b7"},{"n":["no mobile phones"],"u":"1f4f5"},{"n":["underage","no one under eighteen symbol"],"u":"1f51e"},{"n":["radioactive","radioactive sign"],"u":"2622-fe0f"},{"n":["biohazard","biohazard sign"],"u":"2623-fe0f"},{"n":["arrow up","upwards black arrow"],"u":"2b06-fe0f"},{"n":["north east arrow","arrow upper right"],"u":"2197-fe0f"},{"n":["arrow right","black rightwards arrow"],"u":"27a1-fe0f"},{"n":["south east arrow","arrow lower right"],"u":"2198-fe0f"},{"n":["arrow down","downwards black arrow"],"u":"2b07-fe0f"},{"n":["south west arrow","arrow lower left"],"u":"2199-fe0f"},{"n":["arrow left","leftwards black arrow"],"u":"2b05-fe0f"},{"n":["north west arrow","arrow upper left"],"u":"2196-fe0f"},{"n":["up down arrow","arrow up down"],"u":"2195-fe0f"},{"n":["left right arrow"],"u":"2194-fe0f"},{"n":["leftwards arrow with hook"],"u":"21a9-fe0f"},{"n":["arrow right hook","rightwards arrow with hook"],"u":"21aa-fe0f"},{"n":["arrow heading up","arrow pointing rightwards then curving upwards"],"u":"2934-fe0f"},{"n":["arrow heading down","arrow pointing rightwards then curving downwards"],"u":"2935-fe0f"},{"n":["arrows clockwise","clockwise downwards and upwards open circle arrows"],"u":"1f503"},{"n":["arrows counterclockwise","anticlockwise downwards and upwards open circle arrows"],"u":"1f504"},{"n":["back","back with leftwards arrow above"],"u":"1f519"},{"n":["end","end with leftwards arrow above"],"u":"1f51a"},{"n":["on","on with exclamation mark with left right arrow above"],"u":"1f51b"},{"n":["soon","soon with rightwards arrow above"],"u":"1f51c"},{"n":["top","top with upwards arrow above"],"u":"1f51d"},{"n":["place of worship"],"u":"1f6d0"},{"n":["atom symbol"],"u":"269b-fe0f"},{"n":["om","om symbol"],"u":"1f549-fe0f"},{"n":["star of david"],"u":"2721-fe0f"},{"n":["wheel of dharma"],"u":"2638-fe0f"},{"n":["yin yang"],"u":"262f-fe0f"},{"n":["latin cross"],"u":"271d-fe0f"},{"n":["orthodox cross"],"u":"2626-fe0f"},{"n":["star and crescent"],"u":"262a-fe0f"},{"n":["peace symbol"],"u":"262e-fe0f"},{"n":["menorah with nine branches"],"u":"1f54e"},{"n":["six pointed star","six pointed star with middle dot"],"u":"1f52f"},{"n":["aries"],"u":"2648"},{"n":["taurus"],"u":"2649"},{"n":["gemini"],"u":"264a"},{"n":["cancer"],"u":"264b"},{"n":["leo"],"u":"264c"},{"n":["virgo"],"u":"264d"},{"n":["libra"],"u":"264e"},{"n":["scorpius"],"u":"264f"},{"n":["sagittarius"],"u":"2650"},{"n":["capricorn"],"u":"2651"},{"n":["aquarius"],"u":"2652"},{"n":["pisces"],"u":"2653"},{"n":["ophiuchus"],"u":"26ce"},{"n":["twisted rightwards arrows"],"u":"1f500"},{"n":["repeat","clockwise rightwards and leftwards open circle arrows"],"u":"1f501"},{"n":["repeat one","clockwise rightwards and leftwards open circle arrows with circled one overlay"],"u":"1f502"},{"n":["arrow forward","black right-pointing triangle"],"u":"25b6-fe0f"},{"n":["fast forward","black right-pointing double triangle"],"u":"23e9"},{"n":["next track button","black right pointing double triangle with vertical bar"],"u":"23ed-fe0f"},{"n":["play or pause button","black right pointing triangle with double vertical bar"],"u":"23ef-fe0f"},{"n":["arrow backward","black left-pointing triangle"],"u":"25c0-fe0f"},{"n":["rewind","black left-pointing double triangle"],"u":"23ea"},{"n":["last track button","black left pointing double triangle with vertical bar"],"u":"23ee-fe0f"},{"n":["arrow up small","up-pointing small red triangle"],"u":"1f53c"},{"n":["arrow double up","black up-pointing double triangle"],"u":"23eb"},{"n":["arrow down small","down-pointing small red triangle"],"u":"1f53d"},{"n":["arrow double down","black down-pointing double triangle"],"u":"23ec"},{"n":["pause button","double vertical bar"],"u":"23f8-fe0f"},{"n":["stop button","black square for stop"],"u":"23f9-fe0f"},{"n":["record button","black circle for record"],"u":"23fa-fe0f"},{"n":["eject","eject button"],"u":"23cf-fe0f"},{"n":["cinema"],"u":"1f3a6"},{"n":["low brightness","low brightness symbol"],"u":"1f505"},{"n":["high brightness","high brightness symbol"],"u":"1f506"},{"n":["signal strength","antenna with bars"],"u":"1f4f6"},{"n":["vibration mode"],"u":"1f4f3"},{"n":["mobile phone off"],"u":"1f4f4"},{"n":["female sign"],"u":"2640-fe0f"},{"n":["male sign"],"u":"2642-fe0f"},{"n":["transgender symbol"],"u":"26a7-fe0f"},{"n":["heavy multiplication x"],"u":"2716-fe0f"},{"n":["heavy plus sign"],"u":"2795"},{"n":["heavy minus sign"],"u":"2796"},{"n":["heavy division sign"],"u":"2797"},{"n":["heavy equals sign"],"u":"1f7f0"},{"n":["infinity"],"u":"267e-fe0f"},{"n":["bangbang","double exclamation mark"],"u":"203c-fe0f"},{"n":["interrobang","exclamation question mark"],"u":"2049-fe0f"},{"n":["question","black question mark ornament"],"u":"2753"},{"n":["grey question","white question mark ornament"],"u":"2754"},{"n":["grey exclamation","white exclamation mark ornament"],"u":"2755"},{"n":["exclamation","heavy exclamation mark","heavy exclamation mark symbol"],"u":"2757"},{"n":["wavy dash"],"u":"3030-fe0f"},{"n":["currency exchange"],"u":"1f4b1"},{"n":["heavy dollar sign"],"u":"1f4b2"},{"n":["medical symbol","staff of aesculapius"],"u":"2695-fe0f"},{"n":["recycle","black universal recycling symbol"],"u":"267b-fe0f"},{"n":["fleur-de-lis","fleur de lis"],"u":"269c-fe0f"},{"n":["trident","trident emblem"],"u":"1f531"},{"n":["name badge"],"u":"1f4db"},{"n":["beginner","japanese symbol for beginner"],"u":"1f530"},{"n":["o","heavy large circle"],"u":"2b55"},{"n":["white check mark","white heavy check mark"],"u":"2705"},{"n":["ballot box with check"],"u":"2611-fe0f"},{"n":["heavy check mark"],"u":"2714-fe0f"},{"n":["x","cross mark"],"u":"274c"},{"n":["negative squared cross mark"],"u":"274e"},{"n":["curly loop"],"u":"27b0"},{"n":["loop","double curly loop"],"u":"27bf"},{"n":["part alternation mark"],"u":"303d-fe0f"},{"n":["eight spoked asterisk"],"u":"2733-fe0f"},{"n":["eight pointed black star"],"u":"2734-fe0f"},{"n":["sparkle"],"u":"2747-fe0f"},{"n":["copyright","copyright sign"],"u":"00a9-fe0f"},{"n":["registered","registered sign"],"u":"00ae-fe0f"},{"n":["tm","trade mark sign"],"u":"2122-fe0f"},{"n":["hash","hash key"],"u":"0023-fe0f-20e3"},{"n":["keycap: *","keycap star"],"u":"002a-fe0f-20e3"},{"n":["zero","keycap 0"],"u":"0030-fe0f-20e3"},{"n":["one","keycap 1"],"u":"0031-fe0f-20e3"},{"n":["two","keycap 2"],"u":"0032-fe0f-20e3"},{"n":["three","keycap 3"],"u":"0033-fe0f-20e3"},{"n":["four","keycap 4"],"u":"0034-fe0f-20e3"},{"n":["five","keycap 5"],"u":"0035-fe0f-20e3"},{"n":["six","keycap 6"],"u":"0036-fe0f-20e3"},{"n":["seven","keycap 7"],"u":"0037-fe0f-20e3"},{"n":["eight","keycap 8"],"u":"0038-fe0f-20e3"},{"n":["nine","keycap 9"],"u":"0039-fe0f-20e3"},{"n":["keycap ten"],"u":"1f51f"},{"n":["capital abcd","input symbol for latin capital letters"],"u":"1f520"},{"n":["abcd","input symbol for latin small letters"],"u":"1f521"},{"n":["1234","input symbol for numbers"],"u":"1f522"},{"n":["symbols","input symbol for symbols"],"u":"1f523"},{"n":["abc","input symbol for latin letters"],"u":"1f524"},{"n":["a","negative squared latin capital letter a"],"u":"1f170-fe0f"},{"n":["ab","negative squared ab"],"u":"1f18e"},{"n":["b","negative squared latin capital letter b"],"u":"1f171-fe0f"},{"n":["cl","squared cl"],"u":"1f191"},{"n":["cool","squared cool"],"u":"1f192"},{"n":["free","squared free"],"u":"1f193"},{"n":["information source"],"u":"2139-fe0f"},{"n":["id","squared id"],"u":"1f194"},{"n":["m","circled latin capital letter m"],"u":"24c2-fe0f"},{"n":["new","squared new"],"u":"1f195"},{"n":["ng","squared ng"],"u":"1f196"},{"n":["o2","negative squared latin capital letter o"],"u":"1f17e-fe0f"},{"n":["ok","squared ok"],"u":"1f197"},{"n":["parking","negative squared latin capital letter p"],"u":"1f17f-fe0f"},{"n":["sos","squared sos"],"u":"1f198"},{"n":["up","squared up with exclamation mark"],"u":"1f199"},{"n":["vs","squared vs"],"u":"1f19a"},{"n":["koko","squared katakana koko"],"u":"1f201"},{"n":["sa","squared katakana sa"],"u":"1f202-fe0f"},{"n":["u6708","squared cjk unified ideograph-6708"],"u":"1f237-fe0f"},{"n":["u6709","squared cjk unified ideograph-6709"],"u":"1f236"},{"n":["u6307","squared cjk unified ideograph-6307"],"u":"1f22f"},{"n":["ideograph advantage","circled ideograph advantage"],"u":"1f250"},{"n":["u5272","squared cjk unified ideograph-5272"],"u":"1f239"},{"n":["u7121","squared cjk unified ideograph-7121"],"u":"1f21a"},{"n":["u7981","squared cjk unified ideograph-7981"],"u":"1f232"},{"n":["accept","circled ideograph accept"],"u":"1f251"},{"n":["u7533","squared cjk unified ideograph-7533"],"u":"1f238"},{"n":["u5408","squared cjk unified ideograph-5408"],"u":"1f234"},{"n":["u7a7a","squared cjk unified ideograph-7a7a"],"u":"1f233"},{"n":["congratulations","circled ideograph congratulation"],"u":"3297-fe0f"},{"n":["secret","circled ideograph secret"],"u":"3299-fe0f"},{"n":["u55b6","squared cjk unified ideograph-55b6"],"u":"1f23a"},{"n":["u6e80","squared cjk unified ideograph-6e80"],"u":"1f235"},{"n":["red circle","large red circle"],"u":"1f534"},{"n":["large orange circle"],"u":"1f7e0"},{"n":["large yellow circle"],"u":"1f7e1"},{"n":["large green circle"],"u":"1f7e2"},{"n":["large blue circle"],"u":"1f535"},{"n":["large purple circle"],"u":"1f7e3"},{"n":["large brown circle"],"u":"1f7e4"},{"n":["black circle","medium black circle"],"u":"26ab"},{"n":["white circle","medium white circle"],"u":"26aa"},{"n":["large red square"],"u":"1f7e5"},{"n":["large orange square"],"u":"1f7e7"},{"n":["large yellow square"],"u":"1f7e8"},{"n":["large green square"],"u":"1f7e9"},{"n":["large blue square"],"u":"1f7e6"},{"n":["large purple square"],"u":"1f7ea"},{"n":["large brown square"],"u":"1f7eb"},{"n":["black large square"],"u":"2b1b"},{"n":["white large square"],"u":"2b1c"},{"n":["black medium square"],"u":"25fc-fe0f"},{"n":["white medium square"],"u":"25fb-fe0f"},{"n":["black medium small square"],"u":"25fe"},{"n":["white medium small square"],"u":"25fd"},{"n":["black small square"],"u":"25aa-fe0f"},{"n":["white small square"],"u":"25ab-fe0f"},{"n":["large orange diamond"],"u":"1f536"},{"n":["large blue diamond"],"u":"1f537"},{"n":["small orange diamond"],"u":"1f538"},{"n":["small blue diamond"],"u":"1f539"},{"n":["small red triangle","up-pointing red triangle"],"u":"1f53a"},{"n":["small red triangle down","down-pointing red triangle"],"u":"1f53b"},{"n":["diamond shape with a dot inside"],"u":"1f4a0"},{"n":["radio button"],"u":"1f518"},{"n":["white square button"],"u":"1f533"},{"n":["black square button"],"u":"1f532"}],"flags":[{"n":["chequered flag","checkered flag"],"u":"1f3c1"},{"n":["triangular flag on post"],"u":"1f6a9"},{"n":["crossed flags"],"u":"1f38c"},{"n":["waving black flag"],"u":"1f3f4"},{"n":["white flag","waving white flag"],"u":"1f3f3-fe0f"},{"n":["rainbow flag","rainbow-flag"],"u":"1f3f3-fe0f-200d-1f308"},{"n":["transgender flag"],"u":"1f3f3-fe0f-200d-26a7-fe0f"},{"n":["pirate flag"],"u":"1f3f4-200d-2620-fe0f"},{"n":["flag-ac","ascension island flag"],"u":"1f1e6-1f1e8"},{"n":["flag-ad","andorra flag"],"u":"1f1e6-1f1e9"},{"n":["flag-ae","united arab emirates flag"],"u":"1f1e6-1f1ea"},{"n":["flag-af","afghanistan flag"],"u":"1f1e6-1f1eb"},{"n":["flag-ag","antigua & barbuda flag"],"u":"1f1e6-1f1ec"},{"n":["flag-ai","anguilla flag"],"u":"1f1e6-1f1ee"},{"n":["flag-al","albania flag"],"u":"1f1e6-1f1f1"},{"n":["flag-am","armenia flag"],"u":"1f1e6-1f1f2"},{"n":["flag-ao","angola flag"],"u":"1f1e6-1f1f4"},{"n":["flag-aq","antarctica flag"],"u":"1f1e6-1f1f6"},{"n":["flag-ar","argentina flag"],"u":"1f1e6-1f1f7"},{"n":["flag-as","american samoa flag"],"u":"1f1e6-1f1f8"},{"n":["flag-at","austria flag"],"u":"1f1e6-1f1f9"},{"n":["flag-au","australia flag"],"u":"1f1e6-1f1fa"},{"n":["flag-aw","aruba flag"],"u":"1f1e6-1f1fc"},{"n":["flag-ax","åland islands flag"],"u":"1f1e6-1f1fd"},{"n":["flag-az","azerbaijan flag"],"u":"1f1e6-1f1ff"},{"n":["flag-ba","bosnia & herzegovina flag"],"u":"1f1e7-1f1e6"},{"n":["flag-bb","barbados flag"],"u":"1f1e7-1f1e7"},{"n":["flag-bd","bangladesh flag"],"u":"1f1e7-1f1e9"},{"n":["flag-be","belgium flag"],"u":"1f1e7-1f1ea"},{"n":["flag-bf","burkina faso flag"],"u":"1f1e7-1f1eb"},{"n":["flag-bg","bulgaria flag"],"u":"1f1e7-1f1ec"},{"n":["flag-bh","bahrain flag"],"u":"1f1e7-1f1ed"},{"n":["flag-bi","burundi flag"],"u":"1f1e7-1f1ee"},{"n":["flag-bj","benin flag"],"u":"1f1e7-1f1ef"},{"n":["flag-bl","st. barthélemy flag"],"u":"1f1e7-1f1f1"},{"n":["flag-bm","bermuda flag"],"u":"1f1e7-1f1f2"},{"n":["flag-bn","brunei flag"],"u":"1f1e7-1f1f3"},{"n":["flag-bo","bolivia flag"],"u":"1f1e7-1f1f4"},{"n":["flag-bq","caribbean netherlands flag"],"u":"1f1e7-1f1f6"},{"n":["flag-br","brazil flag"],"u":"1f1e7-1f1f7"},{"n":["flag-bs","bahamas flag"],"u":"1f1e7-1f1f8"},{"n":["flag-bt","bhutan flag"],"u":"1f1e7-1f1f9"},{"n":["flag-bv","bouvet island flag"],"u":"1f1e7-1f1fb"},{"n":["flag-bw","botswana flag"],"u":"1f1e7-1f1fc"},{"n":["flag-by","belarus flag"],"u":"1f1e7-1f1fe"},{"n":["flag-bz","belize flag"],"u":"1f1e7-1f1ff"},{"n":["flag-ca","canada flag"],"u":"1f1e8-1f1e6"},{"n":["flag-cc","cocos (keeling) islands flag"],"u":"1f1e8-1f1e8"},{"n":["flag-cd","congo - kinshasa flag"],"u":"1f1e8-1f1e9"},{"n":["flag-cf","central african republic flag"],"u":"1f1e8-1f1eb"},{"n":["flag-cg","congo - brazzaville flag"],"u":"1f1e8-1f1ec"},{"n":["flag-ch","switzerland flag"],"u":"1f1e8-1f1ed"},{"n":["flag-ci","côte d’ivoire flag"],"u":"1f1e8-1f1ee"},{"n":["flag-ck","cook islands flag"],"u":"1f1e8-1f1f0"},{"n":["flag-cl","chile flag"],"u":"1f1e8-1f1f1"},{"n":["flag-cm","cameroon flag"],"u":"1f1e8-1f1f2"},{"n":["cn","flag-cn","china flag"],"u":"1f1e8-1f1f3"},{"n":["flag-co","colombia flag"],"u":"1f1e8-1f1f4"},{"n":["flag-cp","clipperton island flag"],"u":"1f1e8-1f1f5"},{"n":["flag-cr","costa rica flag"],"u":"1f1e8-1f1f7"},{"n":["flag-cu","cuba flag"],"u":"1f1e8-1f1fa"},{"n":["flag-cv","cape verde flag"],"u":"1f1e8-1f1fb"},{"n":["flag-cw","curaçao flag"],"u":"1f1e8-1f1fc"},{"n":["flag-cx","christmas island flag"],"u":"1f1e8-1f1fd"},{"n":["flag-cy","cyprus flag"],"u":"1f1e8-1f1fe"},{"n":["flag-cz","czechia flag"],"u":"1f1e8-1f1ff"},{"n":["de","flag-de","germany flag"],"u":"1f1e9-1f1ea"},{"n":["flag-dg","diego garcia flag"],"u":"1f1e9-1f1ec"},{"n":["flag-dj","djibouti flag"],"u":"1f1e9-1f1ef"},{"n":["flag-dk","denmark flag"],"u":"1f1e9-1f1f0"},{"n":["flag-dm","dominica flag"],"u":"1f1e9-1f1f2"},{"n":["flag-do","dominican republic flag"],"u":"1f1e9-1f1f4"},{"n":["flag-dz","algeria flag"],"u":"1f1e9-1f1ff"},{"n":["flag-ea","ceuta & melilla flag"],"u":"1f1ea-1f1e6"},{"n":["flag-ec","ecuador flag"],"u":"1f1ea-1f1e8"},{"n":["flag-ee","estonia flag"],"u":"1f1ea-1f1ea"},{"n":["flag-eg","egypt flag"],"u":"1f1ea-1f1ec"},{"n":["flag-eh","western sahara flag"],"u":"1f1ea-1f1ed"},{"n":["flag-er","eritrea flag"],"u":"1f1ea-1f1f7"},{"n":["es","flag-es","spain flag"],"u":"1f1ea-1f1f8"},{"n":["flag-et","ethiopia flag"],"u":"1f1ea-1f1f9"},{"n":["flag-eu","european union flag"],"u":"1f1ea-1f1fa"},{"n":["flag-fi","finland flag"],"u":"1f1eb-1f1ee"},{"n":["flag-fj","fiji flag"],"u":"1f1eb-1f1ef"},{"n":["flag-fk","falkland islands flag"],"u":"1f1eb-1f1f0"},{"n":["flag-fm","micronesia flag"],"u":"1f1eb-1f1f2"},{"n":["flag-fo","faroe islands flag"],"u":"1f1eb-1f1f4"},{"n":["fr","flag-fr","france flag"],"u":"1f1eb-1f1f7"},{"n":["flag-ga","gabon flag"],"u":"1f1ec-1f1e6"},{"n":["gb","uk","flag-gb","united kingdom flag"],"u":"1f1ec-1f1e7"},{"n":["flag-gd","grenada flag"],"u":"1f1ec-1f1e9"},{"n":["flag-ge","georgia flag"],"u":"1f1ec-1f1ea"},{"n":["flag-gf","french guiana flag"],"u":"1f1ec-1f1eb"},{"n":["flag-gg","guernsey flag"],"u":"1f1ec-1f1ec"},{"n":["flag-gh","ghana flag"],"u":"1f1ec-1f1ed"},{"n":["flag-gi","gibraltar flag"],"u":"1f1ec-1f1ee"},{"n":["flag-gl","greenland flag"],"u":"1f1ec-1f1f1"},{"n":["flag-gm","gambia flag"],"u":"1f1ec-1f1f2"},{"n":["flag-gn","guinea flag"],"u":"1f1ec-1f1f3"},{"n":["flag-gp","guadeloupe flag"],"u":"1f1ec-1f1f5"},{"n":["flag-gq","equatorial guinea flag"],"u":"1f1ec-1f1f6"},{"n":["flag-gr","greece flag"],"u":"1f1ec-1f1f7"},{"n":["flag-gs","south georgia & south sandwich islands flag"],"u":"1f1ec-1f1f8"},{"n":["flag-gt","guatemala flag"],"u":"1f1ec-1f1f9"},{"n":["flag-gu","guam flag"],"u":"1f1ec-1f1fa"},{"n":["flag-gw","guinea-bissau flag"],"u":"1f1ec-1f1fc"},{"n":["flag-gy","guyana flag"],"u":"1f1ec-1f1fe"},{"n":["flag-hk","hong kong sar china flag"],"u":"1f1ed-1f1f0"},{"n":["flag-hm","heard & mcdonald islands flag"],"u":"1f1ed-1f1f2"},{"n":["flag-hn","honduras flag"],"u":"1f1ed-1f1f3"},{"n":["flag-hr","croatia flag"],"u":"1f1ed-1f1f7"},{"n":["flag-ht","haiti flag"],"u":"1f1ed-1f1f9"},{"n":["flag-hu","hungary flag"],"u":"1f1ed-1f1fa"},{"n":["flag-ic","canary islands flag"],"u":"1f1ee-1f1e8"},{"n":["flag-id","indonesia flag"],"u":"1f1ee-1f1e9"},{"n":["flag-ie","ireland flag"],"u":"1f1ee-1f1ea"},{"n":["flag-il","israel flag"],"u":"1f1ee-1f1f1"},{"n":["flag-im","isle of man flag"],"u":"1f1ee-1f1f2"},{"n":["flag-in","india flag"],"u":"1f1ee-1f1f3"},{"n":["flag-io","british indian ocean territory flag"],"u":"1f1ee-1f1f4"},{"n":["flag-iq","iraq flag"],"u":"1f1ee-1f1f6"},{"n":["flag-ir","iran flag"],"u":"1f1ee-1f1f7"},{"n":["flag-is","iceland flag"],"u":"1f1ee-1f1f8"},{"n":["it","flag-it","italy flag"],"u":"1f1ee-1f1f9"},{"n":["flag-je","jersey flag"],"u":"1f1ef-1f1ea"},{"n":["flag-jm","jamaica flag"],"u":"1f1ef-1f1f2"},{"n":["flag-jo","jordan flag"],"u":"1f1ef-1f1f4"},{"n":["jp","flag-jp","japan flag"],"u":"1f1ef-1f1f5"},{"n":["flag-ke","kenya flag"],"u":"1f1f0-1f1ea"},{"n":["flag-kg","kyrgyzstan flag"],"u":"1f1f0-1f1ec"},{"n":["flag-kh","cambodia flag"],"u":"1f1f0-1f1ed"},{"n":["flag-ki","kiribati flag"],"u":"1f1f0-1f1ee"},{"n":["flag-km","comoros flag"],"u":"1f1f0-1f1f2"},{"n":["flag-kn","st. kitts & nevis flag"],"u":"1f1f0-1f1f3"},{"n":["flag-kp","north korea flag"],"u":"1f1f0-1f1f5"},{"n":["kr","flag-kr","south korea flag"],"u":"1f1f0-1f1f7"},{"n":["flag-kw","kuwait flag"],"u":"1f1f0-1f1fc"},{"n":["flag-ky","cayman islands flag"],"u":"1f1f0-1f1fe"},{"n":["flag-kz","kazakhstan flag"],"u":"1f1f0-1f1ff"},{"n":["flag-la","laos flag"],"u":"1f1f1-1f1e6"},{"n":["flag-lb","lebanon flag"],"u":"1f1f1-1f1e7"},{"n":["flag-lc","st. lucia flag"],"u":"1f1f1-1f1e8"},{"n":["flag-li","liechtenstein flag"],"u":"1f1f1-1f1ee"},{"n":["flag-lk","sri lanka flag"],"u":"1f1f1-1f1f0"},{"n":["flag-lr","liberia flag"],"u":"1f1f1-1f1f7"},{"n":["flag-ls","lesotho flag"],"u":"1f1f1-1f1f8"},{"n":["flag-lt","lithuania flag"],"u":"1f1f1-1f1f9"},{"n":["flag-lu","luxembourg flag"],"u":"1f1f1-1f1fa"},{"n":["flag-lv","latvia flag"],"u":"1f1f1-1f1fb"},{"n":["flag-ly","libya flag"],"u":"1f1f1-1f1fe"},{"n":["flag-ma","morocco flag"],"u":"1f1f2-1f1e6"},{"n":["flag-mc","monaco flag"],"u":"1f1f2-1f1e8"},{"n":["flag-md","moldova flag"],"u":"1f1f2-1f1e9"},{"n":["flag-me","montenegro flag"],"u":"1f1f2-1f1ea"},{"n":["flag-mf","st. martin flag"],"u":"1f1f2-1f1eb"},{"n":["flag-mg","madagascar flag"],"u":"1f1f2-1f1ec"},{"n":["flag-mh","marshall islands flag"],"u":"1f1f2-1f1ed"},{"n":["flag-mk","north macedonia flag"],"u":"1f1f2-1f1f0"},{"n":["flag-ml","mali flag"],"u":"1f1f2-1f1f1"},{"n":["flag-mm","myanmar (burma) flag"],"u":"1f1f2-1f1f2"},{"n":["flag-mn","mongolia flag"],"u":"1f1f2-1f1f3"},{"n":["flag-mo","macao sar china flag"],"u":"1f1f2-1f1f4"},{"n":["flag-mp","northern mariana islands flag"],"u":"1f1f2-1f1f5"},{"n":["flag-mq","martinique flag"],"u":"1f1f2-1f1f6"},{"n":["flag-mr","mauritania flag"],"u":"1f1f2-1f1f7"},{"n":["flag-ms","montserrat flag"],"u":"1f1f2-1f1f8"},{"n":["flag-mt","malta flag"],"u":"1f1f2-1f1f9"},{"n":["flag-mu","mauritius flag"],"u":"1f1f2-1f1fa"},{"n":["flag-mv","maldives flag"],"u":"1f1f2-1f1fb"},{"n":["flag-mw","malawi flag"],"u":"1f1f2-1f1fc"},{"n":["flag-mx","mexico flag"],"u":"1f1f2-1f1fd"},{"n":["flag-my","malaysia flag"],"u":"1f1f2-1f1fe"},{"n":["flag-mz","mozambique flag"],"u":"1f1f2-1f1ff"},{"n":["flag-na","namibia flag"],"u":"1f1f3-1f1e6"},{"n":["flag-nc","new caledonia flag"],"u":"1f1f3-1f1e8"},{"n":["flag-ne","niger flag"],"u":"1f1f3-1f1ea"},{"n":["flag-nf","norfolk island flag"],"u":"1f1f3-1f1eb"},{"n":["flag-ng","nigeria flag"],"u":"1f1f3-1f1ec"},{"n":["flag-ni","nicaragua flag"],"u":"1f1f3-1f1ee"},{"n":["flag-nl","netherlands flag"],"u":"1f1f3-1f1f1"},{"n":["flag-no","norway flag"],"u":"1f1f3-1f1f4"},{"n":["flag-np","nepal flag"],"u":"1f1f3-1f1f5"},{"n":["flag-nr","nauru flag"],"u":"1f1f3-1f1f7"},{"n":["flag-nu","niue flag"],"u":"1f1f3-1f1fa"},{"n":["flag-nz","new zealand flag"],"u":"1f1f3-1f1ff"},{"n":["flag-om","oman flag"],"u":"1f1f4-1f1f2"},{"n":["flag-pa","panama flag"],"u":"1f1f5-1f1e6"},{"n":["flag-pe","peru flag"],"u":"1f1f5-1f1ea"},{"n":["flag-pf","french polynesia flag"],"u":"1f1f5-1f1eb"},{"n":["flag-pg","papua new guinea flag"],"u":"1f1f5-1f1ec"},{"n":["flag-ph","philippines flag"],"u":"1f1f5-1f1ed"},{"n":["flag-pk","pakistan flag"],"u":"1f1f5-1f1f0"},{"n":["flag-pl","poland flag"],"u":"1f1f5-1f1f1"},{"n":["flag-pm","st. pierre & miquelon flag"],"u":"1f1f5-1f1f2"},{"n":["flag-pn","pitcairn islands flag"],"u":"1f1f5-1f1f3"},{"n":["flag-pr","puerto rico flag"],"u":"1f1f5-1f1f7"},{"n":["flag-ps","palestinian territories flag"],"u":"1f1f5-1f1f8"},{"n":["flag-pt","portugal flag"],"u":"1f1f5-1f1f9"},{"n":["flag-pw","palau flag"],"u":"1f1f5-1f1fc"},{"n":["flag-py","paraguay flag"],"u":"1f1f5-1f1fe"},{"n":["flag-qa","qatar flag"],"u":"1f1f6-1f1e6"},{"n":["flag-re","réunion flag"],"u":"1f1f7-1f1ea"},{"n":["flag-ro","romania flag"],"u":"1f1f7-1f1f4"},{"n":["flag-rs","serbia flag"],"u":"1f1f7-1f1f8"},{"n":["ru","flag-ru","russia flag"],"u":"1f1f7-1f1fa"},{"n":["flag-rw","rwanda flag"],"u":"1f1f7-1f1fc"},{"n":["flag-sa","saudi arabia flag"],"u":"1f1f8-1f1e6"},{"n":["flag-sb","solomon islands flag"],"u":"1f1f8-1f1e7"},{"n":["flag-sc","seychelles flag"],"u":"1f1f8-1f1e8"},{"n":["flag-sd","sudan flag"],"u":"1f1f8-1f1e9"},{"n":["flag-se","sweden flag"],"u":"1f1f8-1f1ea"},{"n":["flag-sg","singapore flag"],"u":"1f1f8-1f1ec"},{"n":["flag-sh","st. helena flag"],"u":"1f1f8-1f1ed"},{"n":["flag-si","slovenia flag"],"u":"1f1f8-1f1ee"},{"n":["flag-sj","svalbard & jan mayen flag"],"u":"1f1f8-1f1ef"},{"n":["flag-sk","slovakia flag"],"u":"1f1f8-1f1f0"},{"n":["flag-sl","sierra leone flag"],"u":"1f1f8-1f1f1"},{"n":["flag-sm","san marino flag"],"u":"1f1f8-1f1f2"},{"n":["flag-sn","senegal flag"],"u":"1f1f8-1f1f3"},{"n":["flag-so","somalia flag"],"u":"1f1f8-1f1f4"},{"n":["flag-sr","suriname flag"],"u":"1f1f8-1f1f7"},{"n":["flag-ss","south sudan flag"],"u":"1f1f8-1f1f8"},{"n":["flag-st","são tomé & príncipe flag"],"u":"1f1f8-1f1f9"},{"n":["flag-sv","el salvador flag"],"u":"1f1f8-1f1fb"},{"n":["flag-sx","sint maarten flag"],"u":"1f1f8-1f1fd"},{"n":["flag-sy","syria flag"],"u":"1f1f8-1f1fe"},{"n":["flag-sz","eswatini flag"],"u":"1f1f8-1f1ff"},{"n":["flag-ta","tristan da cunha flag"],"u":"1f1f9-1f1e6"},{"n":["flag-tc","turks & caicos islands flag"],"u":"1f1f9-1f1e8"},{"n":["flag-td","chad flag"],"u":"1f1f9-1f1e9"},{"n":["flag-tf","french southern territories flag"],"u":"1f1f9-1f1eb"},{"n":["flag-tg","togo flag"],"u":"1f1f9-1f1ec"},{"n":["flag-th","thailand flag"],"u":"1f1f9-1f1ed"},{"n":["flag-tj","tajikistan flag"],"u":"1f1f9-1f1ef"},{"n":["flag-tk","tokelau flag"],"u":"1f1f9-1f1f0"},{"n":["flag-tl","timor-leste flag"],"u":"1f1f9-1f1f1"},{"n":["flag-tm","turkmenistan flag"],"u":"1f1f9-1f1f2"},{"n":["flag-tn","tunisia flag"],"u":"1f1f9-1f1f3"},{"n":["flag-to","tonga flag"],"u":"1f1f9-1f1f4"},{"n":["flag-tr","turkey flag"],"u":"1f1f9-1f1f7"},{"n":["flag-tt","trinidad & tobago flag"],"u":"1f1f9-1f1f9"},{"n":["flag-tv","tuvalu flag"],"u":"1f1f9-1f1fb"},{"n":["flag-tw","taiwan flag"],"u":"1f1f9-1f1fc"},{"n":["flag-tz","tanzania flag"],"u":"1f1f9-1f1ff"},{"n":["flag-ua","ukraine flag"],"u":"1f1fa-1f1e6"},{"n":["flag-ug","uganda flag"],"u":"1f1fa-1f1ec"},{"n":["flag-um","u.s. outlying islands flag"],"u":"1f1fa-1f1f2"},{"n":["flag-un","united nations flag"],"u":"1f1fa-1f1f3"},{"n":["us","flag-us","united states flag"],"u":"1f1fa-1f1f8"},{"n":["flag-uy","uruguay flag"],"u":"1f1fa-1f1fe"},{"n":["flag-uz","uzbekistan flag"],"u":"1f1fa-1f1ff"},{"n":["flag-va","vatican city flag"],"u":"1f1fb-1f1e6"},{"n":["flag-vc","st. vincent & grenadines flag"],"u":"1f1fb-1f1e8"},{"n":["flag-ve","venezuela flag"],"u":"1f1fb-1f1ea"},{"n":["flag-vg","british virgin islands flag"],"u":"1f1fb-1f1ec"},{"n":["flag-vi","u.s. virgin islands flag"],"u":"1f1fb-1f1ee"},{"n":["flag-vn","vietnam flag"],"u":"1f1fb-1f1f3"},{"n":["flag-vu","vanuatu flag"],"u":"1f1fb-1f1fa"},{"n":["flag-wf","wallis & futuna flag"],"u":"1f1fc-1f1eb"},{"n":["flag-ws","samoa flag"],"u":"1f1fc-1f1f8"},{"n":["flag-xk","kosovo flag"],"u":"1f1fd-1f1f0"},{"n":["flag-ye","yemen flag"],"u":"1f1fe-1f1ea"},{"n":["flag-yt","mayotte flag"],"u":"1f1fe-1f1f9"},{"n":["flag-za","south africa flag"],"u":"1f1ff-1f1e6"},{"n":["flag-zm","zambia flag"],"u":"1f1ff-1f1f2"},{"n":["flag-zw","zimbabwe flag"],"u":"1f1ff-1f1fc"},{"n":["england flag","flag-england"],"u":"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f"},{"n":["scotland flag","flag-scotland"],"u":"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f"},{"n":["wales flag","flag-wales"],"u":"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f"}]} as EmojiData \ No newline at end of file diff --git a/src/components/StickerMenu/emojis/index.ts b/src/components/StickerMenu/emojis/index.ts new file mode 100644 index 0000000..49b18c2 --- /dev/null +++ b/src/components/StickerMenu/emojis/index.ts @@ -0,0 +1,14 @@ + +export type EmojiData = Record + + +export type Emoji = { + label: string, + desc: string, + unicode: string, + variants?: string[] +} \ No newline at end of file diff --git a/src/css/FileTree.css b/src/css/FileTree.css new file mode 100644 index 0000000..3ecd8ab --- /dev/null +++ b/src/css/FileTree.css @@ -0,0 +1,82 @@ + +.mk-hide-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen):not(.is-popout-window):not(.is-mobile) .workspace-tabs.mod-top-left-space .workspace-tab-header-container { + padding-left: calc(var(--frame-left-space) + var(--ribbon-width)); +} + +.mk-hide-ribbon:not(.is-mobile) .workspace-ribbon.mod-left { + display:none; +} +.mk-hide-ribbon:not(.is-mobile) .workspace-ribbon.mod-right { + visibility:hidden; + position:absolute; +} +.mk-hide-ribbon:not(.is-mobile) .workspace-split.mod-right-split { + margin-right:0; +} +.mk-hide-tabs .mod-left-split .mod-top-left-space .workspace-tab-header-container-inner { + visibility: hidden; +} + +.mk-hide-ribbon.is-mobile .workspace-drawer.mod-left .workspace-drawer-inner{ + padding-left: 0 !important; +} + +.is-mobile .workspace-drawer.mod-left .workspace-drawer-inner .workspace-drawer-header { + padding-left: 0 !important; +} + +.mk-hide-ribbon.is-mobile .workspace-drawer.mod-left .workspace-drawer-ribbon { + display: none; +} + +.is-mobile .workspace-drawer.mod-left .workspace-drawer-active-tab-header { + display:none; +} +.is-mobile .workspace-drawer.mod-left .workspace-drawer-header-left { + /* display: none; */ +} +.is-mobile .mk-sidebar button:not(.clickable-icon) +{ + padding: unset; +} + +.is-mobile .mk-sidebar .mk-file-icon button +{ + font-size: 16px; +} + +body.is-mobile .sidebar-toggle-button { + display:flex !important; +} + +.is-mobile .workspace-drawer.mod-left .workspace-drawer-header-icon { + position: absolute; + right: 20px; + top:12px; + z-index: 100; +} + +.is-phone .workspace-drawer.mod-left .workspace-drawer-header-icon { + top:20px; +} + +.is-mobile .workspace-drawer.mod-left { + border-top-right-radius:0; + border-bottom-right-radius: 0; +} +.mk-sidebar { + display:flex; + flex-direction:column; + height:100%; +} + +.is-mobile .mk-sidebar { + flex-direction: column-reverse; +} + +.mk-file-tree { + flex:1; + overflow: hidden; + /* -webkit-overflow-scrolling: touch; */ + +} diff --git a/src/css/FlowComponent.css b/src/css/FlowComponent.css new file mode 100644 index 0000000..1eced82 --- /dev/null +++ b/src/css/FlowComponent.css @@ -0,0 +1,140 @@ +.mk-folder-scroller { + display: flex !important; + align-items: flex-start !important; + line-height: 1.4; + height: 100%; + overflow-x: auto; + position: relative; + z-index: 0; + padding: var(--file-margins); +} +.mk-folder-header { + display: flex; +} +.mk-folder-header .inline-title{ + flex-grow:1 +} +.mk-folder-sizer { + display: flex; + flex-direction: column; + align-items: stretch; + width: 100%; + max-width: var(--file-line-width); + margin-left: auto; + margin-right: auto; +} +.mk-file-table-header { + margin-top: 24px; + color: var(--text-faint) +} +.mk-file-table { + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} +.mk-file-row { + +} +.mk-file-row:hover { + background: var(--background-modifier-hover) !important; +} + +.mk-file-table tr:nth-child(even) { + background: var(--color-base-10); + } +.mk-file-row td { + padding: 10px 10px; + +} +.mk-file-row .mk-column-file { + width: 99%; +} +.mk-file-row p { + text-overflow: ellipsis; + overflow: hidden; + font-size: var(--font-ui-smaller); + color: var(--text-faint); + margin: 0; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + display: -webkit-box; +} +.mk-file-row .mk-file-name { + font-weight: var(--font-medium); +} + +.mk-file-date { + font-size: var(--font-ui-smaller); + color: var(--text-muted); + width: 100px; +} +.mk-column-icon { + width: 40px; +} +.mk-column-icon svg { + width: 16px; + height: 16px; + color: var(--text-muted) +} + +.mk-flowspace-title svg { + width: 16px; + height: 16px; + color: var(--text-muted) +} + +.mk-flowspace-title p { + margin: 0; + padding: 0; + margin-left: 8px; +} + +.mk-flowspace-title .mk-flowspace-date { + font-size: var(--font-ui-smaller); + color: var(--text-muted) +} + +.mk-flowspace-title { + display:flex; + align-items: center; + padding: 8px 12px; + border-top: 1px solid var(--divider-color); + +} +.mk-flowspace-editor { + padding: 0px 12px; +} +.mk-flowspace-editor .mk-floweditor { + border-top: 1px solid var(--divider-color); + padding: 12px 0px; +} +.mk-flowspace-container { +} + +.mk-flowspace-title span { + flex-grow: 1; +} + +.mk-flowspace-title button { + padding: 8px; + margin-left: 8px; + width: unset; +} + +.mk-flowspace-title button.mk-open { + background: var(--icon-color-active); +} + +.mk-flowspace-title:hover { + background: var(--color-base-10) +} + +.mk-folder-empty { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: var(--font-ui-small); + font-style: italic; +} \ No newline at end of file diff --git a/src/css/FlowEditor.css b/src/css/FlowEditor.css new file mode 100644 index 0000000..35c1629 --- /dev/null +++ b/src/css/FlowEditor.css @@ -0,0 +1,229 @@ +.mk-floweditor .workspace-leaf { + all: unset +} +.mk-floweditor.hover-editor .popover-content { + margin: 0; + border-radius: var(--he-popover-border-radius); + overflow: hidden; + height: 100%; + } + .mk-floweditor.hover-editor .workspace-leaf, +.mk-floweditor.hover-editor .workspace-split { + height: 100%; + width: 100%; +} + +.mk-floweditor .markdown-source-view.mod-cm6 .cm-editor { + min-height:auto; +} + +.mk-floweditor .cm-content { + padding: 0 !important; +} + +/* FIXES THEMES LIKE ATOM */ +.markdown-source-view.mod-cm6 .cm-content > .internal-embed { + contain: unset !important; +} +.mk-toggle-on { + color: var(--interactive-accent); +} + +.mk-floweditor .view-content { + background: none !important; +} + +.mk-floweditor .cm-scroller { + padding: 0 !important; +} + +.mk-floweditor-placeholder { + border: thin solid var(--divider-color); +} +.mk-floweditor .mk-floweditor-title-container { + display: flex; +} + +.mk-hidden { + display: none !important; +} + +.mk-floweditor-title { + padding: 8px 0px; + margin: 0; + margin-top: 8px; + border-top: 1px solid var(--background-modifier-hover); + width:100%; + display: flex; +} +.mk-floweditor-title:hover { + + background: var(--background-modifier-hover) +} +.mk-floweditor-title div:not(.collapse) svg +{ + transform: rotate(0deg); +} + +.mk-floweditor-title .collapse svg +{ + transform: rotate(90deg); +} + +.mk-floweditor-title svg { + +margin-left:4px; + width: 10px; + height: 10px; +} + .mk-flow-hover { + margin-top: -34px; + } + + .mk-flow-hover > div { + display: flex; + gap: 8px; + align-items: center; + + } + + .mk-flow-seamless .mk-floweditor-container:not(.mk-floweditor-fix) > .mk-floweditor { + padding: 8px; + border-radius: 4px; + border: thin solid var(--divider-color); +} + +.mk-flow-seamless .markdown-embed-title { + display:none; +} +.mk-flow-seamless .mk-flow-titlebar { + display:none; +} + +.mk-flow-classic .mk-flow-titlebar { + font-weight: var(--bold-weight); + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + padding: 0 0 var(--size-4-2) 0; +} + +.mk-flow-classic .mk-flow-titlebar:empty { + margin-bottom: 0 !important; + padding: 0 !important; +} + +.mk-flow-classic .mk-floweditor-container:not(.mk-floweditor-fix) > .mk-floweditor { + font-style: var(--embed-font-style); + background-color: var(--embed-background); + border-top: var(--embed-border-top); + border-right: var(--embed-border-right); + border-bottom: var(--embed-border-bottom); + border-left: var(--embed-border-left); + padding: var(--embed-padding); +} + +.mk-flow-seamless .markdown-embed { + padding: 8px; + border-radius: 4px; + border: thin solid var(--color-base-20); + margin-top: 4px; +} + +.mk-flow-classic .markdown-embed { + margin-top: 24px; +} + +.markdown-embed .markdown-rendered h1, +.markdown-embed .markdown-rendered h2, +.markdown-embed .markdown-rendered h3, +.markdown-embed .markdown-rendered h4, +.markdown-embed .markdown-rendered h5, +.markdown-embed .markdown-rendered h6 { + margin:0; +} + +.markdown-embed p { + margin-bottom: 24px; +} + +.mk-flow-seamless .markdown-embed { + margin-top: 24px; +} + +.mk-floweditor-container:not(.mk-floweditor-fix) > .mk-floweditor:hover { + +} + +.mk-floweditor-container { + min-height: var(--flow-height); +} + +.mk-floweditor-container > .mk-floweditor:hover { + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.06), + 0px 3.4px 6.7px rgba(0, 0, 0, 0.06), + 0px 15px 30px rgba(0, 0, 0, 0.15); +} + +.mk-floweditor-container { + + display:inline; +} + +.cm-tooltip-hover { + margin-bottom: 30px; +} + +.mk-floweditor-fix > .mk-floweditor { + margin-top:-28px; +} + +.cm-tooltip { + border: none !important; + z-index: var(--layer-popover) !important; +} + +.cm-line:hover > .mk-floweditor-selector { + visibility: visible; +} + +.markdown-embed:hover .mk-floweditor-selector { + visibility: visible; +} + +.mk-flow-classic .markdown-embed > .mk-floweditor-selector { + top: 5px !important; +} + +.mk-flow-seamless .markdown-embed > .mk-floweditor-selector { + top: -22px !important; + right:4px; +} +.mk-flow-seamless .cm-line > .mk-floweditor-selector { + top: 3px !important; +} + +.mk-floweditor-selector { + position: absolute; + visibility: hidden; + top: 30px; + right:5px; + z-index: var(--layer-popover); + padding-right:8px; + height: 30px; + display: flex; + gap: 6px; +} + + + +.mk-floweditor-selector > div{ + padding: 4px 6px; + border-radius: 4px; + background: var(--background-primary); + border: thin solid var(--background-modifier-border-hover); +} + +.mk-floweditor-selector > div:hover{ + background: var(--background-secondary-alt) +} \ No newline at end of file diff --git a/src/css/FolderTreeView.css b/src/css/FolderTreeView.css new file mode 100644 index 0000000..c433601 --- /dev/null +++ b/src/css/FolderTreeView.css @@ -0,0 +1,204 @@ +.mk-tree-wrapper { + box-sizing: border-box; + + margin-bottom: 1px; + display:flex; + align-items:center; + padding-right: 12px; + position: relative; +} + +.is-mobile .mk-tree-wrapper { + padding-top: 6px; + padding-bottom: 6px; +} + +.mk-tree-wrapper > div { + display:flex; + align-items:center; + width:100%; +} + +.mk-tree-wrapper > .mk-indicator-bottom::after { + content: " "; + display: block; + position: absolute; + height: 2px; + border-radius:1px; + background: var(--interactive-accent); + width: calc(100% - var(--spacing)); + left: var(--spacing); + top: 100%; +} + +.mk-tree-wrapper > .mk-indicator-top::before { + content: " "; + display: block; + position: absolute; + height: 2px; + border-radius:1px; + background: var(--interactive-accent); + width: calc(100% - var(--spacing)); + left: var(--spacing); + top: 0%; +} + +.mk-tree-wrapper .mk-indicator-row { + background: #dde8f6; +} + +.mk-tree-wrapper.mk-clone { + display: inline-block; + pointer-events: none; + padding: 0; + padding-left: 10px; + padding-top: 5px; +} +.mk-tree-wrapper.mk-clone.mk-tree-item { + --vertical-padding: 5px; + padding-right: 24px; + box-shadow: 0px 15px 15px 0 rgba(34, 33, 81, 0.1); +} + + .mk-tree-wrapper.mk-ghost{ + opacity: 0.5; + } + + + +.mk-tree-item { + margin-left: var(--spacing); + --vertical-padding: 2px; + flex-grow: 1; + position: relative; + display: flex; + align-items: center; + padding: var(--vertical-padding) 2px; + box-sizing: border-box; + min-width:0; + margin-right:4px; + height: 28px; +} + + +.mk-tree-wrapper button { +background: none; +border: 0; +box-shadow: none; +margin: 0; +height:24px; +width: 24px; +padding: 0 +} + +.is-mobile .mk-tree-wrapper .mk-folder-buttons button { + margin-left: 8px; +} + +body:not(.is-mobile) .mk-tree-wrapper button:hover { +background: var(--nav-item-background-hover); +} + +.mk-file-icon { + width: 24px; + height: 24px; +} + + +.is-mobile .mk-file-icon { + width: unset; +} + + + +body:not(.is-mobile) .mk-tree-wrapper .mk-folder-buttons { + display:none; +} +body:not(.is-mobile) .mk-tree-wrapper:hover .mk-folder-buttons { + display:flex; + +} + +.mk-tree-wrapper svg { + width:16px; + height:16px; + color: var(--text-muted); +} + +.is-mobile .mk-tree-wrapper svg { + width: 20px; + height: 20px; + color: var(--text-faint) +} + +.is-mobile .mk-tree-wrapper .mk-file-icon svg { + width: 18px; + height: 18px; + color: var(--text-faint) +} + +.mk-tree-text { + padding: 0.15rem 4px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + font-size: var(--font-ui-small); + flex-grow: 1; +} + + +.mk-disable-interaction { +pointer-events: none; +} + +.mk-disable-selection, +.mk-clone +.mk-tree-text { + user-select: none; + -webkit-user-select: none; +} +.view-content { +padding: 0 !important; +} +.mk-collapse svg { +transform: rotate(90deg); + transition: transform 250ms ease; + width:14px; + height:14px; + margin: 5px; +} +.mk-collapse.mk-collapsed svg { + transform: rotate(0deg); +} + +.mk-is-active:not(.clone) { + color: var(--nav-item-color-active); + + background: var(--nav-item-background-active); +} + +body:not(.is-mobile) .mk-tree-wrapper:not(.mk-section-wrapper):not(.mk-disable-interaction):hover { + background: var(--nav-item-background-hover); + } + + /* .is-mobile .mk-tree-wrapper:not(.mk-section-wrapper):not(.mk-disable-interaction):active { + background: var(--nav-item-background-hover); + } */ + + +.mk-icon-menu { + transform: translate3d(-500px, 0px, 0px); + z-index: var(--layer-menu) +} +.mk-icon-menu .menu { + position: static !important; + padding: 0 !important; + } + +.mk-tree-empty { + padding-left: var(--spacing); + padding-top: 4px; + padding-bottom: 4px; + font-size: var(--font-ui-small); + color: var(--text-faint) +} \ No newline at end of file diff --git a/src/css/InlineMenu.css b/src/css/InlineMenu.css new file mode 100644 index 0000000..10004cd --- /dev/null +++ b/src/css/InlineMenu.css @@ -0,0 +1,68 @@ +body:not(.is-mobile) .mk-style-menu { + margin-left: -80px; +} + + + +.mk-style-menu { + display: flex; + padding: 0; + margin-top: -44px; +} + +.is-mobile .mk-style-menu svg { + width: 32px; + height: 32px; +} + +.is-mobile .mk-style-menu { + --mobile-toolbar-height: 48px; + border-radius: 0; + width:100%; + margin-top: 0; + overflow-x: auto; + justify-content: center; + height: var(--mobile-toolbar-height); + border-top: var(--divider-width) solid var(--divider-color); +} + +.mk-style-menu .mk-mark { + margin: 4px; + padding: 4px; + border-radius: 4px; + display:flex; +} + +.mk-style-menu .mk-mark:hover { + background: var(--background-modifier-hover); +} + +.mk-style-menu .mk-mark-active { + background: var(--background-modifier-hover); +} + +.mk-style-menu svg { + color: var(--text-muted) +} + +.mk-divider { + border-left: thin solid var(--background-modifier-hover); + width: 1px; +} + +.mk-color { + width: 24px; + height: 24px; + border-radius: 12px; + margin: 8px; +} +.mk-color:hover { + opacity: 0.8 +} + +mark { + color: unset; + border-radius: 2px; + margin: 0px 2px; + padding: 0px 2px; +} \ No newline at end of file diff --git a/src/css/MainMenu.css b/src/css/MainMenu.css new file mode 100644 index 0000000..9a0b0cc --- /dev/null +++ b/src/css/MainMenu.css @@ -0,0 +1,56 @@ +.mk-main-menu-container { + display: flex; + padding: 12px 8px; +} +.mk-main-menu-button { + text-align:left; + padding:8px 8px; + border-radius: 4px; + align-items: center; + display:flex; + width:calc(100% - 50px); +} +.is-mobile .mk-main-menu-button { + font-size: var(--font-ui-medium); + font-weight: var(--font-medium); +} +.mk-main-menu-button > div { + display: flex; +} + +.mk-main-menu-button svg { +height: 16px; +width: 16px; +} +body:not(.is-mobile) .mk-main-menu-button:hover { + background:var(--nav-item-background-hover); +} +.mk-main-menu { + position: absolute; + left: 8px; + z-index:var(--layer-menu); + margin-top: 2.25rem; + margin-left: 2px; + background-color: var(--background-secondary); + transform-origin: top left; + border-radius: var(--radius-m); + border: 1px solid var(--background-modifier-border-hover); + box-shadow: var(--shadow-s); +} + +.mk-menu-button { + display: flex; +padding-top: 0.5rem; +padding-bottom: 0.5rem; +padding-left: 0.5rem; +padding-right: 0.5rem; +font-size: 0.75rem; +line-height: 1.25rem; +align-items: center; +width: 100%; +border-radius: 0.375rem; + +} +.mk-menu-button:hover { +background: var(--nav-item-background-hover); +} \ No newline at end of file diff --git a/src/css/MakeMenu.css b/src/css/MakeMenu.css new file mode 100644 index 0000000..70e411c --- /dev/null +++ b/src/css/MakeMenu.css @@ -0,0 +1,17 @@ +.mk-slash-item { + display: flex; + align-items: center; +} +.mk-slash-icon { + display: flex; + margin-right: 8px; +} +.mk-slash-icon svg { + width: 16px; + height: 16px; +} +.cm-active.cm-placeholder:before { + content: attr(data-ph); + color: var(--text-faint); + position: absolute; +} \ No newline at end of file diff --git a/src/css/NewNote.css b/src/css/NewNote.css new file mode 100644 index 0000000..cfdaf32 --- /dev/null +++ b/src/css/NewNote.css @@ -0,0 +1,41 @@ +.mk-flow-bar { +display: flex; +} +.is-mobile .mk-flow-bar { + border-top: thin solid var(--divider-color); +} +.mk-new-note { +flex-grow:1; + padding: 8px 12px; + font-size: var(--font-ui-smaller); + margin:4px 12px; + display:flex; + align-items: center; +} + +.is-mobile .mk-new-note { + margin: 8px 12px; +} + +.mk-new-note p { + margin:0; + margin-left: 8px; + padding:0; +} + +.mk-new-note svg { +width: 16px; +height: 16px; +} + +.mk-search { + display: flex; + padding: 8px 8px; + margin:4px 12px; + margin-left: 0px; + } + +.mk-search svg { +width: 16px; +height: 16px; +} diff --git a/src/css/SectionView.css b/src/css/SectionView.css new file mode 100644 index 0000000..7a9ab3c --- /dev/null +++ b/src/css/SectionView.css @@ -0,0 +1,48 @@ + +.mk-section { + display: flex; + padding: 4px 0px; + padding-left: 12px; + margin-top: 12px; + color: var(--text-muted); + font-size: var(--font-ui-smaller); + width:100%; + justify-content: space-between; + } + + + body:not(.is-mobile) .mk-section .mk-section-title:hover { + background: var(--nav-item-background-hover); +} + +.mk-section .mk-section-title { + height: 24px; +border-radius:4px; +display: flex; +min-width:0; +align-items: center; +} + +.mk-section .mk-tree-text { + padding: 0.25rem 0rem 0.3rem 0.25rem; +} + +body:not(.is-mobile) .mk-section .mk-collapse + { + display:none; + } +.mk-section .mk-collapse +{ +display: flex; +} + +body:not(.is-mobile) .mk-section:hover .mk-collapse { + display: flex + } +.mk-section .mk-collapse svg { +margin-left:4px; + width: 10px; + height: 10px; +} + + \ No newline at end of file diff --git a/src/css/StickerMenu.css b/src/css/StickerMenu.css new file mode 100644 index 0000000..9c7a1c7 --- /dev/null +++ b/src/css/StickerMenu.css @@ -0,0 +1,32 @@ +.mk-sticker-menu .suggestion { + width:240px; + height: 240px; + display: flex; + flex-wrap: wrap; + align-content: flex-start; + flex-direction: row; +} +.mk-sticker-modal { + display: flex; + flex-wrap: wrap; +} +.mk-sticker-menu .suggestion-item { + width: 30px; + height: 30px; + display: flex; + font-size:20px; + align-items: center; + padding: 0; + text-align:center; + justify-content: center; +} +.mk-sticker-filter { + border: none; + background: none; + border-bottom: thin solid var(--background-modifier-hover); + width: 100%; + padding: 8px 12px; +} +.mk-sticker-menu .suggestion-item:hover { + background: var(--background-modifier-hover) +} \ No newline at end of file diff --git a/src/css/makerMode.css b/src/css/makerMode.css new file mode 100644 index 0000000..0d6bbd3 --- /dev/null +++ b/src/css/makerMode.css @@ -0,0 +1,104 @@ + +/* fix checkbox margin */ +.markdown-source-view.mod-cm6 .task-list-label .task-list-item-checkbox { + margin-bottom: 4px; +} + + +.mk-mark-sans .cm-s-obsidian span.cm-hmd-escape-backslash, +.mk-mark-sans .cm-s-obsidian .HyperMD-header:not(.mk-reset) span.cm-formatting-header { + + display: inline; + position: absolute; + right: 100%; + white-space: nowrap; + color: transparent; +} + + +.mk-mark-sans .cm-s-obsidian .HyperMD-header.mk-reset span.cm-formatting-header { + color: unset; + } + + +.mk-mark-sans .mk-reset .cm-fold-indicator { + display: none !important; +} +.mk-mark-sans div[class*="HyperMD-header-"].mk-reset { + + font-variant: unset; + letter-spacing: unset; + line-height: unset; + font-size: unset; + color: unset; + font-weight: unset; + font-style: unset; + font-family: unset; +} + +.mk-mark-sans .HyperMD-quote-lazy:before { + content: none !important; +} + +.mk-mark-sans .cm-s-obsidian span.cm-formatting-quote:not(.cm-hmd-callout) { + color: transparent; +} + +.mk-mark-sans .cm-s-obsidian span.cm-hmd-escape-backslash::selection, +.mk-mark-sans .cm-s-obsidian span.cm-formatting-header::selection { + + background: transparent; +} + + + +/* .mk-maker-mode .cm-s-obsidian span.cm-formatting-em, +.mk-maker-mode .cm-s-obsidian span.cm-formatting-strong, +.mk-maker-mode .cm-s-obsidian span.cm-formatting-strikethrough, +.mk-maker-mode .cm-s-obsidian span.cm-formatting-code { + display: inline; + position: absolute; + z-index: -1; + white-space: nowrap; + color: transparent; +} + + +.mk-maker-mode .cm-s-obsidian span.cm-formatting-em::selection, +.mk-maker-mode .cm-s-obsidian span.cm-formatting-strong::selection, +.mk-maker-mode .cm-s-obsidian span.cm-formatting-strikethrough::selection, +.mk-maker-mode .cm-s-obsidian span.cm-formatting-code::selection { + background: transparent; +} */ + + + +.mk-flow-replace .mk-new-file { + /* color: transparent; */ + background: var(--color-base-10); +border-bottom: thin solid #333; +} + +.mk-flow-replace .mk-new-file:hover { + /* color: transparent; */ + background: var(--color-base-10); +border-bottom: thin solid #333; +} + + +.mobile-toolbar-options-container { + border-top: var(--divider-width) solid var(--divider-color); +} + +.mk-mark-sans .markdown-source-view.mod-cm6 .HyperMD-quote:not(.HyperMD-callout):before, +.mk-mark-sans .markdown-source-view.mod-cm6 .cm-blockquote-border:before { + left: 0; + content: "\200b"; + display: block; + width: 1px; + border-left: var(--blockquote-border-thickness) solid var(--blockquote-border-color); + color: transparent; + position: absolute; + top: 0; + bottom: 0; +} \ No newline at end of file diff --git a/src/dispatch/flowDispatch.ts b/src/dispatch/flowDispatch.ts new file mode 100644 index 0000000..227bc9b --- /dev/null +++ b/src/dispatch/flowDispatch.ts @@ -0,0 +1,23 @@ + +import { TFile } from "obsidian"; +import { SpawnPortalEvent, eventTypes, PortalType } from "types/types"; + +export const createFlowEditorInElement = (id: string, el: HTMLElement, type: PortalType, file?: string, from?: number, to?: number) => { + let evt = new CustomEvent(eventTypes.spawnPortal, { detail: { id, el, file, from, to, type } }); + window.dispatchEvent(evt); +} + +export const focusFlowEditor = (id: string, top: boolean) => { + let evt = new CustomEvent(eventTypes.focusPortal, { detail: { id, parent: false, top } }); + window.dispatchEvent(evt); +} + +export const focusFlowEditorParent = (id: string, top: boolean) => { + let evt = new CustomEvent(eventTypes.focusPortal, { detail: { id, parent: true, top } }); + window.dispatchEvent(evt); +} + +export const openFileFlowEditor = (file: string, source: string) => { + let evt = new CustomEvent(eventTypes.openFilePortal, { detail: { file, source} }); + window.dispatchEvent(evt); +} \ No newline at end of file diff --git a/src/hooks/ForceUpdate.tsx b/src/hooks/ForceUpdate.tsx new file mode 100644 index 0000000..7f813cc --- /dev/null +++ b/src/hooks/ForceUpdate.tsx @@ -0,0 +1,6 @@ +import React, { useState } from 'react'; + +export default function useForceUpdate() { + const [value, setValue] = useState(0); + return () => setValue((value) => value + 1); +} diff --git a/src/hooks/useLongPress.tsx b/src/hooks/useLongPress.tsx new file mode 100644 index 0000000..ca990f3 --- /dev/null +++ b/src/hooks/useLongPress.tsx @@ -0,0 +1,6 @@ +import React, { useEffect, useState, useCallback } from 'react'; + + +export function isMouseEvent(e: React.TouchEvent | React.MouseEvent): e is React.MouseEvent { + return e && 'screenX' in e; +} \ No newline at end of file diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 0000000..80bc4f9 --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,188 @@ +class T { + lang: string + + all = { + en: { + commands: { + h1: "Heading 1", + h2: "Heading 2", + h3: "Heading 3", + list: 'Bullet List', + 'ordered-list': "Numbered List", + todo: 'To-do List', + quote: 'Quote', + divider: 'Divider', + note: 'Link to Note', + link: 'Web Link', + callout: 'Callout', + codeblock: 'Code Block', + emoji: 'Emoji', + image: 'Image', + flow: 'Flow Note', + tag: 'Tag', + makeMenu: 'Make Menu', + selectStyle: 'Style', + toggleKeyboard: 'Toggle Keyboard' + + }, + styles: { + bold: 'Bold', + italics: 'Italics', + strikethrough: 'Strikethrough', + code: 'Code', + link: 'Web Link', + blocklink: 'Link to Note', + textColor: 'Text Color', + highlight: 'Highlight' + }, + commandsSuggest: { + noResult: "No result", + }, + commandPalette: { + enable: "Enable", + disabled: "Disable", + }, + menu: { + openFilePane: 'Open in a new pane', + rename: 'Rename', + moveFile: 'Move file to...', + duplicate: 'Make a copy', + edit: 'Edit', + delete: 'Delete', + getHelp: 'Make.md Community', + openVault: 'Open Another Vault', + obSettings: 'Obsidian Settings', + commandPalette: 'Command Palette', + backToSpace: 'Back to Spaces', + newSpace: 'New Space', + collapseAllSections: 'Collapse All Spaces', + expandAllSections: 'Expand All Spaces', + collapseAllFolders: 'Collapse All Folders', + expandAllFolders: 'Expand All Folders', + spaceTitle: 'Add/Remove in Space' + }, + buttons: { + moreOptions: 'More Options', + newNote: 'New Note', + changeIcon: 'Change Sticker', + rename: 'Change Name', + createFolder: 'New Folder', + createNote: 'New Note', + createSection: 'New Space', + cancel: 'Cancel', + search: 'Search', + toggleFlow: 'Hide Flow', + openFlow: 'Open Flow', + hideFlow: 'Hide Flow', + openLink: 'Open Link' + }, + labels: { + createFolder: 'New Folder Name', + rename: 'Rename Note', + renameSection: 'Rename Space', + createSection: 'New Space', + createNote: 'New Note Name', + collapse: 'Collapse', + expand: 'Expand', + findStickers: "Find Sticker", + placeholder: "Type '/' for commands", + noFile: 'is not created yet. Click to create.' + + + }, + flowView: { + emptyDoc: 'Empty Document', + itemsCount: ' Items', + emptyFolder: 'This Folder is Empty' + }, + notice: { + duplicateFile: 'Folder already contains note with same name', + addedToSection: 'Added to Space' + }, + settings: { + sectionSidebar: 'Spaces', + sectionEditor: 'Maker Mode', + sectionFlow: 'Flow Editor', + spaces: { + name: 'Spaces', + desc: `Spaces gives you control over how you organize your files` + }, + spacesStickers: { + name: 'Stickers', + desc: `Use Emojis to make it easier to find your notes` + }, + spacesDeleteOption: { + name: 'Delete File Option', + desc: 'Select how you want files to be deleted' + }, + spacesDeleteOptions: { + permanant: 'Delete Permanently', + trash: 'Move to Obsidian Trash', + 'system-trash': 'Move to System Trash' + }, + sidebarRibbon: { + name: 'Show Ribbon Bar', + desc: `Show/hide Obsidian ribbon bar` + }, + sidebarTabs: { + name: 'Show Sidebar Tabs', + desc: `Show/hide other sidebar tabs` + }, + spacesPerformance: { + name: 'Spaces Performance Mode', + desc: `Turn on performance mode for Spaces, may affect scrolling appearance. Requires Restart` + }, + inlineStyler: { + name: 'Inline Styler', + desc: `Select text to add styling, recommended for Flow Editor` + }, + inlineStylerColor: { + name: 'Text and Highlight Colors 🧪', + desc: `Select text color and highlight color, (this may change in the future because of the limitations with HTML and Obsidian)` + }, + makeChar: { + name: 'Make Menu Trigger', + desc: 'Character to open the Make Menu' + }, + mobileMakeBar: { + name: 'Make Bar (Mobile)', + desc: 'Replaces the mobile toolbar' + }, + editorMarkSans: { + name: 'Mark Sans 🧪', + desc: `Use the editor without Markdown.` + }, + editorMakePlacholder: { + name: 'Make Menu Hint Text', + desc: `Show a hint text on how to open the Make Menu Shortcut` + }, + editorMakeMenu: { + name: 'Make Menu Shortcut', + desc: `Open the Make menu to quickly add content` + }, + editorFlowReplace: { + name: 'Flow Editor', + desc: `Open your internal links or toggle your embeds in the flow editor.` + }, + editorFlowStyle: { + name: 'Flow Editor Style', + desc: 'Select a theme for your flow editors', + seamless: 'Seamless', + classic: 'Classic', + } + + } + }, + + } + + constructor() { + this.lang = localStorage.getItem("language") + } + + get texts(): typeof this.all.en { + return this.all["en"] + } +} + +export default new T().texts diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..a147c89 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,213 @@ +import { FileExplorerPlugin, Plugin, addIcon, TAbstractFile, MarkdownView, WorkspaceLeaf, Menu, EphemeralState, ViewState, WorkspaceItem, WorkspaceContainer, Workspace, App, Plugin_2 } from 'obsidian'; +import { FILE_TREE_VIEW_TYPE, FileTreeView, ICON, SETS_VIEW_TYPE } from './components/Spaces/FileTreeView'; +import { MakeMDPluginSettings as MakeMDPluginSettings, MakeMDPluginSettingsTab, DEFAULT_SETTINGS } from './settings'; +import { eventTypes, FocusPortalEvent, OpenFilePortalEvent, SpawnPortalEvent, VaultChange } from 'types/types'; +import MakeMenu from 'components/MakeMenu/MakeMenu'; +import StickerMenu from 'components/StickerMenu/StickerMenu'; +import { FlowView, FOLDER_VIEW_TYPE } from 'components/FlowView/FlowView'; +import { FlowEditor } from 'components/FlowEditor/FlowEditor'; +import { around } from "monkey-around"; +import { EditorView } from '@codemirror/view' +import 'css/makerMode.css' +import { cmExtensions } from 'cm-extensions/cmExtensions'; +import { focusPortal, loadFlowEditorsForLeaf, openFileFromPortal, spawnNewPortal } from 'utils/flowEditor'; +import { replaceAllEmbed } from 'utils/markdownPost'; +import { toggleMark } from 'cm-extensions/inlineStylerView/marks'; +import { platformIsMobile } from 'utils/utils'; +import { replaceMobileMainMenu } from 'components/Spaces/MainMenu'; +import { loadStylerIntoContainer } from 'cm-extensions/inlineStylerView/InlineMenu'; +import { patchFileExplorer, patchWorkspace } from 'utils/patches'; +import { platform } from 'os'; +import { getActiveCM } from 'utils/codemirror'; +import { mkLogo } from 'utils/icons'; +export default class MakeMDPlugin extends Plugin { + settings: MakeMDPluginSettings; + activeEditorView?: MarkdownView; + flowEditors: FlowEditor[]; + + toggleBold () { + const cm = getActiveCM(); + if (cm) { + cm.dispatch({ + annotations: toggleMark.of('strong') + }) + } + } + toggleEm () { + const cm = getActiveCM(); + if (cm) { + cm.dispatch({ + annotations: toggleMark.of('em') + }) + } + } + + loadSpaces () { + patchWorkspace(this); + document.body.classList.toggle('mk-hide-ribbon', !this.settings.sidebarRibbon); + document.body.classList.toggle('mk-hide-ribbon', !this.settings.sidebarRibbon); + document.body.classList.toggle('mk-hide-tabs', !this.settings.sidebarTabs); + this.registerView(FOLDER_VIEW_TYPE, (leaf) => { + return new FlowView(leaf, this); + }); + if (this.settings.spacesEnabled) { + patchFileExplorer(this); + this.registerView(FILE_TREE_VIEW_TYPE, (leaf) => { + return new FileTreeView(leaf, this); + }); + this.app.workspace.onLayoutReady(async () => { + await this.openFileTreeLeaf(true); + }); + } + + this.app.vault.on('create', this.onCreate); + this.app.vault.on('delete', this.onDelete); + this.app.vault.on('rename', this.onRename); + } + + loadFlowEditor () { + document.body.classList.toggle('mk-flow-replace', this.settings.editorFlow); + document.body.classList.toggle('mk-flow-'+this.settings.editorFlowStyle, true); + if (this.settings.editorFlow) { + this.registerMarkdownPostProcessor((element, context) => { + const removeAllFlowMarks = (el: HTMLElement) => { + const embeds = el.querySelectorAll(".internal-embed"); + + for (let index = 0; index < embeds.length; index++) { + const embed = embeds.item(index); + if (embed.previousSibling && embed.previousSibling.textContent.slice(-1) == '!') + embed.previousSibling.textContent = embed.previousSibling.textContent.slice(0, -1) + } + } + removeAllFlowMarks(element); + replaceAllEmbed(element, context); + }) + + + window.addEventListener(eventTypes.spawnPortal, this.spawnPortal); + window.addEventListener(eventTypes.focusPortal, this.focusPortal); + window.addEventListener(eventTypes.openFilePortal, this.openFileFromPortal); + } + } + + loadMakerMode () { + document.body.classList.toggle('mk-mark-sans', this.settings.markSans); + this.addCommand({ + id: 'mk-toggle-bold', + name: 'Toggle Bold', + callback: () => this.toggleBold(), + hotkeys: [ + { + modifiers: ['Mod'], + key: 'b', + }, + ], + }); + + this.addCommand({ + id: 'mk-toggle-italics', + name: 'Toggle Italics', + callback: () => this.toggleEm(), + hotkeys: [ + { + modifiers: ['Mod', 'Shift'], + key: 'i', + }, + ], + }); + this.registerEditorSuggest(new MakeMenu(this.app, this)) + this.registerEditorSuggest(new StickerMenu(this.app, this)) + if (platformIsMobile() && this.settings.mobileMakeBar) + loadStylerIntoContainer(app.mobileToolbar.containerEl); + } + async onload() { + window.make = this; + addIcon('mk-logo', mkLogo) + console.log('Loading Make.md'); + // Load Settings + this.addSettingTab(new MakeMDPluginSettingsTab(this.app, this)); + await this.loadSettings(); + this.loadSpaces(); + this.loadFlowEditor(); + this.loadMakerMode(); + this.registerEditorExtension(cmExtensions(this, platformIsMobile())); + } + + //Flow Editor Listeners + openFileFromPortal (e: OpenFilePortalEvent) { + openFileFromPortal(this, e) + } + spawnPortal (e: SpawnPortalEvent) { + spawnNewPortal(this, e); + } + focusPortal (e: FocusPortalEvent) { + focusPortal(this, e); + } + + //Spaces Listeners + triggerVaultChangeEvent = (file: TAbstractFile, changeType: VaultChange, oldPath?: string) => { + let event = new CustomEvent(eventTypes.vaultChange, { + detail: { + file: file, + changeType: changeType, + oldPath: oldPath ? oldPath : '', + }, + }); + window.dispatchEvent(event); + }; + onCreate = (file: TAbstractFile) => this.triggerVaultChangeEvent(file, 'create', ''); + onDelete = (file: TAbstractFile) => this.triggerVaultChangeEvent(file, 'delete', ''); + onRename = (file: TAbstractFile, oldPath: string) => this.triggerVaultChangeEvent(file, 'rename', oldPath); + + openFileTreeLeaf = async (showAfterAttach: boolean) => { + let leafs = this.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE); + if (leafs.length == 0) { + let leaf = this.app.workspace.getLeftLeaf(false); + await leaf.setViewState({ type: FILE_TREE_VIEW_TYPE }); + if (showAfterAttach) this.app.workspace.revealLeaf(leaf); + } else { + leafs.forEach((leaf) => this.app.workspace.revealLeaf(leaf)); + } + replaceMobileMainMenu(this); + }; + + detachFileTreeLeafs = () => { + let leafs = this.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE); + for (let leaf of leafs) { + if ((leaf.view as FileTreeView).destroy) + (leaf.view as FileTreeView).destroy(); + leaf.detach(); + } + }; + + refreshTreeLeafs = () => { + this.detachFileTreeLeafs(); + this.openFileTreeLeaf(true); + }; + + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + + async saveSettings(refresh=true) { + await this.saveData(this.settings); + if(refresh) { + let evt = new CustomEvent(eventTypes.settingsChanged, {}); + window.dispatchEvent(evt); + } + } + + + + onunload() { + console.log('Unloading Make.md'); + window.removeEventListener(eventTypes.spawnPortal, this.spawnPortal) + window.removeEventListener(eventTypes.focusPortal, this.focusPortal) + window.removeEventListener(eventTypes.openFilePortal, this.openFileFromPortal) + this.detachFileTreeLeafs(); + // Remove event listeners + this.app.vault.off('create', this.onCreate); + this.app.vault.off('delete', this.onDelete); + this.app.vault.off('rename', this.onRename); + } +} diff --git a/src/recoil/pluginState.ts b/src/recoil/pluginState.ts new file mode 100644 index 0000000..f5191e6 --- /dev/null +++ b/src/recoil/pluginState.ts @@ -0,0 +1,40 @@ +import { TFolder } from 'obsidian'; +import { atom } from 'recoil'; +import { SectionTree } from 'types/types'; + +export const activeFile = atom({ + key: 'spacesActiveFile', + default: null as string, + dangerouslyAllowMutability: true, +}); + + +export const folderTree = atom({ + key: 'spacesFolderTree', + default: null as TFolder, + dangerouslyAllowMutability: true, +}); + +export const sections = atom({ + key: 'spacesSections', + default: [] as SectionTree[], + dangerouslyAllowMutability: true, +}); + + +export const fileIcons = atom({ + key: 'spacesIcons', + default: [] as [string, string][], +}); + +export const openFolders = atom({ + key: 'spacesOpenFolders', + default: [] as string[], +}); + + +export const focusedFolder = atom({ + key: 'spacesFocusedFolder', + default: null as TFolder, + dangerouslyAllowMutability: true, +}); diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..a80830f --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,264 @@ +import MakeMDPlugin from './main'; +import { PluginSettingTab, Setting, App, DropdownComponent } from 'obsidian'; +import { eventTypes, SectionTree, StringTree } from 'types/types'; +import t from 'i18n' +export type DeleteFileOption = 'trash' | 'permanent' | 'system-trash'; + +export interface MakeMDPluginSettings { + filePreviewOnHover: boolean; + markSans: boolean; + makeMenuPlaceholder: boolean; + inlineStyler: boolean; + mobileMakeBar: boolean; + inlineStylerColors: boolean; + editorFlow: boolean; + editorFlowStyle: string; + spacesEnabled: boolean; + spacesPerformance: boolean; + spacesStickers: boolean; + sidebarRibbon: boolean; + sidebarTabs: boolean; + deleteFileOption: DeleteFileOption; + folderRank: StringTree; + openFolders: string[]; + fileIcons: [string, string][]; + spaces: SectionTree[]; + vaultCollapsed: boolean; + menuTriggerChar: string; + emojiTriggerChar: string; +} + +export const DEFAULT_SETTINGS: MakeMDPluginSettings = { + + filePreviewOnHover: false, + markSans: true, + makeMenuPlaceholder: true, + mobileMakeBar: true, + inlineStyler: true, + inlineStylerColors: false, + editorFlow: true, + editorFlowStyle: 'seamless', + spacesEnabled: true, + spacesPerformance: false, + spacesStickers: true, + sidebarRibbon: false, + sidebarTabs: false, + deleteFileOption: 'trash', + folderRank: { + node: 'root', + children: [], + isFolder: true, + }, + openFolders: [], + fileIcons: [], + spaces: [], + vaultCollapsed: false, + menuTriggerChar: '/', + emojiTriggerChar: ':' +}; + +export class MakeMDPluginSettingsTab extends PluginSettingTab { + plugin: MakeMDPlugin; + + constructor(app: App, plugin: MakeMDPlugin) { + super(app, plugin); + this.plugin = plugin; + } + + refreshView() { + let evt = new CustomEvent(eventTypes.refreshView, {}); + window.dispatchEvent(evt); + } + + display(): void { + let { containerEl } = this; + containerEl.empty(); + + containerEl.createEl('h2', { text: t.settings.sectionSidebar }); + new Setting(containerEl) + .setName(t.settings.spaces.name) + .setDesc(t.settings.spaces.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.spacesEnabled).onChange((value) => { + this.plugin.settings.spacesEnabled = value; + this.plugin.saveSettings(); + if (value) { + this.plugin.openFileTreeLeaf(true); + } else { + this.plugin.detachFileTreeLeafs(); + } + this.refreshView(); + }) + ); + new Setting(containerEl) + .setName(t.settings.spacesStickers.name) + .setDesc(t.settings.spacesStickers.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.spacesStickers).onChange((value) => { + this.plugin.settings.spacesStickers = value; + this.plugin.saveSettings(); + this.refreshView(); + }) + ); + new Setting(containerEl) + .setName(t.settings.sidebarRibbon.name) + .setDesc(t.settings.sidebarRibbon.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.sidebarRibbon).onChange((value) => { + this.plugin.settings.sidebarRibbon = value; + this.plugin.saveSettings(); + document.body.classList.toggle('mk-hide-ribbon', !value); + }) + ); + new Setting(containerEl) + .setName(t.settings.sidebarTabs.name) + .setDesc(t.settings.sidebarTabs.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.sidebarTabs).onChange((value) => { + this.plugin.settings.sidebarTabs = value; + this.plugin.saveSettings(); + document.body.classList.toggle('mk-hide-tabs', !value); + }) + ); + new Setting(containerEl) + .setName(t.settings.spacesPerformance.name) + .setDesc(t.settings.spacesPerformance.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.spacesPerformance).onChange((value) => { + this.plugin.settings.spacesPerformance = value; + this.plugin.saveSettings(); + }) + ); + + new Setting(containerEl) + .setName(t.settings.spacesDeleteOption.name) + .setDesc(t.settings.spacesDeleteOption.desc) + .addDropdown((dropdown) => { + dropdown.addOption('permanent', t.settings.spacesDeleteOptions.permanant); + dropdown.addOption('trash', t.settings.spacesDeleteOptions.trash); + dropdown.addOption('system-trash', t.settings.spacesDeleteOptions['system-trash']); + dropdown.setValue(this.plugin.settings.deleteFileOption); + dropdown.onChange((option: DeleteFileOption) => { + this.plugin.settings.deleteFileOption = option; + this.plugin.saveSettings(); + }); + }); + + containerEl.createEl('h2', { text: t.settings.sectionFlow }); + + new Setting(containerEl) + .setName(t.settings.editorFlowReplace.name) + .setDesc(t.settings.editorFlowReplace.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.editorFlow).onChange((value) => { + this.plugin.settings.editorFlow = value; + this.plugin.saveSettings(); + this.refreshView(); + }) + ); + new Setting(containerEl) + .setName(t.settings.editorFlowStyle.name) + .setDesc(t.settings.editorFlowStyle.desc) + .addDropdown((dropdown: DropdownComponent) => { + dropdown.addOption("classic", t.settings.editorFlowStyle.classic); + dropdown.addOption("seamless", t.settings.editorFlowStyle.seamless); + dropdown + .setValue(this.plugin.settings.editorFlowStyle) + .onChange(async (value) => { + this.plugin.settings.editorFlowStyle = value; + document.body.classList.toggle('mk-flow-classic', false); + document.body.classList.toggle('mk-flow-seamless', false); + if (value == 'seamless') + document.body.classList.toggle('mk-flow-seamless', true); + if (value == 'classic') + document.body.classList.toggle('mk-flow-classic', true); + }); + }); + + containerEl.createEl('h2', { text: t.settings.sectionEditor }); + + new Setting(containerEl) + .setName(t.settings.makeChar.name) + .setDesc(t.settings.makeChar.desc) + .addText(text => { + text.setValue(this.plugin.settings.menuTriggerChar).onChange( + async value => { + if (value.trim().length < 1) { + text.setValue(this.plugin.settings.menuTriggerChar) + return + } + + let char = value[0] + + if (value.trim().length === 2) { + char = value.replace( + this.plugin.settings.menuTriggerChar, + "" + ) + } + + text.setValue(char) + + this.plugin.settings.menuTriggerChar = char + + await this.plugin.saveSettings() + } + ) + }) + + + new Setting(containerEl) + .setName(t.settings.editorMakePlacholder.name) + .setDesc(t.settings.editorMakePlacholder.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.makeMenuPlaceholder).onChange((value) => { + this.plugin.settings.makeMenuPlaceholder = value; + this.plugin.saveSettings(); + this.refreshView(); + }) + ); + + new Setting(containerEl) + .setName(t.settings.mobileMakeBar.name) + .setDesc(t.settings.mobileMakeBar.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.mobileMakeBar).onChange((value) => { + this.plugin.settings.mobileMakeBar = value; + this.plugin.saveSettings(); + this.refreshView(); + }) + ); + + new Setting(containerEl) + .setName(t.settings.inlineStyler.name) + .setDesc(t.settings.inlineStyler.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.inlineStyler).onChange((value) => { + this.plugin.settings.inlineStyler = value; + this.plugin.saveSettings(); + this.refreshView(); + }) + ); + new Setting(containerEl) + .setName(t.settings.inlineStylerColor.name) + .setDesc(t.settings.inlineStylerColor.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.inlineStylerColors).onChange((value) => { + this.plugin.settings.inlineStylerColors = value; + this.plugin.saveSettings(); + this.refreshView(); + }) + ); + new Setting(containerEl) + .setName(t.settings.editorMarkSans.name) + .setDesc(t.settings.editorMarkSans.desc) + .addToggle((toggle) => + toggle.setValue(this.plugin.settings.markSans).onChange((value) => { + this.plugin.settings.markSans = value; + this.plugin.saveSettings(); + this.refreshView(); + }) + ); + + } +} diff --git a/src/types/make.d.ts b/src/types/make.d.ts new file mode 100644 index 0000000..38091f4 --- /dev/null +++ b/src/types/make.d.ts @@ -0,0 +1,9 @@ +import MakeMDPlugin from "main"; + +export {}; + +declare global { + interface Window { + make: MakeMDPlugin; + } +} \ No newline at end of file diff --git a/src/types/obsidian.d.ts b/src/types/obsidian.d.ts new file mode 100644 index 0000000..1d83548 --- /dev/null +++ b/src/types/obsidian.d.ts @@ -0,0 +1,110 @@ +import { FlowEditorParent } from "components/FlowEditor/FlowEditor"; +import { EditorView } from '@codemirror/view' + +declare module "obsidian" { + interface App { + commands: { + listCommands(): Command[], + findCommand(id: string): Command, + removeCommand(id: string): void, + executeCommandById(id: string): void, + commands: Record, + }, + mobileToolbar: { + containerEl: HTMLElement; + } + hotkeyManager: { + getHotkeys(id: string): Hotkey[], + getDefaultHotkeys(id: string): Hotkey[], + }, + internalPlugins: { + getPluginById(id: string): { instance: { options: { pinned: [] } } }, + } + } + + interface MetadataCache { + getCachedFiles(): string[], + getTags(): Record; + } + + class FileExplorerPlugin extends Plugin_2 { + revealInFolder(this: any, ...args: any[]): any; + } + + interface WorkspaceParent { + insertChild(index: number, child: WorkspaceItem, resize?: boolean): void; + replaceChild(index: number, child: WorkspaceItem, resize?: boolean): void; + removeChild(leaf: WorkspaceLeaf, resize?: boolean): void; + containerEl: HTMLElement; + } + +interface EmptyView extends View { + actionListEl: HTMLElement; + emptyTitleEl: HTMLElement; + } + + interface MousePos { + x: number; + y: number; + } + + interface EphemeralState { + focus?: boolean; + subpath?: string; + line?: number; + startLoc?: Loc; + endLoc?: Loc; + scroll?: number; + } +interface WorkspaceMobileDrawer { + currentTab: number; + children: WorkspaceLeaf[]; +} +interface WorkspaceRibbon { + orderedRibbonActions: any[]; +} +interface HoverPopover { + parent: FlowEditorParent | null; + targetEl: HTMLElement; + hoverEl: HTMLElement; + hide(): void; + show(): void; + shouldShowSelf(): boolean; + timer: number; + waitTime: number; + shouldShow(): boolean; + transition(): void; + } + interface Workspace { + recordHistory(leaf: WorkspaceLeaf, pushHistory: boolean): void; + iterateLeaves(callback: (item: WorkspaceLeaf) => boolean | void, item: WorkspaceItem | WorkspaceItem[]): boolean; + iterateLeaves(item: WorkspaceItem | WorkspaceItem[], callback: (item: WorkspaceLeaf) => boolean | void): boolean; + getDropLocation(event: MouseEvent): { + target: WorkspaceItem; + sidedock: boolean; + }; + recursiveGetTarget(event: MouseEvent, parent: WorkspaceParent): WorkspaceItem; + recordMostRecentOpenedFile(file: TFile): void; + onDragLeaf(event: MouseEvent, leaf: WorkspaceLeaf): void; + onLayoutChange(): void // tell Obsidian leaves have been added/removed/etc. + floatingSplit: WorkspaceSplit; + } +interface WorkspaceSplit { + children: any[]; +} + interface WorkspaceLeaf { + containerEl: HTMLElement; + tabHeaderInnerTitleEl: HTMLElement; + } + interface Editor { + cm: EditorView; + } + +interface View { + headerEl: HTMLDivElement; +} + + interface EditorSuggest { + suggestEl: HTMLElement; + } +} \ No newline at end of file diff --git a/src/types/types.ts b/src/types/types.ts new file mode 100644 index 0000000..fae3954 --- /dev/null +++ b/src/types/types.ts @@ -0,0 +1,86 @@ +import { TFolder, TFile } from 'obsidian'; +import { UniqueIdentifier } from "@dnd-kit/core"; + +export interface SectionTree { + section: string; + children: string[]; + collapsed: boolean; +} + + +export interface StringTree { + node: string + children: StringTree[] + isFolder: boolean +} + +export interface StringTreePath extends StringTree { + path: string +} + +export interface FolderTree extends TFolder { + id: UniqueIdentifier; + isFolder: boolean +} + +export interface FlattenedTreeNode extends FolderTree { + parentId: UniqueIdentifier | null; + depth: number; + index: number; + section: number; + } + + +export const eventTypes = { + activeFileChange: 'mkmd-active-file-change', + refreshView: 'mkmd-refresh-view', + revealFile: 'mkmd-reveal-file', + vaultChange: 'mkmd-vault-change', + updateSections: 'mkmd-update-sections', + settingsChanged: 'mkmd-settings-changed', + spawnPortal: 'mkmd-portal-spawn', + openFilePortal: 'mkmd-portal-file', + focusPortal: 'mkmd-portal-focus', +}; + +export type VaultChange = 'create' | 'delete' | 'rename' | 'modify' | 'collapse'; +export type PortalType = 'none' | 'doc' | 'block' | 'callout' | 'flow'; + +export class CustomVaultChangeEvent extends Event { + detail: { + file: TFile; + changeType: VaultChange; + oldPath: string; + }; +} + +export class SpawnPortalEvent extends Event { + detail: { + el: HTMLElement; + file: string; + from?: number; + to?: number; + type: PortalType; + id: string; + }; +} + +export class OpenFilePortalEvent extends Event { + detail: { + file: string; + source: string; + }; +} + +export class FocusPortalEvent extends Event { + detail: { + id: string; + parent: boolean; + top: boolean; + }; +} + +export type TransactionRange = { + from: number; + to: number; +} \ No newline at end of file diff --git a/src/utils/autosizer.tsx b/src/utils/autosizer.tsx new file mode 100644 index 0000000..d0ba016 --- /dev/null +++ b/src/utils/autosizer.tsx @@ -0,0 +1,195 @@ + +import * as React from 'react'; +import createDetectElementResize from './detectElementResize'; +//fixed autosizer offscreen scroll bug +type Size = { + height: number, + width: number, +}; + +type Props = { + /** Function responsible for rendering children.*/ + children: (size: Size) => JSX.Element, + + /** Optional custom CSS class name to attach to root AutoSizer element. */ + className?: string, + + /** Default height to use for initial render; useful for SSR */ + defaultHeight?: number, + + /** Default width to use for initial render; useful for SSR */ + defaultWidth?: number, + + /** Disable dynamic :height property */ + disableHeight: boolean, + + /** Disable dynamic :width property */ + disableWidth: boolean, + + /** Nonce of the inlined stylesheet for Content Security Policy */ + nonce?: string, + + /** Callback to be invoked on-resize */ + onResize: (size: Size) => void, + + /** Optional inline style */ + style?: React.CSSProperties, +}; + +type State = { + height: number, + width: number, +}; + +type ResizeHandler = (element: HTMLElement, onResize: () => void) => void; + +type DetectElementResize = { + addResizeListener: ResizeHandler, + removeResizeListener: ResizeHandler, +}; + +export default class AutoSizer extends React.PureComponent { + static defaultProps = { + onResize: () => {}, + disableHeight: false, + disableWidth: false, + style: {}, + }; + + state = { + height: this.props.defaultHeight || 0, + width: this.props.defaultWidth || 0, + }; + + _parentNode?: HTMLElement; + _autoSizer?: HTMLElement; + _detectElementResize: DetectElementResize; + + _onResize = () => { + const { disableHeight, disableWidth, onResize } = this.props; + + if (this._parentNode) { + // Guard against AutoSizer component being removed from the DOM immediately after being added. + // This can result in invalid style values which can result in NaN values if we don't handle them. + // See issue #150 for more context. + + const height = this._parentNode.offsetHeight || 0; + const width = this._parentNode.offsetWidth || 0; + + const style = window.getComputedStyle(this._parentNode) || {} as CSSStyleDeclaration; + const paddingLeft = parseInt(style.paddingLeft, 10) || 0; + const paddingRight = parseInt(style.paddingRight, 10) || 0; + const paddingTop = parseInt(style.paddingTop, 10) || 0; + const paddingBottom = parseInt(style.paddingBottom, 10) || 0; + + const newHeight = height - paddingTop - paddingBottom; + const newWidth = width - paddingLeft - paddingRight; + if (height == 0 || width == 0) { + return; + } + if ( + (!disableHeight && this.state.height !== newHeight) || + (!disableWidth && this.state.width !== newWidth) + ) { + this.setState({ + height: height - paddingTop - paddingBottom, + width: width - paddingLeft - paddingRight, + }); + + onResize({ height, width }); + } + } + }; + + _setRef = (autoSizer?: HTMLElement) => { + this._autoSizer = autoSizer; + }; + + componentDidMount() { + const { nonce } = this.props; + if ( + this._autoSizer && + this._autoSizer.parentNode && + this._autoSizer.parentNode.ownerDocument && + this._autoSizer.parentNode.ownerDocument.defaultView && + this._autoSizer.parentNode instanceof + this._autoSizer.parentNode.ownerDocument.defaultView.HTMLElement + ) { + // Delay access of parentNode until mount. + // This handles edge-cases where the component has already been unmounted before its ref has been set, + // As well as libraries like react-lite which have a slightly different lifecycle. + this._parentNode = this._autoSizer.parentNode; + + // Defer requiring resize handler in order to support server-side rendering. + // See issue #41 + this._detectElementResize = createDetectElementResize(nonce); + this._detectElementResize.addResizeListener( + this._parentNode, + this._onResize + ); + + this._onResize(); + } + } + + componentWillUnmount() { + if (this._detectElementResize && this._parentNode) { + this._detectElementResize.removeResizeListener( + this._parentNode, + this._onResize + ); + } + } + + render() { + const { + children, + className, + disableHeight, + disableWidth, + style, + } = this.props; + const { height, width } = this.state; + + // Outer div should not force width/height since that may prevent containers from shrinking. + // Inner component should overflow and use calculated width/height. + // See issue #68 for more information. + const outerStyle: React.CSSProperties = { overflow: 'visible' }; + const childParams: Size = {} as Size; + + // Avoid rendering children before the initial measurements have been collected. + // At best this would just be wasting cycles. + let bailoutOnChildren = false; + + if (!disableHeight) { + if (height === 0) { + bailoutOnChildren = true; + } + outerStyle.height = 0; + childParams.height = height; + } + + if (!disableWidth) { + if (width === 0) { + bailoutOnChildren = true; + } + outerStyle.width = 0; + childParams.width = width; + } + + return ( +
+ {!bailoutOnChildren && children(childParams)} +
+ ); + } + + +} \ No newline at end of file diff --git a/src/utils/codemirror.ts b/src/utils/codemirror.ts new file mode 100644 index 0000000..ea8a06b --- /dev/null +++ b/src/utils/codemirror.ts @@ -0,0 +1,83 @@ +import { Decoration, EditorView } from '@codemirror/view'; +import {EditorState} from '@codemirror/state' +import { foldedRanges, syntaxTree } from '@codemirror/language'; +import { SyntaxNodeRef } from '@lezer/common'; +import { TransactionRange } from 'types/types'; +import { MarkdownView, WorkspaceLeaf } from 'obsidian'; + +export const getActiveCM = () : EditorView | undefined => { + let rcm : EditorView; + app.workspace.iterateLeaves((leaf) => { + const cm = (leaf.view as MarkdownView).editor?.cm + if (cm.hasFocus) { + rcm = cm; + return true; + } + }, app.workspace["rootSplit"]!) + return rcm; +} + +export const getActiveMarkdownView = () : MarkdownView | undefined => { + let rv : MarkdownView; + app.workspace.iterateLeaves((leaf) => { + const cm = (leaf.view as MarkdownView).editor?.cm + if (cm.hasFocus) { + rv = (leaf.view as MarkdownView); + return true; + } + }, app.workspace["rootSplit"]!) + return rv; +} + + +export function iterateTreeInVisibleRanges( + view: EditorView, + iterateFns: { + enter(node: SyntaxNodeRef): boolean | void; + leave?(node: SyntaxNodeRef): void; + } +) { + for (const { from, to } of view.visibleRanges) { + syntaxTree(view.state).iterate({ ...iterateFns, from, to }); + } +} + +//optimize with resolve later... +export function iterateTreeAtPos( + pos: number, + state: EditorState, + iterateFns: { + enter(node: SyntaxNodeRef): boolean | void; + leave?(node: SyntaxNodeRef): void; + } +) { + syntaxTree(state).iterate({ ...iterateFns, from: pos, to: pos }); +} + +export function iterateTreeInSelection( + selection: TransactionRange, + state: EditorState, + iterateFns: { + enter(node: SyntaxNodeRef): boolean | void; + leave?(node: SyntaxNodeRef): void; + } +) { + syntaxTree(state).iterate({ ...iterateFns, from: selection.from, to: selection.to }); +} + +export function iterateTreeInDocument( + state: EditorState, + iterateFns: { + enter(node: SyntaxNodeRef): boolean | void; + leave?(node: SyntaxNodeRef): void; + } +) { + syntaxTree(state).iterate({ ...iterateFns }); +} + +export function checkRangeOverlap( + range1: [number, number], + range2: [number, number] +) { + return range1[0] <= range2[1] && range2[0] <= range1[1]; +} \ No newline at end of file diff --git a/src/utils/detectElementResize.js b/src/utils/detectElementResize.js new file mode 100644 index 0000000..2810fc6 --- /dev/null +++ b/src/utils/detectElementResize.js @@ -0,0 +1,282 @@ +/** + * Detect Element Resize. + * https://github.com/sdecima/javascript-detect-element-resize + * Sebastian Decima + * + * Forked from version 0.5.3; includes the following modifications: + * 1) Guard against unsafe 'window' and 'document' references (to support SSR). + * 2) Defer initialization code via a top-level function wrapper (to support SSR). + * 3) Avoid unnecessary reflows by not measuring size for scroll events bubbling from children. + * 4) Add nonce for style element. + **/ + +// Check `document` and `window` in case of server-side rendering +let windowObject; +if (typeof window !== 'undefined') { + windowObject = window; + + // eslint-disable-next-line no-restricted-globals +} else if (typeof self !== 'undefined') { + // eslint-disable-next-line no-restricted-globals + windowObject = self; +} else { + windowObject = global; +} + +let cancelFrame = null; +let requestFrame = null; + +const TIMEOUT_DURATION = 20; + +const clearTimeoutFn = windowObject.clearTimeout; +const setTimeoutFn = windowObject.setTimeout; + +const cancelAnimationFrameFn = + windowObject.cancelAnimationFrame || + windowObject.mozCancelAnimationFrame || + windowObject.webkitCancelAnimationFrame; + +const requestAnimationFrameFn = + windowObject.requestAnimationFrame || + windowObject.mozRequestAnimationFrame || + windowObject.webkitRequestAnimationFrame; + +if (cancelAnimationFrameFn == null || requestAnimationFrameFn == null) { + // For environments that don't support animation frame, + // fallback to a setTimeout based approach. + cancelFrame = clearTimeoutFn; + requestFrame = function requestAnimationFrameViaSetTimeout(callback) { + return setTimeoutFn(callback, TIMEOUT_DURATION); + }; +} else { + // Counter intuitively, environments that support animation frames can be trickier. + // Chrome's "Throttle non-visible cross-origin iframes" flag can prevent rAFs from being called. + // In this case, we should fallback to a setTimeout() implementation. + cancelFrame = function cancelFrame([animationFrameID, timeoutID]) { + cancelAnimationFrameFn(animationFrameID); + clearTimeoutFn(timeoutID); + }; + requestFrame = function requestAnimationFrameWithSetTimeoutFallback( + callback + ) { + const animationFrameID = requestAnimationFrameFn( + function animationFrameCallback() { + clearTimeoutFn(timeoutID); + callback(); + } + ); + + const timeoutID = setTimeoutFn(function timeoutCallback() { + cancelAnimationFrameFn(animationFrameID); + callback(); + }, TIMEOUT_DURATION); + + return [animationFrameID, timeoutID]; + }; +} + +export default function createDetectElementResize(nonce) { + let animationKeyframes; + let animationName; + let animationStartEvent; + let animationStyle; + let checkTriggers; + let resetTriggers; + let scrollListener; + + const attachEvent = typeof document !== 'undefined' && document.attachEvent; + if (!attachEvent) { + resetTriggers = function(element) { + const triggers = element.__resizeTriggers__, + expand = triggers.firstElementChild, + contract = triggers.lastElementChild, + expandChild = expand.firstElementChild; + contract.scrollLeft = contract.scrollWidth; + contract.scrollTop = contract.scrollHeight; + expandChild.style.width = expand.offsetWidth + 1 + 'px'; + expandChild.style.height = expand.offsetHeight + 1 + 'px'; + expand.scrollLeft = expand.scrollWidth; + expand.scrollTop = expand.scrollHeight; + }; + + checkTriggers = function(element) { + return ( + element.offsetWidth !== element.__resizeLast__.width || + element.offsetHeight !== element.__resizeLast__.height + ); + }; + + scrollListener = function(e) { + // Don't measure (which forces) reflow for scrolls that happen inside of children! + if ( + e.target.className && + typeof e.target.className.indexOf === 'function' && + e.target.className.indexOf('contract-trigger') < 0 && + e.target.className.indexOf('expand-trigger') < 0 + ) { + return; + } + + const element = this; + resetTriggers(this); + if (this.__resizeRAF__) { + cancelFrame(this.__resizeRAF__); + } + this.__resizeRAF__ = requestFrame(function animationFrame() { + if (checkTriggers(element)) { + element.__resizeLast__.width = element.offsetWidth; + element.__resizeLast__.height = element.offsetHeight; + element.__resizeListeners__.forEach(function forEachResizeListener( + fn + ) { + fn.call(element, e); + }); + } + }); + }; + + /* Detect CSS Animations support to detect element display/re-attach */ + let animation = false; + let keyframeprefix = ''; + animationStartEvent = 'animationstart'; + const domPrefixes = 'Webkit Moz O ms'.split(' '); + let startEvents = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split( + ' ' + ); + let pfx = ''; + { + const elm = document.createElement('fakeelement'); + if (elm.style.animationName !== undefined) { + animation = true; + } + + if (animation === false) { + for (let i = 0; i < domPrefixes.length; i++) { + if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) { + pfx = domPrefixes[i]; + keyframeprefix = '-' + pfx.toLowerCase() + '-'; + animationStartEvent = startEvents[i]; + animation = true; + break; + } + } + } + } + + animationName = 'resizeanim'; + animationKeyframes = + '@' + + keyframeprefix + + 'keyframes ' + + animationName + + ' { from { opacity: 0; } to { opacity: 0; } } '; + animationStyle = keyframeprefix + 'animation: 1ms ' + animationName + '; '; + } + + const createStyles = function(doc) { + if (!doc.getElementById('detectElementResize')) { + //opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360 + const css = + (animationKeyframes ? animationKeyframes : '') + + '.resize-triggers { ' + + (animationStyle ? animationStyle : '') + + 'visibility: hidden; opacity: 0; } ' + + '.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: " "; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; z-index: -1; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }', + head = doc.head || doc.getElementsByTagName('head')[0], + style = doc.createElement('style'); + + style.id = 'detectElementResize'; + style.type = 'text/css'; + + if (nonce != null) { + style.setAttribute('nonce', nonce); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(doc.createTextNode(css)); + } + + head.appendChild(style); + } + }; + + const addResizeListener = function(element, fn) { + if (attachEvent) { + element.attachEvent('onresize', fn); + } else { + if (!element.__resizeTriggers__) { + const doc = element.ownerDocument; + const elementStyle = windowObject.getComputedStyle(element); + if (elementStyle && elementStyle.position === 'static') { + element.style.position = 'relative'; + } + createStyles(doc); + element.__resizeLast__ = {}; + element.__resizeListeners__ = []; + (element.__resizeTriggers__ = doc.createElement('div')).className = + 'resize-triggers'; + const expandTrigger = doc.createElement('div'); + expandTrigger.className = 'expand-trigger'; + expandTrigger.appendChild(doc.createElement('div')); + const contractTrigger = doc.createElement('div'); + contractTrigger.className = 'contract-trigger'; + element.__resizeTriggers__.appendChild(expandTrigger); + element.__resizeTriggers__.appendChild(contractTrigger); + element.appendChild(element.__resizeTriggers__); + resetTriggers(element); + element.addEventListener('scroll', scrollListener, true); + + /* Listen for a css animation to detect element display/re-attach */ + if (animationStartEvent) { + element.__resizeTriggers__.__animationListener__ = function animationListener( + e + ) { + if (e.animationName === animationName) { + resetTriggers(element); + } + }; + element.__resizeTriggers__.addEventListener( + animationStartEvent, + element.__resizeTriggers__.__animationListener__ + ); + } + } + element.__resizeListeners__.push(fn); + } + }; + + const removeResizeListener = function(element, fn) { + if (attachEvent) { + element.detachEvent('onresize', fn); + } else { + element.__resizeListeners__.splice( + element.__resizeListeners__.indexOf(fn), + 1 + ); + if (!element.__resizeListeners__.length) { + element.removeEventListener('scroll', scrollListener, true); + if (element.__resizeTriggers__.__animationListener__) { + element.__resizeTriggers__.removeEventListener( + animationStartEvent, + element.__resizeTriggers__.__animationListener__ + ); + element.__resizeTriggers__.__animationListener__ = null; + } + try { + element.__resizeTriggers__ = !element.removeChild( + element.__resizeTriggers__ + ); + } catch (e) { + // Preact compat; see developit/preact-compat/issues/228 + } + } + } + }; + + return { + addResizeListener, + removeResizeListener, + }; +} \ No newline at end of file diff --git a/src/utils/flowEditor.ts b/src/utils/flowEditor.ts new file mode 100644 index 0000000..7aec815 --- /dev/null +++ b/src/utils/flowEditor.ts @@ -0,0 +1,273 @@ +import { calloutField, CalloutInfo, flowIDAnnotation, flowIDStateField, flowTypeStateField, portalTypeAnnotation } from "cm-extensions/markSans/callout"; +import { cacheFlowEditorHeight, flowEditorInfo, FlowEditorInfo } from "cm-extensions/flowEditor/flowEditor"; +import { createFlowEditorInElement } from "dispatch/flowDispatch"; +import { App, Editor, TFile, WorkspaceLeaf } from "obsidian"; +import { EditorView } from '@codemirror/view' +import { EditorSelection } from '@codemirror/state' +import { editableRange, lineRangeToPosRange, selectiveLinesFacet } from "cm-extensions/flowEditor/selectiveEditor"; +import MakeMDPlugin from "main"; +import { FlowEditor, FlowEditorParent } from "components/FlowEditor/FlowEditor"; +import { FocusPortalEvent, OpenFilePortalEvent, SpawnPortalEvent } from "types/types"; +import { createNewMarkdownFile, openFile } from "./utils"; +import { arrowKeyAnnotation } from "cm-extensions/flowEditor/atomic"; +import t from 'i18n' + +const parseOutReferences = (ostr: string) : [string, string | undefined] => { + const str = ostr.split('|')[0] + const refIndex = str.lastIndexOf('#'); + return refIndex != -1 ? [str.substring(0, refIndex), str.substring(refIndex+1)] : [str, undefined] + } + + export const getFileFromString = (url: string, source: string) => { + return app.metadataCache.getFirstLinkpathDest(url, source); + } + + const getLineRangeFromRef = (file: TFile, ref: string | undefined, app: App) : [number | undefined, number | undefined] => { + + if (!ref) { + return [undefined, undefined]; + } + const cache = app.metadataCache.getFileCache(file); + const headings = cache.headings + const blocks = cache.blocks; + const sections = cache.sections; + if (blocks && ref.charAt(0) == '^' && blocks[ref.substring(1)]) { + return [blocks[ref.substring(1)].position.start.line+1, blocks[ref.substring(1)].position.end.line+1] + } + const heading = headings?.find(f => f.heading.replace('#', ' ') == ref) + if (heading) + { + const index = headings.findIndex(f => f.heading == heading.heading); + const level = headings[index]?.level + const nextIndex = headings.findIndex((f, i) => i > index && f.level <= level) + + if (index < headings.length-1 && nextIndex != -1) { + return [heading.position.start.line+2, headings[nextIndex].position.end.line] + } + return [heading.position.start.line+2, sections[sections.length-1].position.end.line+1] + } + return [undefined, undefined]; + } + + + + export const loadFlowEditorByDOM = (el: HTMLElement, view: EditorView, id: string) => { + setTimeout(async () => { + //wait for el to be attached to the displayed document + let counter = 0; + while(!el.parentElement && counter++<=50) await sleep(50); + if(!el.parentElement) return; + + + let dom: HTMLElement = el; + while ( + (!dom.hasClass("mk-floweditor") && !dom.hasClass("workspace")) && + dom.parentElement + ) { + + dom = dom.parentElement; + } + + if (!dom.hasClass("mk-floweditor") && !dom.hasClass("workspace")) { + return; + } + setTimeout(async () => { + //wait for el to be attached to the displayed document + let counter = 0; + while(!dom.parentElement && counter++<=50) await sleep(50); + if(!dom.parentElement) return; + + + app.workspace.iterateLeaves((leaf) => { + //@ts-ignore + const cm = leaf.view.editor?.cm as EditorView + if (cm && view.dom == cm.dom) { + loadFlowEditorsForLeafForID(cm, leaf, app, id) + } + }, app.workspace["rootSplit"]!) + + }); + }); + + } + export const loadFlowEditorsForLeafForID = (cm: EditorView, leaf: WorkspaceLeaf, app: App, id: string) => { + const stateField = cm.state.field(flowEditorInfo, false); + if (!stateField) + return; + const flowInfo = stateField.find(f => f.id == id) + if (flowInfo && flowInfo.expandedState == 2) { + loadFlowEditor(cm, flowInfo, leaf, app) + } + } + + export const loadFlowEditorsForLeaf = (cm: EditorView, leaf: WorkspaceLeaf, app: App) => { + const stateField = cm.state.field(flowEditorInfo, false); + if (!stateField) + return; + for (let flowInfo of stateField) { + if (flowInfo.expandedState == 2 && flowInfo.embed <= 1) { + loadFlowEditor(cm, flowInfo, leaf, app) + } + } + } + +export const loadFlowEditor = (cm: EditorView, flowEditorInfo: FlowEditorInfo, leaf: WorkspaceLeaf, app: App) => { + const dom = cm.dom.querySelector('#mk-flow-'+flowEditorInfo.id) as HTMLElement; + const [link, ref] = parseOutReferences(flowEditorInfo.link); + //@ts-ignore + const source = leaf.view.file?.path; + const file = getFileFromString(link, source) + if (dom) { + if (file) { + const selectiveRange = getLineRangeFromRef(file, ref, app); + if (!dom.hasAttribute("ready")) { + // dom.empty(); + dom.setAttribute("ready",""); + createFlowEditorInElement(flowEditorInfo.id, dom, ref ? 'block' : 'flow', file.path, selectiveRange[0], selectiveRange[1]) + } + } else { + dom.empty(); + const createDiv = dom.createDiv('file-embed'); + createDiv.toggleClass('mod-empty', true); + const createFile = async (e: MouseEvent) => { + e.stopPropagation(); + e.stopImmediatePropagation(); + //@ts-ignore + await app.fileManager.createNewMarkdownFile(app.vault.getRoot(), link); + loadFlowEditor(cm, flowEditorInfo, leaf, app); + } + createDiv.setText(`"${link}" `+t.labels.noFile); + createDiv.addEventListener('click', createFile); + + } + } +} + +export const focusPortal = async(plugin: MakeMDPlugin, evt: FocusPortalEvent) =>{ + const {id, parent, top} = evt.detail; + if (parent) { + app.workspace.iterateLeaves((leaf) => { + //@ts-ignore + const cm = leaf.view.editor?.cm as EditorView + if (cm) { + const stateField = cm.state.field(flowEditorInfo, false); + if (stateField) { + const foundInfo = stateField.find(f => f.id == id); + if(foundInfo){ + cm.focus(); + if (top) { + cm.dispatch({ + selection: EditorSelection.single(foundInfo.from-4), + annotations: arrowKeyAnnotation.of(1) + }) + } else { + if (foundInfo.to+2 == cm.state.doc.length) { + + cm.dispatch({ + changes: [{from: foundInfo.to+2, to: foundInfo.to+2, insert: cm.state.lineBreak}], + selection: EditorSelection.single(foundInfo.to+3), + annotations: arrowKeyAnnotation.of(2) + }) + } else { + cm.dispatch({ + selection: EditorSelection.single(foundInfo.to+3), + annotations: arrowKeyAnnotation.of(2) + }) + } + } + + } + } + } + }, app.workspace["rootSplit"]!) + } else { + app.workspace.iterateLeaves((leaf) => { + //@ts-ignore + const cm = leaf.view.editor?.cm as EditorView + if (cm) { + const stateField = cm.state.field(flowIDStateField, false); + if (stateField && stateField == id) { + cm.focus(); + const lineRange = cm.state.field(selectiveLinesFacet, false) + const posRange = lineRange && lineRange[0] != undefined ? lineRangeToPosRange(cm.state, lineRange) : { from: 0, to: cm.state.doc.length}; + if (top) { + cm.dispatch({ + selection: EditorSelection.single(posRange.from), + }) + } else { + + cm.dispatch({ + selection: EditorSelection.single(posRange.to), + }) + } + + } + } + }, app.workspace["rootSplit"]!) + + + } + + } + + export const openFileFromPortal = (plugin: MakeMDPlugin, evt: OpenFilePortalEvent) => { + const {file: fullLink, source} = evt.detail; + const [link, ref] = parseOutReferences(fullLink); + const file = getFileFromString(link, source) + //@ts-ignore + openFile({...file, isFolder: false}, plugin.app, false); + } + +export const spawnNewPortal = async(plugin: MakeMDPlugin, evt: SpawnPortalEvent) =>{ + const {file, el, from, to} = evt.detail; + let portalFile = plugin.app.vault.getAbstractFileByPath(file); + const newLeaf = spawnPortal(plugin, el, !from && portalFile.name); + await newLeaf.openFile(portalFile as TFile); + //@ts-ignore + const view = newLeaf.view.editor?.cm as EditorView; + view.dispatch({ + annotations: [portalTypeAnnotation.of(evt.detail.type), flowIDAnnotation.of(evt.detail.id)] + }) + view.dom.addEventListener('keydown', (e) => { + if (e.key == 'ArrowUp') { + if (e.metaKey == true) { + view.dispatch({ + annotations: arrowKeyAnnotation.of(3) + }) + } else { + view.dispatch({ + annotations: arrowKeyAnnotation.of(1) + }) + } + + } + if (e.key == 'ArrowDown') { + if (e.metaKey == true) { + view.dispatch({ + annotations: arrowKeyAnnotation.of(4) + }) + } else { + view.dispatch({ + annotations: arrowKeyAnnotation.of(2) + }) + } + } + }) + if (from && to) { + //@ts-ignore + newLeaf.view.editor?.cm.dispatch({ + annotations: [editableRange.of([from, to])] + }) + } + } + + export const spawnPortal = (plugin: MakeMDPlugin, initiatingEl?: HTMLElement, fileName?: string, onShowCallback?: () => unknown): WorkspaceLeaf => { + const parent = plugin.app.workspace.activeLeaf as unknown as FlowEditorParent; + if (!initiatingEl) initiatingEl = parent.containerEl; + const hoverPopover = new FlowEditor(parent, initiatingEl!, plugin, undefined, onShowCallback); + // plugin.attachPortal(hoverPopover); + if (fileName) + hoverPopover.titleEl.textContent = fileName.substring(0, fileName.lastIndexOf('.'));; + return hoverPopover.attachLeaf(); + + } \ No newline at end of file diff --git a/src/utils/icons.ts b/src/utils/icons.ts new file mode 100644 index 0000000..7215a40 --- /dev/null +++ b/src/utils/icons.ts @@ -0,0 +1,191 @@ + +//DONT USE ADDICON FROM OBSIDIAN, NO SVG ATTRS +export const uiIconSet: Record = { + 'mk-ui-close': ` + + `, + 'mk-ui-flow-hover': ` + + `, + 'mk-ui-folder': ` + + `, + 'mk-ui-open-link': ` + + `, + 'mk-ui-file': ` + +`, +'mk-ui-expand': ` + +`, +'mk-ui-new-folder': ``, +'mk-ui-new-note': ``, +'mk-ui-collapse': ` + +`, +'mk-ui-options': ` + +`, +'mk-ui-plus': ` + +`, +'mk-ui-collapse-sm': ` + +` +} + +export const makeIconSet: Record = { + 'mk-make-todo': ` + + + + `, + 'mk-make-list': ` + + + + + + + + `, + 'mk-make-ordered': ` + + + + + + + + `, + 'mk-make-h1': ` + + + + `, + 'mk-make-h2': ` + + + + `, + 'mk-make-h3': ` + + + + `, + 'mk-make-quote': ` + + + + + + `, + 'mk-make-hr': ` + + + `, + 'mk-make-link': ` + + + `, + 'mk-make-image': ` + + + + + + `, + 'mk-make-codeblock': ` + + + + + `, + 'mk-make-callout': ` + + + + `, + 'mk-make-note': ` + + + + + + `, + 'mk-make-flow': ` + + + `, + 'mk-make-tag': ` + + + ` + +} + +export const mkLogo = ` + + +` + +export const markIconSet : Record = { + 'mk-mark-strong': ` + + + `, + 'mk-mark-em': ` + + `, + 'mk-mark-strikethrough': ` + + + + `, + 'mk-mark-code': ` + + + + + `, + 'mk-mark-link': ` + + `, + 'mk-mark-blocklink': ` + + + + + `, + 'mk-mark-highlight': ` + + + + + + `, + 'mk-make-attach': ` + + + + + `, + 'mk-make-keyboard': ` + + + +`, +'mk-make-slash': ` + + + +`, +'mk-make-style': ` + +`, +'mk-mark-color': ` + + +` + } diff --git a/src/utils/markdownPost.tsx b/src/utils/markdownPost.tsx new file mode 100644 index 0000000..172027e --- /dev/null +++ b/src/utils/markdownPost.tsx @@ -0,0 +1,96 @@ +import { openFileFlowEditor } from 'dispatch/flowDispatch'; +import { FlowEditorHover } from 'components/FlowEditor/FlowEditorHover'; +import { MarkdownPostProcessorContext } from 'obsidian'; +import { EditorView } from '@codemirror/view' +import React from 'react' +import { createRoot } from 'react-dom/client'; +import { iterateTreeInSelection } from './codemirror'; +import { flowTypeStateField } from 'cm-extensions/markSans/callout'; + +const getCMFromElement = (el: HTMLElement) : EditorView | undefined => { + let dom: HTMLElement = el; + while ( + !dom.hasClass("cm-editor") && + dom.parentElement + ) { + dom = dom.parentElement; + } + + if (!dom.hasClass("cm-editor")) { + return; + } + let rcm : EditorView; + app.workspace.iterateLeaves((leaf) => { + //@ts-ignore + const cm = leaf.view.editor?.cm as EditorView + if (cm && dom == cm.dom) { + rcm = cm; + return true; + } + }, app.workspace["rootSplit"]!) + return rcm; +} +export const replaceAllEmbed = (el: HTMLElement, ctx: MarkdownPostProcessorContext) => { + let dom: HTMLElement = el; + setTimeout(async () => { + //wait for el to be attached to the displayed document + let counter = 0; + while(!el.parentElement && counter++<=50) await sleep(50); + if(!el.parentElement) return; + + while ( + !dom.hasClass("markdown-embed") && + dom.parentElement + ) { + + dom = dom.parentElement; + } + if (dom) { + var nodes = dom.querySelectorAll('.markdown-embed-link'); + for(var i = 0; i < nodes.length; i++){ + if(nodes[i].parentNode === dom){ + dom.removeChild(nodes[i]); + const div = dom.createDiv('mk-floweditor-selector') + const reactEl = createRoot(div); + + // const flowType = cm.state.field(flowTypeStateField, false); + //@ts-ignore + reactEl.render( { + const cm : EditorView = getCMFromElement(dom); + const pos = cm.posAtDOM(dom) + iterateTreeInSelection({from: pos-3, to:pos+4}, cm.state, { + enter: (node) => { + if (node.name.contains('hmd-internal-link')) { + if (cm.state.sliceDoc(node.from-4, node.from-3) != '!') { + if (cm.state.sliceDoc(node.to+2, node.to+3) != cm.state.lineBreak) { + cm.dispatch({ + changes: [{ + from: node.from-3, to: node.from-3, insert: '!' + }, { + from: node.to+2, to: node.to+2, insert: cm.state.lineBreak + } + ] + }) + } else { + cm.dispatch({ + changes: { + from: node.from-3, to: node.from-3, insert: '!' + } + }); + } + } + } + } + }) + + e.stopPropagation(); + }} openLink={(e) => { + e.stopPropagation(); + openFileFlowEditor(ctx.sourcePath, '/'); + }} + >) + }; + } + } +}); +} \ No newline at end of file diff --git a/src/utils/patches.ts b/src/utils/patches.ts new file mode 100644 index 0000000..f52eb4c --- /dev/null +++ b/src/utils/patches.ts @@ -0,0 +1,139 @@ +import { FILE_TREE_VIEW_TYPE } from "components/Spaces/FileTreeView"; +import { FlowEditor } from "components/FlowEditor/FlowEditor"; +import MakeMDPlugin from "main"; +import { around } from "monkey-around"; +import { EphemeralState, ViewState, Workspace, WorkspaceContainer, WorkspaceItem, WorkspaceLeaf } from "obsidian"; + +export const patchFileExplorer = (plugin: MakeMDPlugin) => { + + plugin.register(around(Workspace.prototype, { + getLeavesOfType(old) { + return function(type: unknown) { + if (type == 'file-explorer') { + + return old.call(this, FILE_TREE_VIEW_TYPE); + } + return old.call(this, type) + } + } + })); +} + +export const patchWorkspace = (plugin: MakeMDPlugin) => { + let layoutChanging = false; + const uninstaller = around(Workspace.prototype, { + + changeLayout(old) { + return async function (workspace: unknown) { + layoutChanging = true; + try { + // Don't consider hover popovers part of the workspace while it's changing + await old.call(this, workspace); + } finally { + layoutChanging = false; + } + }; + }, + + iterateLeaves(old) { + type leafIterator = (item: WorkspaceLeaf) => boolean | void; + return function (arg1, arg2) { + // Fast exit if desired leaf found + if (old.call(this, arg1, arg2)) return true; + + // Handle old/new API parameter swap + let cb: leafIterator = (typeof arg1 === "function" ? arg1 : arg2) as leafIterator; + let parent: WorkspaceItem = (typeof arg1 === "function" ? arg2 : arg1) as WorkspaceItem; + + if (!parent) return false; // <- during app startup, rootSplit can be null + if (layoutChanging) return false; // Don't let HEs close during workspace change + + // 0.14.x doesn't have WorkspaceContainer; this can just be an instanceof check once 15.x is mandatory: + if (parent === app.workspace.rootSplit || (WorkspaceContainer && parent instanceof WorkspaceContainer)) { + for(const popover of FlowEditor.popoversForWindow((parent as WorkspaceContainer).win)) { + // Use old API here for compat w/0.14.x + if (old.call(this, cb, popover.rootSplit)) return true; + } + } + return false; + }; + }, + getDropLocation(old) { + return function getDropLocation(event: MouseEvent) { + for (const popover of FlowEditor.activePopovers()) { + const dropLoc = this.recursiveGetTarget(event, popover.rootSplit); + if (dropLoc) { + return dropLoc; + } + } + return old.call(this, event); + }; + }, + onDragLeaf(old) { + return function (event: MouseEvent, leaf: WorkspaceLeaf) { + const hoverPopover = FlowEditor.forLeaf(leaf); + return old.call(this, event, leaf); + }; + }, + }); + plugin.register(uninstaller); + } + export const patchWorkspaceLeaf = (plugin: MakeMDPlugin) => { + plugin.register( + around(WorkspaceLeaf.prototype, { + getRoot(old) { + return function () { + const top = old.call(this); + return top.getRoot === this.getRoot ? top : top.getRoot(); + }; + }, + onResize(old) { + return function () { + this.view?.onResize(); + }; + }, + setViewState(old) { + return async function (viewState: ViewState, eState?: unknown) { + const result = await old.call(this, viewState, eState); + try { + const he = FlowEditor.forLeaf(this); + if (he) { + if (viewState.type) he.hoverEl.setAttribute("data-active-view-type", viewState.type); + const titleEl = he.hoverEl.querySelector(".popover-title"); + if (titleEl) { + titleEl.textContent = this.view?.getDisplayText(); + if (this.view?.file?.path) { + titleEl.setAttribute("data-path", this.view.file.path); + } else { + titleEl.removeAttribute("data-path"); + } + } + } + } catch {} + return result; + }; + }, + setEphemeralState(old) { + return function (state: EphemeralState) { + old.call(this, state); + if (state.focus && this.view?.getViewType() === "empty") { + // Force empty (no-file) view to have focus so dialogs don't reset active pane + this.view.contentEl.tabIndex = -1; + this.view.contentEl.focus(); + } + }; + }, + }), + ); + plugin.register( + around(WorkspaceItem.prototype, { + getContainer(old) { + return function () { + if (!old) return; // 0.14.x doesn't have this + if (!this.parentSplit || this instanceof WorkspaceContainer) return old.call(this); + return this.parentSplit.getContainer(); + }; + }, + }) + ); + } \ No newline at end of file diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 0000000..d0e3de9 --- /dev/null +++ b/src/utils/utils.ts @@ -0,0 +1,427 @@ +import { TFile, TFolder, App, Keymap, Platform, TAbstractFile } from 'obsidian'; +import MakeMDPlugin from 'main'; +import { eventTypes, FlattenedTreeNode, FolderTree, StringTree, StringTreePath } from 'types/types'; +import { VaultChangeModal } from 'components/Spaces/modals'; +import { UniqueIdentifier } from '@dnd-kit/core'; +import { FlowView, FOLDER_VIEW_TYPE } from 'components/FlowView/FlowView'; + +export function buildTree(flattenedItems: FlattenedTreeNode[]): TFolder { + const root: TFolder = {...flattenedItems.find(f => f.id == '/'), children: [], isRoot: () => true} as TFolder; + const items = flattenedItems.map((item) => ({...item, children: []})); + + for (const item of items) { + const {id, children, vault, path, name, parent} = item; + const parentId = item.parentId ?? '/'; + const _parent = items.find(f => f.id == parentId) ?? items.find(f => f.id == '/'); + if (_parent) { + if (item.isFolder) { + _parent.children.push({children, vault, parent, path, name} as TFolder); + } else { + _parent.children.push({vault, parent, path, name} as TAbstractFile); + } + } + } + return { ...root, children: items.filter(f => f.parentId == '/').map(item => { + const {children, vault, path, name, parent} = item; + if (item.isFolder) { + return {children, vault, parent, path, name} as TFolder; + } else { + return {vault, parent, path, name} as TAbstractFile; + } + }) +} as TFolder; + } + + export const nodeIsAncestorOfTarget = (node: FlattenedTreeNode, target: FlattenedTreeNode) => { + const recursive = (_node: TFolder, _target: TFolder) : boolean => { + if (!_target.path) { + return false + } + if (_target.path == '/') + return false; + if (_target.parent.path == _node.path) + return true; + return recursive(_node, _target.parent); + } + return recursive(node, target) + } + +function getMaxDepth({previousItem}: {previousItem: FlattenedTreeNode}) { + + if (previousItem) { + if (previousItem.isFolder) + return previousItem.depth + 1; + return previousItem.depth; + } + + return 0; + } + + function getMinDepth({nextItem}: {nextItem: FlattenedTreeNode}) { + if (nextItem) { + return nextItem.depth; + } + + return 0; + } + + export function getDragDepth(offset: number, indentationWidth: number) { + return Math.round(offset / indentationWidth) + 1; + } + +export function getProjection( + items: FlattenedTreeNode[], + activeItem: FlattenedTreeNode, + overItemIndex: number, + previousItem: FlattenedTreeNode, + nextItem: FlattenedTreeNode, + dragDepth: number, + ) { + + + + const activeIsSection = activeItem.parentId == null; + const overIsSection = previousItem.parentId == null; + if (nodeIsAncestorOfTarget(activeItem, previousItem)) { + return null; + } + if (activeIsSection) { + if(overIsSection) { + return {depth: 0, maxDepth: 0, minDepth: 0, overId: previousItem.id, parentId: null}; + } + return null; + } + + if (activeItem.section != previousItem.section) { + + if (previousItem.section == -1) { + return null; + } + } + + const projectedDepth = dragDepth; + const maxDepth = getMaxDepth({ + previousItem, + }); + const minDepth = getMinDepth({nextItem}); + let depth = projectedDepth; + if (projectedDepth >= maxDepth) { + depth = maxDepth; + } else if (projectedDepth < minDepth) { + depth = minDepth; + } + if (previousItem.section != -1 && depth > 1) + { + return null; + } + return {depth, maxDepth, minDepth, overId: previousItem.id, parentId: getParentId()}; + + function getParentId() { + if (depth === 0 || !previousItem) { + return '/'; + } + + if (depth === previousItem.depth || (depth > previousItem.depth && !previousItem.isFolder)) { + return previousItem.parentId; + } + + if (depth > previousItem.depth) { + return previousItem.id; + } + + const newParent = items + .slice(0, overItemIndex) + .reverse() + .find((item) => item.depth === depth)?.parentId; + + return newParent ?? null; + } + } + +export const flattenTrees = ( + items: (TAbstractFile | TFolder)[], + section: string, + sectionIndex: number, + parentId: UniqueIdentifier | null = null, + depth = 0 + ): FlattenedTreeNode[] => { + return items.filter(f => f).reduce((acc, item, index) => { + const id = parentId+'/'+item.path + if ((item as any).children) { + + return [ + ...acc, + {...item, parentId, depth, section: sectionIndex, index, id, isFolder: true}, + ...(flattenTrees((item as any).children, section, sectionIndex, id, depth + 1)), + ] as FlattenedTreeNode[]; + } else { + + return [ + ...acc, + {...item, parentId, depth, section: sectionIndex, index, id: id, isFolder: false} + ] as FlattenedTreeNode[]; + } + }, []) as FlattenedTreeNode[]; + } + + export const flattenTree = (folder: TFolder, path: string, sectionIndex: number, collapsed: boolean) : FlattenedTreeNode[] => { + return [{ + ...folder, + id: folder.path, + parentId: null, + depth: 0, + index: 0, + section: -1, + isFolder: true, + } as FlattenedTreeNode, ...!collapsed ? flattenTrees(folder.children, path, sectionIndex, path, 1) : []] + } +// Helper Function to Create Folder Tree + +export function includeChildrenOf( + items: FlattenedTreeNode[], + ids: UniqueIdentifier[] + ) { + const excludeParentIds = items.filter(f => f.children?.length > 0 && !ids.find(i => i == f.id) && f.id != '/').map(f => f.id); + return items.filter((item) => { + if (item.parentId && excludeParentIds.includes(item.parentId)) { + if (item.children?.length) { + excludeParentIds.push(item.id); + } + return false; + } + + return true; + }); + } + +export const sortFolderTree = async (folderTree: TFolder, plugin: MakeMDPlugin) : Promise => { + + const stringTree = plugin.settings.folderRank; + const rawStringTree = folderTreeToStringTree(folderTree); + const newStringTree = mergeStringTree(stringTree, rawStringTree); + plugin.settings.folderRank = newStringTree; + + plugin.saveSettings(false); + + const sortedFolderTree = sortFolderTreeUsingStringTree(folderTree, newStringTree); + return sortedFolderTree; +} + +export const renamePathInStringTree = (oldPath: string, newFile: TAbstractFile, plugin: MakeMDPlugin) => { + const stringTree = plugin.settings.folderRank; + const newName = newFile.name; + const newPath = newFile.path; + const recursive = (tree: StringTree, path: string, oldS:string, newS:string) : StringTree => { + + if (path == oldS) { + return { + ...tree, + node: newS + } + } else if (!tree.isFolder) { + return tree; + } + return { + ...tree, + children: tree.children.map(f => recursive(f, path+'/'+f.node, oldS, newS)) + } + } + plugin.settings.fileIcons = plugin.settings.fileIcons.map(f => f[0] == oldPath ? [newPath, f[1]] : f); + plugin.settings.spaces = plugin.settings.spaces.map(f => {return {... f, children: f.children.map( + g => g == oldPath ? newPath : g + )}}); + + plugin.settings.folderRank = recursive(stringTree, '', '/'+oldPath, newName) + + plugin.saveSettings(); +} + +export const folderTreeToStringTree = (tree: TFolder) : StringTree => { + const recursive = (subtree: TAbstractFile) : StringTree => { + if ((subtree as any).children) { + return { + node: subtree.name, + children: (subtree as any).children.map((f: TAbstractFile) => recursive(f)), + isFolder: true + } + } else { + return { + node: subtree.name, + children: [], + isFolder: false + } + } + } + return recursive(tree); +} + +const reorderStringTree = (savedTrees: StringTree[], rawTrees: StringTree[]) : StringTree[] => { + //find missing trees in live not in cache and append + const missingTrees = rawTrees.filter((f => !savedTrees.find(g => f.node == g.node))) + const allTrees = [...savedTrees, ...missingTrees]; + //remove trees that are in cache but not in live + const filteredTrees = allTrees.filter((f => rawTrees.find(g => f.node == g.node))) + return filteredTrees; +} + +export const mergeStringTree = (savedTree: StringTree, rawTree: StringTree) : StringTree => { + const flattenSavedTree = (tree: StringTree) : StringTreePath[] => { + const treeReduce = (t: StringTree[], currPath: string) : StringTreePath[] => { + return t.reduce((p: StringTreePath[], c: StringTree) => { + return [...p, { + ...c, + path: currPath+'/'+c.node + }, ...treeReduce(c.children, currPath+'/'+c.node)]; + }, []) + } + return [ + {...tree, path: '/'}, + ...treeReduce(tree.children, '/')]; + } + const rankReferences = flattenSavedTree(savedTree); + + const recursive = (subtree: StringTree, treePaths: StringTreePath[], currPath: string) : StringTree => { + const existingTree : StringTreePath | undefined = treePaths.find(f => currPath == f.path) + + if (existingTree) { + return { + ...subtree, + children: reorderStringTree(existingTree.children, subtree.children).map(t => recursive(t, treePaths, currPath+'/'+t.node)) + } + } else { + return { + ...subtree, + children: subtree.children.map(t => recursive(t, treePaths, currPath+'/'+t.node)), + } + } + } + return recursive(rawTree, rankReferences, '/') +} + +export const sortFolderTreeUsingStringTree = (folderTree: TFolder, stringTree: StringTree) : TFolder => { + const recursiveSort = (file: TAbstractFile, strings: StringTree) : TAbstractFile | TFolder => { + if (file instanceof TFolder) { + return { + ...file, + children: file.children.map(f => { + + const currStringTree = strings.children.find(g => g.node == f.name); + + if (currStringTree) + return recursiveSort(f, currStringTree); + return f; + }).sort((a, b) => strings.children.findIndex(x => x.node == a.name)-strings.children.findIndex(x => x.node == b.name)), + } + } else { + return file + } + } + return recursiveSort(folderTree, stringTree) as TFolder; +} + +export const hasChildFolder = (folder: TFolder): boolean => { + let children = folder.children; + for (let child of children) { + if (child instanceof TFolder) return true; + } + return false; +}; + +// Files out of Md should be listed with extension badge - Md without extension +export const getFileNameAndExtension = (fullName: string) => { + var index = fullName.lastIndexOf('.'); + return { + fileName: fullName.substring(0, index), + extension: fullName.substring(index + 1), + }; +}; + +// Returns all parent folder paths +export const getParentFolderPaths = (file: TFile): string[] => { + let folderPaths: string[] = ['/']; + let parts: string[] = file.parent.path.split('/'); + let current: string = ''; + for (let i = 0; i < parts.length; i++) { + current += `${i === 0 ? '' : '/'}` + parts[i]; + folderPaths.push(current); + } + return folderPaths; +}; + +// Extracts the Folder Name from the Full Folder Path +export const getFolderName = (folderPath: string, app: App) => { + if (folderPath === '/') return app.vault.getName(); + let index = folderPath.lastIndexOf('/'); + if (index !== -1) return folderPath.substring(index + 1); + return folderPath; +}; + +export const internalPluginLoaded = (pluginName: string, app: App) => { + // @ts-ignore + return app.internalPlugins.plugins[pluginName]?._loaded; +}; + +export const openFile = async (file: FolderTree, app: App, newLeaf: boolean) => { + if (file.isFolder) { + let leaf = app.workspace.getLeaf(newLeaf); + app.workspace.setActiveLeaf(leaf, {focus: true}); + await leaf.setViewState({ type: FOLDER_VIEW_TYPE, state: { folder: file.path }}) + await app.workspace.requestSaveLayout() + } else { + let leaf = app.workspace.getLeaf(newLeaf); + app.workspace.setActiveLeaf(leaf, {focus: true}); + await leaf.openFile(app.vault.getAbstractFileByPath(file.path) as TFile, { eState: { focus: true } }); + } +}; + +export const openInternalLink = (event: React.MouseEvent, link: string, app: App) => { + app.workspace.openLinkText(link, '/', Keymap.isModifier(event as unknown as MouseEvent, 'Mod') || 1 === event.button); +}; + +export const openFileInNewPane = (plugin: MakeMDPlugin, file: FlattenedTreeNode) => { + openFile(file, plugin.app, true); +}; + + +function selectElementContents(el: Element) { + var range = document.createRange(); + range.selectNodeContents(el); + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); +} + +export const createNewMarkdownFile = async (app: App, folder: TFolder, newFileName: string, content?: string) : Promise => { + // @ts-ignore + const newFile = await app.fileManager.createNewMarkdownFile(folder, newFileName); + if (content && content !== '') await app.vault.modify(newFile, content); + + await openFile(newFile, app, false); + const titleEl = app.workspace.activeLeaf.view.containerEl.querySelector('.inline-title') as HTMLDivElement; + if (titleEl) { + titleEl.focus(); + selectElementContents(titleEl) + } + let evt = new CustomEvent(eventTypes.activeFileChange, { detail: { filePath: newFile.path } }); + window.dispatchEvent(evt); + return newFile; +}; + +export const platformIsMobile = () => { + return Platform.isMobile; +}; + +export const createNewFile = async (e: React.MouseEvent, folderPath: string, plugin: MakeMDPlugin) => { + let targetFolder = plugin.app.vault.getAbstractFileByPath(folderPath); + if (!targetFolder) return; + let modal = new VaultChangeModal(plugin, targetFolder, 'create note'); + modal.open(); +}; + + +export const unifiedToNative = (unified: string) => { + let unicodes = unified.split('-') + let codePoints = unicodes.map((u) => `0x${u}`) + // @ts-ignore + return String.fromCodePoint(...codePoints) +} \ No newline at end of file diff --git a/styles.css b/styles.css index 84ba9ea..404f5b0 100644 --- a/styles.css +++ b/styles.css @@ -422,8 +422,13 @@ body:not(.is-mobile) .mk-tree-wrapper:hover .mk-folder-buttons { height: 20px; color: var(--text-faint); } +.is-mobile .mk-tree-wrapper .mk-file-icon svg { + width: 18px; + height: 18px; + color: var(--text-faint); +} .mk-tree-text { - padding: 0.15rem 0.5rem; + padding: 0.15rem 4px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; @@ -586,7 +591,7 @@ body:not(.is-mobile) .mk-section:hover .mk-collapse { padding: unset; } .is-mobile .mk-sidebar .mk-file-icon button { - font-size: 20px; + font-size: 16px; } body.is-mobile .sidebar-toggle-button { display: flex !important; @@ -634,6 +639,9 @@ body.is-mobile .sidebar-toggle-button { font-size: var(--font-ui-medium); font-weight: var(--font-medium); } +.mk-main-menu-button > div { + display: flex; +} .mk-main-menu-button svg { height: 16px; width: 16px; @@ -697,6 +705,10 @@ body:not(.is-mobile) .mk-main-menu-button:hover { align-content: flex-start; flex-direction: row; } +.mk-sticker-modal { + display: flex; + flex-wrap: wrap; +} .mk-sticker-menu .suggestion-item { width: 30px; height: 30px; @@ -760,6 +772,10 @@ body:not(.is-mobile) .mk-main-menu-button:hover { background: var(--color-base-10); border-bottom: thin solid #333; } +.mk-flow-replace .mk-new-file:hover { + background: var(--color-base-10); + border-bottom: thin solid #333; +} .mobile-toolbar-options-container { border-top: var(--divider-width) solid var(--divider-color); } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e8a5ab8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "jsx": "react", + "esModuleInterop": true, + "baseUrl": "src", + "inlineSourceMap": true, + "inlineSources": true, + "isolatedModules": true, + "module": "ESNext", + "target": "es6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "allowSyntheticDefaultImports": true, + "lib": ["dom", "es5", "scripthost", "es2015"] + }, + "include": ["**/*.ts", "**/*.tsx", "src/components/Spaces/FileTreeView.tsx", "src/utils/autosizer.js", "src/utils/autosizer.js", "src/utils/detectElementResize.js"] +}