@iamproperty/components 3.1.0 → 3.4.4

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 (179) hide show
  1. package/README.md +141 -16
  2. package/assets/css/core.min.css +1 -1
  3. package/assets/css/core.min.css.map +1 -1
  4. package/assets/css/style.min.css +1 -1
  5. package/assets/css/style.min.css.map +1 -1
  6. package/assets/favicons/manifest.json +31 -31
  7. package/assets/js/main.js +57 -57
  8. package/assets/js/modules/accordion.js +33 -32
  9. package/assets/js/modules/alert.js +41 -57
  10. package/assets/js/modules/carousel.js +76 -102
  11. package/assets/js/modules/chart.js +151 -218
  12. package/assets/js/modules/drawer.js +10 -16
  13. package/assets/js/modules/file-upload.js +33 -48
  14. package/assets/js/modules/form.js +122 -168
  15. package/assets/js/modules/helpers.js +90 -119
  16. package/assets/js/modules/modal.js +69 -90
  17. package/assets/js/modules/nav.js +18 -28
  18. package/assets/js/modules/orderablelist.js +91 -122
  19. package/assets/js/modules/table.js +451 -585
  20. package/assets/js/modules/testimonial.js +64 -83
  21. package/assets/js/modules/youtubevideo.js +114 -145
  22. package/assets/js/scripts.bundle.js +895 -955
  23. package/assets/js/scripts.bundle.js.map +1 -1
  24. package/assets/js/scripts.bundle.min.js +3 -3
  25. package/assets/js/scripts.bundle.min.js.map +1 -1
  26. package/assets/sass/_components.scss +14 -14
  27. package/assets/sass/_corefiles.scss +40 -40
  28. package/assets/sass/_fonts.scss +16 -16
  29. package/assets/sass/_forms.scss +10 -10
  30. package/assets/sass/_func.scss +12 -12
  31. package/assets/sass/_functions/functions.scss +141 -141
  32. package/assets/sass/_functions/mixins.scss +170 -170
  33. package/assets/sass/_functions/utilities.scss +143 -143
  34. package/assets/sass/_functions/variables.scss +467 -467
  35. package/assets/sass/_print.scss +61 -61
  36. package/assets/sass/_tests/{sass.spec.js → colours.spec.js} +9 -9
  37. package/assets/sass/_tests/colours.spec.scss +44 -44
  38. package/assets/sass/_tests/func.spec.js +9 -0
  39. package/assets/sass/_tests/func.spec.scss +232 -232
  40. package/assets/sass/_tests/mixins.spec.js +9 -0
  41. package/assets/sass/_tests/mixins.spec.scss +194 -194
  42. package/assets/sass/_tests/typography.spec.js +9 -0
  43. package/assets/sass/_tests/typography.spec.scss +35 -35
  44. package/assets/sass/components/accordion.scss +197 -197
  45. package/assets/sass/components/alert.scss +98 -98
  46. package/assets/sass/{elements → components}/buttons.scss +251 -251
  47. package/assets/sass/{elements → components}/card.scss +288 -288
  48. package/assets/sass/components/cardDeck.scss +107 -107
  49. package/assets/sass/components/carousel.scss +234 -234
  50. package/assets/sass/components/charts.scss +569 -569
  51. package/assets/sass/{elements → components}/container.scss +236 -236
  52. package/assets/sass/components/drawer.scss +46 -46
  53. package/assets/sass/{elements → components}/forms.scss +261 -261
  54. package/assets/sass/components/header.scss +63 -63
  55. package/assets/sass/{elements → components}/links.scss +97 -97
  56. package/assets/sass/{elements → components}/lists.scss +159 -159
  57. package/assets/sass/components/modal.scss +136 -136
  58. package/assets/sass/components/nav.scss +960 -960
  59. package/assets/sass/{elements → components}/panel.scss +161 -161
  60. package/assets/sass/components/property-searchbar.scss +143 -143
  61. package/assets/sass/components/snapshot.scss +70 -70
  62. package/assets/sass/components/stepper.scss +164 -164
  63. package/assets/sass/{elements → components}/tables.scss +290 -290
  64. package/assets/sass/components/tabs.scss +87 -87
  65. package/assets/sass/components/testimonial.scss +132 -132
  66. package/assets/sass/components/timeline.scss +95 -95
  67. package/assets/sass/{elements → components}/tooltips.scss +84 -84
  68. package/assets/sass/core.scss +6 -6
  69. package/assets/sass/email.scss +65 -65
  70. package/assets/sass/error.scss +4 -4
  71. package/assets/sass/foundations/brand.scss +76 -72
  72. package/assets/sass/foundations/circles.scss +74 -74
  73. package/assets/sass/foundations/icons.scss +80 -80
  74. package/assets/sass/foundations/media.scss +50 -50
  75. package/assets/sass/foundations/reboot.scss +130 -130
  76. package/assets/sass/foundations/root.scss +125 -125
  77. package/assets/sass/{elements → foundations}/type.scss +136 -136
  78. package/assets/sass/main.scss +7 -7
  79. package/assets/svg/icons.svg +598 -598
  80. package/assets/svg/logo.svg +49 -43
  81. package/assets/ts/main.ts +68 -68
  82. package/assets/ts/modules/accordion.ts +44 -43
  83. package/assets/ts/modules/alert.ts +58 -0
  84. package/assets/ts/modules/carousel.ts +103 -0
  85. package/assets/ts/modules/chart.ts +219 -0
  86. package/assets/ts/modules/drawer.ts +17 -0
  87. package/assets/ts/modules/file-upload.ts +49 -0
  88. package/assets/ts/modules/form.ts +169 -0
  89. package/assets/ts/modules/helpers.ts +120 -0
  90. package/assets/ts/modules/modal.ts +91 -0
  91. package/assets/ts/modules/nav.ts +29 -0
  92. package/assets/ts/modules/orderablelist.ts +123 -0
  93. package/assets/ts/modules/table.ts +586 -0
  94. package/assets/ts/modules/testimonial.ts +84 -0
  95. package/assets/ts/modules/youtubevideo.ts +146 -0
  96. package/dist/components.es.js +493 -509
  97. package/dist/components.umd.js +15 -15
  98. package/package.json +109 -108
  99. package/src/components/Accordion/Accordion.spec.js +63 -63
  100. package/src/components/Accordion/Accordion.vue +22 -22
  101. package/src/components/Accordion/AccordionItem.vue +52 -52
  102. package/src/components/Accordion/README.md +34 -34
  103. package/src/components/Alert/Alert.spec.js +49 -49
  104. package/src/components/Alert/Alert.vue +39 -39
  105. package/src/components/Alert/README.md +28 -28
  106. package/src/components/Banner/Banner.spec.js +28 -28
  107. package/src/components/Banner/Banner.vue +38 -38
  108. package/src/components/Banner/README.md +23 -23
  109. package/src/{elements → components}/Card/Card.vue +122 -122
  110. package/src/{elements/FileUploads → components/Card}/README.md +24 -24
  111. package/src/components/CardDeck/CardDeck.spec.js +99 -99
  112. package/src/components/CardDeck/CardDeck.vue +77 -77
  113. package/src/components/CardDeck/README.md +24 -24
  114. package/src/components/Carousel/Carousel.spec.js +45 -45
  115. package/src/components/Carousel/Carousel.vue +85 -85
  116. package/src/components/Carousel/README.md +19 -19
  117. package/src/components/Chart/Chart.spec.js +201 -201
  118. package/src/components/Chart/Chart.vue +88 -88
  119. package/src/components/Chart/README.md +17 -17
  120. package/src/components/Drawer/Drawer.vue +53 -53
  121. package/src/components/Drawer/README.md +22 -22
  122. package/src/{elements → components}/FileUploads/FileUploads.vue +48 -48
  123. package/src/{elements/Card → components/FileUploads}/README.md +24 -24
  124. package/src/components/Header/Header.spec.js +33 -33
  125. package/src/components/Header/Header.vue +38 -38
  126. package/src/components/Header/README.md +27 -27
  127. package/src/{elements → components}/Input/Input.vue +272 -272
  128. package/src/{elements → components}/Input/README.md +19 -19
  129. package/src/components/Modal/Modal.spec.js +22 -22
  130. package/src/components/Modal/Modal.vue +43 -43
  131. package/src/components/Modal/README.md +19 -19
  132. package/src/components/Nav/Nav.spec.js +35 -35
  133. package/src/components/Nav/Nav.vue +215 -215
  134. package/src/components/Nav/README.md +22 -22
  135. package/src/components/NoteFeed/NoteFeed.vue +79 -79
  136. package/src/components/NoteFeed/README.md +16 -16
  137. package/src/components/PropertySearchbar/PropertySearchbar.vue +204 -204
  138. package/src/components/PropertySearchbar/README.md +25 -25
  139. package/src/components/Snapshot/README.md +20 -20
  140. package/src/components/Snapshot/Snapshot.vue +32 -32
  141. package/src/components/Stepper/README.md +32 -32
  142. package/src/components/Stepper/Step.vue +28 -28
  143. package/src/components/Stepper/Stepper.spec.js +99 -99
  144. package/src/components/Stepper/Stepper.vue +33 -33
  145. package/src/{elements → components}/Table/README.md +62 -62
  146. package/src/{elements → components}/Table/Table.spec.js +90 -90
  147. package/src/{elements → components}/Table/Table.vue +129 -129
  148. package/src/components/Tabs/README.md +27 -27
  149. package/src/components/Tabs/Tab.vue +32 -32
  150. package/src/components/Tabs/Tabs.vue +77 -77
  151. package/src/components/Testimonial/README.md +25 -25
  152. package/src/components/Testimonial/Testimonial.spec.js +57 -57
  153. package/src/components/Testimonial/Testimonial.vue +60 -60
  154. package/src/components/Timeline/README.md +18 -18
  155. package/src/components/Timeline/Timeline.spec.js +17 -17
  156. package/src/components/Timeline/Timeline.vue +24 -24
  157. package/src/foundations/Icon/Icon.spec.js +24 -24
  158. package/src/foundations/Icon/Icon.vue +24 -24
  159. package/src/foundations/Icon/README.md +11 -11
  160. package/src/foundations/Logo/Logo.spec.js +56 -56
  161. package/src/foundations/Logo/Logo.vue +39 -39
  162. package/src/foundations/Logo/README.md +20 -20
  163. package/src/foundations/YoutubeVideo/README.md +11 -11
  164. package/src/foundations/YoutubeVideo/YoutubeVideo.vue +24 -24
  165. package/src/helpers/strings.js +12 -12
  166. package/src/index.js +27 -27
  167. package/src/vue-shim.d.ts +6 -6
  168. package/assets/css/email.min.css +0 -1
  169. package/assets/css/email.min.css.map +0 -1
  170. package/assets/css/error.min.css +0 -1
  171. package/assets/css/error.min.css.map +0 -1
  172. package/assets/ts/main.js +0 -57
  173. package/assets/ts/main.js.map +0 -1
  174. package/assets/ts/modules/accordion.js +0 -33
  175. package/assets/ts/modules/accordion.js.map +0 -1
  176. package/src/components/Accordion/Accordion.screenshot.vue +0 -57
  177. package/src/components/Accordion/__screenshots__/win32/laptop/Accordion.png +0 -0
  178. package/src/components/Accordion/__screenshots__/win32/mobile/Accordion.png +0 -0
  179. package/src/components/Accordion/__screenshots__/win32/tablet/Accordion.png +0 -0
@@ -1,102 +1,76 @@
1
- function carousel(carouselElement) {
2
-
3
- var scrollTimeout;
4
-
5
- let carouselInner = carouselElement.querySelector('.carousel__inner');
6
- let itemCount = carouselElement.querySelectorAll('.carousel__item').length;
7
- let cols = carouselElement.getAttribute('data-cols');
8
- let smCols = carouselElement.getAttribute('data-sm-cols');
9
- let mdCols = carouselElement.getAttribute('data-md-cols');
10
-
11
- carouselElement.querySelector('.carousel__controls a').classList.add('active');
12
-
13
- // On scroll we need to make sure the buttons get corrected and the next testimonial is shown
14
- carouselInner.addEventListener('scroll', function(e){
15
- clearTimeout(scrollTimeout);
16
- scrollTimeout = setTimeout(function(){
17
-
18
- let scrollArea = carouselInner.clientWidth;
19
- let scrollWidth = carouselInner.scrollWidth;
20
- let scrollLeft = carouselInner.scrollLeft;
21
- let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
22
- let lastItemOffset = carouselElement.querySelector('.carousel__item:last-child').offsetLeft;
23
-
24
- Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
25
- link.classList.remove('active');
26
- });
27
-
28
- carouselElement.querySelector('.control-'+targetSlide).classList.add('active');
29
-
30
- // Disable the previous button
31
- if(targetSlide == 1)
32
- carouselElement.querySelector('.btn-prev').setAttribute('disabled','disabled');
33
- else
34
- carouselElement.querySelector('.btn-prev').removeAttribute('disabled');
35
-
36
- // Disable the next button if the last item is in view
37
- if(carouselInner.scrollLeft + scrollArea > lastItemOffset)
38
- carouselElement.querySelector('.btn-next').setAttribute('disabled','disabled');
39
- else
40
- carouselElement.querySelector('.btn-next').removeAttribute('disabled');
41
-
42
- }, 100);
43
-
44
- }, false);
45
-
46
- // when the buttons are used we need to make sure the carousel scrolls to the correct place
47
- carouselElement.addEventListener('click', function(e){
48
-
49
- for (var target = e.target; target && target != this; target = target.parentNode) {
50
- if (target.matches('.carousel__controls a')) {
51
-
52
- e.preventDefault();
53
-
54
- Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
55
- link.classList.remove('active');
56
- });
57
- target.classList.add('active');
58
-
59
- const el = document.querySelector(target.getAttribute('href'));
60
-
61
- carouselInner.scroll({
62
- top: 0,
63
- left: el.offsetLeft,
64
- behavior: 'smooth'
65
- });
66
-
67
- break;
68
- }
69
- }
70
- }, false);
71
-
72
- carouselElement.addEventListener('click', function(e){
73
-
74
- for (var target = e.target; target && target != this; target = target.parentNode) {
75
- if (target.matches('.btn-next, .btn-prev')) {
76
-
77
- e.preventDefault();
78
- let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - carouselInner.clientWidth : carouselInner.scrollLeft + carouselInner.clientWidth;
79
-
80
- carouselInner.scroll({
81
- top: 0,
82
- left: scrollTo,
83
- behavior: 'smooth'
84
- });
85
- break;
86
- }
87
- }
88
- }, false);
89
-
90
-
91
- // Add responsive hide button classes
92
- if(itemCount == 1)
93
- carouselElement.classList.add('hide-btns');
94
-
95
- if(smCols >= itemCount)
96
- carouselElement.classList.add('hide-sm-btns');
97
-
98
- if(mdCols >= itemCount)
99
- carouselElement.classList.add('hide-md-btns');
100
- }
101
-
102
- export default carousel
1
+ // @ts-nocheck
2
+ function carousel(carouselElement) {
3
+ var scrollTimeout;
4
+ let carouselInner = carouselElement.querySelector('.carousel__inner');
5
+ let itemCount = carouselElement.querySelectorAll('.carousel__item').length;
6
+ let cols = carouselElement.getAttribute('data-cols');
7
+ let smCols = carouselElement.getAttribute('data-sm-cols');
8
+ let mdCols = carouselElement.getAttribute('data-md-cols');
9
+ carouselElement.querySelector('.carousel__controls a').classList.add('active');
10
+ // On scroll we need to make sure the buttons get corrected and the next testimonial is shown
11
+ carouselInner.addEventListener('scroll', function (e) {
12
+ clearTimeout(scrollTimeout);
13
+ scrollTimeout = setTimeout(function () {
14
+ let scrollArea = carouselInner.clientWidth;
15
+ let scrollWidth = carouselInner.scrollWidth;
16
+ let scrollLeft = carouselInner.scrollLeft;
17
+ let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
18
+ let lastItemOffset = carouselElement.querySelector('.carousel__item:last-child').offsetLeft;
19
+ Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
20
+ link.classList.remove('active');
21
+ });
22
+ carouselElement.querySelector('.control-' + targetSlide).classList.add('active');
23
+ // Disable the previous button
24
+ if (targetSlide == 1)
25
+ carouselElement.querySelector('.btn-prev').setAttribute('disabled', 'disabled');
26
+ else
27
+ carouselElement.querySelector('.btn-prev').removeAttribute('disabled');
28
+ // Disable the next button if the last item is in view
29
+ if (carouselInner.scrollLeft + scrollArea > lastItemOffset)
30
+ carouselElement.querySelector('.btn-next').setAttribute('disabled', 'disabled');
31
+ else
32
+ carouselElement.querySelector('.btn-next').removeAttribute('disabled');
33
+ }, 100);
34
+ }, false);
35
+ // when the buttons are used we need to make sure the carousel scrolls to the correct place
36
+ carouselElement.addEventListener('click', function (e) {
37
+ for (var target = e.target; target && target != this; target = target.parentNode) {
38
+ if (target.matches('.carousel__controls a')) {
39
+ e.preventDefault();
40
+ Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
41
+ link.classList.remove('active');
42
+ });
43
+ target.classList.add('active');
44
+ const el = document.querySelector(target.getAttribute('href'));
45
+ carouselInner.scroll({
46
+ top: 0,
47
+ left: el.offsetLeft,
48
+ behavior: 'smooth'
49
+ });
50
+ break;
51
+ }
52
+ }
53
+ }, false);
54
+ carouselElement.addEventListener('click', function (e) {
55
+ for (var target = e.target; target && target != this; target = target.parentNode) {
56
+ if (target.matches('.btn-next, .btn-prev')) {
57
+ e.preventDefault();
58
+ let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - carouselInner.clientWidth : carouselInner.scrollLeft + carouselInner.clientWidth;
59
+ carouselInner.scroll({
60
+ top: 0,
61
+ left: scrollTo,
62
+ behavior: 'smooth'
63
+ });
64
+ break;
65
+ }
66
+ }
67
+ }, false);
68
+ // Add responsive hide button classes
69
+ if (itemCount == 1)
70
+ carouselElement.classList.add('hide-btns');
71
+ if (smCols >= itemCount)
72
+ carouselElement.classList.add('hide-sm-btns');
73
+ if (mdCols >= itemCount)
74
+ carouselElement.classList.add('hide-md-btns');
75
+ }
76
+ export default carousel;
@@ -1,218 +1,151 @@
1
- import { ucfirst, unsnake } from './helpers'
2
-
3
- function chart(chartElement,min,max,type) {
4
-
5
- let chartKey = chartElement.querySelector('.chart__key');
6
- let chartYaxis = chartElement.querySelector('.chart__yaxis');
7
- let chartGuidelines = chartElement.querySelector('.chart__guidelines');
8
-
9
- // Chart key
10
- if(chartKey && chartKey.childElementCount == 0){
11
- createChartKey(chartElement);
12
- }
13
-
14
- // Y Axis and Guidelines
15
- if(chartYaxis && chartYaxis.childElementCount == 0){
16
- createChartYaxis(chartElement);
17
- }
18
- if(chartGuidelines && chartGuidelines.childElementCount == 0){
19
- createChartGuidelines(chartElement);
20
- }
21
-
22
- // Create lines for line graph
23
- if(type == "line")
24
- createLines(chartElement,min,max);
25
-
26
- // Create pies
27
- if(type == "pie")
28
- createPies(chartElement);
29
-
30
- // Add css vars to cells
31
- Array.from(chartElement.querySelectorAll('tbody tr')).forEach((tr, index) => {
32
-
33
- let group = tr.querySelector('td:first-child, th:first-child') ? tr.querySelector('td:first-child, th:first-child').innerHTML : '';
34
-
35
- Array.from(tr.querySelectorAll('td[data-numeric]:not([data-numeric="0"]):not(:first-child)')).forEach((td, index) => {
36
-
37
- const value = Number.parseFloat(td.getAttribute('data-numeric'));
38
- let percent = ((value - min)/(max)) * 100;
39
- const content = td.innerHTML;
40
- const label = td.getAttribute('data-label');
41
- let bottom = 0;
42
-
43
- // If the value is negative the position below the 0 line
44
- if(min < 0){
45
- bottom = Math.abs((min)/(max)*100);
46
- if(value < 0){
47
- bottom = bottom - percent;
48
- }
49
- }
50
- td.setAttribute("style",`--bottom:${bottom}%;--percent:${percent}%;`);
51
-
52
-
53
- td.innerHTML = `<span data-group="${group}" data-label="${label}">${content}</span>`;
54
- });
55
- });
56
- }
57
-
58
- export const createChartKey = function(chartElement){
59
-
60
- let chartKey = chartElement.querySelector('.chart__key');
61
-
62
- Array.from(chartElement.querySelectorAll('thead th')).forEach((arrayElement, index) => {
63
-
64
- chartKey.innerHTML += `<div class="key">${arrayElement.innerText}</div>`;
65
- });
66
- }
67
-
68
- export const createChartGuidelines = function(chartElement){
69
-
70
- let chartGuidelines = chartElement.querySelector('.chart__guidelines');
71
- const max = chartElement.getAttribute('data-max');
72
- const min = chartElement.getAttribute('data-min');
73
-
74
- chartGuidelines.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
75
- chartGuidelines.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
76
- }
77
-
78
- export const createChartYaxis = function(chartElement){
79
-
80
- let chartYaxis = chartElement.querySelector('.chart__yaxis');
81
- const max = chartElement.getAttribute('data-max');
82
- const min = chartElement.getAttribute('data-min');
83
-
84
- chartYaxis.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
85
- chartYaxis.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
86
- }
87
-
88
- function getCoordinatesForPercent(percent) {
89
- const x = Math.cos(2 * Math.PI * percent);
90
- const y = Math.sin(2 * Math.PI * percent);
91
- return [x*100, y*100];
92
- }
93
-
94
- export const createPies = function(chartElement){
95
-
96
- let returnString = '';
97
- let pieWrapper = chartElement.querySelector('.pies');
98
-
99
- Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
100
-
101
- let paths = '';
102
- let tooltips = '';
103
-
104
- let cumulativePercent = 0;
105
-
106
- let total = 0;
107
-
108
- let titleKey = item.querySelectorAll('td')[0]
109
- let title = titleKey.innerHTML;
110
-
111
- Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
112
-
113
- if(subindex != 0){
114
-
115
- let value = cell.getAttribute('data-numeric');
116
-
117
- value = value.replace('£','');
118
- value = value.replace('%','');
119
- value = Number.parseInt(value);
120
-
121
- total += value;
122
- }
123
- });
124
-
125
- Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
126
-
127
- if(subindex != 0){
128
-
129
- let value = cell.getAttribute('data-numeric');
130
-
131
- value = value.replace('£','');
132
- value = value.replace('%','');
133
- value = Number.parseInt(value);
134
-
135
- let percent = value/total;
136
-
137
- //lines[subindex-1] += `${command} ${spacer * index} ${100-percent} `;
138
- const [startX, startY] = getCoordinatesForPercent(cumulativePercent);
139
-
140
- // each slice starts where the last slice ended, so keep a cumulative percent
141
- cumulativePercent += percent;
142
-
143
- const [endX, endY] = getCoordinatesForPercent(cumulativePercent);
144
-
145
- // if the slice is more than 50%, take the large arc (the long way around)
146
- const largeArcFlag = percent > .5 ? 1 : 0;
147
-
148
- // create an array and join it just for code readability
149
- const pathData = [
150
- `M ${startX} ${startY}`, // Move
151
- `A 100 100 0 ${largeArcFlag} 1 ${endX} ${endY}`, // Arc
152
- `L 0 0`, // Line
153
- ].join(' ');
154
-
155
- paths += `<path d="${pathData}"></path>`;
156
- tooltips += `<foreignObject x="-70" y="-70" width="140" height="140" style="transform: rotate(90deg)"><div><span class="h5 mb-0"><span class="total d-block">${ucfirst(unsnake(title))}</span> ${ucfirst(unsnake(cell.getAttribute('data-label')))}<br/> ${cell.innerHTML}</span></div></foreignObject>`;
157
- }
158
- });
159
-
160
- returnString += `<div class="pie"><svg viewBox="-105 -105 210 210" style="transform: rotate(-90deg)" preserveAspectRatio="none">${paths}<foreignObject x="-70" y="-70" width="140" height="140" style="transform: rotate(90deg)"><div><span class="h5 mb-0">${title}</span></div></foreignObject>${tooltips}</svg></div>`
161
- });
162
-
163
- pieWrapper.innerHTML = returnString;
164
- }
165
-
166
- export const createLines = function(chartElement,min,max){
167
-
168
- let returnString = '';
169
- let linesWrapper = chartElement.querySelector('.lines');
170
-
171
- let items = Array.from(chartElement.querySelectorAll('tbody tr'));
172
-
173
- let lines = Array();
174
- let spacer = 200/(items.length - 1);
175
-
176
- // Creates the lines array from the fields array
177
- Array.from(chartElement.querySelectorAll('thead th')).forEach((field, index) => {
178
-
179
- if(index != 0){
180
-
181
- lines[index-1] = '';
182
- }
183
- });
184
-
185
- // populate the lines array from the items array
186
- Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
187
-
188
- Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
189
-
190
- if(subindex != 0){
191
-
192
- let value = cell.getAttribute('data-numeric');
193
-
194
- value = value.replace('£','');
195
- value = value.replace('%','');
196
- value = Number.parseFloat(value) - min;
197
-
198
- const percent = (value/max) * 100;
199
-
200
- let command = index == 0 ? 'M' : 'L';
201
-
202
- lines[subindex-1] += `${command} ${spacer * index} ${100-percent} `;
203
- }
204
- });
205
- });
206
-
207
- lines.forEach((line, index) => {
208
-
209
- returnString += `
210
- <svg viewBox="0 0 200 100" class="line" preserveAspectRatio="none">
211
- <path fill="none" d="${line}"></path>
212
- </svg>`
213
- });
214
-
215
- linesWrapper.innerHTML = returnString;
216
- }
217
-
218
- export default chart
1
+ // @ts-nocheck
2
+ import { ucfirst, unsnake } from './helpers.js';
3
+ function chart(chartElement, min, max, type) {
4
+ let chartKey = chartElement.querySelector('.chart__key');
5
+ let chartYaxis = chartElement.querySelector('.chart__yaxis');
6
+ let chartGuidelines = chartElement.querySelector('.chart__guidelines');
7
+ // Chart key
8
+ if (chartKey && chartKey.childElementCount == 0) {
9
+ createChartKey(chartElement);
10
+ }
11
+ // Y Axis and Guidelines
12
+ if (chartYaxis && chartYaxis.childElementCount == 0) {
13
+ createChartYaxis(chartElement);
14
+ }
15
+ if (chartGuidelines && chartGuidelines.childElementCount == 0) {
16
+ createChartGuidelines(chartElement);
17
+ }
18
+ // Create lines for line graph
19
+ if (type == "line")
20
+ createLines(chartElement, min, max);
21
+ // Create pies
22
+ if (type == "pie")
23
+ createPies(chartElement);
24
+ // Add css vars to cells
25
+ Array.from(chartElement.querySelectorAll('tbody tr')).forEach((tr, index) => {
26
+ let group = tr.querySelector('td:first-child, th:first-child') ? tr.querySelector('td:first-child, th:first-child').innerHTML : '';
27
+ Array.from(tr.querySelectorAll('td[data-numeric]:not([data-numeric="0"]):not(:first-child)')).forEach((td, index) => {
28
+ const value = Number.parseFloat(td.getAttribute('data-numeric'));
29
+ let percent = ((value - min) / (max)) * 100;
30
+ const content = td.innerHTML;
31
+ const label = td.getAttribute('data-label');
32
+ let bottom = 0;
33
+ // If the value is negative the position below the 0 line
34
+ if (min < 0) {
35
+ bottom = Math.abs((min) / (max) * 100);
36
+ if (value < 0) {
37
+ bottom = bottom - percent;
38
+ }
39
+ }
40
+ td.setAttribute("style", `--bottom:${bottom}%;--percent:${percent}%;`);
41
+ td.innerHTML = `<span data-group="${group}" data-label="${label}">${content}</span>`;
42
+ });
43
+ });
44
+ }
45
+ export const createChartKey = function (chartElement) {
46
+ let chartKey = chartElement.querySelector('.chart__key');
47
+ Array.from(chartElement.querySelectorAll('thead th')).forEach((arrayElement, index) => {
48
+ chartKey.innerHTML += `<div class="key">${arrayElement.innerText}</div>`;
49
+ });
50
+ };
51
+ export const createChartGuidelines = function (chartElement) {
52
+ let chartGuidelines = chartElement.querySelector('.chart__guidelines');
53
+ const max = chartElement.getAttribute('data-max');
54
+ const min = chartElement.getAttribute('data-min');
55
+ chartGuidelines.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
56
+ chartGuidelines.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
57
+ };
58
+ export const createChartYaxis = function (chartElement) {
59
+ let chartYaxis = chartElement.querySelector('.chart__yaxis');
60
+ const max = chartElement.getAttribute('data-max');
61
+ const min = chartElement.getAttribute('data-min');
62
+ chartYaxis.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
63
+ chartYaxis.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
64
+ };
65
+ function getCoordinatesForPercent(percent) {
66
+ const x = Math.cos(2 * Math.PI * percent);
67
+ const y = Math.sin(2 * Math.PI * percent);
68
+ return [x * 100, y * 100];
69
+ }
70
+ export const createPies = function (chartElement) {
71
+ let returnString = '';
72
+ let pieWrapper = chartElement.querySelector('.pies');
73
+ Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
74
+ let paths = '';
75
+ let tooltips = '';
76
+ let cumulativePercent = 0;
77
+ let total = 0;
78
+ let titleKey = item.querySelectorAll('td')[0];
79
+ let title = titleKey.innerHTML;
80
+ Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
81
+ if (subindex != 0) {
82
+ let value = cell.getAttribute('data-numeric');
83
+ value = value.replace('£', '');
84
+ value = value.replace('%', '');
85
+ value = Number.parseInt(value);
86
+ total += value;
87
+ }
88
+ });
89
+ Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
90
+ if (subindex != 0) {
91
+ let value = cell.getAttribute('data-numeric');
92
+ value = value.replace('£', '');
93
+ value = value.replace('%', '');
94
+ value = Number.parseInt(value);
95
+ let percent = value / total;
96
+ //lines[subindex-1] += `${command} ${spacer * index} ${100-percent} `;
97
+ const [startX, startY] = getCoordinatesForPercent(cumulativePercent);
98
+ // each slice starts where the last slice ended, so keep a cumulative percent
99
+ cumulativePercent += percent;
100
+ const [endX, endY] = getCoordinatesForPercent(cumulativePercent);
101
+ // if the slice is more than 50%, take the large arc (the long way around)
102
+ const largeArcFlag = percent > .5 ? 1 : 0;
103
+ // create an array and join it just for code readability
104
+ const pathData = [
105
+ `M ${startX} ${startY}`,
106
+ `A 100 100 0 ${largeArcFlag} 1 ${endX} ${endY}`,
107
+ `L 0 0`, // Line
108
+ ].join(' ');
109
+ paths += `<path d="${pathData}"></path>`;
110
+ tooltips += `<foreignObject x="-70" y="-70" width="140" height="140" style="transform: rotate(90deg)"><div><span class="h5 mb-0"><span class="total d-block">${ucfirst(unsnake(title))}</span> ${ucfirst(unsnake(cell.getAttribute('data-label')))}<br/> ${cell.innerHTML}</span></div></foreignObject>`;
111
+ }
112
+ });
113
+ returnString += `<div class="pie"><svg viewBox="-105 -105 210 210" style="transform: rotate(-90deg)" preserveAspectRatio="none">${paths}<foreignObject x="-70" y="-70" width="140" height="140" style="transform: rotate(90deg)"><div><span class="h5 mb-0">${title}</span></div></foreignObject>${tooltips}</svg></div>`;
114
+ });
115
+ pieWrapper.innerHTML = returnString;
116
+ };
117
+ export const createLines = function (chartElement, min, max) {
118
+ let returnString = '';
119
+ let linesWrapper = chartElement.querySelector('.lines');
120
+ let items = Array.from(chartElement.querySelectorAll('tbody tr'));
121
+ let lines = Array();
122
+ let spacer = 200 / (items.length - 1);
123
+ // Creates the lines array from the fields array
124
+ Array.from(chartElement.querySelectorAll('thead th')).forEach((field, index) => {
125
+ if (index != 0) {
126
+ lines[index - 1] = '';
127
+ }
128
+ });
129
+ // populate the lines array from the items array
130
+ Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
131
+ Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
132
+ if (subindex != 0) {
133
+ let value = cell.getAttribute('data-numeric');
134
+ value = value.replace('£', '');
135
+ value = value.replace('%', '');
136
+ value = Number.parseFloat(value) - min;
137
+ const percent = (value / max) * 100;
138
+ let command = index == 0 ? 'M' : 'L';
139
+ lines[subindex - 1] += `${command} ${spacer * index} ${100 - percent} `;
140
+ }
141
+ });
142
+ });
143
+ lines.forEach((line, index) => {
144
+ returnString += `
145
+ <svg viewBox="0 0 200 100" class="line" preserveAspectRatio="none">
146
+ <path fill="none" d="${line}"></path>
147
+ </svg>`;
148
+ });
149
+ linesWrapper.innerHTML = returnString;
150
+ };
151
+ export default chart;
@@ -1,16 +1,10 @@
1
- const drawer = (element) => {
2
-
3
- const observer = new IntersectionObserver(
4
-
5
- function([e]){
6
- e.target.classList.toggle("in-view", e.intersectionRatio > 0)
7
- document.getElementById('showDrawer').checked = false
8
- },
9
- { threshold: [1] }
10
- );
11
-
12
- const el = document.getElementById('drawer-end')
13
- observer.observe(el);
14
- }
15
-
16
- export default drawer
1
+ // @ts-nocheck
2
+ const drawer = (element) => {
3
+ const observer = new IntersectionObserver(function ([e]) {
4
+ e.target.classList.toggle("in-view", e.intersectionRatio > 0);
5
+ document.getElementById('showDrawer').checked = false;
6
+ }, { threshold: [1] });
7
+ const el = document.getElementById('drawer-end');
8
+ observer.observe(el);
9
+ };
10
+ export default drawer;