@syncfusion/ej2-navigations 17.2.55-1205479 → 17.3.14-96615

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 (316) hide show
  1. package/.eslintrc.json +244 -0
  2. package/CHANGELOG.md +898 -786
  3. package/README.md +163 -163
  4. package/dist/ej2-navigations.umd.min.js +1 -10
  5. package/dist/ej2-navigations.umd.min.js.map +1 -1
  6. package/dist/es6/ej2-navigations.es2015.js +512 -255
  7. package/dist/es6/ej2-navigations.es2015.js.map +1 -1
  8. package/dist/es6/ej2-navigations.es5.js +642 -385
  9. package/dist/es6/ej2-navigations.es5.js.map +1 -1
  10. package/dist/global/ej2-navigations.min.js +1 -10
  11. package/dist/global/ej2-navigations.min.js.map +1 -1
  12. package/dist/global/index.d.ts +0 -9
  13. package/dist/ts/accordion/accordion.ts +1312 -0
  14. package/dist/ts/common/h-scroll.ts +459 -0
  15. package/dist/ts/common/menu-base.ts +2131 -0
  16. package/dist/ts/common/v-scroll.ts +430 -0
  17. package/dist/ts/context-menu/context-menu.ts +119 -0
  18. package/dist/ts/menu/menu.ts +270 -0
  19. package/dist/ts/sidebar/sidebar.ts +817 -0
  20. package/dist/ts/tab/tab.ts +1761 -0
  21. package/dist/ts/toolbar/toolbar.ts +2076 -0
  22. package/dist/ts/treeview/treeview.ts +5050 -0
  23. package/helpers/e2e/index.js +3 -3
  24. package/license +10 -10
  25. package/package.json +135 -145
  26. package/src/accordion/accordion-model.d.ts +162 -143
  27. package/src/accordion/accordion.d.ts +35 -6
  28. package/src/accordion/accordion.js +193 -71
  29. package/src/common/h-scroll-model.d.ts +5 -5
  30. package/src/common/h-scroll.js +19 -20
  31. package/src/common/index.d.ts +1 -0
  32. package/src/common/index.js +1 -0
  33. package/src/common/menu-base-model.d.ts +157 -157
  34. package/src/common/menu-base.d.ts +19 -0
  35. package/src/common/menu-base.js +97 -24
  36. package/src/common/v-scroll-model.d.ts +5 -5
  37. package/src/common/v-scroll.js +19 -19
  38. package/src/context-menu/context-menu-model.d.ts +15 -15
  39. package/src/context-menu/context-menu.js +19 -19
  40. package/src/menu/menu-model.d.ts +30 -30
  41. package/src/menu/menu.js +19 -19
  42. package/src/sidebar/sidebar-model.d.ts +136 -136
  43. package/src/sidebar/sidebar.js +19 -19
  44. package/src/tab/tab-model.d.ts +215 -215
  45. package/src/tab/tab.d.ts +3 -0
  46. package/src/tab/tab.js +120 -83
  47. package/src/toolbar/toolbar-model.d.ts +175 -175
  48. package/src/toolbar/toolbar.d.ts +2 -1
  49. package/src/toolbar/toolbar.js +30 -24
  50. package/src/treeview/treeview-model.d.ts +323 -323
  51. package/src/treeview/treeview.d.ts +3 -1
  52. package/src/treeview/treeview.js +107 -87
  53. package/styles/accordion/_all.scss +2 -2
  54. package/styles/accordion/_bootstrap-dark-definition.scss +69 -69
  55. package/styles/accordion/_bootstrap-definition.scss +76 -76
  56. package/styles/accordion/_bootstrap4-definition.scss +82 -82
  57. package/styles/accordion/_fabric-dark-definition.scss +74 -74
  58. package/styles/accordion/_fabric-definition.scss +78 -78
  59. package/styles/accordion/_highcontrast-definition.scss +106 -106
  60. package/styles/accordion/_highcontrast-light-definition.scss +104 -104
  61. package/styles/accordion/_layout.scss +447 -447
  62. package/styles/accordion/_material-dark-definition.scss +75 -75
  63. package/styles/accordion/_material-definition.scss +72 -72
  64. package/styles/accordion/_theme.scss +479 -479
  65. package/styles/accordion/icons/_bootstrap-dark.scss +17 -17
  66. package/styles/accordion/icons/_bootstrap.scss +17 -17
  67. package/styles/accordion/icons/_bootstrap4.scss +17 -17
  68. package/styles/accordion/icons/_fabric-dark.scss +17 -17
  69. package/styles/accordion/icons/_fabric.scss +17 -17
  70. package/styles/accordion/icons/_highcontrast-light.scss +17 -17
  71. package/styles/accordion/icons/_highcontrast.scss +17 -17
  72. package/styles/accordion/icons/_material-dark.scss +17 -17
  73. package/styles/accordion/icons/_material.scss +17 -17
  74. package/styles/accordion/material-dark.css +2 -2
  75. package/styles/bootstrap-dark.css +10 -9
  76. package/styles/bootstrap.css +10 -9
  77. package/styles/bootstrap4.css +10 -9
  78. package/styles/bootstrap5-dark.css +0 -0
  79. package/styles/bootstrap5-dark.scss +0 -0
  80. package/styles/bootstrap5.css +0 -0
  81. package/styles/bootstrap5.scss +0 -0
  82. package/styles/context-menu/_all.scss +2 -2
  83. package/styles/context-menu/_bootstrap-dark-definition.scss +54 -54
  84. package/styles/context-menu/_bootstrap-definition.scss +52 -52
  85. package/styles/context-menu/_bootstrap4-definition.scss +52 -52
  86. package/styles/context-menu/_fabric-dark-definition.scss +54 -54
  87. package/styles/context-menu/_fabric-definition.scss +52 -52
  88. package/styles/context-menu/_highcontrast-definition.scss +52 -52
  89. package/styles/context-menu/_highcontrast-light-definition.scss +54 -54
  90. package/styles/context-menu/_layout-mixin.scss +175 -174
  91. package/styles/context-menu/_layout.scss +70 -70
  92. package/styles/context-menu/_material-dark-definition.scss +54 -54
  93. package/styles/context-menu/_material-definition.scss +52 -52
  94. package/styles/context-menu/_theme-mixin.scss +59 -59
  95. package/styles/context-menu/_theme.scss +36 -36
  96. package/styles/context-menu/bootstrap-dark.css +1 -1
  97. package/styles/context-menu/bootstrap.css +1 -1
  98. package/styles/context-menu/bootstrap4.css +1 -1
  99. package/styles/context-menu/fabric-dark.css +1 -1
  100. package/styles/context-menu/fabric.css +1 -1
  101. package/styles/context-menu/highcontrast-light.css +1 -1
  102. package/styles/context-menu/highcontrast.css +1 -1
  103. package/styles/context-menu/icons/_bootstrap-dark.scss +30 -30
  104. package/styles/context-menu/icons/_bootstrap.scss +30 -30
  105. package/styles/context-menu/icons/_bootstrap4.scss +30 -30
  106. package/styles/context-menu/icons/_fabric-dark.scss +30 -30
  107. package/styles/context-menu/icons/_fabric.scss +30 -30
  108. package/styles/context-menu/icons/_highcontrast-light.scss +30 -30
  109. package/styles/context-menu/icons/_highcontrast.scss +30 -30
  110. package/styles/context-menu/icons/_material-dark.scss +30 -30
  111. package/styles/context-menu/icons/_material.scss +30 -30
  112. package/styles/context-menu/material-dark.css +1 -1
  113. package/styles/context-menu/material.css +4 -4
  114. package/styles/fabric-dark.css +10 -9
  115. package/styles/fabric.css +10 -9
  116. package/styles/h-scroll/_all.scss +2 -2
  117. package/styles/h-scroll/_bootstrap-dark-definition.scss +49 -49
  118. package/styles/h-scroll/_bootstrap-definition.scss +50 -50
  119. package/styles/h-scroll/_bootstrap4-definition.scss +49 -49
  120. package/styles/h-scroll/_fabric-dark-definition.scss +50 -50
  121. package/styles/h-scroll/_fabric-definition.scss +48 -48
  122. package/styles/h-scroll/_highcontrast-definition.scss +52 -52
  123. package/styles/h-scroll/_highcontrast-light-definition.scss +54 -54
  124. package/styles/h-scroll/_layout.scss +198 -198
  125. package/styles/h-scroll/_material-dark-definition.scss +77 -77
  126. package/styles/h-scroll/_material-definition.scss +77 -77
  127. package/styles/h-scroll/_theme.scss +157 -157
  128. package/styles/h-scroll/icons/_bootstrap-dark.scss +49 -49
  129. package/styles/h-scroll/icons/_bootstrap.scss +49 -49
  130. package/styles/h-scroll/icons/_bootstrap4.scss +49 -49
  131. package/styles/h-scroll/icons/_fabric-dark.scss +49 -49
  132. package/styles/h-scroll/icons/_fabric.scss +49 -49
  133. package/styles/h-scroll/icons/_highcontrast-light.scss +49 -49
  134. package/styles/h-scroll/icons/_highcontrast.scss +49 -49
  135. package/styles/h-scroll/icons/_material-dark.scss +49 -49
  136. package/styles/h-scroll/icons/_material.scss +49 -49
  137. package/styles/highcontrast-light.css +10 -9
  138. package/styles/highcontrast.css +10 -9
  139. package/styles/material-dark.css +12 -11
  140. package/styles/material.css +24 -14
  141. package/styles/menu/_all.scss +2 -2
  142. package/styles/menu/_bootstrap-dark-definition.scss +63 -63
  143. package/styles/menu/_bootstrap-definition.scss +65 -65
  144. package/styles/menu/_bootstrap4-definition.scss +64 -64
  145. package/styles/menu/_fabric-dark-definition.scss +63 -63
  146. package/styles/menu/_fabric-definition.scss +64 -64
  147. package/styles/menu/_highcontrast-definition.scss +65 -65
  148. package/styles/menu/_highcontrast-light-definition.scss +61 -61
  149. package/styles/menu/_layout.scss +638 -637
  150. package/styles/menu/_material-dark-definition.scss +63 -63
  151. package/styles/menu/_material-definition.scss +64 -64
  152. package/styles/menu/_theme.scss +243 -243
  153. package/styles/menu/bootstrap-dark.css +2 -1
  154. package/styles/menu/bootstrap.css +2 -1
  155. package/styles/menu/bootstrap.scss +1 -0
  156. package/styles/menu/bootstrap4.css +2 -1
  157. package/styles/menu/fabric-dark.css +2 -1
  158. package/styles/menu/fabric.css +2 -1
  159. package/styles/menu/fabric.scss +1 -0
  160. package/styles/menu/highcontrast-light.css +2 -1
  161. package/styles/menu/highcontrast.css +2 -1
  162. package/styles/menu/highcontrast.scss +1 -0
  163. package/styles/menu/icons/_bootstrap-dark.scss +127 -127
  164. package/styles/menu/icons/_bootstrap.scss +127 -127
  165. package/styles/menu/icons/_bootstrap4.scss +127 -127
  166. package/styles/menu/icons/_fabric-dark.scss +127 -127
  167. package/styles/menu/icons/_fabric.scss +127 -127
  168. package/styles/menu/icons/_highcontrast-light.scss +127 -127
  169. package/styles/menu/icons/_highcontrast.scss +127 -127
  170. package/styles/menu/icons/_material-dark.scss +127 -127
  171. package/styles/menu/icons/_material.scss +127 -127
  172. package/styles/menu/material-dark.css +2 -1
  173. package/styles/menu/material.css +4 -3
  174. package/styles/menu/material.scss +1 -0
  175. package/styles/sidebar/_all.scss +3 -3
  176. package/styles/sidebar/_bootstrap-dark-definition.scss +4 -4
  177. package/styles/sidebar/_bootstrap-definition.scss +4 -4
  178. package/styles/sidebar/_bootstrap4-definition.scss +4 -4
  179. package/styles/sidebar/_fabric-dark-definition.scss +4 -4
  180. package/styles/sidebar/_fabric-definition.scss +6 -6
  181. package/styles/sidebar/_highcontrast-definition.scss +4 -4
  182. package/styles/sidebar/_highcontrast-light-definition.scss +4 -4
  183. package/styles/sidebar/_icons.scss +1 -1
  184. package/styles/sidebar/_material-dark-definition.scss +4 -4
  185. package/styles/sidebar/_material-definition.scss +6 -6
  186. package/styles/sidebar/_theme.scss +168 -168
  187. package/styles/sidebar/bootstrap-dark.css +0 -1
  188. package/styles/sidebar/bootstrap.css +0 -1
  189. package/styles/sidebar/bootstrap4.css +0 -1
  190. package/styles/sidebar/fabric-dark.css +0 -1
  191. package/styles/sidebar/fabric.css +0 -1
  192. package/styles/sidebar/highcontrast-light.css +0 -1
  193. package/styles/sidebar/highcontrast.css +0 -1
  194. package/styles/sidebar/material-dark.css +0 -1
  195. package/styles/sidebar/material.css +0 -1
  196. package/styles/tab/_all.scss +2 -2
  197. package/styles/tab/_bootstrap-dark-definition.scss +386 -386
  198. package/styles/tab/_bootstrap-definition.scss +396 -396
  199. package/styles/tab/_bootstrap4-definition.scss +401 -401
  200. package/styles/tab/_fabric-dark-definition.scss +394 -394
  201. package/styles/tab/_fabric-definition.scss +410 -410
  202. package/styles/tab/_highcontrast-definition.scss +434 -434
  203. package/styles/tab/_highcontrast-light-definition.scss +423 -423
  204. package/styles/tab/_icons.scss +43 -43
  205. package/styles/tab/_layout.scss +3528 -3521
  206. package/styles/tab/_material-dark-definition.scss +407 -407
  207. package/styles/tab/_material-definition.scss +416 -416
  208. package/styles/tab/_theme.scss +1751 -1751
  209. package/styles/tab/bootstrap-dark.css +7 -2
  210. package/styles/tab/bootstrap.css +7 -2
  211. package/styles/tab/bootstrap4.css +7 -2
  212. package/styles/tab/fabric-dark.css +7 -2
  213. package/styles/tab/fabric.css +7 -2
  214. package/styles/tab/highcontrast-light.css +7 -2
  215. package/styles/tab/highcontrast.css +7 -2
  216. package/styles/tab/icons/_bootstrap-dark.scss +132 -132
  217. package/styles/tab/icons/_bootstrap.scss +132 -132
  218. package/styles/tab/icons/_bootstrap4.scss +132 -132
  219. package/styles/tab/icons/_fabric-dark.scss +132 -132
  220. package/styles/tab/icons/_fabric.scss +132 -132
  221. package/styles/tab/icons/_highcontrast-light.scss +132 -132
  222. package/styles/tab/icons/_highcontrast.scss +132 -132
  223. package/styles/tab/icons/_material-dark.scss +132 -132
  224. package/styles/tab/icons/_material.scss +132 -132
  225. package/styles/tab/material-dark.css +7 -2
  226. package/styles/tab/material.css +7 -2
  227. package/styles/tailwind-dark.css +0 -0
  228. package/styles/tailwind-dark.scss +0 -0
  229. package/styles/tailwind.css +0 -0
  230. package/styles/tailwind.scss +0 -0
  231. package/styles/toolbar/_all.scss +2 -2
  232. package/styles/toolbar/_bootstrap-dark-definition.scss +135 -135
  233. package/styles/toolbar/_bootstrap-definition.scss +134 -134
  234. package/styles/toolbar/_bootstrap4-definition.scss +139 -139
  235. package/styles/toolbar/_fabric-dark-definition.scss +155 -155
  236. package/styles/toolbar/_fabric-definition.scss +139 -139
  237. package/styles/toolbar/_highcontrast-definition.scss +149 -149
  238. package/styles/toolbar/_highcontrast-light-definition.scss +164 -164
  239. package/styles/toolbar/_layout.scss +1460 -1460
  240. package/styles/toolbar/_material-dark-definition.scss +180 -180
  241. package/styles/toolbar/_material-definition.scss +164 -164
  242. package/styles/toolbar/_theme.scss +451 -451
  243. package/styles/toolbar/bootstrap-dark.css +0 -1
  244. package/styles/toolbar/bootstrap.css +0 -1
  245. package/styles/toolbar/bootstrap.scss +1 -0
  246. package/styles/toolbar/bootstrap4.css +0 -1
  247. package/styles/toolbar/fabric-dark.css +0 -1
  248. package/styles/toolbar/fabric.css +0 -1
  249. package/styles/toolbar/fabric.scss +1 -0
  250. package/styles/toolbar/highcontrast-light.css +0 -1
  251. package/styles/toolbar/highcontrast.css +0 -1
  252. package/styles/toolbar/highcontrast.scss +1 -0
  253. package/styles/toolbar/icons/_bootstrap-dark.scss +16 -16
  254. package/styles/toolbar/icons/_bootstrap.scss +16 -16
  255. package/styles/toolbar/icons/_bootstrap4.scss +16 -16
  256. package/styles/toolbar/icons/_fabric-dark.scss +16 -16
  257. package/styles/toolbar/icons/_fabric.scss +16 -16
  258. package/styles/toolbar/icons/_highcontrast-light.scss +16 -16
  259. package/styles/toolbar/icons/_highcontrast.scss +16 -16
  260. package/styles/toolbar/icons/_material-dark.scss +16 -16
  261. package/styles/toolbar/icons/_material.scss +16 -16
  262. package/styles/toolbar/material-dark.css +0 -1
  263. package/styles/toolbar/material.css +0 -1
  264. package/styles/toolbar/material.scss +1 -0
  265. package/styles/treeview/_all.scss +2 -2
  266. package/styles/treeview/_bootstrap-dark-definition.scss +131 -131
  267. package/styles/treeview/_bootstrap-definition.scss +127 -127
  268. package/styles/treeview/_bootstrap4-definition.scss +153 -153
  269. package/styles/treeview/_fabric-dark-definition.scss +130 -130
  270. package/styles/treeview/_fabric-definition.scss +126 -126
  271. package/styles/treeview/_highcontrast-definition.scss +132 -132
  272. package/styles/treeview/_highcontrast-light-definition.scss +137 -137
  273. package/styles/treeview/_layout.scss +551 -551
  274. package/styles/treeview/_material-dark-definition.scss +126 -126
  275. package/styles/treeview/_material-definition.scss +126 -126
  276. package/styles/treeview/_theme.scss +331 -331
  277. package/styles/treeview/bootstrap-dark.css +0 -3
  278. package/styles/treeview/bootstrap.css +0 -3
  279. package/styles/treeview/bootstrap4.css +0 -3
  280. package/styles/treeview/fabric-dark.css +0 -3
  281. package/styles/treeview/fabric.css +0 -3
  282. package/styles/treeview/highcontrast-light.css +0 -3
  283. package/styles/treeview/highcontrast.css +0 -3
  284. package/styles/treeview/icons/_bootstrap-dark.scss +39 -39
  285. package/styles/treeview/icons/_bootstrap.scss +39 -39
  286. package/styles/treeview/icons/_bootstrap4.scss +39 -39
  287. package/styles/treeview/icons/_fabric-dark.scss +43 -43
  288. package/styles/treeview/icons/_fabric.scss +43 -43
  289. package/styles/treeview/icons/_highcontrast-light.scss +43 -43
  290. package/styles/treeview/icons/_highcontrast.scss +43 -43
  291. package/styles/treeview/icons/_material-dark.scss +43 -43
  292. package/styles/treeview/icons/_material.scss +43 -43
  293. package/styles/treeview/material-dark.css +0 -3
  294. package/styles/treeview/material.css +9 -3
  295. package/styles/v-scroll/_all.scss +2 -2
  296. package/styles/v-scroll/_bootstrap-dark-definition.scss +50 -50
  297. package/styles/v-scroll/_bootstrap-definition.scss +49 -49
  298. package/styles/v-scroll/_bootstrap4-definition.scss +49 -49
  299. package/styles/v-scroll/_fabric-dark-definition.scss +51 -51
  300. package/styles/v-scroll/_fabric-definition.scss +50 -50
  301. package/styles/v-scroll/_highcontrast-definition.scss +51 -51
  302. package/styles/v-scroll/_highcontrast-light-definition.scss +52 -52
  303. package/styles/v-scroll/_layout.scss +162 -162
  304. package/styles/v-scroll/_material-dark-definition.scss +78 -78
  305. package/styles/v-scroll/_material-definition.scss +77 -77
  306. package/styles/v-scroll/_theme.scss +133 -133
  307. package/styles/v-scroll/icons/_bootstrap-dark.scss +26 -26
  308. package/styles/v-scroll/icons/_bootstrap.scss +26 -26
  309. package/styles/v-scroll/icons/_bootstrap4.scss +26 -26
  310. package/styles/v-scroll/icons/_fabric-dark.scss +26 -26
  311. package/styles/v-scroll/icons/_fabric.scss +26 -26
  312. package/styles/v-scroll/icons/_highcontrast-light.scss +26 -26
  313. package/styles/v-scroll/icons/_highcontrast.scss +26 -26
  314. package/styles/v-scroll/icons/_material-dark.scss +26 -26
  315. package/styles/v-scroll/icons/_material.scss +26 -26
  316. package/tslint.json +111 -0
@@ -0,0 +1,459 @@
1
+ import { Touch, ScrollEventArgs, TouchEventArgs, Component, EventHandler, selectAll, getUniqueID } from '@syncfusion/ej2-base';
2
+ import { NotifyPropertyChanges, INotifyPropertyChanged, Property, Browser, detach } from '@syncfusion/ej2-base';
3
+ import { classList, SwipeEventArgs, isNullOrUndefined} from '@syncfusion/ej2-base';
4
+ import { HScrollModel } from './h-scroll-model';
5
+
6
+ type HTEle = HTMLElement;
7
+ type Str = string;
8
+
9
+ const CLS_ROOT: Str = 'e-hscroll';
10
+ const CLS_RTL: Str = 'e-rtl';
11
+ const CLS_DISABLE: Str = 'e-overlay';
12
+ const CLS_HSCROLLBAR: Str = 'e-hscroll-bar';
13
+ const CLS_HSCROLLCON: Str = 'e-hscroll-content';
14
+ const CLS_NAVARROW: Str = 'e-nav-arrow';
15
+ const CLS_NAVRIGHTARROW: Str = 'e-nav-right-arrow';
16
+ const CLS_NAVLEFTARROW: Str = 'e-nav-left-arrow';
17
+ const CLS_HSCROLLNAV: Str = 'e-scroll-nav';
18
+ const CLS_HSCROLLNAVRIGHT: Str = 'e-scroll-right-nav';
19
+ const CLS_HSCROLLNAVLEFT: Str = 'e-scroll-left-nav';
20
+ const CLS_DEVICE: Str = 'e-scroll-device';
21
+ const CLS_OVERLAY: Str = 'e-scroll-overlay';
22
+ const CLS_RIGHTOVERLAY: Str = 'e-scroll-right-overlay';
23
+ const CLS_LEFTOVERLAY: Str = 'e-scroll-left-overlay';
24
+ const OVERLAY_MAXWID: number = 40;
25
+
26
+ interface TapEventArgs {
27
+ name: string;
28
+ originalEvent: TouchEventArgs | TouchEvent | KeyboardEvent;
29
+ }
30
+ /**
31
+ * HScroll module is introduces horizontal scroller when content exceeds the current viewing area.
32
+ * It can be useful for the components like Toolbar, Tab which needs horizontal scrolling alone.
33
+ * Hidden content can be view by touch moving or icon click.
34
+ * ```html
35
+ * <div id="scroll"/>
36
+ * <script>
37
+ * var scrollObj = new HScroll();
38
+ * scrollObj.appendTo("#scroll");
39
+ * </script>
40
+ * ```
41
+ */
42
+ @NotifyPropertyChanges
43
+ export class HScroll extends Component<HTMLElement> implements INotifyPropertyChanged {
44
+ private touchModule: Touch;
45
+ private scrollEle: HTEle;
46
+ private scrollItems: HTEle;
47
+ private uniqueId: Boolean;
48
+ private timeout: number;
49
+ private keyTimeout: Boolean;
50
+ private keyTimer: number;
51
+ private browser: String;
52
+ private browserCheck: Boolean;
53
+ private ieCheck: Boolean;
54
+ private isDevice: Boolean;
55
+ private customStep: Boolean;
56
+
57
+ /**
58
+ * Specifies the left or right scrolling distance of the horizontal scrollbar moving.
59
+ * @default null
60
+ */
61
+ @Property(null)
62
+ public scrollStep: number;
63
+ /**
64
+ * Initialize the event handler
65
+ * @private
66
+ */
67
+ protected preRender(): void {
68
+ this.browser = Browser.info.name;
69
+ this.browserCheck = this.browser === 'mozilla';
70
+ this.isDevice = Browser.isDevice;
71
+ this.customStep = true;
72
+ let element: HTEle = this.element;
73
+ this.ieCheck = this.browser === 'edge' || this.browser === 'msie';
74
+ this.initialize();
75
+ if (element.id === '') {
76
+ element.id = getUniqueID('hscroll');
77
+ this.uniqueId = true;
78
+ }
79
+ element.style.display = 'block';
80
+ if (this.enableRtl) {
81
+ element.classList.add(CLS_RTL);
82
+ }
83
+ }
84
+ /**
85
+ * To Initialize the horizontal scroll rendering
86
+ * @private
87
+ */
88
+ protected render(): void {
89
+ this.touchModule = new Touch(this.element, { scroll: this.touchHandler.bind(this), swipe: this.swipeHandler.bind(this) });
90
+ EventHandler.add(this.scrollEle, 'scroll', this.scrollHandler, this);
91
+ if ( !this.isDevice) {
92
+ this.createNavIcon(this.element);
93
+ } else {
94
+ this.element.classList.add(CLS_DEVICE);
95
+ this.createOverlay(this.element);
96
+ }
97
+ this.setScrollState();
98
+ }
99
+ private setScrollState(): void {
100
+ if (isNullOrUndefined(this.scrollStep) || this.scrollStep < 0) {
101
+ this.scrollStep = this.scrollEle.offsetWidth;
102
+ this.customStep = false;
103
+ } else {
104
+ this.customStep = true;
105
+ }
106
+ }
107
+ /**
108
+ * Initializes a new instance of the HScroll class.
109
+ * @param options - Specifies HScroll model properties as options.
110
+ * @param element - Specifies the element for which horizontal scrolling applies.
111
+ */
112
+ constructor(options?: HScrollModel, element?: string | HTMLElement) {
113
+ super(options, <HTEle | string>element);
114
+ }
115
+ private initialize(): void {
116
+ let scrollEle: HTEle = this.createElement('div', { className: CLS_HSCROLLCON });
117
+ let scrollDiv: HTEle = this.createElement('div', { className: CLS_HSCROLLBAR });
118
+ scrollDiv.setAttribute('tabindex', '-1');
119
+ let ele: HTEle = this.element;
120
+ let innerEle: HTEle[] = [].slice.call(ele.children);
121
+ for (let ele of innerEle) {
122
+ scrollEle.appendChild(ele);
123
+ }
124
+ scrollDiv.appendChild(scrollEle);
125
+ ele.appendChild(scrollDiv);
126
+ scrollDiv.style.overflowX = 'hidden';
127
+ this.scrollEle = scrollDiv;
128
+ this.scrollItems = scrollEle;
129
+ }
130
+ protected getPersistData(): string {
131
+ let keyEntity: string[] = ['scrollStep'];
132
+ return this.addOnPersist(keyEntity);
133
+ }
134
+ /**
135
+ * Returns the current module name.
136
+ * @returns string
137
+ * @private
138
+ */
139
+ protected getModuleName(): string {
140
+ return 'hScroll';
141
+ }
142
+ /**
143
+ * Removes the control from the DOM and also removes all its related events.
144
+ * @returns void
145
+ */
146
+ public destroy(): void {
147
+ let ele: HTEle = this.element;
148
+ ele.style.display = '';
149
+ ele.classList.remove(CLS_ROOT);
150
+ ele.classList.remove(CLS_DEVICE);
151
+ let nav: HTEle[] = selectAll('.e-' + ele.id + '_nav.' + CLS_HSCROLLNAV, ele);
152
+ let overlay: HTEle[] = selectAll('.' + CLS_OVERLAY, ele);
153
+ [].slice.call(overlay).forEach((ele: HTEle) => {
154
+ detach(ele);
155
+ });
156
+ for (let elem of [].slice.call(this.scrollItems.children)) {
157
+ ele.appendChild(elem);
158
+ }
159
+ if (this.uniqueId) {
160
+ this.element.removeAttribute('id'); }
161
+ detach(this.scrollEle);
162
+ if (nav.length > 0) {
163
+ detach(nav[0]);
164
+ if (!isNullOrUndefined(nav[1])) { detach(nav[1]); } }
165
+ EventHandler.remove(this.scrollEle, 'scroll', this.scrollHandler);
166
+ this.touchModule.destroy();
167
+ this.touchModule = null;
168
+ super.destroy();
169
+ }
170
+ /**
171
+ * Specifies the value to disable/enable the HScroll component.
172
+ * When set to `true` , the component will be disabled.
173
+ * @param {boolean} value - Based on this Boolean value, HScroll will be enabled (false) or disabled (true).
174
+ * @returns void.
175
+ */
176
+ public disable(value: boolean): void {
177
+ let navEles: HTMLElement[] = selectAll('.e-scroll-nav:not(.' + CLS_DISABLE + ')', this.element );
178
+ value ? this.element.classList.add(CLS_DISABLE) : this.element.classList.remove(CLS_DISABLE);
179
+ [].slice.call(navEles).forEach((el: HTMLElement) => {
180
+ el.setAttribute('tabindex', !value ? '0' : '-1');
181
+ });
182
+ }
183
+ private createOverlay(element: HTEle): void {
184
+ let id: string = element.id.concat('_nav');
185
+ let rightOverlayEle: HTEle = this.createElement('div', {className: CLS_OVERLAY + ' ' + CLS_RIGHTOVERLAY});
186
+ let clsRight: string = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVRIGHT);
187
+ let rightEle: HTEle = this.createElement('div', { id: id.concat('_right'), className: clsRight });
188
+ let navItem: HTEle = this.createElement('div', { className: CLS_NAVRIGHTARROW + ' ' + CLS_NAVARROW + ' e-icons' });
189
+ rightEle.appendChild(navItem);
190
+ let leftEle: HTEle = this.createElement('div', {className: CLS_OVERLAY + ' ' + CLS_LEFTOVERLAY});
191
+ if (this.ieCheck ) {
192
+ rightEle.classList.add('e-ie-align'); }
193
+ element.appendChild(rightOverlayEle);
194
+ element.appendChild(rightEle);
195
+ element.insertBefore(leftEle, element.firstChild);
196
+ this.eventBinding([rightEle]);
197
+ }
198
+ private createNavIcon(element: HTEle): void {
199
+ let id: string = element.id.concat('_nav');
200
+ let clsRight: string = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVRIGHT);
201
+ let nav: HTEle = this.createElement('div', { id: id.concat('_right'), className: clsRight });
202
+ nav.setAttribute('aria-disabled', 'false');
203
+ let navItem: HTEle = this.createElement('div', { className: CLS_NAVRIGHTARROW + ' ' + CLS_NAVARROW + ' e-icons' });
204
+ let clsLeft: string = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVLEFT);
205
+ let navEle: HTEle = this.createElement('div', { id: id.concat('_left'), className: clsLeft + ' ' + CLS_DISABLE });
206
+ navEle.setAttribute('aria-disabled', 'true');
207
+ let navLeftItem: HTEle = this.createElement('div', { className: CLS_NAVLEFTARROW + ' ' + CLS_NAVARROW + ' e-icons' });
208
+ navEle.appendChild(navLeftItem);
209
+ nav.appendChild(navItem);
210
+ element.appendChild(nav);
211
+ element.insertBefore(navEle, element.firstChild);
212
+ if (this.ieCheck ) {
213
+ nav.classList.add('e-ie-align');
214
+ navEle.classList.add('e-ie-align'); }
215
+ this.eventBinding([nav, navEle]);
216
+ }
217
+ private onKeyPress(e: KeyboardEvent): void {
218
+ if (e.key === 'Enter') {
219
+ let timeoutFun: Function = () => {
220
+ this.keyTimeout = true;
221
+ this.eleScrolling(10, <HTEle>e.target, true);
222
+ };
223
+ this.keyTimer = window.setTimeout(
224
+ () => {
225
+ timeoutFun();
226
+ }, 100);
227
+ }}
228
+ private onKeyUp(e: KeyboardEvent): void {
229
+ if (e.key !== 'Enter') { return; }
230
+ if (this.keyTimeout) {
231
+ this.keyTimeout = false;
232
+ } else {
233
+ (<HTEle>e.target).click();
234
+ }
235
+ clearTimeout(this.keyTimer);
236
+ }
237
+ private eventBinding(ele: HTEle[]): void {
238
+ [].slice.call(ele).forEach((el: HTEle) => {
239
+ new Touch(el, {tapHold: this.tabHoldHandler.bind(this), tapHoldThreshold: 500 });
240
+ el.addEventListener('keydown' , this.onKeyPress.bind(this));
241
+ el.addEventListener('keyup', this.onKeyUp.bind(this));
242
+ el.addEventListener('mouseup', this.repeatScroll.bind(this));
243
+ el.addEventListener('touchend', this.repeatScroll.bind(this));
244
+ el.addEventListener('contextmenu', (e: Event) => {
245
+ e.preventDefault();
246
+ });
247
+ EventHandler.add(el, 'click', this.clickEventHandler, this);
248
+ });
249
+ }
250
+ private repeatScroll(): void {
251
+ clearInterval (this.timeout);
252
+ }
253
+ private tabHoldHandler(e: TapEventArgs): void {
254
+ let trgt: HTEle = e.originalEvent.target as HTEle;
255
+ trgt = this.contains(trgt, CLS_HSCROLLNAV) ? <HTEle>trgt.firstElementChild : trgt;
256
+ let scrollDis: number = 10;
257
+ let timeoutFun: Function = () => {
258
+ this.eleScrolling(scrollDis, trgt, true);
259
+ };
260
+ this.timeout = window.setInterval(
261
+ () => {
262
+ timeoutFun();
263
+ }, 50);
264
+ }
265
+ private contains(ele: HTEle, className: string): boolean {
266
+ return ele.classList.contains(className);
267
+ }
268
+ private eleScrolling(scrollDis: number, trgt: HTEle, isContinuous: boolean ): void {
269
+ let element: HTEle = this.scrollEle;
270
+ let rootEle: HTEle = this.element;
271
+ let classList: DOMTokenList = trgt.classList;
272
+ if (classList.contains(CLS_HSCROLLNAV)) {
273
+ classList = trgt.querySelector('.' + CLS_NAVARROW).classList;
274
+ }
275
+ if (this.contains(rootEle, CLS_RTL) && this.browserCheck) {
276
+ scrollDis = - scrollDis;
277
+ }
278
+ let scrlLeft: number = element.scrollLeft;
279
+ if ((!this.contains(rootEle, CLS_RTL) || this.browserCheck) || this.ieCheck) {
280
+ if (classList.contains(CLS_NAVRIGHTARROW)) {
281
+ this.frameScrollRequest(scrollDis, 'add', isContinuous);
282
+ } else {
283
+ this.frameScrollRequest(scrollDis, '', isContinuous);
284
+ }
285
+ } else {
286
+ if (classList.contains(CLS_NAVLEFTARROW)) {
287
+ this.frameScrollRequest(scrollDis, 'add', isContinuous);
288
+ } else {
289
+ this.frameScrollRequest(scrollDis, '', isContinuous);
290
+ }
291
+ }
292
+ }
293
+ private clickEventHandler(e: Event): void {
294
+ this.eleScrolling(this.scrollStep , <HTEle>e.target, false);
295
+ }
296
+
297
+ private swipeHandler(e: SwipeEventArgs): void {
298
+ let swipeEle: HTEle = this.scrollEle;
299
+ let distance: number;
300
+ if (e.velocity <= 1) {
301
+ distance = e.distanceX / (e.velocity * 10);
302
+ } else {
303
+ distance = e.distanceX / e.velocity;
304
+ }
305
+ let start: number = 0.5;
306
+ let animate: Function = () => {
307
+ let step: number = Math.sin(start);
308
+ if (step <= 0) {
309
+ window.cancelAnimationFrame(step);
310
+ } else {
311
+ if (e.swipeDirection === 'Left') {
312
+ swipeEle.scrollLeft += distance * step;
313
+ } else if (e.swipeDirection === 'Right') {
314
+ swipeEle.scrollLeft -= distance * step;
315
+ }
316
+ start -= 0.02;
317
+ window.requestAnimationFrame(animate as FrameRequestCallback);
318
+ }
319
+ };
320
+ animate();
321
+ }
322
+
323
+ private scrollUpdating(scrollVal: number, action: string): void {
324
+ if (action === 'add') {
325
+ this.scrollEle.scrollLeft += scrollVal;
326
+ } else {
327
+ this.scrollEle.scrollLeft -= scrollVal; }
328
+ }
329
+
330
+ private frameScrollRequest(scrollVal: number, action: string, isContinuous: boolean): void {
331
+ let step: number = 10;
332
+ if (isContinuous) {
333
+ this.scrollUpdating(scrollVal, action);
334
+ return;
335
+ }
336
+ if (!this.customStep) {
337
+ [].slice.call(selectAll('.' + CLS_OVERLAY, this.element)).forEach((el: HTMLElement) => {
338
+ scrollVal -= el.offsetWidth; }); }
339
+ let animate: Function = () => {
340
+ let scrollValue: number;
341
+ let scrollStep: number;
342
+ if (this.contains(this.element, CLS_RTL) && this.browserCheck) {
343
+ scrollValue = - scrollVal;
344
+ scrollStep = - step;
345
+ } else {
346
+ scrollValue = scrollVal;
347
+ scrollStep = step;
348
+ }
349
+ if (scrollValue < step) {
350
+ window.cancelAnimationFrame(scrollStep);
351
+ } else {
352
+ this.scrollUpdating(scrollStep, action);
353
+ scrollVal -= scrollStep;
354
+ window.requestAnimationFrame(animate as FrameRequestCallback);
355
+ }
356
+ };
357
+ animate();
358
+ }
359
+
360
+ private touchHandler(e: ScrollEventArgs): void {
361
+ let ele: HTEle = this.scrollEle;
362
+ let distance: number;
363
+ distance = e.distanceX;
364
+ if ((this.ieCheck) && this.contains(this.element, CLS_RTL)) {
365
+ distance = - distance;
366
+ }
367
+ if (e.scrollDirection === 'Left') {
368
+ ele.scrollLeft = ele.scrollLeft + distance;
369
+ } else if (e.scrollDirection === 'Right') {
370
+ ele.scrollLeft = ele.scrollLeft - distance;
371
+ }
372
+ }
373
+ private arrowDisabling(addDisable: HTEle, removeDisable: HTEle): void {
374
+ if (this.isDevice) {
375
+ let arrowEle: HTMLElement = isNullOrUndefined(addDisable) ? removeDisable : addDisable;
376
+ let arrowIcon: HTMLElement = arrowEle.querySelector('.' + CLS_NAVARROW) as HTMLElement;
377
+ if (isNullOrUndefined(addDisable)) {
378
+ classList(arrowIcon, [CLS_NAVRIGHTARROW], [CLS_NAVLEFTARROW]);
379
+ } else {
380
+ classList(arrowIcon, [CLS_NAVLEFTARROW], [CLS_NAVRIGHTARROW]);
381
+ }
382
+ } else {
383
+ addDisable.classList.add(CLS_DISABLE);
384
+ addDisable.setAttribute('aria-disabled' , 'true');
385
+ addDisable.removeAttribute('tabindex');
386
+ removeDisable.classList.remove(CLS_DISABLE);
387
+ removeDisable.setAttribute('aria-disabled' , 'false');
388
+ removeDisable.setAttribute('tabindex', '0');
389
+ }
390
+ this.repeatScroll();
391
+ }
392
+ private scrollHandler(e: Event): void {
393
+ let target: HTEle = <HTEle>e.target;
394
+ let width: number = target.offsetWidth;
395
+ let rootEle: HTEle = this.element;
396
+ let navLeftEle: HTEle = (<HTEle>this.element.querySelector('.' + CLS_HSCROLLNAVLEFT));
397
+ let navRightEle: HTEle = (<HTEle>this.element.querySelector('.' + CLS_HSCROLLNAVRIGHT));
398
+ let leftOverlay: HTEle = (<HTEle>this.element.querySelector('.' + CLS_LEFTOVERLAY));
399
+ let rightOverlay: HTEle = (<HTEle>this.element.querySelector('.' + CLS_RIGHTOVERLAY));
400
+ let scrollLeft: number = target.scrollLeft;
401
+ if (scrollLeft <= 0) {
402
+ scrollLeft = -scrollLeft;
403
+ }
404
+ if (this.isDevice) {
405
+ if (this.enableRtl && !(this.browserCheck || this.ieCheck)) {
406
+ leftOverlay = (<HTEle>this.element.querySelector('.' + CLS_RIGHTOVERLAY));
407
+ rightOverlay = (<HTEle>this.element.querySelector('.' + CLS_LEFTOVERLAY)); }
408
+ if (scrollLeft < OVERLAY_MAXWID) {
409
+ leftOverlay.style.width = scrollLeft + 'px';
410
+ } else {
411
+ leftOverlay.style.width = '40px';
412
+ }
413
+ if (( target.scrollWidth - Math.ceil(width + scrollLeft)) < OVERLAY_MAXWID ) {
414
+ rightOverlay.style.width = ( target.scrollWidth - Math.ceil(width + scrollLeft)) + 'px';
415
+ } else {
416
+ rightOverlay.style.width = '40px';
417
+ }
418
+ }
419
+ if (scrollLeft === 0) {
420
+ if ((!this.contains(rootEle, CLS_RTL) || this.browserCheck) || this.ieCheck) {
421
+ this.arrowDisabling(navLeftEle, navRightEle);
422
+ } else {
423
+ this.arrowDisabling(navRightEle, navLeftEle);
424
+ }
425
+ } else if (Math.ceil(width + scrollLeft + .1) >= target.scrollWidth) {
426
+ if ((!this.contains(rootEle, CLS_RTL) || this.browserCheck) || this.ieCheck) {
427
+ this.arrowDisabling(navRightEle, navLeftEle);
428
+ } else {
429
+ this.arrowDisabling(navLeftEle, navRightEle);
430
+ }
431
+ } else {
432
+ let disEle: HTEle = <HTEle>this.element.querySelector('.' + CLS_HSCROLLNAV + '.' + CLS_DISABLE);
433
+ if (disEle) {
434
+ disEle.classList.remove(CLS_DISABLE);
435
+ disEle.setAttribute('aria-disabled', 'false');
436
+ disEle.setAttribute('tabindex', '0');
437
+ }
438
+ }
439
+ }
440
+ /**
441
+ * Gets called when the model property changes.The data that describes the old and new values of property that changed.
442
+ * @param {HScrollModel} newProp
443
+ * @param {HScrollModel} oldProp
444
+ * @returns void
445
+ * @private
446
+ */
447
+ public onPropertyChanged(newProp: HScrollModel, oldProp: HScrollModel): void {
448
+ for (let prop of Object.keys(newProp)) {
449
+ switch (prop) {
450
+ case 'scrollStep':
451
+ this.setScrollState();
452
+ break;
453
+ case 'enableRtl':
454
+ newProp.enableRtl ? this.element.classList.add(CLS_RTL) : this.element.classList.remove(CLS_RTL);
455
+ break;
456
+ }
457
+ }
458
+ }
459
+ }