@dxos/react-ui-pickers 0.7.5-labs.071a3e2

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 (38) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +3 -0
  3. package/dist/lib/browser/index.css +7 -0
  4. package/dist/lib/browser/index.css.map +7 -0
  5. package/dist/lib/browser/index.mjs +268 -0
  6. package/dist/lib/browser/index.mjs.map +7 -0
  7. package/dist/lib/browser/meta.json +1 -0
  8. package/dist/lib/node/index.cjs +302 -0
  9. package/dist/lib/node/index.cjs.map +7 -0
  10. package/dist/lib/node/index.css +7 -0
  11. package/dist/lib/node/index.css.map +7 -0
  12. package/dist/lib/node/meta.json +1 -0
  13. package/dist/lib/node-esm/index.css +7 -0
  14. package/dist/lib/node-esm/index.css.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +270 -0
  16. package/dist/lib/node-esm/index.mjs.map +7 -0
  17. package/dist/lib/node-esm/meta.json +1 -0
  18. package/dist/types/src/components/EmojiPicker.d.ts +19 -0
  19. package/dist/types/src/components/EmojiPicker.d.ts.map +1 -0
  20. package/dist/types/src/components/EmojiPicker.stories.d.ts +8 -0
  21. package/dist/types/src/components/EmojiPicker.stories.d.ts.map +1 -0
  22. package/dist/types/src/components/HuePicker.d.ts +18 -0
  23. package/dist/types/src/components/HuePicker.d.ts.map +1 -0
  24. package/dist/types/src/components/HuePicker.stories.d.ts +8 -0
  25. package/dist/types/src/components/HuePicker.stories.d.ts.map +1 -0
  26. package/dist/types/src/components/index.d.ts +3 -0
  27. package/dist/types/src/components/index.d.ts.map +1 -0
  28. package/dist/types/src/index.d.ts +2 -0
  29. package/dist/types/src/index.d.ts.map +1 -0
  30. package/dist/types/tsconfig.tsbuildinfo +1 -0
  31. package/package.json +52 -0
  32. package/src/components/EmojiPicker.stories.tsx +59 -0
  33. package/src/components/EmojiPicker.tsx +189 -0
  34. package/src/components/HuePicker.stories.tsx +55 -0
  35. package/src/components/HuePicker.tsx +184 -0
  36. package/src/components/emoji.css +25 -0
  37. package/src/components/index.ts +6 -0
  38. package/src/index.ts +5 -0
@@ -0,0 +1,270 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/ui/react-ui-pickers/src/components/EmojiPicker.tsx
4
+ import emojiData from "@emoji-mart/data";
5
+ import EmojiMart from "@emoji-mart/react";
6
+ import { ArrowCounterClockwise, CaretDown, UserCircle } from "@phosphor-icons/react";
7
+ import { useControllableState } from "@radix-ui/react-use-controllable-state";
8
+ import React, { useRef, useState } from "react";
9
+ import { Button, Popover, Toolbar, Tooltip, useMediaQuery, useThemeContext, useTranslation } from "@dxos/react-ui";
10
+ import { getSize } from "@dxos/react-ui-theme";
11
+ var EmojiPickerToolbarButton = ({ disabled, defaultEmoji, emoji, onChangeEmoji, classNames }) => {
12
+ const { t } = useTranslation("os");
13
+ const { themeMode } = useThemeContext();
14
+ const [_emojiValue, setEmojiValue] = useControllableState({
15
+ prop: emoji,
16
+ onChange: onChangeEmoji,
17
+ defaultProp: defaultEmoji
18
+ });
19
+ const [emojiPickerOpen, setEmojiPickerOpen] = useState(false);
20
+ const suppressNextTooltip = useRef(false);
21
+ const [triggerTooltipOpen, setTriggerTooltipOpen] = useState(false);
22
+ return /* @__PURE__ */ React.createElement(Tooltip.Root, {
23
+ open: triggerTooltipOpen,
24
+ onOpenChange: (nextOpen) => {
25
+ if (suppressNextTooltip.current) {
26
+ setTriggerTooltipOpen(false);
27
+ suppressNextTooltip.current = false;
28
+ } else {
29
+ setTriggerTooltipOpen(nextOpen);
30
+ }
31
+ }
32
+ }, /* @__PURE__ */ React.createElement(Popover.Root, {
33
+ open: emojiPickerOpen,
34
+ onOpenChange: (nextOpen) => {
35
+ setEmojiPickerOpen(nextOpen);
36
+ suppressNextTooltip.current = true;
37
+ }
38
+ }, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
39
+ asChild: true
40
+ }, /* @__PURE__ */ React.createElement(Popover.Trigger, {
41
+ asChild: true
42
+ }, /* @__PURE__ */ React.createElement(Toolbar.Button, {
43
+ classNames: [
44
+ "gap-2 text-2xl plb-1",
45
+ classNames
46
+ ],
47
+ disabled
48
+ }, /* @__PURE__ */ React.createElement("span", {
49
+ className: "sr-only"
50
+ }, t("select emoji label")), /* @__PURE__ */ React.createElement(UserCircle, {
51
+ className: getSize(5)
52
+ })))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
53
+ side: "bottom"
54
+ }, t("select emoji label"), /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))), /* @__PURE__ */ React.createElement(Popover.Portal, null, /* @__PURE__ */ React.createElement(Popover.Content, {
55
+ side: "bottom",
56
+ onKeyDownCapture: (event) => {
57
+ if (event.key === "Escape") {
58
+ event.stopPropagation();
59
+ setEmojiPickerOpen(false);
60
+ suppressNextTooltip.current = true;
61
+ }
62
+ }
63
+ }, /* @__PURE__ */ React.createElement(EmojiMart, {
64
+ data: emojiData,
65
+ onEmojiSelect: ({ native }) => {
66
+ if (native) {
67
+ setEmojiValue(native);
68
+ setEmojiPickerOpen(false);
69
+ }
70
+ },
71
+ autoFocus: true,
72
+ maxFrequentRows: 0,
73
+ noCountryFlags: true,
74
+ theme: themeMode
75
+ }), /* @__PURE__ */ React.createElement(Popover.Arrow, null)))));
76
+ };
77
+ var EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }) => {
78
+ const { t } = useTranslation("os");
79
+ const [isMd] = useMediaQuery("md", {
80
+ ssr: false
81
+ });
82
+ const [emojiValue, setEmojiValue] = useControllableState({
83
+ prop: emoji,
84
+ onChange: onChangeEmoji,
85
+ defaultProp: defaultEmoji
86
+ });
87
+ const [emojiPickerOpen, setEmojiPickerOpen] = useState(false);
88
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Popover.Root, {
89
+ open: emojiPickerOpen,
90
+ onOpenChange: setEmojiPickerOpen
91
+ }, /* @__PURE__ */ React.createElement(Popover.Trigger, {
92
+ asChild: true
93
+ }, /* @__PURE__ */ React.createElement(Button, {
94
+ variant: "ghost",
95
+ classNames: "gap-2 text-2xl plb-1",
96
+ disabled
97
+ }, /* @__PURE__ */ React.createElement("span", {
98
+ className: "sr-only"
99
+ }, t("select emoji label")), /* @__PURE__ */ React.createElement("span", {
100
+ className: "grow pis-14"
101
+ }, emojiValue), /* @__PURE__ */ React.createElement(CaretDown, {
102
+ className: getSize(4)
103
+ }))), /* @__PURE__ */ React.createElement(Popover.Content, {
104
+ side: "right",
105
+ sideOffset: isMd ? 0 : -310,
106
+ onKeyDownCapture: (event) => {
107
+ if (event.key === "Escape") {
108
+ event.stopPropagation();
109
+ setEmojiPickerOpen(false);
110
+ }
111
+ }
112
+ }, /* @__PURE__ */ React.createElement(EmojiMart, {
113
+ data: emojiData,
114
+ onEmojiSelect: ({ native }) => {
115
+ if (native) {
116
+ setEmojiValue(native);
117
+ setEmojiPickerOpen(false);
118
+ }
119
+ },
120
+ autoFocus: true,
121
+ maxFrequentRows: 0,
122
+ noCountryFlags: true
123
+ }), /* @__PURE__ */ React.createElement(Popover.Arrow, null))), /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
124
+ asChild: true
125
+ }, /* @__PURE__ */ React.createElement(Button, {
126
+ variant: "ghost",
127
+ onClick: onClickClear,
128
+ disabled
129
+ }, /* @__PURE__ */ React.createElement("span", {
130
+ className: "sr-only"
131
+ }, t("clear label")), /* @__PURE__ */ React.createElement(ArrowCounterClockwise, null))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
132
+ side: "right"
133
+ }, t("clear label"), /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))));
134
+ };
135
+
136
+ // packages/ui/react-ui-pickers/src/components/HuePicker.tsx
137
+ import { ArrowCounterClockwise as ArrowCounterClockwise2, CaretDown as CaretDown2, Check, Palette } from "@phosphor-icons/react";
138
+ import { useControllableState as useControllableState2 } from "@radix-ui/react-use-controllable-state";
139
+ import React2, { useRef as useRef2, useState as useState2 } from "react";
140
+ import { Button as Button2, DropdownMenu, Toolbar as Toolbar2, Tooltip as Tooltip2, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
141
+ import { getSize as getSize2, hueTokenThemes, mx } from "@dxos/react-ui-theme";
142
+ var HuePreview = ({ hue }) => {
143
+ const { tx } = useThemeContext2();
144
+ const size = 20;
145
+ return /* @__PURE__ */ React2.createElement("svg", {
146
+ width: size,
147
+ height: size,
148
+ viewBox: `0 0 ${size} ${size}`
149
+ }, /* @__PURE__ */ React2.createElement("rect", {
150
+ x: 0,
151
+ y: 0,
152
+ width: size,
153
+ height: size,
154
+ className: tx("hue.fill", "select--hue__preview", {
155
+ hue
156
+ })
157
+ }));
158
+ };
159
+ var hueTokens = Object.keys(hueTokenThemes).slice(0, 16);
160
+ var HuePickerToolbarButton = ({ disabled, hue, onChangeHue, classNames, defaultHue }) => {
161
+ const { t } = useTranslation2("os");
162
+ const [hueValue, setHueValue] = useControllableState2({
163
+ prop: hue,
164
+ onChange: onChangeHue,
165
+ defaultProp: defaultHue
166
+ });
167
+ const [huePickerOpen, setHuePickerOpen] = useState2(false);
168
+ const suppressNextTooltip = useRef2(false);
169
+ const [triggerTooltipOpen, setTriggerTooltipOpen] = useState2(false);
170
+ return /* @__PURE__ */ React2.createElement(Tooltip2.Root, {
171
+ open: triggerTooltipOpen,
172
+ onOpenChange: (nextOpen) => {
173
+ if (suppressNextTooltip.current) {
174
+ setTriggerTooltipOpen(false);
175
+ suppressNextTooltip.current = false;
176
+ } else {
177
+ setTriggerTooltipOpen(nextOpen);
178
+ }
179
+ }
180
+ }, /* @__PURE__ */ React2.createElement(DropdownMenu.Root, {
181
+ modal: false,
182
+ open: huePickerOpen,
183
+ onOpenChange: (nextOpen) => {
184
+ setHuePickerOpen(nextOpen);
185
+ suppressNextTooltip.current = true;
186
+ }
187
+ }, /* @__PURE__ */ React2.createElement(Tooltip2.Trigger, {
188
+ asChild: true
189
+ }, /* @__PURE__ */ React2.createElement(DropdownMenu.Trigger, {
190
+ asChild: true
191
+ }, /* @__PURE__ */ React2.createElement(Toolbar2.Button, {
192
+ classNames: mx("gap-2 plb-1", classNames),
193
+ disabled
194
+ }, /* @__PURE__ */ React2.createElement("span", {
195
+ className: "sr-only"
196
+ }, t("select hue label")), /* @__PURE__ */ React2.createElement(Palette, {
197
+ className: getSize2(5)
198
+ })))), /* @__PURE__ */ React2.createElement(Tooltip2.Portal, null, /* @__PURE__ */ React2.createElement(Tooltip2.Content, {
199
+ side: "bottom"
200
+ }, t("select hue label"), /* @__PURE__ */ React2.createElement(Tooltip2.Arrow, null))), /* @__PURE__ */ React2.createElement(DropdownMenu.Portal, null, /* @__PURE__ */ React2.createElement(DropdownMenu.Content, {
201
+ side: "bottom",
202
+ classNames: "!w-40"
203
+ }, /* @__PURE__ */ React2.createElement(DropdownMenu.Viewport, {
204
+ classNames: "grid grid-cols-4"
205
+ }, hueTokens.map((hue2) => {
206
+ return /* @__PURE__ */ React2.createElement(DropdownMenu.CheckboxItem, {
207
+ key: hue2,
208
+ checked: hue2 === hueValue,
209
+ onCheckedChange: () => setHueValue(hue2),
210
+ classNames: "px-0 py-2 items-center justify-center"
211
+ }, /* @__PURE__ */ React2.createElement(HuePreview, {
212
+ hue: hue2
213
+ }));
214
+ })), /* @__PURE__ */ React2.createElement(DropdownMenu.Arrow, null)))));
215
+ };
216
+ var HuePickerBlock = ({ disabled, hue, onChangeHue, defaultHue, onClickClear }) => {
217
+ const { t } = useTranslation2("os");
218
+ const [hueValue, setHueValue] = useControllableState2({
219
+ prop: hue,
220
+ onChange: onChangeHue,
221
+ defaultProp: defaultHue
222
+ });
223
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(DropdownMenu.Root, {
224
+ modal: false
225
+ }, /* @__PURE__ */ React2.createElement(DropdownMenu.Trigger, {
226
+ asChild: true
227
+ }, /* @__PURE__ */ React2.createElement(Button2, {
228
+ variant: "ghost",
229
+ classNames: "gap-2 plb-1",
230
+ disabled
231
+ }, /* @__PURE__ */ React2.createElement("span", {
232
+ className: "sr-only"
233
+ }, t("select hue label")), /* @__PURE__ */ React2.createElement("div", {
234
+ role: "none",
235
+ className: "pis-14 grow flex items-center justify-center gap-2"
236
+ }, /* @__PURE__ */ React2.createElement(HuePreview, {
237
+ hue: hueValue
238
+ }), /* @__PURE__ */ React2.createElement("span", null, t(`${hueValue} label`))), /* @__PURE__ */ React2.createElement(CaretDown2, {
239
+ className: getSize2(4)
240
+ }))), /* @__PURE__ */ React2.createElement(DropdownMenu.Content, {
241
+ side: "right"
242
+ }, /* @__PURE__ */ React2.createElement(DropdownMenu.Viewport, null, Object.keys(hueTokenThemes).map((hue2) => {
243
+ return /* @__PURE__ */ React2.createElement(DropdownMenu.CheckboxItem, {
244
+ key: hue2,
245
+ checked: hue2 === hueValue,
246
+ onCheckedChange: () => setHueValue(hue2)
247
+ }, /* @__PURE__ */ React2.createElement(HuePreview, {
248
+ hue: hue2
249
+ }), /* @__PURE__ */ React2.createElement("span", {
250
+ className: "grow"
251
+ }, t(`${hue2} label`)), /* @__PURE__ */ React2.createElement(DropdownMenu.ItemIndicator, null, /* @__PURE__ */ React2.createElement(Check, null)));
252
+ })), /* @__PURE__ */ React2.createElement(DropdownMenu.Arrow, null))), /* @__PURE__ */ React2.createElement(Tooltip2.Root, null, /* @__PURE__ */ React2.createElement(Tooltip2.Trigger, {
253
+ asChild: true
254
+ }, /* @__PURE__ */ React2.createElement(Button2, {
255
+ variant: "ghost",
256
+ onClick: onClickClear,
257
+ disabled
258
+ }, /* @__PURE__ */ React2.createElement("span", {
259
+ className: "sr-only"
260
+ }, t("clear label")), /* @__PURE__ */ React2.createElement(ArrowCounterClockwise2, null))), /* @__PURE__ */ React2.createElement(Tooltip2.Portal, null, /* @__PURE__ */ React2.createElement(Tooltip2.Content, {
261
+ side: "right"
262
+ }, t("clear label"), /* @__PURE__ */ React2.createElement(Tooltip2.Arrow, null)))));
263
+ };
264
+ export {
265
+ EmojiPickerBlock,
266
+ EmojiPickerToolbarButton,
267
+ HuePickerBlock,
268
+ HuePickerToolbarButton
269
+ };
270
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/EmojiPicker.tsx", "../../../src/components/HuePicker.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport emojiData from '@emoji-mart/data';\nimport EmojiMart from '@emoji-mart/react';\nimport { ArrowCounterClockwise, CaretDown, UserCircle } from '@phosphor-icons/react';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { useRef, useState } from 'react';\n\nimport {\n Button,\n type ButtonProps,\n Popover,\n type ThemedClassName,\n Toolbar,\n Tooltip,\n useMediaQuery,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { getSize } from '@dxos/react-ui-theme';\n\nimport './emoji.css';\n\nexport type EmojiPickerProps = {\n disabled?: boolean;\n defaultEmoji?: string;\n emoji?: string;\n onChangeEmoji?: (nextEmoji: string) => void;\n onClickClear?: ButtonProps['onClick'];\n};\n\n/**\n * A toolbar button for picking an emoji. Use only in `role=toolbar` elements. Unable to unset the value.\n */\nexport const EmojiPickerToolbarButton = ({\n disabled,\n defaultEmoji,\n emoji,\n onChangeEmoji,\n classNames,\n}: ThemedClassName<Omit<EmojiPickerProps, 'onClickClear'>>) => {\n const { t } = useTranslation('os');\n const { themeMode } = useThemeContext();\n\n const [_emojiValue, setEmojiValue] = useControllableState<string>({\n prop: emoji,\n onChange: onChangeEmoji,\n defaultProp: defaultEmoji,\n });\n\n const [emojiPickerOpen, setEmojiPickerOpen] = useState<boolean>(false);\n const suppressNextTooltip = useRef<boolean>(false);\n const [triggerTooltipOpen, setTriggerTooltipOpen] = useState(false);\n\n return (\n <Tooltip.Root\n open={triggerTooltipOpen}\n onOpenChange={(nextOpen) => {\n if (suppressNextTooltip.current) {\n setTriggerTooltipOpen(false);\n suppressNextTooltip.current = false;\n } else {\n setTriggerTooltipOpen(nextOpen);\n }\n }}\n >\n <Popover.Root\n open={emojiPickerOpen}\n onOpenChange={(nextOpen) => {\n setEmojiPickerOpen(nextOpen);\n suppressNextTooltip.current = true;\n }}\n >\n <Tooltip.Trigger asChild>\n <Popover.Trigger asChild>\n <Toolbar.Button classNames={['gap-2 text-2xl plb-1', classNames]} disabled={disabled}>\n <span className='sr-only'>{t('select emoji label')}</span>\n <UserCircle className={getSize(5)} />\n </Toolbar.Button>\n </Popover.Trigger>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side='bottom'>\n {t('select emoji label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n <Popover.Portal>\n <Popover.Content\n side='bottom'\n onKeyDownCapture={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n setEmojiPickerOpen(false);\n suppressNextTooltip.current = true;\n }\n }}\n >\n {/* https://github.com/missive/emoji-mart?tab=readme-ov-file#options--props */}\n <EmojiMart\n data={emojiData}\n onEmojiSelect={({ native }: { native?: string }) => {\n if (native) {\n setEmojiValue(native);\n setEmojiPickerOpen(false);\n }\n }}\n autoFocus={true}\n maxFrequentRows={0}\n noCountryFlags={true}\n theme={themeMode}\n />\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </Tooltip.Root>\n );\n};\n\n/**\n * A button for picking an emoji alongside a button for unsetting it.\n */\nexport const EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }: EmojiPickerProps) => {\n const { t } = useTranslation('os');\n const [isMd] = useMediaQuery('md', { ssr: false });\n\n const [emojiValue, setEmojiValue] = useControllableState<string>({\n prop: emoji,\n onChange: onChangeEmoji,\n defaultProp: defaultEmoji,\n });\n\n const [emojiPickerOpen, setEmojiPickerOpen] = useState<boolean>(false);\n\n return (\n <>\n <Popover.Root open={emojiPickerOpen} onOpenChange={setEmojiPickerOpen}>\n <Popover.Trigger asChild>\n <Button variant='ghost' classNames='gap-2 text-2xl plb-1' disabled={disabled}>\n <span className='sr-only'>{t('select emoji label')}</span>\n <span className='grow pis-14'>{emojiValue}</span>\n <CaretDown className={getSize(4)} />\n </Button>\n </Popover.Trigger>\n <Popover.Content\n side='right'\n sideOffset={isMd ? 0 : -310}\n onKeyDownCapture={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n setEmojiPickerOpen(false);\n }\n }}\n >\n <EmojiMart\n data={emojiData}\n onEmojiSelect={({ native }: { native?: string }) => {\n if (native) {\n setEmojiValue(native);\n setEmojiPickerOpen(false);\n }\n }}\n autoFocus={true}\n maxFrequentRows={0}\n noCountryFlags={true}\n />\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Root>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button variant='ghost' onClick={onClickClear} disabled={disabled}>\n <span className='sr-only'>{t('clear label')}</span>\n <ArrowCounterClockwise />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side='right'>\n {t('clear label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ArrowCounterClockwise, CaretDown, Check, Palette } from '@phosphor-icons/react';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { useRef, useState } from 'react';\n\nimport {\n Button,\n type ButtonProps,\n DropdownMenu,\n type ThemedClassName,\n Toolbar,\n Tooltip,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { getSize, hueTokenThemes, mx } from '@dxos/react-ui-theme';\n\nconst HuePreview = ({ hue }: { hue: string }) => {\n const { tx } = useThemeContext();\n const size = 20;\n return (\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <rect x={0} y={0} width={size} height={size} className={tx('hue.fill', 'select--hue__preview', { hue })} />\n </svg>\n );\n};\n\nconst hueTokens = Object.keys(hueTokenThemes).slice(0, 16);\n\nexport type HuePickerProps = {\n disabled?: boolean;\n defaultHue?: string;\n hue?: string;\n onChangeHue?: (nextHue: string) => void;\n onClickClear?: ButtonProps['onClick'];\n};\n\n/**\n * A toolbar button for picking hue. Use only in `role=toolbar` elements. Unable to unset the value.\n */\nexport const HuePickerToolbarButton = ({\n disabled,\n hue,\n onChangeHue,\n classNames,\n defaultHue,\n}: ThemedClassName<Omit<HuePickerProps, 'onClickClear'>>) => {\n const { t } = useTranslation('os');\n\n const [hueValue, setHueValue] = useControllableState<string>({\n prop: hue,\n onChange: onChangeHue,\n defaultProp: defaultHue,\n });\n\n const [huePickerOpen, setHuePickerOpen] = useState<boolean>(false);\n\n const suppressNextTooltip = useRef<boolean>(false);\n const [triggerTooltipOpen, setTriggerTooltipOpen] = useState(false);\n\n return (\n <Tooltip.Root\n open={triggerTooltipOpen}\n onOpenChange={(nextOpen) => {\n if (suppressNextTooltip.current) {\n setTriggerTooltipOpen(false);\n suppressNextTooltip.current = false;\n } else {\n setTriggerTooltipOpen(nextOpen);\n }\n }}\n >\n <DropdownMenu.Root\n modal={false}\n open={huePickerOpen}\n onOpenChange={(nextOpen) => {\n setHuePickerOpen(nextOpen);\n suppressNextTooltip.current = true;\n }}\n >\n <Tooltip.Trigger asChild>\n <DropdownMenu.Trigger asChild>\n <Toolbar.Button classNames={mx('gap-2 plb-1', classNames)} disabled={disabled}>\n <span className='sr-only'>{t('select hue label')}</span>\n <Palette className={getSize(5)} />\n </Toolbar.Button>\n </DropdownMenu.Trigger>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side='bottom'>\n {t('select hue label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n <DropdownMenu.Portal>\n <DropdownMenu.Content side='bottom' classNames='!w-40'>\n <DropdownMenu.Viewport classNames='grid grid-cols-4'>\n {hueTokens.map((hue) => {\n return (\n <DropdownMenu.CheckboxItem\n key={hue}\n checked={hue === hueValue}\n onCheckedChange={() => setHueValue(hue)}\n classNames={'px-0 py-2 items-center justify-center'}\n >\n <HuePreview hue={hue} />\n </DropdownMenu.CheckboxItem>\n );\n })}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </Tooltip.Root>\n );\n};\n\n/**\n * A button for picking hue alongside a button for unsetting it.\n */\nexport const HuePickerBlock = ({ disabled, hue, onChangeHue, defaultHue, onClickClear }: HuePickerProps) => {\n const { t } = useTranslation('os');\n\n const [hueValue, setHueValue] = useControllableState<string>({\n prop: hue,\n onChange: onChangeHue,\n defaultProp: defaultHue,\n });\n\n return (\n <>\n <DropdownMenu.Root modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button variant='ghost' classNames='gap-2 plb-1' disabled={disabled}>\n <span className='sr-only'>{t('select hue label')}</span>\n <div role='none' className='pis-14 grow flex items-center justify-center gap-2'>\n <HuePreview hue={hueValue!} />\n <span>{t(`${hueValue} label`)}</span>\n </div>\n <CaretDown className={getSize(4)} />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content side='right'>\n <DropdownMenu.Viewport>\n {Object.keys(hueTokenThemes).map((hue) => {\n return (\n <DropdownMenu.CheckboxItem\n key={hue}\n checked={hue === hueValue}\n onCheckedChange={() => setHueValue(hue)}\n >\n <HuePreview hue={hue} />\n <span className='grow'>{t(`${hue} label`)}</span>\n <DropdownMenu.ItemIndicator>\n <Check />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.CheckboxItem>\n );\n })}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button variant='ghost' onClick={onClickClear} disabled={disabled}>\n <span className='sr-only'>{t('clear label')}</span>\n <ArrowCounterClockwise />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side='right'>\n {t('clear label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["emojiData", "EmojiMart", "ArrowCounterClockwise", "CaretDown", "UserCircle", "useControllableState", "React", "useRef", "useState", "Button", "Popover", "Toolbar", "Tooltip", "useMediaQuery", "useThemeContext", "useTranslation", "getSize", "EmojiPickerToolbarButton", "disabled", "defaultEmoji", "emoji", "onChangeEmoji", "classNames", "t", "useTranslation", "themeMode", "useThemeContext", "_emojiValue", "setEmojiValue", "useControllableState", "prop", "onChange", "defaultProp", "emojiPickerOpen", "setEmojiPickerOpen", "useState", "suppressNextTooltip", "useRef", "triggerTooltipOpen", "setTriggerTooltipOpen", "Tooltip", "Root", "open", "onOpenChange", "nextOpen", "current", "Popover", "Trigger", "asChild", "Toolbar", "Button", "span", "className", "UserCircle", "getSize", "Portal", "Content", "side", "Arrow", "onKeyDownCapture", "event", "key", "stopPropagation", "EmojiMart", "data", "emojiData", "onEmojiSelect", "native", "autoFocus", "maxFrequentRows", "noCountryFlags", "theme", "EmojiPickerBlock", "onClickClear", "isMd", "useMediaQuery", "ssr", "emojiValue", "variant", "CaretDown", "sideOffset", "onClick", "ArrowCounterClockwise", "ArrowCounterClockwise", "CaretDown", "Check", "Palette", "useControllableState", "React", "useRef", "useState", "Button", "DropdownMenu", "Toolbar", "Tooltip", "useThemeContext", "useTranslation", "getSize", "hueTokenThemes", "mx", "HuePreview", "hue", "tx", "useThemeContext", "size", "React", "svg", "width", "height", "viewBox", "rect", "x", "y", "className", "hueTokens", "Object", "keys", "hueTokenThemes", "slice", "HuePickerToolbarButton", "disabled", "onChangeHue", "classNames", "defaultHue", "t", "useTranslation", "hueValue", "setHueValue", "useControllableState", "prop", "onChange", "defaultProp", "huePickerOpen", "setHuePickerOpen", "useState", "suppressNextTooltip", "useRef", "triggerTooltipOpen", "setTriggerTooltipOpen", "Tooltip", "Root", "open", "onOpenChange", "nextOpen", "current", "DropdownMenu", "modal", "Trigger", "asChild", "Toolbar", "Button", "mx", "span", "Palette", "getSize", "Portal", "Content", "side", "Arrow", "Viewport", "map", "CheckboxItem", "key", "checked", "onCheckedChange", "HuePickerBlock", "onClickClear", "variant", "div", "role", "CaretDown", "ItemIndicator", "Check", "onClick", "ArrowCounterClockwise"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"packages/ui/react-ui-pickers/src/components/emoji.css":{"bytes":783,"imports":[]},"packages/ui/react-ui-pickers/src/components/EmojiPicker.tsx":{"bytes":19368,"imports":[{"path":"@emoji-mart/data","kind":"import-statement","external":true},{"path":"@emoji-mart/react","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-pickers/src/components/emoji.css","kind":"import-statement","original":"./emoji.css"}],"format":"esm"},"packages/ui/react-ui-pickers/src/components/HuePicker.tsx":{"bytes":20029,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-pickers/src/components/index.ts":{"bytes":611,"imports":[{"path":"packages/ui/react-ui-pickers/src/components/EmojiPicker.tsx","kind":"import-statement","original":"./EmojiPicker"},{"path":"packages/ui/react-ui-pickers/src/components/HuePicker.tsx","kind":"import-statement","original":"./HuePicker"}],"format":"esm"},"packages/ui/react-ui-pickers/src/index.ts":{"bytes":506,"imports":[{"path":"packages/ui/react-ui-pickers/src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-pickers/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":21269},"packages/ui/react-ui-pickers/dist/lib/node-esm/index.mjs":{"imports":[{"path":"@emoji-mart/data","kind":"import-statement","external":true},{"path":"@emoji-mart/react","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"exports":["EmojiPickerBlock","EmojiPickerToolbarButton","HuePickerBlock","HuePickerToolbarButton"],"entryPoint":"packages/ui/react-ui-pickers/src/index.ts","cssBundle":"packages/ui/react-ui-pickers/dist/lib/node-esm/index.css","inputs":{"packages/ui/react-ui-pickers/src/components/EmojiPicker.tsx":{"bytesInOutput":5216},"packages/ui/react-ui-pickers/src/components/emoji.css":{"bytesInOutput":0},"packages/ui/react-ui-pickers/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-pickers/src/components/HuePicker.tsx":{"bytesInOutput":5891},"packages/ui/react-ui-pickers/src/index.ts":{"bytesInOutput":0}},"bytes":11463},"packages/ui/react-ui-pickers/dist/lib/node-esm/index.css.map":{"imports":[],"exports":[],"inputs":{},"bytes":1017},"packages/ui/react-ui-pickers/dist/lib/node-esm/index.css":{"imports":[],"inputs":{"packages/ui/react-ui-pickers/src/components/emoji.css":{"bytesInOutput":146}},"bytes":244}}}
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { type ButtonProps, type ThemedClassName } from '@dxos/react-ui';
3
+ import './emoji.css';
4
+ export type EmojiPickerProps = {
5
+ disabled?: boolean;
6
+ defaultEmoji?: string;
7
+ emoji?: string;
8
+ onChangeEmoji?: (nextEmoji: string) => void;
9
+ onClickClear?: ButtonProps['onClick'];
10
+ };
11
+ /**
12
+ * A toolbar button for picking an emoji. Use only in `role=toolbar` elements. Unable to unset the value.
13
+ */
14
+ export declare const EmojiPickerToolbarButton: ({ disabled, defaultEmoji, emoji, onChangeEmoji, classNames, }: ThemedClassName<Omit<EmojiPickerProps, "onClickClear">>) => React.JSX.Element;
15
+ /**
16
+ * A button for picking an emoji alongside a button for unsetting it.
17
+ */
18
+ export declare const EmojiPickerBlock: ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }: EmojiPickerProps) => React.JSX.Element;
19
+ //# sourceMappingURL=EmojiPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPicker.d.ts","sourceRoot":"","sources":["../../../../src/components/EmojiPicker.tsx"],"names":[],"mappings":"AAQA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,eAAe,EAMrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,kEAMlC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,sBA8EzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,mEAAoE,gBAAgB,sBA+DhH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import '@dxos-theme';
2
+ import { type Meta, type StoryObj } from '@storybook/react';
3
+ import { type EmojiPickerProps } from './EmojiPicker';
4
+ export declare const ToolbarButton: StoryObj<EmojiPickerProps>;
5
+ export declare const Block: StoryObj<EmojiPickerProps>;
6
+ declare const meta: Meta;
7
+ export default meta;
8
+ //# sourceMappingURL=EmojiPicker.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPicker.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/EmojiPicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM5D,OAAO,EAA8C,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA2BlG,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,gBAAgB,CAKpD,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAK5C,CAAC;AAEF,QAAA,MAAM,IAAI,EAAE,IAGX,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { type ButtonProps, type ThemedClassName } from '@dxos/react-ui';
3
+ export type HuePickerProps = {
4
+ disabled?: boolean;
5
+ defaultHue?: string;
6
+ hue?: string;
7
+ onChangeHue?: (nextHue: string) => void;
8
+ onClickClear?: ButtonProps['onClick'];
9
+ };
10
+ /**
11
+ * A toolbar button for picking hue. Use only in `role=toolbar` elements. Unable to unset the value.
12
+ */
13
+ export declare const HuePickerToolbarButton: ({ disabled, hue, onChangeHue, classNames, defaultHue, }: ThemedClassName<Omit<HuePickerProps, "onClickClear">>) => React.JSX.Element;
14
+ /**
15
+ * A button for picking hue alongside a button for unsetting it.
16
+ */
17
+ export declare const HuePickerBlock: ({ disabled, hue, onChangeHue, defaultHue, onClickClear }: HuePickerProps) => React.JSX.Element;
18
+ //# sourceMappingURL=HuePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HuePicker.d.ts","sourceRoot":"","sources":["../../../../src/components/HuePicker.tsx"],"names":[],"mappings":"AAMA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,eAAe,EAKrB,MAAM,gBAAgB,CAAC;AAexB,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,4DAMhC,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,sBAsEvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6DAA8D,cAAc,sBA2DtG,CAAC"}
@@ -0,0 +1,8 @@
1
+ import '@dxos-theme';
2
+ import { type Meta, type StoryObj } from '@storybook/react';
3
+ import { type HuePickerProps } from './HuePicker';
4
+ export declare const ToolbarButtonStory: StoryObj<HuePickerProps>;
5
+ export declare const BlockPickerStory: StoryObj<HuePickerProps>;
6
+ declare const meta: Meta;
7
+ export default meta;
8
+ //# sourceMappingURL=HuePicker.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HuePicker.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/HuePicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM5D,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AA2B1F,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAGvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,cAAc,CAGrD,CAAC;AAEF,QAAA,MAAM,IAAI,EAAE,IAGX,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './EmojiPicker';
2
+ export * from './HuePicker';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/index.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './components';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":"5.7.3"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@dxos/react-ui-pickers",
3
+ "version": "0.7.5-labs.071a3e2",
4
+ "description": "A collection of picker components.",
5
+ "homepage": "https://dxos.org",
6
+ "bugs": "https://github.com/dxos/dxos/issues",
7
+ "license": "MIT",
8
+ "author": "DXOS.org",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/types/src/index.d.ts",
12
+ "browser": "./dist/lib/browser/index.mjs",
13
+ "node": "./dist/lib/node-esm/index.mjs"
14
+ }
15
+ },
16
+ "types": "dist/types/src/index.d.ts",
17
+ "typesVersions": {
18
+ "*": {}
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "src"
23
+ ],
24
+ "dependencies": {
25
+ "@emoji-mart/data": "^1.1.2",
26
+ "@emoji-mart/react": "^1.1.1",
27
+ "@radix-ui/react-use-controllable-state": "1.1.0",
28
+ "@dxos/react-ui-types": "0.7.5-labs.071a3e2",
29
+ "@dxos/util": "0.7.5-labs.071a3e2"
30
+ },
31
+ "devDependencies": {
32
+ "@phosphor-icons/react": "^2.1.5",
33
+ "@types/react": "~18.2.0",
34
+ "@types/react-dom": "~18.2.0",
35
+ "react": "~18.2.0",
36
+ "react-dom": "~18.2.0",
37
+ "vite": "5.4.7",
38
+ "@dxos/react-ui-theme": "0.7.5-labs.071a3e2",
39
+ "@dxos/react-ui": "0.7.5-labs.071a3e2",
40
+ "@dxos/storybook-utils": "0.7.5-labs.071a3e2"
41
+ },
42
+ "peerDependencies": {
43
+ "@phosphor-icons/react": "^2.1.5",
44
+ "react": "~18.2.0",
45
+ "react-dom": "~18.2.0",
46
+ "@dxos/react-ui-theme": "0.7.5-labs.071a3e2",
47
+ "@dxos/react-ui": "0.7.5-labs.071a3e2"
48
+ },
49
+ "publishConfig": {
50
+ "access": "public"
51
+ }
52
+ }
@@ -0,0 +1,59 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type Meta, type StoryObj } from '@storybook/react';
8
+ import React, { useState } from 'react';
9
+
10
+ import { Toolbar } from '@dxos/react-ui';
11
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
12
+
13
+ import { EmojiPickerBlock, EmojiPickerToolbarButton, type EmojiPickerProps } from './EmojiPicker';
14
+
15
+ const ToolbarButtonStory = (props: EmojiPickerProps) => {
16
+ const [emoji, setEmoji] = useState<string>(props.defaultEmoji ?? '😀');
17
+
18
+ return (
19
+ <Toolbar.Root>
20
+ <EmojiPickerToolbarButton {...props} emoji={emoji} onChangeEmoji={setEmoji} />
21
+ </Toolbar.Root>
22
+ );
23
+ };
24
+
25
+ const BlockStory = (props: EmojiPickerProps) => {
26
+ const [emoji, setEmoji] = useState<string>(props.defaultEmoji ?? '😀');
27
+
28
+ return (
29
+ <div className='flex gap-2'>
30
+ <EmojiPickerBlock
31
+ {...props}
32
+ emoji={emoji}
33
+ onChangeEmoji={setEmoji}
34
+ onClickClear={() => setEmoji(props.defaultEmoji ?? '😀')}
35
+ />
36
+ </div>
37
+ );
38
+ };
39
+
40
+ export const ToolbarButton: StoryObj<EmojiPickerProps> = {
41
+ render: ToolbarButtonStory,
42
+ args: {
43
+ defaultEmoji: '😀',
44
+ },
45
+ };
46
+
47
+ export const Block: StoryObj<EmojiPickerProps> = {
48
+ render: BlockStory,
49
+ args: {
50
+ defaultEmoji: '😀',
51
+ },
52
+ };
53
+
54
+ const meta: Meta = {
55
+ title: 'ui/react-ui-pickers/EmojiPicker',
56
+ decorators: [withTheme, withLayout({ fullscreen: false, tooltips: true })],
57
+ };
58
+
59
+ export default meta;