playbook_ui 12.37.0 → 12.38.0.pre.alpha.PBNTR78selectkitmultipleprop1094

Sign up to get free protection for your applications and to get access to all the features.
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'