playbook_ui 12.37.0 → 12.38.0.pre.alpha.PBNTR78selectkitmultipleprop1094

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date/_date.tsx +7 -8
  3. data/app/pb_kits/playbook/pb_date/docs/_date_alignment.jsx +2 -2
  4. data/app/pb_kits/playbook/pb_date/docs/_date_default.jsx +29 -5
  5. data/app/pb_kits/playbook/pb_date/docs/_date_unstyled.jsx +2 -2
  6. data/app/pb_kits/playbook/pb_date/docs/_date_variants.jsx +5 -5
  7. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +45 -31
  8. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +5 -3
  9. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +24 -21
  10. data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +1 -1
  11. data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -1
  12. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -2
  13. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +1 -1
  14. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +6 -8
  15. data/app/pb_kits/playbook/pb_kit/dateTime.ts +146 -63
  16. data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +52 -31
  17. data/app/pb_kits/playbook/pb_message/_message.tsx +24 -24
  18. data/app/pb_kits/playbook/pb_select/_select.scss +37 -0
  19. data/app/pb_kits/playbook/pb_select/_select.tsx +9 -5
  20. data/app/pb_kits/playbook/pb_select/docs/_select_attributes.html.erb +26 -0
  21. data/app/pb_kits/playbook/pb_select/docs/_select_attributes.md +1 -0
  22. data/app/pb_kits/playbook/pb_select/docs/_select_multiple.html.erb +36 -0
  23. data/app/pb_kits/playbook/pb_select/docs/_select_multiple.jsx +50 -0
  24. data/app/pb_kits/playbook/pb_select/docs/_select_multiple.md +1 -0
  25. data/app/pb_kits/playbook/pb_select/docs/example.yml +3 -0
  26. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  27. data/app/pb_kits/playbook/pb_select/select.html.erb +5 -9
  28. data/app/pb_kits/playbook/pb_select/select.rb +14 -0
  29. data/app/pb_kits/playbook/pb_select/select.test.js +17 -0
  30. data/app/pb_kits/playbook/pb_time/_time.tsx +9 -11
  31. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +46 -49
  32. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +4 -6
  33. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +11 -11
  34. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +8 -11
  35. data/dist/playbook-rails.js +7 -7
  36. data/lib/playbook/version.rb +2 -2
  37. metadata +12 -8
  38. data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +0 -120
@@ -1,90 +1,173 @@
1
+ const ABBR_DAYS = ['SU', 'M', 'T', 'W', 'TH', 'F', 'S']
1
2
 
2
- import moment, { Moment } from 'moment'
3
- import 'moment-strftime'
4
- import 'moment-timezone'
3
+ const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
5
4
 
6
- type DateTimeType = {
7
- value: string | Date,
8
- zone?: string,
9
- }
5
+ const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
10
6
 
11
- const ABBR_DAYS = ['SU', 'M', 'T', 'W', 'TH', 'F', 'S']
12
-
13
- export default class DateTime {
14
- value: Moment & any
15
- constructor({ value, zone = 'America/New_York' }: DateTimeType) {
16
- this.value = this.convertToTimestampZone(value, zone)
17
- }
7
+ const formatDate = (newDate: Date | string) => {
8
+ const isTimelessStringDate = typeof newDate === "string" && !newDate.includes("T")
18
9
 
19
- convertToTimestampZone(value: string | Date, zone: string) {
20
- return moment(value).tz(zone)
10
+ if (isTimelessStringDate) {
11
+ const unhyphenatedDate = new Date((newDate as string).replace(/-/g, "/"))
12
+ return unhyphenatedDate
21
13
  }
22
14
 
23
- convertToTimezone() {
24
- return this.value.strftime('%Z')
25
- }
15
+ return new Date(newDate)
16
+ }
26
17
 
27
- toCustomFormat(format = '%-m/%-d') {
28
- return this.value.strftime(format)
18
+ export const toMinute = (newDate: Date | string, timeZone?: string): string => {
19
+ const date = formatDate(newDate)
20
+ if (timeZone) {
21
+ return date.toLocaleTimeString(undefined, { timeZone, hour: "2-digit", minute: "2-digit" }).slice(3, 5);
22
+ } else {
23
+ return date.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit" }).slice(3, 5);
29
24
  }
25
+ }
30
26
 
31
- toYear() {
32
- return this.value.strftime('%Y')
27
+ export const toHour = (newDate: Date | string, timeZone?: string): string => {
28
+ const date = formatDate(newDate)
29
+ if (timeZone) {
30
+ return date.toLocaleTimeString(undefined, { timeZone, hour: "numeric" }).split(' ')[0];
31
+ } else {
32
+ return date.toLocaleTimeString(undefined, { hour: "numeric" }).split(' ')[0];
33
33
  }
34
+ }
34
35
 
35
- toMonth() {
36
- return this.value.strftime('%b')
37
- }
36
+ export const toDay = (newDate: Date | string, timeZone?: string): number => {
37
+ if (timeZone) {
38
+ const date = new Date(formatDate(newDate).toLocaleString(undefined, { timeZone }));
39
+ return date.getDate()
40
+ } else {
41
+ const date = formatDate(newDate)
42
+ return date.getDate()
43
+ }
44
+ }
38
45
 
39
- toMonthNum() {
40
- return this.value.strftime('%-m')
41
- }
46
+ export const toDayAbbr = (newDate: Date | string): string => {
47
+ const date = formatDate(newDate)
48
+ return ABBR_DAYS[date.getUTCDay()]
49
+ }
42
50
 
43
- toMonthFull() {
44
- return this.value.strftime('%B')
45
- }
51
+ export const toWeekday = (newDate: Date | string): string => {
52
+ const date = formatDate(newDate)
53
+ return days[date.getUTCDay()]
54
+ }
46
55
 
47
- toDay() {
48
- return this.value.strftime('%e')
49
- }
56
+ export const toMonth = (newDate: Date | string, timeZone?: string): string => {
57
+ if (timeZone) {
58
+ const date = new Date(formatDate(newDate).toLocaleString(undefined, { timeZone }));
59
+ return months[date.getUTCMonth()]
60
+ } else {
61
+ const date = formatDate(newDate)
62
+ return months[date.getUTCMonth()]
63
+ }
64
+ }
50
65
 
51
- toDayAbbr() {
52
- return ABBR_DAYS[this.value.day()]
53
- }
66
+ export const toMonthNum = (newDate: Date | string): number => {
67
+ const date = formatDate(newDate)
68
+ return date.getUTCMonth() +1
69
+ }
54
70
 
55
- toWeekday() {
56
- return this.value.strftime('%a')
57
- }
71
+ export const toYear = (newDate: Date | string, timeZone?: string): number => {
72
+ if (timeZone) {
73
+ const date = new Date(newDate.toLocaleString(undefined, { timeZone }));
74
+ return date.getUTCFullYear()
75
+ } else {
76
+ const date = new Date(newDate)
77
+ return date.getUTCFullYear()
78
+ }
79
+ }
58
80
 
59
- toHour() {
60
- return this.value.strftime('%l')
81
+ export const toTime = (newDate: Date | string, timeZone?: string): string => {
82
+ const date = formatDate(newDate)
83
+ if (timeZone) {
84
+ return date.toLocaleTimeString(undefined, { timeZone, timeStyle: "short" }).split(' ')[0];
85
+ } else {
86
+ return date.toLocaleTimeString(undefined, { timeStyle: "short" }).split(' ')[0];
61
87
  }
88
+ }
62
89
 
63
- toMinute() {
64
- return this.value.strftime('%M')
65
- }
90
+ export const toMeridiem = (newDate: Date | string, timeZone?: string): string => {
91
+ const date = formatDate(newDate)
92
+ if (timeZone) {
93
+ return date.toLocaleString(undefined, { timeZone, hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
94
+ } else {
95
+ return date.toLocaleString(undefined, { hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
96
+ }
97
+ }
66
98
 
67
- toMeridian() {
68
- return this.value.strftime('%P')[0]
69
- }
99
+ export const toTimeZone = (newDate: Date | string, timeZone?: string): string => {
100
+ const date = formatDate(newDate)
101
+ if (timeZone) {
102
+ return date.toLocaleString(undefined, { timeZone, timeZoneName: "short" }).split(' ')[3];
103
+ } else {
104
+ return date.toLocaleString(undefined, { timeZoneName: "short" }).split(' ')[3];
105
+ }
106
+ }
70
107
 
71
- toIso() {
72
- return this.value.toISOString()
73
- }
108
+ export const toTimeWithMeridiem = (newDate: Date | string, timeZone: string): string => {
109
+ const date = formatDate(newDate)
110
+ return `${toTime(date, timeZone)}${toMeridiem(date, timeZone)}`;
111
+ }
74
112
 
75
- toTime() {
76
- const time = this.value.strftime('%I:%M')
113
+ export const toIso = (newDate: Date | string): string => {
114
+ const date = formatDate(newDate)
115
+ return date.toISOString()
116
+ }
77
117
 
78
- // strftime adds a leading 0 on single hour times. ie 08:31.
79
- // this removes that 0 to match the rails kit.
80
- return time.charAt() === '0' ? time.slice(1) : time
81
- }
118
+ export const fromNow = (newDate: Date | string): string => {
119
+
120
+ const startDate = formatDate(newDate).getTime()
121
+ const endDate = new Date().getTime()
122
+ const elapsedTime = endDate - startDate
123
+ let elapsedTimeString = `${Math.round(elapsedTime / (365.25 * 24 * 60 * 60 * 1000))} years ago.`; // 730+ days
124
+
125
+ const elapsedTimeData = [
126
+ { min: 0, max: 44999, value: "a few seconds ago" }, // 0-44 seconds
127
+ { min: 45000, max: 89999, value: "a minute ago" }, // 45-89 seconds
128
+ { min: 90000, max: 2649999, value: `${Math.round(elapsedTime / 60000)} minutes ago`}, // 90s-44 minutes
129
+ { min: 2650000, max: 7299999, value: "an hour ago" }, // 45-120 minutes
130
+ { min: 7300000, max: 75699999, value: `${Math.round(elapsedTime / 3600000)} hours ago`}, // 2-21 hours
131
+ { min: 75700000, max: 172899999, value: "a day ago" }, // 22-48 hours
132
+ { min: 172900000, max: 2169999999, value: `${Math.round(elapsedTime / 86400000)} days ago`}, // 2-25 days
133
+ { min: 2170000000, max: 5184999999, value: "a month ago"}, // 26-60 days
134
+ { min: 5185000000, max: 27561699999, value: `${Math.round(elapsedTime / 30.44 * 24 * 60 * 60 * 1000)} months ago`}, // 60-319 days
135
+ { min: 27561700000, max: 63072999999, value: "a year ago"}, // 320-730 days
136
+ ];
137
+
138
+ for (const timeDate of elapsedTimeData) {
139
+ if (elapsedTime >= timeDate.min && elapsedTime <= timeDate.max) {
140
+ elapsedTimeString = timeDate.value;
141
+ break;
142
+ }
143
+ }
144
+
145
+ return elapsedTimeString
146
+ }
82
147
 
83
- toTimezone() {
84
- return this.value.strftime('%Z')
148
+ export const toCustomFormat = (newDate: Date | string, format = 'month_day'): string => {
149
+ const date = formatDate(newDate)
150
+ if (format == "month_day") {
151
+ return `${toMonthNum(date)}/${toDay(date)}`
152
+ } else {
153
+ return `${date.toLocaleString(undefined, { month: "short" })} ${toDay(date)}`
85
154
  }
155
+ }
86
156
 
87
- toTimeWithMeridian() {
88
- return this.toTime() + this.toMeridian()
89
- }
157
+ export default {
158
+ toMinute,
159
+ toHour,
160
+ toDay,
161
+ toDayAbbr,
162
+ toWeekday,
163
+ toMonth,
164
+ toMonthNum,
165
+ toYear,
166
+ toTime,
167
+ toMeridiem,
168
+ toTimeZone,
169
+ toTimeWithMeridiem,
170
+ toIso,
171
+ fromNow,
172
+ toCustomFormat,
90
173
  }
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
2
  import classnames from "classnames";
3
- import DateTime from "../pb_kit/dateTime";
4
3
  import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
5
4
  import { globalProps } from "../utilities/globalProps";
5
+ import DateTime from '../pb_kit/dateTime';
6
6
 
7
7
  import Body from "../pb_body/_body";
8
8
  import Caption from "../pb_caption/_caption";
@@ -26,9 +26,9 @@ type LabelValueProps = {
26
26
  title?: string;
27
27
  };
28
28
 
29
- const dateString = (value: DateTime) => {
30
- const month = value.toMonthNum();
31
- const day = value.toDay();
29
+ const dateString = (value: Date) => {
30
+ const month = DateTime.toMonthNum(value);
31
+ const day = DateTime.toDay(value);
32
32
 
33
33
  return ` · ${month}/${day}`;
34
34
  };
@@ -52,7 +52,6 @@ const LabelValue = (props: LabelValueProps) => {
52
52
 
53
53
  const ariaProps = buildAriaProps(aria);
54
54
  const dataProps = buildDataProps(data);
55
- const formattedDate = new DateTime({ value: date });
56
55
  const variantClass = variant === "details" ? "details" : "";
57
56
  const classes = classnames(
58
57
  buildCss("pb_label_value_kit", variantClass),
@@ -62,59 +61,81 @@ const LabelValue = (props: LabelValueProps) => {
62
61
 
63
62
  return (
64
63
  <div
65
- {...ariaProps}
66
- {...dataProps}
67
- className={classes}
68
- id={id}
69
- title={title}
64
+ {...ariaProps}
65
+ {...dataProps}
66
+ className={classes}
67
+ id={id}
68
+ title={title}
70
69
  >
71
- <Caption dark={dark} text={label} />
70
+ <Caption dark={dark}
71
+ text={label}
72
+ />
72
73
  {variant === "details" ? (
73
- <Flex inline vertical="center">
74
+ <Flex inline
75
+ vertical="center"
76
+ >
74
77
  {icon && (
75
- <Body color="light" dark={dark} marginRight="xs">
76
- <Icon dark={dark} fixedWidth icon={icon} />
78
+ <Body color="light"
79
+ dark={dark}
80
+ marginRight="xs"
81
+ >
82
+ <Icon dark={dark}
83
+ fixedWidth
84
+ icon={icon}
85
+ />
77
86
  </Body>
78
87
  )}
79
88
  {description && (
80
89
  <Body
81
- color="light"
82
- dark={dark}
83
- marginRight="xs"
84
- text={description}
90
+ color="light"
91
+ dark={dark}
92
+ marginRight="xs"
93
+ text={description}
85
94
  />
86
95
  )}
87
96
  {active === true ? (
88
- <Flex inline vertical="center">
97
+ <Flex inline
98
+ vertical="center"
99
+ >
89
100
  {title && (
90
- <Title dark={dark} size={4} text={title} variant="link" />
101
+ <Title dark={dark}
102
+ size={4}
103
+ text={title}
104
+ variant="link"
105
+ />
91
106
  )}
92
107
  {date && (
93
108
  <Title
94
- dark={dark}
95
- marginLeft="xs"
96
- size={4}
97
- text={" " + dateString(formattedDate)}
98
- variant="link"
109
+ dark={dark}
110
+ marginLeft="xs"
111
+ size={4}
112
+ text={" " + dateString(date)}
113
+ variant="link"
99
114
  />
100
115
  )}
101
116
  </Flex>
102
117
  ) : (
103
118
  <>
104
- {title && <Title dark={dark} size={4} text={title} />}
119
+ {title && <Title dark={dark}
120
+ size={4}
121
+ text={title}
122
+ />
123
+ }
105
124
  {date && (
106
125
  <Title
107
- dark={dark}
108
- marginLeft="xs"
109
- size={4}
110
- text={" " + dateString(formattedDate)}
126
+ dark={dark}
127
+ marginLeft="xs"
128
+ size={4}
129
+ text={" " + dateString(date)}
111
130
  />
112
131
  )}
113
132
  </>
114
133
  )}
115
134
  </Flex>
116
135
  ) : (
117
- <Body dark={dark} text={value} />
136
+ <Body dark={dark}
137
+ text={value}
138
+ />
118
139
  )}
119
140
  </div>
120
141
  );
@@ -25,7 +25,7 @@ type MessageProps = {
25
25
  label?: string,
26
26
  message: string,
27
27
  timestamp?: string,
28
- timestampObject?: string,
28
+ timestampObject?: Date,
29
29
  timezone?: string,
30
30
  alignTimestamp?: string,
31
31
  }
@@ -62,50 +62,50 @@ const Message = (props: MessageProps) => {
62
62
 
63
63
  return (
64
64
  <div
65
- {...ariaProps}
66
- {...dataProps}
67
- className={classes}
68
- id={id}
65
+ {...ariaProps}
66
+ {...dataProps}
67
+ className={classes}
68
+ id={id}
69
69
  >
70
70
  {shouldDisplayAvatar &&
71
71
  <Avatar
72
- imageUrl={avatarUrl}
73
- name={avatarName}
74
- size="xs"
75
- status={avatarStatus}
72
+ imageUrl={avatarUrl}
73
+ name={avatarName}
74
+ size="xs"
75
+ status={avatarStatus}
76
76
  />
77
77
  }
78
78
  <div className="content_wrapper">
79
79
  <Flex
80
- justify={alignTimestamp === 'left' ? 'none' : 'between'}
81
- orientation="row"
80
+ justify={alignTimestamp === 'left' ? 'none' : 'between'}
81
+ orientation="row"
82
82
  >
83
83
  {label &&
84
84
  <Title
85
- className="message_title"
86
- size={4}
87
- text={label}
85
+ className="message_title"
86
+ size={4}
87
+ text={label}
88
88
  />
89
89
  }
90
90
  <Timestamp
91
- className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
92
- text={timestamp}
93
- timestamp={''}
94
- timezone={timezone}
91
+ className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
92
+ text={timestamp}
93
+ timestamp={''}
94
+ timezone={timezone}
95
95
  />
96
96
  {timestampObject &&
97
97
  <Timestamp
98
- className={`pull-${alignTimestamp} message_timestamp`}
99
- text={''}
100
- timestamp={timestampObject}
101
- timezone={timezone}
98
+ className={`pull-${alignTimestamp} message_timestamp`}
99
+ text={''}
100
+ timestamp={timestampObject}
101
+ timezone={timezone}
102
102
  />
103
103
  }
104
104
  </Flex>
105
105
  {message &&
106
106
  <Body
107
- className="pb_message_body"
108
- text={message}
107
+ className="pb_message_body"
108
+ text={message}
109
109
  />
110
110
  }
111
111
  {children}
@@ -2,6 +2,7 @@
2
2
  @import "../pb_textarea/textarea_mixin";
3
3
  @import "../tokens/titles";
4
4
  @import "../tokens/colors";
5
+ @import "../tokens/spacing";
5
6
 
6
7
  [class^=pb_select] {
7
8
  select {
@@ -32,6 +33,42 @@
32
33
  opacity: 0.5;
33
34
  }
34
35
  }
36
+ select[multiple] {
37
+ @include pb_textarea_light;
38
+ @include pb_body_light;
39
+ background: none;
40
+ background-color: $white;
41
+ appearance: none;
42
+ cursor: pointer;
43
+ box-shadow: inset 0 -11px 20px rgba($primary, 0.05);
44
+ padding-right: 0px !important;
45
+ color: transparent !important;
46
+ text-shadow: 0 0 0 $text_lt_default;
47
+ white-space: nowrap;
48
+ text-overflow: ellipsis;
49
+ padding: $space_xs 0px !important;
50
+ max-height: unset !important;
51
+ @media (hover:hover) {
52
+ &:hover, &:active, &:focus {
53
+ background-color: rgba($focus_input_light, $opacity_5);
54
+ }
55
+ }
56
+ &:focus{
57
+ border-color: $primary;
58
+ @include transition_default;
59
+ }
60
+ option {
61
+ padding-left: $space_sm;
62
+ padding-top: $space_xxs;
63
+ padding-bottom: $space_xxs;
64
+ }
65
+ option:checked {
66
+ background-color: $hover_light;
67
+ }
68
+ option:hover {
69
+ background-color: $hover_light;
70
+ }
71
+ }
35
72
  option {
36
73
  color: $text_lt_default;
37
74
  }
@@ -124,11 +124,15 @@ const Select = ({
124
124
  htmlFor={name}
125
125
  >
126
126
  {selectBody}
127
- <Icon
128
- className="pb_select_kit_caret"
129
- fixedWidth
130
- icon="angle-down"
131
- />
127
+ { multiple !== true ?
128
+ <Icon
129
+ className="pb_select_kit_caret"
130
+ fixedWidth
131
+ icon="angle-down"
132
+ />
133
+ :
134
+ null
135
+ }
132
136
  {error &&
133
137
  <Body
134
138
  status="negative"
@@ -0,0 +1,26 @@
1
+ <%= pb_rails("select", props: {
2
+ attributes: {
3
+ data: { options: "data_attribute" },
4
+ },
5
+ label: "Favorite Food",
6
+ name: "food",
7
+ options: [
8
+ {
9
+ value: "1",
10
+ value_text: "Burgers",
11
+ },
12
+ {
13
+ value: "2",
14
+ selected: true,
15
+ value_text: "Pizza",
16
+ },
17
+ {
18
+ value: "3",
19
+ value_text: "Tacos",
20
+ },
21
+ {
22
+ value: "4",
23
+ value_text: "BBQ",
24
+ },
25
+ ]
26
+ }) %>
@@ -0,0 +1 @@
1
+ Inspect the element and notice the data-attribute being added to the `<select>` element
@@ -0,0 +1,36 @@
1
+ <%= pb_rails("select", props: {
2
+ label: "Favorite Food",
3
+ name: "food",
4
+ multiple: true,
5
+ options: [
6
+ {
7
+ value: "1",
8
+ value_text: "Burgers",
9
+ },
10
+ {
11
+ value: "2",
12
+ selected: true,
13
+ value_text: "Pizza",
14
+ },
15
+ {
16
+ value: "3",
17
+ value_text: "Tacos",
18
+ },
19
+ {
20
+ value: "4",
21
+ value_text: "BBQ",
22
+ },
23
+ {
24
+ value: "4",
25
+ value_text: "Sushi",
26
+ },
27
+ {
28
+ value: "4",
29
+ value_text: "Chinese",
30
+ },
31
+ {
32
+ value: "4",
33
+ value_text: "Hot Dogs",
34
+ },
35
+ ]
36
+ }) %>
@@ -0,0 +1,50 @@
1
+ import React from 'react'
2
+
3
+ import Select from '../_select'
4
+
5
+ const SelectMultiple = (props) => {
6
+ const options = [
7
+ {
8
+ value: '1',
9
+ text: 'Burgers',
10
+ },
11
+ {
12
+ value: '2',
13
+ text: 'Pizza',
14
+ },
15
+ {
16
+ value: '3',
17
+ text: 'Tacos',
18
+ },
19
+ {
20
+ value: '3',
21
+ text: 'BBQ',
22
+ },
23
+ {
24
+ value: '3',
25
+ text: 'Sushi',
26
+ },
27
+ {
28
+ value: '3',
29
+ text: 'Chinese',
30
+ },
31
+ {
32
+ value: '3',
33
+ text: 'Hot Dogs',
34
+ },
35
+ ]
36
+
37
+ return (
38
+ <div>
39
+ <Select
40
+ label="Favorite Food"
41
+ multiple
42
+ name="food"
43
+ options={options}
44
+ {...props}
45
+ />
46
+ </div>
47
+ )
48
+ }
49
+
50
+ export default SelectMultiple
@@ -0,0 +1 @@
1
+ We recommend using a typeahead for better UX
@@ -11,6 +11,8 @@ examples:
11
11
  - select_error: Select w/ Error
12
12
  - select_inline: Select Inline
13
13
  - select_inline_compact: Select Inline Compact
14
+ - select_attributes: Select W/ Attributes
15
+ - select_multiple: Select Multiple
14
16
 
15
17
 
16
18
 
@@ -25,3 +27,4 @@ examples:
25
27
  - select_error: Select w/ Error
26
28
  - select_inline: Select Inline
27
29
  - select_inline_compact: Select Inline Compact
30
+ - select_multiple: Select Multiple
@@ -8,3 +8,4 @@ export { default as SelectValueTextSame } from './_select_value_text_same.jsx'
8
8
  export { default as SelectError } from './_select_error.jsx'
9
9
  export { default as SelectInline } from './_select_inline.jsx'
10
10
  export { default as SelectInlineCompact } from './_select_inline_compact.jsx'
11
+ export { default as SelectMultiple } from './_select_multiple.jsx'