@tylertech/forge 2.13.2 → 2.14.0-dev.0

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 (378) hide show
  1. package/custom-elements.json +1079 -233
  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/checkbox/index.js +1 -1
  21. package/dist/esm/chip-field/index.js +1 -1
  22. package/dist/esm/chips/chip/index.js +1 -1
  23. package/dist/esm/chips/chip-set/index.js +1 -1
  24. package/dist/esm/chips/index.js +1 -1
  25. package/dist/esm/chunks/chunk.24X566SZ.js +7 -0
  26. package/dist/esm/chunks/chunk.24X566SZ.js.map +7 -0
  27. package/dist/esm/chunks/{chunk.N24NHF7Y.js → chunk.2D4IBAWP.js} +2 -2
  28. package/dist/esm/chunks/chunk.323FEQVK.js +7 -0
  29. package/dist/esm/chunks/chunk.323FEQVK.js.map +7 -0
  30. package/dist/esm/chunks/{chunk.Y4L7AVUS.js → chunk.3G237L6C.js} +2 -2
  31. package/dist/esm/chunks/chunk.3UB364WW.js +7 -0
  32. package/dist/esm/chunks/chunk.3UB364WW.js.map +7 -0
  33. package/dist/esm/chunks/chunk.4YH3GB4D.js +12 -0
  34. package/dist/esm/chunks/{chunk.BTI5I25G.js.map → chunk.4YH3GB4D.js.map} +1 -1
  35. package/dist/esm/chunks/{chunk.HPJ4AQIE.js → chunk.54RF4ZT6.js} +2 -2
  36. package/dist/esm/chunks/{chunk.ALJ3FDXL.js → chunk.5DKXUTFN.js} +2 -2
  37. package/dist/esm/chunks/{chunk.ALJ3FDXL.js.map → chunk.5DKXUTFN.js.map} +1 -1
  38. package/dist/esm/chunks/{chunk.5TVWDATE.js → chunk.5W5IPKAU.js} +2 -2
  39. package/dist/esm/chunks/{chunk.PBJEZJTY.js → chunk.65G33MJV.js} +2 -2
  40. package/dist/esm/chunks/{chunk.TLS4ALGU.js → chunk.6NBVXSNZ.js} +2 -2
  41. package/dist/esm/chunks/{chunk.Z4MN5NB5.js → chunk.73O3BMP2.js} +2 -2
  42. package/dist/esm/chunks/{chunk.WEUNLYMQ.js → chunk.7LBAA7TC.js} +2 -2
  43. package/dist/esm/chunks/chunk.AGEBZY4S.js +7 -0
  44. package/dist/esm/chunks/chunk.AGEBZY4S.js.map +7 -0
  45. package/dist/esm/chunks/chunk.B5HGV5EZ.js +7 -0
  46. package/dist/esm/chunks/chunk.B5HGV5EZ.js.map +7 -0
  47. package/dist/esm/chunks/chunk.C557PTJ5.js +7 -0
  48. package/dist/esm/chunks/chunk.C557PTJ5.js.map +7 -0
  49. package/dist/esm/chunks/{chunk.VW4JVRH7.js → chunk.CN7DHS4J.js} +2 -2
  50. package/dist/esm/chunks/chunk.CUT7V2KN.js +7 -0
  51. package/dist/esm/chunks/chunk.CUT7V2KN.js.map +7 -0
  52. package/dist/esm/chunks/chunk.CZIQTYFJ.js +7 -0
  53. package/dist/esm/chunks/chunk.CZIQTYFJ.js.map +7 -0
  54. package/dist/esm/chunks/{chunk.BYRJ7577.js → chunk.DRI2NLIB.js} +2 -2
  55. package/dist/esm/chunks/chunk.EE2LK23T.js +7 -0
  56. package/dist/esm/chunks/chunk.EE2LK23T.js.map +7 -0
  57. package/dist/esm/chunks/chunk.EXKBJEFL.js +7 -0
  58. package/dist/esm/chunks/{chunk.ZPBGKHHM.js.map → chunk.EXKBJEFL.js.map} +2 -2
  59. package/dist/esm/chunks/{chunk.7MVBJ37L.js → chunk.FBERE7AL.js} +2 -2
  60. package/dist/esm/chunks/{chunk.OJFI5I6O.js → chunk.FQEETXUQ.js} +2 -2
  61. package/dist/esm/chunks/{chunk.3STDLL5U.js → chunk.G5JTL66M.js} +2 -2
  62. package/dist/esm/chunks/chunk.GVZEMIA3.js +7 -0
  63. package/dist/esm/chunks/chunk.GVZEMIA3.js.map +7 -0
  64. package/dist/esm/chunks/{chunk.BCP2YATB.js → chunk.GZEWDHFJ.js} +2 -2
  65. package/dist/esm/chunks/chunk.HQJZRTOH.js +7 -0
  66. package/dist/esm/chunks/chunk.HQJZRTOH.js.map +7 -0
  67. package/dist/esm/chunks/{chunk.ZAGCOV55.js → chunk.HUX56BCR.js} +2 -2
  68. package/dist/esm/chunks/chunk.K5WLIDQK.js +7 -0
  69. package/dist/esm/chunks/chunk.K5WLIDQK.js.map +7 -0
  70. package/dist/esm/chunks/chunk.LGECRZFO.js +7 -0
  71. package/dist/esm/chunks/chunk.LGECRZFO.js.map +7 -0
  72. package/dist/esm/chunks/{chunk.MBS5VMYY.js → chunk.LYAS4FAN.js} +2 -2
  73. package/dist/esm/chunks/{chunk.MBS5VMYY.js.map → chunk.LYAS4FAN.js.map} +2 -2
  74. package/dist/esm/chunks/{chunk.YG2KLPHA.js.map → chunk.MU4FV57Q.js} +7 -7
  75. package/dist/esm/chunks/chunk.MU4FV57Q.js.map +7 -0
  76. package/dist/esm/chunks/chunk.N6QJ2RRG.js +7 -0
  77. package/dist/esm/chunks/chunk.N6QJ2RRG.js.map +7 -0
  78. package/dist/esm/chunks/{chunk.O5I3ZMDA.js → chunk.NG5EGZ5Y.js} +2 -2
  79. package/dist/esm/chunks/chunk.NXS7A7PO.js +7 -0
  80. package/dist/esm/chunks/{chunk.5BDTX7CR.js.map → chunk.NXS7A7PO.js.map} +2 -2
  81. package/dist/esm/chunks/{chunk.SLSVRMAS.js → chunk.NZTGBDRK.js} +2 -2
  82. package/dist/esm/chunks/{chunk.OLNFXF3V.js → chunk.O4LGKJY6.js} +2 -2
  83. package/dist/esm/chunks/{chunk.NV2HNCQH.js → chunk.OGZOXNGT.js} +2 -2
  84. package/dist/esm/chunks/chunk.OKIRZEUG.js +7 -0
  85. package/dist/esm/chunks/chunk.OKIRZEUG.js.map +7 -0
  86. package/dist/esm/chunks/{chunk.36VS7FMU.js → chunk.OTI6WL66.js} +2 -2
  87. package/dist/esm/chunks/chunk.P45HS252.js +7 -0
  88. package/dist/esm/chunks/chunk.P45HS252.js.map +7 -0
  89. package/dist/esm/chunks/{chunk.Y5GQ2BA7.js → chunk.P5GT5YBP.js} +2 -2
  90. package/dist/esm/chunks/chunk.P6IF3USM.js +7 -0
  91. package/dist/esm/chunks/chunk.P6IF3USM.js.map +7 -0
  92. package/dist/esm/chunks/chunk.PBL2N45I.js +7 -0
  93. package/dist/esm/chunks/chunk.PBL2N45I.js.map +7 -0
  94. package/dist/esm/chunks/{chunk.HWQEGQDD.js → chunk.PHJPLWFH.js} +2 -2
  95. package/dist/esm/chunks/chunk.PRO76W5D.js +7 -0
  96. package/dist/esm/chunks/{chunk.7TDB3VFH.js.map → chunk.PRO76W5D.js.map} +2 -2
  97. package/dist/esm/chunks/chunk.PV5MABYN.js +7 -0
  98. package/dist/esm/chunks/chunk.PV5MABYN.js.map +7 -0
  99. package/dist/esm/chunks/chunk.R2L3S3YD.js +7 -0
  100. package/dist/esm/chunks/chunk.R2L3S3YD.js.map +7 -0
  101. package/dist/esm/chunks/{chunk.QH4DLM3R.js → chunk.R4NZYUID.js} +2 -2
  102. package/dist/esm/chunks/chunk.RH2NL523.js +7 -0
  103. package/dist/esm/chunks/chunk.RH2NL523.js.map +7 -0
  104. package/dist/esm/chunks/{chunk.IMZ5PF4C.js → chunk.ROF42KJ3.js} +2 -2
  105. package/dist/esm/chunks/{chunk.B52LJRGH.js → chunk.RT4C67NK.js} +2 -2
  106. package/dist/esm/chunks/chunk.T2M2KVP7.js +29 -0
  107. package/dist/esm/chunks/chunk.T2M2KVP7.js.map +7 -0
  108. package/dist/esm/chunks/chunk.TMJBIAWC.js +7 -0
  109. package/dist/esm/chunks/chunk.TMJBIAWC.js.map +7 -0
  110. package/dist/esm/chunks/{chunk.HHJJJ73Y.js → chunk.UPFJ3PVE.js} +2 -2
  111. package/dist/esm/chunks/{chunk.HHJJJ73Y.js.map → chunk.UPFJ3PVE.js.map} +1 -1
  112. package/dist/esm/chunks/{chunk.DB2WESQC.js → chunk.XC76IHG4.js} +2 -2
  113. package/dist/esm/chunks/chunk.XCUYZZV4.js +7 -0
  114. package/dist/esm/chunks/chunk.XCUYZZV4.js.map +7 -0
  115. package/dist/esm/chunks/{chunk.YONRMJU5.js → chunk.XMI5RBZQ.js} +2 -2
  116. package/dist/esm/chunks/chunk.XMI5RBZQ.js.map +7 -0
  117. package/dist/esm/chunks/chunk.XY4N4TSH.js +7 -0
  118. package/dist/esm/chunks/chunk.XY4N4TSH.js.map +7 -0
  119. package/dist/esm/chunks/{chunk.N46G56GG.js → chunk.YKXCORJE.js} +2 -2
  120. package/dist/esm/chunks/{chunk.2ZQ3ZDPN.js → chunk.YPMN5U7C.js} +2 -2
  121. package/dist/esm/chunks/{chunk.X5JLUP7O.js → chunk.YW47QJVY.js} +2 -2
  122. package/dist/esm/chunks/{chunk.JXY6MTP3.js → chunk.ZAKLVVFO.js} +2 -2
  123. package/dist/esm/chunks/{chunk.YWRCWMNO.js → chunk.ZQCHS2PS.js} +2 -2
  124. package/dist/esm/color-picker/index.js +1 -1
  125. package/dist/esm/core/index.js +1 -1
  126. package/dist/esm/core/utils/index.js +1 -1
  127. package/dist/esm/date-picker/index.js +1 -1
  128. package/dist/esm/date-range-picker/index.js +1 -1
  129. package/dist/esm/dialog/index.js +1 -1
  130. package/dist/esm/expansion-panel/index.js +1 -1
  131. package/dist/esm/file-picker/index.js +1 -1
  132. package/dist/esm/floating-action-button/index.js +1 -1
  133. package/dist/esm/icon/index.js +1 -1
  134. package/dist/esm/icon-button/index.js +1 -1
  135. package/dist/esm/index.js +1 -1
  136. package/dist/esm/linear-progress/index.js +1 -1
  137. package/dist/esm/list/index.js +1 -1
  138. package/dist/esm/list/list/index.js +1 -1
  139. package/dist/esm/list/list-item/index.js +1 -1
  140. package/dist/esm/list-dropdown/index.js +1 -1
  141. package/dist/esm/menu/index.js +1 -1
  142. package/dist/esm/open-icon/index.js +1 -1
  143. package/dist/esm/paginator/index.js +1 -1
  144. package/dist/esm/popup/index.js +1 -1
  145. package/dist/esm/profile-card/index.js +1 -1
  146. package/dist/esm/quantity-field/index.js +1 -1
  147. package/dist/esm/radio/index.js +1 -1
  148. package/dist/esm/ripple/index.js +1 -1
  149. package/dist/esm/select/core/index.js +1 -1
  150. package/dist/esm/select/index.js +1 -1
  151. package/dist/esm/select/option-group/index.js +1 -1
  152. package/dist/esm/select/select/index.js +1 -1
  153. package/dist/esm/select/select-dropdown/index.js +1 -1
  154. package/dist/esm/slider/index.js +1 -1
  155. package/dist/esm/split-view/index.js +1 -1
  156. package/dist/esm/split-view/split-view/index.js +1 -1
  157. package/dist/esm/split-view/split-view-panel/index.js +1 -1
  158. package/dist/esm/stepper/index.js +1 -1
  159. package/dist/esm/stepper/step/index.js +1 -1
  160. package/dist/esm/stepper/stepper/index.js +1 -1
  161. package/dist/esm/switch/index.js +1 -1
  162. package/dist/esm/table/index.js +1 -1
  163. package/dist/esm/tabs/index.js +1 -1
  164. package/dist/esm/tabs/tab/index.js +1 -1
  165. package/dist/esm/tabs/tab-bar/index.js +1 -1
  166. package/dist/esm/text-field/index.js +1 -1
  167. package/dist/esm/time-picker/index.js +1 -1
  168. package/dist/esm/toast/index.js +1 -1
  169. package/dist/esm/toolbar/index.js +1 -1
  170. package/esm/app-bar/notification-button/app-bar-notification-button-adapter.d.ts +3 -0
  171. package/esm/app-bar/notification-button/app-bar-notification-button-adapter.js +5 -0
  172. package/esm/app-bar/notification-button/app-bar-notification-button-constants.d.ts +1 -0
  173. package/esm/app-bar/notification-button/app-bar-notification-button-constants.js +2 -1
  174. package/esm/app-bar/notification-button/app-bar-notification-button-foundation.d.ts +4 -0
  175. package/esm/app-bar/notification-button/app-bar-notification-button-foundation.js +14 -0
  176. package/esm/app-bar/notification-button/app-bar-notification-button.d.ts +2 -0
  177. package/esm/app-bar/notification-button/app-bar-notification-button.js +9 -2
  178. package/esm/autocomplete/autocomplete-adapter.d.ts +9 -10
  179. package/esm/autocomplete/autocomplete-adapter.js +1 -1
  180. package/esm/autocomplete/autocomplete-constants.d.ts +10 -12
  181. package/esm/autocomplete/autocomplete-foundation.d.ts +6 -7
  182. package/esm/autocomplete/autocomplete-foundation.js +5 -2
  183. package/esm/autocomplete/autocomplete-utils.d.ts +4 -5
  184. package/esm/autocomplete/autocomplete.d.ts +3 -4
  185. package/esm/autocomplete/autocomplete.js +2 -2
  186. package/esm/button/button-constants.d.ts +1 -0
  187. package/esm/button/button-constants.js +2 -1
  188. package/esm/button/button.d.ts +1 -1
  189. package/esm/button/button.js +6 -7
  190. package/esm/calendar/calendar-foundation.js +1 -0
  191. package/esm/checkbox/checkbox-adapter.d.ts +1 -2
  192. package/esm/checkbox/checkbox-adapter.js +12 -8
  193. package/esm/checkbox/checkbox-foundation.js +0 -3
  194. package/esm/chip-field/chip-field-adapter.d.ts +2 -0
  195. package/esm/chip-field/chip-field-adapter.js +8 -3
  196. package/esm/chip-field/chip-field-foundation.js +1 -0
  197. package/esm/chip-field/chip-field.js +1 -1
  198. package/esm/color-picker/color-picker-foundation.d.ts +1 -0
  199. package/esm/color-picker/color-picker-foundation.js +19 -8
  200. package/esm/core/utils/date-utils.js +2 -2
  201. package/esm/core/utils/utils.d.ts +0 -6
  202. package/esm/core/utils/utils.js +0 -10
  203. package/esm/date-picker/base/base-date-picker-foundation.js +2 -1
  204. package/esm/date-picker/base/base-date-picker.d.ts +2 -2
  205. package/esm/date-range-picker/date-range-picker-foundation.d.ts +2 -2
  206. package/esm/date-range-picker/date-range-picker-foundation.js +1 -1
  207. package/esm/dialog/dialog-adapter.d.ts +0 -2
  208. package/esm/dialog/dialog-adapter.js +1 -10
  209. package/esm/dialog/dialog-foundation.js +0 -1
  210. package/esm/file-picker/file-picker-adapter.js +3 -2
  211. package/esm/file-picker/file-picker-foundation.d.ts +2 -0
  212. package/esm/file-picker/file-picker-foundation.js +15 -38
  213. package/esm/file-picker/file-picker.d.ts +1 -0
  214. package/esm/file-picker/file-picker.js +3 -0
  215. package/esm/floating-action-button/floating-action-button-constants.js +1 -1
  216. package/esm/icon-button/icon-button-constants.js +1 -1
  217. package/esm/icon-button/icon-button.d.ts +1 -1
  218. package/esm/icon-button/icon-button.js +6 -6
  219. package/esm/linear-progress/linear-progress.js +1 -1
  220. package/esm/list/list-item/list-item-foundation.js +1 -2
  221. package/esm/list/list-item/list-item.js +1 -1
  222. package/esm/list-dropdown/cascading-list-dropdown-aware-foundation.d.ts +5 -2
  223. package/esm/list-dropdown/cascading-list-dropdown-aware-foundation.js +3 -1
  224. package/esm/list-dropdown/list-dropdown-aware-foundation.d.ts +8 -0
  225. package/esm/list-dropdown/list-dropdown-aware-foundation.js +14 -0
  226. package/esm/list-dropdown/list-dropdown-aware.d.ts +11 -2
  227. package/esm/list-dropdown/list-dropdown-aware.js +12 -0
  228. package/esm/list-dropdown/list-dropdown-constants.d.ts +9 -3
  229. package/esm/list-dropdown/list-dropdown-constants.js +2 -0
  230. package/esm/list-dropdown/list-dropdown-foundation.js +2 -6
  231. package/esm/list-dropdown/list-dropdown-utils.d.ts +1 -0
  232. package/esm/list-dropdown/list-dropdown-utils.js +39 -17
  233. package/esm/menu/menu-adapter.d.ts +2 -0
  234. package/esm/menu/menu-adapter.js +7 -0
  235. package/esm/menu/menu-constants.js +1 -1
  236. package/esm/menu/menu-foundation.d.ts +12 -3
  237. package/esm/menu/menu-foundation.js +28 -17
  238. package/esm/menu/menu.d.ts +6 -1
  239. package/esm/menu/menu.js +9 -3
  240. package/esm/popup/popup-adapter.js +9 -1
  241. package/esm/popup/popup-constants.d.ts +1 -0
  242. package/esm/popup/popup-constants.js +2 -1
  243. package/esm/popup/popup-foundation.d.ts +4 -0
  244. package/esm/popup/popup-foundation.js +7 -0
  245. package/esm/popup/popup.d.ts +2 -0
  246. package/esm/popup/popup.js +4 -1
  247. package/esm/quantity-field/quantity-field-adapter.d.ts +2 -0
  248. package/esm/quantity-field/quantity-field-adapter.js +8 -0
  249. package/esm/quantity-field/quantity-field-foundation.js +1 -0
  250. package/esm/quantity-field/quantity-field.js +6 -0
  251. package/esm/radio/radio-adapter.d.ts +3 -3
  252. package/esm/radio/radio-adapter.js +17 -15
  253. package/esm/radio/radio-foundation.js +1 -1
  254. package/esm/ripple/forge-ripple.d.ts +1 -0
  255. package/esm/ripple/forge-ripple.js +3 -0
  256. package/esm/ripple/ripple-constants.d.ts +1 -0
  257. package/esm/ripple/ripple-constants.js +2 -1
  258. package/esm/ripple/ripple-foundation.d.ts +4 -0
  259. package/esm/ripple/ripple-foundation.js +10 -0
  260. package/esm/ripple/ripple.d.ts +2 -0
  261. package/esm/ripple/ripple.js +8 -1
  262. package/esm/select/core/base-select-adapter.js +8 -6
  263. package/esm/select/core/base-select-constants.d.ts +2 -0
  264. package/esm/select/core/base-select-constants.js +3 -1
  265. package/esm/select/core/base-select-foundation.d.ts +0 -9
  266. package/esm/select/core/base-select-foundation.js +5 -26
  267. package/esm/select/core/select-utils.js +1 -1
  268. package/esm/select/option-group/option-group.d.ts +12 -1
  269. package/esm/select/option-group/option-group.js +7 -0
  270. package/esm/select/select/select.js +5 -3
  271. package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
  272. package/esm/switch/switch.js +37 -12
  273. package/esm/table/table-foundation.d.ts +7 -0
  274. package/esm/table/table-foundation.js +9 -0
  275. package/esm/table/table-utils.js +6 -3
  276. package/esm/table/table.d.ts +7 -0
  277. package/esm/table/table.js +8 -0
  278. package/esm/table/types.d.ts +8 -4
  279. package/esm/text-field/text-field.js +1 -1
  280. package/esm/time-picker/time-picker-foundation.js +1 -0
  281. package/esm/toolbar/toolbar.js +2 -2
  282. package/package.json +30 -3
  283. package/styles/chip-field/_selector.scss +12 -13
  284. package/styles/chip-field/chip-field.scss +1 -1
  285. package/styles/field/_base.scss +2 -2
  286. package/styles/field/_selector.scss +1 -1
  287. package/styles/list/list-item/_mixins.scss +28 -17
  288. package/styles/list/list-item/_variables.scss +13 -4
  289. package/styles/popup/popup.scss +4 -0
  290. package/styles/toolbar/_mixins.scss +1 -2
  291. package/styles/toolbar/toolbar.scss +13 -0
  292. package/dist/esm/chunks/chunk.3MP6OFVU.js +0 -7
  293. package/dist/esm/chunks/chunk.3MP6OFVU.js.map +0 -7
  294. package/dist/esm/chunks/chunk.4K3IV4GI.js +0 -7
  295. package/dist/esm/chunks/chunk.4K3IV4GI.js.map +0 -7
  296. package/dist/esm/chunks/chunk.5BDTX7CR.js +0 -7
  297. package/dist/esm/chunks/chunk.6LXDG4W5.js +0 -7
  298. package/dist/esm/chunks/chunk.6LXDG4W5.js.map +0 -7
  299. package/dist/esm/chunks/chunk.7R6TYPPS.js +0 -7
  300. package/dist/esm/chunks/chunk.7R6TYPPS.js.map +0 -7
  301. package/dist/esm/chunks/chunk.7TDB3VFH.js +0 -7
  302. package/dist/esm/chunks/chunk.BCD4AAI2.js +0 -7
  303. package/dist/esm/chunks/chunk.BCD4AAI2.js.map +0 -7
  304. package/dist/esm/chunks/chunk.BTI5I25G.js +0 -12
  305. package/dist/esm/chunks/chunk.DLAIQJHL.js +0 -7
  306. package/dist/esm/chunks/chunk.DLAIQJHL.js.map +0 -7
  307. package/dist/esm/chunks/chunk.DURRORXO.js +0 -29
  308. package/dist/esm/chunks/chunk.DURRORXO.js.map +0 -7
  309. package/dist/esm/chunks/chunk.EDU7RQD7.js +0 -7
  310. package/dist/esm/chunks/chunk.EDU7RQD7.js.map +0 -7
  311. package/dist/esm/chunks/chunk.ETIN6DEM.js +0 -7
  312. package/dist/esm/chunks/chunk.ETIN6DEM.js.map +0 -7
  313. package/dist/esm/chunks/chunk.F2GXZPID.js +0 -7
  314. package/dist/esm/chunks/chunk.F2GXZPID.js.map +0 -7
  315. package/dist/esm/chunks/chunk.F3Q62EMG.js +0 -7
  316. package/dist/esm/chunks/chunk.F3Q62EMG.js.map +0 -7
  317. package/dist/esm/chunks/chunk.GEMZPO6Z.js +0 -7
  318. package/dist/esm/chunks/chunk.GEMZPO6Z.js.map +0 -7
  319. package/dist/esm/chunks/chunk.JMXJXZTS.js +0 -7
  320. package/dist/esm/chunks/chunk.JMXJXZTS.js.map +0 -7
  321. package/dist/esm/chunks/chunk.M4KJNCLO.js +0 -7
  322. package/dist/esm/chunks/chunk.M4KJNCLO.js.map +0 -7
  323. package/dist/esm/chunks/chunk.MBWEYW6M.js +0 -7
  324. package/dist/esm/chunks/chunk.MBWEYW6M.js.map +0 -7
  325. package/dist/esm/chunks/chunk.O2R6MBT5.js +0 -7
  326. package/dist/esm/chunks/chunk.O2R6MBT5.js.map +0 -7
  327. package/dist/esm/chunks/chunk.ON6FJ2D6.js +0 -7
  328. package/dist/esm/chunks/chunk.ON6FJ2D6.js.map +0 -7
  329. package/dist/esm/chunks/chunk.PCSCKTFS.js +0 -7
  330. package/dist/esm/chunks/chunk.PCSCKTFS.js.map +0 -7
  331. package/dist/esm/chunks/chunk.Q3RRONZQ.js +0 -7
  332. package/dist/esm/chunks/chunk.Q3RRONZQ.js.map +0 -7
  333. package/dist/esm/chunks/chunk.QIJHHDYF.js +0 -7
  334. package/dist/esm/chunks/chunk.QIJHHDYF.js.map +0 -7
  335. package/dist/esm/chunks/chunk.QMRLSOAB.js +0 -7
  336. package/dist/esm/chunks/chunk.QMRLSOAB.js.map +0 -7
  337. package/dist/esm/chunks/chunk.UOWU5VVK.js +0 -7
  338. package/dist/esm/chunks/chunk.UOWU5VVK.js.map +0 -7
  339. package/dist/esm/chunks/chunk.WOHCW6KW.js +0 -7
  340. package/dist/esm/chunks/chunk.WOHCW6KW.js.map +0 -7
  341. package/dist/esm/chunks/chunk.WU24GAQY.js +0 -7
  342. package/dist/esm/chunks/chunk.WU24GAQY.js.map +0 -7
  343. package/dist/esm/chunks/chunk.XSZ4S77A.js +0 -7
  344. package/dist/esm/chunks/chunk.XSZ4S77A.js.map +0 -7
  345. package/dist/esm/chunks/chunk.YG2KLPHA.js +0 -7
  346. package/dist/esm/chunks/chunk.YONRMJU5.js.map +0 -7
  347. package/dist/esm/chunks/chunk.ZPBGKHHM.js +0 -7
  348. /package/dist/esm/chunks/{chunk.N24NHF7Y.js.map → chunk.2D4IBAWP.js.map} +0 -0
  349. /package/dist/esm/chunks/{chunk.Y4L7AVUS.js.map → chunk.3G237L6C.js.map} +0 -0
  350. /package/dist/esm/chunks/{chunk.HPJ4AQIE.js.map → chunk.54RF4ZT6.js.map} +0 -0
  351. /package/dist/esm/chunks/{chunk.5TVWDATE.js.map → chunk.5W5IPKAU.js.map} +0 -0
  352. /package/dist/esm/chunks/{chunk.PBJEZJTY.js.map → chunk.65G33MJV.js.map} +0 -0
  353. /package/dist/esm/chunks/{chunk.TLS4ALGU.js.map → chunk.6NBVXSNZ.js.map} +0 -0
  354. /package/dist/esm/chunks/{chunk.Z4MN5NB5.js.map → chunk.73O3BMP2.js.map} +0 -0
  355. /package/dist/esm/chunks/{chunk.WEUNLYMQ.js.map → chunk.7LBAA7TC.js.map} +0 -0
  356. /package/dist/esm/chunks/{chunk.VW4JVRH7.js.map → chunk.CN7DHS4J.js.map} +0 -0
  357. /package/dist/esm/chunks/{chunk.BYRJ7577.js.map → chunk.DRI2NLIB.js.map} +0 -0
  358. /package/dist/esm/chunks/{chunk.7MVBJ37L.js.map → chunk.FBERE7AL.js.map} +0 -0
  359. /package/dist/esm/chunks/{chunk.OJFI5I6O.js.map → chunk.FQEETXUQ.js.map} +0 -0
  360. /package/dist/esm/chunks/{chunk.3STDLL5U.js.map → chunk.G5JTL66M.js.map} +0 -0
  361. /package/dist/esm/chunks/{chunk.BCP2YATB.js.map → chunk.GZEWDHFJ.js.map} +0 -0
  362. /package/dist/esm/chunks/{chunk.ZAGCOV55.js.map → chunk.HUX56BCR.js.map} +0 -0
  363. /package/dist/esm/chunks/{chunk.O5I3ZMDA.js.map → chunk.NG5EGZ5Y.js.map} +0 -0
  364. /package/dist/esm/chunks/{chunk.SLSVRMAS.js.map → chunk.NZTGBDRK.js.map} +0 -0
  365. /package/dist/esm/chunks/{chunk.OLNFXF3V.js.map → chunk.O4LGKJY6.js.map} +0 -0
  366. /package/dist/esm/chunks/{chunk.NV2HNCQH.js.map → chunk.OGZOXNGT.js.map} +0 -0
  367. /package/dist/esm/chunks/{chunk.36VS7FMU.js.map → chunk.OTI6WL66.js.map} +0 -0
  368. /package/dist/esm/chunks/{chunk.Y5GQ2BA7.js.map → chunk.P5GT5YBP.js.map} +0 -0
  369. /package/dist/esm/chunks/{chunk.HWQEGQDD.js.map → chunk.PHJPLWFH.js.map} +0 -0
  370. /package/dist/esm/chunks/{chunk.QH4DLM3R.js.map → chunk.R4NZYUID.js.map} +0 -0
  371. /package/dist/esm/chunks/{chunk.IMZ5PF4C.js.map → chunk.ROF42KJ3.js.map} +0 -0
  372. /package/dist/esm/chunks/{chunk.B52LJRGH.js.map → chunk.RT4C67NK.js.map} +0 -0
  373. /package/dist/esm/chunks/{chunk.DB2WESQC.js.map → chunk.XC76IHG4.js.map} +0 -0
  374. /package/dist/esm/chunks/{chunk.N46G56GG.js.map → chunk.YKXCORJE.js.map} +0 -0
  375. /package/dist/esm/chunks/{chunk.2ZQ3ZDPN.js.map → chunk.YPMN5U7C.js.map} +0 -0
  376. /package/dist/esm/chunks/{chunk.X5JLUP7O.js.map → chunk.YW47QJVY.js.map} +0 -0
  377. /package/dist/esm/chunks/{chunk.JXY6MTP3.js.map → chunk.ZAKLVVFO.js.map} +0 -0
  378. /package/dist/esm/chunks/{chunk.YWRCWMNO.js.map → chunk.ZQCHS2PS.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/time-picker/time-picker-constants.ts", "../../src/time-picker/time-picker-adapter.ts", "../../src/time-picker/time-picker-utils.ts", "../../src/time-picker/time-picker-foundation.ts", "../../src/time-picker/time-picker.ts", "../../src/time-picker/time-picker-component-delegate.ts", "../../src/time-picker/index.ts"],
4
+ "sourcesContent": ["import { COMPONENT_NAME_PREFIX } from '../constants';\nimport { IListDropdownOption } from '../list-dropdown/list-dropdown-constants';\nimport IMask, { Masked, InputMask } from 'imask';\n\nconst elementName: keyof HTMLElementTagNameMap = `${COMPONENT_NAME_PREFIX}time-picker`;\n\nconst attributes = {\n TOGGLE: 'forge-time-picker-toggle',\n VALUE: 'value',\n OPEN: 'open',\n ALLOW_SECONDS: 'allow-seconds',\n MASKED: 'masked',\n SHOW_MASK_FORMAT: 'show-mask-format',\n USE_24_HOUR_TIME: 'use-24-hour-time',\n ALLOW_INVALID_TIME: 'allow-invalid-time',\n MIN: 'min',\n MAX: 'max',\n START_TIME: 'start-time',\n STEP: 'step',\n ALLOW_INPUT: 'allow-input',\n SHOW_NOW: 'show-now',\n SHOW_HOUR_OPTIONS: 'show-hour-options',\n DISABLED: 'disabled',\n POPUP_CLASSES: 'popup-classes',\n ALLOW_DROPDOWN: 'allow-dropdown'\n};\n\nconst selectors = {\n INPUT: 'input, input[forge-time-picker-input]',\n TOGGLE: `[${attributes.TOGGLE}]`\n};\n\nconst events = {\n OPEN: `${elementName}-open`,\n CLOSE: `${elementName}-close`,\n INPUT: `${elementName}-input`,\n CHANGE: `${elementName}-change`\n};\n\nconst numbers = {\n DEFAULT_MINUTE_STEP: 60,\n MAX_DAY_MILLIS: 86400000,\n MAX_DAY_MINUTES: 1440\n};\n\nexport const TIME_PICKER_CONSTANTS = {\n elementName,\n attributes,\n selectors,\n events,\n numbers\n};\n\nexport type TimePickerValidationCallback = (time: string) => boolean;\nexport type TimePickerParseCallback = (time: string) => number | null;\nexport type TimePickerFormatCallback = (value: number | null) => string;\nexport type TimePickerCustomOptionCallback<T> = (value: T, use24HourTime: boolean, allowSeconds: boolean) => number;\nexport type TimePickerCoercionCallback = (rawValue: string, coercedValue: string, allowSeconds: boolean) => string;\nexport type TimePickerPrepareMaskCallback = (value: string, masked: Masked<string>, flags: IMask.AppendFlags, maskInstance: InputMask<IMask.AnyMaskedOptions>) => string;\n\nexport interface ITimePickerOption<T = any> extends IListDropdownOption<T> {\n toMilliseconds: TimePickerCustomOptionCallback<T>;\n}\nexport interface ITimePickerOptionValue {\n time: number | null;\n metadata?: any;\n isCustom?: boolean;\n customCallback?: TimePickerCustomOptionCallback<any>;\n}\n", "import { getShadowElement, emitEvent, getActiveElement, toggleAttribute } from '@tylertech/forge-core';\nimport { ITimePickerComponent } from './time-picker';\nimport { BaseAdapter } from '../core';\nimport { TIME_PICKER_CONSTANTS } from './time-picker-constants';\nimport { ITimeInputMaskOptions, TimeInputMask } from '../core/mask/time-input-mask';\nimport { TEXT_FIELD_CONSTANTS, ITextFieldComponent } from '../text-field';\nimport { ICON_BUTTON_CONSTANTS, IIconButtonComponent } from '../icon-button';\nimport { ICON_CONSTANTS, IIconComponent } from '../icon';\nimport { IListDropdownConfig, IListDropdownOption } from '../list-dropdown/list-dropdown-constants';\nimport { IListDropdown, ListDropdown } from '../list-dropdown';\n\nexport interface ITimePickerAdapter extends BaseAdapter<ITimePickerComponent> {\n initialize(): void;\n initializeMask(options: ITimeInputMaskOptions): void;\n destroy(): void;\n destroyMask(): void;\n initializeAccessibility(identifier: string): void;\n addInputListener(type: string, listener: (event: Event) => void, capture?: boolean): void;\n removeInputListener(type: string, listener: (event: Event) => void, capture?: boolean): void;\n addToggleListener(type: string, listener: (event: Event) => void): void;\n removeToggleListener(type: string, listener: (event: Event) => void): void;\n hasInputElement(): boolean;\n tryCreateToggle(): void;\n tryFocusInput(): void;\n tryBlurInput(): void;\n selectInputText(): void;\n getInputValue(): string;\n setInputValue(value: string, emitEvents: boolean): void;\n isInputDisabled(): boolean;\n isInputFocused(): boolean;\n setDisabled(isDisabled: boolean): void;\n attachDropdown(config: IListDropdownConfig): void;\n detachDropdown(): void;\n setActiveDescendant(id: string): void;\n propagateKey(key: string): void;\n getTargetElementWidth(selector: string): number;\n emitInputEvent(type: string, data?: any): void;\n setInputReadonly(value: boolean): void;\n setToggleDisabled(value: boolean): void;\n activateFirstOption(): void;\n getActiveOption(): IListDropdownOption | undefined;\n}\n\nexport class TimePickerAdapter extends BaseAdapter<ITimePickerComponent> implements ITimePickerAdapter {\n private _inputElement: HTMLInputElement;\n private _toggleElement?: HTMLElement;\n private _inputMask?: TimeInputMask;\n private _listDropdown?: IListDropdown;\n private _targetElement?: HTMLElement;\n\n constructor(component: ITimePickerComponent) {\n super(component);\n }\n\n public initialize(): void {\n this._inputElement = this._component.querySelector(TIME_PICKER_CONSTANTS.selectors.INPUT) as HTMLInputElement;\n }\n\n public initializeMask(options: ITimeInputMaskOptions): void {\n if (this._inputMask) {\n this._inputMask.destroy();\n }\n this._inputMask = new TimeInputMask(this._inputElement, options);\n }\n\n public destroy(): void {\n this._targetElement = undefined;\n this._toggleElement = undefined as any;\n this._inputElement = undefined as any;\n }\n\n public destroyMask(): void {\n if (this._inputMask) {\n this._inputMask.destroy();\n this._inputMask = undefined;\n }\n }\n\n public initializeAccessibility(identifier: string): void {\n this._inputElement.setAttribute('autocomplete', 'off');\n this._inputElement.setAttribute('autocorrect', 'off');\n this._inputElement.setAttribute('autocapitalize', 'off');\n this._inputElement.setAttribute('spellcheck', 'false');\n this._inputElement.setAttribute('role', 'combobox');\n this._inputElement.setAttribute('aria-live', 'assertive');\n this._inputElement.setAttribute('aria-atomic', 'true');\n this._inputElement.setAttribute('aria-haspopup', 'true');\n this._inputElement.setAttribute('aria-expanded', 'false');\n }\n\n public addInputListener(type: string, listener: (event: Event) => void, capture?: boolean): void {\n this._inputElement.addEventListener(type, listener, { capture });\n }\n\n public removeInputListener(type: string, listener: (event: Event) => void, capture?: boolean): void {\n if (this._inputElement) {\n this._inputElement.removeEventListener(type, listener, { capture });\n }\n }\n\n public addToggleListener(type: string, listener: (event: Event) => void): void {\n if (this._toggleElement) {\n this._toggleElement.addEventListener(type, listener);\n }\n }\n\n public removeToggleListener(type: string, listener: (event: Event) => void): void {\n if (this._toggleElement) {\n this._toggleElement.removeEventListener(type, listener);\n }\n }\n\n public hasInputElement(): boolean {\n return !!this._inputElement;\n }\n\n public tryCreateToggle(): void {\n const textField = this._component.querySelector(TEXT_FIELD_CONSTANTS.elementName) as ITextFieldComponent;\n const toggleElement = this._component.querySelector(TIME_PICKER_CONSTANTS.selectors.TOGGLE);\n if (textField) {\n const existingIconButton = textField.querySelector(`${ICON_BUTTON_CONSTANTS.elementName}[slot=trailing]`);\n if (existingIconButton || toggleElement) {\n this._toggleElement = (existingIconButton || toggleElement) as IIconButtonComponent;\n return;\n }\n\n const iconButtonElement = document.createElement(ICON_BUTTON_CONSTANTS.elementName) as IIconButtonComponent;\n iconButtonElement.slot = 'trailing';\n iconButtonElement.dense = true;\n iconButtonElement.densityLevel = 3;\n iconButtonElement.style.marginRight = '4px'; // Override default trailing slot margin in text-field\n\n const buttonElement = document.createElement('button');\n buttonElement.type = 'button';\n buttonElement.tabIndex = -1;\n buttonElement.setAttribute('aria-label', 'Toggle time dropdown');\n\n const iconElement = document.createElement(ICON_CONSTANTS.elementName) as IIconComponent;\n iconElement.name = 'clock_outline';\n buttonElement.appendChild(iconElement);\n iconButtonElement.appendChild(buttonElement);\n\n textField.appendChild(iconButtonElement);\n this._toggleElement = iconButtonElement;\n } else if (toggleElement) {\n this._toggleElement = toggleElement as HTMLElement;\n }\n }\n\n public tryFocusInput(): void {\n this._inputElement.select();\n }\n\n public tryBlurInput(): void {\n this._inputElement.blur();\n }\n\n public selectInputText(): void {\n this._inputElement.select();\n }\n\n public isInputDisabled(): boolean {\n return this._inputElement.disabled;\n }\n\n public isInputFocused(): boolean {\n return getActiveElement() === this._inputElement;\n }\n\n public setInputValue(value: string, emitEvents: boolean): void {\n if (this._inputElement.value === value) {\n return;\n }\n\n this._inputElement.value = value;\n\n if (this._inputMask) {\n this._inputMask.update();\n }\n\n if (emitEvents) {\n this._emitInputEvent('change');\n this._emitInputEvent('input');\n }\n }\n\n public getInputValue(): string {\n return this._inputMask ? this._inputMask.maskedValue : this._inputElement.value;\n }\n\n public setDisabled(isDisabled: boolean): void {\n this._inputElement.disabled = isDisabled;\n this._inputElement.setAttribute('aria-disabled', isDisabled.toString());\n this.setToggleDisabled(isDisabled);\n }\n\n public attachDropdown(config: IListDropdownConfig): void {\n this._listDropdown = new ListDropdown(this._inputElement, config);\n this._listDropdown.open();\n this._inputElement.setAttribute('aria-controls', `list-dropdown-popup-${config.id}`);\n }\n \n public detachDropdown(): void {\n if (this._listDropdown) {\n this._listDropdown.close();\n this._listDropdown.destroy();\n this._listDropdown = undefined;\n }\n this._inputElement.removeAttribute('aria-controls');\n }\n\n public propagateKey(key: string): void {\n this._listDropdown?.handleKey(key);\n }\n\n public setActiveDescendant(id: string): void {\n toggleAttribute(this._inputElement, !!id, 'aria-activedescendant', id);\n }\n\n public getTargetElementWidth(selector: string): number {\n const targetElement = this._getTargetElement(selector);\n return targetElement.getBoundingClientRect().width;\n }\n\n private _emitInputEvent(type: string): void {\n this._inputElement.dispatchEvent(new Event(type));\n }\n\n public emitInputEvent(type: string, data?: any): void {\n emitEvent(this._inputElement, type, data);\n }\n\n public setInputReadonly(value: boolean): void {\n this._inputElement.readOnly = value;\n }\n\n public setToggleDisabled(value: boolean): void {\n if (this._toggleElement) {\n this._toggleElement.setAttribute('aria-disabled', value.toString());\n if ('disabled' in this._toggleElement) {\n (this._toggleElement as HTMLButtonElement).disabled = value;\n } else {\n const button = this._toggleElement.querySelector('button') as HTMLButtonElement;\n if (button) {\n button.disabled = value;\n }\n }\n }\n }\n\n public activateFirstOption(): void {\n this._listDropdown?.activateFirstOption();\n }\n\n public getActiveOption(): IListDropdownOption | undefined {\n return this._listDropdown?.getActiveOption();\n }\n\n private _getTargetElement(selector?: string): HTMLElement {\n if (this._targetElement) {\n return this._targetElement;\n }\n this._targetElement = selector ? this._component.querySelector(selector) as HTMLElement || this._getDefaultTargetElement() : this._getDefaultTargetElement();\n return this._targetElement;\n }\n\n private _getDefaultTargetElement(): HTMLElement {\n // This component is often used with the text-field, if so, let's target our popup around one if its internal elements for proper alignnment\n const textField = this._component.querySelector(TEXT_FIELD_CONSTANTS.elementName) as HTMLElement;\n if (textField && textField.shadowRoot) {\n const textFieldRoot = getShadowElement(textField, TEXT_FIELD_CONSTANTS.selectors.ROOT) as HTMLElement;\n if (textFieldRoot) {\n return textFieldRoot;\n }\n }\n return this._component; // Otherwise we just use the time-picker host as the target\n }\n}\n", "import { tokenize24HourTimeString, tokenize12HourTimeString, TWENTY_FOUR_HOUR_TIME_REGEX, TWELVE_HOUR_TIME_REGEX } from '../core/utils/time-utils';\n\nexport function timeStringToMillis(time: string | null, use24HourTime: boolean, allowSeconds: boolean): number | null {\n if (!time || /^\\s*$/.test(time)) {\n return null;\n }\n\n let hours = 0;\n let minutes = 0;\n let seconds = 0;\n\n if (TWENTY_FOUR_HOUR_TIME_REGEX.test(time)) {\n const tokens = tokenize24HourTimeString(time);\n hours = +tokens.hours || 0;\n minutes = +tokens.minutes || 0;\n seconds = +tokens.seconds || 0;\n } else if (TWELVE_HOUR_TIME_REGEX.test(time)) {\n const tokens = tokenize12HourTimeString(time);\n hours = +tokens.hours || 0;\n minutes = +tokens.minutes || 0;\n seconds = +tokens.seconds || 0;\n if (hours === 12 && tokens.meridiem === 'AM') {\n hours = 0;\n }\n if (hours < 12 && tokens.meridiem === 'PM') {\n hours += 12;\n }\n } else {\n return null;\n }\n\n return hoursToMillis(hours) + minutesToMillis(minutes) + (allowSeconds ? secondsToMillis(seconds) : 0);\n}\n\nexport function millisToTimeString(value: number | null | undefined, use24HourTime: boolean, allowSeconds: boolean): string | null {\n if (typeof value !== 'number' || value < 0) {\n return null;\n }\n\n let hours = Math.min(millisToHours(value), 23);\n const minutes = Math.min(millisToMinutesClamped(value), 59);\n const totalMinutes = value / (1000 * 60);\n const meridiem = totalMinutes < 720 ? 'AM' : 'PM';\n\n if (!use24HourTime) {\n hours = hours <= 12 ? hours : hours - 12;\n if (hours === 0) {\n hours = 12;\n }\n }\n\n let time = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n\n if (allowSeconds) {\n const seconds = Math.min(millisToSecondsClamped(value), 59);\n time += `:${String(seconds).padStart(2, '0')}`;\n }\n\n if (!use24HourTime) {\n time += ` ${meridiem}`;\n }\n\n return time;\n}\n\nexport function millisToHours(millis: number): number {\n return Math.abs(Math.floor(millis / (1000 * 60 * 60)));\n}\n\nexport function millisToMinutesClamped(millis: number): number {\n return Math.abs(Math.floor(millisToMinutes(millis) % 60));\n}\n\nexport function millisToMinutes(millis: number): number {\n return millis / (1000 * 60);\n}\n\nexport function millisToSecondsClamped(millis: number): number {\n return Math.abs(Math.floor(millisToSeconds(millis) % 60));\n}\n\nexport function millisToSeconds(millis: number): number {\n return millis / 1000;\n}\n\nexport function hoursToMillis(hours: number): number {\n return hours * 60 * 60 * 1000;\n}\n\nexport function minutesToMillis(minutes: number): number {\n return minutes * 60 * 1000;\n}\n\nexport function secondsToMillis(seconds: number): number {\n return seconds * 1000;\n}\n\nexport function stripSecondsFromMillis(millis: number): number {\n return millis - secondsToMillis(millisToSecondsClamped(millis));\n}\n\nexport function getCurrentTimeOfDayMillis(allowSeconds: boolean): number {\n const date = new Date();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n return hoursToMillis(hours) + minutesToMillis(minutes) + (allowSeconds ? secondsToMillis(date.getSeconds()) : 0);\n}\n\n/**\n * Combines a `Date` object with a 24-hour time string from the time-picker component.\n * @param date The `Date` object to adjust.\n * @param time The 24-hour time string.\n * @param useSeconds If your 24-hour time string contains seconds, set this to `true`.\n * @returns The same `Date` object that was provided, with the newly adjusted time.\n */\nexport function mergeDateWithTime(date: Date, time: string, useSeconds = false): Date {\n if (!date) {\n date = new Date();\n }\n\n const millis = timeStringToMillis(time, true, useSeconds);\n if (!millis) {\n date.setHours(0, 0, 0);\n return date;\n }\n\n let hours = millisToHours(millis);\n \n const twentyThreeHoursInMillis = 82800000;\n if (hours > twentyThreeHoursInMillis) {\n hours = twentyThreeHoursInMillis;\n } else if (hours < 0) {\n hours = 0;\n }\n\n const minutes = millisToMinutesClamped(millis);\n const seconds = useSeconds ? millisToSecondsClamped(millis) : 0;\n date.setHours(hours, minutes, seconds);\n\n return date;\n}\n", "import { ICustomElementFoundation, Platform, debounce, randomChars } from '@tylertech/forge-core';\nimport { ITimePickerAdapter } from './time-picker-adapter';\nimport { ITimeInputMaskOptions } from '../core/mask/time-input-mask';\nimport { isSupportedTimeFormat, TWENTY_FOUR_HOUR_TIME_REGEX, tryCoerceTimeString } from '../core/utils/time-utils';\nimport {\n TIME_PICKER_CONSTANTS,\n ITimePickerOptionValue,\n ITimePickerOption,\n TimePickerValidationCallback,\n TimePickerParseCallback,\n TimePickerFormatCallback,\n TimePickerCoercionCallback,\n TimePickerPrepareMaskCallback\n} from './time-picker-constants';\nimport { IListDropdownConfig, ListDropdownType, IListDropdownOption } from '../list-dropdown/list-dropdown-constants';\nimport { timeStringToMillis, millisToTimeString, minutesToMillis, getCurrentTimeOfDayMillis, millisToMinutes, stripSecondsFromMillis } from './time-picker-utils';\n\nexport interface ITimePickerFoundation extends ICustomElementFoundation {\n value: string | null | undefined;\n open: boolean;\n allowSeconds: boolean;\n masked: boolean;\n showMaskFormat: boolean;\n use24HourTime: boolean;\n allowInvalidTime: boolean;\n min: string | null | undefined;\n max: string | null | undefined;\n restrictedTimes: string[];\n startTime: string | null | undefined;\n step: number;\n allowInput: boolean;\n showNow: boolean;\n showHourOptions: boolean;\n customOptions: ITimePickerOption[];\n validationCallback: TimePickerValidationCallback;\n parseCallback: TimePickerParseCallback;\n formatCallback: TimePickerFormatCallback;\n coercionCallback: TimePickerCoercionCallback;\n prepareMaskCallback: TimePickerPrepareMaskCallback;\n disabled: boolean;\n popupClasses: string | string[];\n allowDropdown: boolean;\n}\n\nexport class TimePickerFoundation implements ITimePickerFoundation {\n // State vars\n private _value?: number | null = null;\n private _masked = true;\n private _use24HourTime = false;\n private _showMaskFormat = false;\n private _min?: number | null = null;\n private _max?: number | null = null;\n private _restrictedTimes: number[] = [];\n private _startTime?: number | null = null;\n private _step = TIME_PICKER_CONSTANTS.numbers.DEFAULT_MINUTE_STEP;\n private _allowInput = true;\n private _identifier: string;\n private _open = false;\n private _allowSeconds = false;\n private _allowInvalidTime = false;\n private _popupTarget: string;\n private _showNow = false;\n private _showHourOptions = true;\n private _customOptions: ITimePickerOption[] = [];\n private _validationCallback: TimePickerValidationCallback;\n private _parseCallback: TimePickerParseCallback;\n private _formatCallback: TimePickerFormatCallback;\n private _coercionCallback: TimePickerCoercionCallback;\n private _prepareMaskCallback: TimePickerPrepareMaskCallback;\n private _disabled = false;\n private _popupClasses: string[] = [];\n private _allowDropdown = true;\n \n // Internal state vars\n private _isInitialized = false;\n\n // Listeners\n private _inputListener: (evt: Event) => void;\n private _inputKeydownListener: (evt: KeyboardEvent) => void;\n private _toggleMousedownListener: (evt: MouseEvent) => void;\n private _inputFocusListener: (evt: Event) => void;\n private _inputBlurListener: (evt: Event) => void;\n private _inputMousedownListener: (evt: MouseEvent) => void;\n \n constructor(private _adapter: ITimePickerAdapter) {\n this._identifier = randomChars(); // This is a unique identifier for this instance of the time picker (used for a11y purposes)\n\n // Set up listeners\n this._inputListener = evt => this._onInput(evt);\n this._inputKeydownListener = evt => this._onInputKeydown(evt);\n this._toggleMousedownListener = evt => this._onToggleMousedown(evt);\n this._inputFocusListener = evt => this._onInputFocus(evt);\n this._inputBlurListener = evt => this._onInputBlur(evt);\n this._inputMousedownListener = evt => this._onInputMousedown(evt);\n }\n\n public initialize(): void {\n this._adapter.initialize();\n \n // We require an input element to be a child of this component\n if (!this._adapter.hasInputElement()) {\n throw new Error('Unable to locate <input> element to attach to.');\n }\n\n this._adapter.initializeAccessibility(this._identifier);\n\n // Detect if a value already exists in the input and set our values based on that\n if (!this._value) {\n const inputValue = this._adapter.getInputValue();\n this._setValue(this._convertTimeStringToMillis(inputValue, this._use24HourTime, this._allowSeconds));\n }\n\n // Attach required listeners\n this._adapter.addInputListener('focus', this._inputFocusListener);\n this._adapter.addInputListener('blur', this._inputBlurListener);\n this._adapter.addInputListener('keydown', this._inputKeydownListener, true);\n\n // Ensure our input has the correct time format (make sure not to emit input events manually at this point)\n this._formatInputValue(false);\n\n // Apply our state\n if (typeof this._value === 'number') {\n this._applyValue(this._value, false);\n }\n this._applyAllowInput();\n this._applyAllowDropdown();\n this._applyDisabled();\n this._applyMask();\n\n this._isInitialized = true;\n }\n\n public disconnect(): void {\n this._isInitialized = false;\n\n // Remove listeners\n this._adapter.removeInputListener('input', this._inputListener);\n this._adapter.removeInputListener('focus', this._inputFocusListener);\n this._adapter.removeInputListener('blur', this._inputBlurListener);\n this._adapter.removeToggleListener('mousedown', this._toggleMousedownListener);\n this._adapter.removeInputListener('keydown', this._inputKeydownListener, true);\n\n // If we are using an input mask, let's destroy that now\n if (this._masked) {\n this._adapter.destroyMask();\n }\n\n // Ensure we remove our dropdown\n this._closeDropdown();\n\n // Cleanup any resources used in the adapter\n this._adapter.destroy();\n }\n\n /** Called when the input mask changes or the `input` event occurs on our `<input>` element. */\n private _onInput(evt: Event): void {\n this._handleInput(this._adapter.getInputValue());\n }\n\n private _onInputKeydown(evt: KeyboardEvent): void {\n if (evt.shiftKey) {\n switch (evt.code) {\n case 'Backspace':\n case 'Delete':\n evt.preventDefault();\n const result = this._trySetValue(null);\n if (result) {\n this._formatInputValue();\n }\n return;\n }\n }\n\n switch (evt.code) {\n case 'Tab':\n if (this._open) {\n this._selectActiveOption();\n }\n break;\n case 'Esc':\n case 'Escape':\n if (this._open) {\n evt.preventDefault();\n evt.stopPropagation();\n this._closeDropdown(true);\n }\n break;\n case 'Down':\n case 'ArrowDown':\n if (this._allowDropdown) {\n evt.preventDefault();\n if (!this._open) {\n this._openDropdown();\n this._adapter.activateFirstOption();\n // TODO: Should we cycle the hours, minutes, seconds, or meridiem where the cursor is instead of opening the dropdown?\n } else {\n this._adapter.propagateKey(evt.code);\n }\n }\n break;\n case 'Up':\n case 'ArrowUp':\n if (this._allowDropdown) {\n evt.preventDefault();\n if (this._open) {\n this._adapter.propagateKey(evt.code);\n } else {\n // TODO: cycle the hours, minutes, seconds, or meridiem where the cursor is\n }\n }\n break;\n case 'Enter':\n case 'NumpadEnter':\n case 'Home':\n case 'End':\n if (this._open) {\n if (evt.code === 'Enter' || evt.code === 'NumpadEnter') {\n evt.stopPropagation();\n }\n evt.preventDefault();\n this._adapter.propagateKey(evt.code);\n }\n break;\n case 'KeyN':\n evt.preventDefault();\n const nowMillis = getCurrentTimeOfDayMillis(this._allowSeconds);\n if (this._value !== nowMillis) {\n const timeString = millisToTimeString(nowMillis, true, this._allowSeconds);\n const canContinue = this._emitChangeEvent(timeString);\n if (canContinue) {\n this._applyValue(nowMillis);\n this._selectInputText();\n }\n }\n break;\n }\n }\n\n private _selectActiveOption(): void {\n const activeOption = this._adapter.getActiveOption();\n if (activeOption) {\n this._onSelect(activeOption.value);\n }\n }\n\n private _onToggleMousedown(evt: Event): void {\n if (this._disabled || !this.allowDropdown) {\n return;\n }\n\n evt.stopPropagation();\n\n if (this._adapter.isInputDisabled()) {\n return;\n }\n\n evt.preventDefault();\n\n if (this._open) {\n this._closeDropdown(true);\n } else {\n if (!Platform.isMobile) {\n this._adapter.tryFocusInput();\n } else {\n this._adapter.tryBlurInput();\n }\n this._openDropdown();\n }\n }\n\n private _onInputFocus(evt: Event): void {\n if (this._allowInput) {\n this._adapter.selectInputText();\n }\n }\n\n private _onInputBlur(evt: Event): void {\n this._formatInputValue();\n if (this._open && !this._adapter.isInputFocused()) {\n this._closeDropdown(true);\n }\n }\n\n private _onInputMousedown(evt: MouseEvent): void {\n if (!this._allowInput && !this._open) {\n this._openDropdown();\n this._adapter.tryFocusInput();\n window.requestAnimationFrame(() => this._adapter.selectInputText());\n }\n }\n\n private _applyDisabled(): void {\n this._adapter.setDisabled(this._disabled);\n }\n\n private _applyMask(): void {\n if (this._masked && this._allowInput) {\n const options: ITimeInputMaskOptions = {\n showMaskFormat: this._showMaskFormat,\n use24HourTime: this._use24HourTime,\n showSeconds: this._allowSeconds,\n prepareCallback: this._prepareMaskCallback,\n onChange: debounce((value: string) => this._handleInput(value), 0, true) // debounce this to avoid multiple callbacks for same value\n };\n this._adapter.initializeMask(options);\n } else {\n this._adapter.destroyMask();\n this._formatInputValue();\n }\n }\n\n private _applyAllowInput(): void {\n this._adapter.setInputReadonly(!this._allowInput);\n if (this._allowInput) {\n this._adapter.removeInputListener('mousedown', this._inputMousedownListener);\n // If not using an input mask we need to attach our own `input` listener, otherwise\n // we use the mask to notify us of changes\n if (!this._masked) {\n this._adapter.addInputListener('input', this._inputListener);\n }\n } else {\n this._adapter.addInputListener('mousedown', this._inputMousedownListener);\n this._adapter.removeInputListener('input', this._inputListener);\n }\n }\n\n private _applyAllowDropdown(): void {\n this._adapter.setToggleDisabled(!this._allowDropdown);\n if (this._allowDropdown) {\n this._adapter.removeToggleListener('mousedown', this._toggleMousedownListener);\n this._adapter.tryCreateToggle();\n this._adapter.addToggleListener('mousedown', this._toggleMousedownListener);\n } else if (this._open) {\n this._closeDropdown(true);\n }\n }\n\n private _applyAllowSeconds(): void {\n const originalValue = this._value;\n if (!this._allowSeconds) {\n // If we are not using seconds, we need to remove our seconds from the value\n if (typeof this._value !== 'number') {\n return;\n }\n\n this._setValue(stripSecondsFromMillis(this._value));\n\n if (this._isInitialized && originalValue !== this._value) {\n // We need to emit a change event with our new value which does not include the seconds\n const timeString = millisToTimeString(this._value, true, false);\n this._emitChangeEvent(timeString);\n }\n } else if (this._isInitialized && originalValue !== this._value) {\n // We need to emit a change event with our new value which includes the seconds\n const timeString = millisToTimeString(this._value, true, true);\n this._emitChangeEvent(timeString);\n }\n }\n\n private _handleInput(value: string): void {\n const rawValue = value;\n\n if (!this._allowInput) {\n return;\n }\n\n if (this._open) {\n this._closeDropdown(true);\n }\n\n // Let's attempt to coerce our time string into a known format to help with ease of entry\n value = tryCoerceTimeString(value, this._use24HourTime, this._allowSeconds);\n\n // If we were provided a custom coercion callback then we need to call that now to perform any further coercion by the consumer\n if (typeof this._coercionCallback === 'function') {\n value = this._coercionCallback.call(null, rawValue, value, this._allowSeconds);\n }\n\n // Validate the time format and make sure it's supported\n if (!this._isValidTimeFormat(value)) {\n value = '';\n }\n\n // Convert the time string to milliseconds\n let millis: number | null | undefined;\n if (!this._masked && typeof this._parseCallback === 'function') {\n millis = this._parseCallback.call(null, value);\n } else {\n millis = this._convertTimeStringToMillis(value, this._use24HourTime, this._allowSeconds);\n }\n\n // Validate that our time can be chosen as a valid value\n millis = this._validateMillis(millis);\n\n // Update our value\n this._trySetValue(millis);\n }\n\n private _emitChangeEvent(value: string | null, force = false): boolean {\n return this._adapter.emitHostEvent(TIME_PICKER_CONSTANTS.events.CHANGE, value, true, !force);\n }\n\n private _trySetValue(millis: number | null | undefined): boolean {\n // If our value hasn't changed, we can just return\n if (millis === this._value) {\n return false;\n }\n\n // Convert our milliseconds to a 24-hour time string to use as our normalized value\n const timeString = millisToTimeString(millis, true, this._allowSeconds);\n\n // If we are using an input mask, we need to dispatch our custom input event to let consumers know input happened (before our change event)\n if (this._masked) {\n this._adapter.emitInputEvent(TIME_PICKER_CONSTANTS.events.INPUT, timeString);\n }\n\n // Only emit our change event if the value is different\n if (this._value !== millis) {\n const canContinue = this._emitChangeEvent(timeString);\n if (canContinue) {\n this._setValue(millis);\n return true;\n }\n }\n\n return false;\n }\n\n private _setValue(value: number | null | undefined): void {\n this._value = this._normalizeTimeValue(value);\n }\n\n private _validateMillis(millis: number | null | undefined): number | null | undefined {\n // Trap for min/max validation\n if (typeof millis === 'number') {\n const isBelowMin = typeof this._min === 'number' && millis < this._min;\n const isAboveMax = typeof this._max === 'number' && millis > this._max;\n if (isBelowMin || isAboveMax) {\n millis = null;\n }\n }\n \n // Trap for restricted times\n if (typeof millis === 'number' && this._restrictedTimes.length) {\n if (this._restrictedTimes.includes(millis)) {\n millis = null;\n }\n }\n\n return millis;\n }\n\n private _isValidTimeFormat(value: string): boolean {\n if (!this._masked && typeof this._validationCallback === 'function') {\n return this._validationCallback.call(this, value);\n }\n return isSupportedTimeFormat(value);\n }\n\n private _isValidInputValue(value: string): boolean {\n return TWENTY_FOUR_HOUR_TIME_REGEX.test(value);\n }\n\n private _onSelect(value: ITimePickerOptionValue): void {\n this._closeDropdown(true);\n\n // Check if the \"Now\" option was selected\n if (!value.isCustom && value.metadata === 'now') {\n value.time = getCurrentTimeOfDayMillis(this._allowSeconds);\n }\n\n // Check if this is a custom option, and then call the provided callback for it\n if (value.isCustom) {\n if (typeof value.customCallback === 'function') {\n const result = value.customCallback.call(null, value.metadata);\n if (typeof result !== 'number') {\n throw new Error('Custom options must provide a time of day value in milliseconds.');\n }\n value.time = result;\n } else {\n throw new Error('You must implement a `toMilliseconds` callback that returns the time value to use for this custom option.');\n }\n }\n\n // Make sure the time is different than what is already populated or we can just return\n if (this._value === value.time) {\n return;\n }\n\n // Emit the change event\n const timeString = millisToTimeString(value.time, true, this._allowSeconds);\n const canContinue = this._emitChangeEvent(timeString);\n if (!canContinue) {\n return;\n }\n\n // This will update our state and the UI at once\n this._applyValue(value.time);\n\n // Select full input text\n this._selectInputText();\n }\n\n private _selectInputText(): void {\n // We need to select the text of the input in the next cycle to allow time for the UI to update\n // with the selected text (assuming it still has focus)\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n if (this._adapter.isInputFocused()) {\n this._adapter.selectInputText();\n }\n });\n });\n }\n\n private _applyValue(value: number | null | undefined, emitEvents = true): void {\n this._setValue(value);\n const formattedValue = this._formatValue(this._value);\n if (this._adapter.getInputValue() !== formattedValue) {\n this._adapter.setInputValue(formattedValue, emitEvents);\n }\n }\n\n private _normalizeTimeValue(value: number | null | undefined): number | null {\n if (value == null) {\n return null;\n } else if (value < 0) {\n return 0;\n } else if (value > TIME_PICKER_CONSTANTS.numbers.MAX_DAY_MILLIS) {\n return TIME_PICKER_CONSTANTS.numbers.MAX_DAY_MILLIS;\n }\n return value;\n }\n\n private _openDropdown(): void {\n const options = this._generateTimeOptions();\n\n if (!this.allowDropdown || !options.length) {\n return;\n }\n \n this._formatInputValue();\n this._open = true;\n this._adapter.setHostAttribute(TIME_PICKER_CONSTANTS.attributes.OPEN);\n \n const selectableOptions = options.filter(o => !o.divider && !o.disabled);\n let selectedValues: ITimePickerOptionValue[] = [];\n let activeStartIndex: number | undefined;\n \n // Find closest match in list of time options and activate/select it\n if (options.length) {\n if (this._value != null) {\n const optionIndex = this._findClosestOptionIndex(this._value, selectableOptions);\n if (optionIndex >= 0) {\n const isExactMatch = selectableOptions[optionIndex].value.time === this._value;\n if (isExactMatch) {\n selectedValues = [selectableOptions[optionIndex].value];\n } else {\n activeStartIndex = optionIndex;\n }\n }\n } else if (typeof this._startTime === 'number') {\n const optionIndex = this._findClosestOptionIndex(this._startTime, selectableOptions);\n if (optionIndex >= 0 && optionIndex < selectableOptions.length) {\n activeStartIndex = optionIndex;\n }\n }\n }\n\n const config: IListDropdownConfig<ITimePickerOptionValue> = {\n id: `forge-time-picker-${this._identifier}`,\n selectedValues,\n syncWidth: true,\n activeStartIndex,\n popupClasses: this._popupClasses,\n popupStatic: true,\n type: ListDropdownType.Standard,\n options,\n selectCallback: value => this._onSelect(value),\n closeCallback: () => this._closeDropdown(true),\n activeChangeCallback: id => this._adapter.setActiveDescendant(id),\n targetWidthCallback: () => this._adapter.getTargetElementWidth(this._popupTarget)\n };\n this._adapter.attachDropdown(config);\n this._adapter.emitHostEvent(TIME_PICKER_CONSTANTS.events.OPEN, undefined, false);\n }\n\n private _closeDropdown(emitCloseEvent = false): void {\n this._open = false;\n this._adapter.removeHostAttribute(TIME_PICKER_CONSTANTS.attributes.OPEN);\n this._adapter.detachDropdown();\n if (emitCloseEvent) {\n this._adapter.emitHostEvent(TIME_PICKER_CONSTANTS.events.CLOSE, true, false);\n }\n }\n\n private _findClosestOptionIndex(value: number, options: Array<IListDropdownOption<ITimePickerOptionValue>>): number {\n const closestItem = options.reduce((prev, curr) => {\n return Math.abs((curr.value.time || 0) - value) < Math.abs((prev.value.time || 0) - value) ? curr : prev;\n });\n return options.indexOf(closestItem);\n }\n\n private _formatInputValue(emitEvents = true): void {\n const inputValue = this._adapter.getInputValue();\n \n // If we allow invalid times, we can leave the input value as-is (only when unmasked)\n if (this._allowInvalidTime && !this._masked && inputValue && !this._value) {\n return;\n }\n\n const formattedValue = this._formatValue(this._value);\n \n if (inputValue !== formattedValue) {\n this._adapter.setInputValue(formattedValue, emitEvents);\n }\n }\n\n private _generateTimeOptions(): Array<IListDropdownOption<ITimePickerOptionValue>> {\n const minMinutes = this._min != null ? Math.max(millisToMinutes(this._min), 0) : 0;\n const maxMinutes = this._max != null ? Math.min(millisToMinutes(this._max), TIME_PICKER_CONSTANTS.numbers.MAX_DAY_MINUTES) : TIME_PICKER_CONSTANTS.numbers.MAX_DAY_MINUTES;\n const minuteStep = this._step;\n const times: IListDropdownOption[] = [];\n let leadingOptions: IListDropdownOption[] = [];\n \n if (this._showHourOptions) {\n for (let totalMinutes = minMinutes; totalMinutes <= maxMinutes; totalMinutes += minuteStep) {\n if (totalMinutes === TIME_PICKER_CONSTANTS.numbers.MAX_DAY_MINUTES) {\n break;\n }\n const millis = minutesToMillis(totalMinutes);\n const disabled = this._restrictedTimes.includes(millis);\n const label = millisToTimeString(millis, this._use24HourTime, false) || '';\n const value: ITimePickerOptionValue = { time: millis };\n times.push({ label, value, disabled });\n }\n\n // Add divider between AM/PM times\n const firstPmIndex = times.findIndex(t => t.value.time / 1000 / 60 >= 720);\n if (firstPmIndex >= 0 && firstPmIndex < times.length - 1) {\n times.splice(firstPmIndex, 0, { label: '', value: null, divider: true });\n }\n }\n\n\n // Check if we need to prepend a \"Now\" option\n if (this._showNow) {\n const value: ITimePickerOptionValue = { time: null, metadata: 'now' };\n leadingOptions.push({ label: 'Now', value });\n }\n\n // Check for any custom provided options to prepend\n if (Array.isArray(this._customOptions) && this._customOptions.length) {\n const options = this._customOptions.map(o => {\n const value: ITimePickerOptionValue = { time: null, metadata: o.value, isCustom: true, customCallback: o.toMilliseconds };\n return { label: o.label, value };\n });\n leadingOptions = [...leadingOptions, ...options];\n }\n\n // Append all leading options\n if (leadingOptions.length) {\n if (times.length) {\n times.splice(0, 0, { label: '', value: null, divider: true });\n }\n leadingOptions.forEach((o, index) => times.splice(index, 0, o));\n }\n\n return times;\n }\n\n private _convertTimeStringToMillis(value: string | null, use24HourTime: boolean, allowSeconds: boolean): number | null {\n if (!value || !this._isValidTimeFormat(value)) {\n value = '';\n }\n return timeStringToMillis(value, use24HourTime, allowSeconds);\n }\n\n private _formatValue(value: number | null | undefined): string {\n if (!this._masked && typeof this._formatCallback === 'function') {\n return this._formatCallback.call(null, value, this._use24HourTime, this._allowSeconds);\n }\n return millisToTimeString(this._value, this._use24HourTime, this._allowSeconds) || '';\n }\n\n private _warnInvalidFormat(value: string): void {\n console.warn(`The specified value \"${value}\" does not conform to the required format. The format is \"HH:mm\", \"HH:mm:ss\" where HH is 00-23, mm is 00-59, and ss is 00-59.`);\n }\n\n public get open(): boolean {\n return this._open;\n }\n public set open(value: boolean) {\n if (this._open !== value) {\n if (this._isInitialized) {\n this._open = value;\n if (this._open) {\n this._openDropdown();\n } else {\n this._closeDropdown();\n }\n }\n }\n }\n\n public get masked(): boolean {\n return this._masked;\n }\n public set masked(value: boolean) {\n if (this._masked !== value) {\n this._masked = value;\n if (this._isInitialized) {\n if (this._masked) {\n this._adapter.removeInputListener('input', this._inputListener);\n this._applyMask();\n } else {\n this._adapter.destroyMask();\n this._formatInputValue();\n this._adapter.addInputListener('input', this._inputListener);\n }\n }\n }\n }\n\n public get showMaskFormat(): boolean {\n return this._showMaskFormat;\n }\n public set showMaskFormat(value: boolean) {\n if (this._showMaskFormat !== value) {\n this._showMaskFormat = value;\n if (this._isInitialized) {\n this._applyMask();\n }\n }\n }\n\n public get allowSeconds(): boolean {\n return this._allowSeconds;\n }\n public set allowSeconds(value: boolean) {\n if (this._allowSeconds !== value) {\n this._allowSeconds = !!value;\n this._applyAllowSeconds();\n if (this._isInitialized) {\n this._applyMask();\n this._formatInputValue();\n }\n this._adapter.setHostAttribute(TIME_PICKER_CONSTANTS.attributes.ALLOW_SECONDS, `${!!value}`);\n }\n }\n\n public get use24HourTime(): boolean {\n return this._use24HourTime;\n }\n public set use24HourTime(value: boolean) {\n if (this._use24HourTime !== value) {\n this._use24HourTime = !!value;\n if (this._isInitialized) {\n this._adapter.destroyMask();\n this._formatInputValue();\n this._applyMask();\n }\n this._adapter.setHostAttribute(TIME_PICKER_CONSTANTS.attributes.USE_24_HOUR_TIME, `${!!value}`);\n }\n }\n\n public get allowInvalidTime(): boolean {\n return this._allowInvalidTime;\n }\n public set allowInvalidTime(value: boolean) {\n if (this._allowInvalidTime !== value) {\n this._allowInvalidTime = !!value;\n this._adapter.setHostAttribute(TIME_PICKER_CONSTANTS.attributes.ALLOW_INVALID_TIME, `${!!value}`);\n }\n }\n\n public get value(): string | null {\n return millisToTimeString(this._value, true, this._allowSeconds);\n }\n public set value(value: string | null) {\n if (value && !this._isValidInputValue(value)) {\n this._warnInvalidFormat(value);\n return;\n }\n const millis = this._validateMillis(this._convertTimeStringToMillis(value, true, true));\n this._setValue(millis);\n if (this._isInitialized) {\n this._applyValue(this._value);\n }\n }\n\n public get min(): string | null {\n return millisToTimeString(this._min, true, this._allowSeconds);\n }\n public set min(value: string | null) {\n if (this._min !== value) {\n if (value && !this._isValidInputValue(value)) {\n this._warnInvalidFormat(value);\n return;\n }\n this._min = this._convertTimeStringToMillis(value, true, this._allowSeconds);\n\n // Validate and reset our millis to ensure within range\n const millis = this._validateMillis(this._value);\n this._setValue(millis);\n\n if (this._isInitialized) {\n this._applyValue(millis);\n }\n }\n }\n\n public get max(): string | null {\n return millisToTimeString(this._max, true, this._allowSeconds);\n }\n public set max(value: string | null) {\n if (this._max !== value) {\n if (value && !this._isValidInputValue(value)) {\n this._warnInvalidFormat(value);\n return;\n }\n this._max = this._convertTimeStringToMillis(value, true, this._allowSeconds);\n \n // Validate and reset our millis to ensure within range\n const millis = this._validateMillis(this._value);\n this._setValue(millis);\n\n if (this._isInitialized) {\n this._applyValue(millis);\n }\n }\n }\n\n public get restrictedTimes(): string[] {\n return this._restrictedTimes\n .map(t => millisToTimeString(t, true, this._allowSeconds))\n .filter(v => typeof v === 'string') as string[];\n }\n public set restrictedTimes(value: string[]) {\n if (!Array.isArray(value)) {\n value = [];\n }\n this._restrictedTimes = value\n .filter(v => typeof v === 'string')\n .map(v => this._convertTimeStringToMillis(v, true, true))\n .filter(v => typeof v === 'number') as number[];\n }\n\n public get startTime(): string | null {\n return millisToTimeString(this._startTime, true, this._allowSeconds);\n }\n public set startTime(value: string | null) {\n if (this._startTime !== value) {\n if (value && !this._isValidInputValue(value)) {\n this._warnInvalidFormat(value);\n return;\n }\n this._startTime = this._convertTimeStringToMillis(value, true, this._allowSeconds);\n }\n }\n\n public get step(): number {\n return this._step;\n }\n public set step(value: number) {\n this._step = value;\n }\n\n public get allowInput(): boolean {\n return this._allowInput;\n }\n public set allowInput(value: boolean) {\n if (this._allowInput !== value) {\n this._allowInput = value;\n if (this._isInitialized) {\n this._applyAllowInput();\n this._applyMask();\n }\n }\n }\n\n public get popupTarget(): string {\n return this._popupTarget;\n }\n public set popupTarget(value: string) {\n if (this._popupTarget !== value) {\n this._popupTarget = value;\n }\n }\n\n public get showNow(): boolean {\n return this._showNow;\n }\n public set showNow(value: boolean) {\n if (this._showNow !== value) {\n this._showNow = value;\n }\n }\n\n public get showHourOptions(): boolean {\n return this._showHourOptions;\n }\n public set showHourOptions(value: boolean) {\n if (this._showHourOptions !== value) {\n this._showHourOptions = value;\n }\n }\n\n public get customOptions(): ITimePickerOption[] {\n return this._customOptions;\n }\n public set customOptions(value: ITimePickerOption[]) {\n this._customOptions = Array.isArray(value) ? value : [];\n }\n\n public set validationCallback(cb: TimePickerValidationCallback) {\n this._validationCallback = cb;\n if (this._isInitialized) {\n this._applyMask();\n }\n }\n\n public set parseCallback(cb: TimePickerParseCallback) {\n this._parseCallback = cb;\n }\n\n public set formatCallback(cb: TimePickerFormatCallback) {\n this._formatCallback = cb;\n }\n\n public set coercionCallback(cb: TimePickerCoercionCallback) {\n this._coercionCallback = cb;\n }\n\n public set prepareMaskCallback(cb: TimePickerPrepareMaskCallback) {\n this._prepareMaskCallback = cb;\n if (this._isInitialized) {\n this._applyMask();\n }\n }\n\n public get disabled(): boolean {\n return this._disabled;\n }\n public set disabled(value: boolean) {\n if (this._disabled !== value) {\n this._disabled = !!value;\n if (this._isInitialized) {\n this._applyDisabled();\n }\n this._adapter.toggleHostAttribute(TIME_PICKER_CONSTANTS.attributes.DISABLED, this._disabled);\n }\n }\n\n public get popupClasses(): string | string[] {\n if (Array.isArray(this._popupClasses)) {\n return [...this._popupClasses];\n }\n\n return this._popupClasses;\n }\n public set popupClasses(value: string | string[]) {\n if (Array.isArray(value)) {\n this._popupClasses = [...value];\n } else {\n this._popupClasses = [value];\n }\n }\n\n public get allowDropdown(): boolean {\n return this._allowDropdown;\n }\n public set allowDropdown(value: boolean) {\n if (this._allowDropdown !== value) {\n this._allowDropdown = value;\n if (this._isInitialized) {\n this._applyAllowDropdown();\n }\n }\n }\n}\n", "import { CustomElement, attachShadowTemplate, FoundationProperty, coerceBoolean, coerceNumber, ensureChild } from '@tylertech/forge-core';\nimport { tylIconClockOutline } from '@tylertech/tyler-icons/extended';\nimport { tylIconClose } from '@tylertech/tyler-icons/standard';\nimport { TimePickerAdapter } from './time-picker-adapter';\nimport { TimePickerFoundation } from './time-picker-foundation';\nimport {\n TIME_PICKER_CONSTANTS,\n ITimePickerOption,\n TimePickerParseCallback,\n TimePickerValidationCallback,\n TimePickerFormatCallback,\n TimePickerCoercionCallback,\n TimePickerPrepareMaskCallback\n} from './time-picker-constants';\nimport { IconRegistry, IconComponent } from '../icon';\nimport { IconButtonComponent } from '../icon-button';\nimport { PopupComponent } from '../popup';\nimport { DialogComponent } from '../dialog';\nimport { ListComponent, ListItemComponent } from '../list';\nimport { BaseComponent, IBaseComponent } from '../core/base/base-component';\n\nconst template = '<template><slot></slot></template>';\nconst styles = ':host{display:block}:host([hidden]){display:none}';\n\nexport interface ITimePickerComponent extends IBaseComponent {\n value: string | null | undefined;\n open: boolean;\n allowSeconds: boolean;\n masked: boolean;\n showMaskFormat: boolean;\n use24HourTime: boolean;\n allowInvalidTime: boolean;\n min: string | null | undefined;\n max: string | null | undefined;\n restrictedTimes: string[];\n startTime: string | null | undefined;\n step: number;\n allowInput: boolean;\n showNow: boolean;\n showHourOptions: boolean;\n customOptions: ITimePickerOption[];\n validationCallback: TimePickerValidationCallback;\n parseCallback: TimePickerParseCallback;\n formatCallback: TimePickerFormatCallback;\n coercionCallback: TimePickerCoercionCallback;\n prepareMaskCallback: TimePickerPrepareMaskCallback;\n disabled: boolean;\n popupClasses: string | string[];\n allowDropdown: boolean;\n popupTarget: string;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'forge-time-picker': ITimePickerComponent;\n }\n\n interface HTMLElementEventMap {\n 'forge-time-picker-open': CustomEvent<void>;\n 'forge-time-picker-close': CustomEvent<void>;\n 'forge-time-picker-input': Event;\n 'forge-time-picker-change': CustomEvent<string | null>;\n }\n}\n\n/**\n * The web component class behind the `<forge-time-picker>` custom element.\n * \n * @tag forge-time-picker\n */\n@CustomElement({\n name: TIME_PICKER_CONSTANTS.elementName,\n dependencies: [\n ListComponent,\n ListItemComponent,\n IconButtonComponent,\n IconComponent,\n PopupComponent,\n IconComponent,\n DialogComponent\n ]\n})\nexport class TimePickerComponent extends BaseComponent implements ITimePickerComponent {\n public static get observedAttributes(): string[] {\n return [\n TIME_PICKER_CONSTANTS.attributes.VALUE,\n TIME_PICKER_CONSTANTS.attributes.OPEN,\n TIME_PICKER_CONSTANTS.attributes.ALLOW_SECONDS,\n TIME_PICKER_CONSTANTS.attributes.MASKED,\n TIME_PICKER_CONSTANTS.attributes.SHOW_MASK_FORMAT,\n TIME_PICKER_CONSTANTS.attributes.USE_24_HOUR_TIME,\n TIME_PICKER_CONSTANTS.attributes.ALLOW_INVALID_TIME,\n TIME_PICKER_CONSTANTS.attributes.MIN,\n TIME_PICKER_CONSTANTS.attributes.MAX,\n TIME_PICKER_CONSTANTS.attributes.START_TIME,\n TIME_PICKER_CONSTANTS.attributes.STEP,\n TIME_PICKER_CONSTANTS.attributes.ALLOW_INPUT,\n TIME_PICKER_CONSTANTS.attributes.SHOW_NOW,\n TIME_PICKER_CONSTANTS.attributes.SHOW_HOUR_OPTIONS,\n TIME_PICKER_CONSTANTS.attributes.DISABLED,\n TIME_PICKER_CONSTANTS.attributes.POPUP_CLASSES,\n TIME_PICKER_CONSTANTS.attributes.ALLOW_DROPDOWN\n ];\n }\n\n private _foundation: TimePickerFoundation;\n\n constructor() {\n super();\n IconRegistry.define([tylIconClockOutline, tylIconClose]);\n attachShadowTemplate(this, template, styles);\n this._foundation = new TimePickerFoundation(new TimePickerAdapter(this));\n }\n\n public connectedCallback(): void {\n if (this.querySelector(TIME_PICKER_CONSTANTS.selectors.INPUT)) {\n this._foundation.initialize();\n } else {\n ensureChild(this, TIME_PICKER_CONSTANTS.selectors.INPUT).then(() => this._foundation.initialize());\n }\n }\n\n public disconnectedCallback(): void {\n this._foundation.disconnect();\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n switch (name) {\n case TIME_PICKER_CONSTANTS.attributes.VALUE:\n this.value = newValue;\n break;\n case TIME_PICKER_CONSTANTS.attributes.OPEN:\n this.open = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.ALLOW_SECONDS:\n this.allowSeconds = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.MASKED:\n this.masked = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.SHOW_MASK_FORMAT:\n this.showMaskFormat = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.USE_24_HOUR_TIME:\n this.use24HourTime = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.ALLOW_INVALID_TIME:\n this.allowInvalidTime = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.SHOW_NOW:\n this.showNow = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.SHOW_HOUR_OPTIONS:\n this.showHourOptions = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.MIN:\n this.min = newValue;\n break;\n case TIME_PICKER_CONSTANTS.attributes.MAX:\n this.max = newValue;\n break;\n case TIME_PICKER_CONSTANTS.attributes.START_TIME:\n this.startTime = newValue;\n break;\n case TIME_PICKER_CONSTANTS.attributes.STEP:\n this.step = coerceNumber(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.ALLOW_INPUT:\n this.allowInput = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.DISABLED:\n this.disabled = coerceBoolean(newValue);\n break;\n case TIME_PICKER_CONSTANTS.attributes.POPUP_CLASSES:\n this.popupClasses = newValue;\n break;\n case TIME_PICKER_CONSTANTS.attributes.ALLOW_DROPDOWN:\n this.allowDropdown = coerceBoolean(newValue);\n break;\n }\n }\n\n @FoundationProperty()\n public declare value: string | null | undefined;\n\n @FoundationProperty()\n public declare open: boolean;\n\n @FoundationProperty()\n public declare allowSeconds: boolean;\n\n @FoundationProperty()\n public declare masked: boolean;\n\n @FoundationProperty()\n public declare showMaskFormat: boolean;\n\n @FoundationProperty()\n public declare use24HourTime: boolean;\n\n @FoundationProperty()\n public declare allowInvalidTime: boolean;\n\n @FoundationProperty()\n public declare min: string | null | undefined;\n\n @FoundationProperty()\n public declare max: string | null | undefined;\n\n @FoundationProperty()\n public declare restrictedTimes: string[];\n\n @FoundationProperty()\n public declare startTime: string | null | undefined;\n\n @FoundationProperty()\n public declare step: number;\n\n @FoundationProperty()\n public declare allowInput: boolean;\n\n @FoundationProperty()\n public declare showNow: boolean;\n\n /** Whether or not to display hour options in dropdown */\n @FoundationProperty()\n public declare showHourOptions: boolean;\n\n @FoundationProperty()\n public declare customOptions: ITimePickerOption[];\n\n @FoundationProperty()\n public declare validationCallback: TimePickerValidationCallback;\n \n @FoundationProperty()\n public declare parseCallback: TimePickerParseCallback;\n\n @FoundationProperty()\n public declare formatCallback: TimePickerFormatCallback;\n\n @FoundationProperty()\n public declare coercionCallback: TimePickerCoercionCallback;\n\n @FoundationProperty()\n public declare prepareMaskCallback: TimePickerPrepareMaskCallback;\n\n @FoundationProperty()\n public declare disabled: boolean;\n\n @FoundationProperty()\n public declare popupClasses: string | string[];\n\n @FoundationProperty()\n public declare allowDropdown: boolean;\n\n @FoundationProperty()\n public declare popupTarget: string;\n}\n", "import { IBaseComponentDelegateConfig } from '../core/delegates/base-component-delegate';\nimport { FormFieldComponentDelegate, IFormFieldComponentDelegateOptions } from '../core/delegates/form-field-component-delegate';\nimport { ITextFieldComponent, ITextFieldComponentDelegateConfig, TextFieldComponentDelegate } from '../text-field';\nimport { ITimePickerComponent } from './time-picker';\nimport { TIME_PICKER_CONSTANTS } from './time-picker-constants';\n\nexport type TimePickerComponentDelegateProps = Partial<ITimePickerComponent>;\nexport interface ITimePickerComponentDelegateOptions extends IFormFieldComponentDelegateOptions {\n textFieldDelegateConfig?: ITextFieldComponentDelegateConfig;\n}\nexport interface ITimePickerComponentDelegateConfig extends IBaseComponentDelegateConfig<ITimePickerComponent, ITimePickerComponentDelegateOptions> {}\n\nexport class TimePickerComponentDelegate extends FormFieldComponentDelegate<ITimePickerComponent, ITimePickerComponentDelegateOptions> {\n private _textFieldDelegate: TextFieldComponentDelegate;\n\n constructor(config?: ITimePickerComponentDelegateConfig) {\n super(config);\n }\n\n protected _build(): ITimePickerComponent {\n const timePicker = document.createElement(TIME_PICKER_CONSTANTS.elementName);\n this._attachTextField(timePicker);\n return timePicker;\n }\n\n public get inputElement(): HTMLInputElement {\n return this._textFieldDelegate.inputElement;\n }\n\n public get textFieldElement(): ITextFieldComponent {\n return this._textFieldDelegate.element;\n }\n\n public get value(): any {\n return this._element.value;\n }\n public set value(value: any) {\n this._element.value = value;\n }\n\n public get disabled(): boolean {\n return this._element.disabled;\n }\n public set disabled(value: boolean) {\n this._element.disabled = value;\n }\n\n public get invalid(): boolean {\n return this._textFieldDelegate.invalid || false;\n }\n public set invalid(value: boolean) {\n this._textFieldDelegate.invalid = value;\n }\n\n public onChange(listener: (value: string) => void): void {\n this._element.addEventListener(TIME_PICKER_CONSTANTS.events.CHANGE, (evt: CustomEvent<string>) => listener(evt.detail ?? ''));\n }\n\n public onInput(listener: (value: string) => void): void {\n if (this._element.masked) {\n this._element.addEventListener(TIME_PICKER_CONSTANTS.events.INPUT, (evt: CustomEvent<string>) => listener(evt.detail ?? ''));\n } else {\n this._textFieldDelegate.inputElement.addEventListener('input', evt => listener((evt.target as HTMLInputElement).value));\n }\n }\n\n public onFocus(listener: (evt: FocusEvent) => void): void {\n this._textFieldDelegate.inputElement.addEventListener('focus', (evt: FocusEvent) => listener(evt));\n }\n\n public onBlur(listener: (evt: FocusEvent) => void): void {\n this._textFieldDelegate.inputElement.addEventListener('blur', (evt: FocusEvent) => listener(evt));\n }\n\n private _attachTextField(component: ITimePickerComponent): void {\n const textFieldConfig: ITextFieldComponentDelegateConfig = {\n props: { ...this._config.options?.textFieldDelegateConfig?.props },\n options: { ...this._config.options?.textFieldDelegateConfig?.options }\n };\n this._textFieldDelegate = new TextFieldComponentDelegate(textFieldConfig);\n component.appendChild(this._textFieldDelegate.element);\n }\n}\n", "import { defineCustomElement } from '@tylertech/forge-core';\n\nimport { TimePickerComponent } from './time-picker';\n\nexport * from './time-picker-adapter';\nexport * from './time-picker-component-delegate';\nexport * from './time-picker-constants';\nexport * from './time-picker-foundation';\nexport * from './time-picker-utils';\nexport * from './time-picker';\n\nexport function defineTimePickerComponent(): void {\n defineCustomElement(TimePickerComponent);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Tyler Technologies, Inc.
4
+ * License: Apache-2.0
5
+ */
6
+ import{c as le}from"./chunk.MU4FV57Q.js";import{a as re,b as pe}from"./chunk.IARIRFXO.js";import{b as Q}from"./chunk.2LHBE2QZ.js";import{a as x}from"./chunk.LGECRZFO.js";import{a as se}from"./chunk.Y6FFG7XO.js";import{a as ie}from"./chunk.R2L3S3YD.js";import{h as ae,i as ue}from"./chunk.24X566SZ.js";import{b as ne}from"./chunk.BMFJLHDR.js";import{c as te}from"./chunk.HUX56BCR.js";import{e as ee}from"./chunk.XY4N4TSH.js";import{b as Z}from"./chunk.UPFJ3PVE.js";import{a as y,e as oe}from"./chunk.PV5MABYN.js";import{c as V,g as q,h as z}from"./chunk.LZMYHIO2.js";import{a as L}from"./chunk.D4SNVKDA.js";import{d as J,l as j,m as X}from"./chunk.ZAKLVVFO.js";import{a as $}from"./chunk.24D46RLZ.js";import{a as Y}from"./chunk.NXS7A7PO.js";import{a as G}from"./chunk.5PXABBKU.js";import{a}from"./chunk.B3IJU6XJ.js";import{a as R,b as K,c as W}from"./chunk.OOW3UKT4.js";import{a as U,e as H,g as C}from"./chunk.MMVZJLXE.js";import{m as M,r as N,s as k,u as T}from"./chunk.R4NDFXVA.js";import{a as S,b as h,c as F,j as D,k as g,l as P,n as A,o as B}from"./chunk.G76HB2FK.js";import{a as w,f as p}from"./chunk.MCIQXNKY.js";var b=`${K}autocomplete`,fe={MODE:"mode",MULTIPLE:"multiple",DEBOUNCE:"debounce",FILTER_ON_FOCUS:"filter-on-focus",ALLOW_UNMATCHED:"allow-unmatched",POPUP_TARGET:"popup-target",POPUP_CLASSES:"popup-classes",OPTION_LIMIT:"option-limit",OBSERVE_SCROLL:"observe-scroll",OBSERVE_SCROLL_THRESHOLD:"observe-scroll-threshold",SYNC_POPUP_WIDTH:"sync-popup-width",OPEN:"open",MATCH_KEY:"match-key",DROPDOWN_ICON_OPEN:"data-forge-dropdown-icon-open"},ve={INPUT:se.selectors.INPUT,DROPDOWN_ICON:"[data-forge-dropdown-icon],[data-forge-dropdown-icon],[forge-dropdown-icon],.forge-dropdown-icon",CLEAR_BUTTON:"[data-forge-autocomplete-clear],[forge-autocomplete-clear]"},ge={DEFAULT_DEBOUNCE_TIME:500,NUM_SKELETON_ITEMS:3},Oe={CHANGE:`${b}-change`,SELECT:`${b}-select`,SCROLLED_BOTTOM:`${b}-scrolled-bottom`},o={elementName:b,attributes:fe,selectors:ve,numbers:ge,events:Oe},de=(e=>(e.Default="default",e.Stateless="stateless",e))(de||{});var I=class extends G{constructor(e){super(e);this.setInputElement()}setInputElement(){let e=N(this._component,o.selectors.INPUT,!1);return e.length&&(this._inputElement=e[0]),this._inputElement}setInputAttribute(e,t){this._inputElement.setAttribute(e,t)}addInputListener(e,t){this._inputElement.addEventListener(e,t)}removeInputListener(e,t){this._inputElement.removeEventListener(e,t)}initializeInputAccessibility(e){this._inputElement.setAttribute("autocomplete","off"),this._inputElement.setAttribute("role","combobox"),this._inputElement.setAttribute("aria-live","polite"),this._inputElement.setAttribute("aria-atomic","true"),this._inputElement.setAttribute("aria-haspopup","true"),this._inputElement.setAttribute("aria-expanded","false"),this._inputElement.setAttribute("aria-autocomplete","list")}isWrappingChipField(){return!!this._component.querySelector(x.elementName)}show(e,t){this._targetElement=this._getTargetElement(t),this._targetElement&&(this._listDropdown=new ae(this._targetElement,e),this._listDropdown.open(),this._inputElement.setAttribute("aria-expanded","true"),this._inputElement.setAttribute("aria-controls",`list-dropdown-popup-${e.id}`),this._tryToggleDropdownIconRotation(!0))}hide(e){if(!this._listDropdown)return;let{targetElement:t}=this._listDropdown.dropdownElement;t.removeEventListener(y.events.BLUR,e),this.setBusyVisibility(!1),this._tryToggleDropdownIconRotation(!1),this._inputElement.removeAttribute("aria-activedescendant"),this._inputElement.removeAttribute("aria-controls"),this._inputElement.setAttribute("aria-expanded","false"),this._listDropdown.close(),this._listDropdown=void 0}setBusyVisibility(e){var t;(t=this._listDropdown)==null||t.setBusyVisibility(e)}toggleOptionMultiple(e,t){var i;(i=this._listDropdown)==null||i.toggleOptionMultiple(e,t)}setDismissListener(e){if(!this._listDropdown||!this._listDropdown.dropdownElement)return;let t=this._listDropdown.dropdownElement;t.targetElement&&t.targetElement.addEventListener(y.events.BLUR,e)}focus(){window.requestAnimationFrame(()=>this._inputElement.focus())}setOptions(e){var t;(t=this._listDropdown)==null||t.setOptions(e)}appendOptions(e){var t;(t=this._listDropdown)==null||t.appendOptions(e)}setSelectedText(e){this._inputElement.value=e}getInputValue(){return this._inputElement.value}selectInputValue(){window.requestAnimationFrame(()=>this._inputElement.select())}isFocusWithinPopup(e){return!this._listDropdown||!this._listDropdown.dropdownElement?!1:this._listDropdown.dropdownElement.contains(e)}hasFocus(){let e=k();return e===this._inputElement||this.isFocusWithinPopup(e)}hasInputElement(){return!!this._inputElement}setDropdownIconListener(e,t){window.requestAnimationFrame(()=>{let i=this._component.querySelector(o.selectors.DROPDOWN_ICON);i&&i.addEventListener(e,t)})}removeDropdownIconListener(e,t){let i=this._component.querySelector(o.selectors.DROPDOWN_ICON);i&&i.removeEventListener(e,t)}setClearButtonListener(e,t){window.requestAnimationFrame(()=>{let i=this._component.querySelector(o.selectors.CLEAR_BUTTON);i&&i.addEventListener(e,t)})}removeClearButtonListener(e,t){let i=this._component.querySelector(o.selectors.CLEAR_BUTTON);i&&i.removeEventListener(e,t)}propagateKey(e){var t;(t=this._listDropdown)==null||t.handleKey(e)}updateActiveDescendant(e){!this._targetElement||T(this._inputElement,!!e,"aria-activedescendant",e)}getTargetElementWidth(e){return this._targetElement||(this._targetElement=this._getTargetElement(e)),this._targetElement.getBoundingClientRect().width}getPopupElement(){var e,t;return(t=(e=this._listDropdown)==null?void 0:e.dropdownElement)!=null?t:null}activateFirstOption(){var e;(e=this._listDropdown)==null||e.activateFirstOption()}activateSelectedOption(){var e;(e=this._listDropdown)==null||e.activateSelectedOption()}activateOptionByIndex(e){var t;(t=this._listDropdown)==null||t.activateOption(e)}getActiveOptionIndex(){var e,t;return(t=(e=this._listDropdown)==null?void 0:e.getActiveOptionIndex())!=null?t:null}clearActiveOption(){var e;(e=this._listDropdown)==null||e.clearActiveOption()}setSelectedOptions(e){if(this._listDropdown){let t=e.map(i=>i.value);this._listDropdown.setSelectedValues(t)}}queueDropdownPositionUpdate(){!this.getPopupElement()||window.requestAnimationFrame(()=>{let e=this.getPopupElement();e==null||e.position()})}_getTargetElement(e){return e?this._component.querySelector(e)||this._getDefaultTargetElement():this._getDefaultTargetElement()}_getDefaultTargetElement(){let e=this._component.querySelector("forge-text-field");if(e&&e.shadowRoot){let i=C(e,re.selectors.ROOT);if(i)return i}let t=this._component.querySelector("forge-chip-field");if(t&&t.shadowRoot){let i=C(t,x.selectors.ROOT);if(i)return i}return this._component.querySelector("input")||this._component}_tryToggleDropdownIconRotation(e){let t=this._component.querySelector(o.selectors.DROPDOWN_ICON);t&&T(t,e,o.attributes.DROPDOWN_ICON_OPEN)}};var ce=(e=>(e[e.Option=0]="Option",e[e.Group=1]="Group",e))(ce||{});function O(u,d){let e=u.some(i=>h(i)&&D(i)&&i.hasOwnProperty("options")&&(i.hasOwnProperty("text")||i.hasOwnProperty("builder"))),t=u.some(i=>h(i)&&D(i)&&i.hasOwnProperty("label")&&i.hasOwnProperty("value"));return e&&d===1||t&&d===0}function he(u,d){return u.find(e=>e.value===d)}function v(u,d,e=null){return e?!(e in u.value)||!(e in d)?!1:A(u.value[e],d[e]):A(u.value,d)}var E=class extends ue{constructor(e){super();this._adapter=e;this._isInitialized=!1;this._isDropdownOpen=!1;this._mode="default";this._multiple=!1;this._debounce=o.numbers.DEFAULT_DEBOUNCE_TIME;this._allowUnmatched=!1;this._filterOnFocus=!0;this._options=[];this._filterText="";this._selectedOptions=[];this._values=[];this._pendingFilterPromises=[];this._matchKey=null;this._clickListener=t=>this._onClick(t),this._focusListener=()=>this._onFocus(),this._blurListener=t=>this._onBlur(t),this._keydownListener=t=>this._onKeydown(t),this._dropdownIconClickListener=t=>this._onDropdownIconClick(t),this._dropdownScrollEndListener=()=>this._onDropdownScrollEnd(),this._dropdownIconMouseDownListener=t=>this._onDropdownIconMouseDown(t),this._clearButtonListener=t=>this._onClear(t),this._dismissListener=()=>this._onDismiss(),this._activeChangeListener=t=>this._adapter.updateActiveDescendant(t),this._targetWidthCallback=()=>this._adapter.getTargetElementWidth(this._popupTarget),this._identifier=S()}async initialize(){if(!this._adapter.hasInputElement()&&!this._adapter.setInputElement())throw new Error("An input element is required as a child of the autocomplete component.");if(this._setInputListener(),this._setFilterCallback(),this._attachListeners(),this._initializeAccessibility(),this._values.length){if(!this._selectedOptions.length){try{await this._executeFilter()}catch(e){console.error(e)}this._updateSelectedOptions(this._values)}this._adapter.setSelectedText(this._getSelectedText())}this._isInitialized=!0}disconnect(){this._isInitialized&&(this._detachListeners(),this._isInitialized=!1),this._isDropdownOpen&&this._closeDropdown()}_attachListeners(){this._adapter.addInputListener("click",this._clickListener),this._adapter.addInputListener("focus",this._focusListener),this._adapter.addInputListener("blur",this._blurListener),this._adapter.addInputListener("input",this._inputListener),this._adapter.addInputListener("keydown",this._keydownListener),this._adapter.setDropdownIconListener("click",this._dropdownIconClickListener),this._adapter.setDropdownIconListener("mousedown",this._dropdownIconMouseDownListener),this._adapter.setClearButtonListener("click",this._clearButtonListener)}_detachListeners(){this._adapter.removeInputListener("click",this._clickListener),this._adapter.removeInputListener("focus",this._focusListener),this._adapter.removeInputListener("blur",this._blurListener),this._adapter.removeInputListener("input",this._inputListener),this._adapter.removeInputListener("keydown",this._keydownListener),this._adapter.removeDropdownIconListener("click",this._dropdownIconClickListener),this._adapter.removeDropdownIconListener("mousedown",this._dropdownIconMouseDownListener),this._adapter.removeClearButtonListener("click",this._clearButtonListener)}_setInputListener(){this._inputListener=e=>this._onInput(e)}_setFilterCallback(){this._filterFn=h(this._debounce)&&this._debounce>0?B(this._debounceFilter,this._debounce,!1):this._debounceFilter}_initializeAccessibility(){this._adapter.initializeInputAccessibility(this._identifier)}get _flatOptions(){return O(this._options,1)?this._options.reduce((e,t)=>e.concat(t.options),[]):this._options}_onClick(e){!this._isDropdownOpen&&this._filterOnFocus&&this._showDropdown()}_onDropdownIconMouseDown(e){e.preventDefault()}_onDropdownIconClick(e){this._isDropdownOpen?this._closeDropdown():(this._adapter.focus(),window.requestAnimationFrame(()=>this._showDropdown()))}_onClear(e){this._clearValue(),this._adapter.setSelectedText(this._getSelectedText())}_onDropdownScrollEnd(){this._adapter.emitHostEvent(o.events.SCROLLED_BOTTOM)}_onFocus(){!this._isDropdownOpen&&this._adapter.getInputValue()&&!L.isMobile&&this._adapter.selectInputValue()}_onBlur(e){this._adapter.isFocusWithinPopup(e.relatedTarget)||this._applyBlur()}_applyBlur(){this._isDropdownOpen&&this._closeDropdown(),this._mode!=="stateless"&&(this._selectedOptions.length?this._adapter.setSelectedText(this._getSelectedText()):this._allowUnmatched||(this._filterText="",this._adapter.setSelectedText("")))}_onInput(e){this._selectedOptions.length&&!this._multiple&&(!this._adapter.getInputValue()||this._allowUnmatched)&&!this._adapter.isWrappingChipField()&&(this._selectedOptions=[],this._values=[],this._emitChangeEvent()),this._filterText=this._adapter.getInputValue(),this._filterFn()}async _debounceFilter(){if(!this._adapter.hasFocus()){this._pendingFilterPromises=[],this._isDropdownOpen&&this._closeDropdown();return}let e=this._filterText,t=this._executeFilter();this._pendingFilterPromises.push(t),this._isDropdownOpen?this._adapter.setBusyVisibility(!0):this._showDropdown({filter:!1});try{await t}catch(i){this._pendingFilterPromises=[],this._isDropdownOpen&&this._closeDropdown();return}if(e===this._filterText)this._pendingFilterPromises=[],this._onFilterComplete();else{let i=this._pendingFilterPromises.indexOf(t);i!==-1&&this._pendingFilterPromises.splice(i,1)}}_onKeydown(e){switch(e.key){case"Tab":this._isDropdownOpen&&!this._multiple&&this._selectActiveOption(!1);break;case"Esc":case"Escape":this._isDropdownOpen&&(e.preventDefault(),e.stopPropagation(),this._closeDropdown());break;case"Down":case"ArrowDown":e.preventDefault(),this._isDropdownOpen?this._adapter.propagateKey(e.key):this._showDropdown({activateFirst:!0,activateSelected:!0});break;case"Up":case"ArrowUp":e.preventDefault(),this._isDropdownOpen&&this._adapter.propagateKey(e.key);break;case"Enter":case"Home":case"End":this._isDropdownOpen&&(e.key==="Enter"&&e.stopPropagation(),e.preventDefault(),this._adapter.propagateKey(e.key));break;case"Backspace":case"Delete":let t=e.target,i=this._adapter.getInputValue(),n=t.value.substring(t.selectionStart,t.selectionEnd)===t.value,l=i.length===1&&t.selectionEnd===1,c=i.length===1&&t.selectionEnd===0,_=!i||n||l||c;!this._adapter.isWrappingChipField()&&_&&!this._multiple&&this._values.length&&this._clearValue();break}}_executeFilter(e=!0,t=!1){if(!this._filter||typeof this._filter!="function")throw new Error('A filter callback must be provided. Did you set the "filter" property?');let i=this._filter,n=e?this._filterText:"",l=t?this._getValue():null;return new Promise((c,_)=>Promise.resolve(i(n,l)).then(s=>{this._options=s,c(this._options)}).catch(s=>_(`An unexpected error occurred while filtering: ${s}`)))}_onFilterComplete(){if(!this._adapter.hasFocus()){this._isDropdownOpen&&this._closeDropdown();return}if(this._options.length){let e=this._allowUnmatched&&!this._selectedOptions.length;this._dropdownReady({userTriggered:e}),this._filterText&&this._adapter.activateFirstOption()}else this._closeDropdown()}_clearValue(){this._selectedOptions=[],this._values=[],this._isDropdownOpen&&(this._adapter.setSelectedOptions([]),this._adapter.clearActiveOption()),this._emitChangeEvent()}async _showDropdown({filter:e=!0,userTriggered:t=!0,activateFirst:i=!1,activateSelected:n=!1}={}){let l=this._allowUnmatched&&!this._selectedOptions.length;this._isDropdownOpen=!0;let c;if(this._optionBuilder){let s=this._optionBuilder;c=(m,f)=>s(m,this._filterText,f)}let _={options:this._options,multiple:this._multiple,selectedValues:[...this._values],id:`forge-autocomplete-${this._identifier}`,asyncStyle:"skeleton",optionLimit:this._optionLimit,popupClasses:this._popupClasses,headerBuilder:this._popupHeaderBuilder,footerBuilder:this._popupFooterBuilder,transform:s=>{if(this._filterText){let m=Y(s,this._filterText);if(m)return m}return s},allowBusy:!0,optionBuilder:c,syncWidth:this._syncPopupWidth,observeScroll:this._observeScroll,observeScrollThreshold:this._observeScrollThreshold,scrollEndListener:this._dropdownScrollEndListener,activeChangeCallback:this._activeChangeListener,targetWidthCallback:this._targetWidthCallback,selectCallback:s=>this._onSelect(s),closeCallback:()=>this._closeDropdown()};if(this._adapter.show(_,this._popupTarget),this._adapter.toggleHostAttribute(o.attributes.OPEN,this._isDropdownOpen),e){this._options.length&&this._adapter.setBusyVisibility(!0);try{await this._executeFilter(l)}catch(s){console.error(s)}this._updateSelectedOptions(this._values)}this._pendingFilterPromises.length||this._dropdownReady({userTriggered:t,activateFirst:i,activateSelected:n})}_dropdownReady({userTriggered:e=!0,activateFirst:t=!1,activateSelected:i=!1}={}){if(!this._isDropdownOpen||!this._options.length||e&&!this._adapter.hasFocus()){this._closeDropdown();return}this._sortSelectedOptions(),this._adapter.setBusyVisibility(!1),this._adapter.setOptions(this._options),this._adapter.setSelectedOptions(this._selectedOptions),this._adapter.setDismissListener(this._dismissListener),i&&this._selectedOptions.length?this._adapter.activateSelectedOption():t&&this._adapter.activateFirstOption()}_closeDropdown(){this._multiple&&(this._filterText=""),this._isDropdownOpen=!1,this._adapter.hide(this._dismissListener),this._sortSelectedOptions(),this._adapter.toggleHostAttribute(o.attributes.OPEN,this._isDropdownOpen)}_sortSelectedOptions(){if(this._multiple&&this._selectedOptions.length&&O(this._options,0)){let e=[],t=[];this._options.forEach(i=>{this._selectedOptions.find(n=>v(n,i.value,this._matchKey))?e.push(i):t.push(i)}),this._options=[...e,...t]}}async _onSelect(e,t=!0){if(this._valueChanging)return;if(this._mode==="stateless"){let n={value:e};this._adapter.emitHostEvent(o.events.SELECT,n,!0,!0)&&(this._filterText="",this._multiple||this._closeDropdown());return}let i=()=>{let n=this._flatOptions,l=n.find(s=>v(s,e,this._matchKey)),c=l?l.value:"",_=l?l.label:"";if(this._multiple){let s=n.findIndex(f=>v(f,e,this._matchKey));if(s>=0){let f=this._selectedOptions.some(me=>v(me,e,this._matchKey));this._adapter.toggleOptionMultiple(s,f)}let m=he(this._selectedOptions,c);if(m){let f=this._selectedOptions.indexOf(m);this._selectedOptions.splice(f,1)}else this._selectedOptions.push(l)}else h(c)?(this._selectedOptions[0]=l,this._filterText=_):(this._selectedOptions=[],this._filterText="");if(this._isDropdownOpen&&this._adapter.setSelectedOptions(this._selectedOptions),this._values=this._selectedOptions.map(s=>s.value),this._adapter.setSelectedText(this._getSelectedText()),!L.isMobile&&t&&this._adapter.selectInputValue(),this._multiple){let s=n.findIndex(f=>v(f,e,this._matchKey)),m=this._values.includes(e);this._adapter.toggleOptionMultiple(s,m)}this._emitChangeEvent(),this._tryUpdateDropdownPosition()};this._isDropdownOpen&&!this._multiple&&this._closeDropdown(),typeof this._beforeValueChange=="function"?(this._valueChanging=Promise.resolve(this._beforeValueChange.call(null,e,this._matchKey)),await this._valueChanging?i():this._tryUpdateDropdownPosition(),this._valueChanging=void 0):i()}_selectActiveOption(e=!0){let t=this._adapter.getActiveOptionIndex();if(typeof t=="number"&&t>=0){let i=this._flatOptions[t];i&&this._onSelect(i.value,e)}}_emitChangeEvent(){this._adapter.emitHostEvent(o.events.CHANGE,this._getValue(),!0)}_tryUpdateDropdownPosition(){this._isDropdownOpen&&this._adapter.queueDropdownPositionUpdate()}_getValue(){return this._values?this._values.length?this._multiple?[...this._values]:this._values[0]:this._multiple?[]:null:null}_getSelectedText(){return this._adapter.isWrappingChipField()?"":this._selectedTextBuilder?this._selectedTextBuilder(this._selectedOptions):this._multiple?this._values.length?`${this._values.length} ${this._values.length===1?"option":"options"} selected`:"":this._selectedOptions.filter(e=>e&&e.label).map(e=>e.label).join(" ").trim()}_onDismiss(){this._closeDropdown()}async _applyValue(e){let t=[];this._selectedOptions=[],Array.isArray(e)?t=e:t=h(e)?[e]:[],!this._multiple&&t.length>1&&(t=[t[0]]),O(t,0)?(this._values=t.map(n=>n.value),this._selectedOptions=t):this._values=t;let i=this._flatOptions;if(t.length&&i.length&&this._updateSelectedOptions(t),this._values.length&&!this._selectedOptions.length&&!!this._filter&&this._isInitialized){try{await this._executeFilter(!1,!0)}catch(n){console.error(n)}this._updateSelectedOptions(this._values)}this._multiple?this._filterText="":this._filterText=this._selectedOptions.length?this._selectedOptions[0].label:"",this._isInitialized&&this._adapter.setSelectedText(this._getSelectedText()),this._isDropdownOpen&&this._adapter.setSelectedOptions(this._selectedOptions)}_updateSelectedOptions(e){let t=[...this._flatOptions,...this._selectedOptions];if(this._selectedOptions.length&&(this._selectedOptions=[]),O(e,0))for(let i of e){let n=t.find(l=>v(l,i.value,this._matchKey));n?this._selectedOptions.push(n):this._selectedOptions.push(i)}else for(let i of e){let n=t.find(l=>v(l,i,this._matchKey));n?this._selectedOptions.push(n):this._allowUnmatched&&this._selectedOptions.push({label:i,value:i})}}get mode(){return this._mode}set mode(e){this._mode!==e&&(this._mode=e,this._mode==="stateless"&&(this._selectedOptions=[],this._isDropdownOpen&&this._closeDropdown()),this._adapter.setHostAttribute(o.attributes.MODE,this._mode))}get multiple(){return this._multiple}set multiple(e){this._multiple!==e&&(this._multiple=e,this._adapter.setHostAttribute(o.attributes.MULTIPLE,h(this._multiple)?this._multiple.toString():""))}get value(){return this._getValue()}set value(e){let t=[];e==null?t=[]:Array.isArray(e)?t=JSON.parse(JSON.stringify(e)):F(e)?t=[e]:t=[JSON.parse(JSON.stringify(e))],(t.length!==this._values.length||t.some(n=>!this._values.includes(n)))&&this._applyValue(e)}get filterOnFocus(){return this._filterOnFocus}set filterOnFocus(e){this._filterOnFocus!==e&&(this._filterOnFocus=e,this._adapter.setHostAttribute(o.attributes.FILTER_ON_FOCUS,h(this._filterOnFocus)?this._filterOnFocus.toString():""))}get allowUnmatched(){return this._allowUnmatched}set allowUnmatched(e){this._allowUnmatched!==e&&(this._allowUnmatched=e,h(this._allowUnmatched)&&this._adapter.setHostAttribute(o.attributes.ALLOW_UNMATCHED,this._allowUnmatched.toString()))}get matchKey(){return this._matchKey}set matchKey(e){this._matchKey!==e&&(this._matchKey=e)}get popupTarget(){return this._popupTarget}set popupTarget(e){this._popupTarget!==e&&(this._popupTarget=e)}get popupClasses(){return Array.isArray(this._popupClasses)?[...this._popupClasses]:[this._popupClasses]}set popupClasses(e){this._popupClasses!==e&&(this._popupClasses=Array.isArray(e)?[...e]:[e])}set popupHeaderBuilder(e){this._popupHeaderBuilder=e}set popupFooterBuilder(e){this._popupFooterBuilder=e}get syncPopupWidth(){return this._syncPopupWidth}set syncPopupWidth(e){this._syncPopupWidth!==e&&(this._syncPopupWidth=e)}get optionLimit(){return this._optionLimit}set optionLimit(e){this._optionLimit!==e&&(this._optionLimit=e)}get debounce(){return this._debounce}set debounce(e){this._debounce!==e&&(this._debounce=e,this._isInitialized&&this._setFilterCallback(),this._adapter.setHostAttribute(o.attributes.DEBOUNCE,h(this._debounce)?this._debounce.toString():""))}get optionBuilder(){return this._optionBuilder}set optionBuilder(e){this._optionBuilder=e}get filter(){return this._filter}set filter(e){this._filter!==e&&(this._filter=e,this._isInitialized&&this._values.length&&!this._flatOptions.length&&!!this._filter&&this._executeFilter().then(()=>{this._updateSelectedOptions(this._values),this._adapter.setSelectedText(this._getSelectedText())}))}get selectedTextBuilder(){return this._selectedTextBuilder}set selectedTextBuilder(e){this._selectedTextBuilder=e,this._selectedOptions.length&&this._adapter.setSelectedText(this._getSelectedText())}get observeScroll(){return this._observeScroll}set observeScroll(e){this._observeScroll=e}get observeScrollThreshold(){return this._observeScrollThreshold}set observeScrollThreshold(e){this._observeScrollThreshold=e}appendOptions(e){!this._isDropdownOpen||(this._options=[...this._options,...e],this._adapter.appendOptions(e))}get isInitialized(){return this._isInitialized}get open(){return this._isDropdownOpen}set open(e){this._isDropdownOpen!==e&&(e?this._showDropdown({userTriggered:!1}):this._closeDropdown())}get beforeValueChange(){return this._beforeValueChange}set beforeValueChange(e){e!==this._beforeValueChange&&(this._beforeValueChange=e)}get popupElement(){return this._adapter.getPopupElement()}};var be="<template><slot></slot></template>",Ie=":host{display:block}:host([hidden]){display:none}",r=class extends ie{constructor(){super();J.define([V,z,q]),H(this,be,Ie),this._foundation=new E(new I(this))}static get observedAttributes(){return[o.attributes.MODE,o.attributes.MULTIPLE,o.attributes.DEBOUNCE,o.attributes.FILTER_ON_FOCUS,o.attributes.ALLOW_UNMATCHED,o.attributes.POPUP_TARGET,o.attributes.POPUP_CLASSES,o.attributes.OBSERVE_SCROLL,o.attributes.OBSERVE_SCROLL_THRESHOLD,o.attributes.OPTION_LIMIT,o.attributes.SYNC_POPUP_WIDTH,o.attributes.OPEN,o.attributes.MATCH_KEY]}connectedCallback(){this.querySelector(o.selectors.INPUT)?this._foundation.initialize():M(this,o.selectors.INPUT).then(()=>this._foundation.initialize())}disconnectedCallback(){this._foundation.disconnect()}attributeChangedCallback(e,t,i){switch(super.attributeChangedCallback(e,t,i),e){case o.attributes.MODE:this.mode=i;break;case o.attributes.MULTIPLE:this.multiple=g(i);break;case o.attributes.DEBOUNCE:this.debounce=P(i);break;case o.attributes.FILTER_ON_FOCUS:this.filterOnFocus=g(i);break;case o.attributes.ALLOW_UNMATCHED:this.allowUnmatched=g(i);break;case o.attributes.POPUP_TARGET:this.popupTarget=i;break;case o.attributes.OPEN:this.open=g(i);break;case o.attributes.MATCH_KEY:this.matchKey=i;break}}appendOptions(e){this._foundation.appendOptions(e)}openDropdown(){this.open=!0}closeDropdown(){this.open=!1}};p([a()],r.prototype,"mode",2),p([a()],r.prototype,"multiple",2),p([a()],r.prototype,"value",2),p([a()],r.prototype,"debounce",2),p([a()],r.prototype,"filterOnFocus",2),p([a()],r.prototype,"allowUnmatched",2),p([a()],r.prototype,"popupTarget",2),p([a()],r.prototype,"optionBuilder",2),p([a()],r.prototype,"filter",2),p([a()],r.prototype,"selectedTextBuilder",2),p([a()],r.prototype,"open",2),p([a()],r.prototype,"matchKey",2),p([a({set:!1})],r.prototype,"isInitialized",2),p([a({set:!1})],r.prototype,"popupElement",2),p([a()],r.prototype,"beforeValueChange",2),r=p([R({name:o.elementName,dependencies:[le,oe,te,ee,Q,ne,Z,j]})],r);var _e=class extends ${constructor(e){super(e)}_build(){let e=document.createElement(o.elementName);return this._attachTextField(e),e}get textFieldDelegate(){return this._textFieldDelegate}get value(){return this._element.value}set value(e){this._element.value=e}get disabled(){return this._textFieldDelegate.inputElement.disabled}set disabled(e){this._textFieldDelegate.inputElement.disabled=e}get invalid(){return this._textFieldDelegate.invalid||!1}set invalid(e){this._textFieldDelegate.invalid=e}onChange(e){this._element.addEventListener(o.events.CHANGE,t=>e(t.detail))}onFocus(e){this._textFieldDelegate.inputElement.addEventListener("focus",t=>e(t))}onBlur(e){this._textFieldDelegate.inputElement.addEventListener("blur",t=>e(t))}_attachTextField(e){var i,n,l,c,_,s;let t={props:w({},(n=(i=this._config.options)==null?void 0:i.textFieldDelegateConfig)==null?void 0:n.props),options:w({},(c=(l=this._config.options)==null?void 0:l.textFieldDelegateConfig)==null?void 0:c.options)};t.options||(t.options={}),((_=this._config.options)==null?void 0:_.useDropdownIcon)!==!1&&!((s=t.options)!=null&&s.trailingElement)&&(t.options.trailingElement=this._createDropdownIconElement()),this._textFieldDelegate=new pe(t),e.appendChild(this._textFieldDelegate.element)}_createDropdownIconElement(){let e={props:{slot:"trailing",name:"arrow_drop_down"},options:{attributes:{"forge-dropdown-icon":""}}};return new X(e).element}};function Rt(){U(r)}export{o as a,de as b,I as c,ce as d,O as e,he as f,v as g,E as h,r as i,_e as j,Rt as k};
7
+ //# sourceMappingURL=chunk.B5HGV5EZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/autocomplete/autocomplete-constants.ts", "../../src/autocomplete/autocomplete-adapter.ts", "../../src/autocomplete/autocomplete-utils.ts", "../../src/autocomplete/autocomplete-foundation.ts", "../../src/autocomplete/autocomplete.ts", "../../src/autocomplete/autocomplete-component-delegate.ts", "../../src/autocomplete/index.ts"],
4
+ "sourcesContent": ["import { COMPONENT_NAME_PREFIX, KEYSTROKE_DEBOUNCE_THRESHOLD } from '../constants';\nimport { IListItemComponent } from '../list';\nimport { IListDropdownConfig, IListDropdownOption, IListDropdownOptionGroup, ListDropdownOptionGroupBuilder } from '../list-dropdown';\nimport { IPopupPosition } from '../popup';\nimport { FIELD_CONSTANTS } from '../field/field-constants';\n\nconst elementName: keyof HTMLElementTagNameMap = `${COMPONENT_NAME_PREFIX}autocomplete`;\n\nconst attributes = {\n MODE: 'mode',\n MULTIPLE: 'multiple',\n DEBOUNCE: 'debounce',\n FILTER_ON_FOCUS: 'filter-on-focus',\n ALLOW_UNMATCHED: 'allow-unmatched',\n POPUP_TARGET: 'popup-target',\n POPUP_CLASSES: 'popup-classes',\n OPTION_LIMIT: 'option-limit',\n OBSERVE_SCROLL: 'observe-scroll',\n OBSERVE_SCROLL_THRESHOLD: 'observe-scroll-threshold',\n SYNC_POPUP_WIDTH: 'sync-popup-width',\n OPEN: 'open',\n MATCH_KEY: 'match-key',\n DROPDOWN_ICON_OPEN: 'data-forge-dropdown-icon-open'\n};\n\nconst selectors = {\n INPUT: FIELD_CONSTANTS.selectors.INPUT,\n DROPDOWN_ICON: '[data-forge-dropdown-icon],[data-forge-dropdown-icon],[forge-dropdown-icon],.forge-dropdown-icon',\n CLEAR_BUTTON: '[data-forge-autocomplete-clear],[forge-autocomplete-clear]'\n};\n\nconst numbers = {\n DEFAULT_DEBOUNCE_TIME: KEYSTROKE_DEBOUNCE_THRESHOLD,\n NUM_SKELETON_ITEMS: 3\n};\n\nconst events = {\n CHANGE: `${elementName}-change`,\n SELECT: `${elementName}-select`,\n SCROLLED_BOTTOM: `${elementName}-scrolled-bottom`\n};\n\nexport const AUTOCOMPLETE_CONSTANTS = {\n elementName,\n attributes,\n selectors,\n numbers,\n events\n};\n\nexport type AutocompleteOptionBuilder<T = any> = (option: IAutocompleteOption<T>, filterText: string, parentElement: IListItemComponent) => HTMLElement;\nexport type AutocompleteOptionGroupBuilder<T = any> = ListDropdownOptionGroupBuilder<T>;\nexport type AutocompleteFilterCallback<T = any> = (filterText: string, value: T | null) => IAutocompleteOption<T>[] | IAutocompleteOptionGroup<T>[] | Promise<IAutocompleteOption<T>[] | IAutocompleteOptionGroup<T>[]>;\nexport type AutocompleteSelectedTextBuilder<T = any> = (selectedOptions: Array<IAutocompleteOption<T>>) => string;\n\nexport enum AutocompleteMode {\n Default = 'default',\n Stateless = 'stateless'\n}\n\nexport interface IAutocompleteOption<T = any> extends IListDropdownOption<T> {}\nexport interface IAutocompleteOptionGroup<T = any> extends IListDropdownOptionGroup<T> {}\n\nexport interface IAutocompletePopupConfiguration {\n filterText: string;\n popupTarget: string;\n dropdownConfig: IListDropdownConfig;\n popupClasses: string[];\n popupOffset: IPopupPosition;\n syncPopupWidth: boolean;\n listener: (value: string) => void;\n scrollEndListener: () => void;\n}\n\nexport interface IAutocompleteSelectEventData<T = any> {\n value: T;\n}\n", "import { getShadowElement, deepQuerySelectorAll, getActiveElement, toggleAttribute } from '@tylertech/forge-core';\nimport { BaseAdapter, IBaseAdapter } from '../core/base/base-adapter';\nimport { IAutocompleteComponent } from './autocomplete';\nimport { AUTOCOMPLETE_CONSTANTS, IAutocompleteOption, IAutocompleteOptionGroup } from './autocomplete-constants';\nimport { TEXT_FIELD_CONSTANTS } from '../text-field';\nimport { IListDropdown, IListDropdownConfig, ListDropdown } from '../list-dropdown';\nimport { CHIP_FIELD_CONSTANTS } from '../chip-field';\nimport { IPopupComponent, POPUP_CONSTANTS } from '../popup';\n\nexport interface IAutocompleteAdapter extends IBaseAdapter {\n setInputElement(): HTMLInputElement;\n setInputAttribute(name: string, value: string): void;\n addInputListener(type: string, listener: (evt: Event) => void): void;\n removeInputListener(type: string, listener: (evt: Event) => void): void;\n initializeInputAccessibility(identifier: string): void;\n isWrappingChipField(): boolean;\n show(config: IListDropdownConfig, popupTarget: string): void;\n hide(listener: () => void): void;\n focus(): void;\n setOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void;\n appendOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void;\n setSelectedText(value: string): void;\n getInputValue(): string;\n selectInputValue(): void;\n setDismissListener(listener: () => void): void;\n toggleOptionMultiple(index: number, selected: boolean): void;\n isFocusWithinPopup(target: HTMLElement): boolean;\n hasFocus(): boolean;\n hasInputElement(): boolean;\n setDropdownIconListener(type: string, listener: EventListener): void;\n removeDropdownIconListener(type: string, listener: EventListener): void;\n setClearButtonListener(type: string, listener: EventListener): void;\n removeClearButtonListener(type: string, listener: EventListener): void;\n getPopupElement(): HTMLElement | null;\n propagateKey(key: string): void;\n updateActiveDescendant(id: string): void;\n getTargetElementWidth(selector: string): number;\n activateFirstOption(): void;\n activateSelectedOption(): void;\n activateOptionByIndex(value: number): void;\n setBusyVisibility(busy: boolean): void;\n getActiveOptionIndex(): number | null;\n clearActiveOption(): void;\n setSelectedOptions(options: IAutocompleteOption[]): void;\n queueDropdownPositionUpdate(): void;\n}\n\n/**\n * The DOM adapter for the `<forge-autocomplete>` element.\n */\nexport class AutocompleteAdapter extends BaseAdapter<IAutocompleteComponent> implements IAutocompleteAdapter {\n private _inputElement: HTMLInputElement;\n private _listDropdown?: IListDropdown;\n private _targetElement?: HTMLElement;\n \n constructor(component: IAutocompleteComponent) {\n super(component);\n this.setInputElement();\n }\n\n public setInputElement(): HTMLInputElement {\n const inputElements = deepQuerySelectorAll(this._component, AUTOCOMPLETE_CONSTANTS.selectors.INPUT, false);\n if (inputElements.length) {\n this._inputElement = inputElements[0] as HTMLInputElement;\n }\n return this._inputElement;\n }\n\n public setInputAttribute(name: string, value: string): void {\n this._inputElement.setAttribute(name, value);\n }\n\n public addInputListener(type: string, listener: (evt: Event) => void): void {\n this._inputElement.addEventListener(type, listener);\n }\n\n public removeInputListener(type: string, listener: (evt: Event) => void): void {\n this._inputElement.removeEventListener(type, listener);\n }\n\n public initializeInputAccessibility(identifier: string): void {\n this._inputElement.setAttribute('autocomplete', 'off');\n this._inputElement.setAttribute('role', 'combobox');\n this._inputElement.setAttribute('aria-live', 'polite');\n this._inputElement.setAttribute('aria-atomic', 'true');\n this._inputElement.setAttribute('aria-haspopup', 'true');\n this._inputElement.setAttribute('aria-expanded', 'false');\n this._inputElement.setAttribute('aria-autocomplete', 'list');\n }\n\n public isWrappingChipField(): boolean {\n return !!this._component.querySelector(CHIP_FIELD_CONSTANTS.elementName);\n }\n\n public show(config: IListDropdownConfig, popupTarget: string): void {\n this._targetElement = this._getTargetElement(popupTarget);\n if (!this._targetElement) {\n return;\n }\n this._listDropdown = new ListDropdown(this._targetElement, config);\n this._listDropdown.open();\n this._inputElement.setAttribute('aria-expanded', 'true');\n this._inputElement.setAttribute('aria-controls', `list-dropdown-popup-${config.id}`);\n this._tryToggleDropdownIconRotation(true);\n }\n\n public hide(listener: () => void): void {\n if (!this._listDropdown) {\n return;\n }\n const { targetElement } = this._listDropdown.dropdownElement as IPopupComponent;\n targetElement.removeEventListener(POPUP_CONSTANTS.events.BLUR, listener);\n this.setBusyVisibility(false);\n this._tryToggleDropdownIconRotation(false);\n this._inputElement.removeAttribute('aria-activedescendant');\n this._inputElement.removeAttribute('aria-controls');\n this._inputElement.setAttribute('aria-expanded', 'false');\n this._listDropdown.close();\n this._listDropdown = undefined;\n }\n\n\n public setBusyVisibility(isVisible: boolean): void {\n this._listDropdown?.setBusyVisibility(isVisible);\n }\n\n public toggleOptionMultiple(index: number, selected: boolean): void {\n this._listDropdown?.toggleOptionMultiple(index, selected);\n }\n\n public setDismissListener(listener: () => void): void {\n if (!this._listDropdown || !this._listDropdown.dropdownElement) {\n return;\n }\n const dropdownElement = this._listDropdown.dropdownElement as IPopupComponent;\n if (dropdownElement.targetElement) {\n dropdownElement.targetElement.addEventListener(POPUP_CONSTANTS.events.BLUR, listener);\n }\n }\n\n public focus(): void {\n window.requestAnimationFrame(() => this._inputElement.focus());\n }\n\n public setOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void {\n this._listDropdown?.setOptions(options);\n }\n\n public appendOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void {\n this._listDropdown?.appendOptions(options);\n }\n\n public setSelectedText(value: string): void {\n this._inputElement.value = value;\n }\n\n public getInputValue(): string {\n return this._inputElement.value;\n }\n\n public selectInputValue(): void {\n window.requestAnimationFrame(() => this._inputElement.select());\n }\n\n public isFocusWithinPopup(target: HTMLElement): boolean {\n if (!this._listDropdown || !this._listDropdown.dropdownElement) {\n return false;\n }\n return this._listDropdown.dropdownElement.contains(target);\n }\n\n public hasFocus(): boolean {\n const activeElement = getActiveElement() as HTMLElement;\n return activeElement === this._inputElement || this.isFocusWithinPopup(activeElement);\n }\n\n public hasInputElement(): boolean {\n return !!this._inputElement;\n }\n\n public setDropdownIconListener(type: string, listener: EventListener): void {\n window.requestAnimationFrame(() => {\n const dropdownIcon = this._component.querySelector(AUTOCOMPLETE_CONSTANTS.selectors.DROPDOWN_ICON);\n if (dropdownIcon) {\n dropdownIcon.addEventListener(type, listener);\n }\n });\n }\n\n public removeDropdownIconListener(type: string, listener: EventListener): void {\n const dropdownIcon = this._component.querySelector(AUTOCOMPLETE_CONSTANTS.selectors.DROPDOWN_ICON);\n if (dropdownIcon) {\n dropdownIcon.removeEventListener(type, listener);\n }\n }\n\n public setClearButtonListener(type: string, listener: EventListener): void {\n window.requestAnimationFrame(() => {\n const clearButton = this._component.querySelector(AUTOCOMPLETE_CONSTANTS.selectors.CLEAR_BUTTON);\n if (clearButton) {\n clearButton.addEventListener(type, listener);\n }\n });\n }\n\n public removeClearButtonListener(type: string, listener: EventListener): void {\n const clearButton = this._component.querySelector(AUTOCOMPLETE_CONSTANTS.selectors.CLEAR_BUTTON);\n if (clearButton) {\n clearButton.removeEventListener(type, listener);\n }\n }\n\n public propagateKey(key: string): void {\n this._listDropdown?.handleKey(key);\n }\n\n public updateActiveDescendant(id: string): void {\n if (!this._targetElement) {\n return;\n }\n toggleAttribute(this._inputElement, !!id, 'aria-activedescendant', id);\n }\n\n public getTargetElementWidth(selector: string): number {\n if (!this._targetElement) {\n this._targetElement = this._getTargetElement(selector);\n }\n return this._targetElement.getBoundingClientRect().width;\n }\n\n public getPopupElement(): HTMLElement | null {\n return this._listDropdown?.dropdownElement ?? null;\n }\n\n public activateFirstOption(): void {\n this._listDropdown?.activateFirstOption();\n }\n\n public activateSelectedOption(): void {\n this._listDropdown?.activateSelectedOption();\n }\n\n public activateOptionByIndex(value: number): void {\n this._listDropdown?.activateOption(value);\n }\n\n public getActiveOptionIndex(): number | null {\n return this._listDropdown?.getActiveOptionIndex() ?? null;\n }\n\n public clearActiveOption(): void {\n this._listDropdown?.clearActiveOption();\n }\n\n public setSelectedOptions(options: IAutocompleteOption[]): void {\n if (this._listDropdown) {\n const values = options.map(o => o.value);\n this._listDropdown.setSelectedValues(values);\n }\n }\n\n public queueDropdownPositionUpdate(): void {\n if (!this.getPopupElement()) {\n return;\n }\n // We need to wait for the next animation frame to ensure that the layout has been updated\n window.requestAnimationFrame(() => {\n const dropdownEl = this.getPopupElement() as IPopupComponent | undefined;\n dropdownEl?.position();\n });\n }\n\n private _getTargetElement(selector?: string): HTMLElement {\n return selector ? this._component.querySelector(selector) || this._getDefaultTargetElement() : this._getDefaultTargetElement();\n }\n\n private _getDefaultTargetElement(): HTMLElement {\n // This component is often used with the text-field, if so, let's target our popup around one if its internal elements for proper alignnment\n const textField = this._component.querySelector('forge-text-field');\n if (textField && textField.shadowRoot) {\n const textFieldRoot = getShadowElement(textField, TEXT_FIELD_CONSTANTS.selectors.ROOT) as HTMLElement;\n if (textFieldRoot) {\n return textFieldRoot;\n }\n }\n\n // This component is often used with the chip-field, if so, let's target our popup around one if its internal elements for proper alignnment\n const chipField = this._component.querySelector('forge-chip-field');\n if (chipField && chipField.shadowRoot) {\n const chipFieldRoot = getShadowElement(chipField, CHIP_FIELD_CONSTANTS.selectors.ROOT) as HTMLElement;\n if (chipFieldRoot) {\n return chipFieldRoot;\n }\n }\n\n return this._component.querySelector('input') || this._component;\n }\n\n private _tryToggleDropdownIconRotation(state: boolean): void {\n const dropdownIcon = this._component.querySelector(AUTOCOMPLETE_CONSTANTS.selectors.DROPDOWN_ICON) as HTMLElement;\n if (dropdownIcon) {\n toggleAttribute(dropdownIcon, state, AUTOCOMPLETE_CONSTANTS.attributes.DROPDOWN_ICON_OPEN);\n }\n }\n}\n", "import { IAutocompleteOption, IAutocompleteOptionGroup } from './autocomplete-constants';\nimport { isDefined, isObject, isDeepEqual } from '@tylertech/forge-core';\n\n/** The available option types. */\nexport enum OptionType { Option, Group }\n\n/**\n * Determines if the provided options are of the specified type.\n * @param options The options either grouped or individual.\n * @param type The type of option to detect.\n */\nexport function isOptionType(options: IAutocompleteOption[] | IAutocompleteOptionGroup[], type: OptionType): boolean {\n const isOptionGroups = options.some((o: IAutocompleteOption | IAutocompleteOptionGroup) => isDefined(o) && isObject(o) && o.hasOwnProperty('options') && (o.hasOwnProperty('text') || o.hasOwnProperty('builder')));\n const isOptionTypes = options.some((o: IAutocompleteOption | IAutocompleteOptionGroup) => isDefined(o) && isObject(o) && o.hasOwnProperty('label') && o.hasOwnProperty('value'));\n return (isOptionGroups && type === OptionType.Group) || (isOptionTypes && type === OptionType.Option);\n}\n\n/** A utility function to find the matching option in the provided options by the value provided. */\nexport function getSelectedOption(options: IAutocompleteOption[], value: string): IAutocompleteOption | undefined {\n return options.find(o => o.value === value);\n}\n\n/** A predicate function that will determine if an option value is equal regardless of primitive type or complex object type. */\nexport function optionEqualPredicate(option: IAutocompleteOption, value: any, property: string | null = null): boolean {\n if (property) {\n if (!(property in option.value) || !(property in value)) {\n return false;\n }\n return isDeepEqual(option.value[property], value[property]);\n }\n return isDeepEqual(option.value, value);\n}\n", "import { debounce, isDefined, isString, Platform, randomChars } from '@tylertech/forge-core';\nimport { highlightTextHTML } from '../core';\nimport { IListItemComponent } from '../list';\nimport { IListDropdownConfig, IListDropdownOption, ListDropdownAsyncStyle, ListDropdownFooterBuilder, ListDropdownHeaderBuilder, ListDropdownOptionBuilder } from '../list-dropdown';\nimport { IListDropdownAwareFoundation, ListDropdownAwareFoundation } from '../list-dropdown/list-dropdown-aware-foundation';\nimport { IAutocompleteAdapter } from './autocomplete-adapter';\nimport { AutocompleteFilterCallback, AutocompleteMode, AutocompleteOptionBuilder, AutocompleteSelectedTextBuilder, AUTOCOMPLETE_CONSTANTS, IAutocompleteOption, IAutocompleteOptionGroup, IAutocompleteSelectEventData } from './autocomplete-constants';\nimport { getSelectedOption, isOptionType, optionEqualPredicate, OptionType } from './autocomplete-utils';\n\nexport interface IAutocompleteFoundation extends IListDropdownAwareFoundation {\n mode: AutocompleteMode;\n multiple: boolean;\n value: string | string[] | IAutocompleteOption | IAutocompleteOption[] | null | undefined;\n debounce: number;\n filterOnFocus: boolean;\n allowUnmatched: boolean;\n popupTarget: string;\n optionBuilder: AutocompleteOptionBuilder | null | undefined;\n filter: AutocompleteFilterCallback | null | undefined;\n selectedTextBuilder: AutocompleteSelectedTextBuilder;\n isInitialized: boolean;\n open: boolean;\n matchKey: string | null | undefined;\n appendOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void;\n beforeValueChange: (value: any) => boolean | Promise<boolean>;\n}\n\n/**\n * The foundation class behind the `<forge-autocomplete>` element.\n */\nexport class AutocompleteFoundation extends ListDropdownAwareFoundation implements IAutocompleteFoundation {\n private _isInitialized = false;\n private _isDropdownOpen = false;\n private _mode: AutocompleteMode = AutocompleteMode.Default;\n private _multiple = false;\n private _debounce = AUTOCOMPLETE_CONSTANTS.numbers.DEFAULT_DEBOUNCE_TIME;\n private _allowUnmatched = false;\n private _popupTarget: string;\n private _filterOnFocus = true;\n private _optionBuilder?: AutocompleteOptionBuilder | null;\n private _filter?: AutocompleteFilterCallback | null;\n private _selectedTextBuilder: AutocompleteSelectedTextBuilder;\n private _options: IAutocompleteOption[] | IAutocompleteOptionGroup[] = [];\n private _filterText = '';\n private _selectedOptions: IAutocompleteOption[] = [];\n private _values: any[] = [];\n private _pendingFilterPromises: Array<Promise<IAutocompleteOption[] | IAutocompleteOptionGroup[]>> = [];\n private _identifier: string;\n private _matchKey?: string | null = null;\n private _filterFn: () => Promise<void>;\n private _clickListener: (evt: MouseEvent) => void;\n private _focusListener: (evt: FocusEvent) => void;\n private _blurListener: (evt: FocusEvent) => void;\n private _inputListener: (evt: KeyboardEvent) => void;\n private _keydownListener: (evt: KeyboardEvent) => void;\n private _dropdownIconClickListener: (evt: MouseEvent) => void;\n private _dropdownIconMouseDownListener: (evt: MouseEvent) => void;\n private _clearButtonListener: (evt: MouseEvent) => void;\n private _dropdownScrollEndListener: () => void;\n private _dismissListener: () => void;\n private _activeChangeListener: (id: string) => void;\n private _targetWidthCallback: () => number;\n private _beforeValueChange: (value: any) => boolean | Promise<boolean>;\n private _valueChanging: Promise<boolean> | undefined;\n\n constructor(private _adapter: IAutocompleteAdapter) {\n super();\n this._clickListener = evt => this._onClick(evt);\n this._focusListener = () => this._onFocus();\n this._blurListener = evt => this._onBlur(evt);\n this._keydownListener = evt => this._onKeydown(evt);\n this._dropdownIconClickListener = evt => this._onDropdownIconClick(evt);\n this._dropdownScrollEndListener = () => this._onDropdownScrollEnd();\n this._dropdownIconMouseDownListener = evt => this._onDropdownIconMouseDown(evt);\n this._clearButtonListener = evt => this._onClear(evt);\n this._dismissListener = () => this._onDismiss();\n this._activeChangeListener = id => this._adapter.updateActiveDescendant(id);\n this._targetWidthCallback = () => this._adapter.getTargetElementWidth(this._popupTarget);\n this._identifier = randomChars();\n }\n\n public async initialize(): Promise<void> {\n if (!this._adapter.hasInputElement() && !this._adapter.setInputElement()) {\n throw new Error('An input element is required as a child of the autocomplete component.');\n }\n\n this._setInputListener();\n this._setFilterCallback();\n this._attachListeners();\n this._initializeAccessibility();\n\n if (this._values.length) {\n if (!this._selectedOptions.length) {\n try {\n await this._executeFilter();\n } catch (e) {\n console.error(e);\n }\n this._updateSelectedOptions(this._values);\n }\n this._adapter.setSelectedText(this._getSelectedText());\n }\n\n this._isInitialized = true;\n }\n\n public disconnect(): void {\n if (this._isInitialized) {\n this._detachListeners();\n this._isInitialized = false;\n }\n if (this._isDropdownOpen) {\n this._closeDropdown();\n }\n }\n\n private _attachListeners(): void {\n this._adapter.addInputListener('click', this._clickListener);\n this._adapter.addInputListener('focus', this._focusListener);\n this._adapter.addInputListener('blur', this._blurListener);\n this._adapter.addInputListener('input', this._inputListener);\n this._adapter.addInputListener('keydown', this._keydownListener);\n this._adapter.setDropdownIconListener('click', this._dropdownIconClickListener);\n this._adapter.setDropdownIconListener('mousedown', this._dropdownIconMouseDownListener);\n this._adapter.setClearButtonListener('click', this._clearButtonListener);\n }\n\n private _detachListeners(): void {\n this._adapter.removeInputListener('click', this._clickListener);\n this._adapter.removeInputListener('focus', this._focusListener);\n this._adapter.removeInputListener('blur', this._blurListener);\n this._adapter.removeInputListener('input', this._inputListener);\n this._adapter.removeInputListener('keydown', this._keydownListener);\n this._adapter.removeDropdownIconListener('click', this._dropdownIconClickListener);\n this._adapter.removeDropdownIconListener('mousedown', this._dropdownIconMouseDownListener);\n this._adapter.removeClearButtonListener('click', this._clearButtonListener);\n }\n\n private _setInputListener(): void {\n this._inputListener = (evt: KeyboardEvent) => this._onInput(evt);\n }\n\n private _setFilterCallback(): void {\n this._filterFn = isDefined(this._debounce) && this._debounce > 0 ? debounce(this._debounceFilter, this._debounce, false) : this._debounceFilter;\n }\n\n private _initializeAccessibility(): void {\n this._adapter.initializeInputAccessibility(this._identifier);\n }\n\n private get _flatOptions(): IAutocompleteOption[] {\n if (isOptionType(this._options, OptionType.Group)) {\n return (this._options as IAutocompleteOptionGroup[]).reduce((previousValue, currentValue) => previousValue.concat(currentValue.options), [] as IAutocompleteOption[]);\n }\n return this._options as IAutocompleteOption[];\n }\n\n private _onClick(evt: MouseEvent): void {\n if (!this._isDropdownOpen && this._filterOnFocus) {\n this._showDropdown();\n }\n }\n\n private _onDropdownIconMouseDown(evt: MouseEvent): void {\n evt.preventDefault(); // Always avoid changing focus when clicking the dropdown\n }\n\n private _onDropdownIconClick(evt: MouseEvent): void {\n if (!this._isDropdownOpen) {\n this._adapter.focus();\n window.requestAnimationFrame(() => this._showDropdown());\n } else {\n this._closeDropdown();\n }\n }\n\n private _onClear(evt: MouseEvent): void {\n this._clearValue();\n this._adapter.setSelectedText(this._getSelectedText());\n }\n\n private _onDropdownScrollEnd(): void {\n this._adapter.emitHostEvent(AUTOCOMPLETE_CONSTANTS.events.SCROLLED_BOTTOM);\n }\n\n private _onFocus(): void {\n if (!this._isDropdownOpen && this._adapter.getInputValue() && !Platform.isMobile) {\n this._adapter.selectInputValue();\n }\n }\n\n private _onBlur(evt: FocusEvent): void {\n // If the blur event was triggered by an element within the popup then ignore it\n if (this._adapter.isFocusWithinPopup(evt.relatedTarget as HTMLElement)) {\n return;\n }\n\n this._applyBlur();\n }\n\n private _applyBlur(): void {\n if (this._isDropdownOpen) {\n this._closeDropdown();\n }\n\n // If we are in stateless mode, we don't need to do anything further\n if (this._mode === AutocompleteMode.Stateless) {\n return;\n }\n\n if (!this._selectedOptions.length) {\n if (!this._allowUnmatched) {\n this._filterText = '';\n this._adapter.setSelectedText('');\n }\n } else {\n this._adapter.setSelectedText(this._getSelectedText());\n }\n }\n\n private _onInput(evt: KeyboardEvent): void {\n if (this._selectedOptions.length && !this._multiple && (!this._adapter.getInputValue() || this._allowUnmatched) && !this._adapter.isWrappingChipField()) {\n this._selectedOptions = [];\n this._values = [];\n this._emitChangeEvent();\n }\n this._filterText = this._adapter.getInputValue();\n this._filterFn();\n }\n\n private async _debounceFilter(): Promise<void> {\n // There is the potential that the user could have started a filter, then moved focus to another element\n // while a debounced filter is running. This check detects that scenario and stops all pending filters.\n if (!this._adapter.hasFocus()) {\n this._pendingFilterPromises = [];\n if (this._isDropdownOpen) {\n this._closeDropdown();\n }\n return;\n }\n\n // Keep track of these variables so we can use them when each filter callback completes\n const filterText = this._filterText; // Filter text just before the execution\n const filterPromise = this._executeFilter(); // Execute the filter and keep track of the filter promise object for use after it resolves\n\n // Keep track of all pending promises\n this._pendingFilterPromises.push(filterPromise);\n\n // If the dropdown is open, show the spinner and execute the filter. If not open, then we need to\n // show the dropdown (which will handle showing the spinner and executing the filter for us) so\n // we use the promise from that method instead.\n if (this._isDropdownOpen) {\n this._adapter.setBusyVisibility(true);\n } else {\n this._showDropdown({ filter: false });\n }\n\n try {\n await filterPromise;\n } catch {\n // When an exception occurs, we just flush the pending promises and clean up\n this._pendingFilterPromises = [];\n if (this._isDropdownOpen) {\n this._closeDropdown();\n }\n return;\n }\n\n // We only continue if the filter text before this result matches the latest filter text\n if (filterText === this._filterText) {\n this._pendingFilterPromises = [];\n this._onFilterComplete();\n } else {\n // If this is not the latest filter result, we ignore it and remove it from the pending promises\n const promiseIndex = this._pendingFilterPromises.indexOf(filterPromise);\n if (promiseIndex !== -1) {\n this._pendingFilterPromises.splice(promiseIndex, 1);\n }\n }\n }\n\n private _onKeydown(evt: KeyboardEvent): void {\n switch (evt.key) {\n case 'Tab':\n if (this._isDropdownOpen && !this._multiple) {\n this._selectActiveOption(false);\n }\n break;\n case 'Esc':\n case 'Escape':\n if (this._isDropdownOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n this._closeDropdown();\n }\n break;\n case 'Down':\n case 'ArrowDown':\n evt.preventDefault();\n if (!this._isDropdownOpen) {\n this._showDropdown({ activateFirst: true, activateSelected: true });\n } else {\n this._adapter.propagateKey(evt.key);\n }\n break;\n case 'Up':\n case 'ArrowUp':\n evt.preventDefault();\n if (this._isDropdownOpen) {\n this._adapter.propagateKey(evt.key);\n }\n break;\n case 'Enter':\n case 'Home':\n case 'End':\n if (this._isDropdownOpen) {\n if (evt.key === 'Enter') {\n evt.stopPropagation();\n }\n evt.preventDefault();\n this._adapter.propagateKey(evt.key);\n }\n break;\n case 'Backspace':\n case 'Delete':\n const input = evt.target as HTMLInputElement;\n const value = this._adapter.getInputValue();\n const isRemovingAllChars = input.value.substring(input.selectionStart as number, input.selectionEnd as number) === input.value;\n const isBackspacingLastChar = value.length === 1 && input.selectionEnd === 1;\n const isDeletingLastChar = value.length === 1 && input.selectionEnd === 0;\n const isEmpty = !value || isRemovingAllChars || isBackspacingLastChar || isDeletingLastChar;\n \n // We only clear the value on empty when not around a chip-field and NOT in multiple mode\n if (!this._adapter.isWrappingChipField() && isEmpty && !this._multiple && this._values.length) {\n this._clearValue();\n }\n break;\n }\n }\n\n private _executeFilter(sendFilterText = true, sendValue = false): Promise<IAutocompleteOption[] | IAutocompleteOptionGroup[]> {\n if (!this._filter || typeof this._filter !== 'function') {\n throw new Error('A filter callback must be provided. Did you set the \"filter\" property?');\n }\n const filter = this._filter;\n\n const filterText = sendFilterText ? this._filterText : '';\n const value = sendValue ? this._getValue() : null;\n\n return new Promise<IAutocompleteOption[] | IAutocompleteOptionGroup[]>((resolve, reject) => {\n return Promise.resolve(filter(filterText, value))\n .then(options => {\n this._options = options;\n resolve(this._options);\n })\n .catch(e => reject(`An unexpected error occurred while filtering: ${e}`));\n });\n }\n\n private _onFilterComplete(): void {\n if (!this._adapter.hasFocus()) {\n if (this._isDropdownOpen) {\n this._closeDropdown();\n }\n return;\n }\n\n if (this._options.length) {\n const sendFilterText = this._allowUnmatched && !this._selectedOptions.length;\n this._dropdownReady({ userTriggered: sendFilterText });\n if (this._filterText) {\n this._adapter.activateFirstOption();\n }\n } else {\n this._closeDropdown();\n }\n }\n\n private _clearValue(): void {\n this._selectedOptions = [];\n this._values = [];\n\n if (this._isDropdownOpen) {\n this._adapter.setSelectedOptions([]);\n this._adapter.clearActiveOption();\n }\n\n this._emitChangeEvent();\n }\n\n private async _showDropdown({ filter = true, userTriggered = true, activateFirst = false, activateSelected = false } = {}): Promise<void> {\n const sendFilterText = this._allowUnmatched && !this._selectedOptions.length;\n this._isDropdownOpen = true;\n let listOptionBuilder: ListDropdownOptionBuilder<HTMLElement> | undefined;\n if (this._optionBuilder) {\n const optionBuilder = this._optionBuilder;\n listOptionBuilder = (option: IListDropdownOption, parentElement: HTMLElement) => {\n return optionBuilder(option, this._filterText, parentElement as IListItemComponent);\n };\n }\n const config: IListDropdownConfig = {\n options: this._options,\n multiple: this._multiple,\n selectedValues: [...this._values],\n id: `forge-autocomplete-${this._identifier}`,\n asyncStyle: ListDropdownAsyncStyle.Skeleton,\n optionLimit: this._optionLimit,\n popupClasses: this._popupClasses,\n headerBuilder: this._popupHeaderBuilder,\n footerBuilder: this._popupFooterBuilder,\n transform: label => {\n if (this._filterText) {\n // Highlight the filter text within the label\n const highlightElement = highlightTextHTML(label, this._filterText);\n if (highlightElement) {\n return highlightElement;\n }\n }\n return label;\n },\n allowBusy: true,\n optionBuilder: listOptionBuilder,\n syncWidth: this._syncPopupWidth,\n observeScroll: this._observeScroll,\n observeScrollThreshold: this._observeScrollThreshold,\n scrollEndListener: this._dropdownScrollEndListener,\n activeChangeCallback: this._activeChangeListener,\n targetWidthCallback: this._targetWidthCallback,\n selectCallback: (value: any) => this._onSelect(value),\n closeCallback: () => this._closeDropdown()\n };\n\n this._adapter.show(config, this._popupTarget);\n this._adapter.toggleHostAttribute(AUTOCOMPLETE_CONSTANTS.attributes.OPEN, this._isDropdownOpen);\n\n if (filter) {\n if (this._options.length) {\n this._adapter.setBusyVisibility(true);\n }\n try {\n await this._executeFilter(sendFilterText);\n } catch (e) {\n console.error(e);\n }\n this._updateSelectedOptions(this._values);\n }\n\n // If we have any pending filter promises, then we will let those complete and update the dropdown separately after\n if (this._pendingFilterPromises.length) {\n return;\n }\n\n this._dropdownReady({ userTriggered, activateFirst, activateSelected });\n }\n\n private _dropdownReady({ userTriggered = true, activateFirst = false, activateSelected = false } = {}): void {\n if (!this._isDropdownOpen || !this._options.length || (userTriggered && !this._adapter.hasFocus())) {\n this._closeDropdown();\n return;\n }\n\n this._sortSelectedOptions();\n this._adapter.setBusyVisibility(false);\n this._adapter.setOptions(this._options);\n this._adapter.setSelectedOptions(this._selectedOptions);\n this._adapter.setDismissListener(this._dismissListener);\n\n if (activateSelected && this._selectedOptions.length) {\n this._adapter.activateSelectedOption();\n } else if (activateFirst) {\n this._adapter.activateFirstOption();\n }\n }\n\n private _closeDropdown(): void {\n if (this._multiple) {\n this._filterText = '';\n }\n this._isDropdownOpen = false;\n this._adapter.hide(this._dismissListener);\n this._sortSelectedOptions();\n this._adapter.toggleHostAttribute(AUTOCOMPLETE_CONSTANTS.attributes.OPEN, this._isDropdownOpen);\n }\n\n private _sortSelectedOptions(): void {\n // When in multiple selection mode, we need to make sure that the selected options appear at the top of the list\n if (this._multiple && this._selectedOptions.length && isOptionType(this._options, OptionType.Option)) {\n const selectedOptions: IAutocompleteOption[] = [];\n const unselectedOptions: IAutocompleteOption[] = [];\n\n (this._options as IAutocompleteOption[]).forEach(option => {\n if (this._selectedOptions.find(o => optionEqualPredicate(o, option.value, this._matchKey))) {\n selectedOptions.push(option);\n } else {\n unselectedOptions.push(option);\n }\n });\n\n this._options = [...selectedOptions, ...unselectedOptions];\n }\n }\n\n /**\n * Handles selecting an item in the dropdown.\n * @param {string} selectedValue The string value to select.\n */\n private async _onSelect(selectedValue: string, keepFocus = true): Promise<void> {\n if (this._valueChanging) {\n return;\n }\n\n // If we are in stateless mode, then we need to just emit an event when selecting an option. The\n // selected values are not tracked in stateless mode\n if (this._mode === AutocompleteMode.Stateless) {\n const data: IAutocompleteSelectEventData = { value: selectedValue };\n const result = this._adapter.emitHostEvent(AUTOCOMPLETE_CONSTANTS.events.SELECT, data, true, true);\n if (result) {\n this._filterText = '';\n if (!this._multiple) {\n this._closeDropdown();\n }\n }\n return;\n }\n\n const select = (): void => {\n const flatOptions = this._flatOptions;\n const option = flatOptions.find(o => optionEqualPredicate(o, selectedValue, this._matchKey)) as IAutocompleteOption;\n const value = option ? option.value : '';\n const label = option ? option.label : '';\n\n if (this._multiple) {\n const optionIndex = flatOptions.findIndex(o => optionEqualPredicate(o, selectedValue, this._matchKey));\n if (optionIndex >= 0) {\n const selected = this._selectedOptions.some(o => optionEqualPredicate(o, selectedValue, this._matchKey));\n this._adapter.toggleOptionMultiple(optionIndex, selected);\n }\n const selectedOption = getSelectedOption(this._selectedOptions, value);\n if (selectedOption) {\n const index = this._selectedOptions.indexOf(selectedOption);\n this._selectedOptions.splice(index, 1);\n } else {\n this._selectedOptions.push(option);\n }\n } else {\n if (isDefined(value)) {\n this._selectedOptions[0] = option;\n this._filterText = label;\n } else {\n this._selectedOptions = [];\n this._filterText = '';\n }\n }\n\n // Update the dropdown selection status if its open\n if (this._isDropdownOpen) {\n this._adapter.setSelectedOptions(this._selectedOptions);\n }\n\n // Keep the values in sync with the currently selected options\n this._values = this._selectedOptions.map(o => o.value);\n\n // Update the selected text in the input\n this._adapter.setSelectedText(this._getSelectedText());\n\n // Select the text in the input to allow for the next filter\n if (!Platform.isMobile && keepFocus) {\n this._adapter.selectInputValue();\n }\n\n if (this._multiple) {\n // If we're in multiselect mode, we need to toggle the selected option\n const index = flatOptions.findIndex(o => optionEqualPredicate(o, selectedValue, this._matchKey));\n const isSelected = this._values.includes(selectedValue);\n this._adapter.toggleOptionMultiple(index, isSelected);\n }\n\n this._emitChangeEvent();\n this._tryUpdateDropdownPosition();\n };\n\n // We close the dropdown immediately if in single selection mode\n if (this._isDropdownOpen && !this._multiple) {\n this._closeDropdown();\n }\n\n if (typeof this._beforeValueChange === 'function') {\n this._valueChanging = Promise.resolve(this._beforeValueChange.call(null, selectedValue, this._matchKey));\n const shouldContinue = await this._valueChanging;\n if (shouldContinue) {\n select();\n } else {\n this._tryUpdateDropdownPosition();\n }\n this._valueChanging = undefined;\n } else {\n select();\n }\n }\n\n private _selectActiveOption(keepFocus = true): void {\n const activeOptionIndex = this._adapter.getActiveOptionIndex();\n if (typeof activeOptionIndex === 'number' && activeOptionIndex >= 0) {\n const option = this._flatOptions[activeOptionIndex];\n if (option) {\n this._onSelect(option.value, keepFocus);\n }\n }\n }\n\n private _emitChangeEvent(): void {\n this._adapter.emitHostEvent(AUTOCOMPLETE_CONSTANTS.events.CHANGE, this._getValue(), true);\n }\n\n private _tryUpdateDropdownPosition(): void {\n if (this._isDropdownOpen) {\n this._adapter.queueDropdownPositionUpdate();\n }\n }\n\n /**\n * Retrieves the current value(s) from the selected options array based on whether\n * we are in multi-select mode or not.\n */\n private _getValue(): string | string[] | null | undefined {\n if (!this._values) {\n return null;\n }\n\n if (!this._values.length) {\n return this._multiple ? [] : null;\n }\n\n return this._multiple ? [...this._values] : this._values[0];\n }\n\n /**\n * Creates the selected text value from the selected label values.\n */\n private _getSelectedText(): string {\n if (this._adapter.isWrappingChipField()) {\n return '';\n }\n\n if (this._selectedTextBuilder) {\n return this._selectedTextBuilder(this._selectedOptions);\n } else {\n if (this._multiple) {\n if (this._values.length) {\n return `${this._values.length} ${this._values.length === 1 ? 'option' : 'options'} selected`;\n } else {\n return '';\n }\n } else {\n return this._selectedOptions.filter(o => o && o.label).map(o => o.label).join(' ').trim();\n }\n }\n }\n\n /**\n * Handles the user dismissing the dropdown. This is only called if the blur event was triggered\n * from within the popup element itself (in a custom template most likely).\n * @param keepFocus Keep focus on the dropdown or not.\n */\n private _onDismiss(): void {\n this._closeDropdown();\n }\n\n private async _applyValue(value: string | string[] | IAutocompleteOption | IAutocompleteOption[] | null | undefined): Promise<void> {\n let values: any[] = [];\n this._selectedOptions = [];\n\n if (!Array.isArray(value)) {\n values = isDefined(value) ? [value] : [];\n } else {\n values = value;\n }\n\n // If this is not a multi-select, then make sure we only allow one selected value\n if (!this._multiple && values.length > 1) {\n values = [values[0]];\n }\n\n if (isOptionType(values, OptionType.Option)) {\n this._values = values.map((o: IAutocompleteOption) => o.value);\n this._selectedOptions = values as IAutocompleteOption[];\n } else {\n this._values = values as any[];\n }\n\n // Ensure that the values passed are actually existing options\n const allOptions = this._flatOptions;\n if (values.length && allOptions.length) {\n this._updateSelectedOptions(values);\n }\n\n // Execute the filter now if we have a value, but not options yet (only if it has been initialized already)\n if (this._values.length && !this._selectedOptions.length && !!this._filter && this._isInitialized) {\n try {\n await this._executeFilter(false, true);\n } catch (e) {\n console.error(e);\n }\n this._updateSelectedOptions(this._values);\n }\n\n // Update filter text to match the label when on in multiselect mode\n if (!this._multiple) {\n this._filterText = this._selectedOptions.length ? this._selectedOptions[0].label : '';\n } else {\n this._filterText = '';\n }\n\n // Update the state of the component based on the existence of a selected value\n if (this._isInitialized) {\n this._adapter.setSelectedText(this._getSelectedText());\n }\n\n // When the value is changed programmatically we should update the selected options\n if (this._isDropdownOpen) {\n this._adapter.setSelectedOptions(this._selectedOptions);\n }\n }\n\n private _updateSelectedOptions(values: Array<any | IAutocompleteOption>): void {\n const flatOptions = [...this._flatOptions, ...this._selectedOptions];\n\n if (this._selectedOptions.length) {\n this._selectedOptions = [];\n }\n\n if (isOptionType(values, OptionType.Option)) {\n for (const option of values as IAutocompleteOption[]) {\n const actualOption = flatOptions.find(o => optionEqualPredicate(o, option.value, this._matchKey));\n if (actualOption) {\n this._selectedOptions.push(actualOption);\n } else {\n this._selectedOptions.push(option);\n }\n }\n } else {\n for (const value of values as any[]) {\n const actualOption = flatOptions.find(o => optionEqualPredicate(o, value, this._matchKey));\n if (actualOption) {\n this._selectedOptions.push(actualOption);\n } else if (this._allowUnmatched) {\n this._selectedOptions.push({ label: value, value });\n }\n }\n }\n }\n\n /** Gets/sets the mode state. */\n public get mode(): AutocompleteMode {\n return this._mode;\n }\n public set mode(value: AutocompleteMode) {\n if (this._mode !== value) {\n this._mode = value;\n if (this._mode === AutocompleteMode.Stateless) {\n this._selectedOptions = [];\n if (this._isDropdownOpen) {\n this._closeDropdown();\n }\n }\n this._adapter.setHostAttribute(AUTOCOMPLETE_CONSTANTS.attributes.MODE, this._mode);\n }\n }\n\n /** Gets/sets the multi-select state. */\n public get multiple(): boolean {\n return this._multiple;\n }\n public set multiple(value: boolean) {\n if (this._multiple !== value) {\n this._multiple = value;\n this._adapter.setHostAttribute(AUTOCOMPLETE_CONSTANTS.attributes.MULTIPLE, isDefined(this._multiple) ? this._multiple.toString() : '');\n }\n }\n\n /** Gets/sets the value of the component. */\n public get value(): string | string[] | IAutocompleteOption | IAutocompleteOption[] | null | undefined {\n return this._getValue();\n }\n public set value(value: string | string[] | IAutocompleteOption | IAutocompleteOption[] | null | undefined) {\n let values: Array<string | IAutocompleteOption | IAutocompleteOption[] | string[]> = [];\n\n if (value == null) {\n values = [];\n } else if (Array.isArray(value)) {\n values = JSON.parse(JSON.stringify(value));\n } else if (isString(value)) {\n values = [value];\n } else {\n values = [JSON.parse(JSON.stringify(value))];\n }\n\n const hasNewValue = values.length !== this._values.length || values.some(v => !this._values.includes(v));\n if (!hasNewValue) {\n return;\n }\n\n // We only apply the new values if they have actually changed\n this._applyValue(value);\n }\n\n\n /** Gets/sets filter on focus settings which controls whether the dropdown displays automatically when focused. */\n public get filterOnFocus(): boolean {\n return this._filterOnFocus;\n }\n public set filterOnFocus(value: boolean) {\n if (this._filterOnFocus !== value) {\n this._filterOnFocus = value;\n this._adapter.setHostAttribute(AUTOCOMPLETE_CONSTANTS.attributes.FILTER_ON_FOCUS, isDefined(this._filterOnFocus) ? this._filterOnFocus.toString() : '');\n }\n }\n\n /** Controls whether unmatched text entered by the user will stay visible an option in the dropdown is not found. */\n public get allowUnmatched(): boolean {\n return this._allowUnmatched;\n }\n public set allowUnmatched(value: boolean) {\n if (this._allowUnmatched !== value) {\n this._allowUnmatched = value;\n\n if (isDefined(this._allowUnmatched)) {\n this._adapter.setHostAttribute(AUTOCOMPLETE_CONSTANTS.attributes.ALLOW_UNMATCHED, this._allowUnmatched.toString());\n }\n }\n }\n\n /** Gets/sets the property key to match the value to an option. */\n public get matchKey(): string | null | undefined {\n return this._matchKey;\n }\n public set matchKey(value: string | null | undefined) {\n if (this._matchKey !== value) {\n this._matchKey = value;\n }\n }\n\n /** Gets/sets the selector that will be used to find an element to attach the popup to. Defaults to the input element. */\n public get popupTarget(): string {\n return this._popupTarget;\n }\n public set popupTarget(value: string) {\n if (this._popupTarget !== value) {\n this._popupTarget = value;\n }\n }\n\n /** Gets/sets the list of classes to apply to the popup element. */\n public get popupClasses(): string | string[] {\n return Array.isArray(this._popupClasses) ? [...this._popupClasses] : [this._popupClasses];\n }\n public set popupClasses(value: string | string[]) {\n if (this._popupClasses !== value) {\n this._popupClasses = Array.isArray(value) ? [...value] : [value];\n }\n }\n\n /** Gets/sets the builder callback to use for the popup header. */\n public set popupHeaderBuilder(value: ListDropdownHeaderBuilder) {\n this._popupHeaderBuilder = value;\n }\n\n /** Gets/sets the builder callback to use for the popup footer. */\n public set popupFooterBuilder(value: ListDropdownFooterBuilder) {\n this._popupFooterBuilder = value;\n }\n\n /** Gets/sets whether the popup width is synchronized with the popup target. */\n public get syncPopupWidth(): boolean {\n return this._syncPopupWidth;\n }\n public set syncPopupWidth(value: boolean) {\n if (this._syncPopupWidth !== value) {\n this._syncPopupWidth = value;\n }\n }\n\n /** Gets/sets the maximum number of options to display in the dropdown. */\n public get optionLimit(): number {\n return this._optionLimit;\n }\n public set optionLimit(value: number) {\n if (this._optionLimit !== value) {\n this._optionLimit = value;\n }\n }\n\n /** Gets/sets the debounce delay (milliseconds) for keyboard events. */\n public get debounce(): number {\n return this._debounce;\n }\n public set debounce(value: number) {\n if (this._debounce !== value) {\n this._debounce = value;\n\n if (this._isInitialized) {\n this._setFilterCallback();\n }\n\n this._adapter.setHostAttribute(AUTOCOMPLETE_CONSTANTS.attributes.DEBOUNCE, isDefined(this._debounce) ? this._debounce.toString() : '');\n }\n }\n\n /** Sets the item builder callback that will be executed when building the option list in the dropdown. */\n public get optionBuilder(): AutocompleteOptionBuilder | null | undefined {\n return this._optionBuilder;\n }\n public set optionBuilder(fn: AutocompleteOptionBuilder | null | undefined) {\n this._optionBuilder = fn;\n }\n\n /** Sets the filter callback that will be executed when fetching options for the autocomplete dropdown. */\n public get filter(): AutocompleteFilterCallback | null | undefined {\n return this._filter;\n }\n public set filter(cb: AutocompleteFilterCallback | null | undefined) {\n if (this._filter !== cb) {\n this._filter = cb;\n\n // If we have a value, but don't have any options yet then execute the filter\n if (this._isInitialized && this._values.length && !this._flatOptions.length && !!this._filter) {\n this._executeFilter().then(() => {\n this._updateSelectedOptions(this._values);\n this._adapter.setSelectedText(this._getSelectedText());\n });\n }\n }\n }\n\n /** Sets the selected text builder callback that will be executed when getting the selected text. */\n public get selectedTextBuilder(): AutocompleteSelectedTextBuilder {\n return this._selectedTextBuilder;\n }\n public set selectedTextBuilder(fn: AutocompleteSelectedTextBuilder) {\n this._selectedTextBuilder = fn;\n\n // If there are selected options, set the selected text again\n if (this._selectedOptions.length) {\n this._adapter.setSelectedText(this._getSelectedText());\n }\n }\n\n public get observeScroll(): boolean {\n return this._observeScroll;\n }\n public set observeScroll(value: boolean) {\n this._observeScroll = value;\n }\n\n public get observeScrollThreshold(): number {\n return this._observeScrollThreshold;\n }\n public set observeScrollThreshold(value: number) {\n this._observeScrollThreshold = value;\n }\n\n public appendOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void {\n if (!this._isDropdownOpen) {\n return;\n }\n this._options = [...this._options, ...options] as IAutocompleteOption[] | IAutocompleteOptionGroup[];\n this._adapter.appendOptions(options);\n }\n\n public get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n public get open(): boolean {\n return this._isDropdownOpen;\n }\n public set open(value: boolean) {\n if (this._isDropdownOpen !== value) {\n if (value) {\n this._showDropdown({ userTriggered: false });\n } else {\n this._closeDropdown();\n }\n }\n }\n\n public get beforeValueChange(): (value: any) => boolean | Promise<boolean> {\n return this._beforeValueChange;\n }\n public set beforeValueChange(value: (value: any) => boolean | Promise<boolean>) {\n if (value !== this._beforeValueChange) {\n this._beforeValueChange = value;\n }\n }\n\n public get popupElement(): HTMLElement | null {\n return this._adapter.getPopupElement();\n }\n}\n", "import { attachShadowTemplate, coerceBoolean, coerceNumber, CustomElement, ensureChild, FoundationProperty } from '@tylertech/forge-core';\nimport { tylIconArrowDropDown, tylIconCheckBox, tylIconCheckBoxOutlineBlank } from '@tylertech/tyler-icons/standard';\nimport { DividerComponent } from '../divider';\nimport { IconComponent, IconRegistry } from '../icon';\nimport { LinearProgressComponent } from '../linear-progress';\nimport { ListComponent, ListItemComponent } from '../list';\nimport { IListDropdownAware, ListDropdownAware } from '../list-dropdown/list-dropdown-aware';\nimport { PopupComponent } from '../popup';\nimport { SkeletonComponent } from '../skeleton';\nimport { TextFieldComponent } from '../text-field';\nimport { AutocompleteAdapter } from './autocomplete-adapter';\nimport { AutocompleteFilterCallback, AutocompleteMode, AutocompleteOptionBuilder, AutocompleteSelectedTextBuilder, AUTOCOMPLETE_CONSTANTS, IAutocompleteOption, IAutocompleteOptionGroup, IAutocompleteSelectEventData } from './autocomplete-constants';\nimport { AutocompleteFoundation } from './autocomplete-foundation';\n\nconst template = '<template><slot></slot></template>';\nconst styles = ':host{display:block}:host([hidden]){display:none}';\n\nexport interface IAutocompleteComponent extends IListDropdownAware {\n mode: `${AutocompleteMode}`;\n multiple: boolean;\n value: any;\n debounce: number;\n filterOnFocus: boolean;\n allowUnmatched: boolean;\n matchKey: string | null | undefined;\n popupTarget: string;\n filter: AutocompleteFilterCallback | null | undefined;\n optionBuilder: AutocompleteOptionBuilder | null | undefined;\n selectedTextBuilder: AutocompleteSelectedTextBuilder;\n popupElement: HTMLElement | null;\n beforeValueChange: (value: any) => boolean | Promise<boolean>;\n isInitialized: boolean;\n open: boolean;\n appendOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void;\n openDropdown(): void;\n closeDropdown(): void;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'forge-autocomplete': IAutocompleteComponent;\n }\n\n interface HTMLElementEventMap {\n 'forge-autocomplete-change': CustomEvent<any>;\n 'forge-autocomplete-select': CustomEvent<IAutocompleteSelectEventData>;\n 'forge-autocomplete-scrolled-bottom': CustomEvent<void>;\n }\n}\n\n/**\n * The custom element class behind the `<forge-autocomplete>` element.\n * \n * @tag forge-autocomplete\n */\n@CustomElement({\n name: AUTOCOMPLETE_CONSTANTS.elementName,\n dependencies: [\n TextFieldComponent,\n PopupComponent,\n ListComponent,\n ListItemComponent,\n DividerComponent,\n SkeletonComponent,\n LinearProgressComponent,\n IconComponent\n ]\n})\nexport class AutocompleteComponent extends ListDropdownAware implements IAutocompleteComponent {\n public static get observedAttributes(): string[] {\n return [\n AUTOCOMPLETE_CONSTANTS.attributes.MODE,\n AUTOCOMPLETE_CONSTANTS.attributes.MULTIPLE,\n AUTOCOMPLETE_CONSTANTS.attributes.DEBOUNCE,\n AUTOCOMPLETE_CONSTANTS.attributes.FILTER_ON_FOCUS,\n AUTOCOMPLETE_CONSTANTS.attributes.ALLOW_UNMATCHED,\n AUTOCOMPLETE_CONSTANTS.attributes.POPUP_TARGET,\n AUTOCOMPLETE_CONSTANTS.attributes.POPUP_CLASSES,\n AUTOCOMPLETE_CONSTANTS.attributes.OBSERVE_SCROLL,\n AUTOCOMPLETE_CONSTANTS.attributes.OBSERVE_SCROLL_THRESHOLD,\n AUTOCOMPLETE_CONSTANTS.attributes.OPTION_LIMIT,\n AUTOCOMPLETE_CONSTANTS.attributes.SYNC_POPUP_WIDTH,\n AUTOCOMPLETE_CONSTANTS.attributes.OPEN,\n AUTOCOMPLETE_CONSTANTS.attributes.MATCH_KEY\n ];\n }\n\n private _foundation: AutocompleteFoundation;\n\n constructor() {\n super();\n IconRegistry.define([tylIconArrowDropDown, tylIconCheckBox, tylIconCheckBoxOutlineBlank]);\n attachShadowTemplate(this, template, styles);\n this._foundation = new AutocompleteFoundation(new AutocompleteAdapter(this));\n }\n\n public connectedCallback(): void {\n if (this.querySelector(AUTOCOMPLETE_CONSTANTS.selectors.INPUT)) {\n this._foundation.initialize();\n } else {\n ensureChild(this, AUTOCOMPLETE_CONSTANTS.selectors.INPUT).then(() => this._foundation.initialize());\n }\n }\n\n public disconnectedCallback(): void {\n this._foundation.disconnect();\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n switch (name) {\n case AUTOCOMPLETE_CONSTANTS.attributes.MODE:\n this.mode = newValue as AutocompleteMode;\n break;\n case AUTOCOMPLETE_CONSTANTS.attributes.MULTIPLE:\n this.multiple = coerceBoolean(newValue);\n break;\n case AUTOCOMPLETE_CONSTANTS.attributes.DEBOUNCE:\n this.debounce = coerceNumber(newValue);\n break;\n case AUTOCOMPLETE_CONSTANTS.attributes.FILTER_ON_FOCUS:\n this.filterOnFocus = coerceBoolean(newValue);\n break;\n case AUTOCOMPLETE_CONSTANTS.attributes.ALLOW_UNMATCHED:\n this.allowUnmatched = coerceBoolean(newValue);\n break;\n case AUTOCOMPLETE_CONSTANTS.attributes.POPUP_TARGET:\n this.popupTarget = newValue;\n break;\n case AUTOCOMPLETE_CONSTANTS.attributes.OPEN:\n this.open = coerceBoolean(newValue);\n break;\n case AUTOCOMPLETE_CONSTANTS.attributes.MATCH_KEY:\n this.matchKey = newValue;\n break;\n }\n }\n\n /** Gets/sets the interaction mode. */\n @FoundationProperty()\n public declare mode: `${AutocompleteMode}`;\n\n /** Gets/sets the multi-select state. */\n @FoundationProperty()\n public declare multiple: boolean;\n\n /** Gets/sets the value. */\n @FoundationProperty()\n public declare value: any;\n\n /** Gets/sets the debounce delay (milliseconds) for keyboard events. */\n @FoundationProperty()\n public declare debounce: number;\n\n /** Gets/sets filter on focus settings which controls whether the dropdown displays automatically when focused. */\n @FoundationProperty()\n public declare filterOnFocus: boolean;\n\n /** Controls whether unmatched text entered by the user will stay visible an option in the dropdown is not found. */\n @FoundationProperty()\n public declare allowUnmatched: boolean;\n\n /** Gets/sets the selector that will be used to find an element to attach the popup to. Defaults to the input element. */\n @FoundationProperty()\n public declare popupTarget: string;\n\n /** Sets the option builder callback that will be executed when building the option list in the dropdown. */\n @FoundationProperty()\n public declare optionBuilder: AutocompleteOptionBuilder | null | undefined;\n\n /** Sets the filter callback that will be executed when fetching options for the autocomplete dropdown. */\n @FoundationProperty()\n public declare filter: AutocompleteFilterCallback | null | undefined;\n\n /** Sets the selected text builder callback that will be executed when getting the selected text. */\n @FoundationProperty()\n public declare selectedTextBuilder: AutocompleteSelectedTextBuilder;\n\n /** Controls the open state of the dropdown. */\n @FoundationProperty()\n public declare open: boolean;\n\n /** Gets/sets the property key to match the value to an option. */\n @FoundationProperty()\n public declare matchKey: string | null | undefined;\n\n /** Returns whether the component has been initialized or not yet. */\n @FoundationProperty({ set: false })\n public declare isInitialized: boolean;\n\n /** Gets the currently active popup element when the dropdown is open. */\n @FoundationProperty({ set: false })\n public declare popupElement: HTMLElement | null;\n\n /** Sets the callback to be executed when the user selects an option, before the UI is updated to allow for validation. */\n @FoundationProperty()\n public declare beforeValueChange: (value: any) => boolean | Promise<boolean>;\n\n /** Adds options to the dropdown while it is open. Has no effect if the dropdown is closed. */\n public appendOptions(options: IAutocompleteOption[] | IAutocompleteOptionGroup[]): void {\n this._foundation.appendOptions(options);\n }\n\n /** Opens the dropdown. */\n public openDropdown(): void {\n this.open = true;\n }\n\n /** Closes the dropdown. */\n public closeDropdown(): void {\n this.open = false;\n }\n}\n", "import { FormFieldComponentDelegate, IFormFieldComponentDelegateOptions } from '../core/delegates/form-field-component-delegate';\nimport { ITextFieldComponent, TextFieldComponentDelegate, ITextFieldComponentDelegateOptions } from '../text-field';\nimport { IAutocompleteComponent } from './autocomplete';\nimport { AUTOCOMPLETE_CONSTANTS } from './autocomplete-constants';\nimport { IconComponentDelegate, IIconComponentDelegateConfig } from '../icon';\nimport { IBaseComponentDelegateConfig } from '../core/delegates/base-component-delegate';\nimport { ITextFieldComponentDelegateConfig } from '../text-field/text-field-component-delegate';\n\nexport type AutocompleteComponentDelegateProps = Partial<IAutocompleteComponent>;\nexport interface IAutocompleteComponentDelegateOptions extends IFormFieldComponentDelegateOptions {\n useDropdownIcon?: boolean;\n textFieldDelegateConfig?: ITextFieldComponentDelegateConfig;\n}\n\nexport interface IAutocompleteComponentDelegateConfig extends IBaseComponentDelegateConfig<IAutocompleteComponent, IAutocompleteComponentDelegateOptions> {}\n\nexport class AutocompleteComponentDelegate extends FormFieldComponentDelegate<IAutocompleteComponent, IAutocompleteComponentDelegateOptions> {\n private _textFieldDelegate: TextFieldComponentDelegate;\n\n constructor(config?: IAutocompleteComponentDelegateConfig) {\n super(config);\n }\n\n protected _build(): IAutocompleteComponent {\n const autocomplete = document.createElement(AUTOCOMPLETE_CONSTANTS.elementName) as IAutocompleteComponent;\n this._attachTextField(autocomplete);\n return autocomplete;\n }\n\n public get textFieldDelegate(): TextFieldComponentDelegate {\n return this._textFieldDelegate;\n }\n\n public get value(): any {\n return this._element.value;\n }\n public set value(value: any) {\n this._element.value = value;\n }\n\n public get disabled(): boolean {\n return this._textFieldDelegate.inputElement.disabled;\n }\n public set disabled(value: boolean) {\n this._textFieldDelegate.inputElement.disabled = value;\n }\n\n public get invalid(): boolean {\n return this._textFieldDelegate.invalid || false;\n }\n public set invalid(value: boolean) {\n this._textFieldDelegate.invalid = value;\n }\n\n public onChange(listener: (value: string) => void): void {\n this._element.addEventListener(AUTOCOMPLETE_CONSTANTS.events.CHANGE, (evt: CustomEvent) => listener(evt.detail));\n }\n\n public onFocus(listener: (evt: FocusEvent) => void): void {\n this._textFieldDelegate.inputElement.addEventListener('focus', (evt: FocusEvent) => listener(evt));\n }\n\n public onBlur(listener: (evt: FocusEvent) => void): void {\n this._textFieldDelegate.inputElement.addEventListener('blur', (evt: FocusEvent) => listener(evt));\n }\n\n private _attachTextField(autocomplete: IAutocompleteComponent): void {\n const textFieldConfig: ITextFieldComponentDelegateConfig = {\n props: { ...this._config.options?.textFieldDelegateConfig?.props },\n options: { ...this._config.options?.textFieldDelegateConfig?.options }\n };\n\n if (!textFieldConfig.options) {\n textFieldConfig.options = {};\n }\n\n if (this._config.options?.useDropdownIcon !== false && !textFieldConfig.options?.trailingElement) {\n textFieldConfig.options.trailingElement = this._createDropdownIconElement();\n }\n\n this._textFieldDelegate = new TextFieldComponentDelegate(textFieldConfig);\n autocomplete.appendChild(this._textFieldDelegate.element);\n }\n\n private _createDropdownIconElement(): HTMLElement {\n const config: IIconComponentDelegateConfig = {\n props: {\n slot: 'trailing',\n name: 'arrow_drop_down'\n },\n options: {\n attributes: { 'forge-dropdown-icon': '' }\n }\n };\n return new IconComponentDelegate(config).element;\n }\n}\n", "import { defineCustomElement } from '@tylertech/forge-core';\n\nimport { AutocompleteComponent } from './autocomplete';\n\nexport * from './autocomplete-adapter';\nexport * from './autocomplete-component-delegate';\nexport * from './autocomplete-constants';\nexport * from './autocomplete-foundation';\nexport * from './autocomplete-utils';\nexport * from './autocomplete';\n\nexport function defineAutocompleteComponent(): void {\n defineCustomElement(AutocompleteComponent);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Tyler Technologies, Inc.
4
+ * License: Apache-2.0
5
+ */
6
+ import{b as h}from"./chunk.N6QJ2RRG.js";import{b as E}from"./chunk.NXS7A7PO.js";import{a as _}from"./chunk.MIYZJUXH.js";import{a as d,b}from"./chunk.OOW3UKT4.js";import{a as c,l as m}from"./chunk.MMVZJLXE.js";import{l as u,u as p}from"./chunk.R4NDFXVA.js";import{f as l}from"./chunk.MCIQXNKY.js";var B=`${b}button`,a=["button","a"],r={BUTTON:"forge-button",LABEL:"forge-button__label",ICON:"forge-button__icon",BUTTON_RAISED:"forge-button--raised",BUTTON_UNELEVATED:"forge-button--unelevated",BUTTON_OUTLINED:"forge-button--outlined",BUTTON_DENSE:"forge-button--dense",RIPPLE:"forge-button__ripple"},O={BUTTON:a.join(","),LABEL:`span:not(.${r.RIPPLE})`,ICON:"i,forge-icon,[data-forge-button-icon]",RIPPLE:`.${r.RIPPLE}`},g={TYPE:"type",DISABLED:"disabled"},e={elementName:B,classes:r,selectors:O,attributes:g};var s=class extends m{constructor(){super()}static get observedAttributes(){return[e.attributes.TYPE]}connectedCallback(){this.children.length?this._initialize():u(this).then(()=>this._initialize())}attributeChangedCallback(t,n,i){switch(t){case e.attributes.TYPE:this.type=i;break}}disconnectedCallback(){this._rippleInstance&&this._rippleInstance.destroy(),this._mutationObserver&&this._mutationObserver.disconnect(),this._buttonAttrMutationObserver&&this._buttonAttrMutationObserver.disconnect()}get type(){return this._type}set type(t){this._type!==t&&(this._type=t,this._applyType(t),this.setAttribute(e.attributes.TYPE,this._type))}_applyType(t){this._buttonElement&&(this._buttonElement.classList.remove(e.classes.BUTTON_RAISED),this._buttonElement.classList.remove(e.classes.BUTTON_UNELEVATED),this._buttonElement.classList.remove(e.classes.BUTTON_OUTLINED),this._buttonElement.classList.remove(e.classes.BUTTON_DENSE),t.includes("raised")&&this._buttonElement.classList.add(e.classes.BUTTON_RAISED),t.includes("unelevated")&&this._buttonElement.classList.add(e.classes.BUTTON_UNELEVATED),t.includes("outlined")&&this._buttonElement.classList.add(e.classes.BUTTON_OUTLINED),t.includes("dense")&&this._buttonElement.classList.add(e.classes.BUTTON_DENSE))}_initialize(){this._initializeButton(),this._initializeMutationObserver()}_initializeButton(){this._buttonElement=this.querySelector(e.selectors.BUTTON),this._buttonElement&&(this.hasAttribute(e.attributes.TYPE)&&(this._type=this.getAttribute(e.attributes.TYPE),this._applyType(this._type)),this._buttonElement.classList.add(e.classes.BUTTON),this._syncDisabledState(),this._initializeButtonChildren(),this._deferRippleInitialization())}async _deferRippleInitialization(){let t=await E(this._buttonElement);this._rippleInstance||(this._rippleInstance=this._createRipple(),t==="focusin"&&this._rippleInstance.handleFocus())}_createRipple(){return this._rippleInstance&&this._rippleInstance.destroy(),new h(this._buttonElement)}_initializeButtonChildren(){if(!this._buttonElement.querySelector(e.selectors.RIPPLE)){let i=document.createElement("span");i.classList.add(e.classes.RIPPLE),this._buttonElement.appendChild(i)}let t=this.querySelector(e.selectors.LABEL);t&&t.classList.add(e.classes.LABEL),Array.from(this.querySelectorAll(e.selectors.ICON)).forEach(i=>{i.classList.add(e.classes.ICON),i.hasAttribute("aria-hidden")||i.setAttribute("aria-hidden","true")})}_initializeMutationObserver(){if(!this._mutationObserver){let t={childList:!0,subtree:!0},n=i=>{this._buttonWasAdded(i)?this._initializeButton():i.some(o=>o.addedNodes.length)&&this._initializeButtonChildren()};this._mutationObserver=new MutationObserver(n),this._mutationObserver.observe(this,t),this._buttonElement&&(this._buttonAttrMutationObserver=new MutationObserver(i=>{i.some(o=>o.attributeName==="disabled")&&this._syncDisabledState()}),this._buttonAttrMutationObserver.observe(this._buttonElement,{attributes:!0,attributeFilter:["disabled"]}))}}_buttonWasAdded(t){return t.some(n=>Array.from(n.addedNodes).some(i=>a.includes(i.nodeName.toLowerCase())))}_syncDisabledState(){p(this,this._buttonElement.disabled,e.attributes.DISABLED)}};s=l([d({name:e.elementName})],s);var f=class extends _{constructor(t){super(t)}destroy(){this._buttonElement=void 0}get buttonElement(){return this._buttonElement}_build(){var n,i;let t=document.createElement(e.elementName);return this._buttonElement=document.createElement("button"),this._buttonElement.type=((n=this._config.options)==null?void 0:n.type)||"button",this._buttonElement.textContent=((i=this._config.options)==null?void 0:i.text)||"",t.appendChild(this._buttonElement),t}onClick(t){var n;(n=this._buttonElement)==null||n.addEventListener("click",t)}onFocus(t){var n;(n=this._buttonElement)==null||n.addEventListener("focus",i=>t(i))}onBlur(t){var n;(n=this._buttonElement)==null||n.addEventListener("blur",i=>t(i))}};function F(){c(s)}export{a,e as b,s as c,f as d,F as e};
7
+ //# sourceMappingURL=chunk.C557PTJ5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/button/button-constants.ts", "../../src/button/button.ts", "../../src/button/button-component-delegate.ts", "../../src/button/index.ts"],
4
+ "sourcesContent": ["import { COMPONENT_NAME_PREFIX } from '../constants';\n\nconst elementName: keyof HTMLElementTagNameMap = `${COMPONENT_NAME_PREFIX}button`;\n\nexport const ALLOWED_CHILDREN = ['button', 'a'];\n\nconst classes = {\n BUTTON: 'forge-button',\n LABEL: 'forge-button__label',\n ICON: 'forge-button__icon',\n BUTTON_RAISED: 'forge-button--raised',\n BUTTON_UNELEVATED: 'forge-button--unelevated',\n BUTTON_OUTLINED: 'forge-button--outlined',\n BUTTON_DENSE: 'forge-button--dense',\n RIPPLE: 'forge-button__ripple'\n};\n\nconst selectors = {\n BUTTON: ALLOWED_CHILDREN.join(','),\n LABEL: `span:not(.${classes.RIPPLE})`,\n ICON: 'i,forge-icon,[data-forge-button-icon]',\n RIPPLE: `.${classes.RIPPLE}`\n};\n\nconst attributes = {\n TYPE: 'type',\n DISABLED: 'disabled'\n};\n\nexport const BUTTON_CONSTANTS = {\n elementName,\n classes,\n selectors,\n attributes\n};\n", "import { CustomElement, ensureChildren, toggleAttribute } from '@tylertech/forge-core';\nimport { BaseComponent, IBaseComponent } from '../core/base/base-component';\nimport { ALLOWED_CHILDREN, BUTTON_CONSTANTS } from './button-constants';\nimport { userInteractionListener } from '../core/utils/utils';\nimport { ForgeRipple } from '../ripple';\n\nexport interface IButtonComponent extends IBaseComponent {\n type: string;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'forge-button': IButtonComponent;\n }\n}\n\n/**\n * The custom element class behind the `<forge-button>` element.\n * \n * @tag forge-button\n */\n@CustomElement({\n name: BUTTON_CONSTANTS.elementName\n})\nexport class ButtonComponent extends BaseComponent implements IButtonComponent {\n public static get observedAttributes(): string[] {\n return [BUTTON_CONSTANTS.attributes.TYPE];\n }\n\n private _rippleInstance: ForgeRipple;\n private _buttonElement: HTMLButtonElement;\n private _type: string;\n private _mutationObserver: MutationObserver;\n private _buttonAttrMutationObserver: MutationObserver;\n\n constructor() {\n super();\n }\n\n public connectedCallback(): void {\n if (this.children.length) {\n this._initialize();\n } else {\n ensureChildren(this).then(() => this._initialize());\n }\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n switch (name) {\n case BUTTON_CONSTANTS.attributes.TYPE:\n this.type = newValue;\n break;\n }\n }\n\n public disconnectedCallback(): void {\n if (this._rippleInstance) {\n this._rippleInstance.destroy();\n }\n if (this._mutationObserver) {\n this._mutationObserver.disconnect();\n }\n if (this._buttonAttrMutationObserver) {\n this._buttonAttrMutationObserver.disconnect();\n }\n }\n\n /**\n * Sets the type of button decoration.\n * Possible values are: raised, elevated, outlined, and dense.\n * Can be combined as: outlined-dense.\n */\n public get type(): string {\n return this._type;\n }\n public set type(value: string) {\n if (this._type !== value) {\n this._type = value;\n this._applyType(value);\n this.setAttribute(BUTTON_CONSTANTS.attributes.TYPE, this._type);\n }\n }\n\n private _applyType(type: string): void {\n if (this._buttonElement) {\n this._buttonElement.classList.remove(BUTTON_CONSTANTS.classes.BUTTON_RAISED);\n this._buttonElement.classList.remove(BUTTON_CONSTANTS.classes.BUTTON_UNELEVATED);\n this._buttonElement.classList.remove(BUTTON_CONSTANTS.classes.BUTTON_OUTLINED);\n this._buttonElement.classList.remove(BUTTON_CONSTANTS.classes.BUTTON_DENSE);\n\n if (type.includes('raised')) {\n this._buttonElement.classList.add(BUTTON_CONSTANTS.classes.BUTTON_RAISED);\n }\n if (type.includes('unelevated')) {\n this._buttonElement.classList.add(BUTTON_CONSTANTS.classes.BUTTON_UNELEVATED);\n }\n if (type.includes('outlined')) {\n this._buttonElement.classList.add(BUTTON_CONSTANTS.classes.BUTTON_OUTLINED);\n }\n if (type.includes('dense')) {\n this._buttonElement.classList.add(BUTTON_CONSTANTS.classes.BUTTON_DENSE);\n }\n }\n }\n\n private _initialize(): void {\n this._initializeButton();\n this._initializeMutationObserver();\n }\n\n private _initializeButton(): void {\n this._buttonElement = this.querySelector(BUTTON_CONSTANTS.selectors.BUTTON) as HTMLButtonElement;\n if (!this._buttonElement) {\n return;\n }\n\n if (this.hasAttribute(BUTTON_CONSTANTS.attributes.TYPE)) {\n this._type = this.getAttribute(BUTTON_CONSTANTS.attributes.TYPE) as string;\n this._applyType(this._type);\n }\n this._buttonElement.classList.add(BUTTON_CONSTANTS.classes.BUTTON);\n\n this._syncDisabledState();\n this._initializeButtonChildren();\n\n // We wait to initialize the ripple instance until the user interacts with the component to avoid unnecessary performance overhead\n this._deferRippleInitialization();\n }\n\n private async _deferRippleInitialization(): Promise<void> {\n const type = await userInteractionListener(this._buttonElement);\n if (!this._rippleInstance) {\n this._rippleInstance = this._createRipple();\n if (type === 'focusin') {\n this._rippleInstance.handleFocus();\n }\n }\n }\n\n private _createRipple(): ForgeRipple {\n if (this._rippleInstance) {\n this._rippleInstance.destroy();\n }\n return new ForgeRipple(this._buttonElement);\n }\n\n private _initializeButtonChildren(): void {\n if (!this._buttonElement.querySelector(BUTTON_CONSTANTS.selectors.RIPPLE)) {\n const rippleElement = document.createElement('span');\n rippleElement.classList.add(BUTTON_CONSTANTS.classes.RIPPLE);\n this._buttonElement.appendChild(rippleElement);\n }\n\n const labelElement = this.querySelector(BUTTON_CONSTANTS.selectors.LABEL);\n if (labelElement) {\n labelElement.classList.add(BUTTON_CONSTANTS.classes.LABEL);\n }\n\n const iconElements = Array.from(this.querySelectorAll(BUTTON_CONSTANTS.selectors.ICON));\n iconElements.forEach(iconElement => {\n iconElement.classList.add(BUTTON_CONSTANTS.classes.ICON);\n if (!iconElement.hasAttribute('aria-hidden')) {\n iconElement.setAttribute('aria-hidden', 'true');\n }\n });\n }\n\n private _initializeMutationObserver(): void {\n if (!this._mutationObserver) {\n const config: MutationObserverInit = { childList: true, subtree: true };\n const callback: MutationCallback = mutationList => {\n if (this._buttonWasAdded(mutationList)) {\n this._initializeButton();\n } else if (mutationList.some(mutation => mutation.addedNodes.length)) {\n this._initializeButtonChildren();\n }\n };\n this._mutationObserver = new MutationObserver(callback);\n this._mutationObserver.observe(this, config);\n \n if (this._buttonElement) {\n // Watch attributes on the `<button>` element\n this._buttonAttrMutationObserver = new MutationObserver(mutationList => {\n if (mutationList.some(mutation => mutation.attributeName === 'disabled')) {\n this._syncDisabledState();\n }\n });\n this._buttonAttrMutationObserver.observe(this._buttonElement, { attributes: true, attributeFilter: ['disabled'] });\n }\n }\n }\n\n private _buttonWasAdded(mutationList: MutationRecord[]): boolean {\n return mutationList.some(mutation => {\n return Array.from(mutation.addedNodes)\n .some(node => ALLOWED_CHILDREN.includes(node.nodeName.toLowerCase()));\n });\n }\n\n private _syncDisabledState(): void {\n toggleAttribute(this, this._buttonElement.disabled, BUTTON_CONSTANTS.attributes.DISABLED);\n }\n}\n\n", "import { BaseComponentDelegate, IBaseComponentDelegateConfig, IBaseComponentDelegateOptions } from '../core/delegates/base-component-delegate';\nimport { IButtonComponent } from './button';\nimport { BUTTON_CONSTANTS } from './button-constants';\n\nexport type ButtonComponentDelegateProps = Partial<IButtonComponent>;\nexport interface IButtonComponentDelegateOptions extends IBaseComponentDelegateOptions {\n type?: 'button' | 'submit';\n text?: string;\n}\nexport interface IButtonComponentDelegateConfig extends IBaseComponentDelegateConfig<IButtonComponent, IButtonComponentDelegateOptions> {}\n\nexport class ButtonComponentDelegate extends BaseComponentDelegate<IButtonComponent, IButtonComponentDelegateOptions> {\n private _buttonElement?: HTMLButtonElement;\n\n constructor(config?: IButtonComponentDelegateConfig) {\n super(config);\n }\n\n public override destroy(): void {\n this._buttonElement = undefined;\n }\n\n public get buttonElement(): HTMLButtonElement | undefined {\n return this._buttonElement;\n }\n\n protected _build(): IButtonComponent {\n const component = document.createElement(BUTTON_CONSTANTS.elementName);\n\n this._buttonElement = document.createElement('button');\n this._buttonElement.type = this._config.options?.type || 'button';\n this._buttonElement.textContent = this._config.options?.text || '';\n component.appendChild(this._buttonElement);\n\n return component;\n }\n\n public onClick(listener: (evt: MouseEvent) => void): void {\n this._buttonElement?.addEventListener('click', listener);\n }\n\n public onFocus(listener: (evt: Event) => void): void {\n this._buttonElement?.addEventListener('focus', evt => listener(evt));\n }\n\n public onBlur(listener: (evt: Event) => void): void {\n this._buttonElement?.addEventListener('blur', evt => listener(evt));\n }\n}\n", "import { defineCustomElement } from '@tylertech/forge-core';\nimport { ButtonComponent } from './button';\n\nexport * from './button';\nexport * from './button-constants';\nexport * from './button-component-delegate';\n\nexport function defineButtonComponent(): void {\n defineCustomElement(ButtonComponent);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -3,5 +3,5 @@
3
3
  * Copyright 2023 Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- import{d as e}from"./chunk.Y5GQ2BA7.js";import{a as o}from"./chunk.MMVZJLXE.js";function t(){o(e)}export{t as a};
7
- //# sourceMappingURL=chunk.VW4JVRH7.js.map
6
+ import{d as e}from"./chunk.P5GT5YBP.js";import{a as o}from"./chunk.MMVZJLXE.js";function t(){o(e)}export{t as a};
7
+ //# sourceMappingURL=chunk.CN7DHS4J.js.map