@dxos/react-ui-searchlist 0.8.4-main.fd6878d → 0.8.4-main.fffef41
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.
- package/dist/lib/browser/index.mjs +258 -139
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +258 -139
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/Combobox/Combobox.d.ts +44 -0
- package/dist/types/src/components/Combobox/Combobox.d.ts.map +1 -0
- package/dist/types/src/components/Combobox/Combobox.stories.d.ts +21 -0
- package/dist/types/src/components/Combobox/Combobox.stories.d.ts.map +1 -0
- package/dist/types/src/components/Combobox/index.d.ts +2 -0
- package/dist/types/src/components/Combobox/index.d.ts.map +1 -0
- package/dist/types/src/components/Listbox/Listbox.d.ts +31 -0
- package/dist/types/src/components/Listbox/Listbox.d.ts.map +1 -0
- package/dist/types/src/components/Listbox/Listbox.stories.d.ts +21 -0
- package/dist/types/src/components/Listbox/Listbox.stories.d.ts.map +1 -0
- package/dist/types/src/components/Listbox/index.d.ts +2 -0
- package/dist/types/src/components/Listbox/index.d.ts.map +1 -0
- package/dist/types/src/components/{SearchList.d.ts → SearchList/SearchList.d.ts} +7 -27
- package/dist/types/src/components/SearchList/SearchList.d.ts.map +1 -0
- package/dist/types/src/components/SearchList/SearchList.stories.d.ts +25 -0
- package/dist/types/src/components/SearchList/SearchList.stories.d.ts.map +1 -0
- package/dist/types/src/components/SearchList/index.d.ts +2 -0
- package/dist/types/src/components/SearchList/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +2 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +3 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -14
- package/src/components/Combobox/Combobox.stories.tsx +57 -0
- package/src/components/Combobox/Combobox.tsx +335 -0
- package/src/components/Combobox/index.ts +5 -0
- package/src/components/Listbox/Listbox.stories.tsx +53 -0
- package/src/components/Listbox/Listbox.tsx +209 -0
- package/src/components/Listbox/index.ts +5 -0
- package/src/components/SearchList/SearchList.stories.tsx +64 -0
- package/src/components/SearchList/SearchList.tsx +163 -0
- package/src/components/SearchList/index.ts +5 -0
- package/src/components/index.ts +2 -0
- package/src/index.ts +0 -1
- package/src/translations.ts +3 -1
- package/dist/types/src/components/SearchList.d.ts.map +0 -1
- package/dist/types/src/components/SearchList.stories.d.ts +0 -15
- package/dist/types/src/components/SearchList.stories.d.ts.map +0 -1
- package/dist/types/src/composites/PopoverCombobox.d.ts +0 -32
- package/dist/types/src/composites/PopoverCombobox.d.ts.map +0 -1
- package/dist/types/src/composites/PopoverCombobox.stories.d.ts +0 -28
- package/dist/types/src/composites/PopoverCombobox.stories.d.ts.map +0 -1
- package/dist/types/src/composites/index.d.ts +0 -2
- package/dist/types/src/composites/index.d.ts.map +0 -1
- package/src/components/SearchList.stories.tsx +0 -47
- package/src/components/SearchList.tsx +0 -250
- package/src/composites/PopoverCombobox.stories.tsx +0 -44
- package/src/composites/PopoverCombobox.tsx +0 -208
- package/src/composites/index.ts +0 -5
|
@@ -1,24 +1,44 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
|
|
3
|
-
// src/components/
|
|
4
|
-
import { useSignals as
|
|
3
|
+
// src/components/Combobox/Combobox.tsx
|
|
4
|
+
import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
|
|
5
5
|
import { createContext } from "@radix-ui/react-context";
|
|
6
6
|
import { useControllableState } from "@radix-ui/react-use-controllable-state";
|
|
7
|
+
import React2, { forwardRef as forwardRef2, useCallback } from "react";
|
|
8
|
+
import { Button, Icon, Popover } from "@dxos/react-ui";
|
|
9
|
+
import { useId } from "@dxos/react-ui";
|
|
10
|
+
import { mx as mx2, staticPlaceholderText } from "@dxos/react-ui-theme";
|
|
11
|
+
|
|
12
|
+
// src/components/SearchList/SearchList.tsx
|
|
13
|
+
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
7
14
|
import { CommandEmpty, CommandInput, CommandItem, CommandList, CommandRoot } from "cmdk";
|
|
8
|
-
import React, { forwardRef
|
|
9
|
-
import {
|
|
10
|
-
import { mx
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
import React, { forwardRef } from "react";
|
|
16
|
+
import { useDensityContext, useElevationContext, useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
17
|
+
import { mx } from "@dxos/react-ui-theme";
|
|
18
|
+
|
|
19
|
+
// src/translations.ts
|
|
20
|
+
var translationKey = "react-ui-searchlist";
|
|
21
|
+
var translations = [
|
|
22
|
+
{
|
|
23
|
+
"en-US": {
|
|
24
|
+
[translationKey]: {
|
|
25
|
+
"search.placeholder": "Search..."
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
// src/components/SearchList/SearchList.tsx
|
|
32
|
+
var commandItem = "flex items-center overflow-hidden";
|
|
33
|
+
var searchListItem = "plb-1 pli-2 rounded-sm select-none cursor-pointer data-[selected]:bg-hoverOverlay hover:bg-hoverOverlay";
|
|
13
34
|
var SEARCHLIST_NAME = "SearchList";
|
|
14
35
|
var SEARCHLIST_ITEM_NAME = "SearchListItem";
|
|
15
|
-
var [ComboboxProvider, useComboboxContext] = createContext(COMBOBOX_NAME, {});
|
|
16
36
|
var SearchListRoot = /* @__PURE__ */ forwardRef(({ children, classNames, ...props }, forwardedRef) => {
|
|
17
37
|
var _effect = _useSignals();
|
|
18
38
|
try {
|
|
19
39
|
return /* @__PURE__ */ React.createElement(CommandRoot, {
|
|
20
40
|
...props,
|
|
21
|
-
className: mx(
|
|
41
|
+
className: mx(classNames),
|
|
22
42
|
ref: forwardedRef
|
|
23
43
|
}, children);
|
|
24
44
|
} finally {
|
|
@@ -26,15 +46,18 @@ var SearchListRoot = /* @__PURE__ */ forwardRef(({ children, classNames, ...prop
|
|
|
26
46
|
}
|
|
27
47
|
});
|
|
28
48
|
SearchListRoot.displayName = SEARCHLIST_NAME;
|
|
29
|
-
var SearchListInput = /* @__PURE__ */ forwardRef(({
|
|
49
|
+
var SearchListInput = /* @__PURE__ */ forwardRef(({ classNames, density: propsDensity, elevation: propsElevation, variant, ...props }, forwardedRef) => {
|
|
30
50
|
var _effect = _useSignals();
|
|
31
51
|
try {
|
|
52
|
+
const { t } = useTranslation(translationKey);
|
|
53
|
+
const placeholder = props.placeholder ?? t("search.placeholder");
|
|
32
54
|
const { hasIosKeyboard } = useThemeContext();
|
|
33
55
|
const { tx } = useThemeContext();
|
|
34
56
|
const density = useDensityContext(propsDensity);
|
|
35
57
|
const elevation = useElevationContext(propsElevation);
|
|
36
58
|
return /* @__PURE__ */ React.createElement(CommandInput, {
|
|
37
59
|
...props,
|
|
60
|
+
placeholder,
|
|
38
61
|
className: tx("input.input", "input", {
|
|
39
62
|
variant,
|
|
40
63
|
disabled: props.disabled,
|
|
@@ -74,23 +97,12 @@ var SearchListEmpty = /* @__PURE__ */ forwardRef(({ children, classNames, ...pro
|
|
|
74
97
|
_effect.f();
|
|
75
98
|
}
|
|
76
99
|
});
|
|
77
|
-
var SearchListItem = /* @__PURE__ */ forwardRef(({ children, classNames,
|
|
100
|
+
var SearchListItem = /* @__PURE__ */ forwardRef(({ children, classNames, ...props }, forwardedRef) => {
|
|
78
101
|
var _effect = _useSignals();
|
|
79
102
|
try {
|
|
80
|
-
const { onValueChange, onOpenChange } = useComboboxContext(SEARCHLIST_ITEM_NAME);
|
|
81
|
-
const handleSelect = useCallback((nextValue) => {
|
|
82
|
-
onValueChange?.(nextValue);
|
|
83
|
-
onOpenChange?.(false);
|
|
84
|
-
onSelect?.(nextValue);
|
|
85
|
-
}, [
|
|
86
|
-
onValueChange,
|
|
87
|
-
onOpenChange,
|
|
88
|
-
onSelect
|
|
89
|
-
]);
|
|
90
103
|
return /* @__PURE__ */ React.createElement(CommandItem, {
|
|
91
104
|
...props,
|
|
92
|
-
|
|
93
|
-
className: mx("p-1 rounded select-none cursor-pointer data-[selected]:bg-hoverOverlay", classNames),
|
|
105
|
+
className: mx(searchListItem, classNames),
|
|
94
106
|
ref: forwardedRef
|
|
95
107
|
}, children);
|
|
96
108
|
} finally {
|
|
@@ -98,64 +110,6 @@ var SearchListItem = /* @__PURE__ */ forwardRef(({ children, classNames, onSelec
|
|
|
98
110
|
}
|
|
99
111
|
});
|
|
100
112
|
SearchListItem.displayName = SEARCHLIST_ITEM_NAME;
|
|
101
|
-
var ComboboxRoot = ({ modalId: propsModalId, open: propsOpen, defaultOpen, onOpenChange: propsOnOpenChange, value: propsValue, defaultValue, onValueChange: propsOnValueChange, placeholder, children }) => {
|
|
102
|
-
var _effect = _useSignals();
|
|
103
|
-
try {
|
|
104
|
-
const modalId = useId(COMBOBOX_NAME, propsModalId);
|
|
105
|
-
const [open = false, onOpenChange] = useControllableState({
|
|
106
|
-
prop: propsOpen,
|
|
107
|
-
onChange: propsOnOpenChange,
|
|
108
|
-
defaultProp: defaultOpen
|
|
109
|
-
});
|
|
110
|
-
const [value = "", onValueChange] = useControllableState({
|
|
111
|
-
prop: propsValue,
|
|
112
|
-
onChange: propsOnValueChange,
|
|
113
|
-
defaultProp: defaultValue
|
|
114
|
-
});
|
|
115
|
-
return /* @__PURE__ */ React.createElement(ComboboxProvider, {
|
|
116
|
-
isCombobox: true,
|
|
117
|
-
modalId,
|
|
118
|
-
open,
|
|
119
|
-
onOpenChange,
|
|
120
|
-
value,
|
|
121
|
-
onValueChange,
|
|
122
|
-
placeholder
|
|
123
|
-
}, children);
|
|
124
|
-
} finally {
|
|
125
|
-
_effect.f();
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
ComboboxRoot.displayName = COMBOBOX_NAME;
|
|
129
|
-
var ComboboxTrigger = /* @__PURE__ */ forwardRef(({ children, onClick, ...props }, forwardedRef) => {
|
|
130
|
-
var _effect = _useSignals();
|
|
131
|
-
try {
|
|
132
|
-
const { modalId, open, onOpenChange, placeholder, value } = useComboboxContext(COMBOBOX_TRIGGER_NAME);
|
|
133
|
-
const handleClick = useCallback((event) => {
|
|
134
|
-
onClick?.(event);
|
|
135
|
-
onOpenChange?.(true);
|
|
136
|
-
}, [
|
|
137
|
-
onClick,
|
|
138
|
-
onOpenChange
|
|
139
|
-
]);
|
|
140
|
-
return /* @__PURE__ */ React.createElement(Button, {
|
|
141
|
-
...props,
|
|
142
|
-
role: "combobox",
|
|
143
|
-
"aria-expanded": open,
|
|
144
|
-
"aria-controls": modalId,
|
|
145
|
-
"aria-haspopup": "dialog",
|
|
146
|
-
onClick: handleClick,
|
|
147
|
-
ref: forwardedRef
|
|
148
|
-
}, children ?? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", {
|
|
149
|
-
className: mx("font-normal text-start flex-1 min-is-0 truncate mie-2", !value && staticPlaceholderText)
|
|
150
|
-
}, value || placeholder), /* @__PURE__ */ React.createElement(Icon, {
|
|
151
|
-
icon: "ph--caret-down--bold",
|
|
152
|
-
size: 3
|
|
153
|
-
})));
|
|
154
|
-
} finally {
|
|
155
|
-
_effect.f();
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
ComboboxTrigger.displayName = COMBOBOX_TRIGGER_NAME;
|
|
159
113
|
var SearchList = {
|
|
160
114
|
Root: SearchListRoot,
|
|
161
115
|
Input: SearchListInput,
|
|
@@ -163,43 +117,48 @@ var SearchList = {
|
|
|
163
117
|
Empty: SearchListEmpty,
|
|
164
118
|
Item: SearchListItem
|
|
165
119
|
};
|
|
166
|
-
var Combobox = {
|
|
167
|
-
Root: ComboboxRoot,
|
|
168
|
-
Trigger: ComboboxTrigger,
|
|
169
|
-
useComboboxContext
|
|
170
|
-
};
|
|
171
120
|
|
|
172
|
-
// src/
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
var
|
|
121
|
+
// src/components/Combobox/Combobox.tsx
|
|
122
|
+
var COMBOBOX_NAME = "Combobox";
|
|
123
|
+
var COMBOBOX_CONTENT_NAME = "ComboboxContent";
|
|
124
|
+
var COMBOBOX_ITEM_NAME = "ComboboxItem";
|
|
125
|
+
var COMBOBOX_TRIGGER_NAME = "ComboboxTrigger";
|
|
126
|
+
var [ComboboxProvider, useComboboxContext] = createContext(COMBOBOX_NAME, {});
|
|
127
|
+
var ComboboxRoot = ({ modal, modalId: propsModalId, open: propsOpen, defaultOpen, onOpenChange: propsOnOpenChange, value: propsValue, defaultValue, onValueChange: propsOnValueChange, placeholder, children }) => {
|
|
178
128
|
var _effect = _useSignals2();
|
|
179
129
|
try {
|
|
180
|
-
const
|
|
130
|
+
const modalId = useId(COMBOBOX_NAME, propsModalId);
|
|
131
|
+
const [open = false, onOpenChange] = useControllableState({
|
|
181
132
|
prop: propsOpen,
|
|
182
133
|
onChange: propsOnOpenChange,
|
|
183
134
|
defaultProp: defaultOpen
|
|
184
135
|
});
|
|
185
|
-
|
|
136
|
+
const [value = "", onValueChange] = useControllableState({
|
|
137
|
+
prop: propsValue,
|
|
138
|
+
onChange: propsOnValueChange,
|
|
139
|
+
defaultProp: defaultValue
|
|
140
|
+
});
|
|
141
|
+
return /* @__PURE__ */ React2.createElement(Popover.Root, {
|
|
186
142
|
open,
|
|
187
143
|
onOpenChange,
|
|
188
|
-
|
|
189
|
-
}, /* @__PURE__ */ React2.createElement(
|
|
144
|
+
modal
|
|
145
|
+
}, /* @__PURE__ */ React2.createElement(ComboboxProvider, {
|
|
146
|
+
isCombobox: true,
|
|
147
|
+
modalId,
|
|
148
|
+
placeholder,
|
|
190
149
|
open,
|
|
191
150
|
onOpenChange,
|
|
192
|
-
|
|
151
|
+
value,
|
|
152
|
+
onValueChange
|
|
193
153
|
}, children));
|
|
194
154
|
} finally {
|
|
195
155
|
_effect.f();
|
|
196
156
|
}
|
|
197
157
|
};
|
|
198
|
-
var
|
|
199
|
-
var PopoverComboboxContent = /* @__PURE__ */ forwardRef2(({ side = "bottom", collisionPadding = 48, sideOffset, align, alignOffset, avoidCollisions, collisionBoundary, arrowPadding, sticky, hideWhenDetached, onOpenAutoFocus, onCloseAutoFocus, onEscapeKeyDown, onPointerDownOutside, onFocusOutside, onInteractOutside, forceMount, children, classNames, ...props }, forwardedRef) => {
|
|
158
|
+
var ComboboxContent = /* @__PURE__ */ forwardRef2(({ side = "bottom", collisionPadding = 48, sideOffset, align, alignOffset, avoidCollisions, collisionBoundary, arrowPadding, sticky, hideWhenDetached, onOpenAutoFocus, onCloseAutoFocus, onEscapeKeyDown, onPointerDownOutside, onFocusOutside, onInteractOutside, forceMount, children, classNames, ...props }, forwardedRef) => {
|
|
200
159
|
var _effect = _useSignals2();
|
|
201
160
|
try {
|
|
202
|
-
const { modalId } =
|
|
161
|
+
const { modalId } = useComboboxContext(COMBOBOX_CONTENT_NAME);
|
|
203
162
|
return /* @__PURE__ */ React2.createElement(Popover.Content, {
|
|
204
163
|
side,
|
|
205
164
|
sideOffset,
|
|
@@ -218,40 +177,62 @@ var PopoverComboboxContent = /* @__PURE__ */ forwardRef2(({ side = "bottom", col
|
|
|
218
177
|
onFocusOutside,
|
|
219
178
|
onInteractOutside,
|
|
220
179
|
forceMount,
|
|
221
|
-
classNames
|
|
180
|
+
classNames: [
|
|
181
|
+
"is-[--radix-popover-trigger-width] max-bs-[--radix-popover-content-available-height] grid grid-rows-[min-content_1fr]",
|
|
182
|
+
classNames
|
|
183
|
+
],
|
|
222
184
|
id: modalId,
|
|
223
185
|
ref: forwardedRef
|
|
224
|
-
}, /* @__PURE__ */ React2.createElement(
|
|
186
|
+
}, /* @__PURE__ */ React2.createElement(SearchList.Root, {
|
|
225
187
|
...props,
|
|
226
188
|
classNames: "contents density-fine",
|
|
227
189
|
role: "none"
|
|
228
|
-
}, children))
|
|
190
|
+
}, children));
|
|
229
191
|
} finally {
|
|
230
192
|
_effect.f();
|
|
231
193
|
}
|
|
232
194
|
});
|
|
233
|
-
|
|
234
|
-
var
|
|
195
|
+
ComboboxContent.displayName = COMBOBOX_CONTENT_NAME;
|
|
196
|
+
var ComboboxTrigger = /* @__PURE__ */ forwardRef2(({ children, onClick, ...props }, forwardedRef) => {
|
|
235
197
|
var _effect = _useSignals2();
|
|
236
198
|
try {
|
|
199
|
+
const { modalId, open, onOpenChange, placeholder, value } = useComboboxContext(COMBOBOX_TRIGGER_NAME);
|
|
200
|
+
const handleClick = useCallback((event) => {
|
|
201
|
+
onClick?.(event);
|
|
202
|
+
onOpenChange?.(true);
|
|
203
|
+
}, [
|
|
204
|
+
onClick,
|
|
205
|
+
onOpenChange
|
|
206
|
+
]);
|
|
237
207
|
return /* @__PURE__ */ React2.createElement(Popover.Trigger, {
|
|
238
208
|
asChild: true
|
|
239
|
-
}, /* @__PURE__ */ React2.createElement(
|
|
209
|
+
}, /* @__PURE__ */ React2.createElement(Button, {
|
|
240
210
|
...props,
|
|
211
|
+
role: "combobox",
|
|
212
|
+
"aria-expanded": open,
|
|
213
|
+
"aria-controls": modalId,
|
|
214
|
+
"aria-haspopup": "dialog",
|
|
215
|
+
onClick: handleClick,
|
|
241
216
|
ref: forwardedRef
|
|
242
|
-
}
|
|
217
|
+
}, children ?? /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("span", {
|
|
218
|
+
className: mx2("font-normal text-start flex-1 min-is-0 truncate mie-2", !value && staticPlaceholderText)
|
|
219
|
+
}, value || placeholder), /* @__PURE__ */ React2.createElement(Icon, {
|
|
220
|
+
icon: "ph--caret-down--bold",
|
|
221
|
+
size: 3
|
|
222
|
+
}))));
|
|
243
223
|
} finally {
|
|
244
224
|
_effect.f();
|
|
245
225
|
}
|
|
246
226
|
});
|
|
247
|
-
|
|
248
|
-
var
|
|
227
|
+
ComboboxTrigger.displayName = COMBOBOX_TRIGGER_NAME;
|
|
228
|
+
var ComboboxVirtualTrigger = Popover.VirtualTrigger;
|
|
229
|
+
var ComboboxInput = /* @__PURE__ */ forwardRef2(({ classNames, ...props }, forwardedRef) => {
|
|
249
230
|
var _effect = _useSignals2();
|
|
250
231
|
try {
|
|
251
232
|
return /* @__PURE__ */ React2.createElement(SearchList.Input, {
|
|
252
233
|
...props,
|
|
253
234
|
classNames: [
|
|
254
|
-
"mli-cardSpacingChrome mbs-cardSpacingChrome is-[calc(100%-2*var(--dx-cardSpacingChrome))]",
|
|
235
|
+
"mli-cardSpacingChrome mbs-cardSpacingChrome mbe-0 is-[calc(100%-2*var(--dx-cardSpacingChrome))]",
|
|
255
236
|
classNames
|
|
256
237
|
],
|
|
257
238
|
ref: forwardedRef
|
|
@@ -260,63 +241,201 @@ var PopoverComboboxInput = /* @__PURE__ */ forwardRef2(({ classNames, ...props }
|
|
|
260
241
|
_effect.f();
|
|
261
242
|
}
|
|
262
243
|
});
|
|
263
|
-
var
|
|
244
|
+
var ComboboxList = /* @__PURE__ */ forwardRef2(({ classNames, ...props }, forwardedRef) => {
|
|
264
245
|
var _effect = _useSignals2();
|
|
265
246
|
try {
|
|
266
|
-
return /* @__PURE__ */ React2.createElement(
|
|
267
|
-
constrainInline,
|
|
268
|
-
constrainBlock
|
|
269
|
-
}, /* @__PURE__ */ React2.createElement(SearchList.Content, {
|
|
247
|
+
return /* @__PURE__ */ React2.createElement(SearchList.Content, {
|
|
270
248
|
...props,
|
|
249
|
+
classNames: [
|
|
250
|
+
"min-bs-0 overflow-y-auto plb-cardSpacingChrome",
|
|
251
|
+
classNames
|
|
252
|
+
],
|
|
271
253
|
ref: forwardedRef
|
|
272
|
-
})
|
|
254
|
+
});
|
|
273
255
|
} finally {
|
|
274
256
|
_effect.f();
|
|
275
257
|
}
|
|
276
258
|
});
|
|
277
|
-
var
|
|
259
|
+
var ComboboxItem = /* @__PURE__ */ forwardRef2(({ classNames, onSelect, ...props }, forwardedRef) => {
|
|
278
260
|
var _effect = _useSignals2();
|
|
279
261
|
try {
|
|
262
|
+
const { onValueChange, onOpenChange } = useComboboxContext(COMBOBOX_ITEM_NAME);
|
|
263
|
+
const handleSelect = useCallback((nextValue) => {
|
|
264
|
+
onSelect?.(nextValue);
|
|
265
|
+
onValueChange?.(nextValue);
|
|
266
|
+
onOpenChange?.(false);
|
|
267
|
+
}, [
|
|
268
|
+
onSelect,
|
|
269
|
+
onValueChange,
|
|
270
|
+
onOpenChange
|
|
271
|
+
]);
|
|
280
272
|
return /* @__PURE__ */ React2.createElement(SearchList.Item, {
|
|
281
273
|
...props,
|
|
282
274
|
classNames: [
|
|
283
275
|
"mli-cardSpacingChrome pli-cardSpacingChrome",
|
|
284
276
|
classNames
|
|
285
277
|
],
|
|
278
|
+
onSelect: handleSelect,
|
|
286
279
|
ref: forwardedRef
|
|
287
280
|
});
|
|
288
281
|
} finally {
|
|
289
282
|
_effect.f();
|
|
290
283
|
}
|
|
291
284
|
});
|
|
292
|
-
|
|
293
|
-
var
|
|
294
|
-
var
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
285
|
+
ComboboxItem.displayName = COMBOBOX_ITEM_NAME;
|
|
286
|
+
var ComboboxArrow = Popover.Arrow;
|
|
287
|
+
var ComboboxEmpty = SearchList.Empty;
|
|
288
|
+
var Combobox = {
|
|
289
|
+
Root: ComboboxRoot,
|
|
290
|
+
Content: ComboboxContent,
|
|
291
|
+
Trigger: ComboboxTrigger,
|
|
292
|
+
VirtualTrigger: ComboboxVirtualTrigger,
|
|
293
|
+
Input: ComboboxInput,
|
|
294
|
+
List: ComboboxList,
|
|
295
|
+
Item: ComboboxItem,
|
|
296
|
+
Arrow: ComboboxArrow,
|
|
297
|
+
Empty: ComboboxEmpty
|
|
304
298
|
};
|
|
305
299
|
|
|
306
|
-
// src/
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
300
|
+
// src/components/Listbox/Listbox.tsx
|
|
301
|
+
import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
|
|
302
|
+
import { useArrowNavigationGroup } from "@fluentui/react-tabster";
|
|
303
|
+
import { useComposedRefs } from "@radix-ui/react-compose-refs";
|
|
304
|
+
import { createContextScope } from "@radix-ui/react-context";
|
|
305
|
+
import { useControllableState as useControllableState2 } from "@radix-ui/react-use-controllable-state";
|
|
306
|
+
import React3, { forwardRef as forwardRef3, useCallback as useCallback2, useEffect, useRef } from "react";
|
|
307
|
+
import { Icon as Icon2 } from "@dxos/react-ui";
|
|
308
|
+
import { mx as mx3 } from "@dxos/react-ui-theme";
|
|
309
|
+
var LISTBOX_NAME = "Listbox";
|
|
310
|
+
var LISTBOX_OPTION_NAME = "ListboxOption";
|
|
311
|
+
var LISTBOX_OPTION_LABEL_NAME = "ListboxOptionLabel";
|
|
312
|
+
var LISTBOX_OPTION_INDICATOR_NAME = "ListboxOptionIndicator";
|
|
313
|
+
var [createListboxContext, createListboxScope] = createContextScope(LISTBOX_NAME, []);
|
|
314
|
+
var [createListboxOptionContext, createListboxOptionScope] = createContextScope(LISTBOX_OPTION_NAME, [
|
|
315
|
+
createListboxScope
|
|
316
|
+
]);
|
|
317
|
+
var [ListboxProvider, useListboxContext] = createListboxContext(LISTBOX_NAME);
|
|
318
|
+
var [ListboxOptionProvider, useListboxOptionContext] = createListboxOptionContext(LISTBOX_OPTION_NAME);
|
|
319
|
+
var ListboxRoot = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
|
|
320
|
+
var _effect = _useSignals3();
|
|
321
|
+
try {
|
|
322
|
+
const { __listboxScope, children, classNames, value: propsValue, defaultValue, onValueChange, autoFocus, ...rootProps } = props;
|
|
323
|
+
const arrowGroup = useArrowNavigationGroup({
|
|
324
|
+
axis: "vertical"
|
|
325
|
+
});
|
|
326
|
+
const ref = useRef(null);
|
|
327
|
+
const rootRef = useComposedRefs(ref, forwardedRef);
|
|
328
|
+
const [selectedValue, setSelectedValue] = useControllableState2({
|
|
329
|
+
prop: propsValue,
|
|
330
|
+
defaultProp: defaultValue,
|
|
331
|
+
onChange: onValueChange
|
|
332
|
+
});
|
|
333
|
+
const handleValueChange = (value) => {
|
|
334
|
+
setSelectedValue(value);
|
|
335
|
+
};
|
|
336
|
+
useEffect(() => {
|
|
337
|
+
ref.current?.querySelector('[aria-selected="true"]')?.focus();
|
|
338
|
+
}, [
|
|
339
|
+
autoFocus
|
|
340
|
+
]);
|
|
341
|
+
return /* @__PURE__ */ React3.createElement(ListboxProvider, {
|
|
342
|
+
scope: __listboxScope,
|
|
343
|
+
selectedValue,
|
|
344
|
+
onValueChange: handleValueChange
|
|
345
|
+
}, /* @__PURE__ */ React3.createElement("ul", {
|
|
346
|
+
role: "listbox",
|
|
347
|
+
...rootProps,
|
|
348
|
+
className: mx3("is-full p-cardSpacingChrome", classNames),
|
|
349
|
+
ref: rootRef,
|
|
350
|
+
...arrowGroup
|
|
351
|
+
}, children));
|
|
352
|
+
} finally {
|
|
353
|
+
_effect.f();
|
|
313
354
|
}
|
|
314
|
-
|
|
355
|
+
});
|
|
356
|
+
ListboxRoot.displayName = LISTBOX_NAME;
|
|
357
|
+
var ListboxOption = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
|
|
358
|
+
var _effect = _useSignals3();
|
|
359
|
+
try {
|
|
360
|
+
const { __listboxScope, children, classNames, value, ...rootProps } = props;
|
|
361
|
+
const { selectedValue, onValueChange } = useListboxContext(LISTBOX_OPTION_NAME, __listboxScope);
|
|
362
|
+
const isSelected = selectedValue === value;
|
|
363
|
+
const handleSelect = useCallback2(() => {
|
|
364
|
+
onValueChange(value);
|
|
365
|
+
}, [
|
|
366
|
+
value,
|
|
367
|
+
onValueChange
|
|
368
|
+
]);
|
|
369
|
+
return /* @__PURE__ */ React3.createElement(ListboxOptionProvider, {
|
|
370
|
+
scope: __listboxScope,
|
|
371
|
+
value,
|
|
372
|
+
isSelected
|
|
373
|
+
}, /* @__PURE__ */ React3.createElement("li", {
|
|
374
|
+
role: "option",
|
|
375
|
+
...rootProps,
|
|
376
|
+
"aria-selected": isSelected,
|
|
377
|
+
tabIndex: 0,
|
|
378
|
+
className: mx3("dx-focus-ring", commandItem, searchListItem, classNames),
|
|
379
|
+
onClick: handleSelect,
|
|
380
|
+
onKeyDown: ({ key }) => {
|
|
381
|
+
if ([
|
|
382
|
+
"Enter",
|
|
383
|
+
" "
|
|
384
|
+
].includes(key)) {
|
|
385
|
+
handleSelect();
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
ref: forwardedRef
|
|
389
|
+
}, children));
|
|
390
|
+
} finally {
|
|
391
|
+
_effect.f();
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
ListboxOption.displayName = LISTBOX_OPTION_NAME;
|
|
395
|
+
var ListboxOptionLabel = /* @__PURE__ */ forwardRef3(({ children, classNames, ...rootProps }, forwardedRef) => {
|
|
396
|
+
var _effect = _useSignals3();
|
|
397
|
+
try {
|
|
398
|
+
return /* @__PURE__ */ React3.createElement("span", {
|
|
399
|
+
...rootProps,
|
|
400
|
+
className: mx3("grow truncate", classNames),
|
|
401
|
+
ref: forwardedRef
|
|
402
|
+
}, children);
|
|
403
|
+
} finally {
|
|
404
|
+
_effect.f();
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
ListboxOptionLabel.displayName = LISTBOX_OPTION_LABEL_NAME;
|
|
408
|
+
var ListboxOptionIndicator = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
|
|
409
|
+
var _effect = _useSignals3();
|
|
410
|
+
try {
|
|
411
|
+
const { __listboxOptionScope, classNames, ...rootProps } = props;
|
|
412
|
+
const { isSelected } = useListboxOptionContext(LISTBOX_OPTION_INDICATOR_NAME, __listboxOptionScope);
|
|
413
|
+
return /* @__PURE__ */ React3.createElement(Icon2, {
|
|
414
|
+
icon: "ph--check--regular",
|
|
415
|
+
...rootProps,
|
|
416
|
+
classNames: mx3(!isSelected && "invisible", classNames),
|
|
417
|
+
ref: forwardedRef
|
|
418
|
+
});
|
|
419
|
+
} finally {
|
|
420
|
+
_effect.f();
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
ListboxOptionIndicator.displayName = LISTBOX_OPTION_INDICATOR_NAME;
|
|
424
|
+
var Listbox = {
|
|
425
|
+
Root: ListboxRoot,
|
|
426
|
+
Option: ListboxOption,
|
|
427
|
+
OptionLabel: ListboxOptionLabel,
|
|
428
|
+
OptionIndicator: ListboxOptionIndicator
|
|
429
|
+
};
|
|
315
430
|
export {
|
|
316
431
|
Combobox,
|
|
317
|
-
|
|
432
|
+
Listbox,
|
|
318
433
|
SearchList,
|
|
434
|
+
commandItem,
|
|
435
|
+
createListboxScope,
|
|
436
|
+
searchListItem,
|
|
319
437
|
translationKey,
|
|
320
|
-
translations
|
|
438
|
+
translations,
|
|
439
|
+
useListboxContext
|
|
321
440
|
};
|
|
322
441
|
//# sourceMappingURL=index.mjs.map
|