@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,38 @@
1
+ "use client";
2
+ const require_categories = require("../../categories.cjs");
3
+ const require_EmojiPicker_context = require("./EmojiPicker.context.cjs");
4
+ let react = require("react");
5
+ let _mantine_core = require("@mantine/core");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ // packages/@mantine/emoji/src/components/EmojiPicker/EmojiPickerCategoryNav.tsx
8
+ const EmojiPickerCategoryNav = (0, react.memo)(function EmojiPickerCategoryNav({ categories, onCategoryClick }) {
9
+ const ctx = require_EmojiPicker_context.useEmojiPickerContext();
10
+ const { dir } = (0, _mantine_core.useDirection)();
11
+ const [tabStopId, setTabStopId] = (0, react.useState)(null);
12
+ const tabStopIndex = Math.max(categories.findIndex((category) => category.id === tabStopId), 0);
13
+ const handleKeyDown = (0, _mantine_core.createScopedKeydownHandler)({
14
+ siblingSelector: "[data-category-nav-button]",
15
+ parentSelector: "[data-category-nav]",
16
+ orientation: "horizontal",
17
+ loop: true,
18
+ dir
19
+ });
20
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
21
+ ...ctx.getStyles("categoryNav"),
22
+ "data-category-nav": true,
23
+ children: categories.map((category, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.UnstyledButton, {
24
+ ...ctx.getStyles("categoryNavButton"),
25
+ "aria-label": category.label,
26
+ title: category.label,
27
+ tabIndex: index === tabStopIndex ? 0 : -1,
28
+ "data-category-nav-button": true,
29
+ onFocus: () => setTabStopId(category.id),
30
+ onKeyDown: handleKeyDown,
31
+ onClick: () => onCategoryClick(category.id),
32
+ children: require_categories.getCanonicalCategoryIcon(category.id) || "📁"
33
+ }, category.id))
34
+ });
35
+ });
36
+ exports.EmojiPickerCategoryNav = EmojiPickerCategoryNav;
37
+
38
+ //# sourceMappingURL=EmojiPickerCategoryNav.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerCategoryNav.cjs","names":["memo","useEmojiPickerContext","useDirection","useState","createScopedKeydownHandler","UnstyledButton","getCanonicalCategoryIcon"],"sources":["../../../src/components/EmojiPicker/EmojiPickerCategoryNav.tsx"],"sourcesContent":["import { memo, useState } from 'react';\nimport { createScopedKeydownHandler, UnstyledButton, useDirection } from '@mantine/core';\nimport { getCanonicalCategoryIcon } from '../../categories';\nimport { useEmojiPickerContext } from './EmojiPicker.context';\n\nexport interface EmojiPickerNavCategory {\n id: string;\n label: string;\n}\n\ninterface EmojiPickerCategoryNavProps {\n categories: EmojiPickerNavCategory[];\n onCategoryClick: (categoryId: string) => void;\n}\n\nexport const EmojiPickerCategoryNav = memo(function EmojiPickerCategoryNav({\n categories,\n onCategoryClick,\n}: EmojiPickerCategoryNavProps) {\n const ctx = useEmojiPickerContext();\n const { dir } = useDirection();\n const [tabStopId, setTabStopId] = useState<string | null>(null);\n const tabStopIndex = Math.max(\n categories.findIndex((category) => category.id === tabStopId),\n 0\n );\n\n const handleKeyDown = createScopedKeydownHandler({\n siblingSelector: '[data-category-nav-button]',\n parentSelector: '[data-category-nav]',\n orientation: 'horizontal',\n loop: true,\n dir,\n });\n\n return (\n <div {...ctx.getStyles('categoryNav')} data-category-nav>\n {categories.map((category, index) => (\n <UnstyledButton\n key={category.id}\n {...ctx.getStyles('categoryNavButton')}\n aria-label={category.label}\n title={category.label}\n tabIndex={index === tabStopIndex ? 0 : -1}\n data-category-nav-button\n onFocus={() => setTabStopId(category.id)}\n onKeyDown={handleKeyDown}\n onClick={() => onCategoryClick(category.id)}\n >\n {getCanonicalCategoryIcon(category.id) || '📁'}\n </UnstyledButton>\n ))}\n </div>\n );\n});\n"],"mappings":";;;;;;;AAeA,MAAa,0BAAA,GAAyBA,MAAAA,KAAAA,CAAK,SAAS,uBAAuB,EACzE,YACA,mBAC8B;CAC9B,MAAM,MAAMC,4BAAAA,sBAAsB;CAClC,MAAM,EAAE,SAAA,GAAQC,cAAAA,aAAAA,CAAa;CAC7B,MAAM,CAAC,WAAW,iBAAA,GAAgBC,MAAAA,SAAAA,CAAwB,IAAI;CAC9D,MAAM,eAAe,KAAK,IACxB,WAAW,WAAW,aAAa,SAAS,OAAO,SAAS,GAC5D,CACF;CAEA,MAAM,iBAAA,GAAgBC,cAAAA,2BAAAA,CAA2B;EAC/C,iBAAiB;EACjB,gBAAgB;EAChB,aAAa;EACb,MAAM;EACN;CACF,CAAC;CAED,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,GAAI,IAAI,UAAU,aAAa;EAAG,qBAAA;EACpC,UAAA,WAAW,KAAK,UAAU,UACzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,gBAAD;GAEE,GAAI,IAAI,UAAU,mBAAmB;GACrC,cAAY,SAAS;GACrB,OAAO,SAAS;GAChB,UAAU,UAAU,eAAe,IAAI;GACvC,4BAAA;GACA,eAAe,aAAa,SAAS,EAAE;GACvC,WAAW;GACX,eAAe,gBAAgB,SAAS,EAAE;GAEzCC,UAAAA,mBAAAA,yBAAyB,SAAS,EAAE,KAAK;EAC5B,GAXT,SAAS,EAWA,CACjB;CACE,CAAA;AAET,CAAC"}
@@ -0,0 +1,131 @@
1
+ "use client";
2
+ const require_EmojiPicker_context = require("./EmojiPicker.context.cjs");
3
+ const require_EmojiButton = require("./EmojiButton.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
+ let _tanstack_react_virtual = require("@tanstack/react-virtual");
9
+ // packages/@mantine/emoji/src/components/EmojiPicker/EmojiPickerGrid.tsx
10
+ const HEADER_HEIGHT = 32;
11
+ const DEFAULT_SCROLL_AREA_HEIGHT = 300;
12
+ function getEmojiIndexFromEvent(event) {
13
+ const target = event.target.closest("[data-emoji-index]");
14
+ return target ? Number(target.dataset.emojiIndex) : -1;
15
+ }
16
+ function EmojiPickerGrid({ items, itemOffsets, columns, skinTone, focusedIndex, focusedItemIndex, idPrefix, gridId, onActiveDescendantChange, emojiSize, emptyContent, onKeyDown, onPointerIndex, onEmojiClick, scrollToItemRef, scrollAreaProps }) {
17
+ const ctx = require_EmojiPicker_context.useEmojiPickerContext();
18
+ const viewportRef = (0, react.useRef)(null);
19
+ const lastPointerRef = (0, react.useRef)(null);
20
+ const virtualizer = (0, _tanstack_react_virtual.useVirtualizer)({
21
+ count: items.length,
22
+ getScrollElement: () => viewportRef.current,
23
+ estimateSize: (index) => items[index].type === "header" ? HEADER_HEIGHT : emojiSize,
24
+ overscan: 10
25
+ });
26
+ (0, react.useEffect)(() => {
27
+ virtualizer.measure();
28
+ }, [emojiSize, virtualizer]);
29
+ (0, react.useEffect)(() => {
30
+ scrollToItemRef.current = (itemIndex, align) => {
31
+ virtualizer.scrollToIndex(itemIndex, { align });
32
+ };
33
+ }, [virtualizer, scrollToItemRef]);
34
+ const virtualItems = virtualizer.getVirtualItems();
35
+ const focusedItemMounted = focusedIndex !== -1 && virtualItems.some((item) => item.index === focusedItemIndex);
36
+ const hasEmojis = items.length > 0;
37
+ const activeDescendant = hasEmojis && focusedItemMounted ? `${idPrefix}-${focusedIndex}` : void 0;
38
+ (0, _mantine_hooks.useIsomorphicEffect)(() => {
39
+ onActiveDescendantChange(activeDescendant);
40
+ }, [activeDescendant, onActiveDescendantChange]);
41
+ const handleMouseMove = (event) => {
42
+ const last = lastPointerRef.current;
43
+ if (last && last.x === event.clientX && last.y === event.clientY) return;
44
+ lastPointerRef.current = {
45
+ x: event.clientX,
46
+ y: event.clientY
47
+ };
48
+ const index = getEmojiIndexFromEvent(event);
49
+ if (index !== -1) onPointerIndex(index);
50
+ };
51
+ const handleMouseDown = (event) => {
52
+ if (getEmojiIndexFromEvent(event) !== -1) event.preventDefault();
53
+ };
54
+ const handleClick = (event) => {
55
+ const index = getEmojiIndexFromEvent(event);
56
+ if (index !== -1) onEmojiClick(index);
57
+ };
58
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.ScrollArea, {
59
+ scrollbars: "y",
60
+ ...scrollAreaProps,
61
+ ...ctx.getStyles("content", { style: {
62
+ height: DEFAULT_SCROLL_AREA_HEIGHT,
63
+ ...scrollAreaProps?.style
64
+ } }),
65
+ viewportRef,
66
+ viewportProps: {
67
+ ...scrollAreaProps?.viewportProps,
68
+ ...hasEmojis ? {
69
+ id: gridId,
70
+ role: "grid",
71
+ tabIndex: 0,
72
+ "aria-label": ctx.labels.emojis,
73
+ "aria-colcount": columns,
74
+ "aria-activedescendant": activeDescendant,
75
+ onKeyDown,
76
+ onMouseMove: handleMouseMove,
77
+ onMouseDown: handleMouseDown,
78
+ onClick: handleClick
79
+ } : { tabIndex: -1 }
80
+ },
81
+ children: hasEmojis ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
82
+ style: {
83
+ height: virtualizer.getTotalSize(),
84
+ width: "100%",
85
+ position: "relative"
86
+ },
87
+ children: virtualItems.map((virtualItem) => {
88
+ const item = items[virtualItem.index];
89
+ const positionStyle = {
90
+ position: "absolute",
91
+ top: 0,
92
+ left: 0,
93
+ width: "100%",
94
+ height: virtualItem.size,
95
+ transform: `translateY(${virtualItem.start}px)`
96
+ };
97
+ if (item.type === "header") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
98
+ role: "row",
99
+ ...ctx.getStyles("categoryLabel", { style: positionStyle }),
100
+ "data-category": item.categoryId,
101
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
102
+ role: "columnheader",
103
+ "aria-colspan": columns,
104
+ children: item.label
105
+ })
106
+ }, `header-${item.categoryId}`);
107
+ const emojiOffset = itemOffsets[virtualItem.index];
108
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
109
+ role: "row",
110
+ ...ctx.getStyles("grid", { style: positionStyle }),
111
+ children: item.emojis.map((emoji, colIndex) => {
112
+ const emojiIndex = emojiOffset + colIndex;
113
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_EmojiButton.EmojiButton, {
114
+ emoji,
115
+ skinTone,
116
+ emojiIndex,
117
+ focused: emojiIndex === focusedIndex,
118
+ id: `${idPrefix}-${emojiIndex}`
119
+ }, emoji.id);
120
+ })
121
+ }, `row-${virtualItem.index}`);
122
+ })
123
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
124
+ ...ctx.getStyles("empty"),
125
+ children: emptyContent
126
+ })
127
+ });
128
+ }
129
+ exports.EmojiPickerGrid = EmojiPickerGrid;
130
+
131
+ //# sourceMappingURL=EmojiPickerGrid.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerGrid.cjs","names":["useEmojiPickerContext","useRef","useVirtualizer","ScrollArea","EmojiButton"],"sources":["../../../src/components/EmojiPicker/EmojiPickerGrid.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { ScrollArea, ScrollAreaProps } from '@mantine/core';\nimport { useIsomorphicEffect } from '@mantine/hooks';\nimport type { FlattenedRowItem } from '../../types';\nimport { EmojiButton } from './EmojiButton';\nimport { useEmojiPickerContext } from './EmojiPicker.context';\n\nexport type EmojiPickerScrollToItem = (itemIndex: number, align: 'auto' | 'start') => void;\n\ninterface EmojiPickerGridProps {\n items: FlattenedRowItem[];\n itemOffsets: number[];\n columns: number;\n skinTone: number;\n focusedIndex: number;\n focusedItemIndex: number;\n idPrefix: string;\n gridId: string;\n onActiveDescendantChange: (id: string | undefined) => void;\n emojiSize: number;\n emptyContent: React.ReactNode;\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n onPointerIndex: (index: number) => void;\n onEmojiClick: (index: number) => void;\n scrollToItemRef: React.RefObject<EmojiPickerScrollToItem | null>;\n scrollAreaProps?: ScrollAreaProps;\n}\n\nconst HEADER_HEIGHT = 32;\nconst DEFAULT_SCROLL_AREA_HEIGHT = 300;\n\nfunction getEmojiIndexFromEvent(event: React.SyntheticEvent) {\n const target = (event.target as HTMLElement).closest<HTMLElement>('[data-emoji-index]');\n return target ? Number(target.dataset.emojiIndex) : -1;\n}\n\nexport function EmojiPickerGrid({\n items,\n itemOffsets,\n columns,\n skinTone,\n focusedIndex,\n focusedItemIndex,\n idPrefix,\n gridId,\n onActiveDescendantChange,\n emojiSize,\n emptyContent,\n onKeyDown,\n onPointerIndex,\n onEmojiClick,\n scrollToItemRef,\n scrollAreaProps,\n}: EmojiPickerGridProps) {\n const ctx = useEmojiPickerContext();\n const viewportRef = useRef<HTMLDivElement>(null);\n const lastPointerRef = useRef<{ x: number; y: number } | null>(null);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => viewportRef.current,\n estimateSize: (index) => (items[index].type === 'header' ? HEADER_HEIGHT : emojiSize),\n overscan: 10,\n });\n\n useEffect(() => {\n virtualizer.measure();\n }, [emojiSize, virtualizer]);\n\n useEffect(() => {\n scrollToItemRef.current = (itemIndex, align) => {\n virtualizer.scrollToIndex(itemIndex, { align });\n };\n }, [virtualizer, scrollToItemRef]);\n\n const virtualItems = virtualizer.getVirtualItems();\n const focusedItemMounted =\n focusedIndex !== -1 && virtualItems.some((item) => item.index === focusedItemIndex);\n const hasEmojis = items.length > 0;\n const activeDescendant =\n hasEmojis && focusedItemMounted ? `${idPrefix}-${focusedIndex}` : undefined;\n\n useIsomorphicEffect(() => {\n onActiveDescendantChange(activeDescendant);\n }, [activeDescendant, onActiveDescendantChange]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const last = lastPointerRef.current;\n if (last && last.x === event.clientX && last.y === event.clientY) {\n return;\n }\n lastPointerRef.current = { x: event.clientX, y: event.clientY };\n const index = getEmojiIndexFromEvent(event);\n if (index !== -1) {\n onPointerIndex(index);\n }\n };\n\n const handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n if (getEmojiIndexFromEvent(event) !== -1) {\n event.preventDefault();\n }\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const index = getEmojiIndexFromEvent(event);\n if (index !== -1) {\n onEmojiClick(index);\n }\n };\n\n return (\n <ScrollArea\n scrollbars=\"y\"\n {...scrollAreaProps}\n {...ctx.getStyles('content', {\n style: { height: DEFAULT_SCROLL_AREA_HEIGHT, ...scrollAreaProps?.style },\n })}\n viewportRef={viewportRef}\n viewportProps={{\n ...scrollAreaProps?.viewportProps,\n ...(hasEmojis\n ? {\n id: gridId,\n role: 'grid',\n tabIndex: 0,\n 'aria-label': ctx.labels.emojis,\n 'aria-colcount': columns,\n 'aria-activedescendant': activeDescendant,\n onKeyDown,\n onMouseMove: handleMouseMove,\n onMouseDown: handleMouseDown,\n onClick: handleClick,\n }\n : { tabIndex: -1 }),\n }}\n >\n {hasEmojis ? (\n <div style={{ height: virtualizer.getTotalSize(), width: '100%', position: 'relative' }}>\n {virtualItems.map((virtualItem) => {\n const item = items[virtualItem.index];\n const positionStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: virtualItem.size,\n transform: `translateY(${virtualItem.start}px)`,\n };\n\n if (item.type === 'header') {\n return (\n <div\n key={`header-${item.categoryId}`}\n role=\"row\"\n {...ctx.getStyles('categoryLabel', { style: positionStyle })}\n data-category={item.categoryId}\n >\n <span role=\"columnheader\" aria-colspan={columns}>\n {item.label}\n </span>\n </div>\n );\n }\n\n const emojiOffset = itemOffsets[virtualItem.index];\n\n return (\n <div\n key={`row-${virtualItem.index}`}\n role=\"row\"\n {...ctx.getStyles('grid', { style: positionStyle })}\n >\n {item.emojis.map((emoji, colIndex) => {\n const emojiIndex = emojiOffset + colIndex;\n return (\n <EmojiButton\n key={emoji.id}\n emoji={emoji}\n skinTone={skinTone}\n emojiIndex={emojiIndex}\n focused={emojiIndex === focusedIndex}\n id={`${idPrefix}-${emojiIndex}`}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n ) : (\n <div {...ctx.getStyles('empty')}>{emptyContent}</div>\n )}\n </ScrollArea>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ const require_emoji_grid_utils = require("../../utils/emoji-grid-utils.cjs");
3
+ const require_EmojiPicker_context = require("./EmojiPicker.context.cjs");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+ // packages/@mantine/emoji/src/components/EmojiPicker/EmojiPickerPreview.tsx
6
+ function EmojiPickerPreview({ emoji, skinTone, withPreview, children }) {
7
+ const ctx = require_EmojiPicker_context.useEmojiPickerContext();
8
+ const displayEmoji = emoji ? require_emoji_grid_utils.applySkinTone(emoji, skinTone) : null;
9
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10
+ ...ctx.getStyles("preview"),
11
+ role: withPreview ? "group" : void 0,
12
+ "aria-label": withPreview ? ctx.labels.preview : void 0,
13
+ children: [withPreview && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
14
+ ...ctx.getStyles("previewEmoji"),
15
+ children: displayEmoji?.emoji
16
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
17
+ ...ctx.getStyles("previewName"),
18
+ children: displayEmoji?.name
19
+ })] }), children]
20
+ });
21
+ }
22
+ exports.EmojiPickerPreview = EmojiPickerPreview;
23
+
24
+ //# sourceMappingURL=EmojiPickerPreview.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerPreview.cjs","names":["useEmojiPickerContext","applySkinTone"],"sources":["../../../src/components/EmojiPicker/EmojiPickerPreview.tsx"],"sourcesContent":["import type { EmojiPickerEmoji } from '../../types';\nimport { applySkinTone } from '../../utils';\nimport { useEmojiPickerContext } from './EmojiPicker.context';\n\ninterface EmojiPickerPreviewProps {\n emoji: EmojiPickerEmoji | null;\n skinTone: number;\n withPreview: boolean;\n children?: React.ReactNode;\n}\n\nexport function EmojiPickerPreview({\n emoji,\n skinTone,\n withPreview,\n children,\n}: EmojiPickerPreviewProps) {\n const ctx = useEmojiPickerContext();\n const displayEmoji = emoji ? applySkinTone(emoji, skinTone) : null;\n\n return (\n <div\n {...ctx.getStyles('preview')}\n role={withPreview ? 'group' : undefined}\n aria-label={withPreview ? ctx.labels.preview : undefined}\n >\n {withPreview && (\n <>\n <span {...ctx.getStyles('previewEmoji')}>{displayEmoji?.emoji}</span>\n <span {...ctx.getStyles('previewName')}>{displayEmoji?.name}</span>\n </>\n )}\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;AAWA,SAAgB,mBAAmB,EACjC,OACA,UACA,aACA,YAC0B;CAC1B,MAAM,MAAMA,4BAAAA,sBAAsB;CAClC,MAAM,eAAe,QAAQC,yBAAAA,cAAc,OAAO,QAAQ,IAAI;CAE9D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,GAAI,IAAI,UAAU,SAAS;EAC3B,MAAM,cAAc,UAAU,KAAA;EAC9B,cAAY,cAAc,IAAI,OAAO,UAAU,KAAA;EAHjD,UAAA,CAKG,eACC,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,GAAI,IAAI,UAAU,cAAc;GAAI,UAAA,cAAc;EAAY,CAAA,GACpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,GAAI,IAAI,UAAU,aAAa;GAAI,UAAA,cAAc;EAAW,CAAA,CAClE,EAAA,CAAA,GAEH,QACE;;AAET"}
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ const require_EmojiPicker_context = require("./EmojiPicker.context.cjs");
3
+ let react = require("react");
4
+ let _mantine_core = require("@mantine/core");
5
+ let _mantine_hooks = require("@mantine/hooks");
6
+ let react_jsx_runtime = require("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 = require_EmojiPicker_context.useEmojiPickerContext();
18
+ const localRef = (0, react.useRef)(null);
19
+ const mergedRef = (0, _mantine_hooks.useMergedRef)(localRef, inputRef);
20
+ (0, react.useEffect)(() => {
21
+ if (autoFocus) localRef.current?.focus({ preventScroll: true });
22
+ }, []);
23
+ const handleClear = () => {
24
+ onQueryChange("");
25
+ localRef.current?.focus();
26
+ };
27
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
28
+ ...ctx.getStyles("search"),
29
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.InputWrapperContext, {
30
+ value: RESET_WRAPPER_CONTEXT,
31
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.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__ */ (0, react_jsx_runtime.jsx)(_mantine_core.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
+ exports.EmojiPickerSearch = EmojiPickerSearch;
56
+
57
+ //# sourceMappingURL=EmojiPickerSearch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerSearch.cjs","names":["useEmojiPickerContext","useRef","useMergedRef","InputWrapperContext","Input","CloseButton"],"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,MAAMA,4BAAAA,sBAAsB;CAClC,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAAyB,IAAI;CAC9C,MAAM,aAAA,GAAYC,eAAAA,aAAAA,CAAa,UAAU,QAAQ;CAEjD,CAAA,GAAA,MAAA,UAAA,OAAgB;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,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,GAAI,IAAI,UAAU,QAAQ;EAC7B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,qBAAD;GAAqB,OAAO;GAC1B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,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,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,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
+ const require_EmojiPicker_context = require("./EmojiPicker.context.cjs");
3
+ let react = require("react");
4
+ let _mantine_core = require("@mantine/core");
5
+ let react_jsx_runtime = require("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 = require_EmojiPicker_context.useEmojiPickerContext();
25
+ const [opened, setOpened] = (0, react.useState)(false);
26
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mantine_core.Popover, {
27
+ opened,
28
+ onChange: setOpened,
29
+ position: "top",
30
+ withArrow: true,
31
+ withinPortal: false,
32
+ trapFocus: true,
33
+ returnFocus: true,
34
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Popover.Target, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.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__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Popover.Dropdown, {
41
+ ...ctx.getStyles("skinToneDropdown"),
42
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
43
+ ...ctx.getStyles("skinToneSelector"),
44
+ children: SKIN_TONE_EMOJIS.map((emoji, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.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
+ exports.EmojiPickerSkinTone = EmojiPickerSkinTone;
62
+
63
+ //# sourceMappingURL=EmojiPickerSkinTone.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerSkinTone.cjs","names":["useEmojiPickerContext","useState","Popover","UnstyledButton"],"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,MAAMA,4BAAAA,sBAAsB;CAClC,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAS,KAAK;CAE1C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,cAAAA,SAAD;EACU;EACR,UAAU;EACV,UAAS;EACT,WAAA;EACA,cAAc;EACd,WAAA;EACA,aAAA;EAPF,UAAA,CASE,iBAAA,GAAA,kBAAA,IAAA,CAACA,cAAAA,QAAQ,QAAT,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,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,iBAAA,GAAA,kBAAA,IAAA,CAACD,cAAAA,QAAQ,UAAT;GAAkB,GAAI,IAAI,UAAU,kBAAkB;GACpD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,GAAI,IAAI,UAAU,kBAAkB;IACtC,UAAA,iBAAiB,KAAK,OAAO,UAC5B,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,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
+ const require_EmojiPicker = require("../EmojiPicker/EmojiPicker.cjs");
3
+ const require_EmojiPickerInput_module = require("./EmojiPickerInput.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/EmojiPickerInput/EmojiPickerInput.tsx
9
+ const defaultProps = {
10
+ closeOnSelect: true,
11
+ clearable: false,
12
+ size: "sm"
13
+ };
14
+ const varsResolver = (0, _mantine_core.createVarsResolver)(() => ({ root: {} }));
15
+ const EmojiPickerInput = (0, _mantine_core.factory)((_props) => {
16
+ const props = (0, _mantine_core.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 } = (0, _mantine_core.extractStyleProps)(others);
19
+ const inputRef = (0, react.useRef)(null);
20
+ const mergedRef = (0, _mantine_hooks.useMergedRef)(inputRef, ref);
21
+ const getStyles = (0, _mantine_core.useStyles)({
22
+ name: "EmojiPickerInput",
23
+ props,
24
+ classes: require_EmojiPickerInput_module.default,
25
+ classNames,
26
+ styles,
27
+ unstyled,
28
+ vars,
29
+ varsResolver
30
+ });
31
+ const { resolvedClassNames, resolvedStyles } = (0, _mantine_core.useResolvedStylesApi)({
32
+ classNames,
33
+ styles,
34
+ props
35
+ });
36
+ const [value, setValue] = (0, _mantine_hooks.useUncontrolled)({
37
+ value: valueProp,
38
+ defaultValue: defaultValue ?? null,
39
+ onChange
40
+ });
41
+ const [opened, setOpened] = (0, _mantine_hooks.useUncontrolled)({
42
+ value: openedProp,
43
+ defaultValue: defaultOpened,
44
+ finalValue: false,
45
+ onChange: onOpenedChange
46
+ });
47
+ const [skinTone, setSkinTone] = (0, _mantine_hooks.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] = (0, react.useState)(null);
55
+ const [prevValue, setPrevValue] = (0, react.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 = (0, react.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__ */ (0, react_jsx_runtime.jsxs)("span", {
84
+ ...getStyles("inputValue"),
85
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
86
+ ...getStyles("inputEmoji"),
87
+ children: displayedEmoji
88
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
89
+ ...getStyles("inputEmojiName"),
90
+ children: selectedEmoji.name
91
+ })]
92
+ }) : null;
93
+ const clearButton = clearable && selectedEmoji && !readOnly && !disabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.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 = (0, _mantine_hooks.useId)(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__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Input.Wrapper, {
133
+ ...wrapperProps,
134
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mantine_core.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__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Popover.Target, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.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__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Input.Placeholder, { children: placeholder })
169
+ }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Popover.Dropdown, {
170
+ ...getStyles("dropdown"),
171
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_EmojiPicker.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
+ ..._mantine_core.InputBase.classes,
185
+ ...require_EmojiPickerInput_module.default
186
+ };
187
+ EmojiPickerInput.displayName = "@mantine/emoji/EmojiPickerInput";
188
+ exports.EmojiPickerInput = EmojiPickerInput;
189
+
190
+ //# sourceMappingURL=EmojiPickerInput.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerInput.cjs","names":["createVarsResolver","factory","useProps","extractStyleProps","useRef","useMergedRef","useStyles","useResolvedStylesApi","useUncontrolled","useState","useCallback","Input","useId","Popover","EmojiPicker","InputBase","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
+ exports.default = EmojiPickerInput_module_default;
10
+
11
+ //# sourceMappingURL=EmojiPickerInput.module.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPickerInput.module.cjs","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":""}