playbook_ui 2.9.2 → 2.9.3

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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/pb.logo.svg +28 -0
  3. data/app/helpers/playbook/pb_doc_helper.rb +9 -12
  4. data/app/helpers/playbook/pb_kit_helper.rb +12 -30
  5. data/app/pb_kits/playbook/_playbook.scss +50 -0
  6. data/app/pb_kits/playbook/index.js +10 -9
  7. data/app/pb_kits/playbook/kits/pb_contact.js +4 -0
  8. data/app/pb_kits/playbook/kits/pb_person.js +4 -0
  9. data/app/pb_kits/playbook/kits/pb_person_contact.js +4 -0
  10. data/app/pb_kits/playbook/packs/application.js +3 -3
  11. data/app/pb_kits/playbook/packs/examples.js +85 -127
  12. data/app/pb_kits/playbook/packs/kits.js +36 -36
  13. data/app/pb_kits/playbook/packs/main.scss +1 -1
  14. data/app/pb_kits/playbook/packs/site_styles/_site-style.scss +7 -0
  15. data/app/pb_kits/playbook/pb_bar_graph/barGraphSettings.js +1 -1
  16. data/app/pb_kits/playbook/pb_button/_button.jsx +48 -49
  17. data/app/pb_kits/playbook/pb_button/docs/_button_default.jsx +8 -2
  18. data/app/pb_kits/playbook/pb_card/_card.html.erb +2 -2
  19. data/app/pb_kits/playbook/pb_card/child_kits/_card_body.html.erb +1 -1
  20. data/app/pb_kits/playbook/pb_contact/_contact.html.erb +6 -0
  21. data/app/pb_kits/playbook/pb_contact/_contact.jsx +72 -0
  22. data/app/pb_kits/playbook/{pb_phone/_phone.scss → pb_contact/_contact.scss} +0 -0
  23. data/app/pb_kits/playbook/pb_contact/contact.rb +78 -0
  24. data/app/pb_kits/playbook/pb_contact/docs/_contact_default.html.erb +18 -0
  25. data/app/pb_kits/playbook/pb_contact/docs/_contact_default.jsx +26 -0
  26. data/app/pb_kits/playbook/pb_contact/docs/example.yml +8 -0
  27. data/app/pb_kits/playbook/pb_contact/docs/index.js +1 -0
  28. data/app/pb_kits/playbook/pb_dashboard/commonSettings.js +16 -13
  29. data/app/pb_kits/playbook/pb_hashtag/_hashtag.html.erb +2 -2
  30. data/app/pb_kits/playbook/pb_hashtag/hashtag.rb +20 -59
  31. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.html.erb +3 -3
  32. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +18 -61
  33. data/app/pb_kits/playbook/pb_input/_input.html.erb +1 -1
  34. data/app/pb_kits/playbook/pb_input/_input.jsx +2 -2
  35. data/app/pb_kits/playbook/pb_input/_input.scss +1 -1
  36. data/app/pb_kits/playbook/pb_input/input.rb +10 -79
  37. data/app/pb_kits/playbook/pb_line_graph/lineGraphSettings.js +1 -1
  38. data/app/pb_kits/playbook/{pb_owner/_owner.html.erb → pb_person/_person.html.erb} +1 -1
  39. data/app/pb_kits/playbook/pb_person/_person.jsx +36 -0
  40. data/app/pb_kits/playbook/{pb_owner/_owner.scss → pb_person/_person.scss} +2 -2
  41. data/app/pb_kits/playbook/pb_person/docs/_person_default.html.erb +1 -0
  42. data/app/pb_kits/playbook/pb_person/docs/_person_default.jsx +13 -0
  43. data/app/pb_kits/playbook/pb_person/docs/example.yml +9 -0
  44. data/app/pb_kits/playbook/pb_person/docs/index.js +1 -0
  45. data/app/pb_kits/playbook/{pb_owner/owner.rb → pb_person/person.rb} +18 -14
  46. data/app/pb_kits/playbook/pb_person_contact/_person_contact.html.erb +12 -0
  47. data/app/pb_kits/playbook/pb_person_contact/_person_contact.jsx +49 -0
  48. data/app/pb_kits/playbook/{pb_owner_phone/_owner_phone.scss → pb_person_contact/_person_contact.scss} +3 -3
  49. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_default.html.erb +21 -0
  50. data/app/pb_kits/playbook/pb_person_contact/docs/_person_contact_default.jsx +34 -0
  51. data/app/pb_kits/playbook/pb_person_contact/docs/example.yml +8 -0
  52. data/app/pb_kits/playbook/pb_person_contact/docs/index.js +1 -0
  53. data/app/pb_kits/playbook/pb_person_contact/person_contact.rb +55 -0
  54. data/app/pb_kits/playbook/props.rb +4 -4
  55. data/app/pb_kits/playbook/props/base.rb +7 -3
  56. data/app/pb_kits/playbook/props/number.rb +11 -0
  57. data/app/pb_kits/playbook/props/proc.rb +11 -0
  58. data/app/pb_kits/playbook/tokens/_colors.scss +12 -8
  59. data/app/views/layouts/playbook/_nav.html.slim +2 -2
  60. data/app/views/playbook/pages/principles.html.slim +0 -2
  61. data/fonts/fontawesome.min.js +5 -0
  62. data/fonts/regular.min.js +5 -0
  63. data/lib/generators/kit/kit_generator.rb +2 -2
  64. data/lib/playbook/version.rb +1 -1
  65. metadata +35 -32
  66. data/app/pb_kits/playbook/kits/pb_owner.js +0 -4
  67. data/app/pb_kits/playbook/kits/pb_owner_phone.js +0 -4
  68. data/app/pb_kits/playbook/kits/pb_phone.js +0 -4
  69. data/app/pb_kits/playbook/packs/site_styles/_kit_style_index.scss +0 -50
  70. data/app/pb_kits/playbook/pb_owner/_owner.jsx +0 -21
  71. data/app/pb_kits/playbook/pb_owner/docs/_owner_default.html.erb +0 -1
  72. data/app/pb_kits/playbook/pb_owner/docs/_owner_default.jsx +0 -10
  73. data/app/pb_kits/playbook/pb_owner/docs/example.yml +0 -9
  74. data/app/pb_kits/playbook/pb_owner/docs/index.js +0 -1
  75. data/app/pb_kits/playbook/pb_owner_phone/_owner_phone.html.erb +0 -7
  76. data/app/pb_kits/playbook/pb_owner_phone/_owner_phone.jsx +0 -21
  77. data/app/pb_kits/playbook/pb_owner_phone/docs/_owner_phone_default.html.erb +0 -6
  78. data/app/pb_kits/playbook/pb_owner_phone/docs/_owner_phone_default.jsx +0 -10
  79. data/app/pb_kits/playbook/pb_owner_phone/docs/example.yml +0 -9
  80. data/app/pb_kits/playbook/pb_owner_phone/docs/index.js +0 -1
  81. data/app/pb_kits/playbook/pb_owner_phone/owner_phone.rb +0 -62
  82. data/app/pb_kits/playbook/pb_phone/_phone.html.erb +0 -6
  83. data/app/pb_kits/playbook/pb_phone/_phone.jsx +0 -21
  84. data/app/pb_kits/playbook/pb_phone/docs/_phone_default.html.erb +0 -4
  85. data/app/pb_kits/playbook/pb_phone/docs/_phone_default.jsx +0 -10
  86. data/app/pb_kits/playbook/pb_phone/docs/example.yml +0 -9
  87. data/app/pb_kits/playbook/pb_phone/docs/index.js +0 -1
  88. data/app/pb_kits/playbook/pb_phone/phone.rb +0 -70
  89. data/fonts/fontawesome.js +0 -1978
  90. data/fonts/regular.js +0 -1217
@@ -1,49 +1,49 @@
1
+ import "../kits/pb_avatar.js";
2
+ import "../kits/pb_badge.js";
3
+ import "../kits/pb_bar_graph.js";
1
4
  import "../kits/pb_body.js";
2
5
  import "../kits/pb_button.js";
3
6
  import "../kits/pb_caption.js";
4
7
  import "../kits/pb_card.js";
5
- import "../kits/pb_title.js";
6
- import "../kits/pb_layout.js";
7
- import "../kits/pb_vertical_nav.js";
8
- import "../kits/pb_image.js";
9
- import "../kits/pb_table.js";
10
- import "../kits/pb_avatar.js";
11
- import "../kits/pb_input.js";
12
- import "../kits/pb_bar_graph.js";
13
- import "../kits/pb_line_graph.js";
14
- import "../kits/pb_icon.js";
8
+ import "../kits/pb_checkbox.js";
9
+ import "../kits/pb_contact.js";
10
+ import "../kits/pb_currency.js";
15
11
  import "../kits/pb_dashboard_value.js";
16
- import "../kits/pb_time.js";
17
- import "../kits/pb_pill.js";
18
- import "../kits/pb_user_badge.js";
19
12
  import "../kits/pb_date.js";
20
- import "../kits/pb_title_detail.js";
13
+ import "../kits/pb_date_range_inline.js";
14
+ import "../kits/pb_date_year_stacked.js";
15
+ import "../kits/pb_distribution_bar.js";
16
+ import "../kits/pb_fixed_confirmation_toast.js";
17
+ import "../kits/pb_hashtag.js";
18
+ import "../kits/pb_home_address_street.js";
19
+ import "../kits/pb_icon.js";
21
20
  import "../kits/pb_icon_circle.js";
22
21
  import "../kits/pb_icon_value.js";
23
- import "../kits/pb_star_rating.js";
24
- import "../kits/pb_progress_simple.js";
25
- import "../kits/pb_title_count.js";
26
- import "../kits/pb_user.js";
22
+ import "../kits/pb_image.js";
23
+ import "../kits/pb_input.js";
24
+ import "../kits/pb_label_pill.js";
27
25
  import "../kits/pb_label_value.js";
26
+ import "../kits/pb_layout.js";
27
+ import "../kits/pb_line_graph.js";
28
+ import "../kits/pb_loading_inline.js";
28
29
  import "../kits/pb_message.js";
29
- import "../kits/pb_timestamp.js";
30
30
  import "../kits/pb_online_status.js";
31
+ import "../kits/pb_person.js";
32
+ import "../kits/pb_person_contact.js";
33
+ import "../kits/pb_pill.js";
34
+ import "../kits/pb_progress_simple.js";
35
+ import "../kits/pb_section_separator.js";
31
36
  import "../kits/pb_source.js";
32
- import "../kits/pb_label_pill.js";
33
- import "../kits/pb_phone.js";
34
- import "../kits/pb_owner_phone.js";
35
- import "../kits/pb_owner.js";
36
- import "../kits/pb_toggle.js";
37
- import "../kits/pb_stat_value.js";
37
+ import "../kits/pb_star_rating.js";
38
38
  import "../kits/pb_stat_change.js";
39
- import "../kits/pb_section_separator.js";
40
- import "../kits/pb_currency.js";
41
- import "../kits/pb_fixed_confirmation_toast.js";
42
- import "../kits/pb_loading_inline.js";
43
- import "../kits/pb_checkbox.js";
44
- import "../kits/pb_home_address_street.js";
45
- import "../kits/pb_badge.js";
46
- import "../kits/pb_date_year_stacked.js";
47
- import "../kits/pb_date_range_inline.js";
48
- import "../kits/pb_distribution_bar.js";
49
- import "../kits/pb_hashtag.js";
39
+ import "../kits/pb_stat_value.js";
40
+ import "../kits/pb_table.js";
41
+ import "../kits/pb_time.js";
42
+ import "../kits/pb_timestamp.js";
43
+ import "../kits/pb_title.js";
44
+ import "../kits/pb_title_count.js";
45
+ import "../kits/pb_title_detail.js";
46
+ import "../kits/pb_toggle.js";
47
+ import "../kits/pb_user.js";
48
+ import "../kits/pb_user_badge.js";
49
+ import "../kits/pb_vertical_nav.js";
@@ -2,7 +2,7 @@
2
2
  @import "site_styles/scaffold";
3
3
 
4
4
  // KITS
5
- @import "site_styles/kit_style_index";
5
+ @import "../playbook";
6
6
 
7
7
  // APP STYLES
8
8
  @import "site_styles/site-style";
@@ -11,6 +11,13 @@
11
11
  border-bottom: 1px solid $border_light;
12
12
  padding: 20px 30px;
13
13
  background: $white;
14
+ h1 {
15
+ display: flex;
16
+ align-items: center;
17
+ img {
18
+ display: flex;
19
+ }
20
+ }
14
21
  }
15
22
 
16
23
  &--content {
@@ -1,4 +1,4 @@
1
- import commonSettings from "../pb_dashboard/commonSettings.js";
1
+ import { commonSettings } from "../pb_dashboard/commonSettings.js";
2
2
  import typography from "../tokens/_typography.scss";
3
3
 
4
4
  const sizeColumns = function(highchart) {
@@ -1,8 +1,9 @@
1
1
  /* @flow */
2
2
 
3
- import React, { Component } from 'react'
3
+ import React from 'react'
4
4
  import classnames from 'classnames'
5
5
 
6
+ type EventHandler = (SyntheticInputEvent<HTMLInputElement>) => void
6
7
  type ButtonPropTypes = {
7
8
  aria?: {
8
9
  label: String,
@@ -16,6 +17,7 @@ type ButtonPropTypes = {
16
17
  icon?: String,
17
18
  loading?: Boolean,
18
19
  newWindow?: Boolean,
20
+ onClick?: EventHandler,
19
21
  size: 'large' | 'medium' | 'small',
20
22
  text?: String,
21
23
  type: 'inline' | null,
@@ -27,62 +29,64 @@ type ButtonPropTypes = {
27
29
 
28
30
  const buttonClassName = (props: ButtonPropTypes) => {
29
31
  const {
30
- dark=false,
31
- disabled=false,
32
- fullWidth=false,
33
- loading=false,
34
- size=null,
35
- type='inline',
36
- variant='primary',
32
+ dark = false,
33
+ disabled = false,
34
+ fullWidth = false,
35
+ loading = false,
36
+ size = null,
37
+ type = 'inline',
38
+ variant = 'primary',
37
39
  } = props
38
40
 
39
41
  let className = 'pb_button_kit'
40
42
 
41
- className += `${variant !== null ? `_${variant}` : ''}`
42
- className += `${type !== null ? `_${type}` : ''}`
43
- className += `${size !== null ? `_${size}` : ''}`
44
- className += `${dark === true ? '_dark' : ''}`
45
- className += `${fullWidth ? '_block' : ''}`
46
- className += disabled ? '_disabled' : '_enabled'
47
- className += loading ? '_loading' : ''
43
+ className += `${variant !== null ? `_${variant}` : ''}`
44
+ className += `${type !== null ? `_${type}` : ''}`
45
+ className += `${size !== null ? `_${size}` : ''}`
46
+ className += `${dark === true ? '_dark' : ''}`
47
+ className += `${fullWidth ? '_block' : ''}`
48
+ className += disabled ? '_disabled' : '_enabled'
49
+ className += loading ? '_loading' : ''
48
50
 
49
51
  return className
50
52
  }
51
53
 
52
54
  const buttonAriaProps = (props: ButtonPropTypes) => {
53
- const { aria } = props
54
- if(typeof aria !== "object") return {}
55
+ const { aria } = props
56
+ if (typeof aria !== 'object') return {}
55
57
  const { label } = aria
56
58
 
57
59
  let ariaProps = {}
58
60
 
59
- if(label !== null) ariaProps['aria-label'] = label
61
+ if (label !== null) ariaProps['aria-label'] = label
60
62
 
61
63
  return ariaProps
62
64
  }
63
65
 
64
- const Button = (props : ButtonPropTypes) => {
66
+ const Button = (props: ButtonPropTypes) => {
65
67
  const {
66
- aria={},
67
68
  children,
68
69
  className,
69
- icon=null,
70
- loading=false,
71
- link=null,
72
- newWindow=false,
70
+ icon = null,
71
+ loading = false,
72
+ onClick = () => {},
73
+ link = null,
74
+ newWindow = false,
73
75
  text,
74
- htmlType='button',
75
- value
76
+ htmlType = 'button',
77
+ value,
76
78
  } = props
77
79
 
78
- const buttonAria = buttonAriaProps(props)
79
- const css = classnames(buttonClassName(props), className)
80
- const loadingIcon = <i className="pb_icon_kit far fa-spinner fa-fw fa-pulse loading-icon"/>
80
+ const buttonAria = buttonAriaProps(props)
81
+ const css = classnames(buttonClassName(props), className)
82
+ const loadingIcon = (
83
+ <i className='pb_icon_kit far fa-spinner fa-fw fa-pulse loading-icon' />
84
+ )
81
85
 
82
- const content = (
83
- <span className="pb_button_content">
86
+ const content = (
87
+ <span className='pb_button_content'>
84
88
  <If condition={icon !== null}>
85
- <i className={`pb_icon_kit far fa-${icon} fa-fw`}/>
89
+ <i className={`pb_icon_kit far fa-${icon} fa-fw`} />
86
90
  </If>
87
91
  <span>{text || children}</span>
88
92
  </span>
@@ -91,26 +95,21 @@ const Button = (props : ButtonPropTypes) => {
91
95
  return (
92
96
  <If condition={link !== null}>
93
97
  <a
94
- {...buttonAria}
95
- className={css}
96
- href={link}
97
- target={newWindow ? '_blank' : null}
98
- >
99
- <If condition={loading}>
100
- {loadingIcon}
101
- </If>
98
+ {...buttonAria}
99
+ className={css}
100
+ href={link}
101
+ target={newWindow ? '_blank' : null}>
102
+ <If condition={loading}>{loadingIcon}</If>
102
103
  {content}
103
104
  </a>
104
- <Else/>
105
+ <Else />
105
106
  <button
106
- {...buttonAria}
107
- className={css}
108
- type={htmlType}
109
- value={value}
110
- >
111
- <If condition={loading}>
112
- {loadingIcon}
113
- </If>
107
+ {...buttonAria}
108
+ className={css}
109
+ onClick={onClick}
110
+ type={htmlType}
111
+ value={value}>
112
+ <If condition={loading}>{loadingIcon}</If>
114
113
  {content}
115
114
  </button>
116
115
  </If>
@@ -3,18 +3,24 @@ import {Button} from '../../'
3
3
 
4
4
  const ButtonDefault = () => (
5
5
  <div>
6
- <Button text="Button Primary" />
7
6
  <Button
7
+ onClick={() => console.log("button clicked!")}
8
+ text="Button Primary"
9
+ />
10
+ <Button
11
+ onClick={() => console.log("button clicked!")}
8
12
  text="Button Secondary"
9
13
  variant="secondary"
10
14
  />
11
15
  <Button
16
+ onClick={() => console.log("button clicked!")}
12
17
  text="Button Link"
13
18
  variant="link"
14
19
  />
15
20
  <Button
16
- text="Button Disabled"
17
21
  disabled
22
+ onClick={() => console.log("button clicked!")}
23
+ text="Button Disabled"
18
24
  />
19
25
  </div>
20
26
  )
@@ -3,7 +3,7 @@
3
3
  data: object.data,
4
4
  class: object.classname,
5
5
  aria: object.aria) do %>
6
- <% if object.block %>
7
- <%= pb_rails("card/card_body", props: { padding: object.padding}) { capture(&object.block) } %>
6
+ <% if object.children %>
7
+ <%= pb_rails("card/card_body", props: { padding: object.padding, children: object.children }) %>
8
8
  <% end %>
9
9
  <% end %>
@@ -3,5 +3,5 @@
3
3
  data: object.data,
4
4
  class: object.classname,
5
5
  aria: object.aria) do %>
6
- <%= capture(&object.block) %>
6
+ <%= capture(&object.children) %>
7
7
  <% end %>
@@ -0,0 +1,6 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname("pb_contact_kit")) do %>
5
+ <span><%= object.contact_value %></span>
6
+ <% end %>
@@ -0,0 +1,72 @@
1
+ /* @flow */
2
+ /*eslint-disable react/no-multi-comp, flowtype/space-before-type-colon */
3
+
4
+ import React from 'react'
5
+ import classnames from 'classnames'
6
+
7
+ import {
8
+ Body,
9
+ Icon,
10
+ } from '../'
11
+
12
+ type ContactProps = {
13
+ contactType?: 'cell' | 'home' | 'work' | 'email',
14
+ className?: String | Array<String>,
15
+ dark?: Boolean,
16
+ contactValue: String,
17
+ }
18
+
19
+ const kitClasses = ({}: ContactProps) => {
20
+ let classname = 'pb_contact_kit'
21
+ return classname
22
+ }
23
+
24
+ const Contact = ({
25
+ contactType,
26
+ className,
27
+ dark=false,
28
+ contactValue,
29
+ }: ContactProps) => {
30
+
31
+ const css = classnames(kitClasses({contactType}), className)
32
+
33
+ const formatPhoneNumber = (phoneNumberString, contactType) => {
34
+ if (contactType == "email") {
35
+ return phoneNumberString
36
+ } else {
37
+ let cleaned = ('' + phoneNumberString).replace(/\D/g, '')
38
+ let match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/)
39
+ if (match) {
40
+ let intlCode = (match[1] ? '+1 ' : '')
41
+ return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('')
42
+ }
43
+ return null
44
+ }
45
+ }
46
+
47
+ const contactTypeIcon = (function(contactType) {
48
+ switch(contactType) {
49
+ case 'cell':
50
+ return 'mobile';
51
+ case 'home':
52
+ return 'phone';
53
+ case 'work':
54
+ return 'phone-office';
55
+ case 'email':
56
+ return 'envelope';
57
+ default:
58
+ return 'phone';
59
+ }
60
+ })(contactType)
61
+
62
+ return (
63
+ <div className={css}>
64
+ <Body dark={dark} color="light" >
65
+ <Icon icon={contactTypeIcon} fixedWidth="true" />
66
+ {` ${formatPhoneNumber(contactValue, contactType)}`}
67
+ </Body>
68
+ </div>
69
+ )
70
+ }
71
+
72
+ export default Contact
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "action_view"
4
+
5
+ module Playbook
6
+ module PbContact
7
+ class Contact < Playbook::PbKit::Base
8
+ include ActionView::Helpers::NumberHelper
9
+
10
+ PROPS = %i[configured_classname
11
+ configured_data
12
+ configured_id
13
+ configured_contact_type
14
+ configured_contact_value].freeze
15
+
16
+ def initialize(classname: default_configuration,
17
+ data: default_configuration,
18
+ id: default_configuration,
19
+ contact_type: default_configuration,
20
+ contact_value: default_configuration)
21
+ self.configured_classname = classname
22
+ self.configured_data = data
23
+ self.configured_id = id
24
+ self.configured_contact_type = contact_type
25
+ self.configured_contact_value = contact_value
26
+ end
27
+
28
+ def contact_type
29
+ case configured_contact_type
30
+ when "cell"
31
+ icon = "mobile"
32
+ when "home"
33
+ icon = "phone"
34
+ when "work"
35
+ icon = "phone-office"
36
+ when "email"
37
+ icon = "envelope"
38
+ else # "unknown" || "other"
39
+ icon = "phone"
40
+ end
41
+ contact_type_props = { icon: icon, fixed_width: true }
42
+ pb_contact_type = Playbook::PbIcon::Icon.new(contact_type_props)
43
+ ApplicationController.renderer.render(partial: pb_contact_type, as: :object)
44
+ end
45
+
46
+ def contact_value
47
+ if is_set? configured_contact_value
48
+ unless configured_contact_type == "email"
49
+ new_value = number_to_phone(formatted_value, area_code: true) if formatted_value
50
+ else
51
+ new_value = configured_contact_value
52
+ end
53
+ pb_body = Playbook::PbBody::Body.new(color: "light") do
54
+ contact_type + new_value
55
+ end
56
+ ApplicationController.renderer.render(partial: pb_body, as: :object)
57
+ end
58
+ end
59
+
60
+ def formatted_value
61
+ configured_contact_value.to_s.gsub(/\D/, "")
62
+ end
63
+
64
+ def to_partial_path
65
+ "pb_contact/contact"
66
+ end
67
+
68
+ private
69
+
70
+ DEFAULT = Object.new
71
+ private_constant :DEFAULT
72
+ def default_configuration
73
+ DEFAULT
74
+ end
75
+ attr_accessor(*PROPS)
76
+ end
77
+ end
78
+ end