primer_view_components 0.0.91 → 0.0.92

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,18 +1,19 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
1
6
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
7
  if (kind === "m") throw new TypeError("Private method is not writable");
3
8
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
10
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
11
  };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
12
  var _ToolTipElement_instances, _ToolTipElement_abortController, _ToolTipElement_align, _ToolTipElement_side, _ToolTipElement_allowUpdatePosition, _ToolTipElement_update, _ToolTipElement_updatePosition;
13
13
  import { getAnchoredPosition } from '@primer/behaviors';
14
14
  const TOOLTIP_OPEN_CLASS = 'tooltip-open';
15
15
  const TOOLTIP_ARROW_EDGE_OFFSET = 6;
16
+ const TOOLTIP_SR_ONLY_CLASS = 'sr-only';
16
17
  const DIRECTION_CLASSES = [
17
18
  'tooltip-n',
18
19
  'tooltip-s',
@@ -176,6 +177,14 @@ class ToolTipElement extends HTMLElement {
176
177
  get control() {
177
178
  return this.ownerDocument.getElementById(this.htmlFor);
178
179
  }
180
+ set hiddenFromView(value) {
181
+ this.classList.toggle(TOOLTIP_SR_ONLY_CLASS, value);
182
+ if (this.isConnected)
183
+ __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_update).call(this);
184
+ }
185
+ get hiddenFromView() {
186
+ return this.classList.contains(TOOLTIP_SR_ONLY_CLASS);
187
+ }
179
188
  connectedCallback() {
180
189
  var _a;
181
190
  if (!this.shadowRoot) {
@@ -188,7 +197,7 @@ class ToolTipElement extends HTMLElement {
188
197
  <slot></slot>
189
198
  `;
190
199
  }
191
- this.hidden = true;
200
+ this.hiddenFromView = true;
192
201
  __classPrivateFieldSet(this, _ToolTipElement_allowUpdatePosition, true, "f");
193
202
  if (!this.id) {
194
203
  this.id = `tooltip-${Date.now()}-${(Math.random() * 10000).toFixed(0)}`;
@@ -216,19 +225,19 @@ class ToolTipElement extends HTMLElement {
216
225
  return;
217
226
  // Ensures that tooltip stays open when hovering between tooltip and element
218
227
  // WCAG Success Criterion 1.4.13 Hoverable
219
- if ((event.type === 'mouseenter' || event.type === 'focus') && this.hidden) {
220
- this.hidden = false;
228
+ if ((event.type === 'mouseenter' || event.type === 'focus') && this.hiddenFromView) {
229
+ this.hiddenFromView = false;
221
230
  }
222
231
  else if (event.type === 'blur') {
223
- this.hidden = true;
232
+ this.hiddenFromView = true;
224
233
  }
225
234
  else if (event.type === 'mouseleave' &&
226
235
  event.relatedTarget !== this.control &&
227
236
  event.relatedTarget !== this) {
228
- this.hidden = true;
237
+ this.hiddenFromView = true;
229
238
  }
230
- else if (event.type === 'keydown' && event.key === 'Escape' && !this.hidden) {
231
- this.hidden = true;
239
+ else if (event.type === 'keydown' && event.key === 'Escape' && !this.hiddenFromView) {
240
+ this.hiddenFromView = true;
232
241
  }
233
242
  }
234
243
  attributeChangedCallback(name) {
@@ -236,7 +245,15 @@ class ToolTipElement extends HTMLElement {
236
245
  if (!this.id || !this.control)
237
246
  return;
238
247
  if (this.type === 'label') {
239
- this.control.setAttribute('aria-labelledby', this.id);
248
+ let labelledBy = this.control.getAttribute('aria-labelledby');
249
+ if (labelledBy) {
250
+ labelledBy = `${labelledBy} ${this.id}`;
251
+ }
252
+ else {
253
+ labelledBy = this.id;
254
+ }
255
+ this.control.setAttribute('aria-labelledby', labelledBy);
256
+ // Prevent duplicate accessible name announcements.
240
257
  this.setAttribute('aria-hidden', 'true');
241
258
  }
242
259
  else {
@@ -245,9 +262,6 @@ class ToolTipElement extends HTMLElement {
245
262
  this.control.setAttribute('aria-describedby', describedBy);
246
263
  }
247
264
  }
248
- else if (this.isConnected && name === 'hidden') {
249
- __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_update).call(this);
250
- }
251
265
  else if (name === 'data-direction') {
252
266
  this.classList.remove(...DIRECTION_CLASSES);
253
267
  const direction = this.direction;
@@ -287,21 +301,21 @@ class ToolTipElement extends HTMLElement {
287
301
  }
288
302
  }
289
303
  _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new WeakMap(), _ToolTipElement_side = new WeakMap(), _ToolTipElement_allowUpdatePosition = new WeakMap(), _ToolTipElement_instances = new WeakSet(), _ToolTipElement_update = function _ToolTipElement_update() {
290
- if (this.hidden) {
304
+ if (this.hiddenFromView) {
291
305
  this.classList.remove(TOOLTIP_OPEN_CLASS, ...DIRECTION_CLASSES);
292
306
  }
293
307
  else {
294
308
  this.classList.add(TOOLTIP_OPEN_CLASS);
295
309
  for (const tooltip of this.ownerDocument.querySelectorAll(this.tagName)) {
296
310
  if (tooltip !== this)
297
- tooltip.hidden = true;
311
+ tooltip.hiddenFromView = true;
298
312
  }
299
313
  __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updatePosition).call(this);
300
314
  }
301
315
  }, _ToolTipElement_updatePosition = function _ToolTipElement_updatePosition() {
302
316
  if (!this.control)
303
317
  return;
304
- if (!__classPrivateFieldGet(this, _ToolTipElement_allowUpdatePosition, "f") || this.hidden)
318
+ if (!__classPrivateFieldGet(this, _ToolTipElement_allowUpdatePosition, "f") || this.hiddenFromView)
305
319
  return;
306
320
  const TOOLTIP_OFFSET = 10;
307
321
  this.style.left = `0px`; // Ensures we have reliable tooltip width in `getAnchoredPosition`
@@ -345,7 +359,7 @@ _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new Wea
345
359
  }
346
360
  this.classList.add(`tooltip-${direction}`);
347
361
  };
348
- ToolTipElement.observedAttributes = ['data-type', 'data-direction', 'id', 'hidden'];
362
+ ToolTipElement.observedAttributes = ['data-type', 'data-direction', 'id'];
349
363
  if (!window.customElements.get('tool-tip')) {
350
364
  window.ToolTipElement = ToolTipElement;
351
365
  window.customElements.define('tool-tip', ToolTipElement);
@@ -4,6 +4,7 @@ import {getAnchoredPosition} from '@primer/behaviors'
4
4
 
5
5
  const TOOLTIP_OPEN_CLASS = 'tooltip-open'
6
6
  const TOOLTIP_ARROW_EDGE_OFFSET = 6
7
+ const TOOLTIP_SR_ONLY_CLASS = 'sr-only'
7
8
 
8
9
  type Direction = 'n' | 's' | 'e' | 'w' | 'ne' | 'se' | 'nw' | 'sw'
9
10
 
@@ -176,6 +177,15 @@ class ToolTipElement extends HTMLElement {
176
177
  return this.ownerDocument.getElementById(this.htmlFor)
177
178
  }
178
179
 
180
+ set hiddenFromView(value: true | false) {
181
+ this.classList.toggle(TOOLTIP_SR_ONLY_CLASS, value)
182
+ if (this.isConnected) this.#update()
183
+ }
184
+
185
+ get hiddenFromView() {
186
+ return this.classList.contains(TOOLTIP_SR_ONLY_CLASS)
187
+ }
188
+
179
189
  connectedCallback() {
180
190
  if (!this.shadowRoot) {
181
191
  const shadow = this.attachShadow({mode: 'open'})
@@ -187,7 +197,7 @@ class ToolTipElement extends HTMLElement {
187
197
  <slot></slot>
188
198
  `
189
199
  }
190
- this.hidden = true
200
+ this.hiddenFromView = true
191
201
  this.#allowUpdatePosition = true
192
202
 
193
203
  if (!this.id) {
@@ -220,30 +230,30 @@ class ToolTipElement extends HTMLElement {
220
230
 
221
231
  // Ensures that tooltip stays open when hovering between tooltip and element
222
232
  // WCAG Success Criterion 1.4.13 Hoverable
223
- if ((event.type === 'mouseenter' || event.type === 'focus') && this.hidden) {
224
- this.hidden = false
233
+ if ((event.type === 'mouseenter' || event.type === 'focus') && this.hiddenFromView) {
234
+ this.hiddenFromView = false
225
235
  } else if (event.type === 'blur') {
226
- this.hidden = true
236
+ this.hiddenFromView = true
227
237
  } else if (
228
238
  event.type === 'mouseleave' &&
229
239
  (event as MouseEvent).relatedTarget !== this.control &&
230
240
  (event as MouseEvent).relatedTarget !== this
231
241
  ) {
232
- this.hidden = true
233
- } else if (event.type === 'keydown' && (event as KeyboardEvent).key === 'Escape' && !this.hidden) {
234
- this.hidden = true
242
+ this.hiddenFromView = true
243
+ } else if (event.type === 'keydown' && (event as KeyboardEvent).key === 'Escape' && !this.hiddenFromView) {
244
+ this.hiddenFromView = true
235
245
  }
236
246
  }
237
247
 
238
- static observedAttributes = ['data-type', 'data-direction', 'id', 'hidden']
248
+ static observedAttributes = ['data-type', 'data-direction', 'id']
239
249
 
240
250
  #update() {
241
- if (this.hidden) {
251
+ if (this.hiddenFromView) {
242
252
  this.classList.remove(TOOLTIP_OPEN_CLASS, ...DIRECTION_CLASSES)
243
253
  } else {
244
254
  this.classList.add(TOOLTIP_OPEN_CLASS)
245
- for (const tooltip of this.ownerDocument.querySelectorAll<HTMLElement>(this.tagName)) {
246
- if (tooltip !== this) tooltip.hidden = true
255
+ for (const tooltip of this.ownerDocument.querySelectorAll<ToolTipElement>(this.tagName)) {
256
+ if (tooltip !== this) tooltip.hiddenFromView = true
247
257
  }
248
258
  this.#updatePosition()
249
259
  }
@@ -253,15 +263,21 @@ class ToolTipElement extends HTMLElement {
253
263
  if (name === 'id' || name === 'data-type') {
254
264
  if (!this.id || !this.control) return
255
265
  if (this.type === 'label') {
256
- this.control.setAttribute('aria-labelledby', this.id)
266
+ let labelledBy = this.control.getAttribute('aria-labelledby')
267
+ if (labelledBy) {
268
+ labelledBy = `${labelledBy} ${this.id}`
269
+ } else {
270
+ labelledBy = this.id
271
+ }
272
+ this.control.setAttribute('aria-labelledby', labelledBy)
273
+
274
+ // Prevent duplicate accessible name announcements.
257
275
  this.setAttribute('aria-hidden', 'true')
258
276
  } else {
259
277
  let describedBy = this.control.getAttribute('aria-describedby')
260
278
  describedBy ? (describedBy = `${describedBy} ${this.id}`) : (describedBy = this.id)
261
279
  this.control.setAttribute('aria-describedby', describedBy)
262
280
  }
263
- } else if (this.isConnected && name === 'hidden') {
264
- this.#update()
265
281
  } else if (name === 'data-direction') {
266
282
  this.classList.remove(...DIRECTION_CLASSES)
267
283
  const direction = this.direction
@@ -295,7 +311,7 @@ class ToolTipElement extends HTMLElement {
295
311
 
296
312
  #updatePosition() {
297
313
  if (!this.control) return
298
- if (!this.#allowUpdatePosition || this.hidden) return
314
+ if (!this.#allowUpdatePosition || this.hiddenFromView) return
299
315
 
300
316
  const TOOLTIP_OFFSET = 10
301
317
 
@@ -107,9 +107,12 @@ module Primer
107
107
 
108
108
  @text = text
109
109
  @system_arguments = system_arguments
110
- @system_arguments[:hidden] = true
111
110
  @system_arguments[:tag] = :"tool-tip"
112
111
  @system_arguments[:for] = for_id
112
+ system_arguments[:classes] = class_names(
113
+ system_arguments[:classes],
114
+ "sr-only"
115
+ )
113
116
  @system_arguments[:position] = :absolute
114
117
  @system_arguments[:"data-direction"] = fetch_or_fallback(DIRECTION_OPTIONS, direction, DIRECTION_DEFAULT).to_s
115
118
  @system_arguments[:"data-type"] = fetch_or_fallback(TYPE_OPTIONS, type, TYPE_FALLBACK).to_s
@@ -5,5 +5,5 @@ import './time_ago_component';
5
5
  import './local_time';
6
6
  import './image_crop';
7
7
  import './dropdown';
8
+ import './alpha/toggle-switch-element';
8
9
  import './alpha/tool-tip-element';
9
- import './alpha/segmented-control-element';
@@ -5,5 +5,5 @@ import './time_ago_component';
5
5
  import './local_time';
6
6
  import './image_crop';
7
7
  import './dropdown';
8
+ import './alpha/toggle-switch-element';
8
9
  import './alpha/tool-tip-element';
9
- import './alpha/segmented-control-element';
@@ -5,4 +5,5 @@ import './time_ago_component'
5
5
  import './local_time'
6
6
  import './image_crop'
7
7
  import './dropdown'
8
+ import './alpha/toggle-switch-element'
8
9
  import './alpha/tool-tip-element'
@@ -38,7 +38,7 @@ module Primer
38
38
  end
39
39
 
40
40
  TemplateGlob = Struct.new(:glob_pattern, :method_name, :on_compile_callback)
41
- TemplateParams = Struct.new(:source, :identifier, :type, :format)
41
+ TemplateParams = Struct.new(:source, :identifier, :type, :format, keyword_init: true)
42
42
 
43
43
  attr_accessor :template_root_path
44
44
 
@@ -9,14 +9,12 @@ module ERBLint
9
9
  COMPONENT_TO_USE_INSTEAD = {
10
10
  "Primer::HiddenTextExpander" => "Primer::Alpha::HiddenTextExpander",
11
11
  "Primer::HeadingComponent" => "Primer::Beta::Heading",
12
- "Primer::ButtonGroup" => "Primer::Beta::ButtonGroup",
13
12
  "Primer::CloseButton" => "Primer::Beta::CloseButton",
14
13
  "Primer::CounterComponent" => "Primer::Beta::Counter",
15
14
  "Primer::DetailsComponent" => "Primer::Beta::Details",
16
15
  "Primer::Alpha::AutoComplete::Item" => "Primer::Beta::AutoComplete::Item",
17
16
  "Primer::Alpha::AutoComplete" => "Primer::Beta::AutoComplete",
18
17
  "Primer::BlankslateComponent" => "Primer::Beta::Blankslate",
19
- "Primer::BorderBoxComponent" => "Primer::Beta::BorderBox",
20
18
  "Primer::BoxComponent" => "Primer::Box",
21
19
  "Primer::DropdownMenuComponent" => nil,
22
20
  "Primer::Tooltip" => "Primer::Alpha::Tooltip",
@@ -5,7 +5,7 @@ module Primer
5
5
  module VERSION
6
6
  MAJOR = 0
7
7
  MINOR = 0
8
- PATCH = 91
8
+ PATCH = 92
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH].join(".")
11
11
  end
@@ -23,7 +23,6 @@ module RuboCop
23
23
  "Primer::CloseButton" => "Primer::Beta::CloseButton",
24
24
  "Primer::CounterComponent" => "Primer::Beta::Counter",
25
25
  "Primer::BlankslateComponent" => "Primer::Beta::Blankslate",
26
- "Primer::BorderBoxComponent" => "Primer::Beta::BorderBox",
27
26
  "Primer::BaseButton" => "Primer::Beta::BaseButton",
28
27
  "Primer::TestComponent" => "Primer::Beta::Test"
29
28
  }.freeze
@@ -9,6 +9,7 @@
9
9
  "Primer::Alpha::TabNav": "",
10
10
  "Primer::Alpha::TabPanels": "",
11
11
  "Primer::Alpha::TextField": "",
12
+ "Primer::Alpha::ToggleSwitch": "",
12
13
  "Primer::Alpha::Tooltip": "",
13
14
  "Primer::Alpha::UnderlineNav": "",
14
15
  "Primer::Alpha::UnderlinePanels": "",
@@ -33,11 +34,9 @@
33
34
  "Primer::Beta::Truncate": "",
34
35
  "Primer::Beta::Truncate::TruncateText": "",
35
36
  "Primer::BlankslateComponent": "",
36
- "Primer::BorderBoxComponent": "",
37
37
  "Primer::Box": "",
38
38
  "Primer::BoxComponent": "",
39
39
  "Primer::ButtonComponent": "",
40
- "Primer::ButtonGroup": "",
41
40
  "Primer::ClipboardCopy": "",
42
41
  "Primer::CloseButton": "",
43
42
  "Primer::ConditionalWrapper": "",
@@ -136,6 +136,26 @@
136
136
  },
137
137
  "Primer::Alpha::TextField": {
138
138
  },
139
+ "Primer::Alpha::ToggleSwitch": {
140
+ "SIZE_DEFAULT": "medium",
141
+ "SIZE_MAPPINGS": {
142
+ "medium": null,
143
+ "small": "ToggleSwitch--small"
144
+ },
145
+ "SIZE_OPTIONS": [
146
+ "medium",
147
+ "small"
148
+ ],
149
+ "STATUS_LABEL_POSITION_DEFAULT": "start",
150
+ "STATUS_LABEL_POSITION_MAPPINGS": {
151
+ "start": null,
152
+ "end": "ToggleSwitch--statusAtEnd"
153
+ },
154
+ "STATUS_LABEL_POSITION_OPTIONS": [
155
+ "start",
156
+ "end"
157
+ ]
158
+ },
139
159
  "Primer::Alpha::Tooltip": {
140
160
  "DIRECTION_DEFAULT": "s",
141
161
  "DIRECTION_OPTIONS": [
@@ -373,8 +393,6 @@
373
393
  },
374
394
  "Primer::BlankslateComponent": {
375
395
  },
376
- "Primer::BorderBoxComponent": {
377
- },
378
396
  "Primer::Box": {
379
397
  },
380
398
  "Primer::BoxComponent": {
@@ -408,8 +426,6 @@
408
426
  "medium"
409
427
  ]
410
428
  },
411
- "Primer::ButtonGroup": {
412
- },
413
429
  "Primer::ClipboardCopy": {
414
430
  },
415
431
  "Primer::CloseButton": {
data/static/statuses.json CHANGED
@@ -9,6 +9,7 @@
9
9
  "Primer::Alpha::TabNav": "alpha",
10
10
  "Primer::Alpha::TabPanels": "alpha",
11
11
  "Primer::Alpha::TextField": "alpha",
12
+ "Primer::Alpha::ToggleSwitch": "alpha",
12
13
  "Primer::Alpha::Tooltip": "alpha",
13
14
  "Primer::Alpha::UnderlineNav": "alpha",
14
15
  "Primer::Alpha::UnderlinePanels": "alpha",
@@ -33,11 +34,9 @@
33
34
  "Primer::Beta::Truncate": "beta",
34
35
  "Primer::Beta::Truncate::TruncateText": "alpha",
35
36
  "Primer::BlankslateComponent": "deprecated",
36
- "Primer::BorderBoxComponent": "deprecated",
37
37
  "Primer::Box": "stable",
38
38
  "Primer::BoxComponent": "deprecated",
39
39
  "Primer::ButtonComponent": "beta",
40
- "Primer::ButtonGroup": "deprecated",
41
40
  "Primer::ClipboardCopy": "beta",
42
41
  "Primer::CloseButton": "deprecated",
43
42
  "Primer::ConditionalWrapper": "alpha",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: primer_view_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.91
4
+ version: 0.0.92
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-17 00:00:00.000000000 Z
11
+ date: 2022-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -415,6 +415,8 @@ files:
415
415
  - app/components/primer/alpha/hidden_text_expander.rb
416
416
  - app/components/primer/alpha/layout.html.erb
417
417
  - app/components/primer/alpha/layout.rb
418
+ - app/components/primer/alpha/modal-dialog-element.d.ts
419
+ - app/components/primer/alpha/modal-dialog-element.js
418
420
  - app/components/primer/alpha/segmented-control-element.d.ts
419
421
  - app/components/primer/alpha/segmented-control-element.js
420
422
  - app/components/primer/alpha/tab_nav.html.erb
@@ -422,6 +424,11 @@ files:
422
424
  - app/components/primer/alpha/tab_panels.html.erb
423
425
  - app/components/primer/alpha/tab_panels.rb
424
426
  - app/components/primer/alpha/text_field.rb
427
+ - app/components/primer/alpha/toggle-switch-element.d.ts
428
+ - app/components/primer/alpha/toggle-switch-element.js
429
+ - app/components/primer/alpha/toggle-switch-element.ts
430
+ - app/components/primer/alpha/toggle_switch.html.erb
431
+ - app/components/primer/alpha/toggle_switch.rb
425
432
  - app/components/primer/alpha/tool-tip-element.d.ts
426
433
  - app/components/primer/alpha/tool-tip-element.js
427
434
  - app/components/primer/alpha/tool-tip-element.ts
@@ -464,12 +471,10 @@ files:
464
471
  - app/components/primer/beta/truncate.rb
465
472
  - app/components/primer/blankslate_component.html.erb
466
473
  - app/components/primer/blankslate_component.rb
467
- - app/components/primer/border_box_component.rb
468
474
  - app/components/primer/box.rb
469
475
  - app/components/primer/box_component.rb
470
476
  - app/components/primer/button_component.html.erb
471
477
  - app/components/primer/button_component.rb
472
- - app/components/primer/button_group.rb
473
478
  - app/components/primer/clipboard_copy.html.erb
474
479
  - app/components/primer/clipboard_copy.rb
475
480
  - app/components/primer/clipboard_copy_component.d.ts
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Primer
4
- class BorderBoxComponent < Primer::Beta::BorderBox
5
- status :deprecated
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Primer
4
- class ButtonGroup < Primer::Beta::ButtonGroup
5
- status :deprecated
6
- end
7
- end