playbook_ui 2.9.3 → 2.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/playbook/pb_doc_helper.rb +1 -1
  3. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.html.erb +3 -4
  4. data/app/pb_kits/playbook/pb_bar_graph/barGraphSettings.js +4 -3
  5. data/app/pb_kits/playbook/pb_bar_graph/bar_graph.rb +17 -71
  6. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.html.erb +6 -0
  7. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_dark.html.erb +2 -1
  8. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.html.erb +1 -0
  9. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +10 -1
  10. data/app/pb_kits/playbook/pb_label_pill/label_pill.rb +1 -1
  11. data/app/pb_kits/playbook/pb_line_graph/lineGraphSettings.js +1 -0
  12. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.html.erb +5 -2
  13. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.rb +9 -56
  14. data/app/pb_kits/playbook/pb_online_status/_online_status.html.erb +1 -1
  15. data/app/pb_kits/playbook/pb_online_status/online_status.rb +8 -37
  16. data/app/pb_kits/playbook/pb_person_contact/_person_contact.html.erb +9 -4
  17. data/app/pb_kits/playbook/pb_person_contact/_person_contact.jsx +15 -5
  18. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_default.html.erb +10 -2
  19. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_default.jsx +10 -4
  20. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_single_person.html.erb +21 -0
  21. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_single_person.jsx +32 -0
  22. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_three_people.html.erb +16 -0
  23. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_three_people.jsx +33 -0
  24. data/app/pb_kits/playbook/pb_person_contact/docs/example.yml +4 -0
  25. data/app/pb_kits/playbook/pb_person_contact/docs/index.js +2 -0
  26. data/app/pb_kits/playbook/pb_person_contact/person_contact.rb +7 -44
  27. data/app/pb_kits/playbook/pb_pill/_pill.html.erb +2 -2
  28. data/app/pb_kits/playbook/pb_pill/pill.rb +11 -47
  29. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.html.erb +5 -5
  30. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.scss +1 -1
  31. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.rb +65 -67
  32. data/app/pb_kits/playbook/pb_title/_title.html.erb +1 -1
  33. data/app/pb_kits/playbook/pb_title/title.rb +16 -63
  34. data/app/pb_kits/playbook/pb_toggle/_toggle.jsx +65 -18
  35. data/app/pb_kits/playbook/pb_toggle/docs/_toggle_accessibility.jsx +12 -0
  36. data/app/pb_kits/playbook/pb_toggle/docs/_toggle_data.jsx +15 -0
  37. data/app/pb_kits/playbook/pb_toggle/docs/_toggle_default.jsx +39 -6
  38. data/app/pb_kits/playbook/pb_toggle/docs/example.yml +2 -0
  39. data/app/pb_kits/playbook/pb_toggle/docs/index.js +3 -1
  40. data/app/pb_kits/playbook/props.rb +8 -2
  41. data/app/pb_kits/playbook/props/array.rb +11 -0
  42. data/app/pb_kits/playbook/props/hash_array.rb +13 -0
  43. data/app/pb_kits/playbook/props/number_array.rb +1 -1
  44. data/app/pb_kits/playbook/props/percentage.rb +19 -0
  45. data/app/pb_kits/playbook/types.js +4 -0
  46. data/app/pb_kits/playbook/utilities/props.js +48 -0
  47. data/app/views/playbook/pages/kit_show.html.slim +1 -1
  48. data/app/views/playbook/pages/kits.html.slim +1 -1
  49. data/app/views/playbook/pages/tokens.html.slim +2 -2
  50. data/app/views/playbook/pages/tokens/_pb_doc_spacing.html.slim +1 -1
  51. data/app/views/playbook/pages/utilities.html.slim +2 -2
  52. data/app/views/playbook/pages/utilities/_pb_doc_color.html.slim +1 -1
  53. data/lib/generators/kit/kit_generator.rb +3 -2
  54. data/lib/generators/kit/templates/kit_html.erb.tt +1 -1
  55. data/lib/generators/kit/templates/kit_ruby.erb.tt +3 -26
  56. data/lib/generators/kit/templates/kit_ruby_spec.erb.tt +12 -0
  57. data/lib/playbook.rb +3 -0
  58. data/lib/playbook/version.rb +1 -1
  59. metadata +14 -2
@@ -1,4 +1,4 @@
1
1
  <%= content_tag(object.tag, object.text,
2
2
  id: object.id,
3
3
  data: object.data,
4
- class: object.classname(object.kit_class)) %>
4
+ class: object.classname) %>
@@ -2,77 +2,30 @@
2
2
 
3
3
  module Playbook
4
4
  module PbTitle
5
- class Title < Playbook::PbKit::Base
6
- PROPS = %i[configured_aria
7
- configured_classname
8
- configured_dark
9
- configured_data
10
- configured_id
11
- configured_size
12
- configured_tag
13
- configured_text].freeze
5
+ class Title
6
+ include Playbook::Props
14
7
 
15
- def initialize(aria: default_configuration,
16
- classname: default_configuration,
17
- dark: default_configuration,
18
- data: default_configuration,
19
- id: default_configuration,
20
- size: default_configuration,
21
- tag: default_configuration,
22
- text: default_configuration)
23
- self.configured_aria = aria
24
- self.configured_classname = classname
25
- self.configured_dark = dark
26
- self.configured_data = data
27
- self.configured_id = id
28
- self.configured_size = size
29
- self.configured_tag = tag
30
- self.configured_text = text
31
- end
32
-
33
- def tag
34
- tag_options = %w[h1 h2 h3 h4 h5 h6 p div span]
35
- one_of_value(configured_tag, tag_options, "h3")
36
- end
37
-
38
- def text
39
- default_value(configured_text, "Title text")
40
- end
41
-
42
- def size
43
- size_options = [1, 2, 3, 4]
44
- one_of_value(configured_size, size_options, 3)
45
- end
8
+ partial "pb_title/title"
46
9
 
47
- def size_class
48
- adjusted_value(size, size, nil)
49
- end
50
-
51
- def dark_class
52
- true_value(configured_dark, "dark", nil)
53
- end
10
+ prop :dark, type: Playbook::Props::Boolean,
11
+ default: false
12
+ prop :size, type: Playbook::Props::Enum,
13
+ values: [1, 2, 3, 4],
14
+ default: 3
15
+ prop :tag, type: Playbook::Props::Enum,
16
+ values: %w[h1 h2 h3 h4 h5 h6 p div span],
17
+ default: "h3"
18
+ prop :text
54
19
 
55
- def kit_class
56
- title_options = [
57
- "pb_title_kit",
58
- size_class,
59
- dark_class,
60
- ]
61
- title_options.reject(&:nil?).join("_")
62
- end
63
-
64
- def to_partial_path
65
- "pb_title/title"
20
+ def classname
21
+ generate_classname("pb_title_kit", size, dark_class)
66
22
  end
67
23
 
68
24
  private
69
25
 
70
- DEFAULT = Object.new
71
- private_constant :DEFAULT
72
- def default_configuration
73
- DEFAULT
26
+ def dark_class
27
+ dark ? "dark" : nil
74
28
  end
75
- attr_accessor(*PROPS)
76
29
  end
77
30
  end
78
31
  end
@@ -1,21 +1,68 @@
1
- import React from 'react';
2
- import PropTypes from "prop-types";
3
-
4
- const propTypes = {
5
- className: PropTypes.string,
6
- id: PropTypes.string
7
- };
8
-
9
- class Toggle extends React.Component {
10
- render() {
11
- return (
12
- <div className="pb_toggle">
13
- <span>TOGGLE CONTENT</span>
14
- </div>
15
- )
16
- }
1
+ // @flow
2
+
3
+ import React from 'react'
4
+
5
+ import type {
6
+ InputCallback
7
+ } from "../types"
8
+
9
+ import {
10
+ buildAriaProps,
11
+ buildDataProps,
12
+ buildCss,
13
+ noop,
14
+ } from '../utilities/props'
15
+
16
+ type Props = {
17
+ aria: object,
18
+ checked: boolean,
19
+ data: object,
20
+ onChange: InputCallback,
21
+ onCheck: InputCallback,
22
+ onUncheck: InputCallback,
23
+ size: 'sm' | 'md',
17
24
  }
18
25
 
19
- Toggle.propTypes = propTypes;
26
+ const Toggle = ({
27
+ aria = {},
28
+ checked = false,
29
+ data = {},
30
+ onChange = noop,
31
+ onCheck = noop,
32
+ onUncheck = noop,
33
+ size = 'md',
34
+ ...props,
35
+ }: Props) =>{
36
+ const ariaProps = buildAriaProps(aria)
37
+ const dataProps = buildDataProps(data)
38
+ const handleChange = event => {
39
+ onChange(event)
40
+ event.target.checked ?
41
+ onCheck(event) :
42
+ onUncheck(event)
43
+ }
44
+
45
+ const css = buildCss({
46
+ 'pb_toggle_kit': true,
47
+ [size]: true,
48
+ 'on': checked,
49
+ 'off': !checked,
50
+ })
51
+
52
+ return (
53
+ <div {...ariaProps} {...dataProps} className={css}>
54
+ <label className="pb_toggle_wrapper">
55
+ <input
56
+ {...props}
57
+ type="checkbox"
58
+ checked={checked}
59
+ onChange={handleChange}
60
+ />
61
+
62
+ <div className="pb_toggle_control" />
63
+ </label>
64
+ </div>
65
+ )
66
+ }
20
67
 
21
- export default Toggle;
68
+ export default Toggle
@@ -0,0 +1,12 @@
1
+ // @flow
2
+
3
+ import React from "react"
4
+ import { Toggle } from "../.."
5
+
6
+ const Example = () => {
7
+ return (
8
+ <Toggle aria={{ label: "toggle", expanded: false }} />
9
+ )
10
+ }
11
+
12
+ export default Example
@@ -0,0 +1,15 @@
1
+ // @flow
2
+
3
+ import React from "react"
4
+ import { Toggle } from "../.."
5
+
6
+ const Example = () => {
7
+ return (
8
+ <Toggle
9
+ checked
10
+ data={{ id: "the-toggle", expanded: true }}
11
+ />
12
+ )
13
+ }
14
+
15
+ export default Example
@@ -1,10 +1,43 @@
1
+ // @flow
2
+
1
3
  import React from "react"
2
- import {Toggle} from "../../"
4
+ import { Toggle } from "../../"
5
+
6
+ class Example extends React.Component {
7
+ state = {
8
+ toggle1: false,
9
+ toggle2: true,
10
+ }
11
+
12
+ handleChange = event => {
13
+ this.setState({
14
+ [event.target.name]: event.target.checked
15
+ })
16
+ }
17
+
18
+ render() {
19
+ return (
20
+ <>
21
+ <Toggle
22
+ checked={this.state.toggle1}
23
+ name="toggle1"
24
+ onChange={this.handleChange}
25
+ onCheck={event => console.log(`${event.target.name} checked!`)}
26
+ onUncheck={event => console.log(`${event.target.name} unchecked!`)}
27
+ />
28
+
29
+ <br />
3
30
 
4
- function ToggleDefault() {
5
- return (
6
- <h1>{`Coming Soon...`}</h1>
7
- )
31
+ <Toggle
32
+ checked={this.state.toggle2}
33
+ name="toggle2"
34
+ onChange={this.handleChange}
35
+ onCheck={event => console.log(`${event.target.name} checked!`)}
36
+ onUncheck={event => console.log(`${event.target.name} unchecked!`)}
37
+ />
38
+ </>
39
+ )
40
+ }
8
41
  }
9
42
 
10
- export default ToggleDefault
43
+ export default Example
@@ -9,3 +9,5 @@ examples:
9
9
 
10
10
  react:
11
11
  - toggle_default: Default
12
+ - toggle_accessibility: Toggle Accessibility
13
+ - toggle_data: Toggle Data Props
@@ -1 +1,3 @@
1
- export {default as ToggleDefault} from './_toggle_default.jsx';
1
+ export { default as ToggleDefault } from './_toggle_default'
2
+ export { default as ToggleAccessibility } from './_toggle_accessibility'
3
+ export { default as ToggleData } from './_toggle_data'
@@ -1,13 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/concern"
4
+
5
+ # Base must be defined first as other prop types inherit from it
4
6
  require_relative "./props/base"
7
+
8
+ require_relative "./props/array"
5
9
  require_relative "./props/boolean"
6
10
  require_relative "./props/enum"
7
11
  require_relative "./props/hash"
12
+ require_relative "./props/hash_array"
8
13
  require_relative "./props/number"
9
14
  require_relative "./props/number_array"
10
15
  require_relative "./props/string"
16
+ require_relative "./props/percentage"
11
17
  require_relative "./props/proc"
12
18
 
13
19
  module Playbook
@@ -25,9 +31,9 @@ module Playbook
25
31
  self.class.props[name].value @values[name]
26
32
  end
27
33
 
28
- def generate_classname(*name_parts)
34
+ def generate_classname(*name_parts, separator: "_")
29
35
  [
30
- name_parts.compact.join("_"),
36
+ name_parts.compact.join(separator),
31
37
  prop(:classname),
32
38
  ].compact.join(" ")
33
39
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Props
5
+ class Array < Playbook::Props::Base
6
+ def validate(value)
7
+ value.is_a?(::Array)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Props
5
+ class HashArray < Playbook::Props::Base
6
+ def validate(value)
7
+ return false unless value.is_a?(::Array)
8
+
9
+ value.all?(::Hash)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -4,7 +4,7 @@ module Playbook
4
4
  module Props
5
5
  class NumberArray < Playbook::Props::Base
6
6
  def validate(value)
7
- return false unless value.is_a?(Array)
7
+ return false unless value.is_a?(::Array)
8
8
  return false if value.empty?
9
9
 
10
10
  value.all?(Integer)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Props
5
+ class Percentage < Playbook::Props::Base
6
+ def validate(value)
7
+ value.nil? || numeric_in_range?(value)
8
+ end
9
+
10
+ private
11
+
12
+ def numeric_in_range?(value)
13
+ (value.is_a?(Numeric) &&
14
+ value <= 100 &&
15
+ value >= 0)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,4 @@
1
+ // @flow
2
+
3
+ export type Callback<T, K> = T => K
4
+ export type InputCallback = Callback<SyntheticEvent<>, void>
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Defines a set of helper functions used to construct a component following
3
+ * Playbook's patterns.
4
+ */
5
+ import classnames from 'classnames'
6
+
7
+ /**
8
+ *
9
+ * @param {String} prefix the prefix to be used on the dash separated prop (data, aria, etc...)
10
+ * @param {Object} data the object containing the data to derive the props from.
11
+ * @returns {Object} an object whose keys have the prefix added to them.
12
+ */
13
+ const buildPrefixedProps = (prefix, data) => Object.keys(data).reduce((props, key) => {
14
+ props[`${prefix}-${key}`] = data[key]
15
+ return props
16
+ }, {})
17
+
18
+ /**
19
+ * Represent a "No-Operation" function that can be used as a sensible
20
+ * default to event handlers in the absence of a value.
21
+ *
22
+ * @returns {() => {}} the noop function.
23
+ */
24
+ export const noop = () => {}
25
+
26
+ /**
27
+ * Maps a given aria object into HTML valid aria attribtues and their values.
28
+ *
29
+ * @param {Object} aria the object containing the aria prop values.
30
+ * @returns {Object} an object holding the HTML valid aria props and their values.
31
+ */
32
+ export const buildAriaProps = aria => buildPrefixedProps("aria", aria)
33
+
34
+ /**
35
+ * Maps a given data object into HTML valid data attribtues and their values.
36
+ *
37
+ * @param {Object} data the object containing the data prop values.
38
+ * @returns {Object} an object holding the HTML valid data props and their values.
39
+ */
40
+ export const buildDataProps = data => buildPrefixedProps("data", data)
41
+
42
+ /**
43
+ * Builds a Playbook valid root className off of the incoming css rules.
44
+ *
45
+ * @param {Object} rules a 'classnames' compliant rules object, used to derive the root className.
46
+ * @returns {String} the derived root className value.
47
+ */
48
+ export const buildCss = (rules, delimiter = '_') => classnames(rules).replace(/\s/g, delimiter)
@@ -1,5 +1,5 @@
1
1
  .pb--kit-show
2
- = pb_rails("title", props: { text: pb_kit_title(@kit), tag: "h1", size: "1" })
2
+ = pb_rails("title", props: { text: pb_kit_title(@kit), tag: "h1", size: 1 })
3
3
 
4
4
  .pb--kit-type-nav
5
5
  - if has_kit_type?(@kit, "rails")
@@ -1,5 +1,5 @@
1
1
  .pb--kits
2
- = pb_rails("title", props: { text: "Kits", tag: "h1", size: "1" })
2
+ = pb_rails("title", props: { text: "Kits", tag: "h1", size: 1 })
3
3
 
4
4
  .pb--kit-type-nav
5
5
  a href="#{kits_path('', type: 'rails')}" class="#{'active' if @type == 'rails'}" Rails