@festo-ui/angular 3.1.0-pre-20220203.2 → 3.1.0-pre-20220217.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 (231) hide show
  1. package/esm2020/festo-ui-angular.mjs +5 -0
  2. package/esm2020/index.mjs +18 -0
  3. package/esm2020/lib/components/breadcrumb/breadcrumb.component.mjs +23 -0
  4. package/esm2020/lib/components/buttons/button/button.component.mjs +41 -0
  5. package/esm2020/lib/components/buttons/link-button/link-button.component.mjs +33 -0
  6. package/esm2020/lib/components/chips/chip/chip.component.mjs +37 -0
  7. package/esm2020/lib/components/chips/chip-container/chip-container.component.mjs +16 -0
  8. package/esm2020/lib/components/click-outside.directive.mjs +28 -0
  9. package/esm2020/lib/components/components.module.mjs +155 -0
  10. package/esm2020/lib/components/loading-indicator/loading-indicator.component.mjs +16 -0
  11. package/esm2020/lib/components/modals/alert/alert.component.mjs +52 -0
  12. package/esm2020/lib/components/modals/confirm/confirm.component.mjs +67 -0
  13. package/esm2020/lib/components/modals/index.mjs +2 -0
  14. package/esm2020/lib/components/modals/modal.service.mjs +112 -0
  15. package/esm2020/lib/components/modals/modals.module.mjs +28 -0
  16. package/esm2020/lib/components/modals/prompt/prompt.component.mjs +102 -0
  17. package/esm2020/lib/components/pagination/pagination.component.mjs +55 -0
  18. package/esm2020/lib/components/popovers/legend/legend.component.mjs +42 -0
  19. package/esm2020/lib/components/popovers/legend/legend.directive.mjs +31 -0
  20. package/esm2020/lib/components/popovers/popover/popover.component.mjs +31 -0
  21. package/esm2020/lib/components/popovers/popover-content/popover-content.component.mjs +82 -0
  22. package/esm2020/lib/components/popovers/popover-content/popover-content.directive.mjs +39 -0
  23. package/esm2020/lib/components/popovers/popover-menu/popover-menu.component.mjs +68 -0
  24. package/esm2020/lib/components/popovers/popover-ref.mjs +25 -0
  25. package/esm2020/lib/components/popovers/popover.defaults.mjs +60 -0
  26. package/esm2020/lib/components/popovers/popover.models.mjs +23 -0
  27. package/esm2020/lib/components/popovers/popover.service.mjs +123 -0
  28. package/esm2020/lib/components/popovers/tooltip/tooltip.directive.mjs +94 -0
  29. package/esm2020/lib/components/progress/progress.component.mjs +20 -0
  30. package/esm2020/lib/components/scroll/index.mjs +2 -0
  31. package/esm2020/lib/components/scroll/scrollable.directive.mjs +72 -0
  32. package/esm2020/lib/components/search-input/search-input.component.mjs +150 -0
  33. package/esm2020/lib/components/snackbar/snackbar-container.component.mjs +21 -0
  34. package/esm2020/lib/components/snackbar/snackbar-container.directive.mjs +83 -0
  35. package/esm2020/lib/components/snackbar/snackbar.component.mjs +79 -0
  36. package/esm2020/lib/components/snackbar/snackbar.models.mjs +2 -0
  37. package/esm2020/lib/components/snackbar/snackbar.module.mjs +26 -0
  38. package/esm2020/lib/components/snackbar/snackbar.service.mjs +23 -0
  39. package/esm2020/lib/components/stepper/stepper.component.mjs +22 -0
  40. package/esm2020/lib/components/table-header-cell/table-header-cell.directive.mjs +58 -0
  41. package/esm2020/lib/components/tabs/tab-pane/tab-pane.component.mjs +31 -0
  42. package/esm2020/lib/components/tabs/tabs.component.mjs +355 -0
  43. package/esm2020/lib/content/content.module.mjs +20 -0
  44. package/esm2020/lib/content/icon/icon.component.mjs +17 -0
  45. package/esm2020/lib/festo-angular.module.mjs +58 -0
  46. package/esm2020/lib/forms/checkbox/checkbox.component.mjs +149 -0
  47. package/esm2020/lib/forms/color-indicator/color-indicator.component.mjs +68 -0
  48. package/esm2020/lib/forms/color-picker/color-helper.mjs +121 -0
  49. package/esm2020/lib/forms/color-picker/color-picker.component.mjs +273 -0
  50. package/esm2020/lib/forms/container-host.mjs +27 -0
  51. package/esm2020/lib/forms/date-picker/date-picker.component.mjs +199 -0
  52. package/esm2020/lib/forms/date-range-picker/date-range-picker.component.mjs +224 -0
  53. package/esm2020/lib/forms/forms.module.mjs +146 -0
  54. package/esm2020/lib/forms/radio/radio.component.mjs +346 -0
  55. package/esm2020/lib/forms/segment/segment-control/segment-control.component.mjs +52 -0
  56. package/esm2020/lib/forms/segment/segment.component.mjs +109 -0
  57. package/esm2020/lib/forms/select/chip-text.pipe.mjs +34 -0
  58. package/esm2020/lib/forms/select/select-option/select-option.component.mjs +22 -0
  59. package/esm2020/lib/forms/select/select.component.mjs +257 -0
  60. package/esm2020/lib/forms/slider/slider.component.mjs +110 -0
  61. package/esm2020/lib/forms/switch/switch.component.mjs +120 -0
  62. package/esm2020/lib/forms/text-area/text-area.component.mjs +180 -0
  63. package/esm2020/lib/forms/text-editor/text-editor.component.mjs +286 -0
  64. package/esm2020/lib/forms/text-input/text-input.component.mjs +183 -0
  65. package/esm2020/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.mjs +89 -0
  66. package/esm2020/lib/forms/time-picker/time-picker.component.mjs +188 -0
  67. package/esm2020/lib/forms/unique-selection-dispatcher.mjs +39 -0
  68. package/esm2020/lib/forms/value-accessor-base.mjs +41 -0
  69. package/esm2020/lib/layout/layout.module.mjs +18 -0
  70. package/esm2020/lib/wrappers/flatpickr/flatpickr.component.mjs +59 -0
  71. package/fesm2015/{festo-ui-angular.js → festo-ui-angular.mjs} +317 -521
  72. package/fesm2015/festo-ui-angular.mjs.map +1 -0
  73. package/fesm2020/festo-ui-angular.mjs +5383 -0
  74. package/fesm2020/festo-ui-angular.mjs.map +1 -0
  75. package/package.json +31 -16
  76. package/scss/base/components/breadcrumb/breadcrumb.component.scss +0 -1
  77. package/scss/base/components/modals/prompt/prompt.component.scss +0 -1
  78. package/scss/base/components/popovers/legend/legend.component.scss +2 -2
  79. package/scss/base/components/popovers/popover/styles.scss +3 -3
  80. package/scss/base/components/popovers/popover-content/popover-content.component.scss +1 -1
  81. package/scss/base/components/scroll/scroll-story-helper.scss +1 -3
  82. package/scss/base/components/snackbar/snackbar.component.scss +1 -1
  83. package/scss/base/components/stepper/stepper.component.scss +16 -15
  84. package/scss/base/forms/color-picker/color-picker.component.scss +12 -12
  85. package/scss/base/forms/date-picker/date-picker.component.scss +1 -1
  86. package/scss/base/forms/date-range-picker/date-range-picker.component.scss +1 -1
  87. package/scss/base/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.scss +1 -1
  88. package/scss/styles.scss +2 -2
  89. package/bundles/festo-ui-angular.umd.js +0 -6429
  90. package/bundles/festo-ui-angular.umd.js.map +0 -1
  91. package/esm2015/festo-ui-angular.js +0 -5
  92. package/esm2015/festo-ui-angular.js.map +0 -1
  93. package/esm2015/index.js +0 -18
  94. package/esm2015/index.js.map +0 -1
  95. package/esm2015/lib/components/breadcrumb/breadcrumb.component.js +0 -27
  96. package/esm2015/lib/components/breadcrumb/breadcrumb.component.js.map +0 -1
  97. package/esm2015/lib/components/buttons/button/button.component.js +0 -46
  98. package/esm2015/lib/components/buttons/button/button.component.js.map +0 -1
  99. package/esm2015/lib/components/buttons/link-button/link-button.component.js +0 -38
  100. package/esm2015/lib/components/buttons/link-button/link-button.component.js.map +0 -1
  101. package/esm2015/lib/components/chips/chip/chip.component.js +0 -42
  102. package/esm2015/lib/components/chips/chip/chip.component.js.map +0 -1
  103. package/esm2015/lib/components/chips/chip-container/chip-container.component.js +0 -21
  104. package/esm2015/lib/components/chips/chip-container/chip-container.component.js.map +0 -1
  105. package/esm2015/lib/components/click-outside.directive.js +0 -28
  106. package/esm2015/lib/components/click-outside.directive.js.map +0 -1
  107. package/esm2015/lib/components/components.module.js +0 -155
  108. package/esm2015/lib/components/components.module.js.map +0 -1
  109. package/esm2015/lib/components/loading-indicator/loading-indicator.component.js +0 -21
  110. package/esm2015/lib/components/loading-indicator/loading-indicator.component.js.map +0 -1
  111. package/esm2015/lib/components/modals/alert/alert.component.js +0 -57
  112. package/esm2015/lib/components/modals/alert/alert.component.js.map +0 -1
  113. package/esm2015/lib/components/modals/confirm/confirm.component.js +0 -73
  114. package/esm2015/lib/components/modals/confirm/confirm.component.js.map +0 -1
  115. package/esm2015/lib/components/modals/index.js +0 -2
  116. package/esm2015/lib/components/modals/index.js.map +0 -1
  117. package/esm2015/lib/components/modals/modal.service.js +0 -91
  118. package/esm2015/lib/components/modals/modal.service.js.map +0 -1
  119. package/esm2015/lib/components/modals/modals.module.js +0 -28
  120. package/esm2015/lib/components/modals/modals.module.js.map +0 -1
  121. package/esm2015/lib/components/modals/prompt/prompt.component.js +0 -110
  122. package/esm2015/lib/components/modals/prompt/prompt.component.js.map +0 -1
  123. package/esm2015/lib/components/pagination/pagination.component.js +0 -60
  124. package/esm2015/lib/components/pagination/pagination.component.js.map +0 -1
  125. package/esm2015/lib/components/popovers/legend/legend.component.js +0 -46
  126. package/esm2015/lib/components/popovers/legend/legend.component.js.map +0 -1
  127. package/esm2015/lib/components/popovers/legend/legend.directive.js +0 -31
  128. package/esm2015/lib/components/popovers/legend/legend.directive.js.map +0 -1
  129. package/esm2015/lib/components/popovers/popover/popover.component.js +0 -35
  130. package/esm2015/lib/components/popovers/popover/popover.component.js.map +0 -1
  131. package/esm2015/lib/components/popovers/popover-content/popover-content.component.js +0 -86
  132. package/esm2015/lib/components/popovers/popover-content/popover-content.component.js.map +0 -1
  133. package/esm2015/lib/components/popovers/popover-content/popover-content.directive.js +0 -39
  134. package/esm2015/lib/components/popovers/popover-content/popover-content.directive.js.map +0 -1
  135. package/esm2015/lib/components/popovers/popover-menu/popover-menu.component.js +0 -72
  136. package/esm2015/lib/components/popovers/popover-menu/popover-menu.component.js.map +0 -1
  137. package/esm2015/lib/components/popovers/popover-ref.js +0 -25
  138. package/esm2015/lib/components/popovers/popover-ref.js.map +0 -1
  139. package/esm2015/lib/components/popovers/popover.defaults.js +0 -60
  140. package/esm2015/lib/components/popovers/popover.defaults.js.map +0 -1
  141. package/esm2015/lib/components/popovers/popover.models.js +0 -23
  142. package/esm2015/lib/components/popovers/popover.models.js.map +0 -1
  143. package/esm2015/lib/components/popovers/popover.service.js +0 -117
  144. package/esm2015/lib/components/popovers/popover.service.js.map +0 -1
  145. package/esm2015/lib/components/popovers/tooltip/tooltip.directive.js +0 -96
  146. package/esm2015/lib/components/popovers/tooltip/tooltip.directive.js.map +0 -1
  147. package/esm2015/lib/components/progress/progress.component.js +0 -23
  148. package/esm2015/lib/components/progress/progress.component.js.map +0 -1
  149. package/esm2015/lib/components/scroll/index.js +0 -2
  150. package/esm2015/lib/components/scroll/index.js.map +0 -1
  151. package/esm2015/lib/components/scroll/scrollable.directive.js +0 -73
  152. package/esm2015/lib/components/scroll/scrollable.directive.js.map +0 -1
  153. package/esm2015/lib/components/search-input/search-input.component.js +0 -155
  154. package/esm2015/lib/components/search-input/search-input.component.js.map +0 -1
  155. package/esm2015/lib/components/snackbar/snackbar-container.component.js +0 -26
  156. package/esm2015/lib/components/snackbar/snackbar-container.component.js.map +0 -1
  157. package/esm2015/lib/components/snackbar/snackbar-container.directive.js +0 -83
  158. package/esm2015/lib/components/snackbar/snackbar-container.directive.js.map +0 -1
  159. package/esm2015/lib/components/snackbar/snackbar.component.js +0 -85
  160. package/esm2015/lib/components/snackbar/snackbar.component.js.map +0 -1
  161. package/esm2015/lib/components/snackbar/snackbar.models.js +0 -2
  162. package/esm2015/lib/components/snackbar/snackbar.models.js.map +0 -1
  163. package/esm2015/lib/components/snackbar/snackbar.module.js +0 -26
  164. package/esm2015/lib/components/snackbar/snackbar.module.js.map +0 -1
  165. package/esm2015/lib/components/snackbar/snackbar.service.js +0 -23
  166. package/esm2015/lib/components/snackbar/snackbar.service.js.map +0 -1
  167. package/esm2015/lib/components/stepper/stepper.component.js +0 -28
  168. package/esm2015/lib/components/stepper/stepper.component.js.map +0 -1
  169. package/esm2015/lib/components/table-header-cell/table-header-cell.directive.js +0 -58
  170. package/esm2015/lib/components/table-header-cell/table-header-cell.directive.js.map +0 -1
  171. package/esm2015/lib/components/tabs/tab-pane/tab-pane.component.js +0 -35
  172. package/esm2015/lib/components/tabs/tab-pane/tab-pane.component.js.map +0 -1
  173. package/esm2015/lib/components/tabs/tabs.component.js +0 -362
  174. package/esm2015/lib/components/tabs/tabs.component.js.map +0 -1
  175. package/esm2015/lib/content/content.module.js +0 -24
  176. package/esm2015/lib/content/content.module.js.map +0 -1
  177. package/esm2015/lib/content/icon/icon.component.js +0 -23
  178. package/esm2015/lib/content/icon/icon.component.js.map +0 -1
  179. package/esm2015/lib/festo-angular.module.js +0 -58
  180. package/esm2015/lib/festo-angular.module.js.map +0 -1
  181. package/esm2015/lib/forms/checkbox/checkbox.component.js +0 -156
  182. package/esm2015/lib/forms/checkbox/checkbox.component.js.map +0 -1
  183. package/esm2015/lib/forms/color-indicator/color-indicator.component.js +0 -72
  184. package/esm2015/lib/forms/color-indicator/color-indicator.component.js.map +0 -1
  185. package/esm2015/lib/forms/color-picker/color-helper.js +0 -121
  186. package/esm2015/lib/forms/color-picker/color-helper.js.map +0 -1
  187. package/esm2015/lib/forms/color-picker/color-picker.component.js +0 -280
  188. package/esm2015/lib/forms/color-picker/color-picker.component.js.map +0 -1
  189. package/esm2015/lib/forms/container-host.js +0 -27
  190. package/esm2015/lib/forms/container-host.js.map +0 -1
  191. package/esm2015/lib/forms/date-picker/date-picker.component.js +0 -205
  192. package/esm2015/lib/forms/date-picker/date-picker.component.js.map +0 -1
  193. package/esm2015/lib/forms/date-range-picker/date-range-picker.component.js +0 -230
  194. package/esm2015/lib/forms/date-range-picker/date-range-picker.component.js.map +0 -1
  195. package/esm2015/lib/forms/forms.module.js +0 -146
  196. package/esm2015/lib/forms/forms.module.js.map +0 -1
  197. package/esm2015/lib/forms/radio/radio.component.js +0 -353
  198. package/esm2015/lib/forms/radio/radio.component.js.map +0 -1
  199. package/esm2015/lib/forms/segment/segment-control/segment-control.component.js +0 -58
  200. package/esm2015/lib/forms/segment/segment-control/segment-control.component.js.map +0 -1
  201. package/esm2015/lib/forms/segment/segment.component.js +0 -116
  202. package/esm2015/lib/forms/segment/segment.component.js.map +0 -1
  203. package/esm2015/lib/forms/select/chip-text.pipe.js +0 -34
  204. package/esm2015/lib/forms/select/chip-text.pipe.js.map +0 -1
  205. package/esm2015/lib/forms/select/select-option/select-option.component.js +0 -29
  206. package/esm2015/lib/forms/select/select-option/select-option.component.js.map +0 -1
  207. package/esm2015/lib/forms/select/select.component.js +0 -265
  208. package/esm2015/lib/forms/select/select.component.js.map +0 -1
  209. package/esm2015/lib/forms/slider/slider.component.js +0 -116
  210. package/esm2015/lib/forms/slider/slider.component.js.map +0 -1
  211. package/esm2015/lib/forms/switch/switch.component.js +0 -127
  212. package/esm2015/lib/forms/switch/switch.component.js.map +0 -1
  213. package/esm2015/lib/forms/text-area/text-area.component.js +0 -186
  214. package/esm2015/lib/forms/text-area/text-area.component.js.map +0 -1
  215. package/esm2015/lib/forms/text-editor/text-editor.component.js +0 -294
  216. package/esm2015/lib/forms/text-editor/text-editor.component.js.map +0 -1
  217. package/esm2015/lib/forms/text-input/text-input.component.js +0 -189
  218. package/esm2015/lib/forms/text-input/text-input.component.js.map +0 -1
  219. package/esm2015/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.js +0 -103
  220. package/esm2015/lib/forms/time-picker/time-picker-dropdown/time-picker-dropdown.component.js.map +0 -1
  221. package/esm2015/lib/forms/time-picker/time-picker.component.js +0 -194
  222. package/esm2015/lib/forms/time-picker/time-picker.component.js.map +0 -1
  223. package/esm2015/lib/forms/unique-selection-dispatcher.js +0 -39
  224. package/esm2015/lib/forms/unique-selection-dispatcher.js.map +0 -1
  225. package/esm2015/lib/forms/value-accessor-base.js +0 -41
  226. package/esm2015/lib/forms/value-accessor-base.js.map +0 -1
  227. package/esm2015/lib/layout/layout.module.js +0 -18
  228. package/esm2015/lib/layout/layout.module.js.map +0 -1
  229. package/esm2015/lib/wrappers/flatpickr/flatpickr.component.js +0 -63
  230. package/esm2015/lib/wrappers/flatpickr/flatpickr.component.js.map +0 -1
  231. package/fesm2015/festo-ui-angular.js.map +0 -1
@@ -1,28 +0,0 @@
1
- import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- /**
5
- * A component that shows steps of a process.
6
- * For example useful in wizard dialogs.
7
- */
8
- export class StepperComponent {
9
- }
10
- StepperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: StepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11
- StepperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: StepperComponent, selector: "fng-stepper", inputs: { steps: "steps", stepIndex: "stepIndex", error: "error" }, ngImport: i0, template: "<div class=\"fng-stepper\" [class.fng-stepper-error]=\"error\">\n <div *ngFor=\"let step of steps; index as i; first as isFirst\"\n class=\"fng-step-container\"\n [class.fng-step-active]=\"i === stepIndex\"\n [class.fng-step-done]=\"i < stepIndex\"\n [class.fng-step-first]=\"isFirst\">\n <div *ngIf=\"!isFirst\" class=\"fng-step-connector\"></div>\n <div class=\"fng-step\">\n <div *ngIf=\"i >= stepIndex\">{{i + 1}}</div>\n <div class=\"fng-step-name fwe-d-none fwe-d-lg-block\">{{step.name}}</div>\n </div>\n </div>\n</div>\n", styles: [".fng-stepper{display:flex;width:80%;margin:auto;justify-content:center}.fng-stepper .fng-step-container{display:flex;flex-direction:row;flex:1}.fng-stepper .fng-step-container .fng-step{position:relative;border-radius:50%;border:1px solid #a3b2bc;color:#a3b2bc;width:24px;height:24px;font-size:14px;display:flex;align-items:center;justify-content:center;font-feature-settings:\"tnum\",\"lnum\",lining-nums tabular-nums diagonal-fractions ordinal;font-variant-numeric:lining-nums tabular-nums diagonal-fractions ordinal;transition:border-color .3s,background-color .3s,color .3s}.fng-stepper .fng-step-container .fng-step .fng-step-name{position:absolute;top:30px;left:50%;color:#a3b2bc;transform:translate(-50%);white-space:pre;transition:color .3s}.fng-stepper .fng-step-container .fng-step-connector{border-bottom:1px solid #a3b2bc;flex:1;height:50%;transition:border-color .3s}.fng-stepper .fng-step-container.fng-step-active .fng-step,.fng-stepper .fng-step-container.fng-step-done .fng-step{background:#0091DC;border-color:#0091dc;color:#fff}.fng-stepper .fng-step-container.fng-step-active .fng-step .fng-step-name,.fng-stepper .fng-step-container.fng-step-done .fng-step .fng-step-name{color:#0091dc}.fng-stepper .fng-step-container.fng-step-active .fng-step-connector,.fng-stepper .fng-step-container.fng-step-done .fng-step-connector{border-color:#0091dc}.fng-stepper .fng-step-container.fng-step-done .fng-step:before{content:\"\";position:absolute;border-left:1px solid white;border-bottom:1px solid white;top:6px;left:4px;width:14px;height:7px;transform:rotate(-45deg)}.fng-stepper .fng-step-container.fng-step-first{flex:0;flex-basis:24px}.fng-stepper.fng-stepper-error .fng-step-container.fng-step-active .fng-step{background:#D00019;border-color:#d00019;color:#fff}.fng-stepper.fng-stepper-error .fng-step-container.fng-step-active .fng-step .fng-step-name{color:#d00019}.fng-stepper.fng-stepper-error .fng-step-container.fng-step-active .fng-step-connector{border-color:#a3b2bc}.fng-stepper.fng-stepper-error .fng-step-container.fng-step-done .fng-step{background:#a3b2bc;border-color:#a3b2bc;color:#fff}.fng-stepper.fng-stepper-error .fng-step-container.fng-step-done .fng-step .fng-step-name{color:#a3b2bc}.fng-stepper.fng-stepper-error .fng-step-container.fng-step-done .fng-step-connector{border-color:#a3b2bc}\n"], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: StepperComponent, decorators: [{
13
- type: Component,
14
- args: [{
15
- selector: 'fng-stepper',
16
- templateUrl: './stepper.component.html',
17
- styleUrls: ['./stepper.component.scss'],
18
- changeDetection: ChangeDetectionStrategy.OnPush,
19
- encapsulation: ViewEncapsulation.None
20
- }]
21
- }], propDecorators: { steps: [{
22
- type: Input
23
- }], stepIndex: [{
24
- type: Input
25
- }], error: [{
26
- type: Input
27
- }] } });
28
- //# sourceMappingURL=stepper.component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stepper.component.js","sourceRoot":"","sources":["../../../../../../../libs/angular/src/lib/components/stepper/stepper.component.ts","../../../../../../../libs/angular/src/lib/components/stepper/stepper.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;;;AAY7F;;;GAGG;AAQH,MAAM,OAAO,gBAAgB;;6GAAhB,gBAAgB;iGAAhB,gBAAgB,uHCvB7B,+jBAaA;2FDUa,gBAAgB;kBAP5B,SAAS;mBAAC;oBACT,QAAQ,EAAE,aAAa;oBACvB,WAAW,EAAE,0BAA0B;oBACvC,SAAS,EAAE,CAAC,0BAA0B,CAAC;oBACvC,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;iBACtC;8BAKU,KAAK;sBAAb,KAAK;gBAKG,SAAS;sBAAjB,KAAK;gBAKG,KAAK;sBAAb,KAAK","sourcesContent":["import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\n\n/**\n * Contains all properties of a wizard step.\n */\nexport interface WizardStep {\n /**\n * The name of the step.\n */\n name: string;\n}\n\n/**\n * A component that shows steps of a process.\n * For example useful in wizard dialogs.\n */\n@Component({\n selector: 'fng-stepper',\n templateUrl: './stepper.component.html',\n styleUrls: ['./stepper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class StepperComponent {\n /**\n * The steps.\n */\n @Input() steps: WizardStep[];\n\n /**\n * The current step index.\n */\n @Input() stepIndex: number;\n\n /**\n * When true the wizard will change to error mode.\n */\n @Input() error: boolean;\n}\n","<div class=\"fng-stepper\" [class.fng-stepper-error]=\"error\">\n <div *ngFor=\"let step of steps; index as i; first as isFirst\"\n class=\"fng-step-container\"\n [class.fng-step-active]=\"i === stepIndex\"\n [class.fng-step-done]=\"i < stepIndex\"\n [class.fng-step-first]=\"isFirst\">\n <div *ngIf=\"!isFirst\" class=\"fng-step-connector\"></div>\n <div class=\"fng-step\">\n <div *ngIf=\"i >= stepIndex\">{{i + 1}}</div>\n <div class=\"fng-step-name fwe-d-none fwe-d-lg-block\">{{step.name}}</div>\n </div>\n </div>\n</div>\n"]}
@@ -1,58 +0,0 @@
1
- import { Directive, Input, Output, EventEmitter } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class TableHeaderCellDirective {
4
- constructor() {
5
- this.changeOrder = new EventEmitter();
6
- }
7
- get active() {
8
- if (this.order == null) {
9
- return false;
10
- }
11
- if (this.order.orderBy == null || this.fngTh == null) {
12
- return false;
13
- }
14
- return this.order.orderBy === this.fngTh;
15
- }
16
- get orderDescending() {
17
- return this.active && !this.order.ascending;
18
- }
19
- onChangeOrder() {
20
- this.changeOrder.emit(this.fngTh);
21
- }
22
- }
23
- TableHeaderCellDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: TableHeaderCellDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
24
- TableHeaderCellDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.0", type: TableHeaderCellDirective, selector: "[fngTh]", inputs: { order: "order", fngTh: "fngTh", abbr: "abbr", colspan: "colspan", headers: "headers", rowspan: "rowspan", scope: "scope" }, outputs: { changeOrder: "changeOrder" }, host: { listeners: { "click": "onChangeOrder()" }, properties: { "class.fwe-table-order": "order != null", "class.fwe-active": "active", "class.fwe-table-order-descending": "orderDescending", "attr.abbr": "abbr", "attr.colspan": "colspan", "attr.headers": "headers", "attr.rowspan": "rowspan", "attr.scope": "scope" } }, ngImport: i0 });
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: TableHeaderCellDirective, decorators: [{
26
- type: Directive,
27
- args: [{
28
- selector: '[fngTh]',
29
- host: {
30
- '[class.fwe-table-order]': 'order != null',
31
- '[class.fwe-active]': 'active',
32
- '[class.fwe-table-order-descending]': 'orderDescending',
33
- '[attr.abbr]': 'abbr',
34
- '[attr.colspan]': 'colspan',
35
- '[attr.headers]': 'headers',
36
- '[attr.rowspan]': 'rowspan',
37
- '[attr.scope]': 'scope',
38
- '(click)': 'onChangeOrder()'
39
- }
40
- }]
41
- }], propDecorators: { order: [{
42
- type: Input
43
- }], fngTh: [{
44
- type: Input
45
- }], changeOrder: [{
46
- type: Output
47
- }], abbr: [{
48
- type: Input
49
- }], colspan: [{
50
- type: Input
51
- }], headers: [{
52
- type: Input
53
- }], rowspan: [{
54
- type: Input
55
- }], scope: [{
56
- type: Input
57
- }] } });
58
- //# sourceMappingURL=table-header-cell.directive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"table-header-cell.directive.js","sourceRoot":"","sources":["../../../../../../../libs/angular/src/lib/components/table-header-cell/table-header-cell.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;;AAqBvE,MAAM,OAAO,wBAAwB;IAdrC;QAkBY,gBAAW,GAAG,IAAI,YAAY,EAAU,CAAC;KA4BpD;IAnBC,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;YACtB,OAAO,KAAK,CAAC;SACd;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;YACpD,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC;IAC3C,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9C,CAAC;IAED,aAAa;QACX,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;;qHA/BU,wBAAwB;yGAAxB,wBAAwB;2FAAxB,wBAAwB;kBAdpC,SAAS;mBAAC;oBACT,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE;wBACJ,yBAAyB,EAAE,eAAe;wBAC1C,oBAAoB,EAAE,QAAQ;wBAC9B,oCAAoC,EAAE,iBAAiB;wBACvD,aAAa,EAAE,MAAM;wBACrB,gBAAgB,EAAE,SAAS;wBAC3B,gBAAgB,EAAE,SAAS;wBAC3B,gBAAgB,EAAE,SAAS;wBAC3B,cAAc,EAAE,OAAO;wBACvB,SAAS,EAAE,iBAAiB;qBAC7B;iBACF;8BAEU,KAAK;sBAAb,KAAK;gBACG,KAAK;sBAAb,KAAK;gBAEI,WAAW;sBAApB,MAAM;gBAGE,IAAI;sBAAZ,KAAK;gBACG,OAAO;sBAAf,KAAK;gBACG,OAAO;sBAAf,KAAK;gBACG,OAAO;sBAAf,KAAK;gBACG,KAAK;sBAAb,KAAK","sourcesContent":["import { Directive, Input, Output, EventEmitter } from '@angular/core';\n\nexport interface TableColumnOrder {\n orderBy?: string;\n ascending: boolean;\n}\n\n@Directive({\n selector: '[fngTh]',\n host: {\n '[class.fwe-table-order]': 'order != null',\n '[class.fwe-active]': 'active',\n '[class.fwe-table-order-descending]': 'orderDescending',\n '[attr.abbr]': 'abbr',\n '[attr.colspan]': 'colspan',\n '[attr.headers]': 'headers',\n '[attr.rowspan]': 'rowspan',\n '[attr.scope]': 'scope',\n '(click)': 'onChangeOrder()'\n }\n})\nexport class TableHeaderCellDirective {\n @Input() order: TableColumnOrder;\n @Input() fngTh: string;\n\n @Output() changeOrder = new EventEmitter<string>();\n\n /* Attributes */\n @Input() abbr: string;\n @Input() colspan: number;\n @Input() headers: string;\n @Input() rowspan: number;\n @Input() scope: string;\n\n get active(): boolean {\n if (this.order == null) {\n return false;\n }\n\n if (this.order.orderBy == null || this.fngTh == null) {\n return false;\n }\n\n return this.order.orderBy === this.fngTh;\n }\n\n get orderDescending(): boolean {\n return this.active && !this.order.ascending;\n }\n\n onChangeOrder() {\n this.changeOrder.emit(this.fngTh);\n }\n}\n"]}
@@ -1,35 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- export class TabPaneComponent {
5
- constructor() {
6
- this.tabPaneId = `tab-panel-content-${++TabPaneComponent.nextId}`;
7
- this.changesSubject = new Subject();
8
- this.changes$ = this.changesSubject.asObservable();
9
- }
10
- ngOnChanges() {
11
- this.changesSubject.next(true);
12
- }
13
- }
14
- TabPaneComponent.nextId = 0;
15
- TabPaneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: TabPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16
- TabPaneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: TabPaneComponent, selector: "fng-tab-pane", inputs: { id: "id", name: "name", icon: "icon", active: "active", isVisible: "isVisible" }, usesOnChanges: true, ngImport: i0, template: "<div role=\"tabpanel\" [id]=\"tabPaneId\" [attr.aria-labelledby]=\"tabId\" [class.fng-show]=\"isVisible\" [class.fng-hide]=\"!isVisible\">\n <ng-content></ng-content>\n</div>\n", styles: [".fng-show{display:block}.fng-hide{display:none}\n"] });
17
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: TabPaneComponent, decorators: [{
18
- type: Component,
19
- args: [{
20
- selector: 'fng-tab-pane',
21
- templateUrl: './tab-pane.component.html',
22
- styleUrls: ['./tab-pane.component.scss']
23
- }]
24
- }], propDecorators: { id: [{
25
- type: Input
26
- }], name: [{
27
- type: Input
28
- }], icon: [{
29
- type: Input
30
- }], active: [{
31
- type: Input
32
- }], isVisible: [{
33
- type: Input
34
- }] } });
35
- //# sourceMappingURL=tab-pane.component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tab-pane.component.js","sourceRoot":"","sources":["../../../../../../../../libs/angular/src/lib/components/tabs/tab-pane/tab-pane.component.ts","../../../../../../../../libs/angular/src/lib/components/tabs/tab-pane/tab-pane.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAa,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;AAO/B,MAAM,OAAO,gBAAgB;IAL7B;QAcE,cAAS,GAAG,qBAAqB,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAErD,mBAAc,GAAG,IAAI,OAAO,EAAW,CAAC;QAChD,aAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;KAK/C;IAHC,WAAW;QACT,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;;AAfM,uBAAM,GAAG,CAAC,CAAC;6GADP,gBAAgB;iGAAhB,gBAAgB,qKCR7B,mLAGA;2FDKa,gBAAgB;kBAL5B,SAAS;mBAAC;oBACT,QAAQ,EAAE,cAAc;oBACxB,WAAW,EAAE,2BAA2B;oBACxC,SAAS,EAAE,CAAC,2BAA2B,CAAC;iBACzC;8BAIU,EAAE;sBAAV,KAAK;gBACG,IAAI;sBAAZ,KAAK;gBACG,IAAI;sBAAZ,KAAK;gBACG,MAAM;sBAAd,KAAK;gBACG,SAAS;sBAAjB,KAAK","sourcesContent":["import { Component, Input, OnChanges } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'fng-tab-pane',\n templateUrl: './tab-pane.component.html',\n styleUrls: ['./tab-pane.component.scss']\n})\nexport class TabPaneComponent implements OnChanges {\n static nextId = 0;\n // @deprcated Input() id is not in use anymore but still exists for backwards compatiblity\n @Input() id: string;\n @Input() name: string;\n @Input() icon: string;\n @Input() active: boolean;\n @Input() isVisible: boolean;\n tabId: string;\n tabPaneId = `tab-panel-content-${++TabPaneComponent.nextId}`;\n\n private changesSubject = new Subject<boolean>();\n changes$ = this.changesSubject.asObservable();\n\n ngOnChanges(): void {\n this.changesSubject.next(true);\n }\n}\n","<div role=\"tabpanel\" [id]=\"tabPaneId\" [attr.aria-labelledby]=\"tabId\" [class.fng-show]=\"isVisible\" [class.fng-hide]=\"!isVisible\">\n <ng-content></ng-content>\n</div>\n"]}
@@ -1,362 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Inject, Input, Output, QueryList, Renderer2, ViewChild } from '@angular/core';
3
- import { Subject } from 'rxjs';
4
- import { takeUntil } from 'rxjs/operators';
5
- import { TabPaneComponent } from './tab-pane/tab-pane.component';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- export class TabsComponent {
9
- constructor(elRef, document, renderer, cd) {
10
- this.elRef = elRef;
11
- this.document = document;
12
- this.renderer = renderer;
13
- this.cd = cd;
14
- // eslint-disable-next-line @angular-eslint/no-input-rename
15
- this.viewType = 'responsive';
16
- // eslint-disable-next-line @angular-eslint/no-input-rename
17
- this.showDivider = false;
18
- this.config = null;
19
- this.fngTabChange = new EventEmitter();
20
- this.componentId = `tabs-${++TabsComponent.nextId}`;
21
- this.tabs = [];
22
- this.useCompactDensity = true;
23
- this.activeTab = null;
24
- this.complete = new Subject();
25
- this.injectedWindow = this.document.defaultView;
26
- }
27
- ngAfterContentInit() {
28
- this.initTabs();
29
- if (null === this.activeTab) {
30
- this.panes.map((pane, i) => {
31
- if (0 === i) {
32
- pane.isVisible = true;
33
- }
34
- });
35
- }
36
- else {
37
- this.panes.find(pane => null != this.activeTab.paneId && pane.tabPaneId === this.activeTab.paneId).isVisible = true;
38
- }
39
- }
40
- ngAfterViewInit() {
41
- var _a, _b, _c, _d;
42
- this.elemScroller = (_a = this.scroller) === null || _a === void 0 ? void 0 : _a.nativeElement;
43
- this.elemScrollArea = (_b = this.scrollAera) === null || _b === void 0 ? void 0 : _b.nativeElement;
44
- this.elemScrollContent = (_c = this.scrollContent) === null || _c === void 0 ? void 0 : _c.nativeElement;
45
- const initialWidth = (_d = this.elemScrollArea) === null || _d === void 0 ? void 0 : _d.offsetWidth;
46
- if (initialWidth > 768) {
47
- this.useCompactDensity = false;
48
- this.cd.detectChanges();
49
- }
50
- this.resizeObserver = new ResizeObserver(() => {
51
- const width = this.elemScrollArea.offsetWidth;
52
- if (width > 768 && this.useCompactDensity === true) {
53
- this.useCompactDensity = false;
54
- this.cd.detectChanges();
55
- }
56
- else if (width <= 768 && this.useCompactDensity === false) {
57
- this.useCompactDensity = true;
58
- this.cd.detectChanges();
59
- }
60
- });
61
- if (this.elemScrollArea != null) {
62
- this.resizeObserver.observe(this.elemScrollArea);
63
- }
64
- this.handleTabPaneChanges();
65
- }
66
- ngOnDestroy() {
67
- this.complete.next(true);
68
- this.complete.unsubscribe();
69
- }
70
- showTabPane(id) {
71
- var _a;
72
- const pane = this.panes.find(p => p.tabPaneId === id);
73
- if (null != pane) {
74
- this.panes.map(p => {
75
- p.isVisible = false;
76
- });
77
- pane.isVisible = true;
78
- this.tabs.map(tab => {
79
- if (tab.paneId !== pane.tabPaneId) {
80
- tab.active = false;
81
- }
82
- else {
83
- tab.active = true;
84
- }
85
- });
86
- this.fngTabChange.emit({
87
- previous: (_a = this.activeTab) === null || _a === void 0 ? void 0 : _a.paneId,
88
- current: id
89
- });
90
- this.activeTab = this.tabs.find(tab => !!tab.active);
91
- }
92
- }
93
- handleTabScroll(event, index) {
94
- const scrollContentWidth = this.elemScrollContent.offsetWidth;
95
- const scrollAreaWidth = this.elemScrollArea.offsetWidth;
96
- // check if no scroll is needed
97
- if (scrollAreaWidth > scrollContentWidth) {
98
- return;
99
- }
100
- // check index
101
- if (!this.indexIsInRange(index)) {
102
- return;
103
- }
104
- // always scroll to 0 if scrolling to the first tab
105
- if (index === 0) {
106
- this.scrollTo(0);
107
- return;
108
- }
109
- // always scroll to the max value if scrolling to the last tab
110
- if (index === this.tabs.length - 1) {
111
- this.scrollTo(this.elemScrollContent.offsetWidth);
112
- return;
113
- }
114
- const currentTab = event.target;
115
- this.scrollIntoView(index, currentTab);
116
- }
117
- initTabs() {
118
- this.tabs = [];
119
- this.panes.map((pane, i) => {
120
- pane.tabId = this.componentId + '-tab-' + i;
121
- const tab = {
122
- name: null != pane.name ? pane.name : '',
123
- paneId: null != pane.tabPaneId ? pane.tabPaneId : null,
124
- icon: null != pane.icon ? pane.icon : null,
125
- active: null != pane.active ? pane.active : false
126
- };
127
- this.tabs.push(tab);
128
- });
129
- this.initActiveTab();
130
- this.cd.detectChanges();
131
- }
132
- initActiveTab() {
133
- const activeTab = this.tabs.find((tab) => !!tab.active);
134
- if (!activeTab && 0 < this.tabs.length) {
135
- this.tabs[0] = Object.assign(Object.assign({}, this.tabs[0]), { active: true });
136
- this.activeTab = this.tabs[0];
137
- }
138
- else {
139
- this.activeTab = activeTab;
140
- }
141
- }
142
- handleTabPaneChanges() {
143
- // first subscribe to any changes in tab pane, so that the tabs in this view wiil be updated
144
- this.panes.forEach(pane => {
145
- pane.changes$.pipe(takeUntil(this.complete)).subscribe(() => {
146
- // on changes in a tab pane, we init the tabs again
147
- this.initTabs();
148
- });
149
- });
150
- }
151
- scrollTo(scrollX) {
152
- const currentScrollX = this.getScrollPosition();
153
- const safeScrollX = this.clampScrollValue(scrollX);
154
- const scrollDelta = safeScrollX - currentScrollX;
155
- this.animate({
156
- finalScrollPosition: safeScrollX,
157
- scrollDelta
158
- });
159
- }
160
- scrollIntoView(index, tab) {
161
- const scrollPosition = this.getScrollPosition();
162
- const barWidth = this.elemScrollArea.offsetWidth;
163
- const tabDimensions = this.computeDimensions(tab);
164
- const nextIndex = this.findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth);
165
- if (!this.indexIsInRange(nextIndex)) {
166
- return;
167
- }
168
- const scrollIncrement = this.calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth);
169
- this.incrementScroll(scrollIncrement);
170
- }
171
- incrementScroll(scrollXIncrement) {
172
- // no scroll needed
173
- if (scrollXIncrement === 0) {
174
- return;
175
- }
176
- const scrollOperation = this.getIncrementScrollOperation(scrollXIncrement);
177
- this.animate(scrollOperation);
178
- }
179
- animate(animation) {
180
- // no animation needed
181
- if (animation.scrollDelta === 0) {
182
- return;
183
- }
184
- this.stopScrollAnimation();
185
- // this animation uses the flip approach
186
- // https://aerotwist.com/blog/flip-your-animations/
187
- // https://css-tricks.com/animating-layouts-with-the-flip-technique/
188
- this.elemScrollArea.scrollLeft = animation.finalScrollPosition;
189
- this.setScrollContentStyleProperty('transform', `translateX(${animation.scrollDelta}px)`);
190
- // force repaint
191
- this.elemScrollArea.getBoundingClientRect();
192
- requestAnimationFrame(() => {
193
- this.renderer.addClass(this.elemScroller, 'fng-tab-scroller--animating');
194
- this.setScrollContentStyleProperty('transform', 'none');
195
- });
196
- }
197
- stopScrollAnimation() {
198
- const currentScrollPosition = this.getAnimatingScrollPosition();
199
- this.renderer.removeClass(this.elemScroller, 'fng-tab-scroller--animating');
200
- this.setScrollContentStyleProperty('transform', 'translateX(0px)');
201
- this.elemScrollArea.scrollLeft = currentScrollPosition;
202
- }
203
- getAnimatingScrollPosition() {
204
- const currentTranslateX = this.calculateCurrentTranslateX();
205
- const scrollLeft = this.elemScrollArea.scrollLeft;
206
- return scrollLeft - currentTranslateX;
207
- }
208
- getIncrementScrollOperation(scrollX) {
209
- const currentScrollX = this.getScrollPosition();
210
- const targetScrollX = scrollX + currentScrollX;
211
- const safeScrollX = this.clampScrollValue(targetScrollX);
212
- const scrollDelta = safeScrollX - currentScrollX;
213
- return {
214
- finalScrollPosition: safeScrollX,
215
- scrollDelta
216
- };
217
- }
218
- clampScrollValue(scrollX) {
219
- const edges = this.calculateScrollEdges();
220
- return Math.min(Math.max(edges.left, scrollX), edges.right);
221
- }
222
- calculateScrollEdges() {
223
- const scrollContentWidth = this.elemScrollContent.offsetWidth;
224
- const scrollAreaWidth = this.elemScrollArea.offsetWidth;
225
- return {
226
- left: 0,
227
- right: scrollContentWidth - scrollAreaWidth
228
- };
229
- }
230
- computeDimensions(tab) {
231
- const rootWidth = tab.offsetWidth;
232
- const rootLeft = tab.offsetLeft;
233
- const tabContent = tab.querySelector('.fng-tab-content');
234
- const contentWidth = tabContent.offsetWidth;
235
- const contentLeft = tabContent.offsetLeft;
236
- return {
237
- contentLeft: rootLeft + contentLeft,
238
- contentRight: rootLeft + contentLeft + contentWidth,
239
- rootLeft,
240
- rootRight: rootLeft + rootWidth
241
- };
242
- }
243
- calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth) {
244
- const nextTab = this.elRef.nativeElement.querySelector(`#${this.componentId}-tab-${nextIndex}`);
245
- const nextTabDimensions = this.computeDimensions(nextTab);
246
- const relativeContentLeft = nextTabDimensions.contentLeft - scrollPosition - barWidth;
247
- const relativeContentRight = nextTabDimensions.contentRight - scrollPosition;
248
- const leftIncrement = relativeContentRight - 48;
249
- const rightIncrement = relativeContentLeft + 48;
250
- if (nextIndex < index) {
251
- return Math.min(leftIncrement, 0);
252
- }
253
- return Math.max(rightIncrement, 0);
254
- }
255
- indexIsInRange(index) {
256
- return index >= 0 && index < this.tabs.length;
257
- }
258
- getScrollPosition() {
259
- const currentTranslateX = this.calculateCurrentTranslateX();
260
- const scrollLeft = this.elemScrollArea.scrollLeft;
261
- return scrollLeft - currentTranslateX;
262
- }
263
- calculateCurrentTranslateX() {
264
- const transformValue = this.getScrollContentStyleValue('transform');
265
- if (transformValue === 'none') {
266
- return 0;
267
- }
268
- // the transform value is in form of 'matrix(a, b, c, d, tx, ty)'
269
- // get all the parenthesized values
270
- const match = /\((.+?)\)/.exec(transformValue);
271
- if (!match) {
272
- return 0;
273
- }
274
- const matrixParams = match[1];
275
- // we need value of tx -> translateX
276
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
277
- const [a, b, c, d, tx, ty] = matrixParams.split(',');
278
- return parseFloat(tx);
279
- }
280
- getScrollContentStyleValue(propName) {
281
- return this.injectedWindow.getComputedStyle(this.elemScrollContent).getPropertyValue(propName);
282
- }
283
- setScrollContentStyleProperty(propName, value) {
284
- this.renderer.setStyle(this.elemScrollContent, propName, value);
285
- }
286
- findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth) {
287
- /**
288
- * tabs are laid out in the tab scroller like this:
289
- *
290
- * scroll position
291
- * +---+
292
- * | | bar width
293
- * | +-----------------------------------+
294
- * | | |
295
- * | v v
296
- * | +-----------------------------------+
297
- * v | tab scroller |
298
- * +------------+--------------+-------------------+
299
- * | tab | tab | tab |
300
- * +------------+--------------+-------------------+
301
- * | |
302
- * +-----------------------------------+
303
- *
304
- * to determine the next adjacent index, we look at the tab root left and
305
- * tab root right, both relative to the scroll position. if the tab root
306
- * left is less than 0, then we know it's out of view to the left. if the
307
- * tab root right minus the bar width is greater than 0, we know the tab is
308
- * out of view to the right. from there, we either increment or decrement
309
- * the index.
310
- */
311
- const relativeRootLeft = tabDimensions.rootLeft - scrollPosition;
312
- const relativeRootRight = tabDimensions.rootRight - scrollPosition - barWidth;
313
- const relativeRootDelta = relativeRootLeft + relativeRootRight;
314
- const leftEdgeIsCloser = relativeRootLeft < 0 || relativeRootDelta < 0;
315
- const rightEdgeIsCloser = relativeRootRight > 0 || relativeRootDelta > 0;
316
- if (leftEdgeIsCloser) {
317
- return index - 1;
318
- }
319
- if (rightEdgeIsCloser) {
320
- return index + 1;
321
- }
322
- return -1;
323
- }
324
- }
325
- TabsComponent.nextId = 0;
326
- TabsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: TabsComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
327
- TabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: TabsComponent, selector: "fng-tabs", inputs: { viewType: ["fngTabsViewType", "viewType"], showDivider: ["fngTabsUseBottomDivider", "showDivider"], config: "config" }, outputs: { fngTabChange: "fngTabChange" }, queries: [{ propertyName: "panes", predicate: TabPaneComponent }], viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }, { propertyName: "scrollAera", first: true, predicate: ["scrollAera"], descendants: true }, { propertyName: "scrollContent", first: true, predicate: ["scrollContent"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"viewType === 'legacy'\">\n <div class=\"fwe-legacy-tabs\">\n <ul\n role=\"tablist\"\n class=\"fwe-legacy-tab-bar\"\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\n >\n <li *ngFor=\"let tab of tabs; let i = index\" class=\"fwe-legacy-tab-item\" [class.fwe-active]=\"tab?.active\">\n <ng-container *ngIf=\"null == tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n >{{ tab.name }}</a\n >\n </ng-container>\n <ng-container *ngIf=\"null != tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\n >\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\n <span>{{ tab.name }}</span>\n </a>\n </ng-container>\n </li>\n </ul>\n <div class=\"fwe-legacy-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewType !== 'legacy'\">\n <div class=\"fng-tab-bar\" role=\"tablist\">\n <div class=\"fng-tab-scroller\" #scroller>\n <div\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\n #scrollAera\n >\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\n <button\n *ngFor=\"let tab of tabs; let i = index\"\n role=\"tab\"\n class=\"fng-tab\"\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n [tabindex]=\"i === 0 ? 0 : -1\"\n [class.fng-tab--active]=\"tab?.active\"\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\n >\n <span class=\"fng-tab-content\">\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\n </span>\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\n </span>\n </button>\n <div class=\"fng-tab-scroller-divider-line\"></div>\n </div>\n </div>\n </div>\n <div class=\"fng-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-template #tabPanelContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: [".fwe-legacy-tabs{margin:48px 0;width:100%;height:100%}.fwe-legacy-tab-bar{display:flex;flex-wrap:nowrap;width:75%;padding-left:0;margin-bottom:0;margin-top:0;list-style:none;font-size:16px}.fwe-legacy-tab-bar.fwe-legacy-tab-bar-full-width{width:100%}.fwe-legacy-tab-bar.fwe-legacy-tab-items-fill .fwe-legacy-tab-item{flex:1 1 auto}.fwe-legacy-tab-bar.fwe-legacy-tab-items-equal-width .fwe-legacy-tab-item{flex:1 1 0}.fwe-legacy-tab-item{height:48px;max-height:48px;background-color:var(--fwe-gray-300);border-right:2px solid var(--fwe-gray-100);text-align:center}.fwe-legacy-tab-item:last-child{border-right:none}.fwe-legacy-tab-item.fwe-active{background-color:var(--fwe-white)}.fwe-legacy-tab-item.fwe-active .fwe-legacy-tab-link{color:var(--fwe-caerul)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-gray-100)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{padding:11px 16px}.fwe-legacy-tab-link{display:inline-block;width:100%;height:48px;padding:11px 16px 13px;line-height:24px;cursor:pointer;color:var(--fwe-black);white-space:nowrap}.fwe-legacy-tab-link i.fwe-icon{padding-right:8px;vertical-align:baseline;vertical-align:initial}.fwe-legacy-tab-link i.fwe-icon.fwe-icon-lg{position:relative;top:3px}.fwe-legacy-tab-link:hover{color:var(--fwe-caerul)}.fwe-legacy-tab-link:active{background-color:var(--fwe-white);color:var(--fwe-caerul)}.fwe-legacy-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}@media (max-width: 375px){.fwe-legacy-tab-bar{justify-content:space-between;background-color:var(--fwe-white);width:100%}.fwe-legacy-tab-item{background-color:var(--fwe-white);border-right:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active){border-bottom:2px solid var(--fwe-white)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link{color:var(--fwe-icon-gray)}.fwe-legacy-tab-item:not(.fwe-active) .fwe-legacy-tab-link i.fwe-icon{color:var(--fwe-icon-gray)}.fwe-legacy-tab-link.fwe-can-swap-icon{direction:rtl}.fwe-legacy-tab-link.fwe-can-swap-icon i.fwe-icon{padding-left:8px;padding-right:0}}.fng-tab-panel-content{padding:48px 24px;background-color:var(--fwe-white);height:100%;overflow:auto}.fng-tab-bar{width:100%}.fng-tab-scroller{overflow-y:hidden}.fng-tab-scroller-scroll-area{position:relative;display:flex;overflow-x:hidden}.fng-tab-scroller-scroll-area::-webkit-scrollbar{display:none}.fng-tab-scroller-scroll-area--scroll{overflow-x:scroll}.fng-tab-scroller-scroll-content{position:relative;display:flex;flex:1 0 auto;transform:none;will-change:transform;padding:0 17px 0 16px}.fng-tab-scroller-scroll-content--with-divider .fng-tab-scroller-divider-line{display:block}.fng-tab-scroller--animating .fng-tab-scroller-scroll-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-scroller-divider-line{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-bottom:1px solid var(--fwe-control)}.fng-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.fng-tab-indicator-content{transform-origin:left;opacity:0}.fng-tab-indicator-content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.fng-tab-indicator .fng-tab-indicator-content{transition:.25s transform cubic-bezier(.4,0,.2,1)}.fng-tab-indicator .fng-tab-indicator-content--underline{border-top:4px solid var(--fwe-caerul)}.fng-tab-indicator--active .fng-tab-indicator-content{opacity:1}.fng-tab{position:relative;display:flex;flex:1 0 auto;justify-content:center;padding:0;margin:0;border:none;outline:none;background:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1;height:36px}.fng-tab:not(:last-child){margin-right:32px}.fng-tab::-moz-focus-inner{padding:0;border:0}.fng-tab .fng-tab-text-label{color:var(--fwe-text)}.fng-tab--active .fng-tab-text-label{color:var(--fwe-caerul)}.fng-tab-content{position:relative;display:flex;align-items:flex-start;justify-content:center;height:inherit;pointer-events:none}.fng-tab-text-label{display:inline-block;z-index:2}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab{flex:none}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab:not(:last-child){margin-right:64px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-scroll-content{padding:0 32px}.fng-tab-scroller-scroll-area:not(.fng-tab-scroller-scroll-area--compact) .fng-tab-scroller-divider-line{padding-right:64px}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
328
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: TabsComponent, decorators: [{
329
- type: Component,
330
- args: [{
331
- selector: 'fng-tabs',
332
- templateUrl: './tabs.component.html',
333
- styleUrls: ['./tabs.component.scss'],
334
- changeDetection: ChangeDetectionStrategy.OnPush
335
- }]
336
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Document, decorators: [{
337
- type: Inject,
338
- args: [DOCUMENT]
339
- }] }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { viewType: [{
340
- type: Input,
341
- args: ['fngTabsViewType']
342
- }], showDivider: [{
343
- type: Input,
344
- args: ['fngTabsUseBottomDivider']
345
- }], config: [{
346
- type: Input
347
- }], fngTabChange: [{
348
- type: Output
349
- }], panes: [{
350
- type: ContentChildren,
351
- args: [TabPaneComponent]
352
- }], scroller: [{
353
- type: ViewChild,
354
- args: ['scroller']
355
- }], scrollAera: [{
356
- type: ViewChild,
357
- args: ['scrollAera']
358
- }], scrollContent: [{
359
- type: ViewChild,
360
- args: ['scrollContent']
361
- }] } });
362
- //# sourceMappingURL=tabs.component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.component.js","sourceRoot":"","sources":["../../../../../../../libs/angular/src/lib/components/tabs/tabs.component.ts","../../../../../../../libs/angular/src/lib/components/tabs/tabs.component.html"],"names":[],"mappings":"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","sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n Output,\n QueryList,\n Renderer2,\n ViewChild\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { TabPaneComponent } from './tab-pane/tab-pane.component';\n\nexport interface Tab {\n name: string;\n paneId: string;\n active?: boolean;\n icon?: string;\n}\n\n// fill: use the remaining space and add in same proportion to every tab item\n// equal: make all tab items same width (as the one with largest content)\nexport type TabItemAppearance = 'fill' | 'equal' | 'default';\n\n// legacy: recommended for desktop only applications\n// responsive: desktop, tablet, mobile with scrollable tabs\nexport type TabViewType = 'legacy' | 'responsive';\n\n// configuration options for legacy tab view type\nexport interface TabsConfiguration {\n tabBar?: {\n fullWidth?: boolean;\n };\n tabItems?: {\n appearance: TabItemAppearance;\n };\n}\n\n// provides details about the left and right edges of the tab element and the tab content element\n// these values are used to determine the visual position of the tab with respect of its parent container\nexport interface TabDimensions {\n rootLeft: number;\n rootRight: number;\n contentLeft: number;\n contentRight: number;\n}\n\nexport interface TabScrollAnimation {\n finalScrollPosition: number;\n scrollDelta: number;\n}\n\nexport interface TabScrollHorizontalEdges {\n left: number;\n right: number;\n}\n\n@Component({\n selector: 'fng-tabs',\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TabsComponent implements AfterContentInit, AfterViewInit, OnDestroy {\n static nextId = 0;\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('fngTabsViewType') viewType: TabViewType = 'responsive';\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('fngTabsUseBottomDivider') showDivider: boolean = false;\n\n @Input() config: TabsConfiguration = null;\n @Output() fngTabChange = new EventEmitter<{ previous: string; current: string }>();\n\n @ContentChildren(TabPaneComponent) panes: QueryList<TabPaneComponent>;\n @ViewChild('scroller') scroller: ElementRef;\n @ViewChild('scrollAera') scrollAera: ElementRef;\n @ViewChild('scrollContent') scrollContent: ElementRef;\n\n componentId = `tabs-${++TabsComponent.nextId}`;\n tabs: Tab[] = [];\n useCompactDensity: boolean = true;\n private activeTab: Tab = null;\n private elemScroller: HTMLElement;\n private elemScrollArea: HTMLElement;\n private elemScrollContent: HTMLElement;\n private readonly injectedWindow: Window;\n private resizeObserver: ResizeObserver;\n private complete: Subject<boolean> = new Subject();\n\n constructor(\n private elRef: ElementRef,\n @Inject(DOCUMENT) private document: Document,\n private renderer: Renderer2,\n private cd: ChangeDetectorRef\n ) {\n this.injectedWindow = this.document.defaultView;\n }\n\n ngAfterContentInit() {\n this.initTabs();\n if (null === this.activeTab) {\n this.panes.map((pane, i) => {\n if (0 === i) {\n pane.isVisible = true;\n }\n });\n } else {\n this.panes.find(pane => null != this.activeTab.paneId && pane.tabPaneId === this.activeTab.paneId).isVisible = true;\n }\n }\n\n ngAfterViewInit(): void {\n this.elemScroller = this.scroller?.nativeElement;\n this.elemScrollArea = this.scrollAera?.nativeElement;\n this.elemScrollContent = this.scrollContent?.nativeElement;\n const initialWidth = this.elemScrollArea?.offsetWidth;\n if (initialWidth > 768) {\n this.useCompactDensity = false;\n this.cd.detectChanges();\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n const width = this.elemScrollArea.offsetWidth;\n if (width > 768 && this.useCompactDensity === true) {\n this.useCompactDensity = false;\n this.cd.detectChanges();\n } else if (width <= 768 && this.useCompactDensity === false) {\n this.useCompactDensity = true;\n this.cd.detectChanges();\n }\n });\n\n if (this.elemScrollArea != null) {\n this.resizeObserver.observe(this.elemScrollArea);\n }\n\n this.handleTabPaneChanges();\n }\n\n ngOnDestroy(): void {\n this.complete.next(true);\n this.complete.unsubscribe();\n }\n\n showTabPane(id: string) {\n const pane = this.panes.find(p => p.tabPaneId === id);\n if (null != pane) {\n this.panes.map(p => {\n p.isVisible = false;\n });\n pane.isVisible = true;\n\n this.tabs.map(tab => {\n if (tab.paneId !== pane.tabPaneId) {\n tab.active = false;\n } else {\n tab.active = true;\n }\n });\n this.fngTabChange.emit({\n previous: this.activeTab?.paneId,\n current: id\n });\n this.activeTab = this.tabs.find(tab => !!tab.active);\n }\n }\n\n handleTabScroll(event: any, index: number) {\n const scrollContentWidth = this.elemScrollContent.offsetWidth;\n const scrollAreaWidth = this.elemScrollArea.offsetWidth;\n\n // check if no scroll is needed\n if (scrollAreaWidth > scrollContentWidth) {\n return;\n }\n\n // check index\n if (!this.indexIsInRange(index)) {\n return;\n }\n\n // always scroll to 0 if scrolling to the first tab\n if (index === 0) {\n this.scrollTo(0);\n return;\n }\n\n // always scroll to the max value if scrolling to the last tab\n if (index === this.tabs.length - 1) {\n this.scrollTo(this.elemScrollContent.offsetWidth);\n return;\n }\n\n const currentTab: HTMLElement = event.target;\n this.scrollIntoView(index, currentTab);\n }\n\n private initTabs() {\n this.tabs = [];\n this.panes.map((pane, i) => {\n pane.tabId = this.componentId + '-tab-' + i;\n const tab: Tab = {\n name: null != pane.name ? pane.name : '',\n paneId: null != pane.tabPaneId ? pane.tabPaneId : null,\n icon: null != pane.icon ? pane.icon : null,\n active: null != pane.active ? pane.active : false\n };\n this.tabs.push(tab);\n });\n\n this.initActiveTab();\n this.cd.detectChanges();\n }\n\n private initActiveTab() {\n const activeTab: Tab = this.tabs.find((tab: Tab) => !!tab.active);\n if (!activeTab && 0 < this.tabs.length) {\n this.tabs[0] = { ...this.tabs[0], active: true };\n this.activeTab = this.tabs[0];\n } else {\n this.activeTab = activeTab;\n }\n }\n\n private handleTabPaneChanges() {\n // first subscribe to any changes in tab pane, so that the tabs in this view wiil be updated\n this.panes.forEach(pane => {\n pane.changes$.pipe(takeUntil(this.complete)).subscribe(() => {\n // on changes in a tab pane, we init the tabs again\n this.initTabs();\n });\n });\n }\n\n private scrollTo(scrollX: number) {\n const currentScrollX = this.getScrollPosition();\n const safeScrollX = this.clampScrollValue(scrollX);\n const scrollDelta = safeScrollX - currentScrollX;\n this.animate({\n finalScrollPosition: safeScrollX,\n scrollDelta\n });\n }\n\n private scrollIntoView(index: number, tab: HTMLElement) {\n const scrollPosition = this.getScrollPosition();\n const barWidth = this.elemScrollArea.offsetWidth;\n const tabDimensions = this.computeDimensions(tab);\n const nextIndex = this.findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth);\n\n if (!this.indexIsInRange(nextIndex)) {\n return;\n }\n\n const scrollIncrement = this.calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth);\n this.incrementScroll(scrollIncrement);\n }\n\n private incrementScroll(scrollXIncrement: number) {\n // no scroll needed\n if (scrollXIncrement === 0) {\n return;\n }\n const scrollOperation = this.getIncrementScrollOperation(scrollXIncrement);\n this.animate(scrollOperation);\n }\n\n private animate(animation: TabScrollAnimation) {\n // no animation needed\n if (animation.scrollDelta === 0) {\n return;\n }\n\n this.stopScrollAnimation();\n\n // this animation uses the flip approach\n // https://aerotwist.com/blog/flip-your-animations/\n // https://css-tricks.com/animating-layouts-with-the-flip-technique/\n this.elemScrollArea.scrollLeft = animation.finalScrollPosition;\n this.setScrollContentStyleProperty('transform', `translateX(${animation.scrollDelta}px)`);\n // force repaint\n this.elemScrollArea.getBoundingClientRect();\n\n requestAnimationFrame(() => {\n this.renderer.addClass(this.elemScroller, 'fng-tab-scroller--animating');\n this.setScrollContentStyleProperty('transform', 'none');\n });\n }\n\n private stopScrollAnimation() {\n const currentScrollPosition = this.getAnimatingScrollPosition();\n this.renderer.removeClass(this.elemScroller, 'fng-tab-scroller--animating');\n this.setScrollContentStyleProperty('transform', 'translateX(0px)');\n this.elemScrollArea.scrollLeft = currentScrollPosition;\n }\n\n private getAnimatingScrollPosition(): number {\n const currentTranslateX = this.calculateCurrentTranslateX();\n const scrollLeft = this.elemScrollArea.scrollLeft;\n return scrollLeft - currentTranslateX;\n }\n\n private getIncrementScrollOperation(scrollX: number): TabScrollAnimation {\n const currentScrollX = this.getScrollPosition();\n const targetScrollX = scrollX + currentScrollX;\n const safeScrollX = this.clampScrollValue(targetScrollX);\n const scrollDelta = safeScrollX - currentScrollX;\n return {\n finalScrollPosition: safeScrollX,\n scrollDelta\n };\n }\n\n private clampScrollValue(scrollX: number): number {\n const edges = this.calculateScrollEdges();\n return Math.min(Math.max(edges.left, scrollX), edges.right);\n }\n\n private calculateScrollEdges(): TabScrollHorizontalEdges {\n const scrollContentWidth = this.elemScrollContent.offsetWidth;\n const scrollAreaWidth = this.elemScrollArea.offsetWidth;\n return {\n left: 0,\n right: scrollContentWidth - scrollAreaWidth\n };\n }\n\n private computeDimensions(tab: HTMLElement): TabDimensions {\n const rootWidth = tab.offsetWidth;\n const rootLeft = tab.offsetLeft;\n\n const tabContent: HTMLElement = tab.querySelector<HTMLElement>('.fng-tab-content');\n const contentWidth = tabContent.offsetWidth;\n const contentLeft = tabContent.offsetLeft;\n\n return {\n contentLeft: rootLeft + contentLeft,\n contentRight: rootLeft + contentLeft + contentWidth,\n rootLeft,\n rootRight: rootLeft + rootWidth\n };\n }\n\n private calculateScrollIncrement(index: number, nextIndex: number, scrollPosition: number, barWidth: number): number {\n const nextTab: HTMLElement = (this.elRef.nativeElement as HTMLElement).querySelector<HTMLElement>(\n `#${this.componentId}-tab-${nextIndex}`\n );\n const nextTabDimensions = this.computeDimensions(nextTab);\n const relativeContentLeft = nextTabDimensions.contentLeft - scrollPosition - barWidth;\n const relativeContentRight = nextTabDimensions.contentRight - scrollPosition;\n const leftIncrement = relativeContentRight - 48;\n const rightIncrement = relativeContentLeft + 48;\n\n if (nextIndex < index) {\n return Math.min(leftIncrement, 0);\n }\n\n return Math.max(rightIncrement, 0);\n }\n\n private indexIsInRange(index: number) {\n return index >= 0 && index < this.tabs.length;\n }\n\n private getScrollPosition(): number {\n const currentTranslateX = this.calculateCurrentTranslateX();\n const scrollLeft = this.elemScrollArea.scrollLeft;\n\n return scrollLeft - currentTranslateX;\n }\n\n private calculateCurrentTranslateX(): number {\n const transformValue = this.getScrollContentStyleValue('transform');\n if (transformValue === 'none') {\n return 0;\n }\n\n // the transform value is in form of 'matrix(a, b, c, d, tx, ty)'\n // get all the parenthesized values\n const match = /\\((.+?)\\)/.exec(transformValue);\n if (!match) {\n return 0;\n }\n\n const matrixParams = match[1];\n // we need value of tx -> translateX\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [a, b, c, d, tx, ty] = matrixParams.split(',');\n return parseFloat(tx);\n }\n\n private getScrollContentStyleValue(propName: string) {\n return this.injectedWindow.getComputedStyle(this.elemScrollContent).getPropertyValue(propName);\n }\n\n private setScrollContentStyleProperty(propName: string, value: any) {\n this.renderer.setStyle(this.elemScrollContent, propName, value);\n }\n\n private findAdjacentTabIndexClosestToEdge(index: number, tabDimensions: TabDimensions, scrollPosition: number, barWidth: number): number {\n /**\n * tabs are laid out in the tab scroller like this:\n *\n * scroll position\n * +---+\n * | | bar width\n * | +-----------------------------------+\n * | | |\n * | v v\n * | +-----------------------------------+\n * v | tab scroller |\n * +------------+--------------+-------------------+\n * | tab | tab | tab |\n * +------------+--------------+-------------------+\n * | |\n * +-----------------------------------+\n *\n * to determine the next adjacent index, we look at the tab root left and\n * tab root right, both relative to the scroll position. if the tab root\n * left is less than 0, then we know it's out of view to the left. if the\n * tab root right minus the bar width is greater than 0, we know the tab is\n * out of view to the right. from there, we either increment or decrement\n * the index.\n */\n const relativeRootLeft = tabDimensions.rootLeft - scrollPosition;\n const relativeRootRight = tabDimensions.rootRight - scrollPosition - barWidth;\n const relativeRootDelta = relativeRootLeft + relativeRootRight;\n const leftEdgeIsCloser = relativeRootLeft < 0 || relativeRootDelta < 0;\n const rightEdgeIsCloser = relativeRootRight > 0 || relativeRootDelta > 0;\n\n if (leftEdgeIsCloser) {\n return index - 1;\n }\n\n if (rightEdgeIsCloser) {\n return index + 1;\n }\n\n return -1;\n }\n}\n","<ng-container *ngIf=\"viewType === 'legacy'\">\n <div class=\"fwe-legacy-tabs\">\n <ul\n role=\"tablist\"\n class=\"fwe-legacy-tab-bar\"\n [class.fwe-legacy-tab-bar-full-width]=\"config?.tabBar?.fullWidth\"\n [class.fwe-legacy-tab-items-equal-width]=\"'equal' === config?.tabItems?.appearance\"\n [class.fwe-legacy-tab-items-fill]=\"'fill' === config?.tabItems?.appearance\"\n >\n <li *ngFor=\"let tab of tabs; let i = index\" class=\"fwe-legacy-tab-item\" [class.fwe-active]=\"tab?.active\">\n <ng-container *ngIf=\"null == tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n >{{ tab.name }}</a\n >\n </ng-container>\n <ng-container *ngIf=\"null != tab?.icon\">\n <a\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n role=\"tab\"\n class=\"fwe-legacy-tab-link\"\n (click)=\"showTabPane(tab.paneId)\"\n [class.fwe-can-swap-icon]=\"2 === tabs.length && 1 === i\"\n >\n <i [class]=\"'fwe-icon ' + tab.icon\"></i>\n <span>{{ tab.name }}</span>\n </a>\n </ng-container>\n </li>\n </ul>\n <div class=\"fwe-legacy-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"viewType !== 'legacy'\">\n <div class=\"fng-tab-bar\" role=\"tablist\">\n <div class=\"fng-tab-scroller\" #scroller>\n <div\n class=\"fng-tab-scroller-scroll-area fng-tab-scroller-scroll-area--scroll\"\n [class.fng-tab-scroller-scroll-area--compact]=\"useCompactDensity\"\n #scrollAera\n >\n <div class=\"fng-tab-scroller-scroll-content\" [class.fng-tab-scroller-scroll-content--with-divider]=\"showDivider\" #scrollContent>\n <button\n *ngFor=\"let tab of tabs; let i = index\"\n role=\"tab\"\n class=\"fng-tab\"\n [id]=\"componentId + '-tab-' + i\"\n [attr.aria-controls]=\"tab.paneId\"\n [attr.aria-selected]=\"true === tab?.active ? 'true' : 'false'\"\n [tabindex]=\"i === 0 ? 0 : -1\"\n [class.fng-tab--active]=\"tab?.active\"\n (click)=\"handleTabScroll($event, i); showTabPane(tab.paneId)\"\n >\n <span class=\"fng-tab-content\">\n <span class=\"fng-tab-text-label\">{{ tab.name }}</span>\n </span>\n <span class=\"fng-tab-indicator\" [class.fng-tab-indicator--active]=\"tab?.active\">\n <span class=\"fng-tab-indicator-content fng-tab-indicator-content--underline\"></span>\n </span>\n </button>\n <div class=\"fng-tab-scroller-divider-line\"></div>\n </div>\n </div>\n </div>\n <div class=\"fng-tab-panel-content\">\n <ng-container *ngTemplateOutlet=\"tabPanelContent\"></ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-template #tabPanelContent>\n <ng-content></ng-content>\n</ng-template>\n"]}
@@ -1,24 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { IconComponent } from './icon/icon.component';
4
- import * as i0 from "@angular/core";
5
- export * from './icon/icon.component';
6
- export class FestoAngularContentModule {
7
- }
8
- FestoAngularContentModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: FestoAngularContentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
9
- FestoAngularContentModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: FestoAngularContentModule, declarations: [IconComponent], imports: [CommonModule], exports: [IconComponent] });
10
- FestoAngularContentModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: FestoAngularContentModule, providers: [], imports: [[CommonModule]] });
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: FestoAngularContentModule, decorators: [{
12
- type: NgModule,
13
- args: [{
14
- declarations: [
15
- IconComponent
16
- ],
17
- imports: [CommonModule],
18
- exports: [
19
- IconComponent
20
- ],
21
- providers: [],
22
- }]
23
- }] });
24
- //# sourceMappingURL=content.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"content.module.js","sourceRoot":"","sources":["../../../../../../libs/angular/src/lib/content/content.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;;AAEtD,cAAc,uBAAuB,CAAC;AAYtC,MAAM,OAAO,yBAAyB;;sHAAzB,yBAAyB;uHAAzB,yBAAyB,iBARlC,aAAa,aAEJ,YAAY,aAErB,aAAa;uHAIJ,yBAAyB,aAFzB,EAAE,YAJJ,CAAE,YAAY,CAAE;2FAMd,yBAAyB;kBAVrC,QAAQ;mBAAC;oBACR,YAAY,EAAE;wBACZ,aAAa;qBACd;oBACD,OAAO,EAAE,CAAE,YAAY,CAAE;oBACzB,OAAO,EAAE;wBACP,aAAa;qBACd;oBACD,SAAS,EAAE,EAAE;iBACd","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IconComponent } from './icon/icon.component';\n\nexport * from './icon/icon.component';\n\n@NgModule({\n declarations: [\n IconComponent\n ],\n imports: [ CommonModule ],\n exports: [\n IconComponent\n ],\n providers: [],\n})\nexport class FestoAngularContentModule {}\n"]}