playbook_ui 8.2.0.pre.alpha2 → 8.2.0.pre.alpha3

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 (80) 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 +2 -1
  4. data/app/pb_kits/playbook/index.js +1 -0
  5. data/app/pb_kits/playbook/pb_avatar/_avatar.jsx +14 -2
  6. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +1 -1
  7. data/app/pb_kits/playbook/pb_avatar/avatar.rb +5 -2
  8. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +5 -2
  9. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_default.html.erb +5 -0
  10. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_default.jsx +5 -0
  11. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_status.html.erb +4 -0
  12. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_status.jsx +4 -0
  13. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.jsx +6 -0
  14. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +2 -1
  15. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +2 -0
  16. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +4 -0
  17. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +4 -0
  18. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +2 -0
  19. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +2 -0
  20. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +2 -0
  21. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +2 -0
  22. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +8 -0
  23. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +8 -0
  24. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +2 -0
  25. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +31 -0
  26. data/app/pb_kits/playbook/pb_caption/_caption.jsx +3 -2
  27. data/app/pb_kits/playbook/pb_caption/caption.rb +1 -1
  28. data/app/pb_kits/playbook/pb_card/_card.jsx +18 -3
  29. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  30. data/app/pb_kits/playbook/pb_card/card.rb +3 -0
  31. data/app/pb_kits/playbook/pb_card/docs/_card_tag.html.erb +25 -0
  32. data/app/pb_kits/playbook/pb_card/docs/_card_tag.jsx +59 -0
  33. data/app/pb_kits/playbook/pb_card/docs/example.yml +2 -0
  34. data/app/pb_kits/playbook/pb_card/docs/index.js +1 -0
  35. data/app/pb_kits/playbook/pb_checkbox/_checkbox.jsx +31 -9
  36. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +28 -19
  37. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +11 -3
  38. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +6 -1
  39. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +94 -0
  40. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_custom.jsx +0 -1
  41. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.html.erb +7 -0
  42. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.jsx +16 -0
  43. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -0
  44. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  45. data/app/pb_kits/playbook/pb_dialog/_close_icon.jsx +23 -0
  46. data/app/pb_kits/playbook/pb_dialog/_dialog.html.erb +10 -0
  47. data/app/pb_kits/playbook/pb_dialog/_dialog.jsx +142 -0
  48. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +133 -0
  49. data/app/pb_kits/playbook/pb_dialog/_dialog_context.jsx +3 -0
  50. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_body.jsx +21 -0
  51. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_footer.jsx +36 -0
  52. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_header.jsx +68 -0
  53. data/app/pb_kits/playbook/pb_dialog/dialog.rb +47 -0
  54. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +23 -0
  55. data/app/pb_kits/playbook/pb_dialog/dialog_header.rb +31 -0
  56. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.jsx +53 -0
  57. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.md +2 -0
  58. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.jsx +27 -0
  59. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_scrollable.jsx +27 -0
  60. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_scrollable.md +2 -0
  61. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_separators.jsx +119 -0
  62. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_separators.md +2 -0
  63. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_should_close_on_overlay.jsx +28 -0
  64. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_should_close_on_overlay.md +2 -0
  65. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_sizes.jsx +93 -0
  66. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +10 -0
  67. data/app/pb_kits/playbook/pb_dialog/docs/index.js +6 -0
  68. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -1
  69. data/app/pb_kits/playbook/pb_form/form_builder.rb +4 -2
  70. data/app/pb_kits/playbook/pb_form/form_builder/action_area.rb +14 -7
  71. data/app/pb_kits/playbook/pb_form/form_with.rb +0 -1
  72. data/app/pb_kits/playbook/pb_form/simple_form.html.erb +2 -4
  73. data/app/pb_kits/playbook/pb_form/simple_form.rb +4 -0
  74. data/app/pb_kits/playbook/pb_online_status/_online_status.jsx +2 -0
  75. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +1 -1
  76. data/app/pb_kits/playbook/pb_user_badge/_user_badge.jsx +1 -1
  77. data/app/pb_kits/playbook/react_rails_kits.js +4 -0
  78. data/lib/playbook/version.rb +2 -1
  79. metadata +35 -8
  80. data/app/pb_kits/playbook/pb_form/form_builder/action_area.html.erb +0 -3
@@ -3,9 +3,17 @@
3
3
  data: object.data,
4
4
  class: object.classname) do %>
5
5
  <%= content.presence || object.input %>
6
- <span class="pb_checkbox_checkmark">
7
- <%= pb_rails("icon", props: { icon: "check", id: "check_icon", classname: "check_icon", fixed_width: true}) %>
8
- </span>
6
+ <% if object.indeterminate %>
7
+ <span class="pb_checkbox_indeterminate">
8
+ <%= pb_rails("icon", props: { icon: "minus", classname: "indeterminate_icon", fixed_width: true}) %>
9
+ <%= pb_rails("icon", props: { icon: "check", classname: "check_icon hidden", fixed_width: true}) %>
10
+ </span>
11
+ <% else %>
12
+ <span class="pb_checkbox_checkmark">
13
+ <%= pb_rails("icon", props: { icon: "check", classname: "check_icon", fixed_width: true}) %>
14
+ <%= pb_rails("icon", props: { icon: "minus", classname: "indeterminate_icon hidden", fixed_width: true}) %>
15
+ </span>
16
+ <% end %>
9
17
  <span class="pb_checkbox_label">
10
18
  <%= pb_rails("body", props: { status: object.checkbox_label_status, text: object.text, dark: object.dark, margin_right: object.form_spacing ? "xs" : "" }) %>
11
19
  </span>
@@ -5,6 +5,7 @@ module Playbook
5
5
  class Checkbox < Playbook::KitBase
6
6
  prop :error, type: Playbook::Props::Boolean, default: false
7
7
  prop :checked, type: Playbook::Props::Boolean, default: false
8
+ prop :indeterminate, type: Playbook::Props::Boolean, default: false
8
9
  prop :text
9
10
  prop :value
10
11
  prop :name
@@ -21,7 +22,7 @@ module Playbook
21
22
  end
22
23
 
23
24
  def classname
24
- generate_classname("pb_checkbox_kit", checked_class) + error_class
25
+ generate_classname("pb_checkbox_kit", checked_class) + indeterminate_class + error_class
25
26
  end
26
27
 
27
28
  def input
@@ -41,6 +42,10 @@ module Playbook
41
42
  def checked_class
42
43
  checked ? "on" : "off"
43
44
  end
45
+
46
+ def indeterminate_class
47
+ indeterminate ? " indeterminate" : ""
48
+ end
44
49
  end
45
50
  end
46
51
  end
@@ -0,0 +1,94 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+
4
+ import Checkbox from './_checkbox'
5
+
6
+ const testId = 'checkbox1',
7
+ kitClass = 'pb_checkbox_kit'
8
+
9
+ test('returns namespaced class name', () => {
10
+ render(
11
+ <Checkbox
12
+ data={{ testid: testId }}
13
+ name="checkbox-name"
14
+ text="Checkbox"
15
+ value="check-box value"
16
+ />
17
+ )
18
+
19
+ const kit = screen.getByTestId(testId)
20
+ expect(kit).toHaveClass(kitClass)
21
+ })
22
+
23
+ test('returns dark class name', () => {
24
+ render(
25
+ <Checkbox
26
+ dark
27
+ data={{ testid: testId }}
28
+ name="checkbox-name"
29
+ text="Checkbox"
30
+ value="check-box value"
31
+ />
32
+ )
33
+
34
+ const kit = screen.getByTestId(testId)
35
+ expect(kit).toHaveClass(`${kitClass} dark`)
36
+ })
37
+
38
+ test('returns indeterminate class name', () => {
39
+ render(
40
+ <Checkbox
41
+ data={{ testid: testId }}
42
+ indeterminate
43
+ name="checkbox-name"
44
+ text="Checkbox"
45
+ value="check-box value"
46
+ />
47
+ )
48
+
49
+ const kit = screen.getByTestId(testId)
50
+ expect(kit).toHaveClass(`${kitClass}_indeterminate`)
51
+ })
52
+
53
+ test('has name attribute', () => {
54
+ render(
55
+ <Checkbox
56
+ data={{ testid: testId }}
57
+ name="checkbox-name"
58
+ text="Checkbox"
59
+ value="check-box value"
60
+ />
61
+ )
62
+
63
+ const kit = screen.getByTestId(testId)
64
+ expect(kit.getElementsByTagName('input')[0]).toHaveAttribute('name', 'checkbox-name')
65
+ })
66
+
67
+ test('has value attribute', () => {
68
+ render(
69
+ <Checkbox
70
+ data={{ testid: testId }}
71
+ name="checkbox-name"
72
+ text="Checkbox"
73
+ value="checkbox value"
74
+ />
75
+ )
76
+
77
+ const kit = screen.getByTestId(testId)
78
+ expect(kit.getElementsByTagName('input')[0]).toHaveAttribute('value', 'checkbox value')
79
+ })
80
+
81
+ test('has checked attribute', () => {
82
+ render(
83
+ <Checkbox
84
+ checked
85
+ data={{ testid: testId }}
86
+ name="checkbox-name"
87
+ text="Checkbox"
88
+ value="check-box value"
89
+ />
90
+ )
91
+
92
+ const kit = screen.getByTestId(testId)
93
+ expect(kit.getElementsByTagName('input')[0]).toHaveAttribute('checked')
94
+ })
@@ -24,7 +24,6 @@ const CheckboxCustom = (props) => {
24
24
  onChange={handleOnChange}
25
25
  type="checkbox"
26
26
  value="custom-value"
27
- {...props}
28
27
  />
29
28
  </Checkbox>
30
29
  </div>
@@ -0,0 +1,7 @@
1
+ <%= pb_rails("checkbox" , props: {
2
+ text: "Select ",
3
+ value: "checkbox-value",
4
+ name: "main",
5
+ indeterminate: true,
6
+ id: "test-indeterminate-js"
7
+ }) %>
@@ -0,0 +1,16 @@
1
+ import React from 'react'
2
+ import { Checkbox } from '../..'
3
+
4
+ const CheckboxIndeterminate = (props) => {
5
+ return (
6
+ <Checkbox
7
+ indeterminate
8
+ name="checkbox-name"
9
+ text="Indeterminate State"
10
+ value="check-box value"
11
+ {...props}
12
+ />
13
+ )
14
+ }
15
+
16
+ export default CheckboxIndeterminate
@@ -5,9 +5,11 @@ examples:
5
5
  - checkbox_custom: Custom Checkbox
6
6
  - checkbox_error: Default w/ Error
7
7
  - checkbox_options: Checkbox w/ Options
8
+ - checkbox_indeterminate: Indeterminate Checkbox
8
9
 
9
10
  react:
10
11
  - checkbox_default: Default
11
12
  - checkbox_checked: Load as checked
12
13
  - checkbox_custom: Custom Checkbox
13
14
  - checkbox_error: Default w/ Error
15
+ - checkbox_indeterminate: Indeterminate Checkbox
@@ -2,3 +2,4 @@ export { default as CheckboxDefault } from './_checkbox_default.jsx'
2
2
  export { default as CheckboxCustom } from './_checkbox_custom.jsx'
3
3
  export { default as CheckboxError } from './_checkbox_error.jsx'
4
4
  export { default as CheckboxChecked } from './_checkbox_checked.jsx'
5
+ export { default as CheckboxIndeterminate } from './_checkbox_indeterminate.jsx'
@@ -0,0 +1,23 @@
1
+ /* @flow */
2
+
3
+ import React from 'react'
4
+ import { Icon } from '../'
5
+
6
+ type CloseIconProps = {
7
+ onClose: () => mixed,
8
+ }
9
+
10
+ export const CloseIcon = (props: CloseIconProps) => {
11
+ const { onClose } = props
12
+ return (
13
+ <div
14
+ className="pb_dialog_close_icon"
15
+ onClick={onClose}
16
+ >
17
+ <Icon
18
+ fixedWidth
19
+ icon="times"
20
+ />
21
+ </div>
22
+ )
23
+ }
@@ -0,0 +1,10 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname,
5
+ aria: object.aria,
6
+ dark: object.dark) do %>
7
+ <% if object.children %>
8
+ <%= pb_rails("dialog/dialog_header", props: { children: object.children }) %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,142 @@
1
+ /* @flow */
2
+
3
+ import React, { useState } from 'react'
4
+ import classnames from 'classnames'
5
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
6
+ import { globalProps } from '../utilities/globalProps.js'
7
+ import Modal from 'react-modal'
8
+ import { Button } from '../'
9
+ import DialogHeader from './child_kits/_dialog_header'
10
+ import DialogFooter from './child_kits/_dialog_footer'
11
+ import DialogBody from './child_kits/_dialog_body'
12
+ import { DialogContext } from './_dialog_context'
13
+
14
+ type DialogProps = {
15
+ aria?: object,
16
+ cancelButton?: string,
17
+ children: array<React.ReactNode> | React.ReactNode | string,
18
+ className?: string,
19
+ closeable: boolean,
20
+ confirmButton?: string,
21
+ data?: object,
22
+ id?: string,
23
+ onCancel?: () => void,
24
+ onChange?: () => void,
25
+ onClose?: () => void,
26
+ onConfirm?: () => void,
27
+ opened: boolean,
28
+ shouldCloseOnOverlayClick: boolean,
29
+ size?: "sm" | "md" | "lg" | "content",
30
+ text?: string,
31
+ title?: string,
32
+ trigger?: string
33
+ }
34
+
35
+ const Dialog = (props: DialogProps) => {
36
+ const {
37
+ aria = {},
38
+ cancelButton,
39
+ confirmButton,
40
+ className,
41
+ data = {},
42
+ id,
43
+ size = 'md',
44
+ children,
45
+ opened,
46
+ onCancel = () => {},
47
+ onConfirm = () => {},
48
+ onClose = () => {},
49
+ shouldCloseOnOverlayClick = true,
50
+ text,
51
+ title,
52
+ trigger,
53
+ } = props
54
+ const ariaProps = buildAriaProps(aria)
55
+ const dataProps = buildDataProps(data)
56
+
57
+ const dialogClassNames = {
58
+ base: classnames('pb_dialog', buildCss('pb_dialog', size)),
59
+ afterOpen: 'pb_dialog_after_open',
60
+ beforeClose: 'pb_dialog_before_close',
61
+ }
62
+
63
+ const overlayClassNames = {
64
+ base: 'pb_dialog_overlay',
65
+ afterOpen: 'pb_dialog_overlay_after_open',
66
+ beforeClose: 'pb_dialog_overlay_before_close',
67
+ }
68
+
69
+ const classes = classnames(
70
+ buildCss('pb_dialog_wrapper'),
71
+ globalProps(props),
72
+ className
73
+ )
74
+
75
+ const api = {
76
+ onClose: trigger ? function(){
77
+ setTriggerOpened(false)
78
+ } : onClose,
79
+ }
80
+
81
+ const [triggerOpened, setTriggerOpened] = useState(false),
82
+ modalIsOpened = trigger ? triggerOpened : opened
83
+
84
+ if (trigger) {
85
+ const modalTrigger = document.querySelector(trigger)
86
+ modalTrigger.addEventListener('click', () => {
87
+ setTriggerOpened(true)
88
+ document.querySelector('#cancel-button').addEventListener('click', () => {
89
+ setTriggerOpened(false)
90
+ })
91
+ }, { once: true })
92
+ }
93
+
94
+ return (
95
+ <DialogContext.Provider value={api}>
96
+ <div
97
+ {...ariaProps}
98
+ {...dataProps}
99
+ className={classes}
100
+ id={id}
101
+ >
102
+ <Modal
103
+ ariaHideApp={false}
104
+ className={dialogClassNames}
105
+ closeTimeoutMS={200}
106
+ contentLabel="Minimal Modal Example"
107
+ isOpen={modalIsOpened}
108
+ onRequestClose={onClose}
109
+ overlayClassName={overlayClassNames}
110
+ shouldCloseOnOverlayClick={shouldCloseOnOverlayClick}
111
+ >
112
+ <If condition={title}>
113
+ <Dialog.Header>{title}</Dialog.Header>
114
+ </If>
115
+ <If condition={text}>
116
+ <Dialog.Body>{text}</Dialog.Body>
117
+ </If>
118
+
119
+ <If condition={cancelButton && confirmButton}>
120
+ <Dialog.Footer>
121
+ <Button onClick={onConfirm}>{confirmButton}</Button>
122
+ <Button
123
+ id="cancel-button"
124
+ onClick={onCancel}
125
+ variant="link"
126
+ >
127
+ {cancelButton}
128
+ </Button>
129
+ </Dialog.Footer>
130
+ </If>
131
+
132
+ {children}
133
+ </Modal>
134
+ </div>
135
+ </DialogContext.Provider>
136
+ )
137
+ }
138
+ Dialog.Header = DialogHeader
139
+ Dialog.Body = DialogBody
140
+ Dialog.Footer = DialogFooter
141
+
142
+ export default Dialog
@@ -0,0 +1,133 @@
1
+ @import "../tokens/positioning";
2
+ @import "../tokens/colors";
3
+ @import "../pb_card/card_mixin";
4
+ @import "../tokens/shadows";
5
+ @import "../tokens/border_radius";
6
+ @import "../tokens/spacing";
7
+ @import "../tokens/animation-curves";
8
+
9
+
10
+
11
+ // Dialog Animations
12
+
13
+ @keyframes modalFadeIn {
14
+ from {
15
+ transform: translate3d(0, -100%, 0);
16
+ opacity: 0;
17
+ }
18
+ to {
19
+ transform: translate3d(0, 0, 0);
20
+ opacity: 1;
21
+ }
22
+ }
23
+
24
+ @keyframes modalFadeOut {
25
+ from {
26
+ transform: translate3d(0, 0, 0);
27
+ opacity: 1;
28
+ }
29
+ to {
30
+ transform: translate3d(0, -50%, 0);
31
+ opacity: 0;
32
+ }
33
+ }
34
+
35
+ @keyframes overlayFade {
36
+ from {
37
+ opacity: 0;
38
+ transform: translateY(0);
39
+ }
40
+ to {
41
+ opacity: 1;
42
+ transform: translateY(0);
43
+ }
44
+ }
45
+
46
+ @keyframes overlayFadeOut {
47
+ from {
48
+ opacity: 1;
49
+ }
50
+ to {
51
+ opacity: 0;
52
+ }
53
+ }
54
+
55
+ // Dialog Styles
56
+
57
+ .pb_dialog {
58
+
59
+ // Local Variables
60
+ $gutter: $space_lg;
61
+ $small: 300px;
62
+ $medium: 500px;
63
+ $large: 800px;
64
+ $animation-duration: 0.2s;
65
+ $z-index: 100;
66
+ $opacity_visible: 1;
67
+ $opacity_hidden: 0;
68
+
69
+ @include pb_card;
70
+ box-shadow: $shadow_deepest;
71
+ border: 0;
72
+ max-height: calc(100vh - #{$gutter * 2});
73
+ max-width: calc(100vw - #{$gutter * 2});
74
+ overflow: scroll;
75
+ animation-name: modalFadeIn;
76
+ animation-duration: $animation-duration;
77
+ outline: none;
78
+ animation-timing-function: $easeInOutQuint;
79
+
80
+ &[class*="_sm"] {
81
+ width: $small;
82
+ }
83
+
84
+ &[class*="_md"] {
85
+ width: $medium;
86
+ }
87
+
88
+ &[class*="_lg"] {
89
+ width: $large;
90
+ }
91
+
92
+ &_body_open {
93
+ overflow: hidden;
94
+ }
95
+
96
+ &_after_open {
97
+ opacity: $opacity_visible;
98
+ }
99
+
100
+ &_before_close {
101
+ animation-name: modalFadeOut;
102
+ animation-duration: $animation-duration;
103
+ opacity: $opacity_hidden;
104
+ }
105
+
106
+ &_close_icon {
107
+ cursor: pointer;
108
+ }
109
+
110
+ &_overlay {
111
+ position: fixed;
112
+ top: 0;
113
+ left: 0;
114
+ right: 0;
115
+ bottom: 0;
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ background-color: rgba($bg_dark, $opacity_4);
120
+ z-index: $z-index;
121
+ animation-name: overlayFade;
122
+ animation-duration: $animation-duration;
123
+
124
+ &_after_open {
125
+ opacity: $opacity_visible;
126
+ }
127
+ &_before_close {
128
+ animation-name: overlayFadeOut;
129
+ animation-duration: $animation-duration;
130
+ opacity: $opacity_hidden;
131
+ }
132
+ }
133
+ }