@dxos/react-ui-pickers 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264 → 0.14.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 (43) hide show
  1. package/dist/lib/index.mjs +102 -86
  2. package/dist/lib/index.mjs.map +1 -1
  3. package/dist/types/src/components/EmojiPicker/EmojiPicker.d.ts +7 -5
  4. package/dist/types/src/components/EmojiPicker/EmojiPicker.d.ts.map +1 -1
  5. package/dist/types/src/components/EmojiPicker/EmojiPicker.stories.d.ts +1 -1
  6. package/dist/types/src/components/EmojiPicker/EmojiPicker.stories.d.ts.map +1 -1
  7. package/dist/types/src/components/EmojiPicker/index.d.ts +1 -1
  8. package/dist/types/src/components/EmojiPicker/index.d.ts.map +1 -1
  9. package/dist/types/src/components/HuePicker/HuePicker.d.ts +7 -4
  10. package/dist/types/src/components/HuePicker/HuePicker.d.ts.map +1 -1
  11. package/dist/types/src/components/HuePicker/HuePicker.stories.d.ts +1 -1
  12. package/dist/types/src/components/HuePicker/HuePicker.stories.d.ts.map +1 -1
  13. package/dist/types/src/components/HuePicker/index.d.ts +1 -1
  14. package/dist/types/src/components/HuePicker/index.d.ts.map +1 -1
  15. package/dist/types/src/components/IconPicker/IconPicker.d.ts +5 -4
  16. package/dist/types/src/components/IconPicker/IconPicker.d.ts.map +1 -1
  17. package/dist/types/src/components/IconPicker/IconPicker.stories.d.ts +1 -1
  18. package/dist/types/src/components/IconPicker/IconPicker.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/IconPicker/index.d.ts +1 -1
  20. package/dist/types/src/components/IconPicker/index.d.ts.map +1 -1
  21. package/dist/types/src/components/PickerButton/PickerButton.d.ts +5 -4
  22. package/dist/types/src/components/PickerButton/PickerButton.d.ts.map +1 -1
  23. package/dist/types/src/components/PickerButton/index.d.ts +1 -1
  24. package/dist/types/src/components/PickerButton/index.d.ts.map +1 -1
  25. package/dist/types/src/components/index.d.ts +4 -4
  26. package/dist/types/src/components/index.d.ts.map +1 -1
  27. package/dist/types/src/index.d.ts +1 -1
  28. package/dist/types/src/index.d.ts.map +1 -1
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +12 -9
  31. package/src/components/EmojiPicker/EmojiPicker.stories.tsx +2 -2
  32. package/src/components/EmojiPicker/EmojiPicker.tsx +72 -82
  33. package/src/components/EmojiPicker/index.ts +1 -1
  34. package/src/components/HuePicker/HuePicker.stories.tsx +2 -2
  35. package/src/components/HuePicker/HuePicker.tsx +15 -7
  36. package/src/components/HuePicker/index.ts +1 -1
  37. package/src/components/IconPicker/IconPicker.stories.tsx +2 -2
  38. package/src/components/IconPicker/IconPicker.tsx +10 -7
  39. package/src/components/IconPicker/index.ts +1 -1
  40. package/src/components/PickerButton/PickerButton.tsx +51 -45
  41. package/src/components/PickerButton/index.ts +1 -1
  42. package/src/components/index.ts +4 -4
  43. package/src/index.ts +1 -1
@@ -1,9 +1,14 @@
1
- import { useControllableState } from "@radix-ui/react-use-controllable-state";
2
1
  import { Suspense, lazy, useEffect, useState } from "react";
3
- import { Button, ButtonGroup, DropdownMenu, Icon, IconButton, Popover, Toolbar, Tooltip, useMediaQuery, useThemeContext, useTranslation } from "@dxos/react-ui";
2
+ import { useControllableState } from "@dxos/react-hooks";
3
+ import * as Button from "@dxos/react-ui/Button";
4
+ import * as Hooks from "@dxos/react-ui/Hooks";
5
+ import * as Icon from "@dxos/react-ui/Icon";
6
+ import * as Popover from "@dxos/react-ui/Popover";
4
7
  import { getSize, osTranslations } from "@dxos/ui-theme";
5
8
  import { jsx, jsxs } from "react/jsx-runtime";
6
9
  import { hues, iconValues } from "@dxos/ui-types";
10
+ import * as Menu from "@dxos/react-ui/Menu";
11
+ import * as Tooltip from "@dxos/react-ui/Tooltip";
7
12
  //#region src/components/EmojiPicker/EmojiPicker.tsx
8
13
  /**
9
14
  * emoji-mart plus its emoji database is ~480 KB; loading it with the barrel put it in every
@@ -13,9 +18,9 @@ var EmojiMartPanel = lazy(() => import("./chunk-EmojiMartPanel.mjs"));
13
18
  /**
14
19
  * A toolbar button for picking an emoji. Use only in `role=toolbar` elements. Unable to unset the value.
15
20
  */
16
- var EmojiPickerToolbarButton = ({ classNames, emoji, disabled, defaultEmoji, onChangeEmoji }) => {
17
- const { t } = useTranslation(osTranslations);
18
- const { themeMode } = useThemeContext();
21
+ var EmojiPickerToolbarButton = ({ size, emoji, disabled, defaultEmoji, onChangeEmoji }) => {
22
+ const { t } = Hooks.useTranslation(osTranslations);
23
+ const themeMode = Hooks.useThemeMode();
19
24
  const [_emojiValue, setEmojiValue] = useControllableState({
20
25
  prop: emoji,
21
26
  onChange: onChangeEmoji,
@@ -24,27 +29,28 @@ var EmojiPickerToolbarButton = ({ classNames, emoji, disabled, defaultEmoji, onC
24
29
  const [emojiPickerOpen, setEmojiPickerOpen] = useState(false);
25
30
  return /* @__PURE__ */ jsxs(Popover.Root, {
26
31
  open: emojiPickerOpen,
27
- onOpenChange: (nextOpen) => {
32
+ onOpenChange: ({ open: nextOpen }) => {
28
33
  setEmojiPickerOpen(nextOpen);
29
34
  },
35
+ positioning: { placement: "bottom" },
30
36
  children: [/* @__PURE__ */ jsx(Popover.Trigger, {
31
37
  asChild: true,
32
- children: /* @__PURE__ */ jsx(Toolbar.IconButton, {
33
- icon: "ph--user-circle--regular",
38
+ children: /* @__PURE__ */ jsx(Button.Root, {
39
+ size,
34
40
  label: t("select-emoji.label"),
41
+ icon: "ph--smiley--regular",
35
42
  iconOnly: true,
36
43
  tooltipSide: "bottom",
37
44
  disabled
38
45
  })
39
- }), /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(Popover.Content, {
40
- side: "bottom",
46
+ }), /* @__PURE__ */ jsx(Popover.Content, {
41
47
  onKeyDownCapture: (event) => {
42
48
  if (event.key === "Escape") {
43
49
  event.stopPropagation();
44
50
  setEmojiPickerOpen(false);
45
51
  }
46
52
  },
47
- children: [/* @__PURE__ */ jsx(Suspense, {
53
+ children: /* @__PURE__ */ jsx(Suspense, {
48
54
  fallback: null,
49
55
  children: /* @__PURE__ */ jsx(EmojiMartPanel, {
50
56
  onEmojiSelect: ({ native }) => {
@@ -55,32 +61,37 @@ var EmojiPickerToolbarButton = ({ classNames, emoji, disabled, defaultEmoji, onC
55
61
  },
56
62
  themeMode
57
63
  })
58
- }), /* @__PURE__ */ jsx(Popover.Arrow, {})]
59
- }) })]
64
+ })
65
+ })]
60
66
  });
61
67
  };
62
68
  /**
63
69
  * A button for picking an emoji alongside a button for unsetting it.
64
70
  */
65
71
  var EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear, triggerVariant = "ghost", classNames }) => {
66
- const { t } = useTranslation(osTranslations);
67
- const [isMd] = useMediaQuery("md");
72
+ const { t } = Hooks.useTranslation(osTranslations);
73
+ const [isMd] = Hooks.useMediaQuery("md");
68
74
  const [emojiValue, setEmojiValue] = useControllableState({
69
75
  prop: emoji,
70
76
  onChange: onChangeEmoji,
71
77
  defaultProp: defaultEmoji
72
78
  });
73
79
  const [emojiPickerOpen, setEmojiPickerOpen] = useState(false);
74
- return /* @__PURE__ */ jsxs(ButtonGroup, {
80
+ return /* @__PURE__ */ jsxs(Button.Group, {
75
81
  classNames,
76
82
  children: [/* @__PURE__ */ jsxs(Popover.Root, {
77
83
  open: emojiPickerOpen,
78
- onOpenChange: setEmojiPickerOpen,
84
+ onOpenChange: ({ open }) => setEmojiPickerOpen(open),
85
+ positioning: {
86
+ placement: "right",
87
+ gutter: isMd ? 0 : -310,
88
+ overflowPadding: 8
89
+ },
79
90
  children: [/* @__PURE__ */ jsx(Popover.Trigger, {
80
91
  asChild: true,
81
- children: /* @__PURE__ */ jsxs(Button, {
92
+ children: /* @__PURE__ */ jsxs(Button.Root, {
82
93
  variant: triggerVariant,
83
- classNames: "grow gap-2 text-2xl",
94
+ classNames: "text-xl",
84
95
  disabled,
85
96
  children: [
86
97
  /* @__PURE__ */ jsx("span", {
@@ -88,23 +99,21 @@ var EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickC
88
99
  children: t("select-emoji.label")
89
100
  }),
90
101
  /* @__PURE__ */ jsx("span", { children: emojiValue }),
91
- /* @__PURE__ */ jsx(Icon, {
102
+ /* @__PURE__ */ jsx(Icon.Icon, {
92
103
  icon: "ph--caret-down--bold",
93
- size: 3
104
+ size: "xs"
94
105
  })
95
106
  ]
96
107
  })
97
- }), /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(Popover.Content, {
98
- side: "right",
99
- sideOffset: isMd ? 0 : -310,
100
- collisionPadding: 8,
108
+ }), /* @__PURE__ */ jsx(Popover.Content, {
109
+ classNames: "p-0",
101
110
  onKeyDownCapture: (event) => {
102
111
  if (event.key === "Escape") {
103
112
  event.stopPropagation();
104
113
  setEmojiPickerOpen(false);
105
114
  }
106
115
  },
107
- children: [/* @__PURE__ */ jsx(Suspense, {
116
+ children: /* @__PURE__ */ jsx(Suspense, {
108
117
  fallback: null,
109
118
  children: /* @__PURE__ */ jsx(EmojiMartPanel, { onEmojiSelect: ({ native }) => {
110
119
  if (native) {
@@ -112,9 +121,9 @@ var EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickC
112
121
  setEmojiPickerOpen(false);
113
122
  }
114
123
  } })
115
- }), /* @__PURE__ */ jsx(Popover.Arrow, {})]
116
- }) })]
117
- }), /* @__PURE__ */ jsx(IconButton, {
124
+ })
125
+ })]
126
+ }), /* @__PURE__ */ jsx(Button.Root, {
118
127
  icon: "ph--arrow-counter-clockwise--regular",
119
128
  iconOnly: true,
120
129
  label: t("clear.label"),
@@ -127,7 +136,9 @@ var EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickC
127
136
  };
128
137
  //#endregion
129
138
  //#region src/components/PickerButton/PickerButton.tsx
130
- var PickerButton = ({ Component, disabled, classNames, defaultValue: defaultValueProp, value: valueProp, values, label, icon, onChange, onReset, rootVariant = "button", iconSize = 5 }) => {
139
+ /** Menu value of the reset row; outside every picker's value set. */
140
+ var RESET = "__reset__";
141
+ var PickerButton = ({ Component, disabled, classNames, defaultValue: defaultValueProp, value: valueProp, values, label, icon, onChange, onReset, rootVariant = "button", iconSize }) => {
131
142
  const [value, setValue] = useControllableState({
132
143
  prop: valueProp,
133
144
  defaultProp: defaultValueProp,
@@ -135,79 +146,84 @@ var PickerButton = ({ Component, disabled, classNames, defaultValue: defaultValu
135
146
  });
136
147
  useEffect(() => setValue(valueProp), [valueProp]);
137
148
  const [open, setOpen] = useState(false);
138
- const TriggerRoot = rootVariant === "toolbar-button" ? Toolbar.Button : Button;
139
- return /* @__PURE__ */ jsxs(DropdownMenu.Root, {
140
- modal: false,
149
+ return /* @__PURE__ */ jsxs(Menu.Root, {
141
150
  open,
142
- onOpenChange: setOpen,
143
- children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
151
+ onOpenChange: ({ open }) => setOpen(open),
152
+ positioning: { placement: "bottom" },
153
+ children: [/* @__PURE__ */ jsx(Menu.Trigger, {
144
154
  asChild: true,
145
- content: label,
146
- side: "bottom",
147
- children: /* @__PURE__ */ jsx(DropdownMenu.Trigger, {
155
+ children: /* @__PURE__ */ jsx(Tooltip.Trigger, {
148
156
  asChild: true,
149
- children: /* @__PURE__ */ jsxs(TriggerRoot, {
150
- classNames: ["gap-2 py-1", classNames],
157
+ content: label,
158
+ side: "bottom",
159
+ children: /* @__PURE__ */ jsx(Button.Root, {
160
+ variant: rootVariant === "toolbar-button" ? "ghost" : "default",
161
+ iconOnly: true,
162
+ showTooltip: false,
163
+ label,
164
+ caretDown: true,
165
+ classNames,
151
166
  disabled,
152
- children: [
153
- /* @__PURE__ */ jsx("span", {
154
- className: "sr-only",
155
- children: label
156
- }),
157
- value && /* @__PURE__ */ jsx(Component, {
158
- value,
159
- size: iconSize
160
- }) || /* @__PURE__ */ jsx(Icon, {
161
- icon,
162
- size: iconSize
163
- }),
164
- /* @__PURE__ */ jsx(Icon, {
165
- icon: "ph--caret-down--bold",
166
- size: 3
167
- })
168
- ]
167
+ children: value && /* @__PURE__ */ jsx(Component, {
168
+ value,
169
+ size: iconSize
170
+ }) || /* @__PURE__ */ jsx(Icon.Icon, {
171
+ icon,
172
+ size: iconSize
173
+ })
169
174
  })
170
175
  })
171
- }), /* @__PURE__ */ jsx(DropdownMenu.Portal, { children: /* @__PURE__ */ jsxs(DropdownMenu.Content, {
172
- side: "bottom",
173
- classNames: "!w-min",
174
- children: [/* @__PURE__ */ jsxs(DropdownMenu.Viewport, {
175
- classNames: "grid grid-cols-[repeat(6,min-content)]",
176
- children: [values.map((_value) => {
177
- return /* @__PURE__ */ jsx(DropdownMenu.CheckboxItem, {
178
- checked: _value === value,
179
- onCheckedChange: () => setValue(_value),
180
- classNames: "p-1 items-center justify-center aspect-square",
181
- children: /* @__PURE__ */ jsx(Component, {
182
- value: _value,
183
- size: iconSize
184
- })
185
- }, _value);
186
- }), onReset && /* @__PURE__ */ jsx(DropdownMenu.CheckboxItem, {
187
- onCheckedChange: () => onReset(),
188
- classNames: "p-1 items-center justify-center aspect-square",
189
- children: /* @__PURE__ */ jsx(Icon, {
190
- icon: "ph--x--regular",
176
+ }), /* @__PURE__ */ jsxs(Menu.Content, {
177
+ columns: 6,
178
+ children: [values.map((_value) => {
179
+ return /* @__PURE__ */ jsx(Menu.CheckboxItem, {
180
+ item: {
181
+ value: _value,
182
+ label: _value
183
+ },
184
+ checked: _value === value,
185
+ onCheckedChange: () => setValue(_value),
186
+ children: /* @__PURE__ */ jsx(Component, {
187
+ value: _value,
191
188
  size: iconSize
192
189
  })
193
- })]
194
- }), /* @__PURE__ */ jsx(DropdownMenu.Arrow, {})]
195
- }) })]
190
+ }, _value);
191
+ }), onReset && /* @__PURE__ */ jsx(Menu.Item, {
192
+ item: {
193
+ value: RESET,
194
+ label: "Reset"
195
+ },
196
+ onClick: () => onReset(),
197
+ children: /* @__PURE__ */ jsx(Icon.Icon, {
198
+ icon: "ph--x--regular",
199
+ size: iconSize
200
+ })
201
+ })]
202
+ })]
196
203
  });
197
204
  };
198
205
  //#endregion
199
206
  //#region src/components/HuePicker/HuePicker.tsx
200
- var HuePicker = (props) => {
201
- const { t } = useTranslation(osTranslations);
207
+ var HuePicker = ({ label, ...props }) => {
208
+ const { t } = Hooks.useTranslation(osTranslations);
202
209
  return /* @__PURE__ */ jsx(PickerButton, {
203
210
  Component: HuePreview,
204
- label: t("select-hue.label"),
211
+ label: label ?? t("select-hue.label"),
205
212
  icon: "ph--palette--regular",
206
213
  values: hues,
207
214
  ...props
208
215
  });
209
216
  };
210
- var HuePreview = ({ value, size = 5 }) => {
217
+ /** Next icon sizes as the Tailwind steps the preview's square is drawn at. */
218
+ var PREVIEW_SIZES = {
219
+ xs: 3,
220
+ sm: 3.5,
221
+ md: 4,
222
+ lg: 5,
223
+ xl: 6
224
+ };
225
+ var HuePreview = ({ value, size: iconSize = "md" }) => {
226
+ const size = PREVIEW_SIZES[iconSize];
211
227
  return /* @__PURE__ */ jsx("div", {
212
228
  className: "flex justify-center items-center",
213
229
  children: /* @__PURE__ */ jsx("svg", {
@@ -227,7 +243,7 @@ var HuePreview = ({ value, size = 5 }) => {
227
243
  //#endregion
228
244
  //#region src/components/IconPicker/IconPicker.tsx
229
245
  var IconPicker = ({ ...props }) => {
230
- const { t } = useTranslation(osTranslations);
246
+ const { t } = Hooks.useTranslation(osTranslations);
231
247
  return /* @__PURE__ */ jsx(PickerButton, {
232
248
  Component: IconPreview,
233
249
  label: t("select-icon.label"),
@@ -237,7 +253,7 @@ var IconPicker = ({ ...props }) => {
237
253
  });
238
254
  };
239
255
  var IconPreview = ({ value, size }) => {
240
- return /* @__PURE__ */ jsx(Icon, {
256
+ return /* @__PURE__ */ jsx(Icon.Icon, {
241
257
  icon: `ph--${value}--regular`,
242
258
  size
243
259
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/components/EmojiPicker/EmojiPicker.tsx","../../src/components/PickerButton/PickerButton.tsx","../../src/components/HuePicker/HuePicker.tsx","../../src/components/IconPicker/IconPicker.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport './emoji.css';\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { Suspense, lazy, useState } from 'react';\n\nimport {\n Button,\n ButtonGroup,\n type ButtonProps,\n Icon,\n IconButton,\n Popover,\n type ThemedClassName,\n Toolbar,\n useMediaQuery,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { osTranslations } from '@dxos/ui-theme';\n\n/**\n * emoji-mart plus its emoji database is ~480 KB; loading it with the barrel put it in every\n * tab's boot graph, so the panel loads on first open instead.\n */\nconst EmojiMartPanel = lazy(() => import('./EmojiMartPanel'));\n\nexport type EmojiPickerProps = ThemedClassName<{\n disabled?: boolean;\n defaultEmoji?: string;\n emoji?: string;\n onChangeEmoji?: (nextEmoji: string) => void;\n onClickClear?: ButtonProps['onClick'];\n triggerVariant?: ButtonProps['variant'];\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 classNames,\n emoji,\n disabled,\n defaultEmoji,\n onChangeEmoji,\n}: Omit<EmojiPickerProps, 'onClickClear'>) => {\n const { t } = useTranslation(osTranslations);\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\n return (\n <Popover.Root\n open={emojiPickerOpen}\n onOpenChange={(nextOpen) => {\n setEmojiPickerOpen(nextOpen);\n }}\n >\n <Popover.Trigger asChild>\n <Toolbar.IconButton\n icon='ph--user-circle--regular'\n label={t('select-emoji.label')}\n iconOnly\n tooltipSide='bottom'\n disabled={disabled}\n />\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side='bottom'\n onKeyDownCapture={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n setEmojiPickerOpen(false);\n }\n }}\n >\n <Suspense fallback={null}>\n <EmojiMartPanel\n onEmojiSelect={({ native }: { native?: string }) => {\n if (native) {\n setEmojiValue(native);\n setEmojiPickerOpen(false);\n }\n }}\n themeMode={themeMode}\n />\n </Suspense>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n\n/**\n * A button for picking an emoji alongside a button for unsetting it.\n */\nexport const EmojiPickerBlock = ({\n disabled,\n defaultEmoji,\n emoji,\n onChangeEmoji,\n onClickClear,\n triggerVariant = 'ghost',\n classNames,\n}: EmojiPickerProps) => {\n const { t } = useTranslation(osTranslations);\n const [isMd] = useMediaQuery('md');\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 <ButtonGroup classNames={classNames}>\n <Popover.Root open={emojiPickerOpen} onOpenChange={setEmojiPickerOpen}>\n <Popover.Trigger asChild>\n <Button variant={triggerVariant} classNames='grow gap-2 text-2xl' disabled={disabled}>\n <span className='sr-only'>{t('select-emoji.label')}</span>\n <span>{emojiValue}</span>\n <Icon icon='ph--caret-down--bold' size={3} />\n </Button>\n </Popover.Trigger>\n {/* Portalled, like `EmojiPickerToolbarButton` above and `PickerButton` (which is why the hue\n picker never had this problem): rendered in place, a 300px panel is clipped by the first\n scrolling ancestor — in the profile page, the settings panel's own overflow. */}\n <Popover.Portal>\n <Popover.Content\n side='right'\n sideOffset={isMd ? 0 : -310}\n collisionPadding={8}\n onKeyDownCapture={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n setEmojiPickerOpen(false);\n }\n }}\n >\n <Suspense fallback={null}>\n <EmojiMartPanel\n onEmojiSelect={({ native }: { native?: string }) => {\n if (native) {\n setEmojiValue(native);\n setEmojiPickerOpen(false);\n }\n }}\n />\n </Suspense>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n <IconButton\n icon='ph--arrow-counter-clockwise--regular'\n iconOnly\n label={t('clear.label')}\n tooltipSide='right'\n variant={triggerVariant}\n onClick={onClickClear}\n disabled={disabled}\n />\n </ButtonGroup>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type FC, useEffect, useState } from 'react';\n\nimport { Button, DropdownMenu, Icon, type IconProps, type ThemedClassName, Toolbar, Tooltip } from '@dxos/react-ui';\n\nexport type PickerButtonProps = ThemedClassName<{\n Component: FC<{ value: string; size?: IconProps['size'] }>;\n label: string;\n icon: string;\n values: readonly string[];\n disabled?: boolean;\n defaultValue?: string;\n value?: string;\n onChange?: (value: string) => void;\n onReset?: () => void;\n rootVariant?: 'button' | 'toolbar-button';\n iconSize?: IconProps['size'];\n}>;\n\nexport const PickerButton = ({\n Component,\n disabled,\n classNames,\n defaultValue: defaultValueProp,\n value: valueProp,\n values,\n label,\n icon,\n onChange,\n onReset,\n rootVariant = 'button',\n iconSize = 5,\n}: PickerButtonProps) => {\n const [value, setValue] = useControllableState<string>({\n prop: valueProp,\n defaultProp: defaultValueProp,\n onChange,\n });\n // TODO(burdon): useControllableState doesn't update the prop when the value is changed. Replace it.\n useEffect(() => setValue(valueProp), [valueProp]);\n\n const [open, setOpen] = useState<boolean>(false);\n const TriggerRoot = rootVariant === 'toolbar-button' ? Toolbar.Button : Button;\n\n return (\n <DropdownMenu.Root modal={false} open={open} onOpenChange={setOpen}>\n <Tooltip.Trigger asChild content={label} side='bottom'>\n <DropdownMenu.Trigger asChild>\n <TriggerRoot classNames={['gap-2 py-1', classNames]} disabled={disabled}>\n <span className='sr-only'>{label}</span>\n {(value && <Component value={value} size={iconSize} />) || <Icon icon={icon} size={iconSize} />}\n <Icon icon='ph--caret-down--bold' size={3} />\n </TriggerRoot>\n </DropdownMenu.Trigger>\n </Tooltip.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content side='bottom' classNames='!w-min'>\n <DropdownMenu.Viewport classNames='grid grid-cols-[repeat(6,min-content)]'>\n {values.map((_value) => {\n return (\n <DropdownMenu.CheckboxItem\n key={_value}\n checked={_value === value}\n onCheckedChange={() => setValue(_value)}\n classNames={'p-1 items-center justify-center aspect-square'}\n >\n <Component value={_value} size={iconSize} />\n </DropdownMenu.CheckboxItem>\n );\n })}\n {onReset && (\n <DropdownMenu.CheckboxItem\n onCheckedChange={() => onReset()}\n classNames={'p-1 items-center justify-center aspect-square'}\n >\n <Icon icon='ph--x--regular' size={iconSize} />\n </DropdownMenu.CheckboxItem>\n )}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type ButtonProps, type IconProps, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { getSize, osTranslations } from '@dxos/ui-theme';\nimport { hues } from '@dxos/ui-types';\n\nimport { PickerButton, type PickerButtonProps } from '../PickerButton';\n\nexport type HuePickerProps = {\n disabled?: boolean;\n defaultValue?: string;\n value?: string;\n onChange?: (nextHue: string) => void;\n onReset?: ButtonProps['onClick'];\n} & Pick<PickerButtonProps, 'disabled' | 'defaultValue' | 'value' | 'onChange' | 'onReset' | 'rootVariant'>;\n\nexport const HuePicker = (props: ThemedClassName<HuePickerProps>) => {\n const { t } = useTranslation(osTranslations);\n\n return (\n <PickerButton\n Component={HuePreview}\n label={t('select-hue.label')}\n icon='ph--palette--regular'\n values={hues}\n {...props}\n />\n );\n};\n\nconst HuePreview = ({ value, size = 5 }: { value: string; size?: IconProps['size'] }) => {\n return (\n <div className='flex justify-center items-center'>\n <svg viewBox={`0 0 ${size} ${size}`} className={getSize(size)}>\n <rect x={0} y={0} width={size} height={size} fill={`var(--color-${value}-surface)`} strokeWidth={4} />\n </svg>\n </div>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type ButtonProps, Icon, type IconProps, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { iconValues } from '@dxos/ui-types';\n\nimport { PickerButton, type PickerButtonProps } from '../PickerButton';\n\nexport type IconPickerProps = {\n disabled?: boolean;\n defaultValue?: string;\n value?: string;\n onChange?: (nextHue: string) => void;\n onReset?: ButtonProps['onClick'];\n} & Pick<\n PickerButtonProps,\n 'disabled' | 'rootVariant' | 'iconSize' | 'defaultValue' | 'value' | 'onChange' | 'onReset'\n>;\n\nexport const IconPicker = ({ ...props }: ThemedClassName<IconPickerProps>) => {\n const { t } = useTranslation(osTranslations);\n\n return (\n <PickerButton\n Component={IconPreview}\n label={t('select-icon.label')}\n icon='ph--selection--regular'\n values={iconValues}\n {...props}\n />\n );\n};\n\nconst IconPreview = ({ value, size }: { value: string; size?: IconProps['size'] }) => {\n return <Icon icon={`ph--${value}--regular`} size={size} />;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/components/EmojiPicker/EmojiPicker.tsx","../../src/components/PickerButton/PickerButton.tsx","../../src/components/HuePicker/HuePicker.tsx","../../src/components/IconPicker/IconPicker.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport './emoji.css';\n\nimport React, { Suspense, lazy, useState } from 'react';\n\nimport { useControllableState } from '@dxos/react-hooks';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Icon from '@dxos/react-ui/Icon';\nimport * as Popover from '@dxos/react-ui/Popover';\nimport type * as Util from '@dxos/react-ui/Util';\nimport { osTranslations } from '@dxos/ui-theme';\n\n/**\n * emoji-mart plus its emoji database is ~480 KB; loading it with the barrel put it in every\n * tab's boot graph, so the panel loads on first open instead.\n */\nconst EmojiMartPanel = lazy(() => import('./EmojiMartPanel.tsx'));\n\nexport type EmojiPickerProps = Util.ThemedClassName<{\n disabled?: boolean;\n size?: Button.RootProps['size'];\n defaultEmoji?: string;\n emoji?: string;\n onChangeEmoji?: (nextEmoji: string) => void;\n onClickClear?: Button.RootProps['onClick'];\n triggerVariant?: Button.RootProps['variant'];\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 size,\n emoji,\n disabled,\n defaultEmoji,\n onChangeEmoji,\n}: Omit<EmojiPickerProps, 'onClickClear'>) => {\n const { t } = Hooks.useTranslation(osTranslations);\n const themeMode = Hooks.useThemeMode();\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 <Popover.Root\n open={emojiPickerOpen}\n onOpenChange={({ open: nextOpen }) => {\n setEmojiPickerOpen(nextOpen);\n }}\n positioning={{ placement: 'bottom' }}\n >\n <Popover.Trigger asChild>\n <Button.Root\n size={size}\n label={t('select-emoji.label')}\n icon='ph--smiley--regular'\n iconOnly\n tooltipSide='bottom'\n disabled={disabled}\n />\n </Popover.Trigger>\n <Popover.Content\n onKeyDownCapture={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n setEmojiPickerOpen(false);\n }\n }}\n >\n <Suspense fallback={null}>\n <EmojiMartPanel\n onEmojiSelect={({ native }: { native?: string }) => {\n if (native) {\n setEmojiValue(native);\n setEmojiPickerOpen(false);\n }\n }}\n themeMode={themeMode}\n />\n </Suspense>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\n/**\n * A button for picking an emoji alongside a button for unsetting it.\n */\nexport const EmojiPickerBlock = ({\n disabled,\n defaultEmoji,\n emoji,\n onChangeEmoji,\n onClickClear,\n triggerVariant = 'ghost',\n classNames,\n}: EmojiPickerProps) => {\n const { t } = Hooks.useTranslation(osTranslations);\n const [isMd] = Hooks.useMediaQuery('md');\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 <Button.Group classNames={classNames}>\n <Popover.Root\n open={emojiPickerOpen}\n onOpenChange={({ open }) => setEmojiPickerOpen(open)}\n positioning={{ placement: 'right', gutter: isMd ? 0 : -310, overflowPadding: 8 }}\n >\n <Popover.Trigger asChild>\n <Button.Root variant={triggerVariant} classNames='text-xl' disabled={disabled}>\n <span className='sr-only'>{t('select-emoji.label')}</span>\n <span>{emojiValue}</span>\n <Icon.Icon icon='ph--caret-down--bold' size='xs' />\n </Button.Root>\n </Popover.Trigger>\n {/* Portalled, like `EmojiPickerToolbarButton` above and `PickerButton` (which is why the hue\n picker never had this problem): rendered in place, a 300px panel is clipped by the first\n scrolling ancestor — in the profile page, the settings panel's own overflow. */}\n <Popover.Content\n classNames='p-0'\n onKeyDownCapture={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n setEmojiPickerOpen(false);\n }\n }}\n >\n <Suspense fallback={null}>\n <EmojiMartPanel\n onEmojiSelect={({ native }: { native?: string }) => {\n if (native) {\n setEmojiValue(native);\n setEmojiPickerOpen(false);\n }\n }}\n />\n </Suspense>\n </Popover.Content>\n </Popover.Root>\n <Button.Root\n icon='ph--arrow-counter-clockwise--regular'\n iconOnly\n label={t('clear.label')}\n tooltipSide='right'\n variant={triggerVariant}\n onClick={onClickClear}\n disabled={disabled}\n />\n </Button.Group>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type FC, useEffect, useState } from 'react';\n\nimport { useControllableState } from '@dxos/react-hooks';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as Icon from '@dxos/react-ui/Icon';\nimport * as Menu from '@dxos/react-ui/Menu';\nimport * as Tooltip from '@dxos/react-ui/Tooltip';\nimport type * as Util from '@dxos/react-ui/Util';\n\nexport type PickerButtonProps = Util.ThemedClassName<{\n Component: FC<{ value: string; size?: Icon.IconProps['size'] }>;\n label: string;\n icon: string;\n values: readonly string[];\n disabled?: boolean;\n defaultValue?: string;\n value?: string;\n onChange?: (value: string) => void;\n onReset?: () => void;\n rootVariant?: 'button' | 'toolbar-button';\n iconSize?: Icon.IconProps['size'];\n}>;\n\n/** Menu value of the reset row; outside every picker's value set. */\nconst RESET = '__reset__';\n\nexport const PickerButton = ({\n Component,\n disabled,\n classNames,\n defaultValue: defaultValueProp,\n value: valueProp,\n values,\n label,\n icon,\n onChange,\n onReset,\n rootVariant = 'button',\n iconSize,\n}: PickerButtonProps) => {\n const [value, setValue] = useControllableState<string>({\n prop: valueProp,\n defaultProp: defaultValueProp,\n onChange,\n });\n // TODO(burdon): useControllableState doesn't update the prop when the value is changed. Replace it.\n useEffect(() => setValue(valueProp), [valueProp]);\n\n const [open, setOpen] = useState<boolean>(false);\n\n return (\n <Menu.Root open={open} onOpenChange={({ open }) => setOpen(open)} positioning={{ placement: 'bottom' }}>\n {/* The menu trigger is outermost: both machines find the button by its id, and the tooltip adopts\n the id it is handed while the menu would lose its own to one set above it. */}\n <Menu.Trigger asChild>\n <Tooltip.Trigger asChild content={label} side='bottom'>\n <Button.Root\n variant={rootVariant === 'toolbar-button' ? 'ghost' : 'default'}\n iconOnly\n showTooltip={false}\n label={label}\n caretDown\n classNames={classNames}\n disabled={disabled}\n >\n {(value && <Component value={value} size={iconSize} />) || <Icon.Icon icon={icon} size={iconSize} />}\n </Button.Root>\n </Tooltip.Trigger>\n </Menu.Trigger>\n <Menu.Content columns={6}>\n {values.map((_value) => {\n return (\n <Menu.CheckboxItem\n key={_value}\n item={{ value: _value, label: _value }}\n checked={_value === value}\n onCheckedChange={() => setValue(_value)}\n >\n <Component value={_value} size={iconSize} />\n </Menu.CheckboxItem>\n );\n })}\n {onReset && (\n <Menu.Item item={{ value: RESET, label: 'Reset' }} onClick={() => onReset()}>\n <Icon.Icon icon='ph--x--regular' size={iconSize} />\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport type * as Button from '@dxos/react-ui/Button';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport type * as Util from '@dxos/react-ui/Util';\nimport { getSize, osTranslations } from '@dxos/ui-theme';\nimport { hues } from '@dxos/ui-types';\n\nimport { PickerButton, type PickerButtonProps } from '../PickerButton/index.ts';\n\nexport type HuePickerProps = {\n /** Replaces the generic \"select hue\" label (tooltip and screen-reader text). */\n label?: string;\n disabled?: boolean;\n defaultValue?: string;\n value?: string;\n onChange?: (nextHue: string) => void;\n onReset?: Button.RootProps['onClick'];\n} & Pick<PickerButtonProps, 'disabled' | 'defaultValue' | 'value' | 'onChange' | 'onReset' | 'rootVariant'>;\n\nexport const HuePicker = ({ label, ...props }: Util.ThemedClassName<HuePickerProps>) => {\n const { t } = Hooks.useTranslation(osTranslations);\n\n return (\n <PickerButton\n Component={HuePreview}\n label={label ?? t('select-hue.label')}\n icon='ph--palette--regular'\n values={hues}\n {...props}\n />\n );\n};\n\n/** Next icon sizes as the Tailwind steps the preview's square is drawn at. */\nconst PREVIEW_SIZES: Record<Util.Size, 3 | 3.5 | 4 | 5 | 6> = { xs: 3, sm: 3.5, md: 4, lg: 5, xl: 6 };\n\nconst HuePreview = ({ value, size: iconSize = 'md' }: { value: string; size?: Util.Size }) => {\n const size = PREVIEW_SIZES[iconSize];\n return (\n <div className='flex justify-center items-center'>\n <svg viewBox={`0 0 ${size} ${size}`} className={getSize(size)}>\n <rect x={0} y={0} width={size} height={size} fill={`var(--color-${value}-surface)`} strokeWidth={4} />\n </svg>\n </div>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport type * as Button from '@dxos/react-ui/Button';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Icon from '@dxos/react-ui/Icon';\nimport type * as Util from '@dxos/react-ui/Util';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { iconValues } from '@dxos/ui-types';\n\nimport { PickerButton, type PickerButtonProps } from '../PickerButton/index.ts';\n\nexport type IconPickerProps = {\n disabled?: boolean;\n defaultValue?: string;\n value?: string;\n onChange?: (nextHue: string) => void;\n onReset?: Button.RootProps['onClick'];\n} & Pick<\n PickerButtonProps,\n 'disabled' | 'rootVariant' | 'iconSize' | 'defaultValue' | 'value' | 'onChange' | 'onReset'\n>;\n\nexport const IconPicker = ({ ...props }: Util.ThemedClassName<IconPickerProps>) => {\n const { t } = Hooks.useTranslation(osTranslations);\n\n return (\n <PickerButton\n Component={IconPreview}\n label={t('select-icon.label')}\n icon='ph--selection--regular'\n values={iconValues}\n {...props}\n />\n );\n};\n\nconst IconPreview = ({ value, size }: { value: string; size?: Icon.IconProps['size'] }) => {\n return <Icon.Icon icon={`ph--${value}--regular`} size={size} />;\n};\n"],"mappings":"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"}
@@ -1,18 +1,20 @@
1
1
  import './emoji.css';
2
2
  import React from 'react';
3
- import { type ButtonProps, type ThemedClassName } from '@dxos/react-ui';
4
- export type EmojiPickerProps = ThemedClassName<{
3
+ import * as Button from '@dxos/react-ui/Button';
4
+ import type * as Util from '@dxos/react-ui/Util';
5
+ export type EmojiPickerProps = Util.ThemedClassName<{
5
6
  disabled?: boolean;
7
+ size?: Button.RootProps['size'];
6
8
  defaultEmoji?: string;
7
9
  emoji?: string;
8
10
  onChangeEmoji?: (nextEmoji: string) => void;
9
- onClickClear?: ButtonProps['onClick'];
10
- triggerVariant?: ButtonProps['variant'];
11
+ onClickClear?: Button.RootProps['onClick'];
12
+ triggerVariant?: Button.RootProps['variant'];
11
13
  }>;
12
14
  /**
13
15
  * A toolbar button for picking an emoji. Use only in `role=toolbar` elements. Unable to unset the value.
14
16
  */
15
- export declare const EmojiPickerToolbarButton: ({ classNames, emoji, disabled, defaultEmoji, onChangeEmoji, }: Omit<EmojiPickerProps, 'onClickClear'>) => React.JSX.Element;
17
+ export declare const EmojiPickerToolbarButton: ({ size, emoji, disabled, defaultEmoji, onChangeEmoji, }: Omit<EmojiPickerProps, 'onClickClear'>) => React.JSX.Element;
16
18
  /**
17
19
  * A button for picking an emoji alongside a button for unsetting it.
18
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiPicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/EmojiPicker/EmojiPicker.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAGrB,OAAO,KAAmC,MAAM,OAAO,CAAC;AAExD,OAAO,EAGL,KAAK,WAAW,EAIhB,KAAK,eAAe,EAKrB,MAAM,gBAAgB,CAAC;AASxB,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC;IAC7C,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;IACtC,cAAc,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CACzC,CAAC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,wBAAwB,kEAMlC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,sBAsDxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,gGAQ1B,gBAAgB,sBA8DlB,CAAC"}
1
+ {"version":3,"file":"EmojiPicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/EmojiPicker/EmojiPicker.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,KAAmC,MAAM,OAAO,CAAC;AAGxD,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAIhD,OAAO,KAAK,KAAK,IAAI,MAAM,qBAAqB,CAAC;AASjD,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,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,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9C,CAAC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,wBAAwB,4DAMlC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,sBAoDxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,gGAQ1B,gBAAgB,sBA6DlB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import EmojiPicker from '@emoji-mart/react';
2
2
  import { type StoryObj } from '@storybook/react-vite';
3
- import { type EmojiPickerProps } from './EmojiPicker';
3
+ import { type EmojiPickerProps } from './EmojiPicker.tsx';
4
4
  declare const meta: {
5
5
  title: string;
6
6
  component: typeof EmojiPicker;
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/EmojiPicker/EmojiPicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjE,OAAO,EAAoB,KAAK,gBAAgB,EAA4B,MAAM,eAAe,CAAC;AAElG,QAAA,MAAM,IAAI;;;;CAI0B,CAAC;eAEtB,IAAI;AA2BnB,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,gBAAgB,CAKpD,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAK5C,CAAC"}
1
+ {"version":3,"file":"EmojiPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/EmojiPicker/EmojiPicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjE,OAAO,EAAoB,KAAK,gBAAgB,EAA4B,MAAM,mBAAmB,CAAC;AAEtG,QAAA,MAAM,IAAI;;;;CAI0B,CAAC;eAEtB,IAAI;AA2BnB,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,gBAAgB,CAKpD,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAK5C,CAAC"}
@@ -1,2 +1,2 @@
1
- export * from './EmojiPicker';
1
+ export * from './EmojiPicker.tsx';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/EmojiPicker/index.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/EmojiPicker/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC"}
@@ -1,12 +1,15 @@
1
1
  import React from 'react';
2
- import { type ButtonProps, type ThemedClassName } from '@dxos/react-ui';
3
- import { type PickerButtonProps } from '../PickerButton';
2
+ import type * as Button from '@dxos/react-ui/Button';
3
+ import type * as Util from '@dxos/react-ui/Util';
4
+ import { type PickerButtonProps } from '../PickerButton/index.ts';
4
5
  export type HuePickerProps = {
6
+ /** Replaces the generic "select hue" label (tooltip and screen-reader text). */
7
+ label?: string;
5
8
  disabled?: boolean;
6
9
  defaultValue?: string;
7
10
  value?: string;
8
11
  onChange?: (nextHue: string) => void;
9
- onReset?: ButtonProps['onClick'];
12
+ onReset?: Button.RootProps['onClick'];
10
13
  } & Pick<PickerButtonProps, 'disabled' | 'defaultValue' | 'value' | 'onChange' | 'onReset' | 'rootVariant'>;
11
- export declare const HuePicker: (props: ThemedClassName<HuePickerProps>) => React.JSX.Element;
14
+ export declare const HuePicker: ({ label, ...props }: Util.ThemedClassName<HuePickerProps>) => React.JSX.Element;
12
15
  //# sourceMappingURL=HuePicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HuePicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/HuePicker/HuePicker.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,WAAW,EAAkB,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAIxG,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CAClC,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC,CAAC;AAE5G,eAAO,MAAM,SAAS,UAAW,eAAe,CAAC,cAAc,CAAC,sBAY/D,CAAC"}
1
+ {"version":3,"file":"HuePicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/HuePicker/HuePicker.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAIjD,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG;IAC3B,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;CACvC,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC,CAAC;AAE5G,eAAO,MAAM,SAAS,wBAAyB,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,sBAYlF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type StoryObj } from '@storybook/react-vite';
2
2
  import React from 'react';
3
- import { HuePicker, type HuePickerProps } from './HuePicker';
3
+ import { HuePicker, type HuePickerProps } from './HuePicker.tsx';
4
4
  declare const DefaultStory: (props: HuePickerProps) => React.JSX.Element;
5
5
  declare const meta: {
6
6
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"HuePicker.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/HuePicker/HuePicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7D,QAAA,MAAM,YAAY,UAAW,cAAc,sBAc1C,CAAC;AAEF,QAAA,MAAM,IAAI;;;;;CAKwB,CAAC;eAEpB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC"}
1
+ {"version":3,"file":"HuePicker.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/HuePicker/HuePicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjE,QAAA,MAAM,YAAY,UAAW,cAAc,sBAc1C,CAAC;AAEF,QAAA,MAAM,IAAI;;;;;CAKwB,CAAC;eAEpB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC"}
@@ -1,2 +1,2 @@
1
- export * from './HuePicker';
1
+ export * from './HuePicker.tsx';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/HuePicker/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/HuePicker/index.ts"],"names":[],"mappings":"AAIA,cAAc,iBAAiB,CAAC"}
@@ -1,12 +1,13 @@
1
1
  import React from 'react';
2
- import { type ButtonProps, type ThemedClassName } from '@dxos/react-ui';
3
- import { type PickerButtonProps } from '../PickerButton';
2
+ import type * as Button from '@dxos/react-ui/Button';
3
+ import type * as Util from '@dxos/react-ui/Util';
4
+ import { type PickerButtonProps } from '../PickerButton/index.ts';
4
5
  export type IconPickerProps = {
5
6
  disabled?: boolean;
6
7
  defaultValue?: string;
7
8
  value?: string;
8
9
  onChange?: (nextHue: string) => void;
9
- onReset?: ButtonProps['onClick'];
10
+ onReset?: Button.RootProps['onClick'];
10
11
  } & Pick<PickerButtonProps, 'disabled' | 'rootVariant' | 'iconSize' | 'defaultValue' | 'value' | 'onChange' | 'onReset'>;
11
- export declare const IconPicker: ({ ...props }: ThemedClassName<IconPickerProps>) => React.JSX.Element;
12
+ export declare const IconPicker: ({ ...props }: Util.ThemedClassName<IconPickerProps>) => React.JSX.Element;
12
13
  //# sourceMappingURL=IconPicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconPicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/IconPicker/IconPicker.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,WAAW,EAAwB,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAI9G,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CAClC,GAAG,IAAI,CACN,iBAAiB,EACjB,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAC5F,CAAC;AAEF,eAAO,MAAM,UAAU,iBAAkB,eAAe,CAAC,eAAe,CAAC,sBAYxE,CAAC"}
1
+ {"version":3,"file":"IconPicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/IconPicker/IconPicker.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAGrD,OAAO,KAAK,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAIjD,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;CACvC,GAAG,IAAI,CACN,iBAAiB,EACjB,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAC5F,CAAC;AAEF,eAAO,MAAM,UAAU,iBAAkB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,sBAY7E,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type StoryObj } from '@storybook/react-vite';
2
2
  import React from 'react';
3
- import { IconPicker, type IconPickerProps } from './IconPicker';
3
+ import { IconPicker, type IconPickerProps } from './IconPicker.tsx';
4
4
  declare const DefaultStory: (props: IconPickerProps) => React.JSX.Element;
5
5
  declare const meta: {
6
6
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"IconPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/IconPicker/IconPicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhE,QAAA,MAAM,YAAY,UAAW,eAAe,sBAS3C,CAAC;AAEF,QAAA,MAAM,IAAI;;;;;CAKyB,CAAC;eAErB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC"}
1
+ {"version":3,"file":"IconPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/IconPicker/IconPicker.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEpE,QAAA,MAAM,YAAY,UAAW,eAAe,sBAS3C,CAAC;AAEF,QAAA,MAAM,IAAI;;;;;CAKyB,CAAC;eAErB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC"}
@@ -1,2 +1,2 @@
1
- export * from './IconPicker';
1
+ export * from './IconPicker.tsx';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/IconPicker/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/IconPicker/index.ts"],"names":[],"mappings":"AAIA,cAAc,kBAAkB,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import React, { type FC } from 'react';
2
- import { type IconProps, type ThemedClassName } from '@dxos/react-ui';
3
- export type PickerButtonProps = ThemedClassName<{
2
+ import * as Icon from '@dxos/react-ui/Icon';
3
+ import type * as Util from '@dxos/react-ui/Util';
4
+ export type PickerButtonProps = Util.ThemedClassName<{
4
5
  Component: FC<{
5
6
  value: string;
6
- size?: IconProps['size'];
7
+ size?: Icon.IconProps['size'];
7
8
  }>;
8
9
  label: string;
9
10
  icon: string;
@@ -14,7 +15,7 @@ export type PickerButtonProps = ThemedClassName<{
14
15
  onChange?: (value: string) => void;
15
16
  onReset?: () => void;
16
17
  rootVariant?: 'button' | 'toolbar-button';
17
- iconSize?: IconProps['size'];
18
+ iconSize?: Icon.IconProps['size'];
18
19
  }>;
19
20
  export declare const PickerButton: ({ Component, disabled, classNames, defaultValue: defaultValueProp, value: valueProp, values, label, icon, onChange, onReset, rootVariant, iconSize, }: PickerButtonProps) => React.JSX.Element;
20
21
  //# sourceMappingURL=PickerButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PickerButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/PickerButton/PickerButton.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAuB,MAAM,OAAO,CAAC;AAE5D,OAAO,EAA8B,KAAK,SAAS,EAAE,KAAK,eAAe,EAAoB,MAAM,gBAAgB,CAAC;AAEpH,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC;IAC9C,SAAS,EAAE,EAAE,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;CAC9B,CAAC,CAAC;AAEH,eAAO,MAAM,YAAY,0JAatB,iBAAiB,sBAoDnB,CAAC"}
1
+ {"version":3,"file":"PickerButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/PickerButton/PickerButton.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAuB,MAAM,OAAO,CAAC;AAI5D,OAAO,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAG5C,OAAO,KAAK,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC;IACnD,SAAS,EAAE,EAAE,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IAC1C,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;CACnC,CAAC,CAAC;AAKH,eAAO,MAAM,YAAY,0JAatB,iBAAiB,sBAmDnB,CAAC"}
@@ -1,2 +1,2 @@
1
- export * from './PickerButton';
1
+ export * from './PickerButton.tsx';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/PickerButton/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/PickerButton/index.ts"],"names":[],"mappings":"AAIA,cAAc,oBAAoB,CAAC"}
@@ -1,5 +1,5 @@
1
- export * from './EmojiPicker';
2
- export * from './HuePicker';
3
- export * from './IconPicker';
4
- export * from './PickerButton';
1
+ export * from './EmojiPicker/index.ts';
2
+ export * from './HuePicker/index.ts';
3
+ export * from './IconPicker/index.ts';
4
+ export * from './PickerButton/index.ts';
5
5
  //# sourceMappingURL=index.d.ts.map