playbook_ui 9.4.0.pre.alpha1 → 9.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -0
  3. data/app/pb_kits/playbook/data/menu.yml +1 -0
  4. data/app/pb_kits/playbook/index.js +4 -3
  5. data/app/pb_kits/playbook/pb_checkbox/_checkbox.jsx +2 -1
  6. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +3 -2
  7. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.jsx +67 -9
  8. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.jsx +11 -45
  9. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.html.erb +6 -17
  10. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.rb +5 -12
  11. data/app/pb_kits/playbook/pb_date_stacked/docs/example.yml +1 -3
  12. data/app/pb_kits/playbook/pb_date_stacked/docs/index.js +0 -1
  13. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.jsx +16 -32
  14. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss +4 -23
  15. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +8 -12
  16. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.rb +2 -9
  17. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.html.erb +1 -8
  18. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.jsx +1 -19
  19. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +1 -1
  20. data/app/pb_kits/playbook/pb_flex/_flex.jsx +1 -6
  21. data/app/pb_kits/playbook/pb_icon/_icon.jsx +20 -5
  22. data/app/pb_kits/playbook/pb_icon/icon.html.erb +4 -2
  23. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.jsx +1 -0
  24. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.html.erb +1 -1
  25. data/app/pb_kits/playbook/pb_nav/_item.jsx +0 -2
  26. data/app/pb_kits/playbook/pb_nav/item.html.erb +2 -2
  27. data/app/pb_kits/playbook/pb_passphrase/_passphrase.jsx +205 -0
  28. data/app/pb_kits/playbook/pb_passphrase/_passphrase.scss +73 -0
  29. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_common.jsx +33 -0
  30. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_default.html.erb +3 -0
  31. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_default.jsx +31 -0
  32. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_default.md +1 -0
  33. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_input_props.html.erb +16 -0
  34. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_input_props.jsx +56 -0
  35. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_input_props.md +1 -0
  36. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.html.erb +10 -0
  37. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.jsx +68 -0
  38. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.md +9 -0
  39. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_strength_change.jsx +33 -0
  40. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_strength_change.md +3 -0
  41. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_tips.html.erb +26 -0
  42. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_tips.jsx +54 -0
  43. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_tips.md +1 -0
  44. data/app/pb_kits/playbook/pb_passphrase/docs/example.yml +15 -0
  45. data/app/pb_kits/playbook/pb_passphrase/docs/index.js +6 -0
  46. data/app/pb_kits/playbook/pb_passphrase/passphrase.html.erb +1 -0
  47. data/app/pb_kits/playbook/pb_passphrase/passphrase.rb +36 -0
  48. data/app/pb_kits/playbook/pb_passphrase/passphrase.test.jsx +123 -0
  49. data/app/pb_kits/playbook/pb_passphrase/passwordStrength.js +55 -0
  50. data/app/pb_kits/playbook/pb_section_separator/_section_separator.jsx +3 -7
  51. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +2 -2
  52. data/app/pb_kits/playbook/react_rails_kits.js +1 -0
  53. data/lib/playbook/version.rb +1 -1
  54. metadata +27 -7
  55. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.html.erb +0 -5
  56. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.jsx +0 -38
  57. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +0 -35
@@ -0,0 +1,73 @@
1
+ @import "../tokens/colors";
2
+ @import "../tokens/spacing";
3
+ @import "../tokens/screen_sizes";
4
+
5
+ .pb_passphrase {
6
+ margin-bottom: $space_sm;
7
+
8
+ label {
9
+ display: inline;
10
+ }
11
+
12
+ a.dark {
13
+ color: $white;
14
+ }
15
+
16
+ a {
17
+
18
+ &[class*=show-below-] {
19
+ display: none;
20
+ }
21
+ @each $breakpoint_name, $breakpoint in $breakpoints {
22
+ &.show-below-#{$breakpoint_name} {
23
+ @include break_at($breakpoint) {
24
+ display: inline;
25
+ }
26
+ }
27
+ }
28
+ }
29
+
30
+ .passphrase-label {
31
+ margin-right: ($space_xs/2);
32
+ }
33
+
34
+ .passphrase-text-input-wrapper {
35
+ position: relative;
36
+
37
+ .pb_text_input_kit_label {
38
+ margin-bottom: ($space_xs/2);
39
+ }
40
+
41
+ .passphrase-text-input input {
42
+ padding-right: 42px;
43
+ }
44
+
45
+ .passphrase-text-input .text_input_wrapper {
46
+ margin-bottom: 0;
47
+ }
48
+
49
+ .show-passphrase-icon {
50
+ position: absolute;
51
+ right: 11px;
52
+ top: 11px;
53
+ cursor: pointer;
54
+ @media (hover:hover) {
55
+ &:hover .pb_body_kit_light {
56
+ color: $primary;
57
+ }
58
+ }
59
+
60
+ .hide-icon {
61
+ display: none;
62
+ }
63
+ }
64
+ }
65
+
66
+ .pb_progress_simple_wrapper, .pb_progress_simple_wrapper_dark {
67
+ margin-bottom: ($space_xs/2);
68
+
69
+ &.progress-empty-input {
70
+ visibility: hidden;
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,33 @@
1
+ import React, { useState } from 'react'
2
+ import { Body, Passphrase } from '../../'
3
+
4
+ const PassphraseCommon = (props) => {
5
+ const [input, setInput] = useState('')
6
+
7
+ const handleChange = (e) => setInput(e.target.value)
8
+
9
+ const COMMON_PASSPHRASES = ['passphrase', 'apple', 'password', 'p@55w0rd']
10
+
11
+ const commonCheck = (passphrase) => {
12
+ if (COMMON_PASSPHRASES.includes(passphrase))
13
+ return true
14
+ return false
15
+ }
16
+
17
+ return (
18
+ <>
19
+ <div>
20
+ <Body text={`Try typing any of the following: ${COMMON_PASSPHRASES.join(' ')}`} />
21
+ <br />
22
+ <Passphrase
23
+ common={commonCheck(input)}
24
+ onChange={handleChange}
25
+ value={input}
26
+ {...props}
27
+ />
28
+ </div>
29
+ </>
30
+ )
31
+ }
32
+
33
+ export default PassphraseCommon
@@ -0,0 +1,3 @@
1
+ <%= pb_rails("passphrase") %>
2
+
3
+ <%= pb_rails("passphrase", props: { confirmation: true}) %>
@@ -0,0 +1,31 @@
1
+ import React, { useState } from 'react'
2
+ import { Passphrase } from '../../'
3
+
4
+ const PassphraseDefault = (props) => {
5
+ const [input, setInput] = useState('')
6
+ const handleChange = (e) => setInput(e.target.value)
7
+
8
+ const [confoInput, setConfoInput] = useState('')
9
+ const handleConfoChange = (e) => setConfoInput(e.target.value)
10
+
11
+ return (
12
+ <>
13
+ <div>
14
+ <Passphrase
15
+ onChange={handleChange}
16
+ value={input}
17
+ {...props}
18
+ />
19
+ <Passphrase
20
+ confirmation
21
+ onChange={handleConfoChange}
22
+ value={confoInput}
23
+ {...props}
24
+ />
25
+ <span>{input === confoInput ? 'They match!' : 'They don\'t match!'}</span>
26
+ </div>
27
+ </>
28
+ )
29
+ }
30
+
31
+ export default PassphraseDefault
@@ -0,0 +1 @@
1
+ Use the `confirmation` prop to only include the label and show/hide icon.
@@ -0,0 +1,16 @@
1
+ <%= pb_rails("passphrase", props: {
2
+ input_props: {
3
+ disabled: true,
4
+ id: "my-disabled-passphrase",
5
+ name: "my-disabled-field",
6
+ },
7
+ label: "Input props passed directly to input kit"
8
+ }) %>
9
+
10
+ <%= pb_rails("passphrase", props: {
11
+ input_props: {
12
+ id: "my-custome-id",
13
+ name: "my-value-name",
14
+ },
15
+ label: "Set name, id, etc for use in forms"
16
+ }) %>
@@ -0,0 +1,56 @@
1
+ import React, { useState } from 'react'
2
+ import { Passphrase } from '../../'
3
+
4
+ const PassphraseInputProps = (props) => {
5
+ const [input, setInput] = useState('')
6
+
7
+ const handleChange = (e) => setInput(e.target.value)
8
+
9
+ return (
10
+ <>
11
+ <div>
12
+ <Passphrase
13
+ inputProps={{
14
+ name: 'my-disabled-field',
15
+ id: 'my-value-id',
16
+ disabled: true,
17
+ }}
18
+ label="Pass props directly to input kit"
19
+ onChange={handleChange}
20
+ value={input}
21
+ {...props}
22
+ />
23
+ <Passphrase
24
+ inputProps={{
25
+ children: (
26
+ <input
27
+ onChange={handleChange}
28
+ type="password"
29
+ value={input}
30
+ />),
31
+ }}
32
+ label="Custom input"
33
+ onChange={handleChange}
34
+ value={input}
35
+ {...props}
36
+ />
37
+ <Passphrase
38
+ inputProps={{ name: 'my-value-name', id: 'my-value-id' }}
39
+ label="Set name and ID for use in form libraries"
40
+ onChange={handleChange}
41
+ value={input}
42
+ {...props}
43
+ />
44
+ <Passphrase
45
+ confirmation
46
+ inputProps={{ name: 'my-value-confirmation-name', id: 'my-value-confirmation-id' }}
47
+ onChange={handleChange}
48
+ value={input}
49
+ {...props}
50
+ />
51
+ </div>
52
+ </>
53
+ )
54
+ }
55
+
56
+ export default PassphraseInputProps
@@ -0,0 +1 @@
1
+ `inputProps` is passed directly to an underlying Text Input kit. See the specific docs <a href="/kits/text_input/react" target="_blank">here</a> for more details.
@@ -0,0 +1,10 @@
1
+
2
+ <%= pb_rails("passphrase", props: { label: "Default Settings"}) %>
3
+
4
+ <%= pb_rails("passphrase", props: { label: "Min length = 5", min_length: 5}) %>
5
+
6
+ <%= pb_rails("passphrase", props: { label: "Min length = 30", min_length: 30}) %>
7
+
8
+ <%= pb_rails("passphrase", props: { average_threshold: 1, label: "Average Threshold = 1"}) %>
9
+
10
+ <%= pb_rails("passphrase", props: { label: "Strong Threshold = 4", strong_threshold: 4}) %>
@@ -0,0 +1,68 @@
1
+ import React, { useState } from 'react'
2
+ import { Body, Passphrase, TextInput } from '../../'
3
+
4
+ const PassphraseMeterSettings = (props) => {
5
+ const [input, setInput] = useState('')
6
+
7
+ const handleChange = (e) => setInput(e.target.value)
8
+
9
+ const [strength, setStrength] = useState(0)
10
+ const handleStrengthChange = (str) => setStrength(str)
11
+ return (
12
+ <>
13
+ <div>
14
+ <Body>
15
+ {'These examples will all share the same input value. Type in any of the inputs to see how the strength meter changes in response to different settings.'}
16
+ </Body>
17
+ <br />
18
+ <TextInput
19
+ disabled
20
+ label="Calculated Strength"
21
+ readOnly
22
+ value={strength}
23
+ />
24
+
25
+ <Passphrase
26
+ label="Default settings"
27
+ onChange={handleChange}
28
+ onStrengthChange={handleStrengthChange}
29
+ value={input}
30
+ {...props}
31
+ />
32
+
33
+ <Passphrase
34
+ label="Min length = 5"
35
+ minLength={5}
36
+ onChange={handleChange}
37
+ value={input}
38
+ {...props}
39
+ />
40
+ <Passphrase
41
+ label="Min length = 30"
42
+ minLength={30}
43
+ onChange={handleChange}
44
+ value={input}
45
+ {...props}
46
+ />
47
+
48
+ <Passphrase
49
+ averageThreshold={1}
50
+ label="Average threshold = 1"
51
+ onChange={handleChange}
52
+ value={input}
53
+ {...props}
54
+ />
55
+
56
+ <Passphrase
57
+ label="Strong Threshold = 4"
58
+ onChange={handleChange}
59
+ strongThreshold={4}
60
+ value={input}
61
+ {...props}
62
+ />
63
+ </div>
64
+ </>
65
+ )
66
+ }
67
+
68
+ export default PassphraseMeterSettings
@@ -0,0 +1,9 @@
1
+ By default, the minimum length is 12 and the strength meter will show a strength of 1 if not met. Notice the bar won't change from red until the minimum is met
2
+ Use the `minLength` prop to adjust.
3
+
4
+
5
+ The meter also response to `averageThreshold` and `strongTreshold` props. `averageThresold` defaults to 2, and `strongThreshold` defaults to 3.
6
+ This means that the bar will turn yellow when the strength of the passphrase is calculated to be 2 on a 0-4 scale, and green when 3.
7
+
8
+ Adjust these props to tune the sensitivity of the bar.
9
+ Note: minimum length trumps strength and will set the bar to a red color, despite whatever strength is calculated.
@@ -0,0 +1,33 @@
1
+ import React, { useState } from 'react'
2
+ import { Passphrase, TextInput } from '../../'
3
+
4
+ const PassphraseStrengthChange = (props) => {
5
+ const [input, setInput] = useState('')
6
+
7
+ const handleChange = (e) => setInput(e.target.value)
8
+
9
+ const [strength, setStrength] = useState(0)
10
+ const handleStrengthChange = (str) => setStrength(str)
11
+
12
+ return (
13
+ <>
14
+ <div>
15
+ <Passphrase
16
+ label="Passphrase"
17
+ onChange={handleChange}
18
+ onStrengthChange={handleStrengthChange}
19
+ value={input}
20
+ {...props}
21
+ />
22
+ <TextInput
23
+ disabled
24
+ label="Passphrase Strength"
25
+ readOnly
26
+ value={strength}
27
+ />
28
+ </div>
29
+ </>
30
+ )
31
+ }
32
+
33
+ export default PassphraseStrengthChange
@@ -0,0 +1,3 @@
1
+ As the strength of the entered passphrase changes, the optional `onStrengthChange` callback is called with the new strength value. This exposes the calculated strength.
2
+
3
+ Strength is calculated on a 0-4 scale by the <a href="https://github.com/dropbox/zxcvbn" target="_blank"> Zxcvbn package</a>
@@ -0,0 +1,26 @@
1
+ <%= pb_rails("passphrase", props: {
2
+ label: "Pass an array of strings to the tips prop",
3
+ tips: ['And the info icon will appear.', 'Each string will be displayed as its own tip'],
4
+ }) %>
5
+
6
+ <%= pb_rails("passphrase", props: {
7
+ label: "Omit the prop to hide the icon"
8
+ }) %>
9
+
10
+ <%= pb_rails("passphrase", props: {
11
+ label: "Only show tips at small screen size",
12
+ show_tips_below: "sm",
13
+ tips: ['Make the password longer', 'Type more things', 'Use something else'],
14
+ }) %>
15
+
16
+ <%= pb_rails("passphrase", props: {
17
+ label: "Only show tips at medium screen size",
18
+ show_tips_below: "md",
19
+ tips: ['Make the password longer', 'Type more things', 'Use something else'],
20
+ }) %>
21
+
22
+ <%= pb_rails("passphrase", props: {
23
+ label: "Only show tips at large screen size",
24
+ show_tips_below: "lg",
25
+ tips: ['Make the password longer', 'Type more things', 'Use something else'],
26
+ }) %>
@@ -0,0 +1,54 @@
1
+ import React, { useState } from 'react'
2
+ import { Passphrase } from '../../'
3
+
4
+ const PassphraseTips = (props) => {
5
+ const [input, setInput] = useState('')
6
+
7
+ const handleChange = (e) => setInput(e.target.value)
8
+
9
+ return (
10
+ <>
11
+ <div>
12
+ <Passphrase
13
+ label="Pass an array of strings to the tips prop"
14
+ onChange={handleChange}
15
+ tips={['And the info icon will appear.', 'Each string will be displayed as its own tip']}
16
+ value={input}
17
+ {...props}
18
+ />
19
+ <Passphrase
20
+ label="Omit the prop to hide the icon"
21
+ onChange={handleChange}
22
+ value={input}
23
+ {...props}
24
+ />
25
+ <Passphrase
26
+ label="Only show tips at small screen size"
27
+ onChange={handleChange}
28
+ showTipsBelow="xs"
29
+ tips={['Make the password longer', 'Type more things', 'Use something else']}
30
+ value={input}
31
+ {...props}
32
+ />
33
+ <Passphrase
34
+ label="Only show tips at medium screen size"
35
+ onChange={handleChange}
36
+ showTipsBelow="md"
37
+ tips={['Make the password longer', 'Type more things', 'Use something else']}
38
+ value={input}
39
+ {...props}
40
+ />
41
+ <Passphrase
42
+ label="Only show tips at large screen size"
43
+ onChange={handleChange}
44
+ showTipsBelow="lg"
45
+ tips={['Make the password longer', 'Type more things', 'Use something else']}
46
+ value={input}
47
+ {...props}
48
+ />
49
+ </div>
50
+ </>
51
+ )
52
+ }
53
+
54
+ export default PassphraseTips
@@ -0,0 +1 @@
1
+ `showTipsBelow`(react) / `show_tips_below`(rails) takes 'xs', 'sm', 'md', 'lg', 'xl' and only show the tips below the given screen size. Similar to the <a href="/kits/table/react" target="_blank">responsive table breakpoints.</a> Omit this prop to always show.