diff --git a/docs/data/joy/components/select/SelectMultiple.js b/docs/data/joy/components/select/SelectMultiple.js
new file mode 100644
index 00000000000000..85e43ba38cb004
--- /dev/null
+++ b/docs/data/joy/components/select/SelectMultiple.js
@@ -0,0 +1,31 @@
+import * as React from 'react';
+import Select from '@mui/joy/Select';
+import Option from '@mui/joy/Option';
+
+export default function SelectMultiple() {
+ const handleChange = (event, newValue) => {
+ console.log(`You have choosen "${newValue}"`);
+ };
+ return (
+
+ );
+}
diff --git a/docs/data/joy/components/select/SelectMultiple.tsx b/docs/data/joy/components/select/SelectMultiple.tsx
new file mode 100644
index 00000000000000..2f576ef505201c
--- /dev/null
+++ b/docs/data/joy/components/select/SelectMultiple.tsx
@@ -0,0 +1,34 @@
+import * as React from 'react';
+import Select from '@mui/joy/Select';
+import Option from '@mui/joy/Option';
+
+export default function SelectMultiple() {
+ const handleChange = (
+ event: React.SyntheticEvent | null,
+ newValue: Array | null,
+ ) => {
+ console.log(`You have choosen "${newValue}"`);
+ };
+ return (
+
+ );
+}
diff --git a/docs/data/joy/components/select/SelectMultipleAppearance.js b/docs/data/joy/components/select/SelectMultipleAppearance.js
new file mode 100644
index 00000000000000..cd738b5f59c091
--- /dev/null
+++ b/docs/data/joy/components/select/SelectMultipleAppearance.js
@@ -0,0 +1,37 @@
+import * as React from 'react';
+import Select from '@mui/joy/Select';
+import Option from '@mui/joy/Option';
+import { Box, Chip } from '@mui/joy';
+
+export default function SelectMultipleAppearance() {
+ return (
+
+ );
+}
diff --git a/docs/data/joy/components/select/SelectMultipleAppearance.tsx b/docs/data/joy/components/select/SelectMultipleAppearance.tsx
new file mode 100644
index 00000000000000..cd738b5f59c091
--- /dev/null
+++ b/docs/data/joy/components/select/SelectMultipleAppearance.tsx
@@ -0,0 +1,37 @@
+import * as React from 'react';
+import Select from '@mui/joy/Select';
+import Option from '@mui/joy/Option';
+import { Box, Chip } from '@mui/joy';
+
+export default function SelectMultipleAppearance() {
+ return (
+
+ );
+}
diff --git a/docs/data/joy/components/select/SelectMultipleFormSubmission.js b/docs/data/joy/components/select/SelectMultipleFormSubmission.js
new file mode 100644
index 00000000000000..c08b2a2d6e0c60
--- /dev/null
+++ b/docs/data/joy/components/select/SelectMultipleFormSubmission.js
@@ -0,0 +1,36 @@
+import * as React from 'react';
+import Button from '@mui/joy/Button';
+import Select from '@mui/joy/Select';
+import Option from '@mui/joy/Option';
+import Stack from '@mui/joy/Stack';
+
+export default function SelectMultipleFormSubmission() {
+ return (
+
+ );
+}
diff --git a/docs/data/joy/components/select/SelectMultipleFormSubmission.tsx b/docs/data/joy/components/select/SelectMultipleFormSubmission.tsx
new file mode 100644
index 00000000000000..b16c85696fe035
--- /dev/null
+++ b/docs/data/joy/components/select/SelectMultipleFormSubmission.tsx
@@ -0,0 +1,36 @@
+import * as React from 'react';
+import Button from '@mui/joy/Button';
+import Select from '@mui/joy/Select';
+import Option from '@mui/joy/Option';
+import Stack from '@mui/joy/Stack';
+
+export default function SelectMultipleFormSubmission() {
+ return (
+
+ );
+}
diff --git a/docs/data/joy/components/select/select.md b/docs/data/joy/components/select/select.md
index 9007ed7ed01cdd..9ba7298c176184 100644
--- a/docs/data/joy/components/select/select.md
+++ b/docs/data/joy/components/select/select.md
@@ -123,6 +123,27 @@ const App = () => (
);
```
+### Multiple selections
+
+Set the `multiple` prop to let your users select multiple options from the list.
+In contrast with single-selection mode, the options popup doesn't close after an item is selected, which enables users to continue choosing more options.
+
+Note that in multiple selection mode, the `value` prop (and `defaultValue`) is an array.
+
+{{"demo": "SelectMultiple.js"}}
+
+#### Selected value appearance
+
+Use the `renderValue` prop to customize the display of the selected options.
+
+{{"demo": "SelectMultipleAppearance.js"}}
+
+#### Form submission
+
+The `Select` component supports `name` and `required` props that will be used when submitting the form.
+
+{{"demo": "SelectMultipleFormSubmission.js"}}
+
### Listbox
#### Maximum height
diff --git a/docs/pages/joy-ui/api/select.json b/docs/pages/joy-ui/api/select.json
index af8f6611339328..7e2c557988416d 100644
--- a/docs/pages/joy-ui/api/select.json
+++ b/docs/pages/joy-ui/api/select.json
@@ -23,6 +23,7 @@
"indicator": { "type": { "name": "node" } },
"listboxId": { "type": { "name": "string" } },
"listboxOpen": { "type": { "name": "bool" } },
+ "multiple": { "type": { "name": "bool" } },
"name": { "type": { "name": "string" } },
"onChange": { "type": { "name": "func" } },
"onClose": { "type": { "name": "func" } },
@@ -113,6 +114,7 @@
"disabled",
"expanded",
"focusVisible",
+ "multiple",
"popper",
"sizeLg",
"sizeMd",
diff --git a/docs/translations/api-docs-joy/select/select.json b/docs/translations/api-docs-joy/select/select.json
index e3f5399432fec2..248396717d8ae2 100644
--- a/docs/translations/api-docs-joy/select/select.json
+++ b/docs/translations/api-docs-joy/select/select.json
@@ -31,6 +31,9 @@
"description": "id
attribute of the listbox element. Also used to derive the id
attributes of options."
},
"listboxOpen": { "description": "Controls the open state of the select's listbox." },
+ "multiple": {
+ "description": "If true
, selecting multiple values is allowed. This affects the type of the value
, defaultValue
, and onChange
props."
+ },
"name": {
"description": "Name of the element. For example used by the server to identify the fields in form submits. If the name is provided, the component will render a hidden input element that can be submitted to a server."
},
@@ -85,6 +88,9 @@
"description": "Class name applied to {{nodeName}}.",
"nodeName": "the listbox slot"
},
+ "multiple": {
+ "description": "Class name applied to the root slot if multiple=true
"
+ },
"colorPrimary": {
"description": "Class name applied to {{nodeName}} if {{conditions}}.",
"nodeName": "the root slot",
diff --git a/packages/mui-joy/src/Select/Select.spec.tsx b/packages/mui-joy/src/Select/Select.spec.tsx
index a5f4084c690a5e..bc3db85409e56d 100644
--- a/packages/mui-joy/src/Select/Select.spec.tsx
+++ b/packages/mui-joy/src/Select/Select.spec.tsx
@@ -105,40 +105,119 @@ interface Value {