@mantine/emoji 0.0.0-stage → 9.8.1
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.
- package/LICENSE +21 -0
- package/README.md +20 -2
- package/cjs/adapters/emoji-mart-adapter.cjs +30 -0
- package/cjs/adapters/emoji-mart-adapter.cjs.map +1 -0
- package/cjs/adapters/emojibase-adapter.cjs +76 -0
- package/cjs/adapters/emojibase-adapter.cjs.map +1 -0
- package/cjs/categories.cjs +52 -0
- package/cjs/categories.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiButton.cjs +24 -0
- package/cjs/components/EmojiPicker/EmojiButton.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPicker.cjs +289 -0
- package/cjs/components/EmojiPicker/EmojiPicker.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPicker.context.cjs +7 -0
- package/cjs/components/EmojiPicker/EmojiPicker.context.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPicker.module.cjs +22 -0
- package/cjs/components/EmojiPicker/EmojiPicker.module.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPickerCategoryNav.cjs +38 -0
- package/cjs/components/EmojiPicker/EmojiPickerCategoryNav.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPickerGrid.cjs +131 -0
- package/cjs/components/EmojiPicker/EmojiPickerGrid.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPickerPreview.cjs +24 -0
- package/cjs/components/EmojiPicker/EmojiPickerPreview.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPickerSearch.cjs +57 -0
- package/cjs/components/EmojiPicker/EmojiPickerSearch.cjs.map +1 -0
- package/cjs/components/EmojiPicker/EmojiPickerSkinTone.cjs +63 -0
- package/cjs/components/EmojiPicker/EmojiPickerSkinTone.cjs.map +1 -0
- package/cjs/components/EmojiPickerInput/EmojiPickerInput.cjs +190 -0
- package/cjs/components/EmojiPickerInput/EmojiPickerInput.cjs.map +1 -0
- package/cjs/components/EmojiPickerInput/EmojiPickerInput.module.cjs +11 -0
- package/cjs/components/EmojiPickerInput/EmojiPickerInput.module.cjs.map +1 -0
- package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.cjs +59 -0
- package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.cjs.map +1 -0
- package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.module.cjs +6 -0
- package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.module.cjs.map +1 -0
- package/cjs/hooks/use-emoji-grid-navigation.cjs +70 -0
- package/cjs/hooks/use-emoji-grid-navigation.cjs.map +1 -0
- package/cjs/hooks/use-emoji-search.cjs +21 -0
- package/cjs/hooks/use-emoji-search.cjs.map +1 -0
- package/cjs/index.cjs +22 -0
- package/cjs/types.cjs +20 -0
- package/cjs/types.cjs.map +1 -0
- package/cjs/utils/emoji-grid-utils.cjs +57 -0
- package/cjs/utils/emoji-grid-utils.cjs.map +1 -0
- package/cjs/utils/flatten-emoji-data.cjs +33 -0
- package/cjs/utils/flatten-emoji-data.cjs.map +1 -0
- package/cjs/utils/is-emoji-supported.cjs +64 -0
- package/cjs/utils/is-emoji-supported.cjs.map +1 -0
- package/cjs/utils/search-emojis.cjs +21 -0
- package/cjs/utils/search-emojis.cjs.map +1 -0
- package/esm/adapters/emoji-mart-adapter.mjs +30 -0
- package/esm/adapters/emoji-mart-adapter.mjs.map +1 -0
- package/esm/adapters/emojibase-adapter.mjs +76 -0
- package/esm/adapters/emojibase-adapter.mjs.map +1 -0
- package/esm/categories.mjs +47 -0
- package/esm/categories.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiButton.mjs +24 -0
- package/esm/components/EmojiPicker/EmojiButton.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPicker.context.mjs +7 -0
- package/esm/components/EmojiPicker/EmojiPicker.context.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPicker.mjs +289 -0
- package/esm/components/EmojiPicker/EmojiPicker.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPicker.module.mjs +22 -0
- package/esm/components/EmojiPicker/EmojiPicker.module.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPickerCategoryNav.mjs +38 -0
- package/esm/components/EmojiPicker/EmojiPickerCategoryNav.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPickerGrid.mjs +131 -0
- package/esm/components/EmojiPicker/EmojiPickerGrid.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPickerPreview.mjs +24 -0
- package/esm/components/EmojiPicker/EmojiPickerPreview.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPickerSearch.mjs +57 -0
- package/esm/components/EmojiPicker/EmojiPickerSearch.mjs.map +1 -0
- package/esm/components/EmojiPicker/EmojiPickerSkinTone.mjs +63 -0
- package/esm/components/EmojiPicker/EmojiPickerSkinTone.mjs.map +1 -0
- package/esm/components/EmojiPickerInput/EmojiPickerInput.mjs +190 -0
- package/esm/components/EmojiPickerInput/EmojiPickerInput.mjs.map +1 -0
- package/esm/components/EmojiPickerInput/EmojiPickerInput.module.mjs +11 -0
- package/esm/components/EmojiPickerInput/EmojiPickerInput.module.mjs.map +1 -0
- package/esm/components/EmojiPickerPopover/EmojiPickerPopover.mjs +59 -0
- package/esm/components/EmojiPickerPopover/EmojiPickerPopover.mjs.map +1 -0
- package/esm/components/EmojiPickerPopover/EmojiPickerPopover.module.mjs +6 -0
- package/esm/components/EmojiPickerPopover/EmojiPickerPopover.module.mjs.map +1 -0
- package/esm/hooks/use-emoji-grid-navigation.mjs +70 -0
- package/esm/hooks/use-emoji-grid-navigation.mjs.map +1 -0
- package/esm/hooks/use-emoji-search.mjs +21 -0
- package/esm/hooks/use-emoji-search.mjs.map +1 -0
- package/esm/index.mjs +11 -0
- package/esm/types.mjs +20 -0
- package/esm/types.mjs.map +1 -0
- package/esm/utils/emoji-grid-utils.mjs +54 -0
- package/esm/utils/emoji-grid-utils.mjs.map +1 -0
- package/esm/utils/flatten-emoji-data.mjs +33 -0
- package/esm/utils/flatten-emoji-data.mjs.map +1 -0
- package/esm/utils/is-emoji-supported.mjs +63 -0
- package/esm/utils/is-emoji-supported.mjs.map +1 -0
- package/esm/utils/search-emojis.mjs +21 -0
- package/esm/utils/search-emojis.mjs.map +1 -0
- package/lib/adapters/emoji-mart-adapter.d.ts +23 -0
- package/lib/adapters/emojibase-adapter.d.ts +25 -0
- package/lib/adapters/index.d.ts +2 -0
- package/lib/categories.d.ts +7 -0
- package/lib/components/EmojiPicker/EmojiButton.d.ts +10 -0
- package/lib/components/EmojiPicker/EmojiPicker.context.d.ts +9 -0
- package/lib/components/EmojiPicker/EmojiPicker.d.ts +64 -0
- package/lib/components/EmojiPicker/EmojiPickerCategoryNav.d.ts +10 -0
- package/lib/components/EmojiPicker/EmojiPickerGrid.d.ts +23 -0
- package/lib/components/EmojiPicker/EmojiPickerPreview.d.ts +9 -0
- package/lib/components/EmojiPicker/EmojiPickerSearch.d.ts +14 -0
- package/lib/components/EmojiPicker/EmojiPickerSkinTone.d.ts +6 -0
- package/lib/components/EmojiPicker/index.d.ts +2 -0
- package/lib/components/EmojiPickerInput/EmojiPickerInput.d.ts +54 -0
- package/lib/components/EmojiPickerInput/index.d.ts +2 -0
- package/lib/components/EmojiPickerPopover/EmojiPickerPopover.d.ts +24 -0
- package/lib/components/EmojiPickerPopover/index.d.ts +2 -0
- package/lib/hooks/index.d.ts +2 -0
- package/lib/hooks/use-emoji-grid-navigation.d.ts +18 -0
- package/lib/hooks/use-emoji-search.d.ts +14 -0
- package/lib/index.d.mts +10 -0
- package/lib/index.d.ts +10 -0
- package/lib/types.d.ts +41 -0
- package/lib/utils/emoji-grid-utils.d.ts +17 -0
- package/lib/utils/flatten-emoji-data.d.ts +2 -0
- package/lib/utils/index.d.ts +5 -0
- package/lib/utils/is-emoji-supported.d.ts +4 -0
- package/lib/utils/search-emojis.d.ts +2 -0
- package/package.json +54 -4
- package/styles.css +228 -0
- package/styles.layer.css +229 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEmojiPickerContext } from "./EmojiPicker.context.mjs";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { CloseButton, Input, InputWrapperContext } from "@mantine/core";
|
|
5
|
+
import { useMergedRef } from "@mantine/hooks";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
// packages/@mantine/emoji/src/components/EmojiPicker/EmojiPickerSearch.tsx
|
|
8
|
+
const RESET_WRAPPER_CONTEXT = {
|
|
9
|
+
offsetTop: false,
|
|
10
|
+
offsetBottom: false,
|
|
11
|
+
describedBy: void 0,
|
|
12
|
+
inputId: void 0,
|
|
13
|
+
labelId: void 0,
|
|
14
|
+
getStyles: null
|
|
15
|
+
};
|
|
16
|
+
function EmojiPickerSearch({ query, onQueryChange, placeholder, autoFocus, inputRef, onKeyDown, controls, activeDescendant, searchInputProps }) {
|
|
17
|
+
const ctx = useEmojiPickerContext();
|
|
18
|
+
const localRef = useRef(null);
|
|
19
|
+
const mergedRef = useMergedRef(localRef, inputRef);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (autoFocus) localRef.current?.focus({ preventScroll: true });
|
|
22
|
+
}, []);
|
|
23
|
+
const handleClear = () => {
|
|
24
|
+
onQueryChange("");
|
|
25
|
+
localRef.current?.focus();
|
|
26
|
+
};
|
|
27
|
+
return /* @__PURE__ */ jsx("div", {
|
|
28
|
+
...ctx.getStyles("search"),
|
|
29
|
+
children: /* @__PURE__ */ jsx(InputWrapperContext, {
|
|
30
|
+
value: RESET_WRAPPER_CONTEXT,
|
|
31
|
+
children: /* @__PURE__ */ jsx(Input, {
|
|
32
|
+
...ctx.getStyles("searchInput"),
|
|
33
|
+
ref: mergedRef,
|
|
34
|
+
size: ctx.size,
|
|
35
|
+
value: query,
|
|
36
|
+
onChange: (event) => onQueryChange(event.currentTarget.value),
|
|
37
|
+
placeholder: placeholder || ctx.labels.search,
|
|
38
|
+
role: "searchbox",
|
|
39
|
+
"aria-label": ctx.labels.search,
|
|
40
|
+
"aria-controls": controls,
|
|
41
|
+
"aria-activedescendant": activeDescendant,
|
|
42
|
+
onKeyDown,
|
|
43
|
+
rightSectionPointerEvents: "all",
|
|
44
|
+
rightSection: query ? /* @__PURE__ */ jsx(CloseButton, {
|
|
45
|
+
size: "sm",
|
|
46
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
47
|
+
onClick: handleClear,
|
|
48
|
+
"aria-label": ctx.labels.clearSearch
|
|
49
|
+
}) : void 0,
|
|
50
|
+
...searchInputProps
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export { EmojiPickerSearch };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=EmojiPickerSearch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerSearch.mjs","names":[],"sources":["../../../src/components/EmojiPicker/EmojiPickerSearch.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { CloseButton, Input, InputProps, InputWrapperContext } from '@mantine/core';\nimport { useMergedRef } from '@mantine/hooks';\nimport { useEmojiPickerContext } from './EmojiPicker.context';\n\ninterface EmojiPickerSearchProps {\n query: string;\n onQueryChange: (value: string) => void;\n placeholder?: string;\n autoFocus?: boolean;\n inputRef?: React.Ref<HTMLInputElement>;\n onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n controls?: string;\n activeDescendant?: string;\n searchInputProps?: InputProps;\n}\n\nconst RESET_WRAPPER_CONTEXT = {\n offsetTop: false,\n offsetBottom: false,\n describedBy: undefined,\n inputId: undefined,\n labelId: undefined,\n getStyles: null,\n};\n\nexport function EmojiPickerSearch({\n query,\n onQueryChange,\n placeholder,\n autoFocus,\n inputRef,\n onKeyDown,\n controls,\n activeDescendant,\n searchInputProps,\n}: EmojiPickerSearchProps) {\n const ctx = useEmojiPickerContext();\n const localRef = useRef<HTMLInputElement>(null);\n const mergedRef = useMergedRef(localRef, inputRef);\n\n useEffect(() => {\n if (autoFocus) {\n localRef.current?.focus({ preventScroll: true });\n }\n }, []);\n\n const handleClear = () => {\n onQueryChange('');\n localRef.current?.focus();\n };\n\n return (\n <div {...ctx.getStyles('search')}>\n <InputWrapperContext value={RESET_WRAPPER_CONTEXT}>\n <Input\n {...ctx.getStyles('searchInput')}\n ref={mergedRef}\n size={ctx.size}\n value={query}\n onChange={(event) => onQueryChange(event.currentTarget.value)}\n placeholder={placeholder || ctx.labels.search}\n role=\"searchbox\"\n aria-label={ctx.labels.search}\n aria-controls={controls}\n aria-activedescendant={activeDescendant}\n onKeyDown={onKeyDown}\n rightSectionPointerEvents=\"all\"\n rightSection={\n query ? (\n <CloseButton\n size=\"sm\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n aria-label={ctx.labels.clearSearch}\n />\n ) : undefined\n }\n {...searchInputProps}\n />\n </InputWrapperContext>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAiBA,MAAM,wBAAwB;CAC5B,WAAW;CACX,cAAc;CACd,aAAa,KAAA;CACb,SAAS,KAAA;CACT,SAAS,KAAA;CACT,WAAW;AACb;AAEA,SAAgB,kBAAkB,EAChC,OACA,eACA,aACA,WACA,UACA,WACA,UACA,kBACA,oBACyB;CACzB,MAAM,MAAM,sBAAsB;CAClC,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,YAAY,aAAa,UAAU,QAAQ;CAEjD,gBAAgB;EACd,IAAI,WACF,SAAS,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;CAEnD,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB;EACxB,cAAc,EAAE;EAChB,SAAS,SAAS,MAAM;CAC1B;CAEA,OACE,oBAAC,OAAD;EAAK,GAAI,IAAI,UAAU,QAAQ;EAC7B,UAAA,oBAAC,qBAAD;GAAqB,OAAO;GAC1B,UAAA,oBAAC,OAAD;IACE,GAAI,IAAI,UAAU,aAAa;IAC/B,KAAK;IACL,MAAM,IAAI;IACV,OAAO;IACP,WAAW,UAAU,cAAc,MAAM,cAAc,KAAK;IAC5D,aAAa,eAAe,IAAI,OAAO;IACvC,MAAK;IACL,cAAY,IAAI,OAAO;IACvB,iBAAe;IACf,yBAAuB;IACZ;IACX,2BAA0B;IAC1B,cACE,QACE,oBAAC,aAAD;KACE,MAAK;KACL,cAAc,UAAU,MAAM,eAAe;KAC7C,SAAS;KACT,cAAY,IAAI,OAAO;IACxB,CAAA,IACC,KAAA;IAEN,GAAI;GACL,CAAA;EACkB,CAAA;CAClB,CAAA;AAET"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEmojiPickerContext } from "./EmojiPicker.context.mjs";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Popover, UnstyledButton } from "@mantine/core";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
// packages/@mantine/emoji/src/components/EmojiPicker/EmojiPickerSkinTone.tsx
|
|
7
|
+
const SKIN_TONE_EMOJIS = [
|
|
8
|
+
"👋",
|
|
9
|
+
"👋🏻",
|
|
10
|
+
"👋🏼",
|
|
11
|
+
"👋🏽",
|
|
12
|
+
"👋🏾",
|
|
13
|
+
"👋🏿"
|
|
14
|
+
];
|
|
15
|
+
const SKIN_TONE_LABEL_KEYS = [
|
|
16
|
+
"skinToneDefault",
|
|
17
|
+
"skinToneLight",
|
|
18
|
+
"skinToneMediumLight",
|
|
19
|
+
"skinToneMedium",
|
|
20
|
+
"skinToneMediumDark",
|
|
21
|
+
"skinToneDark"
|
|
22
|
+
];
|
|
23
|
+
function EmojiPickerSkinTone({ skinTone, onSkinToneChange }) {
|
|
24
|
+
const ctx = useEmojiPickerContext();
|
|
25
|
+
const [opened, setOpened] = useState(false);
|
|
26
|
+
return /* @__PURE__ */ jsxs(Popover, {
|
|
27
|
+
opened,
|
|
28
|
+
onChange: setOpened,
|
|
29
|
+
position: "top",
|
|
30
|
+
withArrow: true,
|
|
31
|
+
withinPortal: false,
|
|
32
|
+
trapFocus: true,
|
|
33
|
+
returnFocus: true,
|
|
34
|
+
children: [/* @__PURE__ */ jsx(Popover.Target, { children: /* @__PURE__ */ jsx(UnstyledButton, {
|
|
35
|
+
...ctx.getStyles("skinToneButton"),
|
|
36
|
+
"aria-label": ctx.labels.skinTone,
|
|
37
|
+
title: ctx.labels.skinTone,
|
|
38
|
+
onClick: () => setOpened((o) => !o),
|
|
39
|
+
children: SKIN_TONE_EMOJIS[skinTone]
|
|
40
|
+
}) }), /* @__PURE__ */ jsx(Popover.Dropdown, {
|
|
41
|
+
...ctx.getStyles("skinToneDropdown"),
|
|
42
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
43
|
+
...ctx.getStyles("skinToneSelector"),
|
|
44
|
+
children: SKIN_TONE_EMOJIS.map((emoji, index) => /* @__PURE__ */ jsx(UnstyledButton, {
|
|
45
|
+
...ctx.getStyles("skinToneButton"),
|
|
46
|
+
"aria-label": ctx.labels[SKIN_TONE_LABEL_KEYS[index]],
|
|
47
|
+
title: ctx.labels[SKIN_TONE_LABEL_KEYS[index]],
|
|
48
|
+
"aria-pressed": skinTone === index,
|
|
49
|
+
"data-active": skinTone === index || void 0,
|
|
50
|
+
"data-autofocus": skinTone === index || void 0,
|
|
51
|
+
onClick: () => {
|
|
52
|
+
onSkinToneChange(index);
|
|
53
|
+
setOpened(false);
|
|
54
|
+
},
|
|
55
|
+
children: emoji
|
|
56
|
+
}, index))
|
|
57
|
+
})
|
|
58
|
+
})]
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export { EmojiPickerSkinTone };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=EmojiPickerSkinTone.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerSkinTone.mjs","names":[],"sources":["../../../src/components/EmojiPicker/EmojiPickerSkinTone.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Popover, UnstyledButton } from '@mantine/core';\nimport { useEmojiPickerContext } from './EmojiPicker.context';\n\ninterface EmojiPickerSkinToneProps {\n skinTone: number;\n onSkinToneChange: (skinTone: number) => void;\n}\n\nconst SKIN_TONE_EMOJIS = ['👋', '👋🏻', '👋🏼', '👋🏽', '👋🏾', '👋🏿'];\n\nconst SKIN_TONE_LABEL_KEYS = [\n 'skinToneDefault',\n 'skinToneLight',\n 'skinToneMediumLight',\n 'skinToneMedium',\n 'skinToneMediumDark',\n 'skinToneDark',\n] as const;\n\nexport function EmojiPickerSkinTone({ skinTone, onSkinToneChange }: EmojiPickerSkinToneProps) {\n const ctx = useEmojiPickerContext();\n const [opened, setOpened] = useState(false);\n\n return (\n <Popover\n opened={opened}\n onChange={setOpened}\n position=\"top\"\n withArrow\n withinPortal={false}\n trapFocus\n returnFocus\n >\n <Popover.Target>\n <UnstyledButton\n {...ctx.getStyles('skinToneButton')}\n aria-label={ctx.labels.skinTone}\n title={ctx.labels.skinTone}\n onClick={() => setOpened((o) => !o)}\n >\n {SKIN_TONE_EMOJIS[skinTone]}\n </UnstyledButton>\n </Popover.Target>\n <Popover.Dropdown {...ctx.getStyles('skinToneDropdown')}>\n <div {...ctx.getStyles('skinToneSelector')}>\n {SKIN_TONE_EMOJIS.map((emoji, index) => (\n <UnstyledButton\n key={index}\n {...ctx.getStyles('skinToneButton')}\n aria-label={ctx.labels[SKIN_TONE_LABEL_KEYS[index]]}\n title={ctx.labels[SKIN_TONE_LABEL_KEYS[index]]}\n aria-pressed={skinTone === index}\n data-active={skinTone === index || undefined}\n data-autofocus={skinTone === index || undefined}\n onClick={() => {\n onSkinToneChange(index);\n setOpened(false);\n }}\n >\n {emoji}\n </UnstyledButton>\n ))}\n </div>\n </Popover.Dropdown>\n </Popover>\n );\n}\n"],"mappings":";;;;;;AASA,MAAM,mBAAmB;CAAC;CAAM;CAAQ;CAAQ;CAAQ;CAAQ;AAAM;AAEtE,MAAM,uBAAuB;CAC3B;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,oBAAoB,EAAE,UAAU,oBAA8C;CAC5F,MAAM,MAAM,sBAAsB;CAClC,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAE1C,OACE,qBAAC,SAAD;EACU;EACR,UAAU;EACV,UAAS;EACT,WAAA;EACA,cAAc;EACd,WAAA;EACA,aAAA;EAPF,UAAA,CASE,oBAAC,QAAQ,QAAT,EAAA,UACE,oBAAC,gBAAD;GACE,GAAI,IAAI,UAAU,gBAAgB;GAClC,cAAY,IAAI,OAAO;GACvB,OAAO,IAAI,OAAO;GAClB,eAAe,WAAW,MAAM,CAAC,CAAC;GAEjC,UAAA,iBAAiB;EACJ,CAAA,EACF,CAAA,GAChB,oBAAC,QAAQ,UAAT;GAAkB,GAAI,IAAI,UAAU,kBAAkB;GACpD,UAAA,oBAAC,OAAD;IAAK,GAAI,IAAI,UAAU,kBAAkB;IACtC,UAAA,iBAAiB,KAAK,OAAO,UAC5B,oBAAC,gBAAD;KAEE,GAAI,IAAI,UAAU,gBAAgB;KAClC,cAAY,IAAI,OAAO,qBAAqB;KAC5C,OAAO,IAAI,OAAO,qBAAqB;KACvC,gBAAc,aAAa;KAC3B,eAAa,aAAa,SAAS,KAAA;KACnC,kBAAgB,aAAa,SAAS,KAAA;KACtC,eAAe;MACb,iBAAiB,KAAK;MACtB,UAAU,KAAK;KACjB;KAEC,UAAA;IACa,GAbT,KAaS,CACjB;GACE,CAAA;EACW,CAAA,CACX;;AAEb"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { EmojiPicker } from "../EmojiPicker/EmojiPicker.mjs";
|
|
3
|
+
import EmojiPickerInput_module_default from "./EmojiPickerInput.module.mjs";
|
|
4
|
+
import { useCallback, useRef, useState } from "react";
|
|
5
|
+
import { Input, InputBase, Popover, createVarsResolver, extractStyleProps, factory, useProps, useResolvedStylesApi, useStyles } from "@mantine/core";
|
|
6
|
+
import { useId as useId$1, useMergedRef, useUncontrolled } from "@mantine/hooks";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
// packages/@mantine/emoji/src/components/EmojiPickerInput/EmojiPickerInput.tsx
|
|
9
|
+
const defaultProps = {
|
|
10
|
+
closeOnSelect: true,
|
|
11
|
+
clearable: false,
|
|
12
|
+
size: "sm"
|
|
13
|
+
};
|
|
14
|
+
const varsResolver = createVarsResolver(() => ({ root: {} }));
|
|
15
|
+
const EmojiPickerInput = factory((_props) => {
|
|
16
|
+
const props = useProps("EmojiPickerInput", defaultProps, _props);
|
|
17
|
+
const { classNames, styles, unstyled, vars, value: valueProp, defaultValue, onChange, placeholder, clearable, clearButtonProps, popoverProps, opened: openedProp, defaultOpened, onOpenedChange, closeOnSelect, data, onEmojiSelect, pickerProps, readOnly, disabled, label, description, error, success, required, className, style, id, size, variant, errorProps, successProps, labelProps, descriptionProps, wrapperProps: _wrapperProps, inputContainer, inputWrapperOrder, withAsterisk, mod, attributes, rightSection, ref, ...others } = props;
|
|
18
|
+
const { styleProps, rest } = extractStyleProps(others);
|
|
19
|
+
const inputRef = useRef(null);
|
|
20
|
+
const mergedRef = useMergedRef(inputRef, ref);
|
|
21
|
+
const getStyles = useStyles({
|
|
22
|
+
name: "EmojiPickerInput",
|
|
23
|
+
props,
|
|
24
|
+
classes: EmojiPickerInput_module_default,
|
|
25
|
+
classNames,
|
|
26
|
+
styles,
|
|
27
|
+
unstyled,
|
|
28
|
+
vars,
|
|
29
|
+
varsResolver
|
|
30
|
+
});
|
|
31
|
+
const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi({
|
|
32
|
+
classNames,
|
|
33
|
+
styles,
|
|
34
|
+
props
|
|
35
|
+
});
|
|
36
|
+
const [value, setValue] = useUncontrolled({
|
|
37
|
+
value: valueProp,
|
|
38
|
+
defaultValue: defaultValue ?? null,
|
|
39
|
+
onChange
|
|
40
|
+
});
|
|
41
|
+
const [opened, setOpened] = useUncontrolled({
|
|
42
|
+
value: openedProp,
|
|
43
|
+
defaultValue: defaultOpened,
|
|
44
|
+
finalValue: false,
|
|
45
|
+
onChange: onOpenedChange
|
|
46
|
+
});
|
|
47
|
+
const [skinTone, setSkinTone] = useUncontrolled({
|
|
48
|
+
value: pickerProps?.skinTone,
|
|
49
|
+
defaultValue: pickerProps?.defaultSkinTone,
|
|
50
|
+
finalValue: 0,
|
|
51
|
+
onChange: pickerProps?.onSkinToneChange
|
|
52
|
+
});
|
|
53
|
+
const selectedEmoji = value ? data.emojis[value] : null;
|
|
54
|
+
const [tonedEmoji, setTonedEmoji] = useState(null);
|
|
55
|
+
const [prevValue, setPrevValue] = useState(value);
|
|
56
|
+
if (prevValue !== value) {
|
|
57
|
+
setPrevValue(value);
|
|
58
|
+
if (tonedEmoji && tonedEmoji.id !== value) setTonedEmoji(null);
|
|
59
|
+
}
|
|
60
|
+
const displayedEmoji = tonedEmoji && tonedEmoji.id === value ? tonedEmoji.emoji : selectedEmoji?.emoji;
|
|
61
|
+
const handleEmojiSelect = useCallback((emoji) => {
|
|
62
|
+
setValue(emoji.id);
|
|
63
|
+
setTonedEmoji({
|
|
64
|
+
id: emoji.id,
|
|
65
|
+
emoji: emoji.emoji
|
|
66
|
+
});
|
|
67
|
+
onEmojiSelect?.(emoji);
|
|
68
|
+
if (closeOnSelect) setOpened(false);
|
|
69
|
+
}, [
|
|
70
|
+
setValue,
|
|
71
|
+
onEmojiSelect,
|
|
72
|
+
closeOnSelect,
|
|
73
|
+
setOpened
|
|
74
|
+
]);
|
|
75
|
+
const handleClear = () => {
|
|
76
|
+
setValue(null);
|
|
77
|
+
setTonedEmoji(null);
|
|
78
|
+
inputRef.current?.focus();
|
|
79
|
+
};
|
|
80
|
+
const handleInputClick = () => {
|
|
81
|
+
if (!readOnly && !disabled) setOpened(!opened);
|
|
82
|
+
};
|
|
83
|
+
const inputContent = selectedEmoji ? /* @__PURE__ */ jsxs("span", {
|
|
84
|
+
...getStyles("inputValue"),
|
|
85
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
86
|
+
...getStyles("inputEmoji"),
|
|
87
|
+
children: displayedEmoji
|
|
88
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
89
|
+
...getStyles("inputEmojiName"),
|
|
90
|
+
children: selectedEmoji.name
|
|
91
|
+
})]
|
|
92
|
+
}) : null;
|
|
93
|
+
const clearButton = clearable && selectedEmoji && !readOnly && !disabled ? /* @__PURE__ */ jsx(Input.ClearButton, {
|
|
94
|
+
"aria-label": "Clear emoji",
|
|
95
|
+
...clearButtonProps,
|
|
96
|
+
"data-clear": true,
|
|
97
|
+
onClick: (event) => {
|
|
98
|
+
event.stopPropagation();
|
|
99
|
+
handleClear();
|
|
100
|
+
clearButtonProps?.onClick?.(event);
|
|
101
|
+
}
|
|
102
|
+
}) : void 0;
|
|
103
|
+
const _id = useId$1(id);
|
|
104
|
+
const wrapperProps = {
|
|
105
|
+
label,
|
|
106
|
+
description,
|
|
107
|
+
error,
|
|
108
|
+
success,
|
|
109
|
+
required,
|
|
110
|
+
classNames: resolvedClassNames,
|
|
111
|
+
className,
|
|
112
|
+
__staticSelector: "EmojiPickerInput",
|
|
113
|
+
__stylesApiProps: props,
|
|
114
|
+
errorProps,
|
|
115
|
+
successProps,
|
|
116
|
+
labelProps,
|
|
117
|
+
descriptionProps,
|
|
118
|
+
unstyled,
|
|
119
|
+
styles: resolvedStyles,
|
|
120
|
+
size,
|
|
121
|
+
style,
|
|
122
|
+
inputContainer,
|
|
123
|
+
inputWrapperOrder,
|
|
124
|
+
withAsterisk,
|
|
125
|
+
variant,
|
|
126
|
+
mod,
|
|
127
|
+
attributes,
|
|
128
|
+
..._wrapperProps,
|
|
129
|
+
...styleProps,
|
|
130
|
+
id: _id
|
|
131
|
+
};
|
|
132
|
+
return /* @__PURE__ */ jsx(Input.Wrapper, {
|
|
133
|
+
...wrapperProps,
|
|
134
|
+
children: /* @__PURE__ */ jsxs(Popover, {
|
|
135
|
+
__staticSelector: "EmojiPickerInput",
|
|
136
|
+
position: "bottom-start",
|
|
137
|
+
offset: 5,
|
|
138
|
+
trapFocus: true,
|
|
139
|
+
returnFocus: true,
|
|
140
|
+
...popoverProps,
|
|
141
|
+
id: _id,
|
|
142
|
+
opened,
|
|
143
|
+
onChange: setOpened,
|
|
144
|
+
classNames: resolvedClassNames,
|
|
145
|
+
styles: resolvedStyles,
|
|
146
|
+
unstyled,
|
|
147
|
+
disabled: readOnly || disabled,
|
|
148
|
+
children: [/* @__PURE__ */ jsx(Popover.Target, { children: /* @__PURE__ */ jsx(Input, {
|
|
149
|
+
component: "button",
|
|
150
|
+
type: "button",
|
|
151
|
+
pointer: true,
|
|
152
|
+
...rest,
|
|
153
|
+
ref: mergedRef,
|
|
154
|
+
classNames: resolvedClassNames,
|
|
155
|
+
styles: resolvedStyles,
|
|
156
|
+
__staticSelector: "EmojiPickerInput",
|
|
157
|
+
onClick: handleInputClick,
|
|
158
|
+
rightSection: rightSection || clearButton,
|
|
159
|
+
disabled,
|
|
160
|
+
error,
|
|
161
|
+
success,
|
|
162
|
+
size,
|
|
163
|
+
variant,
|
|
164
|
+
unstyled,
|
|
165
|
+
id: _id,
|
|
166
|
+
attributes,
|
|
167
|
+
"aria-expanded": opened,
|
|
168
|
+
children: inputContent || /* @__PURE__ */ jsx(Input.Placeholder, { children: placeholder })
|
|
169
|
+
}) }), /* @__PURE__ */ jsx(Popover.Dropdown, {
|
|
170
|
+
...getStyles("dropdown"),
|
|
171
|
+
children: /* @__PURE__ */ jsx(EmojiPicker, {
|
|
172
|
+
...pickerProps,
|
|
173
|
+
skinTone,
|
|
174
|
+
onSkinToneChange: setSkinTone,
|
|
175
|
+
data,
|
|
176
|
+
onEmojiSelect: handleEmojiSelect,
|
|
177
|
+
autoFocus: true
|
|
178
|
+
})
|
|
179
|
+
})]
|
|
180
|
+
})
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
EmojiPickerInput.classes = {
|
|
184
|
+
...InputBase.classes,
|
|
185
|
+
...EmojiPickerInput_module_default
|
|
186
|
+
};
|
|
187
|
+
EmojiPickerInput.displayName = "@mantine/emoji/EmojiPickerInput";
|
|
188
|
+
export { EmojiPickerInput };
|
|
189
|
+
|
|
190
|
+
//# sourceMappingURL=EmojiPickerInput.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerInput.mjs","names":["useId","classes"],"sources":["../../../src/components/EmojiPickerInput/EmojiPickerInput.tsx"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport {\n BoxProps,\n createVarsResolver,\n ElementProps,\n extractStyleProps,\n factory,\n Factory,\n Input,\n InputVariant,\n Popover,\n PopoverProps,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n InputBase,\n InputClearButtonProps,\n __BaseInputProps,\n __InputStylesNames,\n} from '@mantine/core';\nimport { useId, useMergedRef, useUncontrolled } from '@mantine/hooks';\nimport type { EmojiPickerEmoji } from '../../types';\nimport { EmojiPicker, EmojiPickerProps } from '../EmojiPicker';\nimport classes from './EmojiPickerInput.module.css';\n\nexport type EmojiPickerInputStylesNames =\n | 'dropdown'\n | 'inputEmoji'\n | 'inputEmojiName'\n | 'inputValue'\n | __InputStylesNames;\n\nexport type EmojiPickerInputCssVariables = {\n root: never;\n};\n\nexport interface EmojiPickerInputProps\n extends\n BoxProps,\n __BaseInputProps,\n StylesApiProps<EmojiPickerInputFactory>,\n ElementProps<'button', 'size' | 'onChange' | 'value' | 'defaultValue'> {\n /** Controlled emoji id value */\n value?: string | null;\n\n /** Default emoji id value for uncontrolled state */\n defaultValue?: string | null;\n\n /** Called when value changes */\n onChange?: (value: string | null) => void;\n\n /** Input placeholder displayed when no emoji is selected */\n placeholder?: string;\n\n /** Determines whether the clear button is displayed @default false */\n clearable?: boolean;\n\n /** Props passed down to the clear button */\n clearButtonProps?: InputClearButtonProps;\n\n /** Props passed to the `Popover` component, use `opened`, `defaultOpened` and `onOpenedChange` props to control opened state */\n popoverProps?: Omit<PopoverProps, 'children' | 'opened' | 'defaultOpened' | 'onChange'>;\n\n /** Controlled popover opened state */\n opened?: boolean;\n\n /** Default popover opened state for uncontrolled mode */\n defaultOpened?: boolean;\n\n /** Called when popover opened state changes */\n onOpenedChange?: (opened: boolean) => void;\n\n /** Determines whether the popover closes after emoji is selected @default true */\n closeOnSelect?: boolean;\n\n /** Emoji data object, use `emojiMartAdapter` or `emojibaseAdapter` to convert data */\n data: EmojiPickerProps['data'];\n\n /** Called when an emoji is selected */\n onEmojiSelect?: EmojiPickerProps['onEmojiSelect'];\n\n /** Props passed to the `EmojiPicker` component inside the dropdown */\n pickerProps?: Omit<EmojiPickerProps, 'data' | 'onEmojiSelect'>;\n\n /** Determines whether the input is in read-only mode */\n readOnly?: boolean;\n\n /** Determines whether the input is disabled */\n disabled?: boolean;\n}\n\nexport type EmojiPickerInputFactory = Factory<{\n props: EmojiPickerInputProps;\n ref: HTMLButtonElement;\n stylesNames: EmojiPickerInputStylesNames;\n vars: EmojiPickerInputCssVariables;\n variant: InputVariant;\n}>;\n\nconst defaultProps = {\n closeOnSelect: true,\n clearable: false,\n size: 'sm',\n} satisfies Partial<EmojiPickerInputProps>;\n\nconst varsResolver = createVarsResolver<EmojiPickerInputFactory>(() => ({\n root: {},\n}));\n\nexport const EmojiPickerInput = factory<EmojiPickerInputFactory>((_props) => {\n const props = useProps('EmojiPickerInput', defaultProps, _props);\n const {\n classNames,\n styles,\n unstyled,\n vars,\n value: valueProp,\n defaultValue,\n onChange,\n placeholder,\n clearable,\n clearButtonProps,\n popoverProps,\n opened: openedProp,\n defaultOpened,\n onOpenedChange,\n closeOnSelect,\n data,\n onEmojiSelect,\n pickerProps,\n readOnly,\n disabled,\n label,\n description,\n error,\n success,\n required,\n className,\n style,\n id,\n size,\n variant,\n errorProps,\n successProps,\n labelProps,\n descriptionProps,\n wrapperProps: _wrapperProps,\n inputContainer,\n inputWrapperOrder,\n withAsterisk,\n mod,\n attributes,\n rightSection,\n ref,\n ...others\n } = props;\n\n const { styleProps, rest } = extractStyleProps(others);\n const inputRef = useRef<HTMLButtonElement>(null);\n const mergedRef = useMergedRef(inputRef, ref);\n\n const getStyles = useStyles<EmojiPickerInputFactory>({\n name: 'EmojiPickerInput',\n props,\n classes,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<EmojiPickerInputFactory>({\n classNames,\n styles,\n props,\n });\n\n const [value, setValue] = useUncontrolled({\n value: valueProp,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n\n const [opened, setOpened] = useUncontrolled({\n value: openedProp,\n defaultValue: defaultOpened,\n finalValue: false,\n onChange: onOpenedChange,\n });\n\n const [skinTone, setSkinTone] = useUncontrolled({\n value: pickerProps?.skinTone,\n defaultValue: pickerProps?.defaultSkinTone,\n finalValue: 0,\n onChange: pickerProps?.onSkinToneChange,\n });\n\n const selectedEmoji = value ? data.emojis[value] : null;\n const [tonedEmoji, setTonedEmoji] = useState<{ id: string; emoji: string } | null>(null);\n const [prevValue, setPrevValue] = useState(value);\n if (prevValue !== value) {\n setPrevValue(value);\n if (tonedEmoji && tonedEmoji.id !== value) {\n setTonedEmoji(null);\n }\n }\n const displayedEmoji =\n tonedEmoji && tonedEmoji.id === value ? tonedEmoji.emoji : selectedEmoji?.emoji;\n\n const handleEmojiSelect = useCallback(\n (emoji: EmojiPickerEmoji) => {\n setValue(emoji.id);\n setTonedEmoji({ id: emoji.id, emoji: emoji.emoji });\n onEmojiSelect?.(emoji);\n if (closeOnSelect) {\n setOpened(false);\n }\n },\n [setValue, onEmojiSelect, closeOnSelect, setOpened]\n );\n\n const handleClear = () => {\n setValue(null);\n setTonedEmoji(null);\n inputRef.current?.focus();\n };\n\n const handleInputClick = () => {\n if (!readOnly && !disabled) {\n setOpened(!opened);\n }\n };\n\n const inputContent = selectedEmoji ? (\n <span {...getStyles('inputValue')}>\n <span {...getStyles('inputEmoji')}>{displayedEmoji}</span>\n <span {...getStyles('inputEmojiName')}>{selectedEmoji.name}</span>\n </span>\n ) : null;\n\n const clearButton =\n clearable && selectedEmoji && !readOnly && !disabled ? (\n <Input.ClearButton\n aria-label=\"Clear emoji\"\n {...clearButtonProps}\n data-clear\n onClick={(event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n handleClear();\n clearButtonProps?.onClick?.(event);\n }}\n />\n ) : undefined;\n\n const _id = useId(id);\n\n const wrapperProps = {\n label,\n description,\n error,\n success,\n required,\n classNames: resolvedClassNames,\n className,\n __staticSelector: 'EmojiPickerInput',\n __stylesApiProps: props,\n errorProps,\n successProps,\n labelProps,\n descriptionProps,\n unstyled,\n styles: resolvedStyles,\n size,\n style,\n inputContainer,\n inputWrapperOrder,\n withAsterisk,\n variant,\n mod,\n attributes,\n ..._wrapperProps,\n ...styleProps,\n id: _id,\n };\n\n return (\n <Input.Wrapper {...wrapperProps}>\n <Popover\n __staticSelector=\"EmojiPickerInput\"\n position=\"bottom-start\"\n offset={5}\n trapFocus\n returnFocus\n {...popoverProps}\n id={_id}\n opened={opened}\n onChange={setOpened}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n disabled={readOnly || disabled}\n >\n <Popover.Target>\n <Input\n component=\"button\"\n type=\"button\"\n pointer\n {...rest}\n ref={mergedRef}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n __staticSelector=\"EmojiPickerInput\"\n onClick={handleInputClick}\n rightSection={rightSection || clearButton}\n disabled={disabled}\n error={error}\n success={success}\n size={size}\n variant={variant}\n unstyled={unstyled}\n id={_id}\n attributes={attributes}\n aria-expanded={opened}\n >\n {inputContent || <Input.Placeholder>{placeholder}</Input.Placeholder>}\n </Input>\n </Popover.Target>\n\n <Popover.Dropdown {...getStyles('dropdown')}>\n <EmojiPicker\n {...pickerProps}\n skinTone={skinTone}\n onSkinToneChange={setSkinTone}\n data={data}\n onEmojiSelect={handleEmojiSelect}\n autoFocus\n />\n </Popover.Dropdown>\n </Popover>\n </Input.Wrapper>\n );\n});\n\nEmojiPickerInput.classes = { ...InputBase.classes, ...classes };\nEmojiPickerInput.displayName = '@mantine/emoji/EmojiPickerInput';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// packages/@mantine/emoji/src/components/EmojiPickerInput/EmojiPickerInput.module.css
|
|
3
|
+
var EmojiPickerInput_module_default = {
|
|
4
|
+
"inputEmoji": "m_c78924f3",
|
|
5
|
+
"inputEmojiName": "m_e3dc621e",
|
|
6
|
+
"dropdown": "m_e8c48c28",
|
|
7
|
+
"inputValue": "m_c873361e"
|
|
8
|
+
};
|
|
9
|
+
export { EmojiPickerInput_module_default as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=EmojiPickerInput.module.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerInput.module.mjs","names":[],"sources":["../../../src/components/EmojiPickerInput/EmojiPickerInput.module.css"],"sourcesContent":[".inputEmoji {\n line-height: 1;\n flex-shrink: 0;\n}\n\n.inputEmojiName {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n.dropdown {\n padding: 0;\n border: none;\n background: none;\n}\n\n.inputValue {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-xs);\n overflow: hidden;\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { EmojiPicker } from "../EmojiPicker/EmojiPicker.mjs";
|
|
3
|
+
import EmojiPickerPopover_module_default from "./EmojiPickerPopover.module.mjs";
|
|
4
|
+
import { cloneElement, isValidElement, useCallback } from "react";
|
|
5
|
+
import { Popover, factory, useProps } from "@mantine/core";
|
|
6
|
+
import { useUncontrolled } from "@mantine/hooks";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
// packages/@mantine/emoji/src/components/EmojiPickerPopover/EmojiPickerPopover.tsx
|
|
9
|
+
const defaultProps = { closeOnSelect: true };
|
|
10
|
+
const EmojiPickerPopover = factory((_props) => {
|
|
11
|
+
const { popoverProps, opened: openedProp, defaultOpened, onOpenedChange, closeOnSelect, children, onEmojiSelect, skinTone: skinToneProp, defaultSkinTone, onSkinToneChange, ...pickerProps } = useProps("EmojiPickerPopover", defaultProps, _props);
|
|
12
|
+
const [opened, setOpened] = useUncontrolled({
|
|
13
|
+
value: openedProp,
|
|
14
|
+
defaultValue: defaultOpened,
|
|
15
|
+
finalValue: false,
|
|
16
|
+
onChange: onOpenedChange
|
|
17
|
+
});
|
|
18
|
+
const [skinTone, setSkinTone] = useUncontrolled({
|
|
19
|
+
value: skinToneProp,
|
|
20
|
+
defaultValue: defaultSkinTone,
|
|
21
|
+
finalValue: 0,
|
|
22
|
+
onChange: onSkinToneChange
|
|
23
|
+
});
|
|
24
|
+
const target = openedProp === void 0 && isValidElement(children) ? cloneElement(children, { onClick: (event) => {
|
|
25
|
+
setOpened(!opened);
|
|
26
|
+
children.props.onClick?.(event);
|
|
27
|
+
} }) : children;
|
|
28
|
+
const handleEmojiSelect = useCallback((emoji) => {
|
|
29
|
+
onEmojiSelect?.(emoji);
|
|
30
|
+
if (closeOnSelect) setOpened(false);
|
|
31
|
+
}, [
|
|
32
|
+
onEmojiSelect,
|
|
33
|
+
closeOnSelect,
|
|
34
|
+
setOpened
|
|
35
|
+
]);
|
|
36
|
+
return /* @__PURE__ */ jsxs(Popover, {
|
|
37
|
+
position: "bottom-start",
|
|
38
|
+
offset: 5,
|
|
39
|
+
trapFocus: true,
|
|
40
|
+
returnFocus: true,
|
|
41
|
+
...popoverProps,
|
|
42
|
+
opened,
|
|
43
|
+
onChange: setOpened,
|
|
44
|
+
children: [/* @__PURE__ */ jsx(Popover.Target, { children: target }), /* @__PURE__ */ jsx(Popover.Dropdown, {
|
|
45
|
+
className: EmojiPickerPopover_module_default.dropdown,
|
|
46
|
+
children: /* @__PURE__ */ jsx(EmojiPicker, {
|
|
47
|
+
...pickerProps,
|
|
48
|
+
skinTone,
|
|
49
|
+
onSkinToneChange: setSkinTone,
|
|
50
|
+
onEmojiSelect: handleEmojiSelect,
|
|
51
|
+
autoFocus: true
|
|
52
|
+
})
|
|
53
|
+
})]
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
EmojiPickerPopover.displayName = "@mantine/emoji/EmojiPickerPopover";
|
|
57
|
+
export { EmojiPickerPopover };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=EmojiPickerPopover.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerPopover.mjs","names":["classes"],"sources":["../../../src/components/EmojiPickerPopover/EmojiPickerPopover.tsx"],"sourcesContent":["import { cloneElement, isValidElement, useCallback } from 'react';\nimport { factory, Factory, Popover, PopoverProps, useProps } from '@mantine/core';\nimport { useUncontrolled } from '@mantine/hooks';\nimport type { EmojiPickerEmoji } from '../../types';\nimport { EmojiPicker, EmojiPickerProps } from '../EmojiPicker';\nimport classes from './EmojiPickerPopover.module.css';\n\nexport interface EmojiPickerPopoverProps extends EmojiPickerProps {\n /** Props passed to the `Popover` component, use `opened`, `defaultOpened` and `onOpenedChange` props to control opened state */\n popoverProps?: Omit<PopoverProps, 'children' | 'opened' | 'defaultOpened' | 'onChange'>;\n\n /** Controlled popover opened state */\n opened?: boolean;\n\n /** Default popover opened state for uncontrolled mode */\n defaultOpened?: boolean;\n\n /** Called when popover opened state changes */\n onOpenedChange?: (opened: boolean) => void;\n\n /** Determines whether the popover closes after emoji is selected @default true */\n closeOnSelect?: boolean;\n\n /** Popover target element */\n children: React.ReactNode;\n}\n\nexport type EmojiPickerPopoverFactory = Factory<{\n props: EmojiPickerPopoverProps;\n ref: HTMLDivElement;\n}>;\n\nconst defaultProps = {\n closeOnSelect: true,\n} satisfies Partial<EmojiPickerPopoverProps>;\n\nexport const EmojiPickerPopover = factory<EmojiPickerPopoverFactory>((_props) => {\n const props = useProps('EmojiPickerPopover', defaultProps, _props);\n const {\n popoverProps,\n opened: openedProp,\n defaultOpened,\n onOpenedChange,\n closeOnSelect,\n children,\n onEmojiSelect,\n skinTone: skinToneProp,\n defaultSkinTone,\n onSkinToneChange,\n ...pickerProps\n } = props;\n\n const [opened, setOpened] = useUncontrolled({\n value: openedProp,\n defaultValue: defaultOpened,\n finalValue: false,\n onChange: onOpenedChange,\n });\n\n const [skinTone, setSkinTone] = useUncontrolled({\n value: skinToneProp,\n defaultValue: defaultSkinTone,\n finalValue: 0,\n onChange: onSkinToneChange,\n });\n\n const isUncontrolled = openedProp === undefined;\n const target =\n isUncontrolled && isValidElement<{ onClick?: (event: React.MouseEvent) => void }>(children)\n ? cloneElement(children, {\n onClick: (event: React.MouseEvent) => {\n setOpened(!opened);\n children.props.onClick?.(event);\n },\n })\n : children;\n\n const handleEmojiSelect = useCallback(\n (emoji: EmojiPickerEmoji) => {\n onEmojiSelect?.(emoji);\n if (closeOnSelect) {\n setOpened(false);\n }\n },\n [onEmojiSelect, closeOnSelect, setOpened]\n );\n\n return (\n <Popover\n position=\"bottom-start\"\n offset={5}\n trapFocus\n returnFocus\n {...popoverProps}\n opened={opened}\n onChange={setOpened}\n >\n <Popover.Target>{target}</Popover.Target>\n <Popover.Dropdown className={classes.dropdown}>\n <EmojiPicker\n {...pickerProps}\n skinTone={skinTone}\n onSkinToneChange={setSkinTone}\n onEmojiSelect={handleEmojiSelect}\n autoFocus\n />\n </Popover.Dropdown>\n </Popover>\n );\n});\n\nEmojiPickerPopover.displayName = '@mantine/emoji/EmojiPickerPopover';\n"],"mappings":";;;;;;;;AAgCA,MAAM,eAAe,EACnB,eAAe,KACjB;AAEA,MAAa,qBAAqB,SAAoC,WAAW;CAE/E,MAAM,EACJ,cACA,QAAQ,YACR,eACA,gBACA,eACA,UACA,eACA,UAAU,cACV,iBACA,kBACA,GAAG,gBAZS,SAAS,sBAAsB,cAAc,MAanD;CAER,MAAM,CAAC,QAAQ,aAAa,gBAAgB;EAC1C,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;CACZ,CAAC;CAED,MAAM,CAAC,UAAU,eAAe,gBAAgB;EAC9C,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;CACZ,CAAC;CAGD,MAAM,SADiB,eAAe,KAAA,KAElB,eAAgE,QAAQ,IACtF,aAAa,UAAU,EACrB,UAAU,UAA4B;EACpC,UAAU,CAAC,MAAM;EACjB,SAAS,MAAM,UAAU,KAAK;CAChC,EACF,CAAC,IACD;CAEN,MAAM,oBAAoB,aACvB,UAA4B;EAC3B,gBAAgB,KAAK;EACrB,IAAI,eACF,UAAU,KAAK;CAEnB,GACA;EAAC;EAAe;EAAe;CAAS,CAC1C;CAEA,OACE,qBAAC,SAAD;EACE,UAAS;EACT,QAAQ;EACR,WAAA;EACA,aAAA;EACA,GAAI;EACI;EACR,UAAU;EAPZ,UAAA,CASE,oBAAC,QAAQ,QAAT,EAAA,UAAiB,OAAuB,CAAA,GACxC,oBAAC,QAAQ,UAAT;GAAkB,WAAWA,kCAAQ;GACnC,UAAA,oBAAC,aAAD;IACE,GAAI;IACM;IACV,kBAAkB;IAClB,eAAe;IACf,WAAA;GACD,CAAA;EACe,CAAA,CACX;;AAEb,CAAC;AAED,mBAAmB,cAAc"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// packages/@mantine/emoji/src/components/EmojiPickerPopover/EmojiPickerPopover.module.css
|
|
3
|
+
var EmojiPickerPopover_module_default = { "dropdown": "m_c47f7ead" };
|
|
4
|
+
export { EmojiPickerPopover_module_default as default };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=EmojiPickerPopover.module.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerPopover.module.mjs","names":[],"sources":["../../../src/components/EmojiPickerPopover/EmojiPickerPopover.module.css"],"sourcesContent":[".dropdown {\n padding: 0;\n border: none;\n background: none;\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { applySkinTone, createEmojiGridModel, getEmojiItemIndex, getNextEmojiIndex } from "../utils/emoji-grid-utils.mjs";
|
|
3
|
+
import { useCallback, useMemo, useState } from "react";
|
|
4
|
+
// packages/@mantine/emoji/src/hooks/use-emoji-grid-navigation.ts
|
|
5
|
+
const INITIAL_STATE = {
|
|
6
|
+
index: 0,
|
|
7
|
+
source: "anchor"
|
|
8
|
+
};
|
|
9
|
+
const KEY_DIRECTIONS = {
|
|
10
|
+
ArrowLeft: "left",
|
|
11
|
+
ArrowRight: "right",
|
|
12
|
+
ArrowUp: "up",
|
|
13
|
+
ArrowDown: "down"
|
|
14
|
+
};
|
|
15
|
+
function useEmojiGridNavigation({ items, resetKey, skinTone, onEmojiSelect, scrollToItem }) {
|
|
16
|
+
const model = useMemo(() => createEmojiGridModel(items), [items]);
|
|
17
|
+
const [state, setState] = useState(INITIAL_STATE);
|
|
18
|
+
const [prevResetKey, setPrevResetKey] = useState(resetKey);
|
|
19
|
+
if (prevResetKey !== resetKey) {
|
|
20
|
+
setPrevResetKey(resetKey);
|
|
21
|
+
setState(INITIAL_STATE);
|
|
22
|
+
}
|
|
23
|
+
const isCurrent = state.index < model.emojis.length;
|
|
24
|
+
const source = isCurrent ? state.source : "anchor";
|
|
25
|
+
const activeIndex = model.emojis.length === 0 ? -1 : isCurrent ? state.index : 0;
|
|
26
|
+
const keyboardActive = source === "keyboard" && activeIndex !== -1;
|
|
27
|
+
const setActive = useCallback((index, nextSource) => {
|
|
28
|
+
setState((prev) => prev.index === index && prev.source === nextSource ? prev : {
|
|
29
|
+
index,
|
|
30
|
+
source: nextSource
|
|
31
|
+
});
|
|
32
|
+
}, []);
|
|
33
|
+
const setPointerIndex = useCallback((index) => setActive(index, "pointer"), [setActive]);
|
|
34
|
+
const setAnchorIndex = useCallback((index) => setActive(index, "anchor"), [setActive]);
|
|
35
|
+
const handleKeyDown = useCallback((event) => {
|
|
36
|
+
if (activeIndex === -1) return;
|
|
37
|
+
const direction = KEY_DIRECTIONS[event.key];
|
|
38
|
+
if (direction) {
|
|
39
|
+
event.preventDefault();
|
|
40
|
+
const nextIndex = source === "anchor" ? activeIndex : getNextEmojiIndex(model, activeIndex, direction);
|
|
41
|
+
setActive(nextIndex, "keyboard");
|
|
42
|
+
scrollToItem?.(getEmojiItemIndex(model, nextIndex));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
onEmojiSelect(applySkinTone(model.emojis[activeIndex], skinTone));
|
|
48
|
+
}
|
|
49
|
+
}, [
|
|
50
|
+
activeIndex,
|
|
51
|
+
source,
|
|
52
|
+
model,
|
|
53
|
+
setActive,
|
|
54
|
+
scrollToItem,
|
|
55
|
+
onEmojiSelect,
|
|
56
|
+
skinTone
|
|
57
|
+
]);
|
|
58
|
+
return {
|
|
59
|
+
model,
|
|
60
|
+
activeIndex,
|
|
61
|
+
activeEmoji: activeIndex === -1 ? null : model.emojis[activeIndex],
|
|
62
|
+
keyboardActive,
|
|
63
|
+
handleKeyDown,
|
|
64
|
+
setPointerIndex,
|
|
65
|
+
setAnchorIndex
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export { useEmojiGridNavigation };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=use-emoji-grid-navigation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-emoji-grid-navigation.mjs","names":[],"sources":["../../src/hooks/use-emoji-grid-navigation.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport type { EmojiPickerEmoji, FlattenedRowItem } from '../types';\nimport {\n applySkinTone,\n createEmojiGridModel,\n EmojiGridDirection,\n getEmojiItemIndex,\n getNextEmojiIndex,\n} from '../utils';\n\ntype ActiveEmojiSource = 'anchor' | 'pointer' | 'keyboard';\n\ninterface ActiveEmojiState {\n index: number;\n source: ActiveEmojiSource;\n}\n\ninterface UseEmojiGridNavigationInput {\n items: FlattenedRowItem[];\n resetKey: string;\n skinTone: number;\n onEmojiSelect: (emoji: EmojiPickerEmoji) => void;\n scrollToItem?: (itemIndex: number) => void;\n}\n\nconst INITIAL_STATE: ActiveEmojiState = { index: 0, source: 'anchor' };\n\nconst KEY_DIRECTIONS: Record<string, EmojiGridDirection> = {\n ArrowLeft: 'left',\n ArrowRight: 'right',\n ArrowUp: 'up',\n ArrowDown: 'down',\n};\n\nexport function useEmojiGridNavigation({\n items,\n resetKey,\n skinTone,\n onEmojiSelect,\n scrollToItem,\n}: UseEmojiGridNavigationInput) {\n const model = useMemo(() => createEmojiGridModel(items), [items]);\n const [state, setState] = useState<ActiveEmojiState>(INITIAL_STATE);\n const [prevResetKey, setPrevResetKey] = useState(resetKey);\n\n if (prevResetKey !== resetKey) {\n setPrevResetKey(resetKey);\n setState(INITIAL_STATE);\n }\n\n const isCurrent = state.index < model.emojis.length;\n const source: ActiveEmojiSource = isCurrent ? state.source : 'anchor';\n const activeIndex = model.emojis.length === 0 ? -1 : isCurrent ? state.index : 0;\n const keyboardActive = source === 'keyboard' && activeIndex !== -1;\n\n const setActive = useCallback((index: number, nextSource: ActiveEmojiSource) => {\n setState((prev) =>\n prev.index === index && prev.source === nextSource ? prev : { index, source: nextSource }\n );\n }, []);\n\n const setPointerIndex = useCallback((index: number) => setActive(index, 'pointer'), [setActive]);\n const setAnchorIndex = useCallback((index: number) => setActive(index, 'anchor'), [setActive]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (activeIndex === -1) {\n return;\n }\n\n const direction = KEY_DIRECTIONS[event.key];\n if (direction) {\n event.preventDefault();\n const nextIndex =\n source === 'anchor' ? activeIndex : getNextEmojiIndex(model, activeIndex, direction);\n setActive(nextIndex, 'keyboard');\n scrollToItem?.(getEmojiItemIndex(model, nextIndex));\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onEmojiSelect(applySkinTone(model.emojis[activeIndex], skinTone));\n }\n },\n [activeIndex, source, model, setActive, scrollToItem, onEmojiSelect, skinTone]\n );\n\n return {\n model,\n activeIndex,\n activeEmoji: activeIndex === -1 ? null : model.emojis[activeIndex],\n keyboardActive,\n handleKeyDown,\n setPointerIndex,\n setAnchorIndex,\n };\n}\n"],"mappings":";;;;AAyBA,MAAM,gBAAkC;CAAE,OAAO;CAAG,QAAQ;AAAS;AAErE,MAAM,iBAAqD;CACzD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,WAAW;AACb;AAEA,SAAgB,uBAAuB,EACrC,OACA,UACA,UACA,eACA,gBAC8B;CAC9B,MAAM,QAAQ,cAAc,qBAAqB,KAAK,GAAG,CAAC,KAAK,CAAC;CAChE,MAAM,CAAC,OAAO,YAAY,SAA2B,aAAa;CAClE,MAAM,CAAC,cAAc,mBAAmB,SAAS,QAAQ;CAEzD,IAAI,iBAAiB,UAAU;EAC7B,gBAAgB,QAAQ;EACxB,SAAS,aAAa;CACxB;CAEA,MAAM,YAAY,MAAM,QAAQ,MAAM,OAAO;CAC7C,MAAM,SAA4B,YAAY,MAAM,SAAS;CAC7D,MAAM,cAAc,MAAM,OAAO,WAAW,IAAI,KAAK,YAAY,MAAM,QAAQ;CAC/E,MAAM,iBAAiB,WAAW,cAAc,gBAAgB;CAEhE,MAAM,YAAY,aAAa,OAAe,eAAkC;EAC9E,UAAU,SACR,KAAK,UAAU,SAAS,KAAK,WAAW,aAAa,OAAO;GAAE;GAAO,QAAQ;EAAW,CAC1F;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAkB,aAAa,UAAkB,UAAU,OAAO,SAAS,GAAG,CAAC,SAAS,CAAC;CAC/F,MAAM,iBAAiB,aAAa,UAAkB,UAAU,OAAO,QAAQ,GAAG,CAAC,SAAS,CAAC;CAE7F,MAAM,gBAAgB,aACnB,UAA+B;EAC9B,IAAI,gBAAgB,IAClB;EAGF,MAAM,YAAY,eAAe,MAAM;EACvC,IAAI,WAAW;GACb,MAAM,eAAe;GACrB,MAAM,YACJ,WAAW,WAAW,cAAc,kBAAkB,OAAO,aAAa,SAAS;GACrF,UAAU,WAAW,UAAU;GAC/B,eAAe,kBAAkB,OAAO,SAAS,CAAC;GAClD;EACF;EAEA,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;GAC9C,MAAM,eAAe;GACrB,cAAc,cAAc,MAAM,OAAO,cAAc,QAAQ,CAAC;EAClE;CACF,GACA;EAAC;EAAa;EAAQ;EAAO;EAAW;EAAc;EAAe;CAAQ,CAC/E;CAEA,OAAO;EACL;EACA;EACA,aAAa,gBAAgB,KAAK,OAAO,MAAM,OAAO;EACtD;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { searchEmojis } from "../utils/search-emojis.mjs";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { useUncontrolled } from "@mantine/hooks";
|
|
5
|
+
// packages/@mantine/emoji/src/hooks/use-emoji-search.ts
|
|
6
|
+
function useEmojiSearch({ data, searchValue, onSearchChange }) {
|
|
7
|
+
const [query, setQuery] = useUncontrolled({
|
|
8
|
+
value: searchValue,
|
|
9
|
+
defaultValue: "",
|
|
10
|
+
onChange: onSearchChange
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
query,
|
|
14
|
+
setQuery,
|
|
15
|
+
results: useMemo(() => searchEmojis(data, query), [data, query]),
|
|
16
|
+
isSearching: query.trim().length > 0
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export { useEmojiSearch };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=use-emoji-search.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-emoji-search.mjs","names":[],"sources":["../../src/hooks/use-emoji-search.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useUncontrolled } from '@mantine/hooks';\nimport type { EmojiPickerData, EmojiPickerEmoji } from '../types';\nimport { searchEmojis } from '../utils';\n\ninterface UseEmojiSearchInput {\n data: EmojiPickerData;\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n}\n\ninterface UseEmojiSearchResult {\n query: string;\n setQuery: (value: string) => void;\n results: EmojiPickerEmoji[];\n isSearching: boolean;\n}\n\nexport function useEmojiSearch({\n data,\n searchValue,\n onSearchChange,\n}: UseEmojiSearchInput): UseEmojiSearchResult {\n const [query, setQuery] = useUncontrolled({\n value: searchValue,\n defaultValue: '',\n onChange: onSearchChange,\n });\n\n const results = useMemo(() => searchEmojis(data, query), [data, query]);\n const isSearching = query.trim().length > 0;\n\n return { query, setQuery, results, isSearching };\n}\n"],"mappings":";;;;;AAkBA,SAAgB,eAAe,EAC7B,MACA,aACA,kBAC4C;CAC5C,MAAM,CAAC,OAAO,YAAY,gBAAgB;EACxC,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CAKD,OAAO;EAAE;EAAO;EAAU,SAHV,cAAc,aAAa,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAGrC;EAAG,aAFf,MAAM,KAAK,CAAC,CAAC,SAAS;CAEK;AACjD"}
|
package/esm/index.mjs
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DEFAULT_LABELS } from "./types.mjs";
|
|
2
|
+
import { CANONICAL_CATEGORY_IDS } from "./categories.mjs";
|
|
3
|
+
import { searchEmojis } from "./utils/search-emojis.mjs";
|
|
4
|
+
import { flattenEmojiData } from "./utils/flatten-emoji-data.mjs";
|
|
5
|
+
import { filterSupportedEmojis, isEmojiSupported } from "./utils/is-emoji-supported.mjs";
|
|
6
|
+
import { emojiMartAdapter } from "./adapters/emoji-mart-adapter.mjs";
|
|
7
|
+
import { emojibaseAdapter } from "./adapters/emojibase-adapter.mjs";
|
|
8
|
+
import { EmojiPicker } from "./components/EmojiPicker/EmojiPicker.mjs";
|
|
9
|
+
import { EmojiPickerPopover } from "./components/EmojiPickerPopover/EmojiPickerPopover.mjs";
|
|
10
|
+
import { EmojiPickerInput } from "./components/EmojiPickerInput/EmojiPickerInput.mjs";
|
|
11
|
+
export { CANONICAL_CATEGORY_IDS, DEFAULT_LABELS, EmojiPicker, EmojiPickerInput, EmojiPickerPopover, emojiMartAdapter, emojibaseAdapter, filterSupportedEmojis, flattenEmojiData, isEmojiSupported, searchEmojis };
|
package/esm/types.mjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// packages/@mantine/emoji/src/types.ts
|
|
3
|
+
const DEFAULT_LABELS = {
|
|
4
|
+
search: "Search emojis",
|
|
5
|
+
skinTone: "Skin tone",
|
|
6
|
+
noResults: "No emojis found",
|
|
7
|
+
skinToneLight: "Light skin tone",
|
|
8
|
+
skinToneMediumLight: "Medium-light skin tone",
|
|
9
|
+
skinToneMedium: "Medium skin tone",
|
|
10
|
+
skinToneMediumDark: "Medium-dark skin tone",
|
|
11
|
+
skinToneDark: "Dark skin tone",
|
|
12
|
+
skinToneDefault: "Default skin tone",
|
|
13
|
+
searchResults: "Search Results",
|
|
14
|
+
preview: "Emoji preview",
|
|
15
|
+
clearSearch: "Clear search",
|
|
16
|
+
emojis: "Emojis"
|
|
17
|
+
};
|
|
18
|
+
export { DEFAULT_LABELS };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["export interface EmojiPickerEmoji {\n id: string;\n name: string;\n keywords: string[];\n emoji: string;\n skins?: string[];\n version?: number;\n}\n\nexport interface EmojiPickerCategory {\n id: string;\n label: string;\n emojis: string[];\n}\n\nexport interface EmojiPickerData {\n categories: EmojiPickerCategory[];\n emojis: Record<string, EmojiPickerEmoji>;\n}\n\nexport interface EmojiPickerLabels {\n search?: string;\n skinTone?: string;\n noResults?: string;\n skinToneLight?: string;\n skinToneMediumLight?: string;\n skinToneMedium?: string;\n skinToneMediumDark?: string;\n skinToneDark?: string;\n skinToneDefault?: string;\n searchResults?: string;\n preview?: string;\n clearSearch?: string;\n emojis?: string;\n}\n\nexport const DEFAULT_LABELS: Required<EmojiPickerLabels> = {\n search: 'Search emojis',\n skinTone: 'Skin tone',\n noResults: 'No emojis found',\n skinToneLight: 'Light skin tone',\n skinToneMediumLight: 'Medium-light skin tone',\n skinToneMedium: 'Medium skin tone',\n skinToneMediumDark: 'Medium-dark skin tone',\n skinToneDark: 'Dark skin tone',\n skinToneDefault: 'Default skin tone',\n searchResults: 'Search Results',\n preview: 'Emoji preview',\n clearSearch: 'Clear search',\n emojis: 'Emojis',\n};\n\nexport type FlattenedRowItem =\n | { type: 'header'; categoryId: string; label: string }\n | { type: 'row'; emojis: EmojiPickerEmoji[] };\n"],"mappings":";;AAoCA,MAAa,iBAA8C;CACzD,QAAQ;CACR,UAAU;CACV,WAAW;CACX,eAAe;CACf,qBAAqB;CACrB,gBAAgB;CAChB,oBAAoB;CACpB,cAAc;CACd,iBAAiB;CACjB,eAAe;CACf,SAAS;CACT,aAAa;CACb,QAAQ;AACV"}
|