@eturnity/eturnity_reusable_components 7.24.3-EPDM-11320.0 → 7.24.3-EPDM-11143.1

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 (67) hide show
  1. package/.prettierrc +7 -0
  2. package/package.json +20 -6
  3. package/public/favicon.ico +0 -0
  4. package/public/index.html +17 -0
  5. package/src/App.vue +70 -75
  6. package/src/assets/svgIcons/copy.svg +10 -0
  7. package/src/components/addNewButton/index.vue +27 -24
  8. package/src/components/banner/actionBanner/index.vue +30 -32
  9. package/src/components/banner/banner/index.vue +80 -88
  10. package/src/components/banner/infoBanner/index.vue +44 -36
  11. package/src/components/buttons/buttonIcon/index.vue +78 -83
  12. package/src/components/buttons/closeButton/index.vue +26 -26
  13. package/src/components/buttons/mainButton/index.vue +76 -80
  14. package/src/components/card/index.vue +52 -56
  15. package/src/components/collapsableInfoText/index.vue +76 -81
  16. package/src/components/deleteIcon/index.vue +28 -31
  17. package/src/components/draggableInputHandle/index.vue +17 -20
  18. package/src/components/dropdown/Dropdown.stories.js +8 -8
  19. package/src/components/dropdown/index.vue +72 -75
  20. package/src/components/errorMessage/index.vue +23 -23
  21. package/src/components/filter/filterSettings.vue +329 -349
  22. package/src/components/filter/index.vue +130 -130
  23. package/src/components/filter/parentDropdown.vue +40 -43
  24. package/src/components/icon/Icons.stories.js +4 -4
  25. package/src/components/icon/iconCache.js +1 -1
  26. package/src/components/icon/iconCollection.vue +37 -40
  27. package/src/components/icon/index.vue +65 -72
  28. package/src/components/iconWrapper/index.vue +118 -122
  29. package/src/components/infoCard/index.vue +17 -20
  30. package/src/components/infoText/index.vue +82 -88
  31. package/src/components/inputs/checkbox/index.vue +94 -91
  32. package/src/components/inputs/inputNumber/index.vue +488 -508
  33. package/src/components/inputs/inputNumberQuestion/index.vue +124 -127
  34. package/src/components/inputs/inputText/index.vue +252 -265
  35. package/src/components/inputs/radioButton/index.vue +120 -135
  36. package/src/components/inputs/searchInput/index.vue +81 -84
  37. package/src/components/inputs/select/index.vue +631 -644
  38. package/src/components/inputs/select/option/index.vue +91 -91
  39. package/src/components/inputs/select/select.stories.js +7 -7
  40. package/src/components/inputs/slider/index.vue +46 -46
  41. package/src/components/inputs/switchField/index.vue +152 -159
  42. package/src/components/inputs/textAreaInput/index.vue +113 -120
  43. package/src/components/inputs/toggle/index.vue +127 -137
  44. package/src/components/label/index.vue +61 -64
  45. package/src/components/markerItem/index.vue +40 -40
  46. package/src/components/modals/actionModal/index.vue +29 -32
  47. package/src/components/modals/infoModal/index.vue +27 -34
  48. package/src/components/modals/modal/index.vue +80 -88
  49. package/src/components/navigationTabs/index.vue +47 -50
  50. package/src/components/pageSubtitle/index.vue +29 -33
  51. package/src/components/pageTitle/index.vue +39 -47
  52. package/src/components/pagination/index.vue +62 -64
  53. package/src/components/progressBar/index.vue +67 -70
  54. package/src/components/projectMarker/index.vue +163 -172
  55. package/src/components/rangeSlider/Slider.vue +449 -449
  56. package/src/components/rangeSlider/index.vue +270 -282
  57. package/src/components/rangeSlider/utils/dom.js +3 -3
  58. package/src/components/selectedOptions/index.vue +51 -51
  59. package/src/components/sideMenu/index.vue +109 -117
  60. package/src/components/spinner/index.vue +34 -37
  61. package/src/components/tableDropdown/index.vue +326 -343
  62. package/src/components/tables/mainTable/index.vue +106 -109
  63. package/src/components/tables/viewTable/index.vue +92 -105
  64. package/src/components/threeDots/index.vue +171 -174
  65. package/src/components/videoThumbnail/index.vue +59 -67
  66. package/src/components/videoThumbnail/videoThumbnail.stories.js +6 -6
  67. package/.eslintrc.js +0 -125
@@ -1,30 +1,27 @@
1
1
  <template>
2
- <Modal
3
- :is-open="isOpen"
4
- @on-close="closeModal"
5
- >
6
- <ModalContainer>
7
- <ModalTitle v-if="$slots.title">
2
+ <Modal :is-open="isOpen" @on-close="closeModal">
3
+ <modalContainer>
4
+ <modalTitle v-if="$slots.title">
8
5
  <slot name="title"></slot>
9
- </ModalTitle>
10
- <TextContainer v-if="$slots.body">
6
+ </modalTitle>
7
+ <textContainer v-if="$slots.body">
11
8
  <slot name="body"></slot>
12
- </TextContainer>
13
- <ButtonContainer v-if="$slots.buttons">
9
+ </textContainer>
10
+ <buttonContainer v-if="$slots.buttons">
14
11
  <slot name="buttons"></slot>
15
- </ButtonContainer>
16
- </ModalContainer>
12
+ </buttonContainer>
13
+ </modalContainer>
17
14
  </Modal>
18
15
  </template>
19
16
  <script>
20
- import styled from 'vue3-styled-components'
21
- import Modal from '../modal'
22
- const ModalContainer = styled.div`
17
+ import styled from 'vue3-styled-components'
18
+ import Modal from '../modal'
19
+ const modalContainer = styled.div`
23
20
  width: 450px;
24
21
  min-height: 205px;
25
22
  padding: 40px 40px 30px 40px;
26
23
  `
27
- const ModalTitle = styled.div`
24
+ const modalTitle = styled.div`
28
25
  color: ${(props) => props.theme.colors.black};
29
26
  font-family: ${(props) => props.theme.fonts.mainFont};
30
27
  font-size: 18px;
@@ -33,12 +30,12 @@
33
30
  line-height: 120%;
34
31
  text-transform: uppercase;
35
32
  `
36
- const ButtonContainer = styled.div`
33
+ const buttonContainer = styled.div`
37
34
  display: inline-flex;
38
35
  align-items: flex-start;
39
36
  gap: 20px;
40
37
  `
41
- const TextContainer = styled.div`
38
+ const textContainer = styled.div`
42
39
  color: ${(props) => props.theme.colors.black};
43
40
  font-family: ${(props) => props.theme.fonts.mainFont};
44
41
  font-size: 13px;
@@ -48,20 +45,20 @@
48
45
  padding: 30px 0px;
49
46
  white-space: pre-wrap;
50
47
  `
51
- export default {
52
- name: 'ActionModal',
53
- components: {
54
- Modal,
55
- ModalContainer,
56
- ModalTitle,
57
- ButtonContainer,
58
- TextContainer
59
- },
60
- props: ['isOpen'],
61
- methods: {
62
- closeModal() {
63
- this.$emit('on-close')
64
- }
48
+ export default {
49
+ name: 'actionModal',
50
+ props: ['isOpen'],
51
+ components: {
52
+ Modal,
53
+ modalContainer,
54
+ modalTitle,
55
+ buttonContainer,
56
+ textContainer
57
+ },
58
+ methods: {
59
+ closeModal() {
60
+ this.$emit('on-close')
65
61
  }
66
62
  }
63
+ }
67
64
  </script>
@@ -1,56 +1,49 @@
1
1
  <template>
2
- <ActionModal
3
- :is-open="isOpen"
4
- @on-close="closeModal"
5
- >
6
- <ModalContainer>
2
+ <ActionModal :is-open="isOpen" @on-close="closeModal">
3
+ <modalContainer>
7
4
  <template #title>
8
- <slot name="title"></slot>
5
+ <slot name="title" />
9
6
  </template>
10
7
  <template #body>
11
- <slot name="body"></slot>
8
+ <slot name="body" />
12
9
  </template>
13
10
  <template #buttons>
14
- <ButtonContainer>
15
- <RCMainButton
16
- min-width="150px"
17
- :text="$gettext('Got it')"
18
- type="primary"
19
- @click="closeModal"
20
- />
21
- </ButtonContainer>
11
+ <buttonContainer>
12
+ <Button type="primary" :text="$gettext('Got it')" minWidth="150px" @click="closeModal" />
13
+ </buttonContainer>
22
14
  </template>
23
- </ModalContainer>
15
+
16
+ </modalContainer>
24
17
  </ActionModal>
25
18
  </template>
26
19
  <script>
27
20
 
28
- import styled from 'vue3-styled-components'
29
- import ActionModal from '../actionModal'
30
- import RCMainButton from '../../buttons/mainButton'
31
- const ModalContainer = styled.div`
21
+ import styled from 'vue3-styled-components'
22
+ import ActionModal from '../actionModal'
23
+ import Button from '../../buttons/mainButton'
24
+ const modalContainer = styled.div`
32
25
  width: 450px;
33
26
  min-height: 205px;
34
27
  padding: 40px 40px 30px 40px;
35
28
  `
36
- const ButtonContainer = styled.div`
29
+ const buttonContainer = styled.div`
37
30
  display: inline-flex;
38
31
  align-items: flex-start;
39
32
  gap: 20px;
40
33
  `
41
- export default {
42
- name: 'InfoModal',
43
- components: {
44
- ModalContainer,
45
- ButtonContainer,
46
- ActionModal,
47
- RCMainButton
48
- },
49
- props: ['isOpen'],
50
- methods: {
51
- closeModal() {
52
- this.$emit('on-close')
53
- }
34
+ export default {
35
+ name: 'InfoModal',
36
+ props: ['isOpen'],
37
+ components: {
38
+ modalContainer,
39
+ buttonContainer,
40
+ ActionModal,
41
+ Button
42
+ },
43
+ methods: {
44
+ closeModal() {
45
+ this.$emit('on-close')
54
46
  }
55
47
  }
48
+ }
56
49
  </script>
@@ -1,26 +1,18 @@
1
1
  <template>
2
- <PageWrapper
3
- :backdrop="backdrop"
4
- :class="{ visible: isOpen, hidden: !isOpen }"
5
- :is-open="isOpen"
2
+ <page-wrapper
6
3
  :position="position"
4
+ :isOpen="isOpen"
5
+ :class="{ visible: isOpen, hidden: !isOpen }"
6
+ :backdrop="backdrop"
7
7
  >
8
- <ModalContainer @click="onClickModalContainer">
9
- <Spinner
10
- v-if="isLoading"
11
- :limited-to-modal="true"
12
- size="50px"
13
- />
14
- <ContentContainer :visible="!isLoading">
15
- <slot></slot>
16
- </ContentContainer>
17
- <CloseButton
18
- v-if="!hideClose"
19
- class="close"
20
- @click="onCloseModal()"
21
- />
22
- </ModalContainer>
23
- </PageWrapper>
8
+ <modal-container @click="onClickModalContainer">
9
+ <spinner v-if="isLoading" size="50px" :limitedToModal="true" />
10
+ <content-container :visible="!isLoading">
11
+ <slot />
12
+ </content-container>
13
+ <close-button v-if="!hideClose" @click="onCloseModal()" class="close" />
14
+ </modal-container>
15
+ </page-wrapper>
24
16
  </template>
25
17
 
26
18
  <script>
@@ -34,17 +26,17 @@
34
26
  // <div>Data....</div>
35
27
  // </modal>
36
28
 
37
- import styled from 'vue3-styled-components'
38
- import CloseButton from '../../buttons/closeButton'
39
- import Spinner from '../../spinner'
29
+ import styled from 'vue3-styled-components'
30
+ import CloseButton from '../../buttons/closeButton'
31
+ import Spinner from '../../spinner'
40
32
 
41
- const contentAttrs = { visible: Boolean }
42
- const ContentContainer = styled('div', contentAttrs)`
33
+ const contentAttrs = { visible: Boolean }
34
+ const ContentContainer = styled('div', contentAttrs)`
43
35
  visibility: ${(props) => (props.visible ? 'inherit' : 'hidden')};
44
36
  `
45
37
 
46
- const pageAttrs = { isOpen: Boolean, backdrop: String, position: String }
47
- const PageWrapper = styled('div', pageAttrs)`
38
+ const pageAttrs = { isOpen: Boolean, backdrop: String, position: String }
39
+ const PageWrapper = styled('div', pageAttrs)`
48
40
  position: ${(props) => props.position}
49
41
  display: grid;
50
42
  top: 0;
@@ -54,7 +46,7 @@
54
46
  background-color: ${(props) =>
55
47
  props.backdrop == 'dark'
56
48
  ? 'rgba(0, 0, 0, 0.4)'
57
- : 'rgba(255, 255, 255, 0.9)'};
49
+ : 'rgba(255, 255, 255, 0.9)'};
58
50
  z-index: 99999;
59
51
  overflow: auto;
60
52
 
@@ -75,7 +67,7 @@
75
67
  }
76
68
  `
77
69
 
78
- const ModalContainer = styled.div`
70
+ const ModalContainer = styled.div`
79
71
  align-self: center;
80
72
  justify-self: center;
81
73
  position: relative;
@@ -126,71 +118,71 @@
126
118
  }
127
119
  `
128
120
 
129
- export default {
130
- name: 'Modal',
131
- components: {
132
- PageWrapper,
133
- ModalContainer,
134
- CloseButton,
135
- Spinner,
136
- ContentContainer
121
+ export default {
122
+ name: 'Modal',
123
+ components: {
124
+ PageWrapper,
125
+ ModalContainer,
126
+ CloseButton,
127
+ Spinner,
128
+ ContentContainer
129
+ },
130
+ props: {
131
+ isOpen: {
132
+ required: true,
133
+ default: false
137
134
  },
138
- props: {
139
- isOpen: {
140
- required: true,
141
- default: false
142
- },
143
- isLoading: {
144
- required: false,
145
- default: false
146
- },
147
- hideClose: {
148
- required: false,
149
- default: false
150
- },
151
- backdrop: {
152
- required: false,
153
- default: 'white'
154
- },
155
- position: {
156
- required: false,
157
- default: 'fixed'
158
- },
159
- stopPropagation: {
160
- type: Boolean,
161
- default: true
162
- }
135
+ isLoading: {
136
+ required: false,
137
+ default: false
163
138
  },
164
- watch: {
165
- isOpen: {
166
- immediate: true,
167
- handler(isOpen) {
168
- document.body.style.overflow = isOpen ? 'hidden' : ''
169
- if (isOpen) {
170
- window.addEventListener('keydown', this.handleKeyDown)
171
- } else {
172
- window.removeEventListener('keydown', this.handleKeyDown)
173
- }
174
- }
175
- }
139
+ hideClose: {
140
+ required: false,
141
+ default: false
176
142
  },
177
- beforeDestroy() {
178
- window.removeEventListener('keydown', this.handleKeyDown)
143
+ backdrop: {
144
+ required: false,
145
+ default: 'white'
179
146
  },
180
- methods: {
181
- onCloseModal() {
182
- this.$emit('on-close')
183
- },
184
- handleKeyDown({ key }) {
185
- if (key === 'Escape') {
186
- this.onCloseModal()
187
- }
188
- },
189
- onClickModalContainer(event) {
190
- if (this.stopPropagation) {
191
- event.stopPropagation()
147
+ position: {
148
+ required: false,
149
+ default: 'fixed'
150
+ },
151
+ stopPropagation: {
152
+ type: Boolean,
153
+ default: true
154
+ }
155
+ },
156
+ beforeDestroy() {
157
+ window.removeEventListener('keydown', this.handleKeyDown)
158
+ },
159
+ methods: {
160
+ onCloseModal() {
161
+ this.$emit('on-close')
162
+ },
163
+ handleKeyDown({ key }) {
164
+ if (key === 'Escape') {
165
+ this.onCloseModal()
166
+ }
167
+ },
168
+ onClickModalContainer(event) {
169
+ if (this.stopPropagation) {
170
+ event.stopPropagation()
171
+ }
172
+ }
173
+ },
174
+ watch: {
175
+ isOpen: {
176
+ immediate: true,
177
+ handler(isOpen) {
178
+ document.body.style.overflow = isOpen ? 'hidden' : ''
179
+ if (isOpen) {
180
+ window.addEventListener('keydown', this.handleKeyDown)
181
+ } else {
182
+ window.removeEventListener('keydown', this.handleKeyDown)
192
183
  }
193
184
  }
194
185
  }
195
186
  }
187
+ }
196
188
  </script>
@@ -1,39 +1,36 @@
1
1
  <template>
2
- <RoofTabWrap>
3
- <Tab
2
+ <roofTabWrap>
3
+ <tab
4
4
  v-for="(tab, index) in tabsData"
5
5
  :key="tab.id"
6
+ :isDisabled="!!tab['isDisabled']"
7
+ :textColor="tab['textColor']"
6
8
  :active="isIndexKey ? index === activeTab : tab[tabKey] === activeTab"
7
- :is-disabled="!!tab['isDisabled']"
8
- :text-color="tab['textColor']"
9
9
  @click="$emit('tab-click', isIndexKey ? index : tab[tabKey])"
10
10
  >
11
- <Option
12
- :is-disabled="!!tab['isDisabled']"
13
- :text-color="tab['textColor']"
14
- >
15
- <Uppercase>{{ tab[tabLabel] }}</Uppercase>
16
- <InfoText
17
- v-if="tab['labelInfoText']"
18
- :align-arrow="tab['labelInfoAlign']"
19
- :text="tab['labelInfoText']"
20
- />
21
- </Option>
22
- </Tab>
23
- <BottomLine />
24
- </RoofTabWrap>
11
+ <Option :isDisabled="!!tab['isDisabled']" :textColor="tab['textColor']">
12
+ <Uppercase>{{ tab[tabLabel] }}</Uppercase>
13
+ <info-text
14
+ v-if="tab['labelInfoText']"
15
+ :text="tab['labelInfoText']"
16
+ :alignArrow="tab['labelInfoAlign']"
17
+ />
18
+ </Option>
19
+ </tab>
20
+ <bottomLine />
21
+ </roofTabWrap>
25
22
  </template>
26
23
 
27
24
  <script>
28
- import styled from 'vue3-styled-components'
29
- import InfoText from '../infoText'
30
- const TabAttr = {
31
- active: Boolean,
32
- isDisabled: Boolean,
33
- textColor: String
34
- }
25
+ import styled from 'vue3-styled-components'
26
+ import InfoText from '../infoText'
27
+ const TabAttr = {
28
+ active: Boolean,
29
+ isDisabled: Boolean,
30
+ textColor: String
31
+ }
35
32
 
36
- const BottomLine = styled('div')`
33
+ const bottomLine = styled('div')`
37
34
  position: absolute;
38
35
  bottom: 0;
39
36
  left: 0;
@@ -41,17 +38,17 @@
41
38
  width: 100%;
42
39
  background-color: ${(props) => props.theme.colors.grey3};
43
40
  `
44
- const RoofTabWrap = styled('div')`
41
+ const roofTabWrap = styled('div')`
45
42
  display: flex;
46
43
  align-items: center;
47
44
  position: relative;
48
45
  font-size: 13px;
49
46
  font-weight: 700;
50
47
  `
51
- const Uppercase = styled('span')`
48
+ const Uppercase = styled('span')`
52
49
  text-transform: uppercase;
53
50
  `
54
- const Option = styled('div', TabAttr)`
51
+ const Option = styled('div', TabAttr)`
55
52
  font-size: 13px;
56
53
  font-weight: 700;
57
54
  display: flex;
@@ -65,9 +62,9 @@
65
62
  : props.textColor
66
63
  : props.isDisabled
67
64
  ? props.theme.colors.grey2
68
- : props.theme.colors.black};
65
+ : props.theme.colors.black};
69
66
  `
70
- const Tab = styled('div', TabAttr)`
67
+ const Tab = styled('div', TabAttr)`
71
68
  padding: 16px 10px;
72
69
  margin-right: 5px;
73
70
  position: relative;
@@ -76,7 +73,7 @@
76
73
  border-bottom: 2px solid
77
74
  ${(props) => (props.active ? props.theme.colors.primary : 'transparent')};
78
75
  background-color: ${(props) =>
79
- props.isDisabled ? props.theme.colors.grey5 : 'transparent'};
76
+ props.isDisabled ? props.theme.colors.grey5 : 'transparent'};
80
77
  transition: 0.2s ease;
81
78
  cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'pointer')};
82
79
  min-width: 140px;
@@ -86,30 +83,30 @@
86
83
  min-height: 55px;
87
84
  &:hover {
88
85
  border-color: ${(props) =>
89
- props.isDisabled ? props.theme.colors.grey2 : props.theme.colors.primary};
86
+ props.isDisabled ? props.theme.colors.grey2 : props.theme.colors.primary};
90
87
  }
91
88
  `
92
89
 
93
- export default {
94
- name: 'Tabs',
90
+ export default {
91
+ name: 'Tabs',
95
92
 
96
- components: {
97
- Tab,
98
- BottomLine,
99
- RoofTabWrap,
100
- Option,
101
- InfoText,
102
- Uppercase
103
- },
93
+ components: {
94
+ Tab,
95
+ bottomLine,
96
+ roofTabWrap,
97
+ Option,
98
+ InfoText,
99
+ Uppercase
100
+ },
104
101
 
105
- props: {
106
- tabsData: { required: true },
107
- activeTab: { required: true },
108
- isIndexKey: { type: Boolean, default: false },
109
- tabKey: { type: String, default: '' },
110
- tabLabel: { type: String, default: '' }
111
- }
102
+ props: {
103
+ tabsData: { required: true },
104
+ activeTab: { required: true },
105
+ isIndexKey: { type: Boolean, default: false },
106
+ tabKey: { type: String, default: '' },
107
+ tabLabel: { type: String, default: '' }
112
108
  }
109
+ }
113
110
  </script>
114
111
 
115
112
  <style lang="scss" scoped></style>
@@ -1,17 +1,13 @@
1
1
  <template>
2
- <SubtitleText
3
- :color="color"
4
- :has-info-text="!!infoText"
5
- :margin-bottom="marginBottom"
6
- >
2
+ <subtitle-text :color="color" :marginBottom="marginBottom" :hasInfoText="!!infoText">
7
3
  <span>
8
4
  {{ text }}
9
5
  </span>
10
- <InfoText
6
+ <info-text
11
7
  v-if="!!infoText"
12
8
  :text="infoText"
13
9
  />
14
- </SubtitleText>
10
+ </subtitle-text>
15
11
  </template>
16
12
 
17
13
  <script>
@@ -22,16 +18,16 @@
22
18
  // color="red"
23
19
  // infoText="My info text"
24
20
  // />
25
- import styled from "vue3-styled-components"
26
- import InfoText from "../infoText"
21
+ import styled from "vue3-styled-components"
22
+ import InfoText from "../infoText"
27
23
 
28
- const textAttrs = { color: String, hasInfoText: Boolean, marginBottom: String }
29
- const SubtitleText = styled("div", textAttrs)`
24
+ const textAttrs = { color: String, hasInfoText: Boolean, marginBottom: String }
25
+ const SubtitleText = styled("div", textAttrs)`
30
26
  display: grid;
31
27
  align-items: center;
32
28
  grid-gap: 12px;
33
29
  grid-template-columns: ${(props) =>
34
- props.hasInfoText ? "auto auto 1fr" : "1fr"};
30
+ props.hasInfoText ? "auto auto 1fr" : "1fr"};
35
31
  color: ${(props) => (props.color ? props.color : props.theme.colors.gray1)};
36
32
  font-size: 13px;
37
33
  margin-bottom: ${(props) => (props.marginBottom ? props.marginBottom : '30px')};
@@ -39,27 +35,27 @@
39
35
  position: relative;
40
36
  `
41
37
 
42
- export default {
43
- name: "PageSubtitle",
44
- components: {
45
- SubtitleText,
46
- InfoText,
38
+ export default {
39
+ name: "page-subtitle",
40
+ components: {
41
+ SubtitleText,
42
+ InfoText,
43
+ },
44
+ props: {
45
+ text: {
46
+ required: true,
47
47
  },
48
- props: {
49
- text: {
50
- required: true,
51
- },
52
- color: {
53
- required: false,
54
- },
55
- infoText: {
56
- required: false,
57
- default: null,
58
- },
59
- marginBottom: {
60
- required: false,
61
- default: "30px",
62
- }
48
+ color: {
49
+ required: false,
63
50
  },
64
- }
51
+ infoText: {
52
+ required: false,
53
+ default: null,
54
+ },
55
+ marginBottom: {
56
+ required: false,
57
+ default: "30px",
58
+ }
59
+ },
60
+ }
65
61
  </script>