From 9c6b19b37f6af4cb1cd0eed84124c8d383d4d2a5 Mon Sep 17 00:00:00 2001 From: easrng Date: Thu, 17 Nov 2022 20:46:57 -0500 Subject: [PATCH 1/8] install deps --- package-lock.json | 2047 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 24 +- 2 files changed, 2031 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a4ae56..e7724ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,20 +14,40 @@ "@codemirror/lang-html": "^6.1.0", "@codemirror/lang-javascript": "^6.0.2", "@codemirror/view": "^6.1.0", + "@iframely/embed.js": "^1.9.0", "@uiw/codemirror-theme-xcode": "^4.11.4", "@uiw/react-codemirror": "^4.11.4", "base64-js": "^1.5.1", "css-tree": "^2.1.0", + "emoji-mart": "^5.3.2", + "hast": "^1.0.0", + "html-to-text": "^8.2.1", + "i18next": "^22.0.5", "less": "^4.1.3", + "luxon": "^3.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", + "p-debounce": "^4.0.0", + "p-memoize": "^7.1.1", "preact": "^10.10.0", "react": "^18.2.0", "react-dom": "^18.2.0", "reactflow": "^11.2.0", + "rehype-external-links": "^2.0.1", + "rehype-raw": "^6.1.1", + "rehype-react": "^7.1.1", + "rehype-sanitize": "^5.0.1", + "rehype-stringify": "^9.0.3", + "remark-gfm": "^3.0.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", "rollup": "^2.77.0", + "style-to-object": "^0.3.0", "svelte": "^3.49.0", - "svgo": "^2.8.0" + "svgo": "^2.8.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "zod": "^3.19.1" }, "devDependencies": { "@rollup/plugin-alias": "^4.0.2", @@ -39,6 +59,8 @@ "@rollup/plugin-typescript": "^9.0.2", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "@types/css-tree": "^1.0.7", + "@types/html-to-text": "^8.1.1", + "@types/luxon": "^3.1.0", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", "autoprefixer": "^10.4.13", @@ -566,6 +588,11 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@iframely/embed.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@iframely/embed.js/-/embed.js-1.9.0.tgz", + "integrity": "sha512-wA37PaB9YaOEeItOw/gQ/+sosuSgLyiv9G7gY0DwVVTr3yqSz9a4rZUfR+ofnVbz+f+vwjwqceN0mtaMH4Ar3w==" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -686,6 +713,38 @@ "@lezer/common": "^1.0.0" } }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, "node_modules/@reactflow/background": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.0.4.tgz", @@ -944,6 +1003,18 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz", + "integrity": "sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==", + "dependencies": { + "domhandler": "^4.2.0", + "selderee": "^0.6.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -1211,6 +1282,34 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/html-to-text": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-8.1.1.tgz", + "integrity": "sha512-QFcqfc7TiVbvIX8Fc2kWUxakruI1Ay6uitaGCYHzI5M0WHQROV5D2XeSaVrK0FmvssivXum4yERVnJsiuH61Ww==", + "dev": true + }, + "node_modules/@types/luxon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.1.0.tgz", + "integrity": "sha512-gCd/HcCgjqSxfMrgtqxCgYk/22NBQfypwFUG7ZAyG/4pqs51WLTcUzVp1hqTbieDYeHS3WoVEh2Yv/2l+7B0Vg==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -1222,17 +1321,20 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, "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 + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { "version": "18.0.25", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -1260,8 +1362,12 @@ "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@uiw/codemirror-extensions-basic-setup": { "version": "4.11.4", @@ -1391,6 +1497,15 @@ "postcss": "^8.1.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1518,6 +1633,15 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1541,6 +1665,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/classcat": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", @@ -1581,11 +1723,19 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/commondir": { "version": "1.0.1", @@ -1801,8 +1951,7 @@ "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 + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "node_modules/d3-color": { "version": "3.1.0", @@ -1932,7 +2081,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1969,6 +2117,11 @@ "node": ">=0.3.1" } }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -2041,6 +2194,11 @@ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, + "node_modules/emoji-mart": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.3.2.tgz", + "integrity": "sha512-og6K4jYkZITe8pnFPHdFE576Tc6fCFl8JPhl98jRunH3bDulk3iqA+6Ue0iUZ/L/GWzLf9XME9QnpBd53N5YTg==" + }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -2145,6 +2303,11 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -2394,6 +2557,247 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hast/-/hast-1.0.0.tgz", + "integrity": "sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==", + "deprecated": "Renamed to rehype" + }, + "node_modules/hast-to-hyperscript": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz", + "integrity": "sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw==", + "dependencies": { + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz", + "integrity": "sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.2.tgz", + "integrity": "sha512-0x3BhhdlBcqRIKyc095lBSDvmQNMY3Eulj2PLsT5XCyKYrxssI5yr3P4Kv/PBo1s/DMkZy2voGkMXECnFCZRLQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-sanitize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.0.0.tgz", + "integrity": "sha512-pw56+69jq+QSr/coADNvWTmBPDy+XsmwaF5KnUys4/wM1jt/fZdl7GPxhXXXYdXnz3Gj3qMkbUCH2uKjvX0MgQ==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "dependencies": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.0.0.tgz", + "integrity": "sha512-YHiS6aTaZ3N0Q3nxaY/Tj98D6kM8QX5Q8xqgg8G45zR7PvWnPGPP0vcKCgb/moIydEJ/QWczVrX0JODCVeoV7A==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-to-hyperscript": "^10.0.0", + "property-information": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.1.0.tgz", + "integrity": "sha512-uBjaTTLN0MkCZxY/R2fWUOcu7FRtUVzKRO5P/RAfgsu3yFiMB1JWCO4AjeVkgHxAira1f2UecHK5WfS9QurlWA==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-to-text": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-8.2.1.tgz", + "integrity": "sha512-aN/3JvAk8qFsWVeE9InWAWueLXrbkoVZy0TkzaGhoRBC2gCFEeRLDDJN3/ijIGHohy6H+SZzUQWN/hcYtaPK8w==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.6.0", + "deepmerge": "^4.2.2", + "he": "^1.2.0", + "htmlparser2": "^6.1.0", + "minimist": "^1.2.6", + "selderee": "^0.6.0" + }, + "bin": { + "html-to-text": "bin/cli.js" + }, + "engines": { + "node": ">=10.23.2" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/i18next": { + "version": "22.0.6", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.0.6.tgz", + "integrity": "sha512-RlreNGoPIdDP4QG+qSA9PxZKGwlzmcozbI9ObI6+OyUa/Rp0EjZZA9ubyBjw887zVNZsC+7FI3sXX8oiTzAfig==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.17.2" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -2476,6 +2880,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -2490,6 +2899,17 @@ "node": ">= 0.4" } }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -2518,6 +2938,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/is-builtin-module": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", @@ -2605,6 +3047,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -2911,6 +3364,15 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2922,6 +3384,14 @@ "loose-envify": "cli.js" } }, + "node_modules/luxon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.1.0.tgz", + "integrity": "sha512-7w6hmKC0/aoWnEsmPCu5Br54BmbmUp5GfcqBxQngRcXJ+q5fdfjEzn7dxmJh2YdDhgW8PccYtlWKSv4tQkrTQg==", + "engines": { + "node": ">=12" + } + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -2944,18 +3414,224 @@ "node": ">=6" } }, - "node_modules/mdn-data": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.27.tgz", - "integrity": "sha512-kwqO0I0jtWr25KcfLm9pia8vLZ8qoAKhWZuZMbneJq3jjBD3gl5nZs8l8Tu3ZBlBAHVQtDur9rdDGyvtfVraHQ==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "node_modules/markdown-table": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.2.tgz", + "integrity": "sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/micromark": { + "node_modules/mdast-util-definitions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz", + "integrity": "sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz", + "integrity": "sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz", + "integrity": "sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz", + "integrity": "sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz", + "integrity": "sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz", + "integrity": "sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz", + "integrity": "sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz", + "integrity": "sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.2.4", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz", + "integrity": "sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-builder": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.27.tgz", + "integrity": "sha512-kwqO0I0jtWr25KcfLm9pia8vLZ8qoAKhWZuZMbneJq3jjBD3gl5nZs8l8Tu3ZBlBAHVQtDur9rdDGyvtfVraHQ==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromark": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.10.tgz", "integrity": "sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==", @@ -3334,6 +4010,27 @@ "micromark-util-symbol": "^1.0.0" } }, + "node_modules/micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, "node_modules/micromark-util-encode": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", @@ -3401,9 +4098,9 @@ } }, "node_modules/micromark-util-sanitize-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", - "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", "funding": [ { "type": "GitHub Sponsors", @@ -3483,6 +4180,17 @@ "node": ">=4" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3495,6 +4203,19 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -3520,6 +4241,27 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, "node_modules/needle": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", @@ -3629,6 +4371,14 @@ "wrappy": "1" } }, + "node_modules/p-debounce": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-debounce/-/p-debounce-4.0.0.tgz", + "integrity": "sha512-4Ispi9I9qYGO4lueiLDhe4q4iK5ERK8reLsuzH6BPaXn53EGaua8H66PXIFGrW897hwjXp+pVLrm/DLxN0RF0A==", + "engines": { + "node": ">=12" + } + }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -3638,6 +4388,21 @@ "node": ">=4" } }, + "node_modules/p-memoize": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-7.1.1.tgz", + "integrity": "sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==", + "dependencies": { + "mimic-fn": "^4.0.0", + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/p-memoize?sponsor=1" + } + }, "node_modules/p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", @@ -3674,6 +4439,23 @@ "node": ">= 0.10" } }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseley": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.7.0.tgz", + "integrity": "sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==", + "dependencies": { + "moo": "^0.5.1", + "nearley": "^2.20.1" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4308,12 +5090,38 @@ "node": ">=0.12" } }, + "node_modules/property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "optional": true }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -4383,6 +5191,128 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/rehype-external-links": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-2.0.1.tgz", + "integrity": "sha512-u2dNypma+ps12SJWlS23zvbqwNx0Hl24t0YHXSM/6FCZj/pqWETCO3WyyrvALv4JYvRtuPjhiv2Lpen15ESqbA==", + "dependencies": { + "@types/hast": "^2.0.0", + "extend": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.1.1.tgz", + "integrity": "sha512-6yaitxM95JFsuTA74OH54OyvTAeRqR4/A6f45S2sEk2FEG04iGgsObcmEIFQRsjK9pfAhc74lR4iGf/W2G/sBw==", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "@types/hast": "^2.0.0", + "hast-to-hyperscript": "^10.0.0", + "hast-util-whitespace": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=17" + } + }, + "node_modules/rehype-sanitize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz", + "integrity": "sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-sanitize": "^4.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", + "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -4409,6 +5339,14 @@ "node": ">=8" } }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, "node_modules/rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", @@ -4619,6 +5557,17 @@ "loose-envify": "^1.1.0" } }, + "node_modules/selderee": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz", + "integrity": "sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==", + "dependencies": { + "parseley": "^0.7.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -4695,6 +5644,15 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -4754,6 +5712,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/style-inject": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", @@ -4765,6 +5736,14 @@ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -4885,11 +5864,40 @@ "node": ">=4" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, + "node_modules/type-fest": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz", + "integrity": "sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", @@ -4918,6 +5926,105 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-builder": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", + "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", + "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.3.tgz", + "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -4975,11 +6082,61 @@ "node": ">=8" } }, + "node_modules/vfile": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", + "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", + "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/w3c-keyname": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", @@ -5011,6 +6168,14 @@ "node": ">= 6" } }, + "node_modules/zod": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", + "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zustand": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.1.4.tgz", @@ -5033,6 +6198,15 @@ "optional": true } } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } }, "dependencies": { @@ -5452,6 +6626,11 @@ "dev": true, "requires": {} }, + "@iframely/embed.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@iframely/embed.js/-/embed.js-1.9.0.tgz", + "integrity": "sha512-wA37PaB9YaOEeItOw/gQ/+sosuSgLyiv9G7gY0DwVVTr3yqSz9a4rZUfR+ofnVbz+f+vwjwqceN0mtaMH4Ar3w==" + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -5562,6 +6741,37 @@ "@lezer/common": "^1.0.0" } }, + "@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "requires": { + "unist-util-visit": "^1.4.1" + }, + "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + } + } + }, "@reactflow/background": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.0.4.tgz", @@ -5726,6 +6936,15 @@ } } }, + "@selderee/plugin-htmlparser2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz", + "integrity": "sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==", + "requires": { + "domhandler": "^4.2.0", + "selderee": "^0.6.0" + } + }, "@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -5990,6 +7209,34 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/html-to-text": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-8.1.1.tgz", + "integrity": "sha512-QFcqfc7TiVbvIX8Fc2kWUxakruI1Ay6uitaGCYHzI5M0WHQROV5D2XeSaVrK0FmvssivXum4yERVnJsiuH61Ww==", + "dev": true + }, + "@types/luxon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.1.0.tgz", + "integrity": "sha512-gCd/HcCgjqSxfMrgtqxCgYk/22NBQfypwFUG7ZAyG/4pqs51WLTcUzVp1hqTbieDYeHS3WoVEh2Yv/2l+7B0Vg==", + "dev": true + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -6001,17 +7248,20 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, "@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 + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/react": { "version": "18.0.25", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", - "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -6039,8 +7289,12 @@ "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "@uiw/codemirror-extensions-basic-setup": { "version": "4.11.4", @@ -6120,6 +7374,11 @@ "postcss-value-parser": "^4.2.0" } }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -6198,6 +7457,11 @@ "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", "dev": true }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6214,6 +7478,16 @@ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" }, + "character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + }, "classcat": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", @@ -6254,11 +7528,15 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, + "comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "commondir": { "version": "1.0.1", @@ -6422,8 +7700,7 @@ "csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "d3-color": { "version": "3.1.0", @@ -6510,8 +7787,7 @@ "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "define-properties": { "version": "1.1.4", @@ -6533,6 +7809,11 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" + }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -6581,6 +7862,11 @@ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, + "emoji-mart": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.3.2.tgz", + "integrity": "sha512-og6K4jYkZITe8pnFPHdFE576Tc6fCFl8JPhl98jRunH3bDulk3iqA+6Ue0iUZ/L/GWzLf9XME9QnpBd53N5YTg==" + }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -6661,6 +7947,11 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -6841,6 +8132,172 @@ "has-symbols": "^1.0.2" } }, + "hast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hast/-/hast-1.0.0.tgz", + "integrity": "sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==" + }, + "hast-to-hyperscript": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz", + "integrity": "sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw==", + "requires": { + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^5.0.0", + "web-namespaces": "^2.0.0" + } + }, + "hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + } + }, + "hast-util-is-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz", + "integrity": "sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==", + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + } + }, + "hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "requires": { + "@types/hast": "^2.0.0" + } + }, + "hast-util-raw": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.2.tgz", + "integrity": "sha512-0x3BhhdlBcqRIKyc095lBSDvmQNMY3Eulj2PLsT5XCyKYrxssI5yr3P4Kv/PBo1s/DMkZy2voGkMXECnFCZRLQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + } + }, + "hast-util-sanitize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.0.0.tgz", + "integrity": "sha512-pw56+69jq+QSr/coADNvWTmBPDy+XsmwaF5KnUys4/wM1jt/fZdl7GPxhXXXYdXnz3Gj3qMkbUCH2uKjvX0MgQ==", + "requires": { + "@types/hast": "^2.0.0" + } + }, + "hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "requires": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + } + }, + "hast-util-to-parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.0.0.tgz", + "integrity": "sha512-YHiS6aTaZ3N0Q3nxaY/Tj98D6kM8QX5Q8xqgg8G45zR7PvWnPGPP0vcKCgb/moIydEJ/QWczVrX0JODCVeoV7A==", + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-to-hyperscript": "^10.0.0", + "property-information": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + } + }, + "hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" + }, + "hastscript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.1.0.tgz", + "integrity": "sha512-uBjaTTLN0MkCZxY/R2fWUOcu7FRtUVzKRO5P/RAfgsu3yFiMB1JWCO4AjeVkgHxAira1f2UecHK5WfS9QurlWA==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-to-text": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-8.2.1.tgz", + "integrity": "sha512-aN/3JvAk8qFsWVeE9InWAWueLXrbkoVZy0TkzaGhoRBC2gCFEeRLDDJN3/ijIGHohy6H+SZzUQWN/hcYtaPK8w==", + "requires": { + "@selderee/plugin-htmlparser2": "^0.6.0", + "deepmerge": "^4.2.2", + "he": "^1.2.0", + "htmlparser2": "^6.1.0", + "minimist": "^1.2.6", + "selderee": "^0.6.0" + } + }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "i18next": { + "version": "22.0.6", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.0.6.tgz", + "integrity": "sha512-RlreNGoPIdDP4QG+qSA9PxZKGwlzmcozbI9ObI6+OyUa/Rp0EjZZA9ubyBjw887zVNZsC+7FI3sXX8oiTzAfig==", + "requires": { + "@babel/runtime": "^7.17.2" + } + }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -6903,6 +8360,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -6914,6 +8376,11 @@ "side-channel": "^1.0.4" } }, + "is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==" + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -6933,6 +8400,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-builtin-module": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", @@ -6987,6 +8459,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + }, "is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -7208,6 +8685,11 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, + "longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7216,6 +8698,11 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "luxon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.1.0.tgz", + "integrity": "sha512-7w6hmKC0/aoWnEsmPCu5Br54BmbmUp5GfcqBxQngRcXJ+q5fdfjEzn7dxmJh2YdDhgW8PccYtlWKSv4tQkrTQg==" + }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -7235,6 +8722,156 @@ "semver": "^5.6.0" } }, + "markdown-table": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.2.tgz", + "integrity": "sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA==" + }, + "mdast-util-definitions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz", + "integrity": "sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "mdast-util-find-and-replace": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz", + "integrity": "sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==", + "requires": { + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-gfm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz", + "integrity": "sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==", + "requires": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + } + }, + "mdast-util-gfm-autolink-literal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz", + "integrity": "sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==", + "requires": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + } + }, + "mdast-util-gfm-footnote": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz", + "integrity": "sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + } + }, + "mdast-util-gfm-strikethrough": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz", + "integrity": "sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-table": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz", + "integrity": "sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==", + "requires": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-task-list-item": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz", + "integrity": "sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-to-hast": { + "version": "12.2.4", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz", + "integrity": "sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-builder": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==" + }, "mdn-data": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.27.tgz", @@ -7477,6 +9114,17 @@ "micromark-util-symbol": "^1.0.0" } }, + "micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, "micromark-util-encode": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", @@ -7504,9 +9152,9 @@ } }, "micromark-util-sanitize-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", - "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", "requires": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", @@ -7540,6 +9188,11 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "optional": true }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7549,6 +9202,16 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, "mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -7565,6 +9228,17 @@ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true }, + "nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "requires": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + } + }, "needle": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", @@ -7646,12 +9320,26 @@ "wrappy": "1" } }, + "p-debounce": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-debounce/-/p-debounce-4.0.0.tgz", + "integrity": "sha512-4Ispi9I9qYGO4lueiLDhe4q4iK5ERK8reLsuzH6BPaXn53EGaua8H66PXIFGrW897hwjXp+pVLrm/DLxN0RF0A==" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true }, + "p-memoize": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-7.1.1.tgz", + "integrity": "sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==", + "requires": { + "mimic-fn": "^4.0.0", + "type-fest": "^3.0.0" + } + }, "p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", @@ -7676,6 +9364,20 @@ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseley": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.7.0.tgz", + "integrity": "sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==", + "requires": { + "moo": "^0.5.1", + "nearley": "^2.20.1" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -8066,12 +9768,31 @@ "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", "dev": true }, + "property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "optional": true }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -8125,6 +9846,93 @@ "functions-have-names": "^1.2.2" } }, + "rehype-external-links": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-2.0.1.tgz", + "integrity": "sha512-u2dNypma+ps12SJWlS23zvbqwNx0Hl24t0YHXSM/6FCZj/pqWETCO3WyyrvALv4JYvRtuPjhiv2Lpen15ESqbA==", + "requires": { + "@types/hast": "^2.0.0", + "extend": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + } + }, + "rehype-react": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.1.1.tgz", + "integrity": "sha512-6yaitxM95JFsuTA74OH54OyvTAeRqR4/A6f45S2sEk2FEG04iGgsObcmEIFQRsjK9pfAhc74lR4iGf/W2G/sBw==", + "requires": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "@types/hast": "^2.0.0", + "hast-to-hyperscript": "^10.0.0", + "hast-util-whitespace": "^2.0.0", + "unified": "^10.0.0" + } + }, + "rehype-sanitize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz", + "integrity": "sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-sanitize": "^4.0.0", + "unified": "^10.0.0" + } + }, + "rehype-stringify": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", + "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + } + }, + "remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + } + }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + } + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -8142,6 +9950,11 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, "rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", @@ -8297,6 +10110,14 @@ "loose-envify": "^1.1.0" } }, + "selderee": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz", + "integrity": "sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==", + "requires": { + "parseley": "^0.7.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -8355,6 +10176,11 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -8404,6 +10230,15 @@ "es-abstract": "^1.19.5" } }, + "stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + } + }, "style-inject": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", @@ -8415,6 +10250,14 @@ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, "stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -8498,11 +10341,26 @@ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, + "trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==" + }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, + "type-fest": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz", + "integrity": "sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og==" + }, "typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", @@ -8521,6 +10379,73 @@ "which-boxed-primitive": "^1.0.2" } }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "unist-builder": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", + "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-generated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", + "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==" + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" + }, + "unist-util-position": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.3.tgz", + "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -8554,11 +10479,45 @@ "sade": "^1.7.3" } }, + "vfile": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", + "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "vfile-message": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", + "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, "w3c-keyname": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" }, + "web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" + }, "which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", @@ -8584,6 +10543,11 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, + "zod": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", + "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==" + }, "zustand": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.1.4.tgz", @@ -8591,6 +10555,11 @@ "requires": { "use-sync-external-store": "1.2.0" } + }, + "zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } } diff --git a/package.json b/package.json index b4f9558..fb80539 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "@rollup/plugin-typescript": "^9.0.2", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "@types/css-tree": "^1.0.7", + "@types/html-to-text": "^8.1.1", + "@types/luxon": "^3.1.0", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", "autoprefixer": "^10.4.13", @@ -34,19 +36,39 @@ "@codemirror/lang-html": "^6.1.0", "@codemirror/lang-javascript": "^6.0.2", "@codemirror/view": "^6.1.0", + "@iframely/embed.js": "^1.9.0", "@uiw/codemirror-theme-xcode": "^4.11.4", "@uiw/react-codemirror": "^4.11.4", "base64-js": "^1.5.1", "css-tree": "^2.1.0", + "emoji-mart": "^5.3.2", + "hast": "^1.0.0", + "html-to-text": "^8.2.1", + "i18next": "^22.0.5", "less": "^4.1.3", + "luxon": "^3.1.0", "micromark": "^3.0.10", "micromark-extension-gfm": "^2.0.1", + "p-debounce": "^4.0.0", + "p-memoize": "^7.1.1", "preact": "^10.10.0", "react": "^18.2.0", "react-dom": "^18.2.0", "reactflow": "^11.2.0", + "rehype-external-links": "^2.0.1", + "rehype-raw": "^6.1.1", + "rehype-react": "^7.1.1", + "rehype-sanitize": "^5.0.1", + "rehype-stringify": "^9.0.3", + "remark-gfm": "^3.0.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", "rollup": "^2.77.0", + "style-to-object": "^0.3.0", "svelte": "^3.49.0", - "svgo": "^2.8.0" + "svgo": "^2.8.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "zod": "^3.19.1" } } From 998a022f34a3301ba97f5e278ebc3300f78f143b Mon Sep 17 00:00:00 2001 From: easrng Date: Thu, 17 Nov 2022 20:47:46 -0500 Subject: [PATCH 2/8] fix bundling for vfile (dep of unified) --- rollup.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/rollup.config.mjs b/rollup.config.mjs index 283785e..5c82c5b 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -37,6 +37,7 @@ export default { alias({ entries: [ { find: 'css-tree', replacement: 'css-tree/dist/csstree.esm' }, + { find: /^(.*\/min(?:path|proc|url)).js$/, replacement: '$1.browser.js' }, ], }), offMainThread({ From ad5766d61b0c6a9deccbbcd7d75a01cd2d6f8921 Mon Sep 17 00:00:00 2001 From: easrng Date: Fri, 18 Nov 2022 06:35:28 -0500 Subject: [PATCH 3/8] make it easier to debug workers in development builds --- src/plugins/source/svelte.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/source/svelte.tsx b/src/plugins/source/svelte.tsx index 8121330..9081560 100644 --- a/src/plugins/source/svelte.tsx +++ b/src/plugins/source/svelte.tsx @@ -48,8 +48,10 @@ function bundleModules(modules: SvelteModules, main: string, mainId: string): Pr worker.addEventListener('message', onMessage); worker.addEventListener('error', e => { reject(new Error('Error in svelte worker')); - worker?.terminate(); - worker = null; + if(process.env.NODE_ENV !== "dev") { + processworker?.terminate(); + worker = null; + } }); worker.postMessage({ @@ -63,8 +65,10 @@ function bundleModules(modules: SvelteModules, main: string, mainId: string): Pr setTimeout(() => { if (didReturn) return; reject(new Error('Svelte: bundler timed out')); - worker?.terminate(); - worker = null; + if(process.env.NODE_ENV !== "dev") { + worker?.terminate(); + worker = null; + } }, 1000); }); } From be0d778e96d02740e8c8ec9f2fb0032765d07ed2 Mon Sep 17 00:00:00 2001 From: easrng Date: Fri, 18 Nov 2022 06:37:57 -0500 Subject: [PATCH 4/8] cohost plus checkbox --- src/document.ts | 2 ++ src/ui/components/preview.tsx | 18 ++++++++++++++++-- src/ui/index.tsx | 6 ++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/document.ts b/src/document.ts index db188fc..bea13d3 100644 --- a/src/document.ts +++ b/src/document.ts @@ -288,6 +288,8 @@ export interface RenderState { rendering: boolean; /** If true, we should render live. */ live: boolean; + /** If true, we should render as if we are subscribed to Cohost Plus. */ + plus: boolean; /** Last render output */ output: RenderOutput | null; /** Last render error. */ diff --git a/src/ui/components/preview.tsx b/src/ui/components/preview.tsx index 8a7f891..087debf 100644 --- a/src/ui/components/preview.tsx +++ b/src/ui/components/preview.tsx @@ -4,7 +4,7 @@ import { PostPreview } from './post-preview'; import { DataPreview } from './data-preview'; import './preview.less'; -export function Preview({ document, render, onTargetChange, onLiveChange, onRender }: Preview.Props) { +export function Preview({ document, render, onTargetChange, onLiveChange, onPlusChange, onRender }: Preview.Props) { let contents = null; if (render.output) { @@ -21,7 +21,8 @@ export function Preview({ document, render, onTargetChange, onLiveChange, onRend
+ markdown={render.output.markdownOutput!} + plus={render.plus} />
); } @@ -64,6 +65,7 @@ export function Preview({ document, render, onTargetChange, onLiveChange, onRend } const liveCheckbox = Math.random().toString(36); + const plusCheckbox = Math.random().toString(36); return (
@@ -80,6 +82,17 @@ export function Preview({ document, render, onTargetChange, onLiveChange, onRend {outputTargets} + + { + onPlusChange((e.target as HTMLInputElement).checked); + }} + type="checkbox" /> + {' '} + + void; onLiveChange: (live: boolean) => void; + onPlusChange: (plus: boolean) => void; onRender: () => void; } } diff --git a/src/ui/index.tsx b/src/ui/index.tsx index d0ddc6e..3c7040a 100644 --- a/src/ui/index.tsx +++ b/src/ui/index.tsx @@ -21,6 +21,7 @@ export default class Prechoster extends PureComponent { + this.setState({ render: { ...this.state.render, plus } }, () => { + if (this.state.render.live) this.renderPreview(); + }); + }} onRender={() => this.renderPreview()} onTargetChange={target => { this.setState({ render: { ...this.state.render, target } }, () => { From 1dd454a913ad604e28184628df874e3ecbc6ce6a Mon Sep 17 00:00:00 2001 From: easrng Date: Fri, 18 Nov 2022 06:50:23 -0500 Subject: [PATCH 5/8] fix silly mistake (either a typo or a git merge issue) --- src/plugins/source/svelte.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/source/svelte.tsx b/src/plugins/source/svelte.tsx index 86d3a55..25da95e 100644 --- a/src/plugins/source/svelte.tsx +++ b/src/plugins/source/svelte.tsx @@ -49,7 +49,7 @@ function bundleModules(modules: SvelteModules, main: string, mainId: string): Pr worker.addEventListener('error', (e) => { reject(new Error('Error in svelte worker')); if (process.env.NODE_ENV !== 'dev') { - processworker?.terminate(); + worker?.terminate(); worker = null; } }); From 4d4a604c34841d78093da6cb889197c53e0d1d3b Mon Sep 17 00:00:00 2001 From: easrng Date: Fri, 18 Nov 2022 06:54:30 -0500 Subject: [PATCH 6/8] fix types so it builds right --- src/ui/components/post-preview.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/components/post-preview.tsx b/src/ui/components/post-preview.tsx index dc6113e..3b0710d 100644 --- a/src/ui/components/post-preview.tsx +++ b/src/ui/components/post-preview.tsx @@ -292,7 +292,7 @@ function handleAsyncErrors( } } -export function PostPreview({ markdown, error, stale }: PostPreview.Props) { +export function PostPreview({ markdown, error, stale, plus }: PostPreview.Props) { let html = ''; const renderErrors: ErrorMessage[] = []; try { @@ -374,6 +374,7 @@ namespace PostPreview { markdown: string; error?: Error | null; stale?: boolean; + plus?: boolean; } } From 7d20f816e812701bae0e95d295a819bdd717b608 Mon Sep 17 00:00:00 2001 From: easrng Date: Fri, 18 Nov 2022 07:04:05 -0500 Subject: [PATCH 7/8] add more cohost css (used by emojis and link previews) --- src/cohost-inherited.less | 1802 +++++++++++++++++++++---------------- 1 file changed, 1023 insertions(+), 779 deletions(-) diff --git a/src/cohost-inherited.less b/src/cohost-inherited.less index 692ecfb..59ddaa3 100644 --- a/src/cohost-inherited.less +++ b/src/cohost-inherited.less @@ -1,800 +1,1044 @@ // styles inherited into posts from cohost .cohost-prose-outer() { - * { - box-sizing: border-box; - border-width: 0; - border-style: solid; - border-color: currentColor; - } - hr { - height: 0; - color: inherit; - border-top-width: 1px; - } - abbr[title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - } - h1, h2, h3, h4, h5, h6 { - font-size: inherit; - font-weight: inherit; - } - a { - color: inherit; - text-decoration: inherit; - } - b, strong { - font-weight: bolder; - } - code, kbd, samp, pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, liberation mono, courier new, monospace; - font-size: 1em; - } - small { - font-size: 80%; - } - sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - } - sub { - bottom: -.25em; - } - sup { - top: -.5em; - } - table { - text-indent: 0; - border-color: inherit; - border-collapse: collapse; - } - button, input, optgroup, select, textarea { - font-family: inherit; - font-size: 100%; - line-height: inherit; - color: inherit; - margin: 0; - padding: 0; - } - button, select { - text-transform: none; - } - button, [type=button], [type=reset], [type=submit] { - -webkit-appearance: button; - background-color: transparent; - background-image: none; - } - blockquote, dl, dd, h1, h2, h3, h4, h5, h6, hr, figure, p, pre { - margin: 0; - } - :-moz-focusring { - outline: auto; - } - :-moz-ui-invalid { - box-shadow: none; - } - progress { - vertical-align: baseline; - } - ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { - height: auto; - } - [type=search] { - -webkit-appearance: textfield; - outline-offset: -2px; - } - ::-webkit-search-decoration { - -webkit-appearance: none; - } - ::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; - } - summary { - display: list-item; - } - fieldset { - margin: 0; - padding: 0; - } - legend { - padding: 0; - } - ol, ul, menu { - list-style: none; - margin: 0; - padding: 0; - } - textarea { - resize: vertical; - } - input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - color: #a09c98; - } - input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - color: #a09c98; - } - input::placeholder, textarea::placeholder { - opacity: 1; - color: #a09c98; - } - button, [role=button] { - cursor: pointer; - } - :disabled { - cursor: default; - } - img, svg, video, canvas, audio, iframe, embed, object { - display: block; - vertical-align: middle; - } - img, video { - max-width: 100%; - height: auto; - } - [hidden] { - display:none - } - *, ::before, ::after { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - --tw-border-opacity: 1; - border-color: ~"rgb(222 217 211/var(--tw-border-opacity))"; - --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: ~"rgb(59 130 246 / 0.5)"; - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: var(--tw-empty, /*!*/ /*!*/); - --tw-brightness: var(--tw-empty, /*!*/ /*!*/); - --tw-contrast: var(--tw-empty, /*!*/ /*!*/); - --tw-grayscale: var(--tw-empty, /*!*/ /*!*/); - --tw-hue-rotate: var(--tw-empty, /*!*/ /*!*/); - --tw-invert: var(--tw-empty, /*!*/ /*!*/); - --tw-saturate: var(--tw-empty, /*!*/ /*!*/); - --tw-sepia: var(--tw-empty, /*!*/ /*!*/); - --tw-drop-shadow: var(--tw-empty, /*!*/ /*!*/); - --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); - --tw-backdrop-blur: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-brightness: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-contrast: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-grayscale: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-hue-rotate: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-invert: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-opacity: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-saturate: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-sepia: var(--tw-empty, /*!*/ /*!*/); - --tw-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); - } - [type=text], [type=email], [type=url], [type=password], [type=number], [type=date], [type=datetime-local], [type=month], [type=search], [type=tel], [type=time], [type=week], [multiple], textarea, select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-color: #fff; - border-color: #827f7c; - border-width: 1px; - border-radius: 0; - padding-top: .5rem; - padding-right: .75rem; - padding-bottom: .5rem; - padding-left: .75rem; - font-size: 1rem; - line-height: 1.5rem; - --tw-shadow: 0 0 #0000; - } - [type=text]:focus, [type=email]:focus, [type=url]:focus, [type=password]:focus, [type=number]:focus, [type=date]:focus, [type=datetime-local]:focus, [type=month]:focus, [type=search]:focus, [type=tel]:focus, [type=time]:focus, [type=week]:focus, [multiple]:focus, textarea:focus, select:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); - border-color: #2563eb; - } - input::-moz-placeholder, textarea::-moz-placeholder { - color: #827f7c; - opacity: 1; - } - input:-ms-input-placeholder, textarea:-ms-input-placeholder { - color: #827f7c; - opacity: 1; - } - input::placeholder, textarea::placeholder { - color: #827f7c; - opacity: 1; - } - ::-webkit-datetime-edit-fields-wrapper { - padding: 0; - } - ::-webkit-date-and-time-value { - min-height: 1.5em; - } - select { - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9J25vbmUnIHZpZXdCb3g9JzAgMCAyMCAyMCc+PHBhdGggc3Ryb2tlPScjODI3RjdDJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMS41JyBkPSdNNiA4bDQgNCA0LTQnLz48L3N2Zz4=); - background-position: right .5rem center; - background-repeat: no-repeat; - background-size: 1.5em 1.5em; - padding-right: 2.5rem; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; - } - [multiple] { - background-image: initial; - background-position: initial; - background-repeat: unset; - background-size: initial; - padding-right: .75rem; - -webkit-print-color-adjust: unset; - print-color-adjust: unset; - } - [type=checkbox], [type=radio] { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding: 0; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; - display: inline-block; - vertical-align: middle; - background-origin: border-box; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - flex-shrink: 0; - height: 1rem; - width: 1rem; - color: #2563eb; - background-color: #fff; - border-color: #827f7c; - border-width: 1px; - --tw-shadow: 0 0 #0000; - } - [type=checkbox] { - border-radius: 0; - } - [type=radio] { - border-radius: 100%; - } - [type=checkbox]:focus, [type=radio]:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); - --tw-ring-offset-width: 2px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) - } - [type=checkbox]:checked, [type=radio]:checked { - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; - } - [type=checkbox]:checked { - background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J3doaXRlJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J00xMi4yMDcgNC43OTNhMSAxIDAgMDEwIDEuNDE0bC01IDVhMSAxIDAgMDEtMS40MTQgMGwtMi0yYTEgMSAwIDAxMS40MTQtMS40MTRMNi41IDkuMDg2bDQuMjkzLTQuMjkzYTEgMSAwIDAxMS40MTQgMHonLz48L3N2Zz4=); - } - [type=radio]:checked { - background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J3doaXRlJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxjaXJjbGUgY3g9JzgnIGN5PSc4JyByPSczJy8+PC9zdmc+); - } - [type=checkbox]:checked:hover, [type=checkbox]:checked:focus, [type=radio]:checked:hover, [type=radio]:checked:focus { - border-color: transparent; - background-color: currentColor; - } - [type=checkbox]:indeterminate { - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9J25vbmUnIHZpZXdCb3g9JzAgMCAxNiAxNic+PHBhdGggc3Ryb2tlPSd3aGl0ZScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyBzdHJva2Utd2lkdGg9JzInIGQ9J000IDhoOCcvPjwvc3ZnPg==); - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; - } - [type=checkbox]:indeterminate:hover, [type=checkbox]:indeterminate:focus { - border-color: transparent; - background-color: currentColor; - } - [type=file] { - background: unset; - border-color: inherit; - border-width: 0; - border-radius: 0; - padding: 0; - font-size: unset; - line-height: inherit; - } - [type=file]:focus { - outline: 1px auto -webkit-focus-ring-color; - } - [type=text], [type=email], [type=url], [type=password], [type=number], [type=date], [type=datetime-local], [type=month], [type=search], [type=tel], [type=time], [type=week], [multiple], textarea, select { - --tw-bg-opacity: 1; - background-color: ~"rgb(255 249 242/var(--tw-bg-opacity))"; - --tw-text-opacity: 1; - color: ~"rgb(25 25 25/var(--tw-text-opacity))"; - } - [type=text]::-moz-placeholder, [type=email]::-moz-placeholder, [type=url]::-moz-placeholder, [type=password]::-moz-placeholder, [type=number]::-moz-placeholder, [type=date]::-moz-placeholder, [type=datetime-local]::-moz-placeholder, [type=month]::-moz-placeholder, [type=search]::-moz-placeholder, [type=tel]::-moz-placeholder, [type=time]::-moz-placeholder, [type=week]::-moz-placeholder, [multiple]::-moz-placeholder, textarea::-moz-placeholder, select::-moz-placeholder { - --tw-placeholder-opacity: 1; - color: ~"rgb(74 72 71/var(--tw-placeholder-opacity))"; - } - [type=text]:-ms-input-placeholder, [type=email]:-ms-input-placeholder, [type=url]:-ms-input-placeholder, [type=password]:-ms-input-placeholder, [type=number]:-ms-input-placeholder, [type=date]:-ms-input-placeholder, [type=datetime-local]:-ms-input-placeholder, [type=month]:-ms-input-placeholder, [type=search]:-ms-input-placeholder, [type=tel]:-ms-input-placeholder, [type=time]:-ms-input-placeholder, [type=week]:-ms-input-placeholder, [multiple]:-ms-input-placeholder, textarea:-ms-input-placeholder, select:-ms-input-placeholder { - --tw-placeholder-opacity: 1; - color: ~"rgb(74 72 71/var(--tw-placeholder-opacity))"; - } - [type=text]::placeholder, [type=email]::placeholder, [type=url]::placeholder, [type=password]::placeholder, [type=number]::placeholder, [type=date]::placeholder, [type=datetime-local]::placeholder, [type=month]::placeholder, [type=search]::placeholder, [type=tel]::placeholder, [type=time]::placeholder, [type=week]::placeholder, [multiple]::placeholder, textarea::placeholder, select::placeholder { - --tw-placeholder-opacity: 1; - color: ~"rgb(74 72 71/var(--tw-placeholder-opacity))"; - } - * :focus { - outline-style: solid; - outline-width: 4px; - outline-color: ~"rgb(var(--color-foreground))"; - --tw-ring-opacity: 1 !important; - --tw-ring-color: ~"rgb(var(--color-foreground) / var(--tw-ring-opacity))" !important; - } - * :focus:not(:focus-visible) { - outline: 2px solid transparent; - outline-offset: 2px; - } - * :focus-visible { - outline-style: solid; - outline-width: 4px; - outline-color: ~"rgb(var(--color-foreground))"; - --tw-ring-opacity: 1 !important; - --tw-ring-color: ~"rgb(var(--color-foreground) / var(--tw-ring-opacity))" !important; - } - * { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } - - input[type=checkbox] { - --tw-bg-opacity: 1; - background-color: ~"rgb(255 249 242/var(--tw-bg-opacity))"; - --tw-text-opacity: 1; - color: ~"rgb(131 37 79/var(--tw-text-opacity))"; - } + * { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: currentColor; + } + hr { + height: 0; + color: inherit; + border-top-width: 1px; + } + abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + h1, + h2, + h3, + h4, + h5, + h6 { + font-size: inherit; + font-weight: inherit; + } + a { + color: inherit; + text-decoration: inherit; + } + b, + strong { + font-weight: bolder; + } + code, + kbd, + samp, + pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + liberation mono, courier new, monospace; + font-size: 1em; + } + small { + font-size: 80%; + } + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + } + button, + input, + optgroup, + select, + textarea { + font-family: inherit; + font-size: 100%; + line-height: inherit; + color: inherit; + margin: 0; + padding: 0; + } + button, + select { + text-transform: none; + } + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + background-color: transparent; + background-image: none; + } + blockquote, + dl, + dd, + h1, + h2, + h3, + h4, + h5, + h6, + hr, + figure, + p, + pre { + margin: 0; + } + :-moz-focusring { + outline: auto; + } + :-moz-ui-invalid { + box-shadow: none; + } + progress { + vertical-align: baseline; + } + ::-webkit-inner-spin-button, + ::-webkit-outer-spin-button { + height: auto; + } + [type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; + } + ::-webkit-search-decoration { + -webkit-appearance: none; + } + ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; + } + summary { + display: list-item; + } + fieldset { + margin: 0; + padding: 0; + } + legend { + padding: 0; + } + ol, + ul, + menu { + list-style: none; + margin: 0; + padding: 0; + } + textarea { + resize: vertical; + } + input::-moz-placeholder, + textarea::-moz-placeholder { + opacity: 1; + color: #a09c98; + } + input:-ms-input-placeholder, + textarea:-ms-input-placeholder { + opacity: 1; + color: #a09c98; + } + input::placeholder, + textarea::placeholder { + opacity: 1; + color: #a09c98; + } + button, + [role="button"] { + cursor: pointer; + } + :disabled { + cursor: default; + } + img, + svg, + video, + canvas, + audio, + iframe, + embed, + object { + display: block; + vertical-align: middle; + } + img, + video { + max-width: 100%; + height: auto; + } + [hidden] { + display: none; + } + *, + ::before, + ::after { + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-transform: translateX(var(--tw-translate-x)) + translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) + skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) + scaleY(var(--tw-scale-y)); + --tw-border-opacity: 1; + border-color: ~"rgb(222 217 211/var(--tw-border-opacity))"; + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: ~"rgb(59 130 246 / 0.5)"; + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: var(--tw-empty, /*!*/ /*!*/); + --tw-brightness: var(--tw-empty, /*!*/ /*!*/); + --tw-contrast: var(--tw-empty, /*!*/ /*!*/); + --tw-grayscale: var(--tw-empty, /*!*/ /*!*/); + --tw-hue-rotate: var(--tw-empty, /*!*/ /*!*/); + --tw-invert: var(--tw-empty, /*!*/ /*!*/); + --tw-saturate: var(--tw-empty, /*!*/ /*!*/); + --tw-sepia: var(--tw-empty, /*!*/ /*!*/); + --tw-drop-shadow: var(--tw-empty, /*!*/ /*!*/); + --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) + var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) + var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); + --tw-backdrop-blur: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-brightness: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-contrast: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-grayscale: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-hue-rotate: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-invert: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-opacity: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-saturate: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-sepia: var(--tw-empty, /*!*/ /*!*/); + --tw-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) + var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) + var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) + var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) + var(--tw-backdrop-sepia); + } + [type="text"], + [type="email"], + [type="url"], + [type="password"], + [type="number"], + [type="date"], + [type="datetime-local"], + [type="month"], + [type="search"], + [type="tel"], + [type="time"], + [type="week"], + [multiple], + textarea, + select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #827f7c; + border-width: 1px; + border-radius: 0; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; + } + [type="text"]:focus, + [type="email"]:focus, + [type="url"]:focus, + [type="password"]:focus, + [type="number"]:focus, + [type="date"]:focus, + [type="datetime-local"]:focus, + [type="month"]:focus, + [type="search"]:focus, + [type="tel"]:focus, + [type="time"]:focus, + [type="week"]:focus, + [multiple]:focus, + textarea:focus, + select:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 + var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 + calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), + var(--tw-shadow); + border-color: #2563eb; + } + input::-moz-placeholder, + textarea::-moz-placeholder { + color: #827f7c; + opacity: 1; + } + input:-ms-input-placeholder, + textarea:-ms-input-placeholder { + color: #827f7c; + opacity: 1; + } + input::placeholder, + textarea::placeholder { + color: #827f7c; + opacity: 1; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + ::-webkit-date-and-time-value { + min-height: 1.5em; + } + select { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9J25vbmUnIHZpZXdCb3g9JzAgMCAyMCAyMCc+PHBhdGggc3Ryb2tlPScjODI3RjdDJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMS41JyBkPSdNNiA4bDQgNCA0LTQnLz48L3N2Zz4=); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + } + [multiple] { + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + -webkit-print-color-adjust: unset; + print-color-adjust: unset; + } + [type="checkbox"], + [type="radio"] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #2563eb; + background-color: #fff; + border-color: #827f7c; + border-width: 1px; + --tw-shadow: 0 0 #0000; + } + [type="checkbox"] { + border-radius: 0; + } + [type="radio"] { + border-radius: 100%; + } + [type="checkbox"]:focus, + [type="radio"]:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 + var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 + calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), + var(--tw-shadow); + } + [type="checkbox"]:checked, + [type="radio"]:checked { + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; + } + [type="checkbox"]:checked { + background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J3doaXRlJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J00xMi4yMDcgNC43OTNhMSAxIDAgMDEwIDEuNDE0bC01IDVhMSAxIDAgMDEtMS40MTQgMGwtMi0yYTEgMSAwIDAxMS40MTQtMS40MTRMNi41IDkuMDg2bDQuMjkzLTQuMjkzYTEgMSAwIDAxMS40MTQgMHonLz48L3N2Zz4=); + } + [type="radio"]:checked { + background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J3doaXRlJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxjaXJjbGUgY3g9JzgnIGN5PSc4JyByPSczJy8+PC9zdmc+); + } + [type="checkbox"]:checked:hover, + [type="checkbox"]:checked:focus, + [type="radio"]:checked:hover, + [type="radio"]:checked:focus { + border-color: transparent; + background-color: currentColor; + } + [type="checkbox"]:indeterminate { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9J25vbmUnIHZpZXdCb3g9JzAgMCAxNiAxNic+PHBhdGggc3Ryb2tlPSd3aGl0ZScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyBzdHJva2Utd2lkdGg9JzInIGQ9J000IDhoOCcvPjwvc3ZnPg==); + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; + } + [type="checkbox"]:indeterminate:hover, + [type="checkbox"]:indeterminate:focus { + border-color: transparent; + background-color: currentColor; + } + [type="file"] { + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; + } + [type="file"]:focus { + outline: 1px auto -webkit-focus-ring-color; + } + [type="text"], + [type="email"], + [type="url"], + [type="password"], + [type="number"], + [type="date"], + [type="datetime-local"], + [type="month"], + [type="search"], + [type="tel"], + [type="time"], + [type="week"], + [multiple], + textarea, + select { + --tw-bg-opacity: 1; + background-color: ~"rgb(255 249 242/var(--tw-bg-opacity))"; + --tw-text-opacity: 1; + color: ~"rgb(25 25 25/var(--tw-text-opacity))"; + } + [type="text"]::-moz-placeholder, + [type="email"]::-moz-placeholder, + [type="url"]::-moz-placeholder, + [type="password"]::-moz-placeholder, + [type="number"]::-moz-placeholder, + [type="date"]::-moz-placeholder, + [type="datetime-local"]::-moz-placeholder, + [type="month"]::-moz-placeholder, + [type="search"]::-moz-placeholder, + [type="tel"]::-moz-placeholder, + [type="time"]::-moz-placeholder, + [type="week"]::-moz-placeholder, + [multiple]::-moz-placeholder, + textarea::-moz-placeholder, + select::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: ~"rgb(74 72 71/var(--tw-placeholder-opacity))"; + } + [type="text"]:-ms-input-placeholder, + [type="email"]:-ms-input-placeholder, + [type="url"]:-ms-input-placeholder, + [type="password"]:-ms-input-placeholder, + [type="number"]:-ms-input-placeholder, + [type="date"]:-ms-input-placeholder, + [type="datetime-local"]:-ms-input-placeholder, + [type="month"]:-ms-input-placeholder, + [type="search"]:-ms-input-placeholder, + [type="tel"]:-ms-input-placeholder, + [type="time"]:-ms-input-placeholder, + [type="week"]:-ms-input-placeholder, + [multiple]:-ms-input-placeholder, + textarea:-ms-input-placeholder, + select:-ms-input-placeholder { + --tw-placeholder-opacity: 1; + color: ~"rgb(74 72 71/var(--tw-placeholder-opacity))"; + } + [type="text"]::placeholder, + [type="email"]::placeholder, + [type="url"]::placeholder, + [type="password"]::placeholder, + [type="number"]::placeholder, + [type="date"]::placeholder, + [type="datetime-local"]::placeholder, + [type="month"]::placeholder, + [type="search"]::placeholder, + [type="tel"]::placeholder, + [type="time"]::placeholder, + [type="week"]::placeholder, + [multiple]::placeholder, + textarea::placeholder, + select::placeholder { + --tw-placeholder-opacity: 1; + color: ~"rgb(74 72 71/var(--tw-placeholder-opacity))"; + } + * :focus { + outline-style: solid; + outline-width: 4px; + outline-color: ~"rgb(var(--color-foreground))"; + --tw-ring-opacity: 1 !important; + --tw-ring-color: ~"rgb(var(--color-foreground) / var(--tw-ring-opacity))" !important; + } + * :focus:not(:focus-visible) { + outline: 2px solid transparent; + outline-offset: 2px; + } + * :focus-visible { + outline-style: solid; + outline-width: 4px; + outline-color: ~"rgb(var(--color-foreground))"; + --tw-ring-opacity: 1 !important; + --tw-ring-color: ~"rgb(var(--color-foreground) / var(--tw-ring-opacity))" !important; + } + * { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } - @keyframes bounce { - 0%, 100% { - transform: translateY(-25%); - -webkit-animation-timing-function: cubic-bezier(.8, 0, 1, 1); - animation-timing-function:cubic-bezier(.8, 0, 1, 1) - } + input[type="checkbox"] { + --tw-bg-opacity: 1; + background-color: ~"rgb(255 249 242/var(--tw-bg-opacity))"; + --tw-text-opacity: 1; + color: ~"rgb(131 37 79/var(--tw-text-opacity))"; + } - 50% { - transform: none; - -webkit-animation-timing-function: cubic-bezier(0, 0, .2, 1); - animation-timing-function:cubic-bezier(0, 0, .2, 1) - } + @keyframes bounce { + 0%, + 100% { + transform: translateY(-25%); + -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); } - @keyframes slideupleft { - 0% { - transform: scale(0); - transform-origin: bottom left; - } - 100% { - transform: scale(1); - transform-origin: bottom left; - } + 50% { + transform: none; + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } + } + @keyframes slideupleft { + 0% { + transform: scale(0); + transform-origin: bottom left; } - @keyframes slideupright { - 0% { - transform: scale(0); - transform-origin: bottom right; - } - 100% { - transform: scale(1); - transform-origin: bottom right; - } + 100% { + transform: scale(1); + transform-origin: bottom left; + } + } + @keyframes slideupright { + 0% { + transform: scale(0); + transform-origin: bottom right; } - @media (prefers-reduced-motion: no-preference) { - @keyframes spin { - to { - transform: rotate(360deg); - } - } + 100% { + transform: scale(1); + transform-origin: bottom right; } + } - @media (prefers-reduced-motion: reduce) { - @keyframes pulse { - 50% { - opacity: 0.5; - } - } + @media (prefers-reduced-motion: no-preference) { + @keyframes spin { + to { + transform: rotate(360deg); + } } + } + + @media (prefers-reduced-motion: reduce) { + @keyframes pulse { + 50% { + opacity: 0.5; + } + } + } + .flex { + display: flex; + } + .h-\\[102px\\] { + height: 102px; + } + .inline-block { + display: inline-block; + } + .w-\\[106px\\] { + width: 106px; + } + .max-w-\\[106px\\] { + max-width: 106px; + } + .flex-row { + flex-direction: row; + } + .gap-8 { + gap: 2rem; + } + .self-center { + align-self: center; + } + .align-middle { + vertical-align: middle; + } + .aspect-square { + aspect-ratio: 1/1; + } + .bg-longan-200 { + --tw-bg-opacity: 1; + background-color: rgb(255 229 196 / var(--tw-bg-opacity)); + } + .bg-longan-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 241 223 / var(--tw-bg-opacity)); + } + .object-contain { + object-fit: contain; + } + .p-3 { + padding: 0.75rem; + } + .py-8 { + padding-top: 2rem; + padding-bottom: 2rem; + } + .pl-8 { + padding-left: 2rem; + } + .text-right { + text-align: right; + } + .font-atkinson { + font-family: Atkinson Hyperlegible, ui-sans-serif, system-ui, -apple-system, + BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, + sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, + noto color emoji; + } + .font-league { + font-family: League Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, + Consolas, liberation mono, courier new, monospace; + } + .text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } + .font-semibold { + font-weight: 600; + } + .text-gray-800 { + --tw-text-opacity: 1; + color: rgb(46 45 44 / var(--tw-text-opacity)); + } } .cohost-prose() { - font-family: Atkinson Hyperlegible, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji; - -webkit-text-size-adjust: 100%; - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - --tw-prose-body: #374151; - --tw-prose-headings: #111827; - --tw-prose-lead: #4b5563; - --tw-prose-links: #111827; - --tw-prose-bold: #111827; - --tw-prose-counters: #6b7280; - --tw-prose-bullets: #d1d5db; - --tw-prose-hr: #e5e7eb; - --tw-prose-quotes: #111827; - --tw-prose-quote-borders: #e5e7eb; - --tw-prose-captions: #6b7280; - --tw-prose-code: #111827; - --tw-prose-pre-code: #e5e7eb; - --tw-prose-pre-bg: #1f2937; - --tw-prose-th-borders: #d1d5db; - --tw-prose-td-borders: #e5e7eb; - --tw-prose-invert-body: #d1d5db; - --tw-prose-invert-headings: #fff; - --tw-prose-invert-lead: #9ca3af; - --tw-prose-invert-links: #fff; - --tw-prose-invert-bold: #fff; - --tw-prose-invert-counters: #9ca3af; - --tw-prose-invert-bullets: #4b5563; - --tw-prose-invert-hr: #374151; - --tw-prose-invert-quotes: #f3f4f6; - --tw-prose-invert-quote-borders: #374151; - --tw-prose-invert-captions: #9ca3af; - --tw-prose-invert-code: #fff; - --tw-prose-invert-pre-code: #d1d5db; - --tw-prose-invert-pre-bg: ~"rgb(0 0 0 / 50%)"; - --tw-prose-invert-th-borders: #4b5563; - --tw-prose-invert-td-borders: #374151; - font-size: 1rem; - line-height: 1.75; - color: #191919; - color-scheme: light; + font-family: Atkinson Hyperlegible, ui-sans-serif, system-ui, -apple-system, + BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, + sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, + noto color emoji; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: ~"rgb(0 0 0 / 50%)"; + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; + color: #191919; + color-scheme: light; - --emoji-scale: 1.3em; - --color-notWhite: 255 249 242; - --color-notBlack: 25 25 25; - --color-cherry: 131 37 79; - --color-strawberry: 229 107 111; - --color-mango: 255 171 92; - --color-longan: 255 216 168; - --color-text: var(--color-notWhite); - --color-bg-text: var(--color-notBlack); - --color-foreground-200: 238 173 199; - --color-foreground-300: 211 116 155; - --color-foreground-400: 174 68 115; - --color-foreground-600: 103 26 61; - --color-foreground-700: 81 17 46; - --color-foreground: var(--color-cherry); - --color-secondary-200: 244 187 187; - --color-secondary-300: 238 153 155; - --color-secondary-400: 229 107 111; - --color-secondary-600: 164 42 47; - --color-secondary-700: 123 27 31; - --color-secondary: var(--color-strawberry); - --color-accent: var(--color-mango); - --color-background: var(--color-notWhite); - --color-sidebar-bg: var(--color-notWhite); - --color-sidebar-text: var(--color-notBlack); - --color-sidebar-accent: var(--color-cherry); - --color-compose-button: var(--color-foreground); - --color-compose-button-400: var(--color-foreground-400); - --color-compose-button-600: var(--color-foreground-600); + --emoji-scale: 1.3em; + --color-notWhite: 255 249 242; + --color-notBlack: 25 25 25; + --color-cherry: 131 37 79; + --color-strawberry: 229 107 111; + --color-mango: 255 171 92; + --color-longan: 255 216 168; + --color-text: var(--color-notWhite); + --color-bg-text: var(--color-notBlack); + --color-foreground-200: 238 173 199; + --color-foreground-300: 211 116 155; + --color-foreground-400: 174 68 115; + --color-foreground-600: 103 26 61; + --color-foreground-700: 81 17 46; + --color-foreground: var(--color-cherry); + --color-secondary-200: 244 187 187; + --color-secondary-300: 238 153 155; + --color-secondary-400: 229 107 111; + --color-secondary-600: 164 42 47; + --color-secondary-700: 123 27 31; + --color-secondary: var(--color-strawberry); + --color-accent: var(--color-mango); + --color-background: var(--color-notWhite); + --color-sidebar-bg: var(--color-notWhite); + --color-sidebar-text: var(--color-notBlack); + --color-sidebar-accent: var(--color-cherry); + --color-compose-button: var(--color-foreground); + --color-compose-button-400: var(--color-foreground-400); + --color-compose-button-600: var(--color-foreground-600); - :where([class ~ =lead]):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-lead); - font-size: 1.25em; - line-height: 1.6; - margin-top: 1.2em; - margin-bottom: 1.2em; - } - // the heck is this - a :where(color):not(:where([class ~ =not-prose] *)) { - 100:#FDCEE0; - 200:#EEADC7; - 300:#D3749B; - 400:#AE4473; - 500:#83254F; - 600:#671A3D; - 700:#51112E; - 800:#3B0920; - 900:#220010; - -d-e-f-a-u-l-t: #83254f; - } - a { - text-decoration: underline; - font-weight: 500; - } - :where(strong):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-bold); - font-weight: 600; - } - :where(ol):not(:where([class ~ =not-prose] *)) { - list-style-type: decimal; - padding-left: 1.625em; - } - :where(ol[type=A]):not(:where([class ~ =not-prose] *)), - :where(ol[type=As]):not(:where([class ~ =not-prose] *)) { - list-style-type: upper-alpha; - } - :where(ol[type=a]):not(:where([class ~ =not-prose] *)), - :where(ol[type=as]):not(:where([class ~ =not-prose] *)) { - list-style-type: lower-alpha; - } - :where(ol[type=I]):not(:where([class ~ =not-prose] *)), - :where(ol[type=Is]):not(:where([class ~ =not-prose] *)) { - list-style-type: upper-roman; - } - :where(ol[type=i]):not(:where([class ~ =not-prose] *)), - :where(ol[type=is]):not(:where([class ~ =not-prose] *)) { - list-style-type: lower-roman; - } - :where(ol[type="1"]):not(:where([class ~ =not-prose] *)) { - list-style-type: decimal; - } - :where(ul):not(:where([class ~ =not-prose] *)) { - list-style-type: disc; - padding-left: 1.625em; - } - :where(ol > li):not(:where([class ~ =not-prose] *))::marker { - font-weight: 400; - color: var(--tw-prose-counters); - } - :where(ul > li):not(:where([class ~ =not-prose] *))::marker { - color: var(--tw-prose-bullets); - } - :where(hr):not(:where([class ~ =not-prose] *)) { - border-color: var(--tw-prose-hr); - border-top-width: 1px; - margin-top: 1em; - margin-bottom: 1em; - } - :where(blockquote):not(:where([class ~ =not-prose] *)) { - font-weight: 500; - font-style: italic; - color: var(--tw-prose-quotes); - border-left-width: .25rem; - border-left-color: var(--tw-prose-quote-borders); - quotes: "\201C""\201D""\2018""\2019"; - margin-top: 1.6em; - margin-bottom: 1.6em; - padding-left: 1em; - } - :where(blockquote p:first-of-type):not(:where([class ~ =not-prose] *))::before { - content: open-quote; - } - :where(blockquote p:last-of-type):not(:where([class ~ =not-prose] *))::after { - content: close-quote; - } - :where(h1):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-headings); - font-weight: 800; - font-size: 2.25em; - margin-top: 0; - margin-bottom: .8888889em; - line-height: 1.1111111; - } - :where(h1 strong):not(:where([class ~ =not-prose] *)) { - font-weight: 900; - } - :where(h2):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-headings); - font-weight: 700; - font-size: 1.5em; - margin-top: 2em; - margin-bottom: 1em; - line-height: 1.3333333; - } - :where(h2 strong):not(:where([class ~ =not-prose] *)) { - font-weight: 800; - } - :where(h3):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-headings); - font-weight: 600; - font-size: 1.25em; - margin-top: 1.6em; - margin-bottom: .6em; - line-height: 1.6; - } - :where(h3 strong):not(:where([class ~ =not-prose] *)) { - font-weight:700 - } - :where(h4):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-headings); - font-weight: 600; - margin-top: 1.5em; - margin-bottom: .5em; - line-height: 1.5; - } - :where(h4 strong):not(:where([class ~ =not-prose] *)) { - font-weight: 700; - } - :where(figure > *):not(:where([class ~ =not-prose] *)) { - margin-top: 0; - margin-bottom: 0; - } - :where(figcaption):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-captions); - font-size: .875em; - line-height: 1.4285714; - margin-top: .8571429em; - } - :where(code):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-code); - font-weight: 600; - font-size: .875em; - } - :where(code):not(:where([class ~ =not-prose] *))::before, - :where(code):not(:where([class ~ =not-prose] *))::after { - content: "`" - } - :where(a code):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-links); - } - :where(pre):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-pre-code); - background-color: var(--tw-prose-pre-bg); - overflow-x: auto; - font-weight: 400; - font-size: .875em; - line-height: 1.7142857; - margin-top: 1.7142857em; - margin-bottom: 1.7142857em; - border-radius: .375rem; - padding-top: .8571429em; - padding-right: 1.1428571em; - padding-bottom: .8571429em; - padding-left: 1.1428571em; - } - :where(pre code):not(:where([class ~ =not-prose] *)) { - background-color: transparent; - border-width: 0; - border-radius: 0; - padding: 0; - font-weight: inherit; - color: inherit; - font-size: inherit; - font-family: inherit; - line-height: inherit; - } - :where(pre code):not(:where([class ~ =not-prose] *))::before, - :where(pre code):not(:where([class ~ =not-prose] *))::after { - content: none; - } - :where(table):not(:where([class ~ =not-prose] *)) { - width: 100%; - table-layout: auto; - text-align: left; - margin-top: 2em; - margin-bottom: 2em; - font-size: .875em; - line-height: 1.7142857; - } - :where(thead):not(:where([class ~ =not-prose] *)) { - border-bottom-width: 1px; - border-bottom-color: var(--tw-prose-th-borders); - } - :where(thead th):not(:where([class ~ =not-prose] *)) { - color: var(--tw-prose-headings); - font-weight: 600; - vertical-align: bottom; - padding-right: .5714286em; - padding-bottom: .5714286em; - padding-left: .5714286em; - } - :where(tbody tr):not(:where([class ~ =not-prose] *)) { - border-bottom-width: 1px; - border-bottom-color: var(--tw-prose-td-borders); - } - :where(tbody tr:last-child):not(:where([class ~ =not-prose] *)) { - border-bottom-width: 0; - } - :where(tbody td):not(:where([class ~ =not-prose] *)) { - vertical-align: baseline; - padding-top: .5714286em; - padding-right: .5714286em; - padding-bottom: .5714286em; - padding-left: .5714286em; - } + :where([class ~="lead"]):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; + } + // the heck is this + a :where(color):not(:where([class ~="not-prose"] *)) { + 100: #fdcee0; + 200: #eeadc7; + 300: #d3749b; + 400: #ae4473; + 500: #83254f; + 600: #671a3d; + 700: #51112e; + 800: #3b0920; + 900: #220010; + -d-e-f-a-u-l-t: #83254f; + } + a { + text-decoration: underline; + font-weight: 500; + } + :where(strong):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-bold); + font-weight: 600; + } + :where(ol):not(:where([class ~="not-prose"] *)) { + list-style-type: decimal; + padding-left: 1.625em; + } + :where(ol[type="A"]):not(:where([class ~="not-prose"] *)), + :where(ol[type="As"]):not(:where([class ~="not-prose"] *)) { + list-style-type: upper-alpha; + } + :where(ol[type="a"]):not(:where([class ~="not-prose"] *)), + :where(ol[type="as"]):not(:where([class ~="not-prose"] *)) { + list-style-type: lower-alpha; + } + :where(ol[type="I"]):not(:where([class ~="not-prose"] *)), + :where(ol[type="Is"]):not(:where([class ~="not-prose"] *)) { + list-style-type: upper-roman; + } + :where(ol[type="i"]):not(:where([class ~="not-prose"] *)), + :where(ol[type="is"]):not(:where([class ~="not-prose"] *)) { + list-style-type: lower-roman; + } + :where(ol[type="1"]):not(:where([class ~="not-prose"] *)) { + list-style-type: decimal; + } + :where(ul):not(:where([class ~="not-prose"] *)) { + list-style-type: disc; + padding-left: 1.625em; + } + :where(ol > li):not(:where([class ~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); + } + :where(ul > li):not(:where([class ~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); + } + :where(hr):not(:where([class ~="not-prose"] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 1em; + margin-bottom: 1em; + } + :where(blockquote):not(:where([class ~="not-prose"] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-left-width: 0.25rem; + border-left-color: var(--tw-prose-quote-borders); + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-left: 1em; + } + :where(blockquote p:first-of-type):not(:where([class ~="not-prose"] + *))::before { + content: open-quote; + } + :where(blockquote p:last-of-type):not(:where([class ~="not-prose"] + *))::after { + content: close-quote; + } + :where(h1):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; + } + :where(h1 strong):not(:where([class ~="not-prose"] *)) { + font-weight: 900; + } + :where(h2):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; + } + :where(h2 strong):not(:where([class ~="not-prose"] *)) { + font-weight: 800; + } + :where(h3):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; + } + :where(h3 strong):not(:where([class ~="not-prose"] *)) { + font-weight: 700; + } + :where(h4):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; + } + :where(h4 strong):not(:where([class ~="not-prose"] *)) { + font-weight: 700; + } + :where(figure > *):not(:where([class ~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; + } + :where(figcaption):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; + } + :where(code):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; + } + :where(code):not(:where([class ~="not-prose"] *))::before, + :where(code):not(:where([class ~="not-prose"] *))::after { + content: "`"; + } + :where(a code):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-links); + } + :where(pre):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-right: 1.1428571em; + padding-bottom: 0.8571429em; + padding-left: 1.1428571em; + } + :where(pre code):not(:where([class ~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; + } + :where(pre code):not(:where([class ~="not-prose"] *))::before, + :where(pre code):not(:where([class ~="not-prose"] *))::after { + content: none; + } + :where(table):not(:where([class ~="not-prose"] *)) { + width: 100%; + table-layout: auto; + text-align: left; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; + } + :where(thead):not(:where([class ~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); + } + :where(thead th):not(:where([class ~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; + } + :where(tbody tr):not(:where([class ~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); + } + :where(tbody tr:last-child):not(:where([class ~="not-prose"] *)) { + border-bottom-width: 0; + } + :where(tbody td):not(:where([class ~="not-prose"] *)) { + vertical-align: baseline; + padding-top: 0.5714286em; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; + } - :where(p):not(:where([class ~ =not-prose] *)) { - margin-top: 1.25em; - margin-bottom: 1.25em; - } - :where(img):not(:where([class ~ =not-prose] *)) { - margin-top: 2em; - margin-bottom: 2em; - } - :where(video):not(:where([class ~ =not-prose] *)) { - margin-top: 2em; - margin-bottom: 2em; - } - :where(figure):not(:where([class ~ =not-prose] *)) { - margin-top: 2em; - margin-bottom: 2em; - } - :where(h2 code):not(:where([class ~ =not-prose] *)) { - font-size: .875em; - } - :where(h3 code):not(:where([class ~ =not-prose] *)) { - font-size: .9em; - } - :where(li):not(:where([class ~ =not-prose] *)) { - margin-top: .5em; - margin-bottom: .5em; - } - :where(ol > li):not(:where([class ~ =not-prose] *)) { - padding-left: .375em; - } - :where(ul > li):not(:where([class ~ =not-prose] *)) { - padding-left: .375em; - } - & > :where(ul > li p):not(:where([class ~ =not-prose] *)) { - margin-top: .75em; - margin-bottom: .75em; - } - & > :where(ul > li > * :first-child):not(:where([class ~ =not-prose] *)) { - margin-top: 1.25em; - } - & > :where(ul > li > * :last-child):not(:where([class ~ =not-prose] *)) { - margin-bottom: 1.25em; - } - & > :where(ol > li > * :first-child):not(:where([class ~ =not-prose] *)) { - margin-top: 1.25em; - } - & > :where(ol > li > * :last-child):not(:where([class ~ =not-prose] *)) { - margin-bottom: 1.25em; - } - :where(ul ul, ul ol, ol ul, ol ol):not(:where([class ~ =not-prose] *)) { - margin-top: .75em; - margin-bottom: .75em; - } - :where(hr + *):not(:where([class ~ =not-prose] *)) { - margin-top: 0; - } - :where(h2 + *):not(:where([class ~ =not-prose] *)) { - margin-top: 0; - } - :where(h3 + *):not(:where([class ~ =not-prose] *)) { - margin-top: 0; - } - :where(h4 + *):not(:where([class ~ =not-prose] *)) { - margin-top: 0; - } - :where(thead th:first-child):not(:where([class ~ =not-prose] *)) { - padding-left: 0; - } - :where(thead th:last-child):not(:where([class ~ =not-prose] *)) { - padding-right: 0; - } - :where(tbody td:first-child):not(:where([class ~ =not-prose] *)) { - padding-left: 0; - } - :where(tbody td:last-child):not(:where([class ~ =not-prose] *)) { - padding-right: 0; - } - & > :where(:first-child):not(:where([class ~ =not-prose] *)) { - margin-top: 0; - } - & > :where(:last-child):not(:where([class ~ =not-prose] *)) { - margin-bottom: 0; - } + :where(p):not(:where([class ~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; + } + :where(img):not(:where([class ~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; + } + :where(video):not(:where([class ~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; + } + :where(figure):not(:where([class ~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; + } + :where(h2 code):not(:where([class ~="not-prose"] *)) { + font-size: 0.875em; + } + :where(h3 code):not(:where([class ~="not-prose"] *)) { + font-size: 0.9em; + } + :where(li):not(:where([class ~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; + } + :where(ol > li):not(:where([class ~="not-prose"] *)) { + padding-left: 0.375em; + } + :where(ul > li):not(:where([class ~="not-prose"] *)) { + padding-left: 0.375em; + } + & > :where(ul > li p):not(:where([class ~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; + } + & > :where(ul > li > * :first-child):not(:where([class ~="not-prose"] *)) { + margin-top: 1.25em; + } + & > :where(ul > li > * :last-child):not(:where([class ~="not-prose"] *)) { + margin-bottom: 1.25em; + } + & > :where(ol > li > * :first-child):not(:where([class ~="not-prose"] *)) { + margin-top: 1.25em; + } + & > :where(ol > li > * :last-child):not(:where([class ~="not-prose"] *)) { + margin-bottom: 1.25em; + } + :where(ul ul, ul ol, ol ul, ol ol):not(:where([class ~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; + } + :where(hr + *):not(:where([class ~="not-prose"] *)) { + margin-top: 0; + } + :where(h2 + *):not(:where([class ~="not-prose"] *)) { + margin-top: 0; + } + :where(h3 + *):not(:where([class ~="not-prose"] *)) { + margin-top: 0; + } + :where(h4 + *):not(:where([class ~="not-prose"] *)) { + margin-top: 0; + } + :where(thead th:first-child):not(:where([class ~="not-prose"] *)) { + padding-left: 0; + } + :where(thead th:last-child):not(:where([class ~="not-prose"] *)) { + padding-right: 0; + } + :where(tbody td:first-child):not(:where([class ~="not-prose"] *)) { + padding-left: 0; + } + :where(tbody td:last-child):not(:where([class ~="not-prose"] *)) { + padding-right: 0; + } + & > :where(:first-child):not(:where([class ~="not-prose"] *)) { + margin-top: 0; + } + & > :where(:last-child):not(:where([class ~="not-prose"] *)) { + margin-bottom: 0; + } + .mt-0 { + margin-top: 0px; + } + .m-0 { + margin: 0; + } } From 27effafbd07f066ff90c0324563c90fd0542f710 Mon Sep 17 00:00:00 2001 From: easrng Date: Fri, 18 Nov 2022 07:11:24 -0500 Subject: [PATCH 8/8] cohost markdown rendering parity --- src/markdown/components/broken-image.ts | 1 + src/markdown/components/custom-emoji.tsx | 19 ++ src/markdown/components/iframely.tsx | 110 +++++++ src/markdown/components/mention.tsx | 21 ++ src/markdown/components/thinkbug.ts | 1 + src/markdown/emoji.ts | 166 ++++++++++ src/markdown/iframely.cjs | 1 + src/markdown/markdown.ts | 396 +++++++++++++++++++++++ src/markdown/mention-parsing.ts | 84 +++++ src/markdown/types/ids.ts | 45 +++ src/markdown/types/post-blocks.ts | 143 ++++++++ src/markdown/unified-processors.ts | 165 ++++++++++ src/markdown/username-verifier.ts | 66 ++++ src/ui/components/post-preview.tsx | 157 ++------- 14 files changed, 1249 insertions(+), 126 deletions(-) create mode 100644 src/markdown/components/broken-image.ts create mode 100644 src/markdown/components/custom-emoji.tsx create mode 100644 src/markdown/components/iframely.tsx create mode 100644 src/markdown/components/mention.tsx create mode 100644 src/markdown/components/thinkbug.ts create mode 100644 src/markdown/emoji.ts create mode 100644 src/markdown/iframely.cjs create mode 100644 src/markdown/markdown.ts create mode 100644 src/markdown/mention-parsing.ts create mode 100644 src/markdown/types/ids.ts create mode 100644 src/markdown/types/post-blocks.ts create mode 100644 src/markdown/unified-processors.ts create mode 100644 src/markdown/username-verifier.ts diff --git a/src/markdown/components/broken-image.ts b/src/markdown/components/broken-image.ts new file mode 100644 index 0000000..4eb8367 --- /dev/null +++ b/src/markdown/components/broken-image.ts @@ -0,0 +1 @@ +export default 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIiA/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSIyIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCAxMDEgMTE2Ij48ZyBmaWxsPSIjZmZkN2E3Ij48cGF0aCBkPSJNNzIuMzg0IDcyLjI4Nmg3LjE0M3YtNy4xNDNoNy4xNDNWMzYuNTcxSDcyLjM4NFYxNS4xNDNIMTUuMjQxdjg1LjcxNGgxNC4yODZWODYuNTcxaDI4LjU3MXYtNy4xNDJoMTQuMjg2di03LjE0M1pNNzkuNTI3IDkzLjcxNEg2NS4yNDF2Ny4xNDNIODYuNjdWNzkuNDI5aC03LjE0M3YxNC4yODVaIi8+PC9nPjxnIGZpbGw9IiNmZmY5ZjIiPjxwYXRoIGQ9Ik04Ni42NyAyMi4yODZ2LTcuMTQzaC03LjE0M3YxNC4yODZoMTQuMjg2di03LjE0M0g4Ni42N1pNNzIuMzg0IDhIOC4wOTh2MTAwaDcuMTQzVjE1LjE0M2g1Ny4xNDNWOFpNNTguMDk4IDEwOGgzNS43MTVWNzIuMjg2SDg2LjY3djI4LjU3MUg1OC4wOThWMTA4Wk04Ni42NyAzNi41NzFoNy4xNDN2MTQuMjg2SDg2LjY3eiIvPjwvZz48ZyBmaWxsPSIjYjU3ODhlIj48cGF0aCBkPSJNNzkuNTI3IDhWLjg1N2gtNy4xNDN2MjguNTcyaDcuMTQzVjE1LjE0M2g3LjE0M1Y4aC03LjE0M1pNOTMuODEzIDIyLjI4Nmg3LjE0M3Y3LjE0M2gtNy4xNDN6TTg2LjY3IDE1LjE0M2g3LjE0M3Y3LjE0M0g4Ni42N3oiLz48L2c+PGcgZmlsbD0iI2U1NmI2ZiI+PHBhdGggZD0iTTc5LjUyNyA1MC44NTdoNy4xNDN2MTQuMjg2aC03LjE0M3pNNzIuMzg0IDY1LjE0M2g3LjE0M3Y3LjE0M2gtNy4xNDN6TTU4LjA5OCA3Mi4yODZoMTQuMjg2djcuMTQzSDU4LjA5OHpNMjkuNTI3IDQzLjcxNGgyMS40MjlWMjIuMjg2SDM2LjY3djcuMTQzaC03LjE0M3YxNC4yODVaTTI5LjUyNyA3Mi4yODZ2LTcuMTQzaC03LjE0M3YyMS40MjhoMjEuNDI5di03LjE0MkgzNi42N3YtNy4xNDNoLTcuMTQzWiIvPjwvZz48ZyBmaWxsPSIjZmZhYTVhIj48cGF0aCBkPSJNMjIuMzg0IDU4aDcuMTQzdjcuMTQzaC03LjE0M3pNMjkuNTI3IDY1LjE0M2g3LjE0M3Y3LjE0M2gtNy4xNDN6TTM2LjY3IDcyLjI4Nmg3LjE0M3Y3LjE0M0gzNi42N3pNNDMuODEzIDc5LjQyOWg3LjE0M3Y3LjE0M2gtNy4xNDN6TTcyLjM4NCA3Mi4yODZ2LTcuMTQzaC03LjE0M1Y1OGg3LjE0M3Y3LjE0M2g3LjE0M1Y1MC44NTdINTguMDk4djIxLjQyOWgxNC4yODZaIi8+PC9nPjxnIGZpbGw9IiM4MzI1NGYiPjxwYXRoIGQ9Ik0yMi4zODQgODYuNTcxaDIxLjQyOXY3LjE0M0gyMi4zODR6Ii8+PHBhdGggZD0iTS45NTYgMTE1LjE0M2gxNC4yODVWMTA4SDguMDk4VjhoNjQuMjg2Vi44NTdILjk1NnYxMTQuMjg2Wk0xMDAuOTU2IDExNS4xNDNWNzIuMjg2aC03LjE0M1YxMDhINTguMDk4djcuMTQzaDQyLjg1OFpNMTAwLjk1NiAyOS40MjlINzIuMzg0djcuMTQyaDIxLjQyOXYxNC4yODZoNy4xNDNWMjkuNDI5WiIvPjxwYXRoIGQ9Ik0zNi42NyAyOS40MjloNy4xNDN2Ny4xNDNIMzYuNjd6TTUwLjk1NiAyOS40MjloNy4xNDN2MTQuMjg2aC03LjE0M3pNMzYuNjcgNDMuNzE0aDE0LjI4NnY3LjE0M0gzNi42N3oiLz48L2c+PC9zdmc+'; diff --git a/src/markdown/components/custom-emoji.tsx b/src/markdown/components/custom-emoji.tsx new file mode 100644 index 0000000..ad8eca4 --- /dev/null +++ b/src/markdown/components/custom-emoji.tsx @@ -0,0 +1,19 @@ +import React, { FunctionComponent, createElement as h } from 'preact/compat'; +import brokenImage from './broken-image'; +export const CustomEmoji: FunctionComponent<{ + name: string; + url: string; +}> = React.memo(({ name = 'missing', url = brokenImage }) => { + return ( + {`:${name}:`} + ); +}); +CustomEmoji.displayName = 'CustomEmoji'; diff --git a/src/markdown/components/iframely.tsx b/src/markdown/components/iframely.tsx new file mode 100644 index 0000000..3eaef17 --- /dev/null +++ b/src/markdown/components/iframely.tsx @@ -0,0 +1,110 @@ +const IFRAMELY_KEY = 'ec9f0026fa60dcc3683e13d7b2625b71'; +import React, { + FunctionComponent, + useContext, + useEffect, + useState, + createElement as h, +} from 'preact/compat'; +import pMemoize from 'p-memoize'; +import pDebounce from 'p-debounce'; +import '../iframely.cjs'; +import thinkbug from './thinkbug.js'; + +export type IframelyEmbedProps = { + url: string; +}; + +type IframelyResponse = + | { html: string; error: undefined } + | { html: undefined; status: number; error: string } + | null; + +declare const window: Window & + typeof globalThis & { + iframely: { + load: () => unknown; + on: (event: string, cb: (...args: unknown[]) => void) => void; + }; + }; + +const iframelyFetch = pMemoize( + pDebounce(async function (url: string): Promise { + try { + return await fetch( + `https://cdn.iframe.ly/api/iframely?url=${encodeURIComponent( + url + )}&key=${IFRAMELY_KEY}&iframe=1&omit_script=1` + ).then((res) => res.json()); + } catch (e) { + return { html: undefined, status: 500, error: String(e) }; + } + }, 1000) +); + +export const IframelyEmbed: FunctionComponent = (props) => { + const featureFlag = true; + + const [data, setData] = useState(null); + useEffect(() => { + iframelyFetch(props.url).then((data) => setData(data)); + }, [props.url]); + + if (!featureFlag) { + // this user doesn't have the embeds feature flag; just pretend to be + // a normal link + return ( +

+ + {props.url} + +

+ ); + } + + let embedBody = undefined; + + // prioritize states where we have data so that we don't accidentally swap + // to `loading...` on refetch + if (data && data.error) { + embedBody = ( +
+ +
+

hmm...

+

+ something went wrong with this preview. +

+

here's why: {data.error}

+
+
+ ); + } else if (data && data.html) { + embedBody =
; + } else if (data === null) { + // display `loading...` immediately instead of waiting for the request to + // actually start + embedBody = ( +
+ {/* TODO: add throbber */} +
 
+
+

loading...

+
+
+ ); + } + + return ( +
+ {embedBody} +

+ + {props.url} + +

+
+ ); +}; + +IframelyEmbed.displayName = 'IframelyEmbed'; diff --git a/src/markdown/components/mention.tsx b/src/markdown/components/mention.tsx new file mode 100644 index 0000000..5d3dca5 --- /dev/null +++ b/src/markdown/components/mention.tsx @@ -0,0 +1,21 @@ +import { ProjectHandle } from '../types/ids'; +import React, { FunctionComponent, createElement as h } from 'preact/compat'; + +export const Mention: FunctionComponent<{ handle: ProjectHandle }> = ({ handle }) => { + return ( + + @{handle} + + ); +}; + +/** + * Default props included because Mention is used outside of typescript and we + * need an easy way to see when it's fucked instead of just crashing + */ +Mention.defaultProps = { + handle: 'ERROR' as ProjectHandle, +}; diff --git a/src/markdown/components/thinkbug.ts b/src/markdown/components/thinkbug.ts new file mode 100644 index 0000000..7242280 --- /dev/null +++ b/src/markdown/components/thinkbug.ts @@ -0,0 +1 @@ +export default 'data:image/png;base64,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'; diff --git a/src/markdown/emoji.ts b/src/markdown/emoji.ts new file mode 100644 index 0000000..6efc36e --- /dev/null +++ b/src/markdown/emoji.ts @@ -0,0 +1,166 @@ +import { Element, Text } from 'hast'; +import { SKIP } from 'unist-util-visit'; +import { processMatches } from './unified-processors'; +import type { Plugin, CompilerFunction } from 'unified'; +import type { Root } from 'hast'; + +const EMOJI_REGEX = /:[a-zA-Z\d-_]+:/gims; + +export const customEmoji = [ + { + imageUrl: + 'data:image/png;base64,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', + short_names: ['chunks'], + name: 'chunks', + }, + { + imageUrl: + 'data:image/png;base64,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', + short_names: ['eggbug'], + name: 'eggbug', + }, + { + imageUrl: + 'data:image/png;base64,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', + short_names: ['sixty'], + name: 'sixty', + }, + { + imageUrl: + 'data:image/png;base64,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', + short_names: ['unyeah'], + name: 'unyeah', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAAEECAYAAABDQFp3AAAR8UlEQVR4Xu3df+heVR0H8LtwlFQ0cDHRgUtxRdoMLFw2cbhSp27ZhrkgcW7+KFZt/iRiu8hZk9JqCppQc8yIcBbC1PBHTWZKbJakpoaT2QwVrRn6X6Dw7fPxnCef72d7nu89955z7vnxfsHhxueR0fc+z/s59zn3nHOnTUxMVAAQxgdkAQD8QeAAAkLgAAJC4AACmoZBk3iol6d9jA5vyXpH0+tjJt6VRegHAheQCdSnqM2ndjy1c6nNGf5vAriH2nPUnqD2PIXxJfE6eITAeWLC9QVqZ1E7vwofLFsPU3uM2u+pPYle0Q8EzhEK2BF0OI/aRdQWiZdTdS+1X1B7EAF0A4HrgEJ2Nh2upHamfC1Tt1G7ncLHl6TQAgJnyYTsemqniJdKw73fTyl8j8oXYDQErgEKGYfrOmrL5Gvwnq3UNmEAZmoI3AgUssPo8D1qG+VrMNZKCt6dsggaAidQ0Hi4/taqnN9lvtxM7XoK39vyhZIhcAYF7XQ67JJ16GwPtYsoeC/KF0pUfODMIMgDsg7O7aW2rPQRzmIDhx6tN69RW1hqj1dc4ChoR9PhEWpz5WsQFN9WWF7aDfWiVgtQ2O6iwysVwhaDpdTeofdEyRdyVkQPR2/qxXTYJusQlcXU2z0oi7nJOnBmAvHz1I6Sr0GUnqF2cs6XmdleUlLY1ld6bRnClo55lb7M5PcuS9n1cKZXc72IE8J7jXo6HuDKSlaBo7CtpsMWWYekLaHg3S+LqcomcBQ2Xjy5QNYhC9spdCtkMUXJB07phZ8HZB2yNCP1uZlJD5pQ2C6oELaSvEXvOa+qT1aygaMTv5kOd8s6ZO8+894nKclLSvxeA7KTLi+/JIuxSy5wFLbX6TBL1qFIb1DojpTFmCUTOAyOwBgzKXhvymKMkvgNR2E7tkLYYLQD5jMSvegDp/QGPvtkHUDYZz4rUYs6cEqvxt4t6wAj7DafmWhFGzhz4rD1Adh6IOZ7dVEOmphLA/Rs0EWU6+uiCxyF7QQ6PCvrAC3w3ilR7QwdVeCU3m+Et0AAcGU+hY636otCNIFTWMcG/sym0L0qi32IadAEYQNfXlF66/reRRE4OhlxdLOQs3dkoQ+9B47C9rSsAfig9DzcXvUaODoB/NAM3jgGIIRZ9JnbIYsh9RY4pfeKXCPrAJ4tpc/eWlkMpZdRSqUfCcUPdwDoSy+3C/rq4RA26FsvM5mCB456tz/IGkAf+hiwCxo4pfeNXCTrAD2ZR5/Ja2TRp2C/4RRWbEO85oZ6Xl3IHg5hg1gFG1MIEjiV8cMZIA/mnrB33i8pFSYlQzpOrD0/gzxED/eCLABEyvs6TK+BM6OSqe0huY7aTGrTW7SF1ILfTPVoJ7X51cF/Z5M2m9qGKjHK8yOQvV5SqrRWATxDlxMnyWIbZtraNllPjLPHRCX2OWDTa09PYfXWw9FJvkPWYuYqbIz+rTvpcK2sJ8RZ2Bj9W9NkLXLe9kLxEjilt0pYJesRWyILXdGH7MeylgjePtxZ2IbwpXoqFilPe1x6CRx5RBZi5ukDxrbLQgJ8DY//ShYi52WupfPAKb3r1lxZL9RfZCEBT8mCC3Uie/8Po8/y6bLWlfPAVQGGVhMSxbJ+aG2XLHTlNHA+vhEA+qQcb53uNHBVmr9ZAMZxut2+s8ApvYo7tZvcAFNyOWLpLHDkdlkAyMTPZaEtJ4EzE5SxsBRyxQtVj5XFNpwEjmySBYDM3CQLbbgKHLa7g9wtk4U2OgdORfzwOwCXlF790knnwJH7ZAEgU1tkwVanwJlJygDFMFMXW+sUOHKFLABk7luyYKNr4JJb0QvQUacBwtaBw+UklMrMqmqldeDIJbIAUIjWT9/pEriNsgBQiNaXla0CpyJ5XjJAX5Teut9aq8ARp2uEABLUasJH28BdJgsAhblUFppoG7ilsgBQmAWy0IR14HA7AEBrs2THOnDkVFkAKNRpsjCVNoHDgAmAtlgWptImcKtkAaBQF8rCVNoEDgBasgpcmx+JADmznVdpFThysiwAFM5qENE2cJ+RBYDCfVYWxrEN3FdkAcaaIwsJOFwWXMh4/u05sjCObeDmyUIO2k5EbeAMWUjAcllwJNefI1ZPirINXK7Wy0JXZnPcFL+grIe6G8LepZVF4DK+JGDrlMP9440XZCEVdC4ek7UulH7mebY7c9tko3HgqvyfdbbbfDA64Z5N6YfIp/xgkwX0N/D5aPxBGoX+Db562CbrmWmcjWkTE/zZmJr5EJViK7W/VxYnknyU2sIqv2/yZ6jtoGbzBNPp1HiSe0rP9e6kPmZimqwdCgIH4EDTwNlcUgJARwgcQEAIHEBACBxAQAgcQEAIHEBACBxAQAgcQEAIHEBACBxAQAgcQEAIHEBACBxAQAgcQEAIHEBACBxAQAgcQEAIHEBACBxAQAgcQEA2gZshCwDwnsbZaLxrF8POXQAHa7pjF7Pp4QCgI9vA7ZcFgMLtl4VxbAP3O1kAKJxVJmwD91dZACicVSZsA/dHWSjEfmp7ZBH+72Fq98hiIXbLwjhWo5SsoJFKDthP6mMmfjNcpL//rsrfM9RSs4HOzw+GC3R++CEel1DbOFzPlc0IJUPgJttObTOdxLG9WebnoKmH6TydJYvD+NFddFhJ7WbxUjZsA2d7Scn4Q5kT/iY+jk8ctRVThc1YIgsFukoWJDqXb1O7xXwo+ebwpdTeEP9Zyqwvo9v0cBfQ4W5ZT8x+agvog/CqfKGp0ns522/2Yabne4ia66fOhraSzsOdsjhOmx7uSVlIzE46SZ/oEjajiN8oI8yWBRum55tf6Yc9psz60czWgaMT9ZKsJWa5LLRB56GWtUKsc/BlNXCOLKSkTRasA2fwMHCKXuNvV1ns4ERZyByfv1tksS2Hwe3D47LQRNvAbZGFRByQhS7oA/NcpQcCSvFpWShYqwy0DVyqPdw8WeiKQndHlfGw95D5jq8OBgNwqbpfFppoFTjXJz4kepMvlrWu6HxcWeV3u2TY1+pmt0tsXS0LqaDz8aasNdEqcMYGWUjENllwgd6AFVWeoeOh70mzbVwwtwZSvS3QeoS6S+B+LQupoDfbyxttQnebrCdsSW15n8nCJllIyDZZaKp14NoMiUbEasKpDTov36bDYllP0Gz6W1r9TmlojSykostnv3XgjNZda9+ol1sra67QG/IgHaZXaU5j2lrraW7ehuzNBPBUdfrMW0/tGkYn7ojK8VB7YDN8DwCZYKcwiskjzzw44vt8HEuHfbKekJltB0xYp8CxxOcUvkEn70hZ9CHi4G2ldl2XD5GNxD8vfPXSeg4p63pJyVbKQkJm0QdgvSz6UL8/a55/38Uwh/BSc+m4OmDYNstaYlbKgq3OPRxL/VuLnFjrWSNB0Xk7nQ7fpbZMvuYJ97A/o7/1RfmCb+Zv3SXrKenauzFXgbu1SnjUibk4mV3QOTyMDl+k9nlqX6G2YPJ/YY3n+u2g9mdqT/n+bTaO+dvekfXE3FbrEehOXAUu9cETtpdO6CdlMQZK3yQeLIn5CLUPDb38X2r/pvZP+v//7lA9GhlcAbFOgyUDTgLH6KTy2qCu38p9c/ItBu+jzwXf8/Qy0SCgPbVev9eZi0GTgW/KQoLWqLQn1EaFziVP7E49bGy1LLTlrIdjdIJfp8MsWU/QQvpGe1QWobkcftcPuPx977KHY/xjPwe76ANzgixCM3TuVJVJ2MhCWejCaQ/HMurlWC+3C1JmLiNXyXqqXPZuzHUPxxbJQsKeVfr+ETRA54p34sombMTJQMkw5z0coxP/DzrMkfWE8awM/uaGETIZ+p/Ede/GfPRwLPXbA9IWlfYMd2/ovBydY9jIXFlwwUsPx3K7lh/C68S8LV1JidLbVWyT9QzcS++xlwFAb4FjmX7zsaJvkCs9VYs3BHa+KVMMfFxKDvi6pBzIdQs5vkE+Qc3ZDdFUKD3jn+dFZhk2sk4WXPLaw7GMe7lh2Q+q0Pt4DR1ukvXc+OzdWIjAHU+HvbKeKd7J7IexTiK2pfSk6esrz9/6EZlbe1665D1wLOMBlFH4C2Ztrfc2SQ69X+dVemfhXCYwNMF7uXj/iRAkcKyQS8tD4WeI3Vj72UjVGaW3Dvw+taXytRL4vpQcCBm4ki4tR+H9Q35ZRzAx2ow0nk3tsqrQkA3xfik5ECxwzIxwlfJ7YCq8hd5vK71H/d9839tTercsfhjHNyo8o3zYzbXeqj6IoIFjKq/JzT7wBkO8mJe3RuAVxrya+z/U/lUPbZNgeqgPV3oF+AepHW7+98crfX5Ppfa5Kt/hexeC7do20EfgctjfAvIwPfSIsu8b3wcxf2AOW4FD2haHDhsLHjhmhstj3BQVysC/23q5ZRP8knIYXV6+UHmalQ0wQq+7s/UaOFbw/TnoQaj7baP0ckkpzJQFAE9myEJovQeu1ptrOl/KDiDw/jS97T490HvgWK2nPa2UdQBH+DFcUWwGFUXgWK0fbdvpYXcAh3Bt7eEZ5W31PmgiFbiyAPwJOm2riegCxyh0/NSX0ifUQjfbKWwrZLFv0VxSDqv1Bi73yjpAQ1GGjUUZOGZCx2vJAGzwQtIow8aiDRyjE7ecDttlHWCEIKu2u4g6cMx8W/HCTYBxeIAk6rCx6APHzInEZGcYZWNso5GjRDlKOYp6edraCsGDyVaae7hJSCpwTOmn2eySdSjS/DryzZmk5ALHKHRH0+EVWYeizKgjmBtpK8nADVDwnq6wZ0dpHqegnSaLqUhi0GQUOvEnVZh/WZINKYeNJd3DDZhNTHfLOmQli8c/ZxG4AWzZkKU9FLRs1ksmfUkp1XqvCmw0mw9+KlE2YWNZ9XADSj/15YkKvV2qeDPck+setrHzLcvADah8H4mbM16dHc2CUdeyDtwABe+uCvvpxy76iccuFBE4pvTDLP5U4bkGsdlPbUHt+WEmsSgmcAOYGhaVhXUEj+4KqbjADeD3Xa+SmnDsUrGBG8AKhKDWUdBukcWSFB+4AQreBXS4W9bBiaxHHm0gcIKZJsajmnPES2CH76VdXie2fMY3BG4ECt4RdLixwh6ZtngyucrxprULCFwDFL7z6LCpwlKgUR6ntr60Ecc2EDgLSj8umUc3r6swbWwvtRtKHW1sC4HroNARzuJHGrvIarVAD86QhQKU+Dc7g8C1RL3b5qrM5x8sNX87tIBLyhYwS+U9xc4W6QKBs6SwY9iw4yh0L8kijIZLSnsI2/v2yQKMh8BZoN7tMVkrndJbFUJDCFxD5nfbAlmHah6dm/WyCIeG33ANKL1HyluyDpPMpd9zL8oiTIYerhmEbWo88wSmgMBNgXq3a2QNDg3356aGS8oxzIqBA7IOY+FWwRjo4cbjNV1gB7cKxkDgRlB6BfhRsg5TM5O64RAQuNGw3UJ7pa2gaAyBOwT8+O+OzuEOWQMMmhwE99ycwgCKgB7uYA/JArSGARQBgRtCvdsJdOBdu8ARpXe6BgOBm2ynLEBnu2ShZAicofR+lHjQhwdK73oGFQI3DKNq/twnC6VC4Cr0biGgl9MQOI23Nge/0MtVCNxgZHKOrIN7GLFE4NgdsgDebJeF0hQ90wTLb3pR9Mrw0ns4fjoOhHWrLJSk9MCtkgXw7kxZKEmxgcOarf7QuVeyVopiA1dhzVafNshCKYoMnLkVAD0q9RZBkYEjN8gCBPcjWShBqYEr8TFTsTlF6SfKFqW4wCm9ZTnEYY0s5K64wFW4nIxJcQNXRQXO7FeCre8iovTz9opRVODId2QBelfUVvKlBW6jLEDv1slCzooJXGmXLimh9+Z4WctVMYEjV8gCRKOYaXYlBa7Y6UQJKOb2QBGBw+Vk/Eq5rCwicOTrsgDRuUgWclRK4G6SBYhOEZf82QeuxPl6qTITE7KWfeDIV2UBonW+LOSmhMBdLQsQratkITclBA5Pw0nHPFnITdaBw8ru9OT+nmUduAq/31J0oSzkJPfArZYFiN7lspCT3AM3RxYgelk/xSjbwCn9CCpIUM7vXbaBI+fKAiRjhSzkIufAZf1bIHPZLkrNOXBZ/xaANGUZuNzv5ZQg199xWQaOLJYFSM6XZSEHuQauiLVVmcvyPcw1cNnPySvAXFnIQdGPHAYILdceDiBKCBxAQAgcQED/AycUgCEJ17/KAAAAAElFTkSuQmCC', + short_names: ['yeah'], + name: 'yeah', + }, +]; + +export const cohostPlusCustomEmoji = [ + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAABVQTFRFAAAAGRkZ//nx/JSZvDp0HRsbGRkZ4XpXwQAAAAJ0Uk5TAP4slhIjAAACxUlEQVR42u2YXW4jIQzH88RBUMUFIvUEFkfYZ5ZFvv8RKjAfxhgmmV3tU1DbTGf8898YGEwej0/7tNYw3MIM3pS7oxUeGMzbcSI+TED8P5jB1sJbWryFN5XeABUot1vQmZsg8Akxgb/kBgXlFzIG0MiL9GXT/LcoQWn7vBgGZftEH8C4PZXIqtoPDHS5mSpdgxor4zb9aia+mTPMK3KGSxXPCUSUipygfBf2R7mZAqWT9TosYqCIrXJ7CmQ3+fU+RH+SDqcQ06yNGkZins8+RtE8XnNiyDs98ygibo76Qy4GY1VJsc7Nq66K+T01c5MYe5QATlzoGF/BKtU5aJjBeSXCptV8MizB661hB4GNqIixh5LUjk3YsszWtEzjomBs6JKae4b9xomy1tqJy/9Ea63rk0nksUIVHL5ivenqm50wJmbt4FLzFftNl7cFiXEqc9VXZDcdJonNBtah4ssiEja65rF3iz4Jiy28SJ8SG0kkMI0QHN2M9WrGmAFG+8VCwOFMYuS3OkW0LARHiKMnEisG+adkjIWA0Vaf5GLFoq0WE2abswNGDwVma+gZC1qQOaAxJWuQzjp0eMByP1BiiDXFGkbDUtHEMll9lfBRYCNpxeBL5remE9sqnWbJGG45mj3GjrFJICcXzJOrv5UR01jzFyvAjbfytClE2y/4enNrpZffd3+euckyMCmbTbb8znKmUQu4vs2QzH5hwZ7PwaV1yx87afX/vWDHzYBjj9tY574vMGxdaSPQMnKx11Aiy8AZxOPuC2tKZSnOXY9MygEMbTP12ubURdIsNgoFfYeHqXqVlbLeJz+qDr2+Nlu5ubwX9a7Zy/Gdd6muN8WIH2IatZMbRcPmfIPH+eF3xz5zWTPph6J9reVPR0yz4a7Oe+pMfuE0u6yBF8/A23NseOd4/len7Vtn+zvfP3y+0fq0T/vX7QdQ0AEZ9V6JmgAAAABJRU5ErkJggg==', + short_names: ['host-aww'], + name: 'host-aww', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAABtQTFRFAAAAGRkZ//nxY8r/Ysf8vDp0GhwdGhoaGRkZCfvM3AAAAAJ0Uk5TAP4slhIjAAADDElEQVR42u2YS47kIAyGa5lzUGqJdTGLXASJ42QS0eNjj4wN2DySrmg0q7JUXWng828ID1OPx8c+lg22W9gCN+XuaG0P2Ja34wR4LBvA/8EWyLa9pSVte1PpDXAAod2CzjkF+RABog+XXKV8+njEvM/kxfBhU/yblHyy+bgsAsL2kb684OZUpFbcvmJ+LKep1DXPsQpu0q/cJOTmAgsDuUVKJc/RN1EO5BoqFOFwKqcpP+gkP2+dmB+I9XJzyrfdlM/zEMOZ9HYWYtTaMMJILMjZJyiax/2YLOSd6gI0EWdHpVKK+bqqWrHC6VXHYmFOaU6Jiaro/Rm3FUyu4CFVOJ+xBfRK9BPj8RRY9D+3jJ0ITESbGEsocdgxhXXLrB8W9V4GmHh1cTj2AvsNijLGGMXhP7sxxpbJ1IwjQwxWXzsXWt7ZCRNixlQuZl97KbR4LLSYpJBjX7sotBBbTDcwFga+DABhtWsBSrfom7A9h7fTd4vVQSQw1hAsFe78pLHcgFx/iRASQs5ajPymaqSNCMHCbrE2fTqMxEirDH/yxVoWKJwRxo41hgiWztW4CwrbqdQCNdgUlpQMN1AYjZSh2iQnJhHkAdstNBhAGhawAK+nxHjNZL3qLAVpkzvUPIxZBYYFT6jj/aV6TH/sH/h+tdjLGJcEKVj1NosdL/cUWEB141ZoJpeXkwsx5xwo7OmehO2TFYDQ4X5pzCWDQor1VsRSkxXf25L3f5et2YTEBnQ4t2K9wA6H4Jq8qVMnaIwn18K72OGwlGr0kS9OUoqlngDYtexwurdj7VqPAMI4Nvw+O3Lq6Zax0I5F1BmXb85SxrqcoOlkkAnlIjGV2EHaFMXOJlOghXZoxlTGxIfuMHnNmFOHU+BToiY5Abp8a4RRcp6f+kyZ+nC4Js3SDvr8Op3CV1jo8t2UBF1gYZDM86xq8tD6OKYomzz0G2hz2dkNoMW67GF832iwEC8p7t0K01l/fpWaQuf3tjhJIbfL63Kcp50/uGb//OJ8C7p7RR+Ad35/+Pyi9bGP/Wv7C/7EKSFDk5GnAAAAAElFTkSuQmCC', + short_names: ['host-cry'], + name: 'host-cry', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAACdQTFRFAAAAGRkZGRkZ//nx/6ZJvDp0ujlzuDlyGxoaHBkaGhkaGhkZGRkZCcJtcQAAAAN0Uk5TAPT+0KM/fAAAAzlJREFUeNrtmEuu3SAMhrMAltIZ6iyTSgwzpZ2wtC6lg+gSpKryoiqwAZvXOYnu8CJFSggfv3FMMGzbV/kqX+WTC1A5HzB3SAVdOef9z6FY0ptzpHDOocgR3A/m5JCl4hrNhQ8K05IrLNiuzDC1guzcoSvuHarn4N/MRumSMNAKbiCnqLXrHelyTS+nqkbHledejlvmpJmu9tJiSgg48cQenLRSNWY5Gife/xFdTExkCi7grTD4HIq54utgHeBz9YrAqlgO2UCtSazGN8NURwFQ81hTKazmYpXSWmsASHKpWby81noHrO7ECEpcNDNh8cZj7c7DkosRFRtYwmyhiDsLlsV0KVEljS04Xr0XTFUxn98kzqYPYMvAPI26YNmNxXwAvcfvFshyqvTp/ZlttNVGKC2oOt7mvgC7FTZa6oy09A7FTaUnn+6FQxxVYq/gdWjE4s0I0wzbQ7W8YBofEvYBtsN8xTxzU8WKHwUGGgaY3zlmBxiMsOzKAeb1CGN29ljyZIullp4NL2FsxmPHucV3YbquzuwwGSXMhj5KGCZjUutQbJAx2WFeaz5HutlEHUjMylhn00n4scMcjFadZnF2HWaHq7fsLOB8E5jjEszDUDuwA+ydcgtzNeAXWJuW2Gr9N5qlYyyM+3FlcoeVTfjPu4/Re9eswjOs+SQMyz/XF9hvZqRj/+SVkRQtP8u/9i3sV8lxgkwU1PLDuRi6f9NSZ2UWtPpwdQUOtsm5Zq7ExTdnWmUesIXbztNOWgcKxdMEO5GTWZgR+d3EJ5TGVO3LHE0GFF5PmwvAGNwJrAcnMXMkOTVIFBbYFaWM4V5RL+UcXMYciBmOhTUVldDKy7APvpaD5Ee08jKDnGuGGZRL19FneNORHeVimFpxDi3MVpqjfnOYco4NLMkxn9D2ZhaYGTE4OBaYww1RXS8MWhmLwLZuSySWGbISsQPmW0yxccYgQbnD/BD7lSkUXyUZwsxgmzPcoitCqAw3Y4Otssr+IEGY7zTlLu0VNjs2eISpp9j1BNs+A4P3MT649w951FPsYkO7gUGl4M451FWoG+dXWe6AO2JpXhn8m5+PjthunsypR1Q9B9u27T+oHIi5SV3iTAAAAABJRU5ErkJggg==', + short_names: ['host-evil'], + name: 'host-evil', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAAA9QTFRFAAAAGRkZ//nxvDp0GRkZNYWPDgAAAAJ0Uk5TAP4slhIjAAACf0lEQVR42u2Y2XHEIAyG98GVaOnAFEBA/deU4RBISPhKHq3JTGzg0w8yh9jP57XXXvtnw2bhAXOH3FBZeAJlewQdcxzam/lTblOMIE/Cl3Zl67hsa4i4NWVDjQu3qcotxrUfmDfkthMpW+4KZchdoYpcUGKnVJG7TxW5212scuG+mMQui+VeBi52keKDu9zF2suVmFfSaGBKTHWZFYyYqJH5qUC4JWzTI5OO5reOpSIhW6JB5TaEtRZKob6ioBApJq2PHjU3by3lpWHcLee8SXU1qvBqJ5kK2ithPyi6dbDSSm3FtuHwaJccdR1TYRgKmjKwfQoeYZ6XGtg+RZ3cS19YAplMrHjLdfMHNDB5CqbdJz+VWFiuiY7p+dSfI4hIyqUUAcBZGGRj301MnghUPWFAFUlhnqgOEsbLFdZ9AvV0x8SkanGq641hkYDYOuTzXyT5+n/GPI9HBHBlltTWY4R0EDOMRwOgfm0R21gfBVac9eDHL+sCDmcOaZUmNrQ5A/LCV25yhEVnYXCGARhYBFew8ABz7Qjo642w6HKDGYPiK1eECUP6qlgm0Yik60oRcMbIcYQiuMs+gGuC+OEnwPyJ4Gt8zTG0OSZics1zp8dRTRM2lRNfTUiyA0O93soS0cuJnfdjx+Pr0Q1nyCmeXSSxlzSKbfFs5X40ttMG4FQ2T4VB5FvGPlnay4NOJoXq5OtU2acYp1LJaWMeD8iPAZXuJusYTIi++fBGMm+eoW0nZfmAlZMnLVZb58Et7jeGXE1u6Kw4uG9YGIt/WF2kJkyevwdXqWVWcXJvS2ZScXSbtTOl8zvw8h4b7lzP/3TbfnS3v/FLwvaAee211y7ZLwjf0cjwHyqnAAAAAElFTkSuQmCC', + short_names: ['host-frown'], + name: 'host-frown', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAABJQTFRFAAAAGRkZ//nx/8drvDp0GRkZLJG2CAAAAAJ0Uk5TAP4slhIjAAAC7ElEQVR42u2YQZakIAyG3XARXnsCnzco9oyS+19lHgRIIEGhZpadTdtWPv4kBES3LZuBaNub9S6IRfPPmO9vzGGdHNzH8R6ocIjYEcln7GbhGB/HidT5HOMG90kDxysDE2IxpsoZhvlX7ChhmniRsHMGK3JYdRxoe8eOE1Dsrph/7ZJaAIB0kbKdwdDLJP9Uk/O1KWMFAMrViTWBGSyHhOEi5iewInZjlgZEjLK7oxOJpay6LoXGPK0vEsuYV5ZfCxrgYilPElOgvGIMdcidm9H4Rwiwcz1lkGsioE82V7kyNLrddaaNYBqyL9lRUkULH2FiozHljhlDhRPz6gulQ5nz/Tbp3yjk1M2sr4Ssi9+UfTl8Hk3KzVCK3AyV5LwQe6WS3DqV5JZDRDm/LtZi02IxSs/FJime3HSIGOUXYgxbEWM1WRGjmpgVsQYLX2BrYqUmXYxOnXq2gl15KjIvp25dzSaoYI621qBQiSvYn3b3tdbahov/XNbaHTlXHgbcwWajhB1CFsFAGBOzlrhQxrrqzR1AYpyKXB7rYjd3CD3WOtgdlLEsAGKUmoOaFv5F7CrhXfi3x6iICAYKYcebV75qMeYAl/1hIQAN1mM4bv4VwLIQdhxojx4SI4dYMRYCKaGHjqWwegwz+BfM/z/s2rXcLM/Ni0ruWEXekdEdq7jjLy2WB77yzP00Mdg631BWadMlNN1iNoHVX/Rk11wfpbl6bGoFlONS4OsNWBJ1sF3E2K1ubkFsQOzYxbDOQx9MwRyX4BsTH2BbfwKwU9DaI7E+uUdYEBfNkWvwwHHQX7QnLqNijlUysIrwo0xQs2CRKYdXDXPtdAcppieXNt8SI6gn5cFBId8tP4J2lNSLEqhFnDjvmqEcdbRTPlLAUI49r/Uz+VAuVF31DWDQuaGqeuVF9eFI48ZfX8bvG+7pm40ZcI69X44+1oi6THweEocf+fL8yOkvzqvc6+eC4Sv6KrjNm/mC+bVf+7Up+wsZu+JvtBq5AgAAAABJRU5ErkJggg==', + short_names: ['host-joy'], + name: 'host-joy', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAABVQTFRFAAAA/JSZGRkZ//nx/JSZvDp0GRkZDfDvMwAAAAN0Uk5TAPr+TiAS8gAAA01JREFUeNrtmE2OtDgMQLPKCeYm1pcTWLkBrNEQ3v2PMAsn4ECgip6RZtOWWl2i8uKf2A6uEHqJECKElwIswPKOilS5//6kBPuvStFbzIxZvJIlhEBRzaqZZ2OcMqiY3mOgcLgOaobBM1Y0Hz5EimpmCSEadhdJiiq2awTTYVjRusMdVgzDYwHKvY3O9dhjEe5tdK5D0XxgAcqtjbvr2AbZxQFubayuw9LMPbDIQybbSVG9/MtH/SmRQTMs4aotRLpUxRdEpBxZWMPTvlx6hj6fWuR2bFhBJ7BVDo3z2ADaS+sI3Am7gYyL3m2HeWiqMg+K3h6UzImaOpkvnK/ZxmzTRfqj8NUd76HGXbrE0qgxVLlzBrF8oowbdbNLJK5xWUbdbJseZejdR2qg7htqms5Y/OTXoe49NU3XDNu+wWZv5dfKeuxrZdPUtYivKe/c1yaalT9Q5rA3ylxM3ig7YhLfKOuw7QfYO2UtJvFn2LuA/Gvs71c2VuxlHB02/X/YsFnOriDn+na2naEzOHcXygAb3G2OsqVXDGAVkXS5E0VEKnfBZoPEwO3Yqz4UYIAdlEhq6uaDEoHtgs2OEkn1uadE4IL1C6TFze8lia2+Bh3Y2sxbRURSxXa36mYnbD6CCKtIcibU+NdPJ8wtQMSZUPditY8dBm2BsLL+cSYArImELQgdti+QJAlngu0lq7CKPGAiMsBE0i0mI2xNHluu2Cqp+ugxqZuxStonFU7azIOzNkQSq6SjJ7tIAgl8RlrQV1jF/jw207xfxRZNXaAk2X4CIdo0xDZNsLUjsrOVP91prvW4k82uNSYzmWmYXHOfXMCCNoyitApoqdxXAFVtyTSMGVW+qTewcbHeOEWViY/VbeOXvVbXV3pmeO4lCdCS0YYVzQolP3auBJRcMpr3eQUFzdunPqm5qLlWx2KlaN4mylNXLsqORVSpmM1nN3cAlEzRamMsmsHmaYqOb7u52ggOg6JFSwbN3FNFWVBtlZNt2i56p2wPCMFh9byLosqdKhYKS9hnqGBYpmgZ2dgomxRj9/aqWnNlG0PWG61BujdszUNsfv6Rp7p8spHLAH2DdZfdR6qSlsvDwfmRew89jOhvwf/wd7Vf+ZVf+bH8A1hYAvIoWmNqAAAAAElFTkSuQmCC', + short_names: ['host-love'], + name: 'host-love', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAABJQTFRFAAAA//nxpt+gvDp0PCAtGRkZ8MlanwAAAAF0Uk5TAEDm2GYAAALfSURBVHja7ZjNjewgDIBzoQC0SgORUgGihHcnQe6/lVWwDRg7GbLHp+EyuwwfNsZ/zLJ8x3f8N8MBpD9gAAB/o244oJFMFbfN+gbESOrbbbs4tdk4kvz+vLBdzBrQcBBXhAlxN5DgGNvBgAKNqDjGNtLSKUaQEgM4EWMmBzWEXYpJdppx9xBz6noSUucNRFzqTZAWAJJ17rdYGMSlTu72gEXDXUjYtkOYEifua3vEtLhiweKg9zYp4pISFoqDwryWSEVAP3uw5SmcHi8ZsSctAZTThwksQh9j5FEz2LkJT8khzJwNuhjjOInFko/3fbZM4KrTo5fA09FaaLagfIobC8t9DIcpzA1ZI0xjD16o7M8meRYwXsBJKdxJI0TTKHzmWBORnRGzgnBZzUM9FltqzQbFHGHsF4Xy3nvBXf8c3vuV/R2oUO3ttj0NocFBkytGF1ChoiWxUReXea+jTq4llgGz8l490vueo72ObnKFXLAuV8kFfgVjLw+A2Nlh9Vj4idjB6h342WG57UuW9t7npsKKkwf9tSxUp+q+tAAO/9OpAG2zDtuh7lsv1od2NN7rWqGxfkE1v9gLcEXD4kuM0vcbLLGT5ABvMXLsd5ijJYCW1BgMWIvSawWMG/+Edm/DBWC4oYsMV3T40DnqaMiGZekQ7FzBcK4RO3pXlhHArsxVmLCYJ+ONqqLjYjMZ3a3cBNJyJpeMGInTmSuKzMWVu1YArMK6Bw12C6tT+ZBeY7Y67SFxYw2I0M9wDRg6PKOyZFECsu64XI/9o44BRgUy6d+3MlmdLRt1Sr4hnFFdMp4oYImxOvrxcK3+Fb1ypMBSDxazpaiW4ysEq5W02lRx81H1u84QB6VEoIqR3Sfpl5oSVlC+QIsyxEW0ZRbmNR+GA6bPmayH5n1Lc0sNvYlp0nTz9DY5yzv0s/ezJ949l7MR0+njqx0+PJxnuTTzk8R7yADf/QrymvmO7/iOqfELukMv1J6RXdgAAAAASUVORK5CYII=', + short_names: ['host-nervous'], + name: 'host-nervous', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAABJQTFRFAAAAGRkZ//nx/6ZJvDp0GRkZaPI+mAAAAAJ0Uk5TAP4slhIjAAACvUlEQVR42u2YTdLbIAyGveEizMcJPL5B2FPHuv9VOiBhJCEc47bTTdgkg3j0CvFnWJZv+ZZv+csFqKQHzAzpoCvpCZTLI+ia49CLSvzIuY4R5If0Ha+ujPPixlDlxpQNEZemKeQG/XpdlGjIuQ9SttwdypC7QxW51Il9pIrcPFXkpkNEuTQvJrHbYjnKxMVuUrxzt0PEKB+IMWxGjOVkRqzlxM2ICex4gM2J1Zy4Z9hcQv4Y+zUVI2GTeWTY6/9h5mYZ2YJETHbNPG+iOFAMzDjbGIVNeyxbdu996M5E770nrsMiQh7Bo/miSl+cdVijCnf6Oit9bqyxyKjMHeSLVXqADpMNfM0b95Wd4Xpj2F7DK38CYWe3yJnCYktiAQMLgfJP/xTGGoD3LATyVZxprDgL4IsV9h8WAuwhWwMgtggMGxSjD8BCyDXV6m0MG3kvsJ2wcIntFtb+JBMD7IbEAvU4/6mbq+hbECsgnnmiVIa2J7NMZlMQGCXdEwYaI8cYJux86qAMoG2RJwANEQA2+BGjCXuNsZ1uRz8hzskV5eRqJ7ecJm0qyxUAVbZhcHu9sfO+7XgfVzfIr4tD7yUBur1Ef5s70WK0c4Xu6sGagNwSu30yyc+0Q3Mr33QjVUlQnMJErfL0ilgneudk/0sLhWVu1RyfucW82morkqmTA3ijdevPodPSycVqW60TZ61cUh+vEU7Kyn81JnHhyMHUOMgLG7EWp0wmwBnj6Laoo1xkGCQoy/s0qo9shiFXft6o3qiVXwWUqTXp6zZ1g3iCLc7ANjAr5aXqbVBg1V5hm5XFD9g5zA6gz/IQ29oi6QSvggQ1Ojf7pi+T/xTbNHbRN+Bd0zdee06qSJRHOThpGUVygW36gUAsuCHWPUcwOW1rHrf+8cNa+Mqj9fbhhs9a7vLBa/w4df1s5YY2rvUbiDYMwu77N3UAAAAASUVORK5CYII=', + short_names: ['host-plead'], + name: 'host-plead', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAABtQTFRFAAAAGRkZ//nx/+fR4m6dvDp0cRA+GRkZGBgYKFptLAAAAAJ0Uk5TAP4slhIjAAAC+UlEQVR42u2YQa7jIAxAu+MIs0f6ygG6mAtE6gkQN0i3/PxPfYS59ihgwAYTyB/Nrt60IX7YGAMmt9v/FAAAN1JShxZU1JCLFOHw+ZxTtVZugNE4mFZpcDMUaqnYgzo1p5I+xXKHbkQV9ays+uboCDJGXrquMVceorKjb7vGyhM6y167kTH5vRsaExXcdWMnmDj1JChu5DowcTS4Ddbk80RCKpoPgnRHfAadR5lCBsUOOdUwjBysNm8a6cdF9aHE9SkZQs5dpiLXGZc5ESuYUwNTsrkZSjA3QwVzrjE2pIK561Qwd9nFaM6JxqzYRZochhVNK2YlyW/g+2ZFMY6uJWC7NBRKa60ZdzzsWuvl+GMzVowhhGAZ7I6NS33uJQWtC+eTsT03LmQVEGNaUw772knjwo5LQUEvIPSlKZbCmN/E34jtycyOvy75aEi/GGmttS8uxFgcfxeMiSoYUYBdfxAXoHSGGJnqPbbugdXEhfAcXwlYUEhD8cQFyKMOXQTsEwzFUsQYtqfgJizH8TJm/gGzP8d2KSRQhSRGMudjDhpOwAdzvZ4AigGbbsNnE6d7qTDPEyIll5GTK0+2zysAU5mvgJTKUGEwvd4odgxuanXbCvNTe4lPxW3Oramdy1RYMDfeJxvMwsyubGvMgB+fAebPL1ylvpwmU+dijRl2xtluTVNjRzPT8OHXC5VQ7zi0QslGTlPVOXwB7sJcWLIny8a+7vcAft2556dYoFB+Q1soKHFwFu5ESiLR060T6AyRtKUXJ98LYxpeWULs4BaMvbZniuNrI/UALRNa7LUdEqFtI8lKSxnf+LgxiQq8eJ3FbHuHl33kWF0pt8urwp64zbSl5KmPT2hdpEUQxWLwMaCRcm1JXvlY5iwMTaIacwH4Xtd1fUDwsXO/gWo3AIA1ymHu2bv28UrZZmhdH68+hReO7OP3WrDTK6aiHMEeg/se2TNsdnHi80rZbRCDqY8yt+491o2/ZV2GLl7Rz8ALn93UD5i3vOUtU/IX/gbifVzXAogAAAAASUVORK5CYII=', + short_names: ['host-shock'], + name: 'host-shock', + }, + { + imageUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABsBAMAAAB9SEr+AAAAAXNSR0IArs4c6QAAAA9QTFRFAAAAGRkZ//nxvDp0GRkZNYWPDgAAAAJ0Uk5TAP4slhIjAAAB7ElEQVR42u2YSZLDIAxFs+AkCjcwB6AN9z9TF5ORGIxEUt0ba+VyePpCZpDyej322GNfNp/NbjASUvnO7A4UbAu65zB0ZDNLTnUMIRfpc0dn87yoOVS4OTWGMmfFVOIm8zpuzAzk1EJqLMehBnIcKsrZTmxJRTk5FeXEISY5KxejGFssRGmxGJPCk2OHmKLcEEOYRAzlRCJWc6IkYgRzG5hMrORE7WGyhHyM/YhizJgwjwg7/g8bHpYGbciE0akN7xtDLpQBNrjbEJWG9lj45QQA3d2JAACZ6zCTIEigq77yS4jOOqxSkbt8XS8hDG4xg6jAuewLvQTvO4wOgJI37Cs4S/sNYWcJLz7ojF3Tys4azNQkRlCjEHL+81ODoQEeAIWQfUVnLRadlQH+fKMQfHWmfdmlDvltV4khvsKQv8bsBqbzFXDtNy5mG8wPsZNivsWo4/MYxRAeX/QGoJ8I3oOvWafW5qRdXIYurnpz02VSlzLdAb7IVsyz9xu67+uJt9zdnlYXjnWWaFIWKjJifnLppuZFQ1bnpKVlmuOdyl0pybkDmnpXMavdtrpeV0Ejai036W/u5cys7bstXs28WZz3G+auxVQTbtXvDbsiRjfb9XvMHnjax1pJe/5Rt73V2wv+SVAbzGOPPcayXyKUvzWS3ge2AAAAAElFTkSuQmCC', + short_names: ['host-stare'], + name: 'host-stare', + }, +]; + +export const indexableCustomEmoji = new Map( + customEmoji.reduce<[string, any][]>((collector, emoji) => { + return [...collector, [emoji.name, emoji]]; + }, []) +); + +export const indexableCohostPlusCustomEmoji = new Map( + cohostPlusCustomEmoji.reduce<[string, any][]>((collector, emoji) => { + return [...collector, [emoji.name, emoji]]; + }, []) +); + +type ParseOptions = { + cohostPlus: boolean; +}; + +export const parseEmoji: Plugin<[ParseOptions], Root, void> = (options) => { + const compiler: CompilerFunction = processMatches( + EMOJI_REGEX, + (matches, splits, node, index, parent) => { + const els = splits.reduce>((collector, curr, index) => { + const currNode: Text = { + type: 'text', + value: curr, + }; + + const pending = [...collector, currNode]; + + if (index < matches.length) { + const emojiName = matches[index].slice(1, matches[index].length - 1); + let emoji = indexableCustomEmoji.get(emojiName); + if (!emoji && options.cohostPlus) { + emoji = indexableCohostPlusCustomEmoji.get(emojiName); + } + + if (emoji) { + pending.push({ + type: 'element', + tagName: 'CustomEmoji', + properties: { + name: emoji.name, + url: emoji.imageUrl, + }, + children: [], + } as Element); + } else { + pending.push({ + type: 'text', + value: matches[index], + }); + } + } + + return pending; + }, [] as Array); + parent.children.splice(index, 1, ...els); + // skip over all the new elements we just created + return [SKIP, index + els.length]; + } + ); + return compiler; +}; diff --git a/src/markdown/iframely.cjs b/src/markdown/iframely.cjs new file mode 100644 index 0000000..778dcc0 --- /dev/null +++ b/src/markdown/iframely.cjs @@ -0,0 +1 @@ +module.exports = require('@iframely/embed.js'); diff --git a/src/markdown/markdown.ts b/src/markdown/markdown.ts new file mode 100644 index 0000000..e465ade --- /dev/null +++ b/src/markdown/markdown.ts @@ -0,0 +1,396 @@ +import { CustomEmoji } from './components/custom-emoji'; +import { + isMarkdownViewBlock, + MarkdownViewBlock, + summaryContent, + ViewBlock, +} from './types/post-blocks'; +import deepmerge from 'deepmerge'; +import { compile } from 'html-to-text'; +import i18n from 'i18next'; +import type { VNode } from 'preact'; +import { createElement, Fragment } from 'preact/compat'; +import rehypeExternalLinks from 'rehype-external-links'; +import rehypeRaw from 'rehype-raw'; +import rehypeReact from 'rehype-react'; +import rehypeSanitize, { defaultSchema } from 'rehype-sanitize'; +import rehypeStringify from 'rehype-stringify'; +import remarkGfm from 'remark-gfm'; +import remarkParse from 'remark-parse'; +import remarkRehype from 'remark-rehype'; +import { unified } from 'unified'; +import { Mention } from './components/mention'; +import { IframelyEmbed } from './components/iframely'; +import { parseEmoji } from './emoji'; +import { + cleanUpFootnotes, + convertMentions, + copyImgAltToTitle, + makeIframelyEmbeds, +} from './unified-processors'; +import { DateTime } from 'luxon'; +import { Root } from 'hast'; +import { visit } from 'unist-util-visit'; +import parseStyle from 'style-to-object'; + +export type RenderedPost = { + initial: VNode | null; + initialLength: number; + expanded: VNode | null; + expandedLength: number; +}; + +const MAX_GFM_LINES = 256; + +const convert = compile({ + wordwrap: false, +}); + +const FIRST_AGE_SCHEMA = deepmerge(defaultSchema, { + attributes: { + '*': ['style'], + }, + tagNames: ['video', 'audio', 'aside'], // consistency with current rules, +}); + +// Wednesday, June 29, 2022 6:00:00 PM GMT +const FIRST_AGE_CUTOFF = new Date(1656525600000); + +const SECOND_AGE_SCHEMA = deepmerge(defaultSchema, { + attributes: { + '*': ['style'], + }, + tagNames: ['video', 'audio', 'aside'], // consistency with current rules, +}); + +// Monday, November 14, 2022 6:00:00 AM GMT +const SECOND_AGE_CUTOFF = new Date(1668405600000); + +const THIRD_AGE_SCHEMA = deepmerge(defaultSchema, { + attributes: { + '*': ['style'], + }, + tagNames: ['video', 'audio', 'aside'], // consistency with current rules, +}); + +const chooseAgeRuleset = (postDate: Date) => { + if (postDate < FIRST_AGE_CUTOFF) { + return FIRST_AGE_SCHEMA; + } else if (postDate < SECOND_AGE_CUTOFF) { + return SECOND_AGE_SCHEMA; + } else { + return THIRD_AGE_SCHEMA; + } +}; + +const stripSecondAgeStyles = (effectiveDate: Date) => (hast: Root) => { + // this function is second age and beyond. don't run for first page posts. + if (effectiveDate < FIRST_AGE_CUTOFF) return; + + visit(hast, 'element', (node, index, parent) => { + if (parent === null || index === null) return; + + if (node.properties?.style && typeof node.properties.style === 'string') { + try { + let changed = false; + const parsed = parseStyle(node.properties.style); + if ( + parsed && + parsed['position'] && + parsed['position'].toLowerCase().includes('fixed') + ) { + parsed.position = 'static'; + changed = true; + } + + if (parsed && changed) { + node.properties.style = Object.entries(parsed) + .map(([k, v]) => `${k}:${v}`) + .join(';'); + } + } catch (e) { + // couldn't parse, don't worry about it + return; + } + } + }); +}; + +const stripThirdAgeStyles = (effectiveDate: Date) => (hast: Root) => { + // this function is second age and beyond. don't run for first page posts. + if (effectiveDate < SECOND_AGE_CUTOFF) return; + + visit(hast, 'element', (node, index, parent) => { + if (parent === null || index === null) return; + + if (node.properties?.style && typeof node.properties.style === 'string') { + try { + let changed = false; + const parsed = parseStyle(node.properties.style); + + if (parsed) { + for (const key in parsed) { + // drop all CSS variables + if (key.startsWith('--')) { + delete parsed[key]; + changed = true; + } + } + } + + if (parsed && changed) { + node.properties.style = Object.entries(parsed) + .map(([k, v]) => `${k}:${v}`) + .join(';'); + } + } catch (e) { + // couldn't parse, don't worry about it + return; + } + } + }); +}; + +/** + * Used for posts only, supports arbitrary HTML + * @returns + */ +const markdownRenderStack = (postDate: Date, lineLength: number, options: RenderingOptions) => { + let stack = unified().use(remarkParse); + + const externalRel = ['nofollow']; + if (options.externalLinksInNewTab) { + externalRel.push('noopener', 'noreferrer'); + } + + if (lineLength < MAX_GFM_LINES) { + stack = stack.use(remarkGfm, { + singleTilde: false, + }); + } + return stack + .use(remarkRehype, { + allowDangerousHtml: true, + }) + .use(() => copyImgAltToTitle) + .use(() => cleanUpFootnotes) + .use(rehypeRaw) + .use(rehypeSanitize, { + ...chooseAgeRuleset(postDate), + }) + .use(() => stripSecondAgeStyles(postDate)) + .use(() => stripThirdAgeStyles(postDate)) + .use(rehypeExternalLinks, { + rel: externalRel, + target: options.externalLinksInNewTab ? '_blank' : '_self', + }); +}; + +/** + * Used in places like comments, page descriptions, etc. places we don't want to + * support arbitrary HTML + * @returns + */ +const markdownRenderStackNoHTML = ( + postDate: Date, + lineLength: number, + options: RenderingOptions +) => { + let stack = unified().use(remarkParse); + + const externalRel = ['nofollow']; + if (options.externalLinksInNewTab) { + externalRel.push('noopener', 'noreferrer'); + } + + if (lineLength < MAX_GFM_LINES) { + stack = stack.use(remarkGfm, { + singleTilde: false, + }); + } + + return stack + .use(remarkRehype) + .use(() => copyImgAltToTitle) + .use(() => cleanUpFootnotes) + .use(rehypeSanitize, { + ...chooseAgeRuleset(postDate), + }) + .use(() => stripSecondAgeStyles(postDate)) + .use(rehypeExternalLinks, { + rel: externalRel, + target: options.externalLinksInNewTab ? '_blank' : '_self', + }); +}; + +export type RenderingOptions = { + hasCohostPlus: boolean; + disableEmbeds: boolean; + externalLinksInNewTab: boolean; +}; + +/** + * Used for posts only + * @param blocks + * @returns + */ +function renderMarkdownReact( + blocks: MarkdownViewBlock[], + publishDate: Date, + options: RenderingOptions +) { + const src = blocks.map((block) => block.markdown.content).join('\n\n'); + let lineLength = 0; + + // get the max line length among the blocks. while we group all blocks + // together for rendering, the performance regression associated with GFM + // tables only occurs with single line breaks, which can only exist within a + // single block. if the total number of line breaks ACROSS THE ENTIRE POST + // is >256, this isn't an issue. we're only impacted if it's in a single + // block. + for (const block of blocks) { + if (lineLength >= MAX_GFM_LINES) { + break; + } + + lineLength = Math.max(lineLength, block.markdown.content.split('\n', MAX_GFM_LINES).length); + } + + try { + let stack = markdownRenderStack(publishDate, lineLength, options).use( + () => convertMentions + ); + + if (!options.disableEmbeds) { + stack = stack.use(() => makeIframelyEmbeds); + } + + return ( + stack + .use(parseEmoji, { cohostPlus: options.hasCohostPlus }) + // @ts-expect-error: Typings don't natively support custom elements + .use(rehypeReact, { + createElement, + Fragment, + components: { + Mention, + CustomEmoji, + IframelyEmbed, + }, + }) + .processSync(src).result + ); + } catch (e) { + return createElement(Fragment, {}, [ + createElement( + 'div', + { + className: + 'm-3 flex w-fit flex-row gap-2 rounded-lg border-2 border-solid border-cherry p-2 text-cherry no-prose', + }, + [ + createElement( + 'p', + { className: 'not-prose m-0 text-sm' }, + "There was an issue rendering the HTML for this post! We've swapped to an HTML-less version for now, please check your syntax!" + ), + ] + ), + renderMarkdownReactNoHTML(src, publishDate, options), + ]); + } +} + +function renderMarkdownReactNoHTML(src: string, publishDate: Date, options: RenderingOptions) { + const lineLength = src.split('\n', MAX_GFM_LINES).length; + return ( + markdownRenderStackNoHTML(publishDate, lineLength, options) + .use(() => convertMentions) + .use(parseEmoji, { cohostPlus: options.hasCohostPlus }) + // @ts-expect-error: Typings don't natively support custom elements + .use(rehypeReact, { + createElement, + Fragment, + components: { + Mention, + CustomEmoji, + }, + }) + .processSync(src).result + ); +} + +function renderMarkdown(src: string, publishDate: Date, options: RenderingOptions): string { + const lineLength = src.split('\n', MAX_GFM_LINES).length; + return markdownRenderStack(publishDate, lineLength, options) + .use(rehypeStringify) + .processSync(src) + .toString(); +} + +function renderMarkdownNoHTML(src: string, publishDate: Date, options: RenderingOptions): string { + const lineLength = src.split('\n', MAX_GFM_LINES).length; + return markdownRenderStackNoHTML(publishDate, lineLength, options) + .use(rehypeStringify) + .processSync(src) + .toString(); +} + +function renderSummaryNoHTML(src: string, publishDate: Date): string { + const options: RenderingOptions = { + disableEmbeds: true, + externalLinksInNewTab: true, + hasCohostPlus: false, + }; + const renderedBody = renderMarkdownNoHTML(src, publishDate, options); + return convert(renderedBody); +} + +function renderSummary(viewModel: any): string { + const options: RenderingOptions = { + disableEmbeds: true, + externalLinksInNewTab: true, + hasCohostPlus: false, + }; + + if (viewModel.cws.length > 0) { + const cwList = viewModel.cws.join(', '); + + return i18n.t('client:opengraph.cws', { + defaultValue: 'content warning: {{cwList}}', + cwList, + }); + } else { + const effectiveDate = viewModel.publishedAt + ? DateTime.fromISO(viewModel.publishedAt).toJSDate() + : new Date(); + const markdownBlocks = viewModel.blocks.filter(isMarkdownViewBlock); + const textContent = (markdownBlocks.length > 0 ? markdownBlocks : viewModel.blocks) + .map((block: any) => summaryContent(block)) + .join('\n\n'); + const renderedBody = renderMarkdown(textContent, effectiveDate, options); + return convert(renderedBody); + } +} + +export function renderPostToReact( + viewBlocks: ViewBlock[], + publishDate: Date, + options: RenderingOptions +): RenderedPost { + const origBlocks = viewBlocks.filter(isMarkdownViewBlock); + const readmoreIndex = origBlocks.findIndex((block) => block.markdown.content === '---'); + let collapsedBlocks: MarkdownViewBlock[] = []; + if (readmoreIndex > -1) { + collapsedBlocks = origBlocks.splice(readmoreIndex); + } + const initialMarkdownContent = renderMarkdownReact(origBlocks, publishDate, options); + const collapsedMarkdownContent = renderMarkdownReact(collapsedBlocks, publishDate, options); + + return { + initial: initialMarkdownContent, + initialLength: origBlocks.length, + expanded: collapsedMarkdownContent, + expandedLength: collapsedBlocks.length, + }; +} diff --git a/src/markdown/mention-parsing.ts b/src/markdown/mention-parsing.ts new file mode 100644 index 0000000..4098307 --- /dev/null +++ b/src/markdown/mention-parsing.ts @@ -0,0 +1,84 @@ +// Adapted from https://github.com/twitter/twitter-text + +function regexSupplant(regex: RegExp | string, map: Record, flags = '') { + if (typeof regex !== 'string') { + if (regex.global && flags.indexOf('g') < 0) { + flags += 'g'; + } + if (regex.ignoreCase && flags.indexOf('i') < 0) { + flags += 'i'; + } + if (regex.multiline && flags.indexOf('m') < 0) { + flags += 'm'; + } + + regex = regex.source; + } + + return new RegExp( + regex.replace(/#\{(\w+)\}/g, function (match, name: string) { + let newRegex = map[name] || ''; + if (typeof newRegex !== 'string') { + newRegex = newRegex.source; + } + return newRegex; + }), + flags + ); +} + +const latinAccentChars = + /\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0100-\u024F\u0253\u0254\u0256\u0257\u0259\u025B\u0263\u0268\u026F\u0272\u0289\u028B\u02BB\u0300-\u036F\u1E00-\u1EFF/; +const atSigns = /[@ï¼ ]/; +const validMentionPrecedingChars = /(?:^|[^a-zA-Z0-9_!#$%&*@ï¼ \\/]|(?:^|[^a-zA-Z0-9_+~.-\\/]))/; + +const validMention = regexSupplant( + '(#{validMentionPrecedingChars})' + // $1: Preceding character + '(#{atSigns})' + // $2: At mark + '([a-zA-Z0-9-]{3,})', // $3: handle + { validMentionPrecedingChars, atSigns }, + 'g' +); +const endMentionMatch = regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\/\/)/, { + atSigns, + latinAccentChars, +}); + +type MentionToken = { + handle: string; + indices: [startPosition: number, endPosition: number]; +}; +export function extractMentions(text: string): MentionToken[] { + if (!text.match(atSigns)) { + return []; + } + + const possibleNames: MentionToken[] = []; + + text.replace( + validMention, + function ( + match, + before: string, + atSign: string, + handle: string, + offset: number, + chunk: string + ) { + const after = chunk.slice(offset + match.length); + + if (!after.match(endMentionMatch)) { + const startPosition = offset + before.length; + const endPosition = startPosition + handle.length + 1; + possibleNames.push({ + handle, + indices: [startPosition, endPosition], + }); + } + + return ''; + } + ); + + return possibleNames; +} diff --git a/src/markdown/types/ids.ts b/src/markdown/types/ids.ts new file mode 100644 index 0000000..7b9f121 --- /dev/null +++ b/src/markdown/types/ids.ts @@ -0,0 +1,45 @@ +import { z } from 'zod'; +import { LEGAL_REGEX } from '../username-verifier'; +import { DateTime } from 'luxon'; + +// based on https://github.com/colinhacks/zod/issues/678#issuecomment-962387521 +type Tagged = T & { __tag: Tag }; +function refinement, T>() { + return function (val: T): val is Type { + return true; + }; +} + +export type AttachmentId = Tagged; +export const AttachmentId = z.string().uuid().refine(refinement()); + +export type PostId = Tagged; +export const PostId = z.number().int().refine(refinement()); + +export type ProjectId = Tagged; +export const ProjectId = z.number().int().refine(refinement()); + +export type UserId = Tagged; +export const UserId = z.number().int().refine(refinement()); + +export type ProjectHandle = Tagged; +export const ProjectHandle = z + .string() + .regex(LEGAL_REGEX) + .refine(refinement()); + +export type CommentId = Tagged; +export const CommentId = z.string().uuid().refine(refinement()); + +export type TagId = Tagged; +export const TagId = z.number().int().refine(refinement()); + +export type InviteId = Tagged; +export const InviteId = z.string().uuid().refine(refinement()); + +export type BookmarkId = Tagged; +export const BookmarkId = z.string().uuid().refine(refinement()); + +export const ISODateString = z.string().refine((string) => DateTime.fromISO(string).isValid, { + message: 'Not a valid ISO date!', +}); diff --git a/src/markdown/types/post-blocks.ts b/src/markdown/types/post-blocks.ts new file mode 100644 index 0000000..c2a3f5b --- /dev/null +++ b/src/markdown/types/post-blocks.ts @@ -0,0 +1,143 @@ +/** + * Post Blocks + * + * Specifies all the types for the block-based Post system. + * @module + */ + +import { string, z } from 'zod'; +import { AttachmentId } from './ids'; + +/** + * @internal + */ +const BaseBlock = z.object({ + type: z.string(), +}); +interface BaseBlock { + type: string; +} + +/** + * @category Storage Blocks + * + * Blocks as they are stored in the database. + * Only contains minimal information needed to reproduce content, used as the base to generate [[View Blocks]]. + */ + +/** + * @category Storage Blocks + */ +export const MarkdownStorageBlock = BaseBlock.extend({ + type: z.literal('markdown'), + markdown: z.object({ + /** Raw markdown to be parsed at render-time. */ + content: z.string(), + }), +}); +export type MarkdownStorageBlock = z.infer; + +/** + * @category Storage Blocks + */ +export const AttachmentStorageBlock = BaseBlock.extend({ + type: z.literal('attachment'), + attachment: z.object({ + /** ID for the [[`Attachment`]] to be rendered. */ + attachmentId: AttachmentId, + altText: z.string().optional(), + }), +}); +export type AttachmentStorageBlock = z.infer; + +export const InvalidAttachmentStorageBlock = AttachmentStorageBlock.extend({ + attachment: AttachmentStorageBlock.shape.attachment.extend({ + attachmentId: z.null(), + }), +}); +export type InvalidAttachmentStorageBlock = z.infer; + +/** + * Union type used on the [[`Post`]] model + * + * @category Storage Blocks + */ +export const StorageBlock = z.union([MarkdownStorageBlock, AttachmentStorageBlock]); +export type StorageBlock = z.infer; + +/** + * @category View Blocks + * View Blocks _must_ contain all data needed to render the block. + * This is a wire-safe type and as a result _must_ not contain anything the client can't see. + * + */ + +/** + * No changes are currently required from the [[`MarkdownStorageBlock`]] + * so this is currently a simple alias. + * + * @category View Blocks + * */ +export const MarkdownViewBlock = MarkdownStorageBlock.extend({}); +export type MarkdownViewBlock = z.infer; + +/** + * Adds the image URL for rendering + * + * @category View Blocks + */ +export const AttachmentViewBlock = AttachmentStorageBlock.extend({ + attachment: AttachmentStorageBlock.shape.attachment.and( + z.object({ + previewURL: z.string(), + fileURL: z.string(), + }) + ), +}); +export type AttachmentViewBlock = z.infer; + +/** + * Union type used for [[`PostViewModel`]] and component renderers. + * @category View Blocks + */ +export const ViewBlock = z.union([MarkdownViewBlock, AttachmentViewBlock]); +export type ViewBlock = z.infer; + +export function isAttachmentViewBlock(test: unknown): test is AttachmentViewBlock { + return AttachmentViewBlock.safeParse(test).success; +} + +export function isMarkdownViewBlock(test: unknown): test is MarkdownViewBlock { + return MarkdownViewBlock.safeParse(test).success; +} + +export function isAttachmentStorageBlock(test: unknown): test is AttachmentStorageBlock { + return AttachmentStorageBlock.safeParse(test).success; +} + +export function isMarkdownStorageBlock(test: unknown): test is MarkdownStorageBlock { + return MarkdownStorageBlock.safeParse(test).success; +} + +// via https://github.com/colinhacks/zod/issues/627#issuecomment-911679836 +// could be worth investigating a factory function? +export function parseAttachmentStorageBlocks(originalBlocks: unknown[]) { + return z + .preprocess( + (blocks) => z.array(z.any()).parse(blocks).filter(isAttachmentStorageBlock), + z.array(AttachmentStorageBlock) + ) + .parse(originalBlocks); +} + +export function summaryContent(block: ViewBlock): string { + switch (block.type) { + case 'markdown': + return block.markdown.content; + case 'attachment': { + const encodedFilename = block.attachment.fileURL.split('/').pop(); + + return encodedFilename ? `[image: ${decodeURIComponent(encodedFilename)}]` : `[image]`; + } + } +} diff --git a/src/markdown/unified-processors.ts b/src/markdown/unified-processors.ts new file mode 100644 index 0000000..5e1bde2 --- /dev/null +++ b/src/markdown/unified-processors.ts @@ -0,0 +1,165 @@ +import type { Root, Element, Text } from 'hast'; +import { SKIP, visit } from 'unist-util-visit'; +import { extractMentions } from './mention-parsing'; + +export const processMatches = + ( + regex: RegExp, + callback: ( + matches: string[], + splits: string[], + node: Text, + index: number, + parent: Root | Element + ) => void + ) => + (hast: Root) => { + // we only want to check on text nodes for this + visit(hast, 'text', (node, index, parent) => { + // there is no such thing as a text node without a parent. + // but if there is we want nothing to do with it. + if (parent === null || index === null) return; + + const matches = node.value.match(regex); + + // if this text has mentions, process them + if (matches) { + const splits = node.value.split(regex); + if (splits.length - 1 !== matches.length) { + // something isn't how it should be. bail. + return; + } + + return callback(matches, splits, node, index, parent); + } + }); + }; + +export const convertMentions = (hast: Root) => { + // we only want to check on text nodes for this + visit(hast, 'text', (node, index, parent) => { + // there is no such thing as a text node without a parent. + // but if there is we want nothing to do with it. + if (parent === null || index === null) return; + + const text = node.value; + const names = extractMentions(text); + + // if this text has mentions, process them + if (names.length) { + const els: Array = []; + let currentStart = 0; + + names.forEach((token, idx, names) => { + const [startPosition, endPosition] = token.indices; + els.push({ + type: 'text', + value: text.slice(currentStart, startPosition), + }); + els.push({ + type: 'element', + tagName: 'Mention', + properties: { + handle: token.handle, + }, + children: [ + { + type: 'text', + value: `@${token.handle}`, + }, + ], + }); + currentStart = endPosition; + + if (idx === names.length - 1) { + // if we're last we need to grab the rest of the string + els.push({ + type: 'text', + value: text.slice(currentStart), + }); + } + }); + + parent.children.splice(index, 1, ...els); + // skip over all the new elements we just created + return [SKIP, index + els.length]; + } + }); +}; + +export const cleanUpFootnotes = (hast: Root) => { + visit(hast, 'element', (node, index, parent) => { + if (parent === null || index === null) return; + // remove the link from the superscript number + if (node.tagName === 'a' && (node.properties?.id as string)?.includes('fnref')) { + parent.children.splice(index, 1, ...node.children); + return [SKIP, index]; + } + + // remove the little arrow at the bottom + if (node.tagName === 'a' && (node.properties?.href as string)?.includes('fnref')) { + parent.children.splice(index, 1); + return [SKIP, index]; + } + + // replace the invisible label with a hr + if (node.tagName === 'h2' && (node.properties?.id as string)?.includes('footnote-label')) { + const hrEl: Element = { + tagName: 'hr', + type: 'element', + children: [], + properties: { + 'aria-label': 'Footnotes', + style: 'margin-bottom: -0.5rem;', + }, + }; + parent.children.splice(index, 1, hrEl); + } + }); +}; + +export const copyImgAltToTitle = (hast: Root) => { + visit(hast, { type: 'element', tagName: 'img' }, (node) => { + if (node.properties?.alt) { + node.properties.title = node.properties.alt; + } + }); +}; + +export const makeIframelyEmbeds = (hast: Root) => { + visit(hast, { type: 'element', tagName: 'a' }, (node, index, parent) => { + if (parent === null || index === null) return; + + // GFM autolink literals have the following two properties: + // - they have exactly one child, and it's a text child; + if (node.children.length != 1 || node.children[0].type != 'text') return; + // - the starting offset of the text child matches the starting offset + // of the node (angle-bracket autolinks and explicit links differ by 1 + // char) + if ( + !node.position || + !node.children[0].position || + node.children[0].position.start.offset != node.position.start.offset + ) + return; + + // additionally, GFM autolink literals in their own paragraph are the + // only child of their parent node. + if (parent.children.length != 1) return; + + // change the type of the parent to a div because you can't nest a div + // inside a paragraph + if (parent.type === 'element') parent.tagName = 'div'; + + parent.children.splice(index, 1, { + type: 'element', + tagName: 'IframelyEmbed', + properties: { + url: node.properties?.href, + }, + children: [], + }); + + return true; + }); +}; diff --git a/src/markdown/username-verifier.ts b/src/markdown/username-verifier.ts new file mode 100644 index 0000000..2302fad --- /dev/null +++ b/src/markdown/username-verifier.ts @@ -0,0 +1,66 @@ +import i18n from 'i18next'; +const USERNAME_HANDLE_LIMIT = 200; + +export type UsernameLegalResult = + | { + legal: true; + } + | { + legal: false; + reason: string; + }; + +export const LEGAL_REGEX_STRING = '^[a-zA-Z0-9-]{3,}$'; +export const LEGAL_REGEX = new RegExp(LEGAL_REGEX_STRING); +const BANNED_USERNAMES = new Set([ + 'rc', + 'api', + 'www', + 'help', + 'admin', + 'support', + 'staff', + 'internal', + 'status', + 'mail', + 'mobile', + 'search', + 'static', +]); + +export function isUsernameLegal(username: string): UsernameLegalResult { + const downcasedUsername = username.toLowerCase(); + + // no namespace usernames + if (BANNED_USERNAMES.has(downcasedUsername)) { + return { + legal: false, + reason: i18n.t('server:register.disallowed-username-error', { + defaultValue: 'Username can not be "{{username}}"', + username, + }), + }; + } + + // legal characters only + if (!LEGAL_REGEX.test(username)) { + return { + legal: false, + reason: i18n.t('server:register.invalid-username-error', { + defaultValue: + 'Usernames can only contain letters, numbers, and hyphens, and must be at least 3 characters.', + }), + }; + } + + if (downcasedUsername.length > USERNAME_HANDLE_LIMIT) { + return { + legal: false, + reason: i18n.t('server:register.username-too-long-error', { + defaultValue: 'Your username cannot be longer than 200 characters, but nice try.', + }), + }; + } + + return { legal: true }; +} diff --git a/src/ui/components/post-preview.tsx b/src/ui/components/post-preview.tsx index 3b0710d..5769c16 100644 --- a/src/ui/components/post-preview.tsx +++ b/src/ui/components/post-preview.tsx @@ -1,7 +1,6 @@ import { h, VNode } from 'preact'; import { PureComponent, useEffect, useRef, useState } from 'preact/compat'; -import { micromark } from 'micromark'; -import { gfm, gfmHtml } from 'micromark-extension-gfm'; +import { renderPostToReact, RenderedPost } from '../../markdown/markdown'; import { Popover } from './popover'; import './post-preview.less'; @@ -144,116 +143,6 @@ interface ErrorMessage { props: { [k: string]: any }; } -function renderMarkdown( - markdown: string, - pushError: (id: keyof typeof ERRORS, props: { [k: string]: any }) => void -) { - const doc = new DOMParser().parseFromString( - [ - '', - micromark(markdown, { - allowDangerousHtml: true, - extensions: [gfm({ singleTilde: false })], - htmlExtensions: [gfmHtml()], - }), - '', - ].join(''), - 'text/html' - ); - - const footnotes = doc.querySelector('section[data-footnotes]'); - const ignoreUserContentId = new Set(); - if (footnotes) { - // cohost does something weird with the footnotes that i cant be bothered - // to replicate accurately here - footnotes.remove(); - const innerFootnotes = footnotes.querySelector('ol')!; - const hr = document.createElement('hr'); - hr.setAttribute('aria-label', 'Footnotes'); - hr.style.marginBottom = '-0.5rem'; - doc.body.append(hr); - doc.body.append(innerFootnotes); - - // stop warning about footnotes - for (const node of innerFootnotes.querySelectorAll('[id]')) { - ignoreUserContentId.add(node.id); - } - for (const fnref of innerFootnotes.querySelectorAll('[href^="#user-content-fnref"]')) { - const refId = fnref.getAttribute('href')!.substring(1); - ignoreUserContentId.add(refId); - } - } - - for (const node of doc.querySelectorAll(STRIP_ELEMENTS.join(', '))) { - pushError('strip-element', { node }); - node.remove(); - } - for (const node of doc.querySelectorAll('input')) { - node.disabled = true; - if (node.type !== 'checkbox') { - pushError('input-to-checkbox', { type: node.type }); - node.type = 'checkbox'; - } - } - - const idReferencingAttrs = [ - 'aria-activedescendant', - 'aria-controls', - 'aria-describedby', - 'aria-errormessage', - 'aria-flowto', - 'aria-labelledby', - 'aria-owns', - 'for', - 'headers', - 'list', - ]; - const idReferences = new Set(); - for (const attr of idReferencingAttrs) { - for (const node of doc.querySelectorAll(`[${attr}]`)) { - idReferences.add(node.getAttribute(attr)); - } - } - for (const node of doc.querySelectorAll(`[href]`)) { - const href = node.getAttribute('href') || ''; - if (href.startsWith('#')) { - idReferences.add(href.substr(1)); - } - } - - // cohost adds user-content- before ids in posts - for (const node of doc.querySelectorAll('[id]')) { - if (idReferences.has(node.id) && !ignoreUserContentId.has(node.id)) { - pushError('user-content-id', { id: node.id }); - } - node.id = 'user-content-' + node.id; - } - - for (const _node of doc.querySelectorAll(`[style]`)) { - const node = _node as HTMLElement | SVGElement; - const styleKeys: string[] = []; - for (let i = 0; i < node.style.length; i++) { - const key = node.style[i]; - styleKeys.push(key); - } - for (const key of styleKeys) { - if (key.startsWith('--')) { - node.style.setProperty(key, ''); - pushError('strip-css-variable', { - node, - name: key, - }); - } - if (key === 'position' && node.style.position === 'fixed') { - node.style.position = 'static'; - pushError('position-fixed', { node }); - } - } - } - - return doc.body.innerHTML; -} - function findUrlsInBackgroundImage(s: string) { const urls = []; while (s) { @@ -270,7 +159,6 @@ function findUrlsInBackgroundImage(s: string) { } function handleAsyncErrors( - prose: HTMLElement, pushAsyncError: (id: keyof typeof ERRORS, props: { [k: string]: any }) => void ) { for (const img of prose.querySelectorAll('img')) { @@ -293,15 +181,32 @@ function handleAsyncErrors( } export function PostPreview({ markdown, error, stale, plus }: PostPreview.Props) { - let html = ''; + let post: RenderedPost = { + initial: null, + initialLength: 0, + expanded: null, + expandedLength: 0, + }; const renderErrors: ErrorMessage[] = []; try { - html = renderMarkdown(markdown, (id, props) => renderErrors.push({ id, props })); + post = renderPostToReact( + markdown.split('\n\n').map((str) => ({ + type: 'markdown', + markdown: { + content: str, + }, + })), + new Date(), + { + hasCohostPlus: Boolean(plus), + disableEmbeds: false, + externalLinksInNewTab: true, + } + ); } catch (err) { error = err as Error; } - const innerProse = useRef(null); const errorBtn = useRef(null); const [errorsOpen, setErrorsOpen] = useState(false); const [asyncErrors, setAsyncErrors] = useState([]); @@ -312,14 +217,6 @@ export function PostPreview({ markdown, error, stale, plus }: PostPreview.Props) setAsyncErrors([...asyncErrors]); }; - useEffect(() => { - innerProse.current!.innerHTML = html; - asyncErrors.splice(0); - setAsyncErrors([...asyncErrors]); - - handleAsyncErrors(innerProse.current!, pushAsyncError); - }, [html]); - const errorCount = renderErrors.length + asyncErrors.length; return ( @@ -358,12 +255,20 @@ export function PostPreview({ markdown, error, stale, plus }: PostPreview.Props) ))}
) : ( -
+
+ {post.initial} + {post.expandedLength !== 0 && ( +
+ Read More + {post.expanded} +
+ )} +
)}