@basic-ui/material 1.0.0-alpha.33 → 1.0.0-alpha.35

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 (49) hide show
  1. package/build/cjs/index.js +83 -14
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/BottomSheet/BottomSheet.d.ts +1 -1
  4. package/build/esm/BottomSheet/BottomSheetSurface.d.ts +1 -1
  5. package/build/esm/Button/Button.d.ts +1 -1
  6. package/build/esm/CheckBox/CheckBox.d.ts +1 -1
  7. package/build/esm/Chip/ButtonChip.d.ts +1 -1
  8. package/build/esm/Chip/ChoiceChip.d.ts +1 -1
  9. package/build/esm/Combobox/Combobox.d.ts +7 -7
  10. package/build/esm/Dialog/Dialog.d.ts +1 -1
  11. package/build/esm/Dialog/DialogBackdrop.d.ts +1 -1
  12. package/build/esm/Dialog/DialogSurface.d.ts +1 -1
  13. package/build/esm/Menu/Menu.d.ts +5 -5
  14. package/build/esm/NavRail/NavRailItem.d.ts +3 -3
  15. package/build/esm/RadioButton/RadioGroup.d.ts +1 -1
  16. package/build/esm/Select/CustomContainerExample.d.ts +1 -1
  17. package/build/esm/Select/Select.d.ts +19 -7
  18. package/build/esm/Select/Select.js +49 -8
  19. package/build/esm/Select/Select.js.map +1 -1
  20. package/build/esm/Select/context.d.ts +5 -4
  21. package/build/esm/Select/context.js +2 -1
  22. package/build/esm/Select/context.js.map +1 -1
  23. package/build/esm/Select/defaultRender.d.ts +2 -1
  24. package/build/esm/Select/defaultRender.js +33 -4
  25. package/build/esm/Select/defaultRender.js.map +1 -1
  26. package/build/esm/SelectItem/SelectItem.d.ts +7 -3
  27. package/build/esm/SelectItem/SelectItem.js +14 -3
  28. package/build/esm/SelectItem/SelectItem.js.map +1 -1
  29. package/build/esm/Slider/Slider.d.ts +6 -6
  30. package/build/esm/Snackbar/Snackbar.d.ts +1 -1
  31. package/build/esm/Switch/Switch.d.ts +1 -1
  32. package/build/esm/Tab/Tab.d.ts +1 -1
  33. package/build/esm/Tab/TabList.d.ts +1 -1
  34. package/build/esm/Tab/TabPanel.d.ts +1 -1
  35. package/build/esm/TabIndicator/TabIndicator.d.ts +1 -1
  36. package/build/esm/TextField/TextField.d.ts +1 -1
  37. package/build/esm/Tooltip/Tooltip.d.ts +1 -1
  38. package/build/esm/theme/theme.js +2 -2
  39. package/build/esm/theme/theme.js.map +1 -1
  40. package/build/tsconfig-build.tsbuildinfo +1 -1
  41. package/package.json +3 -3
  42. package/src/Select/Select.story.tsx +47 -69
  43. package/src/Select/Select.tsx +93 -25
  44. package/src/Select/SelectMultiple.story.tsx +215 -0
  45. package/src/Select/context.ts +5 -3
  46. package/src/Select/defaultRender.tsx +49 -0
  47. package/src/SelectItem/SelectItem.tsx +68 -46
  48. package/src/theme/theme.ts +2 -2
  49. package/src/Select/defaultRender.ts +0 -19
@@ -502,8 +502,8 @@ const theme = {
502
502
  styles: {
503
503
  root: {
504
504
  body: {
505
- fontFamily: 'body',
506
- fontWeight: 'body',
505
+ fontFamily: 'body1',
506
+ fontWeight: 'body1',
507
507
  lineHeight: 'body',
508
508
  backgroundColor: 'surface',
509
509
  color: 'on.surface'
@@ -4143,7 +4143,8 @@ const SelectButton = /*#__PURE__*/react$1.forwardRef(({
4143
4143
  const selectContext = /*#__PURE__*/react$1.createContext({
4144
4144
  native: false,
4145
4145
  onSelect: () => {// noop
4146
- }
4146
+ },
4147
+ multiple: false
4147
4148
  });
4148
4149
  const {
4149
4150
  Provider: SelectProvider
@@ -4186,16 +4187,41 @@ const makeDefaultRender = children => val => {
4186
4187
  for (let i = 0; i < allChildren.length; i++) {
4187
4188
  const child = allChildren[i];
4188
4189
 
4189
- if ( /*#__PURE__*/react$1.isValidElement(child)) {
4190
- if (String(child.props.value) === val) {
4191
- return child.props.children;
4192
- }
4190
+ if ( /*#__PURE__*/react$1.isValidElement(child) && String(child.props.value) === val) {
4191
+ return child.props.children;
4193
4192
  }
4194
4193
  }
4195
4194
  }
4196
4195
 
4197
4196
  return val || undefined;
4198
4197
  };
4198
+ const makeDefaultMultipleRender = children => val => {
4199
+ const ret = [];
4200
+
4201
+ if (children && val !== undefined && val.length > 0) {
4202
+ const set = new Set(val);
4203
+ const allChildren = react$1.Children.toArray(children);
4204
+
4205
+ for (let i = 0; i < allChildren.length; i++) {
4206
+ const child = allChildren[i];
4207
+
4208
+ if ( /*#__PURE__*/react$1.isValidElement(child) && set.has(String(child.props.value))) {
4209
+ ret.push(child.props.children);
4210
+ }
4211
+ }
4212
+ }
4213
+
4214
+ return /*#__PURE__*/jsxRuntime.jsx(Box, {
4215
+ as: "span",
4216
+ sx: {
4217
+ maxWidth: '100%',
4218
+ overflow: 'hidden',
4219
+ textOverflow: 'ellipsis',
4220
+ whiteSpace: 'nowrap'
4221
+ },
4222
+ children: ret.join(', ')
4223
+ });
4224
+ };
4199
4225
 
4200
4226
  const componentMap = {
4201
4227
  outlined: OutlinedContainer,
@@ -4208,7 +4234,7 @@ const Select = /*#__PURE__*/react$1.forwardRef(function Select(props, forwardedR
4208
4234
  variant = 'outlined',
4209
4235
  color = 'primary',
4210
4236
  value: valueProp,
4211
- defaultValue = '',
4237
+ defaultValue = props.multiple ? [] : '',
4212
4238
  disabled,
4213
4239
  error = false,
4214
4240
  label = null,
@@ -4218,6 +4244,7 @@ const Select = /*#__PURE__*/react$1.forwardRef(function Select(props, forwardedR
4218
4244
  onFocus,
4219
4245
  onBlur,
4220
4246
  native = false,
4247
+ multiple = false,
4221
4248
  children,
4222
4249
  renderValue: renderValueProp,
4223
4250
  leadingIcon = null,
@@ -4227,6 +4254,11 @@ const Select = /*#__PURE__*/react$1.forwardRef(function Select(props, forwardedR
4227
4254
  const [value, onChange] = core.useControlledState(valueProp, onChangeProp, defaultValue, setState => (e, v) => {
4228
4255
  setState(v);
4229
4256
  });
4257
+
4258
+ if (multiple && !Array.isArray(value)) {
4259
+ console.warn('Warning: The `value` prop supplied to <Select> must be an array if `multiple` is true.');
4260
+ }
4261
+
4230
4262
  const [hasFocus, setHasFocus] = react$1.useState(false);
4231
4263
  const buttonRef = react$1.useRef();
4232
4264
  const [open, setOpen] = react$1.useState(false);
@@ -4247,7 +4279,23 @@ const Select = /*#__PURE__*/react$1.forwardRef(function Select(props, forwardedR
4247
4279
  };
4248
4280
 
4249
4281
  const handleOnChange = e => {
4250
- onChange && onChange(e, native ? e.target.value : e.currentTarget.dataset.value);
4282
+ const selectedValue = native ? e.target.value : e.currentTarget.dataset.value;
4283
+
4284
+ if (multiple && Array.isArray(value)) {
4285
+ if (value.find(c => c === selectedValue)) {
4286
+ onChange && onChange(e, value.filter(c => c !== selectedValue));
4287
+ } else {
4288
+ onChange && onChange(e, [...value, selectedValue]);
4289
+ }
4290
+
4291
+ const isMac = Boolean(/mac os|ios/i.test(navigator.userAgent));
4292
+
4293
+ if (e.key === ' ' || isMac && e.metaKey || !isMac && e.ctrlKey) {
4294
+ e.preventDefault();
4295
+ }
4296
+ } else {
4297
+ onChange && onChange(e, selectedValue);
4298
+ }
4251
4299
  };
4252
4300
 
4253
4301
  const hasError = Boolean(error);
@@ -4255,8 +4303,18 @@ const Select = /*#__PURE__*/react$1.forwardRef(function Select(props, forwardedR
4255
4303
  const id = idProp || fallbackId;
4256
4304
  const inputId = `${id}-text-field`;
4257
4305
  const helperTextId = helperText ? `${id}-helper-text` : undefined;
4258
- const renderValue = renderValueProp || makeDefaultRender(children);
4259
- const labelIsFloating = hasFocus || open || renderValue(value) !== undefined;
4306
+ const defaultRenderFn = react$1.useMemo(() => multiple ? makeDefaultMultipleRender(children) : makeDefaultRender(children), [children, multiple]);
4307
+ const renderValue = renderValueProp || defaultRenderFn;
4308
+
4309
+ function hasAnySelected() {
4310
+ if (multiple) {
4311
+ return value.length > 0;
4312
+ } else {
4313
+ return value !== '';
4314
+ }
4315
+ }
4316
+
4317
+ const labelIsFloating = hasFocus || open || hasAnySelected();
4260
4318
  const Comp = native ? Select$1 : SelectButton;
4261
4319
  react$1.useEffect(() => {
4262
4320
  // right after mounting, if the default value in the select element
@@ -4271,7 +4329,8 @@ const Select = /*#__PURE__*/react$1.forwardRef(function Select(props, forwardedR
4271
4329
  value: {
4272
4330
  native,
4273
4331
  onSelect: handleOnChange,
4274
- value
4332
+ value,
4333
+ multiple
4275
4334
  },
4276
4335
  children: /*#__PURE__*/jsxRuntime.jsxs(Box, {
4277
4336
  display: "inline-flex",
@@ -4314,6 +4373,7 @@ const Select = /*#__PURE__*/react$1.forwardRef(function Select(props, forwardedR
4314
4373
  hasLabel: !!label,
4315
4374
  leadingIcon: Boolean(leadingIcon),
4316
4375
  name: native ? name : undefined,
4376
+ multiple: native ? multiple : undefined,
4317
4377
  trailingIcon: true,
4318
4378
  ...otherProps,
4319
4379
  children: native ? children : renderValue(value)
@@ -4362,12 +4422,14 @@ const SelectItem = /*#__PURE__*/react$1.forwardRef(function SelectItem(props, fo
4362
4422
  children,
4363
4423
  value: valueProp,
4364
4424
  disabled,
4425
+ onKeyDown,
4365
4426
  ...otherProps
4366
4427
  } = props;
4367
4428
  const {
4368
4429
  native,
4369
4430
  onSelect,
4370
- value: selectedValue
4431
+ value: selectedValue,
4432
+ multiple
4371
4433
  } = useSelectContext();
4372
4434
  const value = valueProp !== undefined && valueProp !== null ? String(valueProp) : children;
4373
4435
 
@@ -4385,7 +4447,14 @@ const SelectItem = /*#__PURE__*/react$1.forwardRef(function SelectItem(props, fo
4385
4447
  return null;
4386
4448
  }
4387
4449
 
4388
- const selected = value === String(selectedValue);
4450
+ let selected = false;
4451
+
4452
+ if (multiple && Array.isArray(selectedValue)) {
4453
+ selected = Boolean(selectedValue.find(v => v === value));
4454
+ } else {
4455
+ selected = value === String(selectedValue);
4456
+ }
4457
+
4389
4458
  return /*#__PURE__*/jsxRuntime.jsx(Comp, {
4390
4459
  as: MenuItem,
4391
4460
  onSelect: core.wrapEvent(onSelectProp, onSelect),