@momentum-design/components 0.95.6 → 0.95.8

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 (42) hide show
  1. package/dist/browser/index.js +526 -320
  2. package/dist/browser/index.js.map +4 -4
  3. package/dist/components/buttonsimple/buttonsimple.component.js +5 -4
  4. package/dist/components/cardcheckbox/cardcheckbox.component.js +3 -2
  5. package/dist/components/cardradio/cardradio.component.js +3 -2
  6. package/dist/components/checkbox/checkbox.component.js +2 -1
  7. package/dist/components/input/input.component.js +2 -1
  8. package/dist/components/option/option.styles.js +2 -0
  9. package/dist/components/radio/radio.component.js +3 -2
  10. package/dist/components/searchfield/searchfield.component.js +3 -2
  11. package/dist/components/stepperconnector/index.d.ts +7 -0
  12. package/dist/components/stepperconnector/index.js +4 -0
  13. package/dist/components/stepperconnector/stepperconnector.component.d.ts +31 -0
  14. package/dist/components/stepperconnector/stepperconnector.component.js +60 -0
  15. package/dist/components/stepperconnector/stepperconnector.constants.d.ts +14 -0
  16. package/dist/components/stepperconnector/stepperconnector.constants.js +15 -0
  17. package/dist/components/stepperconnector/stepperconnector.styles.d.ts +2 -0
  18. package/dist/components/stepperconnector/stepperconnector.styles.js +38 -0
  19. package/dist/components/stepperconnector/stepperconnector.types.d.ts +5 -0
  20. package/dist/components/stepperconnector/stepperconnector.types.js +1 -0
  21. package/dist/components/stepperitem/index.d.ts +9 -0
  22. package/dist/components/stepperitem/index.js +6 -0
  23. package/dist/components/stepperitem/stepperitem.component.d.ts +107 -0
  24. package/dist/components/stepperitem/stepperitem.component.js +199 -0
  25. package/dist/components/stepperitem/stepperitem.constants.d.ts +22 -0
  26. package/dist/components/stepperitem/stepperitem.constants.js +23 -0
  27. package/dist/components/stepperitem/stepperitem.styles.d.ts +2 -0
  28. package/dist/components/stepperitem/stepperitem.styles.js +157 -0
  29. package/dist/components/stepperitem/stepperitem.types.d.ts +11 -0
  30. package/dist/components/stepperitem/stepperitem.types.js +1 -0
  31. package/dist/components/toggle/toggle.component.js +2 -1
  32. package/dist/custom-elements.json +1112 -727
  33. package/dist/index.d.ts +3 -1
  34. package/dist/index.js +3 -1
  35. package/dist/react/index.d.ts +4 -2
  36. package/dist/react/index.js +4 -2
  37. package/dist/react/stepperconnector/index.d.ts +15 -0
  38. package/dist/react/stepperconnector/index.js +24 -0
  39. package/dist/react/stepperitem/index.d.ts +40 -0
  40. package/dist/react/stepperitem/index.js +48 -0
  41. package/dist/utils/keys.d.ts +12 -12
  42. package/package.json +1 -1
@@ -0,0 +1,199 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { html, nothing } from 'lit';
11
+ import { property } from 'lit/decorators.js';
12
+ import { Component } from '../../models';
13
+ import { TYPE, VALID_TEXT_TAGS } from '../text/text.constants';
14
+ import { TabIndexMixin } from '../../utils/mixins/TabIndexMixin';
15
+ import { ROLE } from '../../utils/roles';
16
+ import { KEYS } from '../../utils/keys';
17
+ import styles from './stepperitem.styles';
18
+ import { DEFAULT, STATUS, STATUS_ICON } from './stepperitem.constants';
19
+ /**
20
+ * stepperitem component is used to represent a single step in a stepper component. It is used within a `mdc-stepper` component to indicate the current step in a process.
21
+ * It can have different statuses such as `completed`, `current`, `incomplete`, `error-current`, and `error-incomplete`.
22
+ * The component supports various visual styles and can be customized with labels, help text, and step numbers.
23
+ *
24
+ * This is an uncontrolled component, meaning it does not manage its own state. Instead, it relies on the consumer's to manage the state of each step.
25
+ * Make sure to set `aria-current="step"` on the current stepper item. It is applicable only when status is `current` or `error-current`. This ensures accessibility for the stepper component. Only one stepper item should have this attribute at a time.
26
+ *
27
+ * @dependency mdc-icon
28
+ * @dependency mdc-text
29
+ *
30
+ * @tagname mdc-stepperitem
31
+ *
32
+ * @event click - (React: onClick) This event is dispatched when the stepperitem is clicked.
33
+ * @event keydown - (React: onKeyDown) This event is dispatched when a key is pressed down on the stepperitem.
34
+ * @event keyup - (React: onKeyUp) This event is dispatched when a key is released on the stepperitem.
35
+ *
36
+ * @csspart status-container - The container for the status icon or step number.
37
+ * @csspart label-container - The container for the label and help text.
38
+ * @csspart help-text-container - The container for the help text and error icon when applicable.
39
+ * @csspart status-icon - The icon representing the status of the stepper item.
40
+ * @csspart step-number - The text representing the step number.
41
+ * @csspart label - The text representing the label of the stepper item.
42
+ * @csspart help-text - The text providing additional information about the stepper item.
43
+ * @csspart help-icon - The icon representing an error in the stepper item.
44
+ *
45
+ * @cssproperty --mdc-stepperitem-status-container-background - The background color of the status container.
46
+ * @cssproperty --mdc-stepperitem-status-container-border-color - The border color of the status container.
47
+ * @cssproperty --mdc-stepperitem-label-color - The color of the label text.
48
+ * @cssproperty --mdc-stepperitem-help-text-color - The color of the optional label text.
49
+ * @cssproperty --mdc-stepperitem-label-container-background - The background color of the label container.
50
+ */
51
+ class StepperItem extends TabIndexMixin(Component) {
52
+ connectedCallback() {
53
+ super.connectedCallback();
54
+ this.role = ROLE.LISTITEM;
55
+ }
56
+ constructor() {
57
+ super();
58
+ /**
59
+ * The variant of the stepper item, which can be `inline` or `stacked`.
60
+ * @default 'inline'
61
+ */
62
+ this.variant = DEFAULT.VARIANT;
63
+ /**
64
+ * The status of the stepper item, which can be `completed`, `current`, `not-started`, `error-current`, or `error-incomplete`.
65
+ * @default 'not-started'
66
+ */
67
+ this.status = DEFAULT.STATUS;
68
+ /**
69
+ * The label for the stepper item, which is displayed as the main text of the step.
70
+ * This label is typically used to describe the step or action that the step represents.
71
+ * @default ''
72
+ */
73
+ this.label = '';
74
+ this.addEventListener('keydown', this.handleKeyDown.bind(this));
75
+ this.addEventListener('keyup', this.handleKeyUp.bind(this));
76
+ }
77
+ /**
78
+ * Handles the keydown event on the stepperitem.
79
+ * If the key is 'Enter' or 'Space', the stepperitem is pressed.
80
+ * If the key is 'Enter', the stepperitem is pressed. The native HTML button works in the same way.
81
+ * If the key is 'Space', the stepperitem's default is prevent to avoid scrolling etc in the host application.
82
+ *
83
+ * @param event - The keyboard event.
84
+ */
85
+ handleKeyDown(event) {
86
+ if ([KEYS.ENTER, KEYS.SPACE].includes(event.key)) {
87
+ this.classList.add('pressed');
88
+ if (event.key === KEYS.ENTER) {
89
+ this.triggerClickEvent();
90
+ }
91
+ // Prevent default event behavior to avoid scrolling or double-triggering
92
+ event.preventDefault();
93
+ }
94
+ }
95
+ /**
96
+ * Triggers a click event on the stepper item.
97
+ */
98
+ triggerClickEvent() {
99
+ const clickEvent = new MouseEvent('click', {
100
+ bubbles: true,
101
+ cancelable: true,
102
+ view: window,
103
+ });
104
+ this.dispatchEvent(clickEvent);
105
+ }
106
+ /**
107
+ * Handles the keyup event on the stepperitem.
108
+ * If the key is 'Enter' or 'Space', the stepperitem is clicked.
109
+ * If the key is 'Space', the stepperitem is pressed. The native HTML button works in the same way.
110
+ *
111
+ * @param event - The keyboard event.
112
+ */
113
+ handleKeyUp(event) {
114
+ if ([KEYS.ENTER, KEYS.SPACE].includes(event.key)) {
115
+ this.classList.remove('pressed');
116
+ if (event.key === KEYS.SPACE) {
117
+ this.triggerClickEvent();
118
+ }
119
+ }
120
+ }
121
+ /**
122
+ * Renders the status icon based on the current status of the stepper item.
123
+ * - If the status is `completed`, it renders a check icon.
124
+ * - If the status is `current` or `error-current`, it renders a pencil icon.
125
+ * - If the status is `not-started` or `error-incomplete`, it renders the step number.
126
+ * - If the status is anything else, it renders nothing.
127
+ * @returns A template literal that renders the status icon based on the current status of the stepper item.
128
+ */
129
+ renderStatusIcon() {
130
+ if (this.status === STATUS.COMPLETED) {
131
+ return html `<mdc-icon part="status-icon" name=${STATUS_ICON.COMPLETED} length-unit="rem" size="1"></mdc-icon>`;
132
+ }
133
+ if (this.status === STATUS.ERROR_CURRENT || this.status === STATUS.CURRENT) {
134
+ return html `<mdc-icon part="status-icon" name=${STATUS_ICON.PENCIL} length-unit="rem" size="1"></mdc-icon>`;
135
+ }
136
+ if (this.stepNumber && (this.status === STATUS.NOT_STARTED || this.status === STATUS.ERROR_INCOMPLETE)) {
137
+ return html `<mdc-text part="step-number" tagname=${VALID_TEXT_TAGS.SPAN} type=${TYPE.BODY_MIDSIZE_REGULAR}
138
+ >${this.stepNumber}</mdc-text
139
+ >`;
140
+ }
141
+ return nothing;
142
+ }
143
+ /**
144
+ * Renders the help text for the stepper item.
145
+ * If the `helpText` property is not set, it returns nothing.
146
+ * @returns A template literal that renders the help text for the stepper item.
147
+ */
148
+ renderHelpText() {
149
+ if (!this.helpText) {
150
+ return nothing;
151
+ }
152
+ const helpTextContent = html `<mdc-text
153
+ part="help-text"
154
+ tagname=${VALID_TEXT_TAGS.SPAN}
155
+ type=${TYPE.BODY_MIDSIZE_REGULAR}
156
+ >${this.helpText}</mdc-text
157
+ >`;
158
+ if (this.status === STATUS.ERROR_INCOMPLETE || this.status === STATUS.ERROR_CURRENT) {
159
+ return html `<div part="help-text-container">
160
+ <mdc-icon part="help-icon" name=${STATUS_ICON.ERROR} length-unit="rem" size="1"></mdc-icon>
161
+ ${helpTextContent}
162
+ </div>`;
163
+ }
164
+ return helpTextContent;
165
+ }
166
+ render() {
167
+ return html ` <div part="status-container">${this.renderStatusIcon()}</div>
168
+ <div part="label-container">
169
+ ${this.label
170
+ ? html `<mdc-text part="label" tagname=${VALID_TEXT_TAGS.SPAN} type=${TYPE.BODY_MIDSIZE_REGULAR}
171
+ >${this.label}</mdc-text
172
+ >`
173
+ : nothing}
174
+ ${this.renderHelpText()}
175
+ </div>`;
176
+ }
177
+ }
178
+ StepperItem.styles = [...Component.styles, ...styles];
179
+ __decorate([
180
+ property({ type: String, reflect: true }),
181
+ __metadata("design:type", String)
182
+ ], StepperItem.prototype, "variant", void 0);
183
+ __decorate([
184
+ property({ type: String, reflect: true }),
185
+ __metadata("design:type", String)
186
+ ], StepperItem.prototype, "status", void 0);
187
+ __decorate([
188
+ property({ type: String, reflect: true }),
189
+ __metadata("design:type", String)
190
+ ], StepperItem.prototype, "label", void 0);
191
+ __decorate([
192
+ property({ type: String, reflect: true, attribute: 'help-text' }),
193
+ __metadata("design:type", String)
194
+ ], StepperItem.prototype, "helpText", void 0);
195
+ __decorate([
196
+ property({ type: Number, reflect: true, attribute: 'step-number' }),
197
+ __metadata("design:type", Number)
198
+ ], StepperItem.prototype, "stepNumber", void 0);
199
+ export default StepperItem;
@@ -0,0 +1,22 @@
1
+ declare const TAG_NAME: "mdc-stepperitem";
2
+ declare const VARIANT: {
3
+ readonly INLINE: "inline";
4
+ readonly STACKED: "stacked";
5
+ };
6
+ declare const STATUS: {
7
+ readonly COMPLETED: "completed";
8
+ readonly CURRENT: "current";
9
+ readonly ERROR_CURRENT: "error-current";
10
+ readonly ERROR_INCOMPLETE: "error-incomplete";
11
+ readonly NOT_STARTED: "not-started";
12
+ };
13
+ declare const STATUS_ICON: {
14
+ readonly COMPLETED: "check-bold";
15
+ readonly ERROR: "error-legacy-badge-filled";
16
+ readonly PENCIL: "edit-bold";
17
+ };
18
+ declare const DEFAULT: {
19
+ VARIANT: "inline";
20
+ STATUS: "not-started";
21
+ };
22
+ export { TAG_NAME, VARIANT, STATUS, DEFAULT, STATUS_ICON };
@@ -0,0 +1,23 @@
1
+ import utils from '../../utils/tag-name';
2
+ const TAG_NAME = utils.constructTagName('stepperitem');
3
+ const VARIANT = {
4
+ INLINE: 'inline',
5
+ STACKED: 'stacked',
6
+ };
7
+ const STATUS = {
8
+ COMPLETED: 'completed',
9
+ CURRENT: 'current',
10
+ ERROR_CURRENT: 'error-current',
11
+ ERROR_INCOMPLETE: 'error-incomplete',
12
+ NOT_STARTED: 'not-started',
13
+ };
14
+ const STATUS_ICON = {
15
+ COMPLETED: 'check-bold',
16
+ ERROR: 'error-legacy-badge-filled',
17
+ PENCIL: 'edit-bold',
18
+ };
19
+ const DEFAULT = {
20
+ VARIANT: VARIANT.INLINE,
21
+ STATUS: STATUS.NOT_STARTED,
22
+ };
23
+ export { TAG_NAME, VARIANT, STATUS, DEFAULT, STATUS_ICON };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,157 @@
1
+ import { css } from 'lit';
2
+ import { hostFitContentStyles, hostFocusRingStyles } from '../../utils/styles';
3
+ const styles = css `
4
+ :host {
5
+ gap: 0.5rem;
6
+ border-radius: 0.25rem;
7
+ cursor: pointer;
8
+
9
+ --mdc-stepperitem-status-container-background: transparent;
10
+ --mdc-stepperitem-status-container-border-color: transparent;
11
+ --mdc-stepperitem-label-color: var(--mds-color-theme-text-primary-normal);
12
+ --mdc-stepperitem-help-text-color: var(--mds-color-theme-text-secondary-normal);
13
+ --mdc-stepperitem-label-container-background: transparent;
14
+ }
15
+
16
+ :host([variant='stacked']) {
17
+ flex-direction: column;
18
+ text-align: center;
19
+ }
20
+
21
+ :host::part(label) {
22
+ color: var(--mdc-stepperitem-label-color);
23
+ }
24
+ :host::part(help-text) {
25
+ color: var(--mdc-stepperitem-help-text-color);
26
+ }
27
+
28
+ :host::part(status-container) {
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: center;
32
+ width: 1.75rem;
33
+ aspect-ratio: 1;
34
+ border-radius: 50%;
35
+ background-color: var(--mdc-stepperitem-status-container-background);
36
+ border: 1px solid var(--mdc-stepperitem-status-container-border-color);
37
+ }
38
+
39
+ :host::part(step-number) {
40
+ color: var(--mdc-stepperitem-label-color);
41
+ }
42
+
43
+ :host::part(label-container) {
44
+ background-color: var(--mdc-stepperitem-label-container-background);
45
+ border-radius: 0.5rem;
46
+ padding: 0.25rem 0.5rem;
47
+ }
48
+
49
+ :host([variant='stacked'])::part(label-container) {
50
+ max-width: 8.75rem;
51
+ }
52
+ :host([variant='stacked'])::part(label),
53
+ :host([variant='stacked'])::part(help-text) {
54
+ overflow: hidden;
55
+ text-overflow: ellipsis;
56
+ white-space: nowrap;
57
+ }
58
+
59
+ :host([status='error-current']),
60
+ :host([status='error-incomplete']) {
61
+ --mdc-stepperitem-help-text-color: var(--mds-color-theme-text-error-normal);
62
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-background-alert-error-normal);
63
+ }
64
+
65
+ :host([status='error-current'])::part(help-text-container),
66
+ :host([status='error-incomplete'])::part(help-text-container) {
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 0.25rem;
70
+ }
71
+
72
+ :host([status='completed'])::part(status-container) {
73
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-control-active-normal);
74
+ }
75
+ :host([status='completed'])::part(status-icon) {
76
+ --mdc-icon-fill-color: var(--mds-color-theme-inverted-text-primary-normal);
77
+ }
78
+ :host([status='current'])::part(status-container) {
79
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-control-active-normal);
80
+ }
81
+ :host([status='error-current'])::part(status-container) {
82
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-outline-cancel-normal);
83
+ --mdc-stepperitem-status-container-background: none;
84
+ }
85
+ :host([status='error-incomplete'])::part(status-container),
86
+ :host([status='not-started'])::part(status-container) {
87
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-outline-secondary-normal);
88
+ --mdc-stepperitem-status-container-background: none;
89
+ }
90
+
91
+ :host([status='error-current'])::part(help-icon),
92
+ :host([status='error-incomplete'])::part(help-icon) {
93
+ --mdc-icon-fill-color: var(--mds-color-theme-text-error-normal);
94
+ }
95
+
96
+ :host(:hover) {
97
+ --mdc-stepperitem-label-container-background: var(--mds-color-theme-background-primary-hover);
98
+ }
99
+ :host(:active) {
100
+ --mdc-stepperitem-label-container-background: var(--mds-color-theme-background-primary-active);
101
+ }
102
+
103
+ :host([status='completed']:hover)::part(status-container) {
104
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-control-active-hover);
105
+ }
106
+ :host([status='completed']:active)::part(status-container) {
107
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-control-active-active);
108
+ }
109
+
110
+ :host([status='current']:hover)::part(status-container) {
111
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-outline-secondary-normal);
112
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-control-active-hover);
113
+ }
114
+ :host([status='current']:active)::part(status-container) {
115
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-background-secondary-active);
116
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-control-active-hover);
117
+ }
118
+
119
+ :host([status='not-started']:hover)::part(status-container),
120
+ :host([status='error-incomplete']:hover)::part(status-container) {
121
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-background-secondary-hover);
122
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-outline-secondary-normal);
123
+ }
124
+ :host([status='not-started']:active)::part(status-container),
125
+ :host([status='error-incomplete']:active)::part(status-container) {
126
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-background-secondary-active);
127
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-outline-secondary-normal);
128
+ }
129
+
130
+ :host([status='error-current']:hover)::part(status-container) {
131
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-background-secondary-hover);
132
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-outline-cancel-normal);
133
+ }
134
+ :host([status='error-current']:active)::part(status-container) {
135
+ --mdc-stepperitem-status-container-background: var(--mds-color-theme-background-secondary-active);
136
+ --mdc-stepperitem-status-container-border-color: var(--mds-color-theme-outline-cancel-normal);
137
+ }
138
+
139
+ :host([status='error-current']:hover)::part(help-icon),
140
+ :host([status='error-incomplete']:hover)::part(help-icon) {
141
+ --mdc-icon-fill-color: var(--mds-color-theme-text-error-hover);
142
+ }
143
+ :host([status='error-current']:hover),
144
+ :host([status='error-incomplete']:hover) {
145
+ --mdc-stepperitem-help-text-color: var(--mds-color-theme-text-error-hover);
146
+ }
147
+ :host([status='error-current']:hover)::part(help-icon),
148
+ :host([status='error-incomplete']:hover)::part(help-icon) {
149
+ --mdc-icon-fill-color: var(--mds-color-theme-text-error-active);
150
+ }
151
+
152
+ :host([status='error-current']:active),
153
+ :host([status='error-incomplete']:active) {
154
+ --mdc-stepperitem-help-text-color: var(--mds-color-theme-text-error-active);
155
+ }
156
+ `;
157
+ export default [hostFitContentStyles, styles, ...hostFocusRingStyles()];
@@ -0,0 +1,11 @@
1
+ import type { ValueOf } from '../../utils/types';
2
+ import { VARIANT, STATUS } from './stepperitem.constants';
3
+ type VariantType = ValueOf<typeof VARIANT>;
4
+ type StatusType = ValueOf<typeof STATUS>;
5
+ type StatusIconType = ValueOf<typeof STATUS>;
6
+ interface Events {
7
+ onClickEvent: MouseEvent;
8
+ onKeyDownEvent: KeyboardEvent;
9
+ onKeyUpEvent: KeyboardEvent;
10
+ }
11
+ export type { VariantType, StatusType, StatusIconType, Events };
@@ -0,0 +1 @@
1
+ export {};
@@ -10,6 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import { html } from 'lit';
11
11
  import { property } from 'lit/decorators.js';
12
12
  import { ifDefined } from 'lit/directives/if-defined.js';
13
+ import { KEYS } from '../../utils/keys';
13
14
  import { DataAriaLabelMixin } from '../../utils/mixins/DataAriaLabelMixin';
14
15
  import { FormInternalsMixin } from '../../utils/mixins/FormInternalsMixin';
15
16
  import { ROLE } from '../../utils/roles';
@@ -144,7 +145,7 @@ class Toggle extends FormInternalsMixin(DataAriaLabelMixin(FormfieldWrapper)) {
144
145
  */
145
146
  handleKeyDown(event) {
146
147
  var _a;
147
- if (event.key === 'Enter') {
148
+ if (event.key === KEYS.ENTER) {
148
149
  (_a = this.form) === null || _a === void 0 ? void 0 : _a.requestSubmit();
149
150
  }
150
151
  }