react-emoji-text 1.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +408 -0
  3. package/dist/adapters/emoji-mart.cjs +9 -0
  4. package/dist/adapters/emoji-mart.d.cts +7 -0
  5. package/dist/adapters/emoji-mart.d.cts.map +1 -0
  6. package/dist/adapters/emoji-mart.d.mts +7 -0
  7. package/dist/adapters/emoji-mart.d.mts.map +1 -0
  8. package/dist/adapters/emoji-mart.mjs +10 -0
  9. package/dist/adapters/emoji-mart.mjs.map +1 -0
  10. package/dist/adapters/emojibase.cjs +71 -0
  11. package/dist/adapters/emojibase.d.cts +38 -0
  12. package/dist/adapters/emojibase.d.cts.map +1 -0
  13. package/dist/adapters/emojibase.d.mts +38 -0
  14. package/dist/adapters/emojibase.d.mts.map +1 -0
  15. package/dist/adapters/emojibase.mjs +72 -0
  16. package/dist/adapters/emojibase.mjs.map +1 -0
  17. package/dist/compat/index.cjs +93 -0
  18. package/dist/compat/index.d.cts +32 -0
  19. package/dist/compat/index.d.cts.map +1 -0
  20. package/dist/compat/index.d.mts +32 -0
  21. package/dist/compat/index.d.mts.map +1 -0
  22. package/dist/compat/index.mjs +90 -0
  23. package/dist/compat/index.mjs.map +1 -0
  24. package/dist/core.cjs +10 -0
  25. package/dist/core.d.cts +4 -0
  26. package/dist/core.d.mts +4 -0
  27. package/dist/core.mjs +2 -0
  28. package/dist/index-B39vk6JI.d.mts +23 -0
  29. package/dist/index-B39vk6JI.d.mts.map +1 -0
  30. package/dist/index-DPd10zCJ.d.cts +23 -0
  31. package/dist/index-DPd10zCJ.d.cts.map +1 -0
  32. package/dist/index-DXKnU6tZ.d.cts +398 -0
  33. package/dist/index-DXKnU6tZ.d.cts.map +1 -0
  34. package/dist/index-UT6qWHp1.d.mts +398 -0
  35. package/dist/index-UT6qWHp1.d.mts.map +1 -0
  36. package/dist/index.cjs +18 -0
  37. package/dist/index.d.cts +5 -0
  38. package/dist/index.d.mts +5 -0
  39. package/dist/index.mjs +5 -0
  40. package/dist/indexes-3fK5ySH8.d.cts +20 -0
  41. package/dist/indexes-3fK5ySH8.d.cts.map +1 -0
  42. package/dist/indexes-BMCSN-X0.d.mts +20 -0
  43. package/dist/indexes-BMCSN-X0.d.mts.map +1 -0
  44. package/dist/react/index.cjs +8 -0
  45. package/dist/react/index.d.cts +2 -0
  46. package/dist/react/index.d.mts +2 -0
  47. package/dist/react/index.mjs +3 -0
  48. package/dist/react-9EdWn0Gg.mjs +196 -0
  49. package/dist/react-9EdWn0Gg.mjs.map +1 -0
  50. package/dist/react-C8xGkPhi.cjs +211 -0
  51. package/dist/render-C7VPZ7if.cjs +140 -0
  52. package/dist/render-DzloPAWX.mjs +119 -0
  53. package/dist/render-DzloPAWX.mjs.map +1 -0
  54. package/dist/tokenize-BUKMZ9Yg.mjs +313 -0
  55. package/dist/tokenize-BUKMZ9Yg.mjs.map +1 -0
  56. package/dist/tokenize-CyKMb3O9.cjs +364 -0
  57. package/dist/types-Dyzdpq-R.d.cts +92 -0
  58. package/dist/types-Dyzdpq-R.d.cts.map +1 -0
  59. package/dist/types-o0mRO30y.d.mts +92 -0
  60. package/dist/types-o0mRO30y.d.mts.map +1 -0
  61. package/package.json +108 -0
@@ -0,0 +1,72 @@
1
+ //#region src/adapters/emojibase.ts
2
+ const GROUP_NAMES = {
3
+ 0: "smileys-emotion",
4
+ 1: "people-body",
5
+ 2: "component",
6
+ 3: "animals-nature",
7
+ 4: "food-drink",
8
+ 5: "travel-places",
9
+ 6: "activities",
10
+ 7: "objects",
11
+ 8: "symbols",
12
+ 9: "flags"
13
+ };
14
+ function getNative(entry) {
15
+ return "emoji" in entry ? entry.emoji : entry.unicode;
16
+ }
17
+ function resolveShortcodes(hexcode, shortcodesMap) {
18
+ if (!shortcodesMap) return [];
19
+ const value = shortcodesMap[hexcode];
20
+ if (!value) return [];
21
+ return Array.isArray(value) ? value : [value];
22
+ }
23
+ function toSkin(entry) {
24
+ return {
25
+ unified: entry.hexcode,
26
+ native: getNative(entry)
27
+ };
28
+ }
29
+ function fromEmojibase(emojis, options) {
30
+ const shortcodesMap = options?.shortcodes;
31
+ const emojiRecord = {};
32
+ const aliases = {};
33
+ const categoryBuckets = /* @__PURE__ */ new Map();
34
+ for (const raw of emojis) {
35
+ const codes = resolveShortcodes(raw.hexcode, shortcodesMap);
36
+ const emojiId = codes[0] ?? raw.hexcode;
37
+ const skins = [toSkin(raw)];
38
+ if (raw.skins) for (const skinVariant of raw.skins) skins.push(toSkin(skinVariant));
39
+ const entryAliases = codes.length > 1 ? codes.slice(1) : void 0;
40
+ emojiRecord[emojiId] = {
41
+ id: emojiId,
42
+ name: raw.label,
43
+ keywords: raw.tags ?? [],
44
+ skins,
45
+ aliases: entryAliases
46
+ };
47
+ if (entryAliases) for (const alias of entryAliases) aliases[alias] = emojiId;
48
+ const emoticons = raw.emoticon ? Array.isArray(raw.emoticon) ? raw.emoticon : [raw.emoticon] : [];
49
+ for (const emoticon of emoticons) aliases[emoticon] = emojiId;
50
+ if (raw.group !== void 0) {
51
+ const categoryName = GROUP_NAMES[raw.group] ?? `group-${String(raw.group)}`;
52
+ let bucket = categoryBuckets.get(categoryName);
53
+ if (!bucket) {
54
+ bucket = [];
55
+ categoryBuckets.set(categoryName, bucket);
56
+ }
57
+ bucket.push(emojiId);
58
+ }
59
+ }
60
+ return {
61
+ emojis: emojiRecord,
62
+ aliases,
63
+ categories: Array.from(categoryBuckets, ([id, emojiIds]) => ({
64
+ id,
65
+ emojis: emojiIds
66
+ }))
67
+ };
68
+ }
69
+ //#endregion
70
+ export { fromEmojibase };
71
+
72
+ //# sourceMappingURL=emojibase.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emojibase.mjs","names":[],"sources":["../../src/adapters/emojibase.ts"],"sourcesContent":["import type { EmojiData, EmojiEntry, EmojiSkin } from '../core/types';\nimport type { EmojibaseCompactEmoji, EmojibaseEmoji, EmojibaseShortcodes } from './types';\n\nconst GROUP_NAMES: Record<number, string> = {\n 0: 'smileys-emotion',\n 1: 'people-body',\n 2: 'component',\n 3: 'animals-nature',\n 4: 'food-drink',\n 5: 'travel-places',\n 6: 'activities',\n 7: 'objects',\n 8: 'symbols',\n 9: 'flags',\n};\n\ninterface FromEmojibaseOptions {\n shortcodes?: EmojibaseShortcodes;\n}\n\nfunction getNative(entry: EmojibaseEmoji | EmojibaseCompactEmoji): string {\n return 'emoji' in entry ? entry.emoji : (entry as EmojibaseCompactEmoji).unicode;\n}\n\nfunction resolveShortcodes(\n hexcode: string,\n shortcodesMap: EmojibaseShortcodes | undefined,\n): string[] {\n if (!shortcodesMap) return [];\n const value = shortcodesMap[hexcode];\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction toSkin(entry: EmojibaseEmoji | EmojibaseCompactEmoji): EmojiSkin {\n return {\n unified: entry.hexcode,\n native: getNative(entry),\n };\n}\n\nexport function fromEmojibase(\n emojis: EmojibaseEmoji[] | EmojibaseCompactEmoji[],\n options?: FromEmojibaseOptions,\n): EmojiData {\n const shortcodesMap = options?.shortcodes;\n const emojiRecord: Record<string, EmojiEntry> = {};\n const aliases: Record<string, string> = {};\n const categoryBuckets = new Map<string, string[]>();\n\n for (const raw of emojis) {\n const codes = resolveShortcodes(raw.hexcode, shortcodesMap);\n const emojiId = codes[0] ?? raw.hexcode;\n\n const skins: EmojiSkin[] = [toSkin(raw)];\n if (raw.skins) {\n for (const skinVariant of raw.skins) {\n skins.push(toSkin(skinVariant));\n }\n }\n\n const entryAliases = codes.length > 1 ? codes.slice(1) : undefined;\n\n emojiRecord[emojiId] = {\n id: emojiId,\n name: raw.label,\n keywords: raw.tags ?? [],\n skins,\n aliases: entryAliases,\n };\n\n if (entryAliases) {\n for (const alias of entryAliases) {\n aliases[alias] = emojiId;\n }\n }\n\n const emoticons = raw.emoticon\n ? Array.isArray(raw.emoticon)\n ? raw.emoticon\n : [raw.emoticon]\n : [];\n for (const emoticon of emoticons) {\n aliases[emoticon] = emojiId;\n }\n\n if (raw.group !== undefined) {\n const categoryName = GROUP_NAMES[raw.group] ?? `group-${String(raw.group)}`;\n let bucket = categoryBuckets.get(categoryName);\n if (!bucket) {\n bucket = [];\n categoryBuckets.set(categoryName, bucket);\n }\n bucket.push(emojiId);\n }\n }\n\n const categories = Array.from(categoryBuckets, ([id, emojiIds]) => ({\n id,\n emojis: emojiIds,\n }));\n\n return { emojis: emojiRecord, aliases, categories };\n}\n"],"mappings":";AAGA,MAAM,cAAsC;CAC1C,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACJ;AAMD,SAAS,UAAU,OAAuD;AACxE,QAAO,WAAW,QAAQ,MAAM,QAAS,MAAgC;;AAG3E,SAAS,kBACP,SACA,eACU;AACV,KAAI,CAAC,cAAe,QAAO,EAAE;CAC7B,MAAM,QAAQ,cAAc;AAC5B,KAAI,CAAC,MAAO,QAAO,EAAE;AACrB,QAAO,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC,MAAM;;AAG/C,SAAS,OAAO,OAA0D;AACxE,QAAO;EACL,SAAS,MAAM;EACf,QAAQ,UAAU,MAAM;EACzB;;AAGH,SAAgB,cACd,QACA,SACW;CACX,MAAM,gBAAgB,SAAS;CAC/B,MAAM,cAA0C,EAAE;CAClD,MAAM,UAAkC,EAAE;CAC1C,MAAM,kCAAkB,IAAI,KAAuB;AAEnD,MAAK,MAAM,OAAO,QAAQ;EACxB,MAAM,QAAQ,kBAAkB,IAAI,SAAS,cAAc;EAC3D,MAAM,UAAU,MAAM,MAAM,IAAI;EAEhC,MAAM,QAAqB,CAAC,OAAO,IAAI,CAAC;AACxC,MAAI,IAAI,MACN,MAAK,MAAM,eAAe,IAAI,MAC5B,OAAM,KAAK,OAAO,YAAY,CAAC;EAInC,MAAM,eAAe,MAAM,SAAS,IAAI,MAAM,MAAM,EAAE,GAAG,KAAA;AAEzD,cAAY,WAAW;GACrB,IAAI;GACJ,MAAM,IAAI;GACV,UAAU,IAAI,QAAQ,EAAE;GACxB;GACA,SAAS;GACV;AAED,MAAI,aACF,MAAK,MAAM,SAAS,aAClB,SAAQ,SAAS;EAIrB,MAAM,YAAY,IAAI,WAClB,MAAM,QAAQ,IAAI,SAAS,GACzB,IAAI,WACJ,CAAC,IAAI,SAAS,GAChB,EAAE;AACN,OAAK,MAAM,YAAY,UACrB,SAAQ,YAAY;AAGtB,MAAI,IAAI,UAAU,KAAA,GAAW;GAC3B,MAAM,eAAe,YAAY,IAAI,UAAU,SAAS,OAAO,IAAI,MAAM;GACzE,IAAI,SAAS,gBAAgB,IAAI,aAAa;AAC9C,OAAI,CAAC,QAAQ;AACX,aAAS,EAAE;AACX,oBAAgB,IAAI,cAAc,OAAO;;AAE3C,UAAO,KAAK,QAAQ;;;AASxB,QAAO;EAAE,QAAQ;EAAa;EAAS,YALpB,MAAM,KAAK,kBAAkB,CAAC,IAAI,eAAe;GAClE;GACA,QAAQ;GACT,EAEgD;EAAE"}
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ Object.defineProperties(exports, {
3
+ __esModule: { value: true },
4
+ [Symbol.toStringTag]: { value: "Module" }
5
+ });
6
+ const require_tokenize = require("../tokenize-CyKMb3O9.cjs");
7
+ const require_render = require("../render-C7VPZ7if.cjs");
8
+ let react = require("react");
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
+ //#region src/compat/index.tsx
11
+ function toArray(text, options) {
12
+ const fullOptions = {
13
+ data: options.data,
14
+ customEmojis: options.customEmojis,
15
+ ascii: options.ascii ?? true,
16
+ defaultSkin: options.defaultSkin,
17
+ extraAliases: options.extraAliases
18
+ };
19
+ const renderSet = options.set ?? "native";
20
+ const resolvedGetImageUrl = require_render.resolveImageUrlFn({
21
+ getImageUrl: options.getImageUrl,
22
+ imageUrlTemplate: options.imageUrlTemplate,
23
+ sprite: options.sprite
24
+ });
25
+ const createKey = require_render.createTokenKeyFactory();
26
+ return require_tokenize.tokenize(text, fullOptions).map((token) => {
27
+ if (token.type === "text") return token.value;
28
+ if (token.type === "unknown") return token.match;
29
+ const key = createKey(token);
30
+ const rendered = require_render.renderTokenDefault(token, {
31
+ getImageUrl: resolvedGetImageUrl,
32
+ set: renderSet,
33
+ sprite: options.sprite
34
+ });
35
+ if ((0, react.isValidElement)(rendered)) return (0, react.cloneElement)(rendered, { key });
36
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37
+ title: token.shortcode,
38
+ children: rendered
39
+ }, key);
40
+ });
41
+ }
42
+ function Emoji({ text, className, onlyEmojiClassName, options, ref, svg, ...htmlProps }) {
43
+ const data = options.data;
44
+ const customEmojis = options.customEmojis;
45
+ const ascii = options.ascii;
46
+ const defaultSkin = options.defaultSkin;
47
+ const extraAliases = options.extraAliases;
48
+ const getImageUrl = options.getImageUrl;
49
+ const imageUrlTemplate = options.imageUrlTemplate;
50
+ const sprite = options.sprite;
51
+ const set = options.set ?? (svg ? "apple" : "native");
52
+ const { elements, allEmoji } = (0, react.useMemo)(() => {
53
+ const elements = toArray(text, {
54
+ data,
55
+ customEmojis,
56
+ ascii,
57
+ defaultSkin,
58
+ extraAliases,
59
+ getImageUrl,
60
+ imageUrlTemplate,
61
+ set,
62
+ sprite
63
+ });
64
+ return {
65
+ allEmoji: elements.every((element) => typeof element !== "string" || element.trim() === ""),
66
+ elements
67
+ };
68
+ }, [
69
+ text,
70
+ data,
71
+ customEmojis,
72
+ ascii,
73
+ defaultSkin,
74
+ extraAliases,
75
+ getImageUrl,
76
+ imageUrlTemplate,
77
+ set,
78
+ sprite
79
+ ]);
80
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
81
+ className: (0, react.useMemo)(() => [className, allEmoji && onlyEmojiClassName].filter(Boolean).join(" ") || void 0, [
82
+ className,
83
+ allEmoji,
84
+ onlyEmojiClassName
85
+ ]),
86
+ ref,
87
+ ...htmlProps,
88
+ children: elements
89
+ });
90
+ }
91
+ //#endregion
92
+ exports.default = Emoji;
93
+ exports.toArray = toArray;
@@ -0,0 +1,32 @@
1
+ import { d as GetImageUrl, g as TokenizeOptions, i as EmojiData, p as SpriteConfig, s as EmojiSet } from "../types-Dyzdpq-R.cjs";
2
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { HTMLAttributes, ReactElement, Ref } from "react";
4
+
5
+ //#region src/compat/index.d.ts
6
+ interface CompatOptions extends Partial<Omit<TokenizeOptions, 'data'>> {
7
+ data: EmojiData;
8
+ getImageUrl?: GetImageUrl;
9
+ imageUrlTemplate?: string;
10
+ set?: EmojiSet;
11
+ sprite?: SpriteConfig;
12
+ }
13
+ interface EmojiProps extends HTMLAttributes<HTMLSpanElement> {
14
+ text: string;
15
+ onlyEmojiClassName?: string;
16
+ ref?: Ref<HTMLSpanElement>;
17
+ svg?: boolean;
18
+ options: CompatOptions;
19
+ }
20
+ declare function toArray(text: string, options: CompatOptions): Array<string | ReactElement>;
21
+ declare function Emoji({
22
+ text,
23
+ className,
24
+ onlyEmojiClassName,
25
+ options,
26
+ ref,
27
+ svg,
28
+ ...htmlProps
29
+ }: EmojiProps): _$react_jsx_runtime0.JSX.Element;
30
+ //#endregion
31
+ export { CompatOptions, EmojiProps, Emoji as default, toArray };
32
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/compat/index.tsx"],"mappings":";;;;;UAgBiB,aAAA,SAAsB,OAAA,CAAQ,IAAA,CAAK,eAAA;EAClD,IAAA,EAAM,SAAA;EACN,WAAA,GAAc,WAAA;EACd,gBAAA;EACA,GAAA,GAAM,QAAA;EACN,MAAA,GAAS,YAAA;AAAA;AAAA,UAGM,UAAA,SAAmB,cAAA,CAAe,eAAA;EACjD,IAAA;EACA,kBAAA;EACA,GAAA,GAAM,GAAA,CAAI,eAAA;EACV,GAAA;EACA,OAAA,EAAS,aAAA;AAAA;AAAA,iBAGK,OAAA,CAAQ,IAAA,UAAc,OAAA,EAAS,aAAA,GAAgB,KAAA,UAAe,YAAA;AAAA,iBAyCtD,KAAA,CAAA;EACtB,IAAA;EACA,SAAA;EACA,kBAAA;EACA,OAAA;EACA,GAAA;EACA,GAAA;EAAA,GACG;AAAA,GACF,UAAA,GAAU,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,32 @@
1
+ import { d as GetImageUrl, g as TokenizeOptions, i as EmojiData, p as SpriteConfig, s as EmojiSet } from "../types-o0mRO30y.mjs";
2
+ import { HTMLAttributes, ReactElement, Ref } from "react";
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+
5
+ //#region src/compat/index.d.ts
6
+ interface CompatOptions extends Partial<Omit<TokenizeOptions, 'data'>> {
7
+ data: EmojiData;
8
+ getImageUrl?: GetImageUrl;
9
+ imageUrlTemplate?: string;
10
+ set?: EmojiSet;
11
+ sprite?: SpriteConfig;
12
+ }
13
+ interface EmojiProps extends HTMLAttributes<HTMLSpanElement> {
14
+ text: string;
15
+ onlyEmojiClassName?: string;
16
+ ref?: Ref<HTMLSpanElement>;
17
+ svg?: boolean;
18
+ options: CompatOptions;
19
+ }
20
+ declare function toArray(text: string, options: CompatOptions): Array<string | ReactElement>;
21
+ declare function Emoji({
22
+ text,
23
+ className,
24
+ onlyEmojiClassName,
25
+ options,
26
+ ref,
27
+ svg,
28
+ ...htmlProps
29
+ }: EmojiProps): _$react_jsx_runtime0.JSX.Element;
30
+ //#endregion
31
+ export { CompatOptions, EmojiProps, Emoji as default, toArray };
32
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/compat/index.tsx"],"mappings":";;;;;UAgBiB,aAAA,SAAsB,OAAA,CAAQ,IAAA,CAAK,eAAA;EAClD,IAAA,EAAM,SAAA;EACN,WAAA,GAAc,WAAA;EACd,gBAAA;EACA,GAAA,GAAM,QAAA;EACN,MAAA,GAAS,YAAA;AAAA;AAAA,UAGM,UAAA,SAAmB,cAAA,CAAe,eAAA;EACjD,IAAA;EACA,kBAAA;EACA,GAAA,GAAM,GAAA,CAAI,eAAA;EACV,GAAA;EACA,OAAA,EAAS,aAAA;AAAA;AAAA,iBAGK,OAAA,CAAQ,IAAA,UAAc,OAAA,EAAS,aAAA,GAAgB,KAAA,UAAe,YAAA;AAAA,iBAyCtD,KAAA,CAAA;EACtB,IAAA;EACA,SAAA;EACA,kBAAA;EACA,OAAA;EACA,GAAA;EACA,GAAA;EAAA,GACG;AAAA,GACF,UAAA,GAAU,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,90 @@
1
+ "use client";
2
+ import { t as tokenize } from "../tokenize-BUKMZ9Yg.mjs";
3
+ import { i as resolveImageUrlFn, n as renderTokenDefault, r as createTokenKeyFactory } from "../render-DzloPAWX.mjs";
4
+ import { cloneElement, isValidElement, useMemo } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/compat/index.tsx
7
+ function toArray(text, options) {
8
+ const fullOptions = {
9
+ data: options.data,
10
+ customEmojis: options.customEmojis,
11
+ ascii: options.ascii ?? true,
12
+ defaultSkin: options.defaultSkin,
13
+ extraAliases: options.extraAliases
14
+ };
15
+ const renderSet = options.set ?? "native";
16
+ const resolvedGetImageUrl = resolveImageUrlFn({
17
+ getImageUrl: options.getImageUrl,
18
+ imageUrlTemplate: options.imageUrlTemplate,
19
+ sprite: options.sprite
20
+ });
21
+ const createKey = createTokenKeyFactory();
22
+ return tokenize(text, fullOptions).map((token) => {
23
+ if (token.type === "text") return token.value;
24
+ if (token.type === "unknown") return token.match;
25
+ const key = createKey(token);
26
+ const rendered = renderTokenDefault(token, {
27
+ getImageUrl: resolvedGetImageUrl,
28
+ set: renderSet,
29
+ sprite: options.sprite
30
+ });
31
+ if (isValidElement(rendered)) return cloneElement(rendered, { key });
32
+ return /* @__PURE__ */ jsx("span", {
33
+ title: token.shortcode,
34
+ children: rendered
35
+ }, key);
36
+ });
37
+ }
38
+ function Emoji({ text, className, onlyEmojiClassName, options, ref, svg, ...htmlProps }) {
39
+ const data = options.data;
40
+ const customEmojis = options.customEmojis;
41
+ const ascii = options.ascii;
42
+ const defaultSkin = options.defaultSkin;
43
+ const extraAliases = options.extraAliases;
44
+ const getImageUrl = options.getImageUrl;
45
+ const imageUrlTemplate = options.imageUrlTemplate;
46
+ const sprite = options.sprite;
47
+ const set = options.set ?? (svg ? "apple" : "native");
48
+ const { elements, allEmoji } = useMemo(() => {
49
+ const elements = toArray(text, {
50
+ data,
51
+ customEmojis,
52
+ ascii,
53
+ defaultSkin,
54
+ extraAliases,
55
+ getImageUrl,
56
+ imageUrlTemplate,
57
+ set,
58
+ sprite
59
+ });
60
+ return {
61
+ allEmoji: elements.every((element) => typeof element !== "string" || element.trim() === ""),
62
+ elements
63
+ };
64
+ }, [
65
+ text,
66
+ data,
67
+ customEmojis,
68
+ ascii,
69
+ defaultSkin,
70
+ extraAliases,
71
+ getImageUrl,
72
+ imageUrlTemplate,
73
+ set,
74
+ sprite
75
+ ]);
76
+ return /* @__PURE__ */ jsx("span", {
77
+ className: useMemo(() => [className, allEmoji && onlyEmojiClassName].filter(Boolean).join(" ") || void 0, [
78
+ className,
79
+ allEmoji,
80
+ onlyEmojiClassName
81
+ ]),
82
+ ref,
83
+ ...htmlProps,
84
+ children: elements
85
+ });
86
+ }
87
+ //#endregion
88
+ export { Emoji as default, toArray };
89
+
90
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/compat/index.tsx"],"sourcesContent":["'use client';\n\nimport type { HTMLAttributes, ReactElement, Ref } from 'react';\nimport { cloneElement, isValidElement, useMemo } from 'react';\nimport { tokenize } from '../core/tokenize';\nimport type {\n EmojiData,\n EmojiSet,\n GetImageUrl,\n SpriteConfig,\n TokenizeOptions,\n} from '../core/types';\nimport { resolveImageUrlFn } from '../react/image-url';\nimport { createTokenKeyFactory } from '../react/keys';\nimport { renderTokenDefault } from '../react/render';\n\nexport interface CompatOptions extends Partial<Omit<TokenizeOptions, 'data'>> {\n data: EmojiData;\n getImageUrl?: GetImageUrl;\n imageUrlTemplate?: string;\n set?: EmojiSet;\n sprite?: SpriteConfig;\n}\n\nexport interface EmojiProps extends HTMLAttributes<HTMLSpanElement> {\n text: string;\n onlyEmojiClassName?: string;\n ref?: Ref<HTMLSpanElement>;\n svg?: boolean;\n options: CompatOptions;\n}\n\nexport function toArray(text: string, options: CompatOptions): Array<string | ReactElement> {\n const data = options.data;\n\n const fullOptions: TokenizeOptions = {\n data,\n customEmojis: options.customEmojis,\n ascii: options.ascii ?? true,\n defaultSkin: options.defaultSkin,\n extraAliases: options.extraAliases,\n };\n const renderSet = options.set ?? 'native';\n const resolvedGetImageUrl = resolveImageUrlFn({\n getImageUrl: options.getImageUrl,\n imageUrlTemplate: options.imageUrlTemplate,\n sprite: options.sprite,\n });\n const createKey = createTokenKeyFactory();\n\n return tokenize(text, fullOptions).map((token) => {\n if (token.type === 'text') return token.value;\n if (token.type === 'unknown') return token.match;\n\n const key = createKey(token);\n const rendered = renderTokenDefault(token, {\n getImageUrl: resolvedGetImageUrl,\n set: renderSet,\n sprite: options.sprite,\n });\n\n if (isValidElement(rendered)) {\n return cloneElement(rendered, { key });\n }\n\n return (\n <span key={key} title={token.shortcode}>\n {rendered}\n </span>\n );\n });\n}\n\nexport default function Emoji({\n text,\n className,\n onlyEmojiClassName,\n options,\n ref,\n svg,\n ...htmlProps\n}: EmojiProps) {\n const data = options.data;\n const customEmojis = options.customEmojis;\n const ascii = options.ascii;\n const defaultSkin = options.defaultSkin;\n const extraAliases = options.extraAliases;\n const getImageUrl = options.getImageUrl;\n const imageUrlTemplate = options.imageUrlTemplate;\n const sprite = options.sprite;\n const set = options.set ?? (svg ? 'apple' : 'native');\n\n const { elements, allEmoji } = useMemo(() => {\n const elements = toArray(text, {\n data,\n customEmojis,\n ascii,\n defaultSkin,\n extraAliases,\n getImageUrl,\n imageUrlTemplate,\n set,\n sprite,\n });\n\n return {\n allEmoji: elements.every((element) => typeof element !== 'string' || element.trim() === ''),\n elements,\n };\n }, [\n text,\n data,\n customEmojis,\n ascii,\n defaultSkin,\n extraAliases,\n getImageUrl,\n imageUrlTemplate,\n set,\n sprite,\n ]);\n\n const combinedClassName = useMemo(\n () => [className, allEmoji && onlyEmojiClassName].filter(Boolean).join(' ') || undefined,\n [className, allEmoji, onlyEmojiClassName],\n );\n\n return (\n <span className={combinedClassName} ref={ref} {...htmlProps}>\n {elements}\n </span>\n );\n}\n"],"mappings":";;;;;;AAgCA,SAAgB,QAAQ,MAAc,SAAsD;CAG1F,MAAM,cAA+B;EACnC,MAHW,QAAQ;EAInB,cAAc,QAAQ;EACtB,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACvB;CACD,MAAM,YAAY,QAAQ,OAAO;CACjC,MAAM,sBAAsB,kBAAkB;EAC5C,aAAa,QAAQ;EACrB,kBAAkB,QAAQ;EAC1B,QAAQ,QAAQ;EACjB,CAAC;CACF,MAAM,YAAY,uBAAuB;AAEzC,QAAO,SAAS,MAAM,YAAY,CAAC,KAAK,UAAU;AAChD,MAAI,MAAM,SAAS,OAAQ,QAAO,MAAM;AACxC,MAAI,MAAM,SAAS,UAAW,QAAO,MAAM;EAE3C,MAAM,MAAM,UAAU,MAAM;EAC5B,MAAM,WAAW,mBAAmB,OAAO;GACzC,aAAa;GACb,KAAK;GACL,QAAQ,QAAQ;GACjB,CAAC;AAEF,MAAI,eAAe,SAAS,CAC1B,QAAO,aAAa,UAAU,EAAE,KAAK,CAAC;AAGxC,SACE,oBAAC,QAAD;GAAgB,OAAO,MAAM;aAC1B;GACI,EAFI,IAEJ;GAET;;AAGJ,SAAwB,MAAM,EAC5B,MACA,WACA,oBACA,SACA,KACA,KACA,GAAG,aACU;CACb,MAAM,OAAO,QAAQ;CACrB,MAAM,eAAe,QAAQ;CAC7B,MAAM,QAAQ,QAAQ;CACtB,MAAM,cAAc,QAAQ;CAC5B,MAAM,eAAe,QAAQ;CAC7B,MAAM,cAAc,QAAQ;CAC5B,MAAM,mBAAmB,QAAQ;CACjC,MAAM,SAAS,QAAQ;CACvB,MAAM,MAAM,QAAQ,QAAQ,MAAM,UAAU;CAE5C,MAAM,EAAE,UAAU,aAAa,cAAc;EAC3C,MAAM,WAAW,QAAQ,MAAM;GAC7B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;AAEF,SAAO;GACL,UAAU,SAAS,OAAO,YAAY,OAAO,YAAY,YAAY,QAAQ,MAAM,KAAK,GAAG;GAC3F;GACD;IACA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAOF,QACE,oBAAC,QAAD;EAAM,WANkB,cAClB,CAAC,WAAW,YAAY,mBAAmB,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,KAAA,GAC/E;GAAC;GAAW;GAAU;GAAmB,CAIP;EAAO;EAAK,GAAI;YAC/C;EACI,CAAA"}
package/dist/core.cjs ADDED
@@ -0,0 +1,10 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_tokenize = require("./tokenize-CyKMb3O9.cjs");
3
+ exports.buildAsciiCandidates = require_tokenize.buildAsciiCandidates;
4
+ exports.buildAsciiIndex = require_tokenize.buildAsciiIndex;
5
+ exports.buildIndexes = require_tokenize.buildIndexes;
6
+ exports.detectSkinToneFromUnified = require_tokenize.detectSkinToneFromUnified;
7
+ exports.matchAscii = require_tokenize.matchAscii;
8
+ exports.resolveSkin = require_tokenize.resolveSkin;
9
+ exports.skinToneShortcodeToTone = require_tokenize.skinToneShortcodeToTone;
10
+ exports.tokenize = require_tokenize.tokenize;
@@ -0,0 +1,4 @@
1
+ import { _ as UnknownToken, a as EmojiEntry, c as EmojiSkin, d as GetImageUrl, f as SkinTone, g as TokenizeOptions, h as Token, i as EmojiData, l as EmojiSource, m as TextToken, n as CustomEmojiCategory, o as EmojiImageContext, p as SpriteConfig, r as EmojiConfig, s as EmojiSet, t as CustomEmoji, u as EmojiToken } from "./types-Dyzdpq-R.cjs";
2
+ import { a as buildAsciiCandidates, i as skinToneShortcodeToTone, n as detectSkinToneFromUnified, o as buildAsciiIndex, r as resolveSkin, s as matchAscii, t as tokenize } from "./index-DPd10zCJ.cjs";
3
+ import { n as ShortcodeEntry, r as buildIndexes, t as EmojiIndexes } from "./indexes-3fK5ySH8.cjs";
4
+ export { CustomEmoji, CustomEmojiCategory, EmojiConfig, EmojiData, EmojiEntry, EmojiImageContext, EmojiIndexes, EmojiSet, EmojiSkin, EmojiSource, EmojiToken, GetImageUrl, ShortcodeEntry, SkinTone, SpriteConfig, TextToken, Token, TokenizeOptions, UnknownToken, buildAsciiCandidates, buildAsciiIndex, buildIndexes, detectSkinToneFromUnified, matchAscii, resolveSkin, skinToneShortcodeToTone, tokenize };
@@ -0,0 +1,4 @@
1
+ import { _ as UnknownToken, a as EmojiEntry, c as EmojiSkin, d as GetImageUrl, f as SkinTone, g as TokenizeOptions, h as Token, i as EmojiData, l as EmojiSource, m as TextToken, n as CustomEmojiCategory, o as EmojiImageContext, p as SpriteConfig, r as EmojiConfig, s as EmojiSet, t as CustomEmoji, u as EmojiToken } from "./types-o0mRO30y.mjs";
2
+ import { a as buildAsciiCandidates, i as skinToneShortcodeToTone, n as detectSkinToneFromUnified, o as buildAsciiIndex, r as resolveSkin, s as matchAscii, t as tokenize } from "./index-B39vk6JI.mjs";
3
+ import { n as ShortcodeEntry, r as buildIndexes, t as EmojiIndexes } from "./indexes-BMCSN-X0.mjs";
4
+ export { CustomEmoji, CustomEmojiCategory, EmojiConfig, EmojiData, EmojiEntry, EmojiImageContext, EmojiIndexes, EmojiSet, EmojiSkin, EmojiSource, EmojiToken, GetImageUrl, ShortcodeEntry, SkinTone, SpriteConfig, TextToken, Token, TokenizeOptions, UnknownToken, buildAsciiCandidates, buildAsciiIndex, buildIndexes, detectSkinToneFromUnified, matchAscii, resolveSkin, skinToneShortcodeToTone, tokenize };
package/dist/core.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import { a as skinToneShortcodeToTone, c as buildAsciiIndex, i as resolveSkin, l as matchAscii, o as buildIndexes, r as detectSkinToneFromUnified, s as buildAsciiCandidates, t as tokenize } from "./tokenize-BUKMZ9Yg.mjs";
2
+ export { buildAsciiCandidates, buildAsciiIndex, buildIndexes, detectSkinToneFromUnified, matchAscii, resolveSkin, skinToneShortcodeToTone, tokenize };
@@ -0,0 +1,23 @@
1
+ import { a as EmojiEntry, f as SkinTone, g as TokenizeOptions, h as Token, i as EmojiData } from "./types-o0mRO30y.mjs";
2
+
3
+ //#region src/core/ascii.d.ts
4
+ declare function buildAsciiIndex(data: EmojiData): Map<string, string>;
5
+ declare function buildAsciiCandidates(asciiIndex: Map<string, string>): string[];
6
+ declare function matchAscii(input: string, position: number, asciiIndex: Map<string, string>, asciiCandidates?: string[]): {
7
+ ascii: string;
8
+ emojiId: string;
9
+ } | undefined;
10
+ //#endregion
11
+ //#region src/core/skin.d.ts
12
+ declare function detectSkinToneFromUnified(unified: string): SkinTone | undefined;
13
+ declare function resolveSkin(emoji: EmojiEntry, explicitSkin: SkinTone | undefined, defaultSkin: SkinTone | undefined): {
14
+ native: string;
15
+ skin: SkinTone | undefined;
16
+ };
17
+ declare function skinToneShortcodeToTone(shortcode: string): SkinTone | undefined;
18
+ //#endregion
19
+ //#region src/core/tokenize.d.ts
20
+ declare function tokenize(input: string, options: TokenizeOptions): Token[];
21
+ //#endregion
22
+ export { buildAsciiCandidates as a, skinToneShortcodeToTone as i, detectSkinToneFromUnified as n, buildAsciiIndex as o, resolveSkin as r, matchAscii as s, tokenize as t };
23
+ //# sourceMappingURL=index-B39vk6JI.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-B39vk6JI.d.mts","names":[],"sources":["../src/core/ascii.ts","../src/core/skin.ts","../src/core/tokenize.ts"],"mappings":";;;iBA8BgB,eAAA,CAAgB,IAAA,EAAM,SAAA,GAAY,GAAA;AAAA,iBAkBlC,oBAAA,CAAqB,UAAA,EAAY,GAAA;AAAA,iBAOjC,UAAA,CACd,KAAA,UACA,QAAA,UACA,UAAA,EAAY,GAAA,kBACZ,eAAA;EACG,KAAA;EAAe,OAAA;AAAA;;;iBCzCJ,yBAAA,CAA0B,OAAA,WAAkB,QAAA;AAAA,iBAU5C,WAAA,CACd,KAAA,EAAO,UAAA,EACP,YAAA,EAAc,QAAA,cACd,WAAA,EAAa,QAAA;EACV,MAAA;EAAgB,IAAA,EAAM,QAAA;AAAA;AAAA,iBAmBX,uBAAA,CAAwB,SAAA,WAAoB,QAAA;;;iBC2D5C,QAAA,CAAS,KAAA,UAAe,OAAA,EAAS,eAAA,GAAkB,KAAA"}
@@ -0,0 +1,23 @@
1
+ import { a as EmojiEntry, f as SkinTone, g as TokenizeOptions, h as Token, i as EmojiData } from "./types-Dyzdpq-R.cjs";
2
+
3
+ //#region src/core/ascii.d.ts
4
+ declare function buildAsciiIndex(data: EmojiData): Map<string, string>;
5
+ declare function buildAsciiCandidates(asciiIndex: Map<string, string>): string[];
6
+ declare function matchAscii(input: string, position: number, asciiIndex: Map<string, string>, asciiCandidates?: string[]): {
7
+ ascii: string;
8
+ emojiId: string;
9
+ } | undefined;
10
+ //#endregion
11
+ //#region src/core/skin.d.ts
12
+ declare function detectSkinToneFromUnified(unified: string): SkinTone | undefined;
13
+ declare function resolveSkin(emoji: EmojiEntry, explicitSkin: SkinTone | undefined, defaultSkin: SkinTone | undefined): {
14
+ native: string;
15
+ skin: SkinTone | undefined;
16
+ };
17
+ declare function skinToneShortcodeToTone(shortcode: string): SkinTone | undefined;
18
+ //#endregion
19
+ //#region src/core/tokenize.d.ts
20
+ declare function tokenize(input: string, options: TokenizeOptions): Token[];
21
+ //#endregion
22
+ export { buildAsciiCandidates as a, skinToneShortcodeToTone as i, detectSkinToneFromUnified as n, buildAsciiIndex as o, resolveSkin as r, matchAscii as s, tokenize as t };
23
+ //# sourceMappingURL=index-DPd10zCJ.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DPd10zCJ.d.cts","names":[],"sources":["../src/core/ascii.ts","../src/core/skin.ts","../src/core/tokenize.ts"],"mappings":";;;iBA8BgB,eAAA,CAAgB,IAAA,EAAM,SAAA,GAAY,GAAA;AAAA,iBAkBlC,oBAAA,CAAqB,UAAA,EAAY,GAAA;AAAA,iBAOjC,UAAA,CACd,KAAA,UACA,QAAA,UACA,UAAA,EAAY,GAAA,kBACZ,eAAA;EACG,KAAA;EAAe,OAAA;AAAA;;;iBCzCJ,yBAAA,CAA0B,OAAA,WAAkB,QAAA;AAAA,iBAU5C,WAAA,CACd,KAAA,EAAO,UAAA,EACP,YAAA,EAAc,QAAA,cACd,WAAA,EAAa,QAAA;EACV,MAAA;EAAgB,IAAA,EAAM,QAAA;AAAA;AAAA,iBAmBX,uBAAA,CAAwB,SAAA,WAAoB,QAAA;;;iBC2D5C,QAAA,CAAS,KAAA,UAAe,OAAA,EAAS,eAAA,GAAkB,KAAA"}