@tylertech/forge 3.0.0-next.6 → 3.0.0-next.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/custom-elements.json +2084 -1482
  2. package/dist/esm/accordion/index.js +1 -1
  3. package/dist/esm/app-bar/help-button/index.js +1 -1
  4. package/dist/esm/app-bar/index.js +1 -1
  5. package/dist/esm/app-bar/menu-button/index.js +1 -1
  6. package/dist/esm/app-bar/notification-button/index.js +1 -1
  7. package/dist/esm/app-bar/profile-button/index.js +1 -1
  8. package/dist/esm/app-bar/search/index.js +1 -1
  9. package/dist/esm/autocomplete/index.js +1 -1
  10. package/dist/esm/banner/index.js +1 -1
  11. package/dist/esm/bottom-sheet/index.js +1 -1
  12. package/dist/esm/busy-indicator/index.js +1 -1
  13. package/dist/esm/button/index.js +1 -1
  14. package/dist/esm/button-toggle/button-toggle/index.js +1 -1
  15. package/dist/esm/button-toggle/button-toggle-group/index.js +1 -1
  16. package/dist/esm/button-toggle/index.js +1 -1
  17. package/dist/esm/calendar/calendar-dropdown/index.js +1 -1
  18. package/dist/esm/calendar/calendar-menu/index.js +1 -1
  19. package/dist/esm/calendar/index.js +1 -1
  20. package/dist/esm/card/index.js +1 -1
  21. package/dist/esm/checkbox/index.js +1 -1
  22. package/dist/esm/chip-field/index.js +1 -1
  23. package/dist/esm/chips/chip/index.js +1 -1
  24. package/dist/esm/chips/chip-set/index.js +1 -1
  25. package/dist/esm/chips/index.js +1 -1
  26. package/dist/esm/chunks/{chunk.Q6IP5GJ6.js → chunk.246JM2YT.js} +2 -2
  27. package/dist/esm/chunks/{chunk.DHTAH23Y.js → chunk.24L5GDD2.js} +2 -2
  28. package/dist/esm/chunks/{chunk.ZWTZJJ6H.js → chunk.2IQGDFQS.js} +2 -2
  29. package/dist/esm/chunks/{chunk.DAGXGSX7.js → chunk.2LRDPTHK.js} +2 -2
  30. package/dist/esm/chunks/{chunk.Q47M2LB5.js → chunk.2QFIMTVP.js} +2 -2
  31. package/dist/esm/chunks/{chunk.IVB6XTHQ.js → chunk.2TQONIPK.js} +2 -2
  32. package/dist/esm/chunks/{chunk.DXHKS7XO.js → chunk.2XFVFZ3P.js} +2 -2
  33. package/dist/esm/chunks/{chunk.3ICROIFD.js → chunk.2YAU7AXH.js} +2 -2
  34. package/dist/esm/chunks/{chunk.5B2CGITX.js → chunk.2YX7ASSX.js} +2 -2
  35. package/dist/esm/chunks/{chunk.QLNGQCJX.js → chunk.2ZTERGYF.js} +2 -2
  36. package/dist/esm/chunks/{chunk.BIJJCDHE.js → chunk.3AF7CJP2.js} +2 -2
  37. package/dist/esm/chunks/{chunk.BIJJCDHE.js.map → chunk.3AF7CJP2.js.map} +1 -1
  38. package/dist/esm/chunks/{chunk.Y2ANYRZH.js → chunk.4EB5NVCK.js} +2 -2
  39. package/dist/esm/chunks/{chunk.SACZLJPQ.js → chunk.4LVS2EYJ.js} +2 -2
  40. package/dist/esm/chunks/chunk.57XQ4F6F.js +12 -0
  41. package/dist/esm/chunks/chunk.57XQ4F6F.js.map +7 -0
  42. package/dist/esm/chunks/{chunk.E3VXLUEY.js → chunk.5IVB5L5Z.js} +2 -2
  43. package/dist/esm/chunks/{chunk.GZZ6GFKT.js → chunk.5MK5YWCK.js} +2 -2
  44. package/dist/esm/chunks/{chunk.QO37K76P.js → chunk.6SBTLXLH.js} +2 -2
  45. package/dist/esm/chunks/{chunk.BTZF6QGA.js → chunk.7JQHQKXN.js} +2 -2
  46. package/dist/esm/chunks/{chunk.TWV4OTF7.js → chunk.A5MBSCSQ.js} +2 -2
  47. package/dist/esm/chunks/{chunk.4EF7UJDK.js → chunk.A5R7KUIP.js} +2 -2
  48. package/dist/esm/chunks/{chunk.NQH4ZCXJ.js → chunk.AGMPIMJV.js} +2 -2
  49. package/dist/esm/chunks/{chunk.PMY4KVCF.js → chunk.BKCEVPKW.js} +2 -2
  50. package/dist/esm/chunks/{chunk.I5MLIFN5.js → chunk.BSTIDYQJ.js} +2 -2
  51. package/dist/esm/chunks/chunk.C2LTB7EX.js +7 -0
  52. package/dist/esm/chunks/chunk.C2LTB7EX.js.map +7 -0
  53. package/dist/esm/chunks/chunk.CN27IHDN.js +7 -0
  54. package/dist/esm/chunks/chunk.CN27IHDN.js.map +7 -0
  55. package/dist/esm/chunks/{chunk.MZNL36GJ.js → chunk.CNQESSA3.js} +2 -2
  56. package/dist/esm/chunks/{chunk.6FISJTFJ.js → chunk.E6KWYFZG.js} +2 -2
  57. package/dist/esm/chunks/{chunk.H3SBIXK5.js → chunk.ECRL6O3V.js} +2 -2
  58. package/dist/esm/chunks/{chunk.SBDWCXK3.js → chunk.ER52NFXX.js} +2 -2
  59. package/dist/esm/chunks/{chunk.GSQF3ACL.js → chunk.EUE3OVC7.js} +2 -2
  60. package/dist/esm/chunks/{chunk.DGNS4JNN.js → chunk.FAANPQES.js} +2 -2
  61. package/dist/esm/chunks/{chunk.MZLPUI6R.js → chunk.FYWPZFLJ.js} +2 -2
  62. package/dist/esm/chunks/{chunk.MZLPUI6R.js.map → chunk.FYWPZFLJ.js.map} +2 -2
  63. package/dist/esm/chunks/{chunk.LMSXJOPL.js → chunk.GF2GUVYS.js} +2 -2
  64. package/dist/esm/chunks/{chunk.QKRB6AIQ.js → chunk.GHSAKRYH.js} +2 -2
  65. package/dist/esm/chunks/{chunk.JHTGKXXX.js → chunk.GJW4WS4I.js} +2 -2
  66. package/dist/esm/chunks/{chunk.IW37LUQJ.js → chunk.GUYPITGA.js} +2 -2
  67. package/dist/esm/chunks/{chunk.G75X57KY.js → chunk.HKJEGD6C.js} +2 -2
  68. package/dist/esm/chunks/{chunk.3ARIVYGG.js → chunk.IGK3VYZG.js} +2 -2
  69. package/dist/esm/chunks/chunk.IIXLFXHZ.js +7 -0
  70. package/dist/esm/chunks/chunk.IIXLFXHZ.js.map +7 -0
  71. package/dist/esm/chunks/chunk.JQIOVCKI.js +7 -0
  72. package/dist/esm/chunks/chunk.JQIOVCKI.js.map +7 -0
  73. package/dist/esm/chunks/{chunk.7MDHI4PT.js → chunk.JVW6JGV3.js} +2 -2
  74. package/dist/esm/chunks/chunk.LJYTJ3RV.js +7 -0
  75. package/dist/esm/chunks/chunk.LJYTJ3RV.js.map +7 -0
  76. package/dist/esm/chunks/{chunk.LQ4RD7WW.js → chunk.MXNLCQRB.js} +2 -2
  77. package/dist/esm/chunks/{chunk.DCCJTW7C.js → chunk.NDGFQILG.js} +2 -2
  78. package/dist/esm/chunks/{chunk.PG4HEEX2.js → chunk.OTVT3XM2.js} +2 -2
  79. package/dist/esm/chunks/{chunk.VSO5QDBV.js → chunk.P5QIB6OY.js} +2 -2
  80. package/dist/esm/chunks/{chunk.XUV63FEH.js → chunk.PPPTT3SM.js} +2 -2
  81. package/dist/esm/chunks/{chunk.GZRMHYID.js → chunk.QA3NU7EN.js} +2 -2
  82. package/dist/esm/chunks/{chunk.MVYTV6WX.js → chunk.QYKO543K.js} +2 -2
  83. package/dist/esm/chunks/{chunk.XI4RWFCG.js → chunk.RHYRMQS7.js} +2 -2
  84. package/dist/esm/chunks/{chunk.Q4SCW4FN.js → chunk.RUSHOL23.js} +2 -2
  85. package/dist/esm/chunks/{chunk.AD4CP4UK.js → chunk.SIJGKRYS.js} +2 -2
  86. package/dist/esm/chunks/{chunk.RTMDWDS4.js → chunk.SYZB7B4F.js} +2 -2
  87. package/dist/esm/chunks/{chunk.GYPPM2D2.js → chunk.SZIM4KFZ.js} +2 -2
  88. package/dist/esm/chunks/{chunk.UXQZFI55.js → chunk.THPU5KBV.js} +2 -2
  89. package/dist/esm/chunks/{chunk.K6VWRQWY.js → chunk.TXFYS6EU.js} +2 -2
  90. package/dist/esm/chunks/{chunk.ZLFH7VOM.js → chunk.V4RBOYNH.js} +2 -2
  91. package/dist/esm/chunks/chunk.WH6C36MO.js +7 -0
  92. package/dist/esm/chunks/chunk.WH6C36MO.js.map +7 -0
  93. package/dist/esm/chunks/{chunk.JRV5FYMW.js → chunk.YUAU5IWT.js} +2 -2
  94. package/dist/esm/chunks/{chunk.YSFUL5AD.js → chunk.YZLASVCK.js} +2 -2
  95. package/dist/esm/chunks/{chunk.R7MQKCHR.js → chunk.Z5TWWM7I.js} +2 -2
  96. package/dist/esm/color-picker/index.js +1 -1
  97. package/dist/esm/core/index.js +1 -1
  98. package/dist/esm/date-picker/index.js +1 -1
  99. package/dist/esm/date-range-picker/index.js +1 -1
  100. package/dist/esm/expansion-panel/index.js +1 -1
  101. package/dist/esm/file-picker/index.js +1 -1
  102. package/dist/esm/floating-action-button/index.js +1 -1
  103. package/dist/esm/focus-indicator/index.js +7 -0
  104. package/dist/esm/focus-indicator/index.js.map +7 -0
  105. package/dist/esm/icon/index.js +1 -1
  106. package/dist/esm/icon-button/index.js +1 -1
  107. package/dist/esm/index.js +1 -1
  108. package/dist/esm/list/index.js +1 -1
  109. package/dist/esm/list/list/index.js +1 -1
  110. package/dist/esm/list/list-item/index.js +1 -1
  111. package/dist/esm/list-dropdown/index.js +1 -1
  112. package/dist/esm/menu/index.js +1 -1
  113. package/dist/esm/open-icon/index.js +1 -1
  114. package/dist/esm/paginator/index.js +1 -1
  115. package/dist/esm/profile-card/index.js +1 -1
  116. package/dist/esm/quantity-field/index.js +1 -1
  117. package/dist/esm/radio/index.js +1 -1
  118. package/dist/esm/ripple/index.js +1 -1
  119. package/dist/esm/select/core/index.js +1 -1
  120. package/dist/esm/select/index.js +1 -1
  121. package/dist/esm/select/select/index.js +1 -1
  122. package/dist/esm/select/select-dropdown/index.js +1 -1
  123. package/dist/esm/slider/index.js +1 -1
  124. package/dist/esm/split-view/index.js +1 -1
  125. package/dist/esm/split-view/split-view/index.js +1 -1
  126. package/dist/esm/split-view/split-view-panel/index.js +1 -1
  127. package/dist/esm/stepper/index.js +1 -1
  128. package/dist/esm/stepper/step/index.js +1 -1
  129. package/dist/esm/stepper/stepper/index.js +1 -1
  130. package/dist/esm/switch/index.js +1 -1
  131. package/dist/esm/table/index.js +1 -1
  132. package/dist/esm/tabs/index.js +1 -1
  133. package/dist/esm/tabs/tab/index.js +1 -1
  134. package/dist/esm/tabs/tab-bar/index.js +1 -1
  135. package/dist/esm/time-picker/index.js +1 -1
  136. package/dist/esm/toast/index.js +1 -1
  137. package/esm/card/card-constants.d.ts +2 -2
  138. package/esm/card/card-constants.js +2 -2
  139. package/esm/card/card.d.ts +19 -8
  140. package/esm/card/card.js +30 -21
  141. package/esm/focus-indicator/focus-indicator-adapter.d.ts +37 -0
  142. package/esm/focus-indicator/focus-indicator-adapter.js +59 -0
  143. package/esm/focus-indicator/focus-indicator-constants.d.ts +15 -0
  144. package/esm/focus-indicator/focus-indicator-constants.js +19 -0
  145. package/esm/focus-indicator/focus-indicator-foundation.d.ts +43 -0
  146. package/esm/focus-indicator/focus-indicator-foundation.js +110 -0
  147. package/esm/focus-indicator/focus-indicator.d.ts +67 -0
  148. package/esm/focus-indicator/focus-indicator.js +112 -0
  149. package/esm/focus-indicator/index.d.ts +10 -0
  150. package/esm/focus-indicator/index.js +14 -0
  151. package/esm/index.d.ts +1 -0
  152. package/esm/index.js +3 -0
  153. package/esm/slider/slider-utils.js +3 -0
  154. package/esm/slider/slider.d.ts +0 -1
  155. package/esm/slider/slider.js +7 -4
  156. package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
  157. package/esm/tabs/tab/tab-adapter.d.ts +15 -39
  158. package/esm/tabs/tab/tab-adapter.js +65 -78
  159. package/esm/tabs/tab/tab-constants.d.ts +13 -13
  160. package/esm/tabs/tab/tab-constants.js +18 -10
  161. package/esm/tabs/tab/tab-foundation.d.ts +24 -23
  162. package/esm/tabs/tab/tab-foundation.js +68 -62
  163. package/esm/tabs/tab/tab-ripple.d.ts +17 -0
  164. package/esm/tabs/tab/tab-ripple.js +33 -0
  165. package/esm/tabs/tab/tab.d.ts +56 -19
  166. package/esm/tabs/tab/tab.js +82 -32
  167. package/esm/tabs/tab-bar/tab-bar-adapter.d.ts +49 -87
  168. package/esm/tabs/tab-bar/tab-bar-adapter.js +114 -188
  169. package/esm/tabs/tab-bar/tab-bar-constants.d.ts +15 -45
  170. package/esm/tabs/tab-bar/tab-bar-constants.js +22 -56
  171. package/esm/tabs/tab-bar/tab-bar-foundation.d.ts +56 -65
  172. package/esm/tabs/tab-bar/tab-bar-foundation.js +241 -302
  173. package/esm/tabs/tab-bar/tab-bar.d.ts +51 -36
  174. package/esm/tabs/tab-bar/tab-bar.js +84 -52
  175. package/package.json +1 -1
  176. package/styles/card/_mixins.scss +8 -7
  177. package/styles/core/style-layer/tabs/tab/_core.scss +419 -0
  178. package/styles/core/style-layer/tabs/tab/_variables.scss +20 -0
  179. package/styles/core/style-layer/tabs/tab/index.scss +13 -0
  180. package/styles/core/style-layer/tabs/tab-bar/_core.scss +110 -0
  181. package/styles/core/style-layer/tabs/tab-bar/_variables.scss +9 -0
  182. package/styles/core/style-layer/tabs/tab-bar/index.scss +13 -0
  183. package/styles/focus-indicator/_mixins.scss +147 -0
  184. package/styles/focus-indicator/_variables.scss +20 -0
  185. package/styles/focus-indicator/focus-indicator.scss +32 -0
  186. package/styles/slider/_mixins.scss +9 -0
  187. package/styles/tabs/tab/_mixins.scss +55 -126
  188. package/styles/tabs/tab/_variables.scss +26 -4
  189. package/styles/tabs/tab/tab.scss +50 -11
  190. package/styles/tabs/tab-bar/_mixins.scss +20 -60
  191. package/styles/tabs/tab-bar/_variables.scss +11 -0
  192. package/styles/tabs/tab-bar/tab-bar.scss +29 -2
  193. package/dist/esm/chunks/chunk.4B22UXEH.js +0 -7
  194. package/dist/esm/chunks/chunk.4B22UXEH.js.map +0 -7
  195. package/dist/esm/chunks/chunk.4QPMNWJ3.js +0 -129
  196. package/dist/esm/chunks/chunk.4QPMNWJ3.js.map +0 -7
  197. package/dist/esm/chunks/chunk.BWZKQ6WX.js +0 -7
  198. package/dist/esm/chunks/chunk.BWZKQ6WX.js.map +0 -7
  199. package/dist/esm/chunks/chunk.D3IAEEPM.js +0 -201
  200. package/dist/esm/chunks/chunk.D3IAEEPM.js.map +0 -7
  201. package/dist/esm/chunks/chunk.NV4U4DE6.js +0 -12
  202. package/dist/esm/chunks/chunk.NV4U4DE6.js.map +0 -7
  203. /package/dist/esm/chunks/{chunk.Q6IP5GJ6.js.map → chunk.246JM2YT.js.map} +0 -0
  204. /package/dist/esm/chunks/{chunk.DHTAH23Y.js.map → chunk.24L5GDD2.js.map} +0 -0
  205. /package/dist/esm/chunks/{chunk.ZWTZJJ6H.js.map → chunk.2IQGDFQS.js.map} +0 -0
  206. /package/dist/esm/chunks/{chunk.DAGXGSX7.js.map → chunk.2LRDPTHK.js.map} +0 -0
  207. /package/dist/esm/chunks/{chunk.Q47M2LB5.js.map → chunk.2QFIMTVP.js.map} +0 -0
  208. /package/dist/esm/chunks/{chunk.IVB6XTHQ.js.map → chunk.2TQONIPK.js.map} +0 -0
  209. /package/dist/esm/chunks/{chunk.DXHKS7XO.js.map → chunk.2XFVFZ3P.js.map} +0 -0
  210. /package/dist/esm/chunks/{chunk.3ICROIFD.js.map → chunk.2YAU7AXH.js.map} +0 -0
  211. /package/dist/esm/chunks/{chunk.5B2CGITX.js.map → chunk.2YX7ASSX.js.map} +0 -0
  212. /package/dist/esm/chunks/{chunk.QLNGQCJX.js.map → chunk.2ZTERGYF.js.map} +0 -0
  213. /package/dist/esm/chunks/{chunk.Y2ANYRZH.js.map → chunk.4EB5NVCK.js.map} +0 -0
  214. /package/dist/esm/chunks/{chunk.SACZLJPQ.js.map → chunk.4LVS2EYJ.js.map} +0 -0
  215. /package/dist/esm/chunks/{chunk.E3VXLUEY.js.map → chunk.5IVB5L5Z.js.map} +0 -0
  216. /package/dist/esm/chunks/{chunk.GZZ6GFKT.js.map → chunk.5MK5YWCK.js.map} +0 -0
  217. /package/dist/esm/chunks/{chunk.QO37K76P.js.map → chunk.6SBTLXLH.js.map} +0 -0
  218. /package/dist/esm/chunks/{chunk.BTZF6QGA.js.map → chunk.7JQHQKXN.js.map} +0 -0
  219. /package/dist/esm/chunks/{chunk.TWV4OTF7.js.map → chunk.A5MBSCSQ.js.map} +0 -0
  220. /package/dist/esm/chunks/{chunk.4EF7UJDK.js.map → chunk.A5R7KUIP.js.map} +0 -0
  221. /package/dist/esm/chunks/{chunk.NQH4ZCXJ.js.map → chunk.AGMPIMJV.js.map} +0 -0
  222. /package/dist/esm/chunks/{chunk.PMY4KVCF.js.map → chunk.BKCEVPKW.js.map} +0 -0
  223. /package/dist/esm/chunks/{chunk.I5MLIFN5.js.map → chunk.BSTIDYQJ.js.map} +0 -0
  224. /package/dist/esm/chunks/{chunk.MZNL36GJ.js.map → chunk.CNQESSA3.js.map} +0 -0
  225. /package/dist/esm/chunks/{chunk.6FISJTFJ.js.map → chunk.E6KWYFZG.js.map} +0 -0
  226. /package/dist/esm/chunks/{chunk.H3SBIXK5.js.map → chunk.ECRL6O3V.js.map} +0 -0
  227. /package/dist/esm/chunks/{chunk.SBDWCXK3.js.map → chunk.ER52NFXX.js.map} +0 -0
  228. /package/dist/esm/chunks/{chunk.GSQF3ACL.js.map → chunk.EUE3OVC7.js.map} +0 -0
  229. /package/dist/esm/chunks/{chunk.DGNS4JNN.js.map → chunk.FAANPQES.js.map} +0 -0
  230. /package/dist/esm/chunks/{chunk.LMSXJOPL.js.map → chunk.GF2GUVYS.js.map} +0 -0
  231. /package/dist/esm/chunks/{chunk.QKRB6AIQ.js.map → chunk.GHSAKRYH.js.map} +0 -0
  232. /package/dist/esm/chunks/{chunk.JHTGKXXX.js.map → chunk.GJW4WS4I.js.map} +0 -0
  233. /package/dist/esm/chunks/{chunk.IW37LUQJ.js.map → chunk.GUYPITGA.js.map} +0 -0
  234. /package/dist/esm/chunks/{chunk.G75X57KY.js.map → chunk.HKJEGD6C.js.map} +0 -0
  235. /package/dist/esm/chunks/{chunk.3ARIVYGG.js.map → chunk.IGK3VYZG.js.map} +0 -0
  236. /package/dist/esm/chunks/{chunk.7MDHI4PT.js.map → chunk.JVW6JGV3.js.map} +0 -0
  237. /package/dist/esm/chunks/{chunk.LQ4RD7WW.js.map → chunk.MXNLCQRB.js.map} +0 -0
  238. /package/dist/esm/chunks/{chunk.DCCJTW7C.js.map → chunk.NDGFQILG.js.map} +0 -0
  239. /package/dist/esm/chunks/{chunk.PG4HEEX2.js.map → chunk.OTVT3XM2.js.map} +0 -0
  240. /package/dist/esm/chunks/{chunk.VSO5QDBV.js.map → chunk.P5QIB6OY.js.map} +0 -0
  241. /package/dist/esm/chunks/{chunk.XUV63FEH.js.map → chunk.PPPTT3SM.js.map} +0 -0
  242. /package/dist/esm/chunks/{chunk.GZRMHYID.js.map → chunk.QA3NU7EN.js.map} +0 -0
  243. /package/dist/esm/chunks/{chunk.MVYTV6WX.js.map → chunk.QYKO543K.js.map} +0 -0
  244. /package/dist/esm/chunks/{chunk.XI4RWFCG.js.map → chunk.RHYRMQS7.js.map} +0 -0
  245. /package/dist/esm/chunks/{chunk.Q4SCW4FN.js.map → chunk.RUSHOL23.js.map} +0 -0
  246. /package/dist/esm/chunks/{chunk.AD4CP4UK.js.map → chunk.SIJGKRYS.js.map} +0 -0
  247. /package/dist/esm/chunks/{chunk.RTMDWDS4.js.map → chunk.SYZB7B4F.js.map} +0 -0
  248. /package/dist/esm/chunks/{chunk.GYPPM2D2.js.map → chunk.SZIM4KFZ.js.map} +0 -0
  249. /package/dist/esm/chunks/{chunk.UXQZFI55.js.map → chunk.THPU5KBV.js.map} +0 -0
  250. /package/dist/esm/chunks/{chunk.K6VWRQWY.js.map → chunk.TXFYS6EU.js.map} +0 -0
  251. /package/dist/esm/chunks/{chunk.ZLFH7VOM.js.map → chunk.V4RBOYNH.js.map} +0 -0
  252. /package/dist/esm/chunks/{chunk.JRV5FYMW.js.map → chunk.YUAU5IWT.js.map} +0 -0
  253. /package/dist/esm/chunks/{chunk.YSFUL5AD.js.map → chunk.YZLASVCK.js.map} +0 -0
  254. /package/dist/esm/chunks/{chunk.R7MQKCHR.js.map → chunk.Z5TWWM7I.js.map} +0 -0
@@ -3,383 +3,322 @@
3
3
  * Copyright 2023 Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- import { Platform, isNumber } from '@tylertech/forge-core';
7
- import { TAB_BAR_CONSTANTS, ACCEPTABLE_KEYS, KEYCODE_MAP } from './tab-bar-constants';
6
+ import { NAVIGATION_KEYS, TAB_BAR_CONSTANTS } from './tab-bar-constants';
8
7
  import { TAB_CONSTANTS } from '../tab/tab-constants';
9
8
  export class TabBarFoundation {
10
9
  constructor(_adapter) {
11
10
  this._adapter = _adapter;
11
+ // State
12
12
  this._isInitialized = false;
13
- this._activeTab = -1;
14
- this._layoutMode = 'fixed';
15
- this._layoutAlign = 'start';
16
- this._underline = false;
17
- this._autoActivate = false;
13
+ this._disabled = false;
14
+ this._vertical = false;
15
+ this._clustered = false;
18
16
  this._stacked = false;
19
- this._scrollButtons = true;
20
- this._forceScrollButtons = false;
21
- this._tabsChangedListener = evt => this._onTabsChanged(evt);
22
- this._tabInteractedListener = evt => this._onTabInteracted(evt);
23
- this._keydownListener = evt => this._onKeydown(evt);
24
- this._scrollPrevClickListener = evt => this._onScrollPrevious(evt);
25
- this._scrollPrevMousedownListener = evt => evt.preventDefault();
26
- this._scrollNextClickListener = evt => this._onScrollNext(evt);
27
- this._scrollNextMousedownListener = evt => evt.preventDefault();
28
- this._scrollListener = evt => this._onScroll(evt);
17
+ this._secondary = false;
18
+ this._inverted = false;
19
+ this._autoActivate = false;
20
+ this._scrollButtons = false;
21
+ this._tabs = [];
22
+ this._scrollButtonsVisible = false;
23
+ this._tabsChangedListener = () => this._onTabsChanged();
24
+ this._tabSelectedListener = (evt) => this._onTabSelected(evt);
25
+ this._keydownListener = (evt) => this._onKeydown(evt);
26
+ this._resizeListener = () => this._onResize();
27
+ this._scrollListener = () => this._onScroll();
28
+ this._scrollBackwardButtonListener = () => this._onScrollBackward();
29
+ this._scrollForwardButtonListener = () => this._onScrollForward();
29
30
  }
30
31
  initialize() {
31
- this._adapter.initializeTabs(this._activeTab, this._isFixed);
32
- this._adapter.initializeTabScroller();
33
- this._adapter.initializeAccessibility();
34
- this._adapter.addTabChangeListener(this._tabsChangedListener);
35
- this._adapter.addScrollPreviousListener('click', this._scrollPrevClickListener);
36
- this._adapter.addScrollPreviousListener('mousedown', this._scrollPrevMousedownListener);
37
- this._adapter.addScrollNextListener('click', this._scrollNextClickListener);
38
- this._adapter.addScrollNextListener('mousedown', this._scrollNextMousedownListener);
39
- this._adapter.addHostListener(TAB_CONSTANTS.events.INTERACTED, this._tabInteractedListener);
32
+ this._adapter.addSlotListener(this._tabsChangedListener);
33
+ this._adapter.addHostListener(TAB_CONSTANTS.events.SELECT, this._tabSelectedListener);
40
34
  this._adapter.addHostListener('keydown', this._keydownListener);
41
- this._adapter.addScrollListener(this._scrollListener);
42
- this._adapter.setUnderline(this._underline);
43
- this._adapter.setLayoutMode(this._layoutMode);
44
- this._adapter.setLayoutAlign(this._layoutAlign);
45
- window.requestAnimationFrame(() => {
46
- this._syncScrollButtons();
47
- this._adapter.ensureFocusableTab();
48
- });
35
+ this._adapter.setVertical(this._vertical);
36
+ if (this._scrollButtons) {
37
+ this._adapter.initializeContainerSizeObserver(this._resizeListener);
38
+ this._adapter.initializeScrollObserver(this._scrollListener);
39
+ this._updateScrollState();
40
+ }
41
+ this._tryScrollActiveTabIntoView();
49
42
  this._isInitialized = true;
50
43
  }
51
- disconnect() {
52
- this._adapter.destroyTabScroller();
53
- this._adapter.removeTabChangeListener(this._tabsChangedListener);
54
- this._adapter.removeHostListener(TAB_CONSTANTS.events.INTERACTED, this._tabInteractedListener);
55
- this._adapter.removeHostListener('keydown', this._keydownListener);
44
+ destroy() {
45
+ this._adapter.destroyContainerSizeObserver();
46
+ this._adapter.destroyScrollObserver(this._scrollListener);
56
47
  this._isInitialized = false;
57
48
  }
58
- _onTabsChanged(evt) {
59
- this._adapter.initializeTabs(this._activeTab, this._isFixed);
60
- this._adapter.ensureFocusableTab();
61
- // We need to wait a full cycle to scroll the active tab into view
62
- window.setTimeout(() => {
63
- window.requestAnimationFrame(() => {
64
- this.scrollIntoView(this._activeTab);
65
- this._syncScrollButtons();
66
- });
67
- });
49
+ async _onTabsChanged() {
50
+ this._tabs = this._adapter.getTabs();
51
+ this._syncTabState();
52
+ this._tryScrollActiveTabIntoView();
53
+ }
54
+ _onTabSelected(evt) {
55
+ this._selectTab(evt.target);
68
56
  }
69
- _onTabInteracted(evt) {
70
- const activatedTab = evt.target;
71
- const activatedTabIndex = this._adapter.getTabIndex(activatedTab);
72
- // Check if the event and requested tab index is valid
73
- const isTabEvent = activatedTab.tagName.toLowerCase() === TAB_CONSTANTS.elementName;
74
- const isValidTabIndex = activatedTabIndex !== this._activeTab && this._indexIsInRange(activatedTabIndex);
75
- if (!isTabEvent || !isValidTabIndex) {
57
+ async _onKeydown(evt) {
58
+ var _a, _b;
59
+ const orientation = this._vertical ? 'vertical' : 'horizontal';
60
+ const isNavigationKey = ((_a = NAVIGATION_KEYS.get('default')) === null || _a === void 0 ? void 0 : _a.has(evt.key)) ||
61
+ ((_b = NAVIGATION_KEYS.get(orientation)) === null || _b === void 0 ? void 0 : _b.has(evt.key));
62
+ if (!isNavigationKey) {
76
63
  return;
77
64
  }
78
- // Emit the activate event
79
- const activateEventData = { index: activatedTabIndex };
80
- const canActivate = this._adapter.emitHostEvent(TAB_BAR_CONSTANTS.events.ACTIVATE, activateEventData, true, true);
81
- // Check if listener prevented default on the activate event, and stop now if so
82
- if (!canActivate) {
83
- return;
65
+ evt.preventDefault();
66
+ let index = -1;
67
+ if (evt.key === 'Home') {
68
+ // Locate the first non-disabled tab
69
+ index = this._tabs.findIndex(tab => !tab.disabled);
84
70
  }
85
- this.activateTab(activatedTabIndex);
86
- this._adapter.focusTabAtIndex(activatedTabIndex);
87
- }
88
- _onKeydown(evt) {
89
- const key = this._getKeyFromEvent(evt);
90
- // Early exit if the event key isn't one of the keyboard navigation keys
91
- if (!key) {
92
- return;
71
+ else if (evt.key === 'End') {
72
+ // Locate the last non-disabled tab
73
+ index = this._tabs.reduceRight((acc, tab, i) => !tab.disabled && acc === -1 ? i : acc, -1);
74
+ }
75
+ else {
76
+ // Locate the next or previous tab based on the key that was pressed
77
+ const currentIndex = this._tabs.findIndex(tab => tab.matches(':focus'));
78
+ const isPrevKey = evt.key === 'ArrowLeft' || evt.key === 'ArrowUp';
79
+ const calcIndex = (startIndex) => {
80
+ var _a;
81
+ index = startIndex + (isPrevKey ? -1 : 1);
82
+ index = index < 0 ? this._tabs.length - 1 : index % this._tabs.length;
83
+ // Try to recurse until we find a non-disabled tab (unless all tabs are disabled already)
84
+ const isAllTabsDisabled = this._tabs.every(tab => tab.disabled);
85
+ if (!isAllTabsDisabled && ((_a = this._tabs[index]) === null || _a === void 0 ? void 0 : _a.disabled)) {
86
+ calcIndex(index);
87
+ }
88
+ };
89
+ calcIndex(currentIndex);
93
90
  }
94
- // Prevent default behavior for movement keys, but not for activation keys, since :active is used to apply ripple
95
- if (!this._isActivationKey(key)) {
96
- evt.preventDefault();
91
+ if (index === -1) {
92
+ return;
97
93
  }
98
94
  if (this._autoActivate) {
99
- if (this._isActivationKey(key)) {
100
- return;
101
- }
102
- const index = this._determineTargetFromKey(this._activeTab, key);
103
- if (this._activeTab === index) {
104
- return;
105
- }
106
- const activateEventData = { index };
107
- const canActivate = this._adapter.emitHostEvent(TAB_BAR_CONSTANTS.events.ACTIVATE, activateEventData, true, true);
108
- if (canActivate) {
109
- this.activateTab(index);
110
- this._adapter.focusTabAtIndex(index);
111
- }
95
+ this._selectTab(this._tabs[index]);
112
96
  }
113
97
  else {
114
- const focusedTabIndex = this._adapter.getFocusedTabIndex();
115
- if (focusedTabIndex === -1) {
116
- return;
117
- }
118
- if (this._isActivationKey(key)) {
119
- const activateEventData = { index: focusedTabIndex };
120
- const canActivate = this._adapter.emitHostEvent(TAB_BAR_CONSTANTS.events.ACTIVATE, activateEventData, true, true);
121
- if (canActivate) {
122
- this.activateTab(focusedTabIndex);
123
- }
124
- }
125
- else {
126
- const index = this._determineTargetFromKey(focusedTabIndex, key);
127
- if (focusedTabIndex === index) {
128
- return;
129
- }
130
- this._adapter.focusTabAtIndex(index);
131
- this.scrollIntoView(index);
132
- }
98
+ this._tabs[index].focus({ preventScroll: true });
99
+ await this._adapter.tryScrollTabIntoView(this._tabs[index]);
133
100
  }
134
101
  }
135
- _onScrollPrevious(evt) {
136
- const scrollAmount = -this._adapter.getOffsetWidth();
137
- this._adapter.incrementScroll(scrollAmount);
138
- this._syncScrollButtons();
139
- }
140
- _onScrollNext(evt) {
141
- const scrollAmount = this._adapter.getOffsetWidth();
142
- this._adapter.incrementScroll(scrollAmount);
143
- this._syncScrollButtons();
144
- }
145
- _onScroll(evt) {
146
- this._syncScrollButtons();
147
- }
148
- _syncScrollButtons() {
149
- const isScrollable = this._isScrollable();
150
- this._adapter.setPreviousButtonVisibility(isScrollable);
151
- this._adapter.setNextButtonVisibility(isScrollable);
152
- if (isScrollable) {
153
- this._adapter.setPreviousButtonEnabled(this._adapter.isScrolled());
154
- this._adapter.setNextButtonEnabled(!this._adapter.isScrolledEnd());
102
+ async _selectTab(tab, emitEvent = true) {
103
+ if (!tab || tab.disabled) {
104
+ return;
155
105
  }
156
- }
157
- /**
158
- * Determines the index of the adjacent tab closest to either edge of the Tab Bar
159
- * @param index The index of the tab
160
- * @param tabDimensions The dimensions of the tab
161
- * @param scrollPosition The current scroll position
162
- * @param barWidth The width of the tab bar
163
- */
164
- _findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth) {
165
- const relativeRootLeft = tabDimensions.rootLeft - scrollPosition;
166
- const relativeRootRight = tabDimensions.rootRight - scrollPosition - barWidth;
167
- const relativeRootDelta = relativeRootLeft + relativeRootRight;
168
- const leftEdgeIsCloser = relativeRootLeft < 0 || relativeRootDelta < 0;
169
- const rightEdgeIsCloser = relativeRootRight > 0 || relativeRootDelta > 0;
170
- if (leftEdgeIsCloser) {
171
- return index - 1;
106
+ const currentSelectedTab = this._tabs.find(t => t.selected);
107
+ if (currentSelectedTab === tab) {
108
+ return;
172
109
  }
173
- if (rightEdgeIsCloser) {
174
- return index + 1;
110
+ if (emitEvent) {
111
+ const index = this._tabs.indexOf(tab);
112
+ const cancelled = !this._adapter.emitHostEvent(TAB_BAR_CONSTANTS.events.CHANGE, index, true, true);
113
+ if (cancelled) {
114
+ return;
115
+ }
175
116
  }
176
- return -1;
177
- }
178
- /**
179
- * Calculates the scroll increment that will make the tab at the given index visible
180
- * @param index The index of the tab
181
- * @param nextIndex The index of the next tab
182
- * @param scrollPosition The current scroll position
183
- * @param barWidth The width of the tab-bar
184
- */
185
- _calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth) {
186
- const nextTabDimensions = this._adapter.getTabDimensionsAtIndex(nextIndex);
187
- const relativeContentLeft = nextTabDimensions.contentLeft - scrollPosition - barWidth;
188
- const relativeContentRight = nextTabDimensions.contentRight - scrollPosition;
189
- const leftIncrement = relativeContentRight - TAB_BAR_CONSTANTS.numbers.EXTRA_SCROLL_AMOUNT;
190
- const rightIncrement = relativeContentLeft + TAB_BAR_CONSTANTS.numbers.EXTRA_SCROLL_AMOUNT;
191
- if (nextIndex < index) {
192
- return Math.min(leftIncrement, 0);
117
+ // Selecting a tab causes an animation of the indicator to start relative to the currently selected tab
118
+ tab.selected = true;
119
+ tab.focus({ preventScroll: true });
120
+ await this._adapter.tryScrollTabIntoView(tab);
121
+ // Always deselect the currently selected tab after selecting a new tab to allow
122
+ // for the tab indicator animation to run properly (the newly selected tab attempts
123
+ // to locate the current selected tab for its calculations)
124
+ if (currentSelectedTab) {
125
+ currentSelectedTab.selected = false;
193
126
  }
194
- return Math.max(rightIncrement, 0);
127
+ this._activeTab = this._tabs.indexOf(tab);
195
128
  }
196
129
  /**
197
- * Private method for determining the index of the destination tab based on what key was pressed
198
- * @param origin The original index from which to determine the destination
199
- * @param key The name of the key
130
+ * Ensures that all tabs have the correct state based on the tab bar state.
131
+ *
132
+ * This is called whenever a child tab is added to the DOM.
200
133
  */
201
- _determineTargetFromKey(origin, key, nextIndex) {
202
- if (origin === nextIndex) {
203
- return origin;
204
- }
205
- const maxIndex = this._adapter.getTabCount() - 1;
206
- const shouldGoToEnd = key === TAB_BAR_CONSTANTS.strings.END_KEY;
207
- const shouldDecrement = key === TAB_BAR_CONSTANTS.strings.ARROW_LEFT_KEY;
208
- const shouldIncrement = key === TAB_BAR_CONSTANTS.strings.ARROW_RIGHT_KEY;
209
- let index = nextIndex !== undefined ? nextIndex : origin;
210
- if (shouldGoToEnd) {
211
- index = maxIndex;
212
- }
213
- else if (shouldDecrement) {
214
- index -= 1;
215
- }
216
- else if (shouldIncrement) {
217
- index += 1;
218
- }
219
- else {
220
- index = 0;
221
- }
222
- if (index < 0) {
223
- index = maxIndex;
224
- }
225
- else if (index > maxIndex) {
226
- index = 0;
227
- }
228
- // If this tab is disabled, then we'll try again...
229
- if (this._adapter.isTabDisabled(index)) {
230
- return this._determineTargetFromKey(origin, key, index);
231
- }
232
- return index;
233
- }
234
- _isScrollable() {
235
- return this._forceScrollButtons ||
236
- (this._scrollButtons &&
237
- !Platform.isMobile &&
238
- !this._isFixed &&
239
- this._adapter.getScrollContentWidth() > this._adapter.getOffsetWidth());
240
- }
241
- _getKeyFromEvent(evt) {
242
- if (ACCEPTABLE_KEYS.includes(evt.key)) {
243
- return evt.key;
244
- }
245
- return KEYCODE_MAP[evt.keyCode];
134
+ _syncTabState() {
135
+ this._tabs.forEach((tab, index) => {
136
+ tab.selected = index === this._activeTab;
137
+ tab.disabled = this._disabled;
138
+ tab.vertical = this._vertical;
139
+ tab.stacked = this._stacked;
140
+ tab.secondary = this._secondary;
141
+ tab.inverted = this._inverted;
142
+ });
246
143
  }
247
- _isActivationKey(key) {
248
- return key === TAB_BAR_CONSTANTS.strings.SPACE_KEY || key === TAB_BAR_CONSTANTS.strings.ENTER_KEY;
144
+ /** Called when the container size changes, but only if scroll buttons are enabled. */
145
+ _onResize() {
146
+ this._detectScrollableStatus();
249
147
  }
250
- _indexIsInRange(index) {
251
- return index >= 0 && index < this._adapter.getTabCount();
148
+ /** Called when the scroll container scrolls, but only if scroll buttons are enabled. */
149
+ _onScroll() {
150
+ this._updateScrollState();
252
151
  }
253
- activateTab(index) {
254
- if (!isNumber(index)) {
255
- index = -1;
256
- }
257
- // If we have a currently selected tab we need to deactivate that now
258
- if (this._activeTab !== -1) {
259
- this._adapter.deactivateTab(this._activeTab);
260
- }
261
- // Activate the requested tab
262
- const previousTabBounds = this._adapter.getTabBounds(this._activeTab);
263
- this._adapter.activateTab(index, previousTabBounds);
264
- this._adapter.syncTabIndex(index);
265
- this._adapter.ensureFocusableTab();
266
- this.scrollIntoView(index);
267
- this._activeTab = index;
268
- this._syncScrollButtons();
269
- this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.ACTIVE_TAB, this._activeTab.toString());
270
- }
271
- scrollIntoView(index) {
272
- if (!this._indexIsInRange(index)) {
152
+ /** Handles clicking the scroll backward button. */
153
+ _onScrollBackward() {
154
+ this._adapter.scroll('backward');
155
+ }
156
+ /** Handles clicking the scroll forward button. */
157
+ _onScrollForward() {
158
+ this._adapter.scroll('forward');
159
+ }
160
+ /** Determines whether scroll buttons should be displayed based on the size of the container. */
161
+ _detectScrollableStatus() {
162
+ const scrollable = this._adapter.isScrollable();
163
+ if (this._scrollButtonsVisible === scrollable) {
273
164
  return;
274
165
  }
275
- if (index === 0) {
276
- return this._adapter.scrollTo(0);
166
+ this._adapter.setScrollButtons(scrollable);
167
+ if (scrollable) {
168
+ this._adapter.initializeScrollObserver(this._scrollListener);
169
+ this._updateScrollState();
170
+ this._adapter.setScrollBackwardButtonListener(this._scrollBackwardButtonListener);
171
+ this._adapter.setScrollForwardButtonListener(this._scrollForwardButtonListener);
277
172
  }
278
- if (index === this._adapter.getTabCount() - 1) {
279
- return this._adapter.scrollTo(this._adapter.getScrollContentWidth());
280
- }
281
- const scrollPosition = this._adapter.getScrollPosition();
282
- const barWidth = this._adapter.getOffsetWidth();
283
- const tabDimensions = this._adapter.getTabDimensionsAtIndex(index);
284
- const nextIndex = this._findAdjacentTabIndexClosestToEdge(index, tabDimensions, scrollPosition, barWidth);
285
- if (!this._indexIsInRange(nextIndex)) {
286
- return;
173
+ else {
174
+ this._adapter.destroyScrollObserver(this._scrollListener);
175
+ }
176
+ this._scrollButtonsVisible = scrollable;
177
+ }
178
+ /** Updates the enabled/disabled state of the scroll buttons. */
179
+ _updateScrollState() {
180
+ const { isScrolledEnd, isScrolledStart } = this._adapter.getScrollState();
181
+ const state = {
182
+ backwardEnabled: !isScrolledStart,
183
+ forwardEnabled: !isScrolledEnd
184
+ };
185
+ this._adapter.syncScrollButtons(state);
186
+ }
187
+ _tryScrollActiveTabIntoView() {
188
+ if (this._tabScrollAnimationFrame) {
189
+ window.cancelAnimationFrame(this._tabScrollAnimationFrame);
190
+ }
191
+ // We batch the tab scrolling into a single animation frame to unnecessarily scrolling for each tab
192
+ this._tabScrollAnimationFrame = window.requestAnimationFrame(() => {
193
+ this._tabScrollAnimationFrame = undefined;
194
+ if (this._adapter.isScrollable()) {
195
+ if (typeof this._activeTab === 'number' && this._activeTab >= 0 && this._tabs[this._activeTab]) {
196
+ this._adapter.tryScrollTabIntoView(this._tabs[this._activeTab]);
197
+ }
198
+ }
199
+ });
200
+ }
201
+ get disabled() {
202
+ return this._disabled;
203
+ }
204
+ set disabled(value) {
205
+ value = Boolean(value);
206
+ if (this._disabled !== value) {
207
+ this._disabled = value;
208
+ this._tabs.forEach(tab => tab.disabled = this._disabled);
209
+ this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.DISABLED, this._disabled);
287
210
  }
288
- const scrollIncrement = this._calculateScrollIncrement(index, nextIndex, scrollPosition, barWidth);
289
- this._adapter.incrementScroll(scrollIncrement);
290
211
  }
291
- /** Gets and sets the active tab index. */
292
212
  get activeTab() {
293
213
  return this._activeTab;
294
214
  }
295
215
  set activeTab(value) {
296
216
  if (this._activeTab !== value) {
297
- if (!this._isInitialized) {
298
- this._activeTab = value;
299
- this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.ACTIVE_TAB, this._activeTab.toString());
217
+ this._activeTab = value !== null && value !== void 0 ? value : undefined;
218
+ if (typeof this._activeTab === 'number') {
219
+ const newSelectedTab = this._tabs[this._activeTab];
220
+ this._selectTab(newSelectedTab, false);
221
+ this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.ACTIVE_TAB, String(this._activeTab));
300
222
  }
301
223
  else {
302
- this.activateTab(value);
224
+ this._tabs.forEach(tab => tab.selected = false);
225
+ this._adapter.removeHostAttribute(TAB_BAR_CONSTANTS.attributes.ACTIVE_TAB);
303
226
  }
304
227
  }
305
228
  }
306
- get _isFixed() {
307
- return this._layoutMode === 'fixed';
308
- }
309
- get layoutMode() {
310
- return this._layoutMode;
311
- }
312
- set layoutMode(value) {
313
- if (this._layoutMode !== value) {
314
- this._layoutMode = value;
315
- this._adapter.setLayoutMode(this._layoutMode);
316
- this._syncScrollButtons();
317
- }
229
+ get vertical() {
230
+ return this._vertical;
318
231
  }
319
- get layoutAlign() {
320
- return this._layoutAlign;
321
- }
322
- set layoutAlign(value) {
323
- if (this._layoutAlign !== value) {
324
- this._layoutAlign = value;
325
- this._adapter.setLayoutAlign(this._layoutAlign);
232
+ set vertical(value) {
233
+ value = Boolean(value);
234
+ if (this._vertical !== value) {
235
+ this._vertical = value;
236
+ if (this._isInitialized) {
237
+ this._adapter.setVertical(this._vertical);
238
+ }
239
+ this._tabs.forEach(tab => tab.vertical = this._vertical);
240
+ if (this._scrollButtonsVisible) {
241
+ this._adapter.updateScrollButtonIcons(this._vertical);
242
+ }
243
+ this._adapter.toggleHostAttribute(TAB_CONSTANTS.attributes.VERTICAL, this._vertical);
326
244
  }
327
245
  }
328
- get underline() {
329
- return this._underline;
246
+ get clustered() {
247
+ return this._clustered;
330
248
  }
331
- set underline(value) {
332
- if (this._underline !== value) {
333
- this._underline = value;
334
- this._adapter.setUnderline(this._underline);
335
- this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.UNDERLINE, this._underline);
249
+ set clustered(value) {
250
+ value = Boolean(value);
251
+ if (this._clustered !== value) {
252
+ this._clustered = value;
253
+ this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.CLUSTERED, this._clustered);
336
254
  }
337
255
  }
338
256
  get stacked() {
339
257
  return this._stacked;
340
258
  }
341
259
  set stacked(value) {
260
+ value = Boolean(value);
342
261
  if (this._stacked !== value) {
343
262
  this._stacked = value;
344
- this._adapter.setStacked(this._stacked);
345
- if (this._stacked) {
346
- this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.STACKED);
347
- }
348
- else {
349
- this._adapter.removeHostAttribute(TAB_BAR_CONSTANTS.attributes.STACKED);
350
- }
263
+ this._tabs.forEach(tab => tab.stacked = this._stacked);
264
+ this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.STACKED, this._stacked);
351
265
  }
352
266
  }
353
- get scrollButtons() {
354
- return this._scrollButtons;
267
+ get secondary() {
268
+ return this._secondary;
355
269
  }
356
- set scrollButtons(value) {
357
- if (this._scrollButtons !== value) {
358
- this._scrollButtons = value;
359
- this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.SCROLL_BUTTONS, this._scrollButtons.toString());
360
- if (this._isInitialized) {
361
- this._syncScrollButtons();
362
- }
270
+ set secondary(value) {
271
+ value = Boolean(value);
272
+ if (this._secondary !== value) {
273
+ this._secondary = value;
274
+ this._tabs.forEach(tab => tab.secondary = this._secondary);
275
+ this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.SECONDARY, this._secondary);
363
276
  }
364
277
  }
365
- get forceScrollButtons() {
366
- return this._forceScrollButtons;
278
+ get inverted() {
279
+ return this._inverted;
367
280
  }
368
- set forceScrollButtons(value) {
369
- if (this._forceScrollButtons !== value) {
370
- this._forceScrollButtons = value;
371
- if (this._isInitialized) {
372
- this._syncScrollButtons();
373
- }
281
+ set inverted(value) {
282
+ value = Boolean(value);
283
+ if (this._inverted !== value) {
284
+ this._inverted = value;
285
+ this._tabs.forEach(tab => tab.inverted = this._inverted);
286
+ this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.INVERTED, this._inverted);
374
287
  }
375
288
  }
376
289
  get autoActivate() {
377
290
  return this._autoActivate;
378
291
  }
379
292
  set autoActivate(value) {
293
+ value = Boolean(value);
380
294
  if (this._autoActivate !== value) {
381
295
  this._autoActivate = value;
382
- this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.AUTO_ACTIVATE, this._autoActivate.toString());
296
+ this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.AUTO_ACTIVATE, this._autoActivate);
297
+ }
298
+ }
299
+ get scrollButtons() {
300
+ return this._scrollButtons;
301
+ }
302
+ set scrollButtons(value) {
303
+ value = Boolean(value);
304
+ if (this._scrollButtons !== value) {
305
+ this._scrollButtons = Boolean(value);
306
+ if (this._isInitialized) {
307
+ if (this._scrollButtons) {
308
+ this._adapter.initializeContainerSizeObserver(this._resizeListener);
309
+ this._adapter.initializeScrollObserver(this._scrollListener);
310
+ this._detectScrollableStatus();
311
+ this._updateScrollState();
312
+ this._tryScrollActiveTabIntoView();
313
+ }
314
+ else {
315
+ this._adapter.destroyContainerSizeObserver();
316
+ this._adapter.destroyScrollObserver(this._scrollListener);
317
+ this._adapter.setScrollButtons(this._scrollButtons);
318
+ this._scrollButtonsVisible = false;
319
+ }
320
+ }
321
+ this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.SCROLL_BUTTONS, String(this._scrollButtons));
383
322
  }
384
323
  }
385
324
  }