@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.
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,59 @@
1
+ "use client";
2
+ const require_EmojiPicker = require("../EmojiPicker/EmojiPicker.cjs");
3
+ const require_EmojiPickerPopover_module = require("./EmojiPickerPopover.module.cjs");
4
+ let react = require("react");
5
+ let _mantine_core = require("@mantine/core");
6
+ let _mantine_hooks = require("@mantine/hooks");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ // packages/@mantine/emoji/src/components/EmojiPickerPopover/EmojiPickerPopover.tsx
9
+ const defaultProps = { closeOnSelect: true };
10
+ const EmojiPickerPopover = (0, _mantine_core.factory)((_props) => {
11
+ const { popoverProps, opened: openedProp, defaultOpened, onOpenedChange, closeOnSelect, children, onEmojiSelect, skinTone: skinToneProp, defaultSkinTone, onSkinToneChange, ...pickerProps } = (0, _mantine_core.useProps)("EmojiPickerPopover", defaultProps, _props);
12
+ const [opened, setOpened] = (0, _mantine_hooks.useUncontrolled)({
13
+ value: openedProp,
14
+ defaultValue: defaultOpened,
15
+ finalValue: false,
16
+ onChange: onOpenedChange
17
+ });
18
+ const [skinTone, setSkinTone] = (0, _mantine_hooks.useUncontrolled)({
19
+ value: skinToneProp,
20
+ defaultValue: defaultSkinTone,
21
+ finalValue: 0,
22
+ onChange: onSkinToneChange
23
+ });
24
+ const target = openedProp === void 0 && (0, react.isValidElement)(children) ? (0, react.cloneElement)(children, { onClick: (event) => {
25
+ setOpened(!opened);
26
+ children.props.onClick?.(event);
27
+ } }) : children;
28
+ const handleEmojiSelect = (0, react.useCallback)((emoji) => {
29
+ onEmojiSelect?.(emoji);
30
+ if (closeOnSelect) setOpened(false);
31
+ }, [
32
+ onEmojiSelect,
33
+ closeOnSelect,
34
+ setOpened
35
+ ]);
36
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mantine_core.Popover, {
37
+ position: "bottom-start",
38
+ offset: 5,
39
+ trapFocus: true,
40
+ returnFocus: true,
41
+ ...popoverProps,
42
+ opened,
43
+ onChange: setOpened,
44
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Popover.Target, { children: target }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Popover.Dropdown, {
45
+ className: require_EmojiPickerPopover_module.default.dropdown,
46
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_EmojiPicker.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
+ exports.EmojiPickerPopover = EmojiPickerPopover;
58
+
59
+ //# sourceMappingURL=EmojiPickerPopover.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerPopover.cjs","names":["factory","useProps","useUncontrolled","isValidElement","cloneElement","useCallback","Popover","classes","EmojiPicker"],"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,sBAAA,GAAqBA,cAAAA,QAAAA,EAAoC,WAAW;CAE/E,MAAM,EACJ,cACA,QAAQ,YACR,eACA,gBACA,eACA,UACA,eACA,UAAU,cACV,iBACA,kBACA,GAAG,iBAAA,GAZSC,cAAAA,SAAAA,CAAS,sBAAsB,cAAc,MAanD;CAER,MAAM,CAAC,QAAQ,cAAA,GAAaC,eAAAA,gBAAAA,CAAgB;EAC1C,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;CACZ,CAAC;CAED,MAAM,CAAC,UAAU,gBAAA,GAAeA,eAAAA,gBAAAA,CAAgB;EAC9C,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;CACZ,CAAC;CAGD,MAAM,SADiB,eAAe,KAAA,MAAA,GAElBC,MAAAA,eAAAA,CAAgE,QAAQ,KAAA,GACtFC,MAAAA,aAAAA,CAAa,UAAU,EACrB,UAAU,UAA4B;EACpC,UAAU,CAAC,MAAM;EACjB,SAAS,MAAM,UAAU,KAAK;CAChC,EACF,CAAC,IACD;CAEN,MAAM,qBAAA,GAAoBC,MAAAA,YAAAA,EACvB,UAA4B;EAC3B,gBAAgB,KAAK;EACrB,IAAI,eACF,UAAU,KAAK;CAEnB,GACA;EAAC;EAAe;EAAe;CAAS,CAC1C;CAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,cAAAA,SAAD;EACE,UAAS;EACT,QAAQ;EACR,WAAA;EACA,aAAA;EACA,GAAI;EACI;EACR,UAAU;EAPZ,UAAA,CASE,iBAAA,GAAA,kBAAA,IAAA,CAACA,cAAAA,QAAQ,QAAT,EAAA,UAAiB,OAAuB,CAAA,GACxC,iBAAA,GAAA,kBAAA,IAAA,CAACA,cAAAA,QAAQ,UAAT;GAAkB,WAAWC,kCAAAA,QAAQ;GACnC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,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
+ exports.default = EmojiPickerPopover_module_default;
5
+
6
+ //# sourceMappingURL=EmojiPickerPopover.module.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerPopover.module.cjs","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
+ const require_emoji_grid_utils = require("../utils/emoji-grid-utils.cjs");
3
+ let react = require("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 = (0, react.useMemo)(() => require_emoji_grid_utils.createEmojiGridModel(items), [items]);
17
+ const [state, setState] = (0, react.useState)(INITIAL_STATE);
18
+ const [prevResetKey, setPrevResetKey] = (0, react.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 = (0, react.useCallback)((index, nextSource) => {
28
+ setState((prev) => prev.index === index && prev.source === nextSource ? prev : {
29
+ index,
30
+ source: nextSource
31
+ });
32
+ }, []);
33
+ const setPointerIndex = (0, react.useCallback)((index) => setActive(index, "pointer"), [setActive]);
34
+ const setAnchorIndex = (0, react.useCallback)((index) => setActive(index, "anchor"), [setActive]);
35
+ const handleKeyDown = (0, react.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 : require_emoji_grid_utils.getNextEmojiIndex(model, activeIndex, direction);
41
+ setActive(nextIndex, "keyboard");
42
+ scrollToItem?.(require_emoji_grid_utils.getEmojiItemIndex(model, nextIndex));
43
+ return;
44
+ }
45
+ if (event.key === "Enter" || event.key === " ") {
46
+ event.preventDefault();
47
+ onEmojiSelect(require_emoji_grid_utils.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
+ exports.useEmojiGridNavigation = useEmojiGridNavigation;
69
+
70
+ //# sourceMappingURL=use-emoji-grid-navigation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-emoji-grid-navigation.cjs","names":["useMemo","createEmojiGridModel","useState","useCallback","getNextEmojiIndex","getEmojiItemIndex","applySkinTone"],"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,SAAA,GAAQA,MAAAA,QAAAA,OAAcC,yBAAAA,qBAAqB,KAAK,GAAG,CAAC,KAAK,CAAC;CAChE,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAA2B,aAAa;CAClE,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,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,aAAA,GAAYC,MAAAA,YAAAA,EAAa,OAAe,eAAkC;EAC9E,UAAU,SACR,KAAK,UAAU,SAAS,KAAK,WAAW,aAAa,OAAO;GAAE;GAAO,QAAQ;EAAW,CAC1F;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,EAAa,UAAkB,UAAU,OAAO,SAAS,GAAG,CAAC,SAAS,CAAC;CAC/F,MAAM,kBAAA,GAAiBA,MAAAA,YAAAA,EAAa,UAAkB,UAAU,OAAO,QAAQ,GAAG,CAAC,SAAS,CAAC;CAE7F,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,EACnB,UAA+B;EAC9B,IAAI,gBAAgB,IAClB;EAGF,MAAM,YAAY,eAAe,MAAM;EACvC,IAAI,WAAW;GACb,MAAM,eAAe;GACrB,MAAM,YACJ,WAAW,WAAW,cAAcC,yBAAAA,kBAAkB,OAAO,aAAa,SAAS;GACrF,UAAU,WAAW,UAAU;GAC/B,eAAeC,yBAAAA,kBAAkB,OAAO,SAAS,CAAC;GAClD;EACF;EAEA,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;GAC9C,MAAM,eAAe;GACrB,cAAcC,yBAAAA,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
+ const require_search_emojis = require("../utils/search-emojis.cjs");
3
+ let react = require("react");
4
+ let _mantine_hooks = require("@mantine/hooks");
5
+ // packages/@mantine/emoji/src/hooks/use-emoji-search.ts
6
+ function useEmojiSearch({ data, searchValue, onSearchChange }) {
7
+ const [query, setQuery] = (0, _mantine_hooks.useUncontrolled)({
8
+ value: searchValue,
9
+ defaultValue: "",
10
+ onChange: onSearchChange
11
+ });
12
+ return {
13
+ query,
14
+ setQuery,
15
+ results: (0, react.useMemo)(() => require_search_emojis.searchEmojis(data, query), [data, query]),
16
+ isSearching: query.trim().length > 0
17
+ };
18
+ }
19
+ exports.useEmojiSearch = useEmojiSearch;
20
+
21
+ //# sourceMappingURL=use-emoji-search.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-emoji-search.cjs","names":["useUncontrolled","useMemo","searchEmojis"],"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,aAAA,GAAYA,eAAAA,gBAAAA,CAAgB;EACxC,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CAKD,OAAO;EAAE;EAAO;EAAU,UAAA,GAHVC,MAAAA,QAAAA,OAAcC,sBAAAA,aAAa,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAGrC;EAAG,aAFf,MAAM,KAAK,CAAC,CAAC,SAAS;CAEK;AACjD"}
package/cjs/index.cjs ADDED
@@ -0,0 +1,22 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_types = require("./types.cjs");
3
+ const require_categories = require("./categories.cjs");
4
+ const require_search_emojis = require("./utils/search-emojis.cjs");
5
+ const require_flatten_emoji_data = require("./utils/flatten-emoji-data.cjs");
6
+ const require_is_emoji_supported = require("./utils/is-emoji-supported.cjs");
7
+ const require_emoji_mart_adapter = require("./adapters/emoji-mart-adapter.cjs");
8
+ const require_emojibase_adapter = require("./adapters/emojibase-adapter.cjs");
9
+ const require_EmojiPicker = require("./components/EmojiPicker/EmojiPicker.cjs");
10
+ const require_EmojiPickerPopover = require("./components/EmojiPickerPopover/EmojiPickerPopover.cjs");
11
+ const require_EmojiPickerInput = require("./components/EmojiPickerInput/EmojiPickerInput.cjs");
12
+ exports.CANONICAL_CATEGORY_IDS = require_categories.CANONICAL_CATEGORY_IDS;
13
+ exports.DEFAULT_LABELS = require_types.DEFAULT_LABELS;
14
+ exports.EmojiPicker = require_EmojiPicker.EmojiPicker;
15
+ exports.EmojiPickerInput = require_EmojiPickerInput.EmojiPickerInput;
16
+ exports.EmojiPickerPopover = require_EmojiPickerPopover.EmojiPickerPopover;
17
+ exports.emojiMartAdapter = require_emoji_mart_adapter.emojiMartAdapter;
18
+ exports.emojibaseAdapter = require_emojibase_adapter.emojibaseAdapter;
19
+ exports.filterSupportedEmojis = require_is_emoji_supported.filterSupportedEmojis;
20
+ exports.flattenEmojiData = require_flatten_emoji_data.flattenEmojiData;
21
+ exports.isEmojiSupported = require_is_emoji_supported.isEmojiSupported;
22
+ exports.searchEmojis = require_search_emojis.searchEmojis;
package/cjs/types.cjs 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
+ exports.DEFAULT_LABELS = DEFAULT_LABELS;
19
+
20
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","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"}
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ // packages/@mantine/emoji/src/utils/emoji-grid-utils.ts
3
+ function createEmojiGridModel(items) {
4
+ const emojis = [];
5
+ const rows = [];
6
+ const emojiRows = [];
7
+ const itemOffsets = [];
8
+ items.forEach((item, itemIndex) => {
9
+ itemOffsets.push(emojis.length);
10
+ if (item.type === "row") {
11
+ rows.push({
12
+ itemIndex,
13
+ start: emojis.length,
14
+ length: item.emojis.length
15
+ });
16
+ for (const emoji of item.emojis) {
17
+ emojis.push(emoji);
18
+ emojiRows.push(rows.length - 1);
19
+ }
20
+ }
21
+ });
22
+ return {
23
+ emojis,
24
+ rows,
25
+ emojiRows,
26
+ itemOffsets
27
+ };
28
+ }
29
+ function getNextEmojiIndex(model, index, direction) {
30
+ const lastIndex = model.emojis.length - 1;
31
+ if (lastIndex < 0) return -1;
32
+ const current = Math.min(Math.max(index, 0), lastIndex);
33
+ if (direction === "left") return Math.max(current - 1, 0);
34
+ if (direction === "right") return Math.min(current + 1, lastIndex);
35
+ const rowPosition = model.emojiRows[current];
36
+ const targetRow = model.rows[rowPosition + (direction === "down" ? 1 : -1)];
37
+ if (!targetRow) return current;
38
+ const column = current - model.rows[rowPosition].start;
39
+ return targetRow.start + Math.min(column, targetRow.length - 1);
40
+ }
41
+ function getEmojiItemIndex(model, index) {
42
+ const row = model.rows[model.emojiRows[index]];
43
+ return row ? row.itemIndex : -1;
44
+ }
45
+ function applySkinTone(emoji, skinTone) {
46
+ if (skinTone > 0 && emoji.skins && emoji.skins[skinTone - 1]) return {
47
+ ...emoji,
48
+ emoji: emoji.skins[skinTone - 1]
49
+ };
50
+ return emoji;
51
+ }
52
+ exports.applySkinTone = applySkinTone;
53
+ exports.createEmojiGridModel = createEmojiGridModel;
54
+ exports.getEmojiItemIndex = getEmojiItemIndex;
55
+ exports.getNextEmojiIndex = getNextEmojiIndex;
56
+
57
+ //# sourceMappingURL=emoji-grid-utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji-grid-utils.cjs","names":[],"sources":["../../src/utils/emoji-grid-utils.ts"],"sourcesContent":["import type { EmojiPickerEmoji, FlattenedRowItem } from '../types';\n\nexport interface EmojiGridRow {\n itemIndex: number;\n start: number;\n length: number;\n}\n\nexport interface EmojiGridModel {\n emojis: EmojiPickerEmoji[];\n rows: EmojiGridRow[];\n emojiRows: number[];\n itemOffsets: number[];\n}\n\nexport type EmojiGridDirection = 'left' | 'right' | 'up' | 'down';\n\nexport function createEmojiGridModel(items: FlattenedRowItem[]): EmojiGridModel {\n const emojis: EmojiPickerEmoji[] = [];\n const rows: EmojiGridRow[] = [];\n const emojiRows: number[] = [];\n const itemOffsets: number[] = [];\n\n items.forEach((item, itemIndex) => {\n itemOffsets.push(emojis.length);\n if (item.type === 'row') {\n rows.push({ itemIndex, start: emojis.length, length: item.emojis.length });\n for (const emoji of item.emojis) {\n emojis.push(emoji);\n emojiRows.push(rows.length - 1);\n }\n }\n });\n\n return { emojis, rows, emojiRows, itemOffsets };\n}\n\nexport function getNextEmojiIndex(\n model: EmojiGridModel,\n index: number,\n direction: EmojiGridDirection\n): number {\n const lastIndex = model.emojis.length - 1;\n if (lastIndex < 0) {\n return -1;\n }\n\n const current = Math.min(Math.max(index, 0), lastIndex);\n\n if (direction === 'left') {\n return Math.max(current - 1, 0);\n }\n\n if (direction === 'right') {\n return Math.min(current + 1, lastIndex);\n }\n\n const rowPosition = model.emojiRows[current];\n const targetRow = model.rows[rowPosition + (direction === 'down' ? 1 : -1)];\n if (!targetRow) {\n return current;\n }\n\n const column = current - model.rows[rowPosition].start;\n return targetRow.start + Math.min(column, targetRow.length - 1);\n}\n\nexport function getEmojiItemIndex(model: EmojiGridModel, index: number): number {\n const row = model.rows[model.emojiRows[index]];\n return row ? row.itemIndex : -1;\n}\n\nexport function applySkinTone(emoji: EmojiPickerEmoji, skinTone: number): EmojiPickerEmoji {\n if (skinTone > 0 && emoji.skins && emoji.skins[skinTone - 1]) {\n return { ...emoji, emoji: emoji.skins[skinTone - 1] };\n }\n return emoji;\n}\n"],"mappings":";;AAiBA,SAAgB,qBAAqB,OAA2C;CAC9E,MAAM,SAA6B,CAAC;CACpC,MAAM,OAAuB,CAAC;CAC9B,MAAM,YAAsB,CAAC;CAC7B,MAAM,cAAwB,CAAC;CAE/B,MAAM,SAAS,MAAM,cAAc;EACjC,YAAY,KAAK,OAAO,MAAM;EAC9B,IAAI,KAAK,SAAS,OAAO;GACvB,KAAK,KAAK;IAAE;IAAW,OAAO,OAAO;IAAQ,QAAQ,KAAK,OAAO;GAAO,CAAC;GACzE,KAAK,MAAM,SAAS,KAAK,QAAQ;IAC/B,OAAO,KAAK,KAAK;IACjB,UAAU,KAAK,KAAK,SAAS,CAAC;GAChC;EACF;CACF,CAAC;CAED,OAAO;EAAE;EAAQ;EAAM;EAAW;CAAY;AAChD;AAEA,SAAgB,kBACd,OACA,OACA,WACQ;CACR,MAAM,YAAY,MAAM,OAAO,SAAS;CACxC,IAAI,YAAY,GACd,OAAO;CAGT,MAAM,UAAU,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,SAAS;CAEtD,IAAI,cAAc,QAChB,OAAO,KAAK,IAAI,UAAU,GAAG,CAAC;CAGhC,IAAI,cAAc,SAChB,OAAO,KAAK,IAAI,UAAU,GAAG,SAAS;CAGxC,MAAM,cAAc,MAAM,UAAU;CACpC,MAAM,YAAY,MAAM,KAAK,eAAe,cAAc,SAAS,IAAI;CACvE,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,SAAS,UAAU,MAAM,KAAK,YAAY,CAAC;CACjD,OAAO,UAAU,QAAQ,KAAK,IAAI,QAAQ,UAAU,SAAS,CAAC;AAChE;AAEA,SAAgB,kBAAkB,OAAuB,OAAuB;CAC9E,MAAM,MAAM,MAAM,KAAK,MAAM,UAAU;CACvC,OAAO,MAAM,IAAI,YAAY;AAC/B;AAEA,SAAgB,cAAc,OAAyB,UAAoC;CACzF,IAAI,WAAW,KAAK,MAAM,SAAS,MAAM,MAAM,WAAW,IACxD,OAAO;EAAE,GAAG;EAAO,OAAO,MAAM,MAAM,WAAW;CAAG;CAEtD,OAAO;AACT"}
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ // packages/@mantine/emoji/src/utils/flatten-emoji-data.ts
3
+ function chunkArray(array, size) {
4
+ const chunks = [];
5
+ for (let i = 0; i < array.length; i += size) chunks.push(array.slice(i, i + size));
6
+ return chunks;
7
+ }
8
+ function flattenEmojiData(data, columns, categoryLabels) {
9
+ const items = [];
10
+ for (const category of data.categories) {
11
+ const emojis = [];
12
+ for (const emojiId of category.emojis) {
13
+ const emoji = data.emojis[emojiId];
14
+ if (emoji) emojis.push(emoji);
15
+ }
16
+ if (emojis.length === 0) continue;
17
+ const label = categoryLabels?.[category.id] ?? category.label;
18
+ items.push({
19
+ type: "header",
20
+ categoryId: category.id,
21
+ label
22
+ });
23
+ const rows = chunkArray(emojis, columns);
24
+ for (const row of rows) items.push({
25
+ type: "row",
26
+ emojis: row
27
+ });
28
+ }
29
+ return items;
30
+ }
31
+ exports.flattenEmojiData = flattenEmojiData;
32
+
33
+ //# sourceMappingURL=flatten-emoji-data.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten-emoji-data.cjs","names":[],"sources":["../../src/utils/flatten-emoji-data.ts"],"sourcesContent":["import type { EmojiPickerData, EmojiPickerEmoji, FlattenedRowItem } from '../types';\n\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\nexport function flattenEmojiData(\n data: EmojiPickerData,\n columns: number,\n categoryLabels?: Record<string, string>\n): FlattenedRowItem[] {\n const items: FlattenedRowItem[] = [];\n\n for (const category of data.categories) {\n const emojis: EmojiPickerEmoji[] = [];\n for (const emojiId of category.emojis) {\n const emoji = data.emojis[emojiId];\n if (emoji) {\n emojis.push(emoji);\n }\n }\n\n if (emojis.length === 0) {\n continue;\n }\n\n const label = categoryLabels?.[category.id] ?? category.label;\n items.push({ type: 'header', categoryId: category.id, label });\n\n const rows = chunkArray(emojis, columns);\n for (const row of rows) {\n items.push({ type: 'row', emojis: row });\n }\n }\n\n return items;\n}\n"],"mappings":";;AAEA,SAAS,WAAc,OAAY,MAAqB;CACtD,MAAM,SAAgB,CAAC;CACvB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,MACrC,OAAO,KAAK,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC;CAEtC,OAAO;AACT;AAEA,SAAgB,iBACd,MACA,SACA,gBACoB;CACpB,MAAM,QAA4B,CAAC;CAEnC,KAAK,MAAM,YAAY,KAAK,YAAY;EACtC,MAAM,SAA6B,CAAC;EACpC,KAAK,MAAM,WAAW,SAAS,QAAQ;GACrC,MAAM,QAAQ,KAAK,OAAO;GAC1B,IAAI,OACF,OAAO,KAAK,KAAK;EAErB;EAEA,IAAI,OAAO,WAAW,GACpB;EAGF,MAAM,QAAQ,iBAAiB,SAAS,OAAO,SAAS;EACxD,MAAM,KAAK;GAAE,MAAM;GAAU,YAAY,SAAS;GAAI;EAAM,CAAC;EAE7D,MAAM,OAAO,WAAW,QAAQ,OAAO;EACvC,KAAK,MAAM,OAAO,MAChB,MAAM,KAAK;GAAE,MAAM;GAAO,QAAQ;EAAI,CAAC;CAE3C;CAEA,OAAO;AACT"}
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ // packages/@mantine/emoji/src/utils/is-emoji-supported.ts
3
+ const CANVAS_SIZE = 24;
4
+ const FONT_SIZE = 18;
5
+ const REFERENCE_EMOJI = "😀";
6
+ const VARIATION_SELECTOR = "️";
7
+ const cache = /* @__PURE__ */ new Map();
8
+ let context;
9
+ function getContext() {
10
+ if (context !== void 0) return context;
11
+ if (typeof document === "undefined") return null;
12
+ try {
13
+ const canvas = document.createElement("canvas");
14
+ canvas.width = CANVAS_SIZE;
15
+ canvas.height = CANVAS_SIZE;
16
+ context = canvas.getContext("2d", { willReadFrequently: true }) ?? null;
17
+ if (context) {
18
+ context.font = `${FONT_SIZE}px sans-serif`;
19
+ context.textBaseline = "top";
20
+ }
21
+ } catch {
22
+ context = null;
23
+ }
24
+ return context ?? null;
25
+ }
26
+ function renderPixels(ctx, emoji, color) {
27
+ ctx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);
28
+ ctx.fillStyle = color;
29
+ ctx.fillText(emoji, 0, 0);
30
+ return ctx.getImageData(0, 0, CANVAS_SIZE, CANVAS_SIZE).data;
31
+ }
32
+ function rendersAsColorGlyph(ctx, emoji) {
33
+ const first = renderPixels(ctx, emoji, "#f00");
34
+ const second = renderPixels(ctx, emoji, "#00f");
35
+ let hasPixels = false;
36
+ for (let i = 0; i < first.length; i += 1) {
37
+ if (first[i] !== second[i]) return false;
38
+ if (!hasPixels && i % 4 === 3 && first[i] > 0) hasPixels = true;
39
+ }
40
+ return hasPixels;
41
+ }
42
+ function rendersAsSingleGlyph(ctx, emoji) {
43
+ if (Array.from(emoji).filter((char) => char !== VARIATION_SELECTOR).length < 2) return true;
44
+ return ctx.measureText(emoji).width < ctx.measureText(REFERENCE_EMOJI).width * 1.5;
45
+ }
46
+ function isEmojiSupported(emoji) {
47
+ const cached = cache.get(emoji);
48
+ if (cached !== void 0) return cached;
49
+ const ctx = getContext();
50
+ if (!ctx) return true;
51
+ const supported = rendersAsSingleGlyph(ctx, emoji) && rendersAsColorGlyph(ctx, emoji);
52
+ cache.set(emoji, supported);
53
+ return supported;
54
+ }
55
+ function filterSupportedEmojis(emojis, emojiIds) {
56
+ return emojiIds.filter((id) => {
57
+ const emoji = emojis[id];
58
+ return emoji ? isEmojiSupported(emoji.emoji) : false;
59
+ });
60
+ }
61
+ exports.filterSupportedEmojis = filterSupportedEmojis;
62
+ exports.isEmojiSupported = isEmojiSupported;
63
+
64
+ //# sourceMappingURL=is-emoji-supported.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-emoji-supported.cjs","names":[],"sources":["../../src/utils/is-emoji-supported.ts"],"sourcesContent":["const CANVAS_SIZE = 24;\nconst FONT_SIZE = 18;\nconst REFERENCE_EMOJI = '😀';\nconst VARIATION_SELECTOR = '️';\n\nconst cache = new Map<string, boolean>();\nlet context: CanvasRenderingContext2D | null | undefined;\n\nfunction getContext(): CanvasRenderingContext2D | null {\n if (context !== undefined) {\n return context;\n }\n\n if (typeof document === 'undefined') {\n return null;\n }\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = CANVAS_SIZE;\n canvas.height = CANVAS_SIZE;\n context = canvas.getContext('2d', { willReadFrequently: true }) ?? null;\n if (context) {\n context.font = `${FONT_SIZE}px sans-serif`;\n context.textBaseline = 'top';\n }\n } catch {\n context = null;\n }\n\n return context ?? null;\n}\n\nfunction renderPixels(ctx: CanvasRenderingContext2D, emoji: string, color: string) {\n ctx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);\n ctx.fillStyle = color;\n ctx.fillText(emoji, 0, 0);\n return ctx.getImageData(0, 0, CANVAS_SIZE, CANVAS_SIZE).data;\n}\n\nfunction rendersAsColorGlyph(ctx: CanvasRenderingContext2D, emoji: string) {\n const first = renderPixels(ctx, emoji, '#f00');\n const second = renderPixels(ctx, emoji, '#00f');\n\n let hasPixels = false;\n for (let i = 0; i < first.length; i += 1) {\n if (first[i] !== second[i]) {\n return false;\n }\n\n if (!hasPixels && i % 4 === 3 && first[i] > 0) {\n hasPixels = true;\n }\n }\n\n return hasPixels;\n}\n\nfunction rendersAsSingleGlyph(ctx: CanvasRenderingContext2D, emoji: string) {\n const codePoints = Array.from(emoji).filter((char) => char !== VARIATION_SELECTOR);\n if (codePoints.length < 2) {\n return true;\n }\n\n return ctx.measureText(emoji).width < ctx.measureText(REFERENCE_EMOJI).width * 1.5;\n}\n\nexport function isEmojiSupported(emoji: string): boolean {\n const cached = cache.get(emoji);\n if (cached !== undefined) {\n return cached;\n }\n\n const ctx = getContext();\n if (!ctx) {\n return true;\n }\n\n const supported = rendersAsSingleGlyph(ctx, emoji) && rendersAsColorGlyph(ctx, emoji);\n cache.set(emoji, supported);\n return supported;\n}\n\nexport function filterSupportedEmojis(\n emojis: Record<string, { emoji: string }>,\n emojiIds: string[]\n): string[] {\n return emojiIds.filter((id) => {\n const emoji = emojis[id];\n return emoji ? isEmojiSupported(emoji.emoji) : false;\n });\n}\n"],"mappings":";;AAAA,MAAM,cAAc;AACpB,MAAM,YAAY;AAClB,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAE3B,MAAM,wBAAQ,IAAI,IAAqB;AACvC,IAAI;AAEJ,SAAS,aAA8C;CACrD,IAAI,YAAY,KAAA,GACd,OAAO;CAGT,IAAI,OAAO,aAAa,aACtB,OAAO;CAGT,IAAI;EACF,MAAM,SAAS,SAAS,cAAc,QAAQ;EAC9C,OAAO,QAAQ;EACf,OAAO,SAAS;EAChB,UAAU,OAAO,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC,KAAK;EACnE,IAAI,SAAS;GACX,QAAQ,OAAO,GAAG,UAAU;GAC5B,QAAQ,eAAe;EACzB;CACF,QAAQ;EACN,UAAU;CACZ;CAEA,OAAO,WAAW;AACpB;AAEA,SAAS,aAAa,KAA+B,OAAe,OAAe;CACjF,IAAI,UAAU,GAAG,GAAG,aAAa,WAAW;CAC5C,IAAI,YAAY;CAChB,IAAI,SAAS,OAAO,GAAG,CAAC;CACxB,OAAO,IAAI,aAAa,GAAG,GAAG,aAAa,WAAW,CAAC,CAAC;AAC1D;AAEA,SAAS,oBAAoB,KAA+B,OAAe;CACzE,MAAM,QAAQ,aAAa,KAAK,OAAO,MAAM;CAC7C,MAAM,SAAS,aAAa,KAAK,OAAO,MAAM;CAE9C,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,IAAI,MAAM,OAAO,OAAO,IACtB,OAAO;EAGT,IAAI,CAAC,aAAa,IAAI,MAAM,KAAK,MAAM,KAAK,GAC1C,YAAY;CAEhB;CAEA,OAAO;AACT;AAEA,SAAS,qBAAqB,KAA+B,OAAe;CAE1E,IADmB,MAAM,KAAK,KAAK,CAAC,CAAC,QAAQ,SAAS,SAAS,kBAClD,CAAC,CAAC,SAAS,GACtB,OAAO;CAGT,OAAO,IAAI,YAAY,KAAK,CAAC,CAAC,QAAQ,IAAI,YAAY,eAAe,CAAC,CAAC,QAAQ;AACjF;AAEA,SAAgB,iBAAiB,OAAwB;CACvD,MAAM,SAAS,MAAM,IAAI,KAAK;CAC9B,IAAI,WAAW,KAAA,GACb,OAAO;CAGT,MAAM,MAAM,WAAW;CACvB,IAAI,CAAC,KACH,OAAO;CAGT,MAAM,YAAY,qBAAqB,KAAK,KAAK,KAAK,oBAAoB,KAAK,KAAK;CACpF,MAAM,IAAI,OAAO,SAAS;CAC1B,OAAO;AACT;AAEA,SAAgB,sBACd,QACA,UACU;CACV,OAAO,SAAS,QAAQ,OAAO;EAC7B,MAAM,QAAQ,OAAO;EACrB,OAAO,QAAQ,iBAAiB,MAAM,KAAK,IAAI;CACjD,CAAC;AACH"}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ // packages/@mantine/emoji/src/utils/search-emojis.ts
3
+ function searchEmojis(data, query) {
4
+ const trimmed = query.trim().toLowerCase();
5
+ if (!trimmed) return [];
6
+ const results = [];
7
+ const seen = /* @__PURE__ */ new Set();
8
+ for (const category of data.categories) for (const emojiId of category.emojis) {
9
+ if (seen.has(emojiId)) continue;
10
+ const emoji = data.emojis[emojiId];
11
+ if (!emoji) continue;
12
+ if (emoji.id === trimmed || emoji.name.toLowerCase().includes(trimmed) || emoji.keywords.some((kw) => kw.toLowerCase().startsWith(trimmed))) {
13
+ results.push(emoji);
14
+ seen.add(emojiId);
15
+ }
16
+ }
17
+ return results;
18
+ }
19
+ exports.searchEmojis = searchEmojis;
20
+
21
+ //# sourceMappingURL=search-emojis.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-emojis.cjs","names":[],"sources":["../../src/utils/search-emojis.ts"],"sourcesContent":["import type { EmojiPickerData, EmojiPickerEmoji } from '../types';\n\nexport function searchEmojis(data: EmojiPickerData, query: string): EmojiPickerEmoji[] {\n const trimmed = query.trim().toLowerCase();\n if (!trimmed) {\n return [];\n }\n\n const results: EmojiPickerEmoji[] = [];\n const seen = new Set<string>();\n\n for (const category of data.categories) {\n for (const emojiId of category.emojis) {\n if (seen.has(emojiId)) {\n continue;\n }\n\n const emoji = data.emojis[emojiId];\n if (!emoji) {\n continue;\n }\n\n const matches =\n emoji.id === trimmed ||\n emoji.name.toLowerCase().includes(trimmed) ||\n emoji.keywords.some((kw) => kw.toLowerCase().startsWith(trimmed));\n\n if (matches) {\n results.push(emoji);\n seen.add(emojiId);\n }\n }\n }\n\n return results;\n}\n"],"mappings":";;AAEA,SAAgB,aAAa,MAAuB,OAAmC;CACrF,MAAM,UAAU,MAAM,KAAK,CAAC,CAAC,YAAY;CACzC,IAAI,CAAC,SACH,OAAO,CAAC;CAGV,MAAM,UAA8B,CAAC;CACrC,MAAM,uBAAO,IAAI,IAAY;CAE7B,KAAK,MAAM,YAAY,KAAK,YAC1B,KAAK,MAAM,WAAW,SAAS,QAAQ;EACrC,IAAI,KAAK,IAAI,OAAO,GAClB;EAGF,MAAM,QAAQ,KAAK,OAAO;EAC1B,IAAI,CAAC,OACH;EAQF,IAJE,MAAM,OAAO,WACb,MAAM,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO,KACzC,MAAM,SAAS,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,WAAW,OAAO,CAAC,GAErD;GACX,QAAQ,KAAK,KAAK;GAClB,KAAK,IAAI,OAAO;EAClB;CACF;CAGF,OAAO;AACT"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { getCanonicalCategoryLabel } from "../categories.mjs";
3
+ // packages/@mantine/emoji/src/adapters/emoji-mart-adapter.ts
4
+ function emojiMartAdapter(input) {
5
+ const data = input;
6
+ const emojis = {};
7
+ for (const [id, emojiMartEmoji] of Object.entries(data.emojis)) {
8
+ const defaultSkin = emojiMartEmoji.skins[0];
9
+ const skinVariants = emojiMartEmoji.skins.length === 6 ? emojiMartEmoji.skins.slice(1).map((s) => s.native) : void 0;
10
+ emojis[id] = {
11
+ id,
12
+ name: emojiMartEmoji.name,
13
+ keywords: emojiMartEmoji.keywords,
14
+ emoji: defaultSkin.native,
15
+ skins: skinVariants,
16
+ version: emojiMartEmoji.version
17
+ };
18
+ }
19
+ return {
20
+ categories: data.categories.map((cat) => ({
21
+ id: cat.id,
22
+ label: getCanonicalCategoryLabel(cat.id) || cat.id,
23
+ emojis: cat.emojis
24
+ })),
25
+ emojis
26
+ };
27
+ }
28
+ export { emojiMartAdapter };
29
+
30
+ //# sourceMappingURL=emoji-mart-adapter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji-mart-adapter.mjs","names":[],"sources":["../../src/adapters/emoji-mart-adapter.ts"],"sourcesContent":["import { getCanonicalCategoryLabel } from '../categories';\nimport type { EmojiPickerCategory, EmojiPickerData, EmojiPickerEmoji } from '../types';\n\ninterface EmojiMartSkin {\n unified: string;\n native: string;\n}\n\ninterface EmojiMartEmoji {\n id: string;\n name: string;\n keywords: string[];\n skins: EmojiMartSkin[];\n version: number;\n}\n\ninterface EmojiMartCategory {\n id: string;\n emojis: string[];\n}\n\ninterface EmojiMartData {\n categories: EmojiMartCategory[];\n emojis: Record<string, EmojiMartEmoji>;\n}\n\nexport function emojiMartAdapter(data: EmojiMartData): EmojiPickerData;\nexport function emojiMartAdapter(data: object): EmojiPickerData;\nexport function emojiMartAdapter(input: object): EmojiPickerData {\n const data = input as EmojiMartData;\n const emojis: Record<string, EmojiPickerEmoji> = {};\n\n for (const [id, emojiMartEmoji] of Object.entries(data.emojis)) {\n const defaultSkin = emojiMartEmoji.skins[0];\n const skinVariants =\n emojiMartEmoji.skins.length === 6\n ? emojiMartEmoji.skins.slice(1).map((s) => s.native)\n : undefined;\n\n emojis[id] = {\n id,\n name: emojiMartEmoji.name,\n keywords: emojiMartEmoji.keywords,\n emoji: defaultSkin.native,\n skins: skinVariants,\n version: emojiMartEmoji.version,\n };\n }\n\n const categories: EmojiPickerCategory[] = data.categories.map((cat) => ({\n id: cat.id,\n label: getCanonicalCategoryLabel(cat.id) || cat.id,\n emojis: cat.emojis,\n }));\n\n return { categories, emojis };\n}\n"],"mappings":";;;AA4BA,SAAgB,iBAAiB,OAAgC;CAC/D,MAAM,OAAO;CACb,MAAM,SAA2C,CAAC;CAElD,KAAK,MAAM,CAAC,IAAI,mBAAmB,OAAO,QAAQ,KAAK,MAAM,GAAG;EAC9D,MAAM,cAAc,eAAe,MAAM;EACzC,MAAM,eACJ,eAAe,MAAM,WAAW,IAC5B,eAAe,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,IACjD,KAAA;EAEN,OAAO,MAAM;GACX;GACA,MAAM,eAAe;GACrB,UAAU,eAAe;GACzB,OAAO,YAAY;GACnB,OAAO;GACP,SAAS,eAAe;EAC1B;CACF;CAQA,OAAO;EAAE,YANiC,KAAK,WAAW,KAAK,SAAS;GACtE,IAAI,IAAI;GACR,OAAO,0BAA0B,IAAI,EAAE,KAAK,IAAI;GAChD,QAAQ,IAAI;EACd,EAEkB;EAAG;CAAO;AAC9B"}
@@ -0,0 +1,76 @@
1
+ "use client";
2
+ import { CANONICAL_CATEGORY_IDS, CANONICAL_CATEGORY_LABELS } from "../categories.mjs";
3
+ // packages/@mantine/emoji/src/adapters/emojibase-adapter.ts
4
+ const GROUP_TO_CANONICAL = {
5
+ 0: "people",
6
+ 1: "people",
7
+ 3: "nature",
8
+ 4: "foods",
9
+ 5: "places",
10
+ 6: "activity",
11
+ 7: "objects",
12
+ 8: "symbols",
13
+ 9: "flags"
14
+ };
15
+ const CATEGORY_ORDER = CANONICAL_CATEGORY_IDS.filter((id) => id !== "frequent");
16
+ function getUniformTone(tone) {
17
+ if (typeof tone === "number") return tone;
18
+ if (Array.isArray(tone) && tone.length > 0 && tone.every((t) => t === tone[0])) return tone[0];
19
+ return null;
20
+ }
21
+ function getSkinVariants(skins) {
22
+ if (!skins || skins.length === 0) return;
23
+ const byTone = /* @__PURE__ */ new Map();
24
+ for (const skin of skins) {
25
+ const tone = getUniformTone(skin.tone);
26
+ if (tone !== null && !byTone.has(tone)) byTone.set(tone, skin.emoji);
27
+ }
28
+ const variants = [
29
+ 1,
30
+ 2,
31
+ 3,
32
+ 4,
33
+ 5
34
+ ].map((tone) => byTone.get(tone));
35
+ return variants.every((variant) => variant !== void 0) ? variants : void 0;
36
+ }
37
+ function emojibaseAdapter(data, messages) {
38
+ const emojis = {};
39
+ const categoryEmojis = /* @__PURE__ */ new Map();
40
+ const groupLabels = /* @__PURE__ */ new Map();
41
+ for (const group of messages.groups) groupLabels.set(group.order, group.message);
42
+ for (const emojibaseEmoji of data) {
43
+ if (emojibaseEmoji.group === void 0) continue;
44
+ const canonicalId = GROUP_TO_CANONICAL[emojibaseEmoji.group];
45
+ if (!canonicalId) continue;
46
+ const id = emojibaseEmoji.hexcode;
47
+ emojis[id] = {
48
+ id,
49
+ name: emojibaseEmoji.label,
50
+ keywords: emojibaseEmoji.tags || [],
51
+ emoji: emojibaseEmoji.emoji,
52
+ skins: getSkinVariants(emojibaseEmoji.skins),
53
+ version: emojibaseEmoji.version
54
+ };
55
+ if (!categoryEmojis.has(canonicalId)) categoryEmojis.set(canonicalId, []);
56
+ categoryEmojis.get(canonicalId).push(emojibaseEmoji);
57
+ }
58
+ const categories = [];
59
+ for (const canonicalId of CATEGORY_ORDER) {
60
+ const items = categoryEmojis.get(canonicalId);
61
+ if (!items) continue;
62
+ items.sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER));
63
+ categories.push({
64
+ id: canonicalId,
65
+ label: CANONICAL_CATEGORY_LABELS[canonicalId] || groupLabels.get(items[0].group) || canonicalId,
66
+ emojis: items.map((item) => item.hexcode)
67
+ });
68
+ }
69
+ return {
70
+ categories,
71
+ emojis
72
+ };
73
+ }
74
+ export { emojibaseAdapter };
75
+
76
+ //# sourceMappingURL=emojibase-adapter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emojibase-adapter.mjs","names":[],"sources":["../../src/adapters/emojibase-adapter.ts"],"sourcesContent":["import {\n CANONICAL_CATEGORY_IDS,\n CANONICAL_CATEGORY_LABELS,\n type CanonicalCategoryId,\n} from '../categories';\nimport type { EmojiPickerCategory, EmojiPickerData, EmojiPickerEmoji } from '../types';\n\ninterface EmojibaseSkin {\n emoji: string;\n tone?: number | number[];\n}\n\ninterface EmojibaseEmoji {\n label: string;\n hexcode: string;\n emoji: string;\n tags?: string[];\n group?: number;\n order?: number;\n version: number;\n skins?: EmojibaseSkin[];\n}\n\ninterface EmojibaseGroupMessage {\n key: string;\n message: string;\n order: number;\n}\n\ninterface EmojibaseMessages {\n groups: EmojibaseGroupMessage[];\n}\n\nconst GROUP_TO_CANONICAL: Record<number, Exclude<CanonicalCategoryId, 'frequent'>> = {\n 0: 'people',\n 1: 'people',\n 3: 'nature',\n 4: 'foods',\n 5: 'places',\n 6: 'activity',\n 7: 'objects',\n 8: 'symbols',\n 9: 'flags',\n};\n\nconst CATEGORY_ORDER = CANONICAL_CATEGORY_IDS.filter(\n (id): id is Exclude<CanonicalCategoryId, 'frequent'> => id !== 'frequent'\n);\n\nfunction getUniformTone(tone: EmojibaseSkin['tone']) {\n if (typeof tone === 'number') {\n return tone;\n }\n\n if (Array.isArray(tone) && tone.length > 0 && tone.every((t) => t === tone[0])) {\n return tone[0];\n }\n\n return null;\n}\n\nfunction getSkinVariants(skins: EmojibaseSkin[] | undefined) {\n if (!skins || skins.length === 0) {\n return undefined;\n }\n\n const byTone = new Map<number, string>();\n for (const skin of skins) {\n const tone = getUniformTone(skin.tone);\n if (tone !== null && !byTone.has(tone)) {\n byTone.set(tone, skin.emoji);\n }\n }\n\n const variants = [1, 2, 3, 4, 5].map((tone) => byTone.get(tone));\n return variants.every((variant) => variant !== undefined) ? (variants as string[]) : undefined;\n}\n\nexport function emojibaseAdapter(\n data: EmojibaseEmoji[],\n messages: EmojibaseMessages\n): EmojiPickerData {\n const emojis: Record<string, EmojiPickerEmoji> = {};\n const categoryEmojis = new Map<string, EmojibaseEmoji[]>();\n\n const groupLabels = new Map<number, string>();\n for (const group of messages.groups) {\n groupLabels.set(group.order, group.message);\n }\n\n for (const emojibaseEmoji of data) {\n if (emojibaseEmoji.group === undefined) {\n continue;\n }\n\n const canonicalId = GROUP_TO_CANONICAL[emojibaseEmoji.group];\n if (!canonicalId) {\n continue;\n }\n\n const id = emojibaseEmoji.hexcode;\n emojis[id] = {\n id,\n name: emojibaseEmoji.label,\n keywords: emojibaseEmoji.tags || [],\n emoji: emojibaseEmoji.emoji,\n skins: getSkinVariants(emojibaseEmoji.skins),\n version: emojibaseEmoji.version,\n };\n\n if (!categoryEmojis.has(canonicalId)) {\n categoryEmojis.set(canonicalId, []);\n }\n categoryEmojis.get(canonicalId)!.push(emojibaseEmoji);\n }\n\n const categories: EmojiPickerCategory[] = [];\n for (const canonicalId of CATEGORY_ORDER) {\n const items = categoryEmojis.get(canonicalId);\n if (!items) {\n continue;\n }\n\n items.sort(\n (a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER)\n );\n categories.push({\n id: canonicalId,\n label:\n CANONICAL_CATEGORY_LABELS[canonicalId] || groupLabels.get(items[0].group!) || canonicalId,\n emojis: items.map((item) => item.hexcode),\n });\n }\n\n return { categories, emojis };\n}\n"],"mappings":";;;AAiCA,MAAM,qBAA+E;CACnF,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,MAAM,iBAAiB,uBAAuB,QAC3C,OAAuD,OAAO,UACjE;AAEA,SAAS,eAAe,MAA6B;CACnD,IAAI,OAAO,SAAS,UAClB,OAAO;CAGT,IAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,KAAK,KAAK,OAAO,MAAM,MAAM,KAAK,EAAE,GAC3E,OAAO,KAAK;CAGd,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAoC;CAC3D,IAAI,CAAC,SAAS,MAAM,WAAW,GAC7B;CAGF,MAAM,yBAAS,IAAI,IAAoB;CACvC,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,eAAe,KAAK,IAAI;EACrC,IAAI,SAAS,QAAQ,CAAC,OAAO,IAAI,IAAI,GACnC,OAAO,IAAI,MAAM,KAAK,KAAK;CAE/B;CAEA,MAAM,WAAW;EAAC;EAAG;EAAG;EAAG;EAAG;CAAC,CAAC,CAAC,KAAK,SAAS,OAAO,IAAI,IAAI,CAAC;CAC/D,OAAO,SAAS,OAAO,YAAY,YAAY,KAAA,CAAS,IAAK,WAAwB,KAAA;AACvF;AAEA,SAAgB,iBACd,MACA,UACiB;CACjB,MAAM,SAA2C,CAAC;CAClD,MAAM,iCAAiB,IAAI,IAA8B;CAEzD,MAAM,8BAAc,IAAI,IAAoB;CAC5C,KAAK,MAAM,SAAS,SAAS,QAC3B,YAAY,IAAI,MAAM,OAAO,MAAM,OAAO;CAG5C,KAAK,MAAM,kBAAkB,MAAM;EACjC,IAAI,eAAe,UAAU,KAAA,GAC3B;EAGF,MAAM,cAAc,mBAAmB,eAAe;EACtD,IAAI,CAAC,aACH;EAGF,MAAM,KAAK,eAAe;EAC1B,OAAO,MAAM;GACX;GACA,MAAM,eAAe;GACrB,UAAU,eAAe,QAAQ,CAAC;GAClC,OAAO,eAAe;GACtB,OAAO,gBAAgB,eAAe,KAAK;GAC3C,SAAS,eAAe;EAC1B;EAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,IAAI,aAAa,CAAC,CAAC;EAEpC,eAAe,IAAI,WAAW,CAAC,CAAE,KAAK,cAAc;CACtD;CAEA,MAAM,aAAoC,CAAC;CAC3C,KAAK,MAAM,eAAe,gBAAgB;EACxC,MAAM,QAAQ,eAAe,IAAI,WAAW;EAC5C,IAAI,CAAC,OACH;EAGF,MAAM,MACH,GAAG,OAAO,EAAE,SAAS,OAAO,qBAAqB,EAAE,SAAS,OAAO,iBACtE;EACA,WAAW,KAAK;GACd,IAAI;GACJ,OACE,0BAA0B,gBAAgB,YAAY,IAAI,MAAM,EAAE,CAAC,KAAM,KAAK;GAChF,QAAQ,MAAM,KAAK,SAAS,KAAK,OAAO;EAC1C,CAAC;CACH;CAEA,OAAO;EAAE;EAAY;CAAO;AAC9B"}
@@ -0,0 +1,47 @@
1
+ "use client";
2
+ // packages/@mantine/emoji/src/categories.ts
3
+ const CANONICAL_CATEGORY_IDS = [
4
+ "frequent",
5
+ "people",
6
+ "nature",
7
+ "foods",
8
+ "activity",
9
+ "places",
10
+ "objects",
11
+ "symbols",
12
+ "flags"
13
+ ];
14
+ const CANONICAL_CATEGORY_LABELS = {
15
+ frequent: "Frequently Used",
16
+ people: "Smileys & People",
17
+ nature: "Animals & Nature",
18
+ foods: "Food & Drink",
19
+ activity: "Activity",
20
+ places: "Travel & Places",
21
+ objects: "Objects",
22
+ symbols: "Symbols",
23
+ flags: "Flags"
24
+ };
25
+ const CANONICAL_CATEGORY_ICONS = {
26
+ frequent: "🕐",
27
+ people: "😀",
28
+ nature: "🐻",
29
+ foods: "🍔",
30
+ activity: "⚽",
31
+ places: "🚗",
32
+ objects: "💡",
33
+ symbols: "♻️",
34
+ flags: "🏳️"
35
+ };
36
+ function isCanonicalCategoryId(id) {
37
+ return CANONICAL_CATEGORY_IDS.includes(id);
38
+ }
39
+ function getCanonicalCategoryLabel(id) {
40
+ return isCanonicalCategoryId(id) ? CANONICAL_CATEGORY_LABELS[id] : void 0;
41
+ }
42
+ function getCanonicalCategoryIcon(id) {
43
+ return isCanonicalCategoryId(id) ? CANONICAL_CATEGORY_ICONS[id] : void 0;
44
+ }
45
+ export { CANONICAL_CATEGORY_ICONS, CANONICAL_CATEGORY_IDS, CANONICAL_CATEGORY_LABELS, getCanonicalCategoryIcon, getCanonicalCategoryLabel, isCanonicalCategoryId };
46
+
47
+ //# sourceMappingURL=categories.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.mjs","names":[],"sources":["../src/categories.ts"],"sourcesContent":["export const CANONICAL_CATEGORY_IDS = [\n 'frequent',\n 'people',\n 'nature',\n 'foods',\n 'activity',\n 'places',\n 'objects',\n 'symbols',\n 'flags',\n] as const;\n\nexport type CanonicalCategoryId = (typeof CANONICAL_CATEGORY_IDS)[number];\n\nexport const CANONICAL_CATEGORY_LABELS: Record<CanonicalCategoryId, string> = {\n frequent: 'Frequently Used',\n people: 'Smileys & People',\n nature: 'Animals & Nature',\n foods: 'Food & Drink',\n activity: 'Activity',\n places: 'Travel & Places',\n objects: 'Objects',\n symbols: 'Symbols',\n flags: 'Flags',\n};\n\nexport const CANONICAL_CATEGORY_ICONS: Record<CanonicalCategoryId, string> = {\n frequent: '🕐',\n people: '😀',\n nature: '🐻',\n foods: '🍔',\n activity: '⚽',\n places: '🚗',\n objects: '💡',\n symbols: '♻️',\n flags: '🏳️',\n};\n\nexport function isCanonicalCategoryId(id: string): id is CanonicalCategoryId {\n return (CANONICAL_CATEGORY_IDS as readonly string[]).includes(id);\n}\n\nexport function getCanonicalCategoryLabel(id: string) {\n return isCanonicalCategoryId(id) ? CANONICAL_CATEGORY_LABELS[id] : undefined;\n}\n\nexport function getCanonicalCategoryIcon(id: string) {\n return isCanonicalCategoryId(id) ? CANONICAL_CATEGORY_ICONS[id] : undefined;\n}\n"],"mappings":";;AAAA,MAAa,yBAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,MAAa,4BAAiE;CAC5E,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,UAAU;CACV,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;AACT;AAEA,MAAa,2BAAgE;CAC3E,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,UAAU;CACV,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;AACT;AAEA,SAAgB,sBAAsB,IAAuC;CAC3E,OAAQ,uBAA6C,SAAS,EAAE;AAClE;AAEA,SAAgB,0BAA0B,IAAY;CACpD,OAAO,sBAAsB,EAAE,IAAI,0BAA0B,MAAM,KAAA;AACrE;AAEA,SAAgB,yBAAyB,IAAY;CACnD,OAAO,sBAAsB,EAAE,IAAI,yBAAyB,MAAM,KAAA;AACpE"}