@mantine/emoji 0.0.0-stage → 9.8.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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -2
  3. package/cjs/adapters/emoji-mart-adapter.cjs +30 -0
  4. package/cjs/adapters/emoji-mart-adapter.cjs.map +1 -0
  5. package/cjs/adapters/emojibase-adapter.cjs +76 -0
  6. package/cjs/adapters/emojibase-adapter.cjs.map +1 -0
  7. package/cjs/categories.cjs +52 -0
  8. package/cjs/categories.cjs.map +1 -0
  9. package/cjs/components/EmojiPicker/EmojiButton.cjs +24 -0
  10. package/cjs/components/EmojiPicker/EmojiButton.cjs.map +1 -0
  11. package/cjs/components/EmojiPicker/EmojiPicker.cjs +289 -0
  12. package/cjs/components/EmojiPicker/EmojiPicker.cjs.map +1 -0
  13. package/cjs/components/EmojiPicker/EmojiPicker.context.cjs +7 -0
  14. package/cjs/components/EmojiPicker/EmojiPicker.context.cjs.map +1 -0
  15. package/cjs/components/EmojiPicker/EmojiPicker.module.cjs +22 -0
  16. package/cjs/components/EmojiPicker/EmojiPicker.module.cjs.map +1 -0
  17. package/cjs/components/EmojiPicker/EmojiPickerCategoryNav.cjs +38 -0
  18. package/cjs/components/EmojiPicker/EmojiPickerCategoryNav.cjs.map +1 -0
  19. package/cjs/components/EmojiPicker/EmojiPickerGrid.cjs +131 -0
  20. package/cjs/components/EmojiPicker/EmojiPickerGrid.cjs.map +1 -0
  21. package/cjs/components/EmojiPicker/EmojiPickerPreview.cjs +24 -0
  22. package/cjs/components/EmojiPicker/EmojiPickerPreview.cjs.map +1 -0
  23. package/cjs/components/EmojiPicker/EmojiPickerSearch.cjs +57 -0
  24. package/cjs/components/EmojiPicker/EmojiPickerSearch.cjs.map +1 -0
  25. package/cjs/components/EmojiPicker/EmojiPickerSkinTone.cjs +63 -0
  26. package/cjs/components/EmojiPicker/EmojiPickerSkinTone.cjs.map +1 -0
  27. package/cjs/components/EmojiPickerInput/EmojiPickerInput.cjs +190 -0
  28. package/cjs/components/EmojiPickerInput/EmojiPickerInput.cjs.map +1 -0
  29. package/cjs/components/EmojiPickerInput/EmojiPickerInput.module.cjs +11 -0
  30. package/cjs/components/EmojiPickerInput/EmojiPickerInput.module.cjs.map +1 -0
  31. package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.cjs +59 -0
  32. package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.cjs.map +1 -0
  33. package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.module.cjs +6 -0
  34. package/cjs/components/EmojiPickerPopover/EmojiPickerPopover.module.cjs.map +1 -0
  35. package/cjs/hooks/use-emoji-grid-navigation.cjs +70 -0
  36. package/cjs/hooks/use-emoji-grid-navigation.cjs.map +1 -0
  37. package/cjs/hooks/use-emoji-search.cjs +21 -0
  38. package/cjs/hooks/use-emoji-search.cjs.map +1 -0
  39. package/cjs/index.cjs +22 -0
  40. package/cjs/types.cjs +20 -0
  41. package/cjs/types.cjs.map +1 -0
  42. package/cjs/utils/emoji-grid-utils.cjs +57 -0
  43. package/cjs/utils/emoji-grid-utils.cjs.map +1 -0
  44. package/cjs/utils/flatten-emoji-data.cjs +33 -0
  45. package/cjs/utils/flatten-emoji-data.cjs.map +1 -0
  46. package/cjs/utils/is-emoji-supported.cjs +64 -0
  47. package/cjs/utils/is-emoji-supported.cjs.map +1 -0
  48. package/cjs/utils/search-emojis.cjs +21 -0
  49. package/cjs/utils/search-emojis.cjs.map +1 -0
  50. package/esm/adapters/emoji-mart-adapter.mjs +30 -0
  51. package/esm/adapters/emoji-mart-adapter.mjs.map +1 -0
  52. package/esm/adapters/emojibase-adapter.mjs +76 -0
  53. package/esm/adapters/emojibase-adapter.mjs.map +1 -0
  54. package/esm/categories.mjs +47 -0
  55. package/esm/categories.mjs.map +1 -0
  56. package/esm/components/EmojiPicker/EmojiButton.mjs +24 -0
  57. package/esm/components/EmojiPicker/EmojiButton.mjs.map +1 -0
  58. package/esm/components/EmojiPicker/EmojiPicker.context.mjs +7 -0
  59. package/esm/components/EmojiPicker/EmojiPicker.context.mjs.map +1 -0
  60. package/esm/components/EmojiPicker/EmojiPicker.mjs +289 -0
  61. package/esm/components/EmojiPicker/EmojiPicker.mjs.map +1 -0
  62. package/esm/components/EmojiPicker/EmojiPicker.module.mjs +22 -0
  63. package/esm/components/EmojiPicker/EmojiPicker.module.mjs.map +1 -0
  64. package/esm/components/EmojiPicker/EmojiPickerCategoryNav.mjs +38 -0
  65. package/esm/components/EmojiPicker/EmojiPickerCategoryNav.mjs.map +1 -0
  66. package/esm/components/EmojiPicker/EmojiPickerGrid.mjs +131 -0
  67. package/esm/components/EmojiPicker/EmojiPickerGrid.mjs.map +1 -0
  68. package/esm/components/EmojiPicker/EmojiPickerPreview.mjs +24 -0
  69. package/esm/components/EmojiPicker/EmojiPickerPreview.mjs.map +1 -0
  70. package/esm/components/EmojiPicker/EmojiPickerSearch.mjs +57 -0
  71. package/esm/components/EmojiPicker/EmojiPickerSearch.mjs.map +1 -0
  72. package/esm/components/EmojiPicker/EmojiPickerSkinTone.mjs +63 -0
  73. package/esm/components/EmojiPicker/EmojiPickerSkinTone.mjs.map +1 -0
  74. package/esm/components/EmojiPickerInput/EmojiPickerInput.mjs +190 -0
  75. package/esm/components/EmojiPickerInput/EmojiPickerInput.mjs.map +1 -0
  76. package/esm/components/EmojiPickerInput/EmojiPickerInput.module.mjs +11 -0
  77. package/esm/components/EmojiPickerInput/EmojiPickerInput.module.mjs.map +1 -0
  78. package/esm/components/EmojiPickerPopover/EmojiPickerPopover.mjs +59 -0
  79. package/esm/components/EmojiPickerPopover/EmojiPickerPopover.mjs.map +1 -0
  80. package/esm/components/EmojiPickerPopover/EmojiPickerPopover.module.mjs +6 -0
  81. package/esm/components/EmojiPickerPopover/EmojiPickerPopover.module.mjs.map +1 -0
  82. package/esm/hooks/use-emoji-grid-navigation.mjs +70 -0
  83. package/esm/hooks/use-emoji-grid-navigation.mjs.map +1 -0
  84. package/esm/hooks/use-emoji-search.mjs +21 -0
  85. package/esm/hooks/use-emoji-search.mjs.map +1 -0
  86. package/esm/index.mjs +11 -0
  87. package/esm/types.mjs +20 -0
  88. package/esm/types.mjs.map +1 -0
  89. package/esm/utils/emoji-grid-utils.mjs +54 -0
  90. package/esm/utils/emoji-grid-utils.mjs.map +1 -0
  91. package/esm/utils/flatten-emoji-data.mjs +33 -0
  92. package/esm/utils/flatten-emoji-data.mjs.map +1 -0
  93. package/esm/utils/is-emoji-supported.mjs +63 -0
  94. package/esm/utils/is-emoji-supported.mjs.map +1 -0
  95. package/esm/utils/search-emojis.mjs +21 -0
  96. package/esm/utils/search-emojis.mjs.map +1 -0
  97. package/lib/adapters/emoji-mart-adapter.d.ts +23 -0
  98. package/lib/adapters/emojibase-adapter.d.ts +25 -0
  99. package/lib/adapters/index.d.ts +2 -0
  100. package/lib/categories.d.ts +7 -0
  101. package/lib/components/EmojiPicker/EmojiButton.d.ts +10 -0
  102. package/lib/components/EmojiPicker/EmojiPicker.context.d.ts +9 -0
  103. package/lib/components/EmojiPicker/EmojiPicker.d.ts +64 -0
  104. package/lib/components/EmojiPicker/EmojiPickerCategoryNav.d.ts +10 -0
  105. package/lib/components/EmojiPicker/EmojiPickerGrid.d.ts +23 -0
  106. package/lib/components/EmojiPicker/EmojiPickerPreview.d.ts +9 -0
  107. package/lib/components/EmojiPicker/EmojiPickerSearch.d.ts +14 -0
  108. package/lib/components/EmojiPicker/EmojiPickerSkinTone.d.ts +6 -0
  109. package/lib/components/EmojiPicker/index.d.ts +2 -0
  110. package/lib/components/EmojiPickerInput/EmojiPickerInput.d.ts +54 -0
  111. package/lib/components/EmojiPickerInput/index.d.ts +2 -0
  112. package/lib/components/EmojiPickerPopover/EmojiPickerPopover.d.ts +24 -0
  113. package/lib/components/EmojiPickerPopover/index.d.ts +2 -0
  114. package/lib/hooks/index.d.ts +2 -0
  115. package/lib/hooks/use-emoji-grid-navigation.d.ts +18 -0
  116. package/lib/hooks/use-emoji-search.d.ts +14 -0
  117. package/lib/index.d.mts +10 -0
  118. package/lib/index.d.ts +10 -0
  119. package/lib/types.d.ts +41 -0
  120. package/lib/utils/emoji-grid-utils.d.ts +17 -0
  121. package/lib/utils/flatten-emoji-data.d.ts +2 -0
  122. package/lib/utils/index.d.ts +5 -0
  123. package/lib/utils/is-emoji-supported.d.ts +4 -0
  124. package/lib/utils/search-emojis.d.ts +2 -0
  125. package/package.json +54 -4
  126. package/styles.css +228 -0
  127. 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"}