@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--c1a2b","dropshadow-1":"bp_card_module_dropshadow-1--c1a2b","dropshadow-3":"bp_card_module_dropshadow-3--c1a2b"};
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 = newSelectedValue => {
140
+ const setValue = useCallback((nextSelectedValue, isSelectedFromEnter) => {
140
141
  if (!onValueChange) {
141
142
  return;
142
143
  }
143
144
  let selectedOption;
144
- if (Array.isArray(newSelectedValue)) {
145
- selectedOption = newSelectedValue.map(newValue => getOptionFromValue(newValue, options));
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(newSelectedValue, options);
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
- if (isOpen) {
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
- }, [clearOnEscape, removeMultiSelectInputChip, deleteChipOnBackspace, isOpen, resetSelectedValue, setInputValue, setOpen, inputValue, multiselect, selectedValue]);
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';
@@ -1471,7 +1471,7 @@
1471
1471
  .bp_button_wrapper_module_buttonWrapper--b0897{
1472
1472
  all:unset;
1473
1473
  }
1474
- .bp_card_module_card--c1a2b[data-modern=true]{
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:none;
1483
+ --card-backdrop-filter:blur(16px);
1484
1484
  }
1485
1485
 
1486
- .bp_card_module_card--c1a2b[data-modern=false]{
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:blur(16px);
1493
+ --card-backdrop-filter:none;
1494
1494
  }
1495
1495
 
1496
- .bp_card_module_card--c1a2b{
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--c1a2b.bp_card_module_dropshadow-1--c1a2b{
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--c1a2b.bp_card_module_dropshadow-3--c1a2b{
1506
+ .bp_card_module_card--28a0a.bp_card_module_dropshadow-3--28a0a{
1507
1507
  box-shadow:var(--card-dropshadow-3);
1508
1508
  }
1509
1509
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/blueprint-web",
3
- "version": "12.58.0",
3
+ "version": "12.59.1",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {