@box/blueprint-web 12.58.0 → 12.59.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import '../index.css';
|
|
2
|
-
var styles = {"card":"bp_card_module_card--
|
|
2
|
+
var styles = {"card":"bp_card_module_card--28a0a","dropshadow-1":"bp_card_module_dropshadow-1--28a0a","dropshadow-3":"bp_card_module_dropshadow-3--28a0a"};
|
|
3
3
|
|
|
4
4
|
export { styles as default };
|
|
@@ -40,6 +40,7 @@ const RootInner = ({
|
|
|
40
40
|
...rest
|
|
41
41
|
} = props;
|
|
42
42
|
const {
|
|
43
|
+
selectOnEnterOrTab = false,
|
|
43
44
|
disabled = false,
|
|
44
45
|
required = false,
|
|
45
46
|
className,
|
|
@@ -136,18 +137,24 @@ const RootInner = ({
|
|
|
136
137
|
}
|
|
137
138
|
return getSelectedOptionValues(valueProp);
|
|
138
139
|
}, [getSelectedOptionValues, valueProp]);
|
|
139
|
-
const setValue =
|
|
140
|
+
const setValue = useCallback((nextSelectedValue, isSelectedFromEnter) => {
|
|
140
141
|
if (!onValueChange) {
|
|
141
142
|
return;
|
|
142
143
|
}
|
|
143
144
|
let selectedOption;
|
|
144
|
-
if (Array.isArray(
|
|
145
|
-
|
|
145
|
+
if (Array.isArray(nextSelectedValue)) {
|
|
146
|
+
if (isSelectedFromEnter) {
|
|
147
|
+
selectedOption = nextSelectedValue.map(value => ({
|
|
148
|
+
value
|
|
149
|
+
}));
|
|
150
|
+
} else {
|
|
151
|
+
selectedOption = nextSelectedValue.map(nextValue => getOptionFromValue(nextValue, options));
|
|
152
|
+
}
|
|
146
153
|
} else {
|
|
147
|
-
selectedOption = getOptionFromValue(
|
|
154
|
+
selectedOption = getOptionFromValue(nextSelectedValue, options);
|
|
148
155
|
}
|
|
149
156
|
onValueChange(selectedOption);
|
|
150
|
-
};
|
|
157
|
+
}, [onValueChange, options]);
|
|
151
158
|
const selectStore = useSelectStore({
|
|
152
159
|
combobox: comboboxStore,
|
|
153
160
|
defaultValue: getDefaultValue(),
|
|
@@ -255,33 +262,50 @@ const RootInner = ({
|
|
|
255
262
|
return prev;
|
|
256
263
|
});
|
|
257
264
|
}, [selectStore, focusInput]);
|
|
265
|
+
const handleSelectOnEnterOrTab = useCallback(() => {
|
|
266
|
+
const currentValues = Array.isArray(selectedValue) ? selectedValue : [];
|
|
267
|
+
const nextValue = inputValue.trim();
|
|
268
|
+
// Check if value already exists to avoid duplicates
|
|
269
|
+
if (!currentValues.includes(nextValue)) {
|
|
270
|
+
const nextValues = [...currentValues, nextValue];
|
|
271
|
+
setValue(nextValues, true);
|
|
272
|
+
}
|
|
273
|
+
}, [selectedValue, inputValue, setValue]);
|
|
274
|
+
const handleEscape = useCallback(() => {
|
|
275
|
+
if (isOpen) {
|
|
276
|
+
setOpen(false);
|
|
277
|
+
} else if (clearOnEscape) {
|
|
278
|
+
setInputValue('');
|
|
279
|
+
resetSelectedValue();
|
|
280
|
+
}
|
|
281
|
+
}, [isOpen, clearOnEscape, setOpen, setInputValue, resetSelectedValue]);
|
|
258
282
|
const handleKeyDown = useCallback(event => {
|
|
259
283
|
// Close menu
|
|
260
284
|
if (event.key === 'Enter' || event.key === 'Tab') {
|
|
261
285
|
if (event.nativeEvent.isComposing) {
|
|
262
286
|
return;
|
|
263
287
|
}
|
|
288
|
+
// We only want to select the input value directly if
|
|
289
|
+
// the user press enter or tab
|
|
290
|
+
// and selectOnEnterOrTab is true
|
|
291
|
+
// and the input value is not empty
|
|
292
|
+
// and the input value is not already selected
|
|
293
|
+
if (selectOnEnterOrTab && inputValue.trim()) {
|
|
294
|
+
handleSelectOnEnterOrTab();
|
|
295
|
+
}
|
|
264
296
|
setOpen(false);
|
|
265
297
|
return;
|
|
266
298
|
}
|
|
267
299
|
// Close menu or clear input
|
|
268
300
|
if (event.key === 'Escape') {
|
|
269
|
-
|
|
270
|
-
setOpen(false);
|
|
271
|
-
} else {
|
|
272
|
-
if (!clearOnEscape) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
setInputValue('');
|
|
276
|
-
resetSelectedValue();
|
|
277
|
-
}
|
|
301
|
+
handleEscape();
|
|
278
302
|
}
|
|
279
303
|
if (event.key === 'Backspace') {
|
|
280
304
|
if (deleteChipOnBackspace && multiselect && !inputValue && selectedValue.length) {
|
|
281
305
|
removeMultiSelectInputChip(selectedValue[selectedValue.length - 1]);
|
|
282
306
|
}
|
|
283
307
|
}
|
|
284
|
-
}, [
|
|
308
|
+
}, [deleteChipOnBackspace, handleEscape, handleSelectOnEnterOrTab, inputValue, multiselect, removeMultiSelectInputChip, selectedValue, selectOnEnterOrTab, setOpen]);
|
|
285
309
|
// Reset input on blur
|
|
286
310
|
const handleOnBlur = useCallback(() => {
|
|
287
311
|
if (!clearOnBlur || isOpen) {
|
|
@@ -230,6 +230,13 @@ export interface ComboboxBaseProps<Multiple extends boolean, FreeInput extends b
|
|
|
230
230
|
* @default false
|
|
231
231
|
*/
|
|
232
232
|
displaySingleSelectionAsChip?: boolean;
|
|
233
|
+
/**
|
|
234
|
+
* If `true`, the combobox input will select the input value when the user presses enter or tab.
|
|
235
|
+
* This prop only works on multi-select combobox at the moment.
|
|
236
|
+
*
|
|
237
|
+
* @default false
|
|
238
|
+
*/
|
|
239
|
+
selectOnEnterOrTab?: boolean;
|
|
233
240
|
}
|
|
234
241
|
export type ComboboxTextArea = Pick<TextAreaProps, 'maxRows' | 'minRows' | 'maxLength' | 'aria-describedby'> & {
|
|
235
242
|
as: 'textarea';
|
package/dist/lib-esm/index.css
CHANGED
|
@@ -1471,7 +1471,7 @@
|
|
|
1471
1471
|
.bp_button_wrapper_module_buttonWrapper--b0897{
|
|
1472
1472
|
all:unset;
|
|
1473
1473
|
}
|
|
1474
|
-
.bp_card_module_card--
|
|
1474
|
+
.bp_card_module_card--28a0a[data-modern=true]{
|
|
1475
1475
|
--bp-card-dropshadow-1:var(--dropshadow-1);
|
|
1476
1476
|
--bp-card-dropshadow-3:var(--dropshadow-3);
|
|
1477
1477
|
--card-radius:var(--bp-radius-10);
|
|
@@ -1480,30 +1480,30 @@
|
|
|
1480
1480
|
--card-border:var(--bp-border-01) solid var(--bp-border-card-border);
|
|
1481
1481
|
--card-dropshadow-1:var(--bp-card-dropshadow-1);
|
|
1482
1482
|
--card-dropshadow-3:var(--bp-card-dropshadow-3);
|
|
1483
|
-
--card-backdrop-filter:
|
|
1483
|
+
--card-backdrop-filter:blur(16px);
|
|
1484
1484
|
}
|
|
1485
1485
|
|
|
1486
|
-
.bp_card_module_card--
|
|
1486
|
+
.bp_card_module_card--28a0a[data-modern=false]{
|
|
1487
1487
|
--card-padding:var(--space-4);
|
|
1488
1488
|
--card-background:var(--surface-card-surface);
|
|
1489
1489
|
--card-border:var(--border-1) solid var(--border-card-border);
|
|
1490
1490
|
--card-radius:var(--radius-4);
|
|
1491
1491
|
--card-dropshadow-1:var(--dropshadow-1);
|
|
1492
1492
|
--card-dropshadow-3:var(--dropshadow-3);
|
|
1493
|
-
--card-backdrop-filter:
|
|
1493
|
+
--card-backdrop-filter:none;
|
|
1494
1494
|
}
|
|
1495
1495
|
|
|
1496
|
-
.bp_card_module_card--
|
|
1496
|
+
.bp_card_module_card--28a0a{
|
|
1497
1497
|
backdrop-filter:var(--card-backdrop-filter);
|
|
1498
1498
|
background:var(--card-background);
|
|
1499
1499
|
border:var(--card-border);
|
|
1500
1500
|
border-radius:var(--card-radius);
|
|
1501
1501
|
padding:var(--card-padding);
|
|
1502
1502
|
}
|
|
1503
|
-
.bp_card_module_card--
|
|
1503
|
+
.bp_card_module_card--28a0a.bp_card_module_dropshadow-1--28a0a{
|
|
1504
1504
|
box-shadow:var(--card-dropshadow-1);
|
|
1505
1505
|
}
|
|
1506
|
-
.bp_card_module_card--
|
|
1506
|
+
.bp_card_module_card--28a0a.bp_card_module_dropshadow-3--28a0a{
|
|
1507
1507
|
box-shadow:var(--card-dropshadow-3);
|
|
1508
1508
|
}
|
|
1509
1509
|
|