@tylertech/forge 2.10.1 → 2.12.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 (215) hide show
  1. package/custom-elements.json +221 -5
  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/badge/index.js +1 -1
  11. package/dist/esm/banner/index.js +1 -1
  12. package/dist/esm/bottom-sheet/index.js +1 -1
  13. package/dist/esm/busy-indicator/index.js +1 -1
  14. package/dist/esm/button/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.I33ZJKOX.js → chunk.2SAHWDGJ.js} +2 -2
  26. package/dist/esm/chunks/{chunk.I33ZJKOX.js.map → chunk.2SAHWDGJ.js.map} +0 -0
  27. package/dist/esm/chunks/chunk.2VFX652S.js +12 -0
  28. package/dist/esm/chunks/{chunk.4DS3GUQ5.js.map → chunk.2VFX652S.js.map} +0 -0
  29. package/dist/esm/chunks/{chunk.IBQVV4HR.js → chunk.4HI4HGZ6.js} +2 -2
  30. package/dist/esm/chunks/{chunk.IBQVV4HR.js.map → chunk.4HI4HGZ6.js.map} +0 -0
  31. package/dist/esm/chunks/{chunk.DGQAYNAF.js → chunk.4KBQ5AJJ.js} +2 -2
  32. package/dist/esm/chunks/{chunk.DGQAYNAF.js.map → chunk.4KBQ5AJJ.js.map} +0 -0
  33. package/dist/esm/chunks/{chunk.XURVHDKR.js → chunk.4WFU5CVF.js} +2 -2
  34. package/dist/esm/chunks/{chunk.XURVHDKR.js.map → chunk.4WFU5CVF.js.map} +0 -0
  35. package/dist/esm/chunks/chunk.5K5SIZRX.js +7 -0
  36. package/dist/esm/chunks/chunk.5K5SIZRX.js.map +7 -0
  37. package/dist/esm/chunks/{chunk.2YGKMENJ.js → chunk.5PQTSZ7G.js} +2 -2
  38. package/dist/esm/chunks/{chunk.2YGKMENJ.js.map → chunk.5PQTSZ7G.js.map} +0 -0
  39. package/dist/esm/chunks/{chunk.EM3OQRZP.js → chunk.77FVTUTL.js} +2 -2
  40. package/dist/esm/chunks/{chunk.EM3OQRZP.js.map → chunk.77FVTUTL.js.map} +0 -0
  41. package/dist/esm/chunks/chunk.7GTCDP5H.js +7 -0
  42. package/dist/esm/chunks/{chunk.YWQZURLM.js.map → chunk.7GTCDP5H.js.map} +2 -2
  43. package/dist/esm/chunks/{chunk.KLHXGSZU.js → chunk.7O7V3N4A.js} +2 -2
  44. package/dist/esm/chunks/{chunk.KLHXGSZU.js.map → chunk.7O7V3N4A.js.map} +0 -0
  45. package/dist/esm/chunks/{chunk.ESW45SN4.js → chunk.7PHGAX6P.js} +2 -2
  46. package/dist/esm/chunks/{chunk.ESW45SN4.js.map → chunk.7PHGAX6P.js.map} +0 -0
  47. package/dist/esm/chunks/{chunk.VEVOKTUX.js → chunk.7TKJAZTM.js} +2 -2
  48. package/dist/esm/chunks/{chunk.VEVOKTUX.js.map → chunk.7TKJAZTM.js.map} +0 -0
  49. package/dist/esm/chunks/{chunk.WAEWHBHE.js → chunk.APGFXXJ7.js} +2 -2
  50. package/dist/esm/chunks/{chunk.WAEWHBHE.js.map → chunk.APGFXXJ7.js.map} +0 -0
  51. package/dist/esm/chunks/{chunk.A6I4EIPW.js → chunk.BFNAQQCU.js} +2 -2
  52. package/dist/esm/chunks/{chunk.A6I4EIPW.js.map → chunk.BFNAQQCU.js.map} +0 -0
  53. package/dist/esm/chunks/{chunk.G5BCWBD5.js → chunk.BOENNFXE.js} +2 -2
  54. package/dist/esm/chunks/{chunk.G5BCWBD5.js.map → chunk.BOENNFXE.js.map} +0 -0
  55. package/dist/esm/chunks/chunk.CVJTQY2T.js +7 -0
  56. package/dist/esm/chunks/chunk.CVJTQY2T.js.map +7 -0
  57. package/dist/esm/chunks/{chunk.WYVYTAFS.js → chunk.DML4YNQF.js} +2 -2
  58. package/dist/esm/chunks/{chunk.WYVYTAFS.js.map → chunk.DML4YNQF.js.map} +0 -0
  59. package/dist/esm/chunks/{chunk.RS5NH2NG.js → chunk.FPV4XEUK.js} +2 -2
  60. package/dist/esm/chunks/{chunk.RS5NH2NG.js.map → chunk.FPV4XEUK.js.map} +0 -0
  61. package/dist/esm/chunks/{chunk.WZRXUTYC.js → chunk.G77PXLAU.js} +2 -2
  62. package/dist/esm/chunks/{chunk.WZRXUTYC.js.map → chunk.G77PXLAU.js.map} +0 -0
  63. package/dist/esm/chunks/{chunk.2A3CKLXJ.js → chunk.I2YRKTG7.js} +2 -2
  64. package/dist/esm/chunks/{chunk.2A3CKLXJ.js.map → chunk.I2YRKTG7.js.map} +0 -0
  65. package/dist/esm/chunks/{chunk.AFZB3MG5.js → chunk.IFZXG3LI.js} +2 -2
  66. package/dist/esm/chunks/{chunk.AFZB3MG5.js.map → chunk.IFZXG3LI.js.map} +0 -0
  67. package/dist/esm/chunks/{chunk.OHCHNL3V.js → chunk.JNOCXQVB.js} +2 -2
  68. package/dist/esm/chunks/{chunk.OHCHNL3V.js.map → chunk.JNOCXQVB.js.map} +2 -2
  69. package/dist/esm/chunks/chunk.K6LZM6DS.js +7 -0
  70. package/dist/esm/chunks/{chunk.SFFYXKJW.js.map → chunk.K6LZM6DS.js.map} +2 -2
  71. package/dist/esm/chunks/{chunk.5SRA2RH3.js → chunk.KKF2ZZMD.js} +2 -2
  72. package/dist/esm/chunks/{chunk.5SRA2RH3.js.map → chunk.KKF2ZZMD.js.map} +0 -0
  73. package/dist/esm/chunks/chunk.KYCC3C3M.js +7 -0
  74. package/dist/esm/chunks/{chunk.AABG6MSC.js.map → chunk.KYCC3C3M.js.map} +2 -2
  75. package/dist/esm/chunks/{chunk.NEGJYSPB.js → chunk.LLHA3SQR.js} +2 -2
  76. package/dist/esm/chunks/{chunk.NEGJYSPB.js.map → chunk.LLHA3SQR.js.map} +0 -0
  77. package/dist/esm/chunks/chunk.MNBJMPJ6.js +7 -0
  78. package/dist/esm/chunks/chunk.MNBJMPJ6.js.map +7 -0
  79. package/dist/esm/chunks/{chunk.JXQZMASB.js → chunk.OAKTW64X.js} +2 -2
  80. package/dist/esm/chunks/{chunk.JXQZMASB.js.map → chunk.OAKTW64X.js.map} +0 -0
  81. package/dist/esm/chunks/{chunk.CSOY4C7A.js → chunk.OG2BI3UW.js} +2 -2
  82. package/dist/esm/chunks/{chunk.CSOY4C7A.js.map → chunk.OG2BI3UW.js.map} +2 -2
  83. package/dist/esm/chunks/{chunk.NJHQA266.js → chunk.OPTMTRWL.js} +2 -2
  84. package/dist/esm/chunks/{chunk.NJHQA266.js.map → chunk.OPTMTRWL.js.map} +0 -0
  85. package/dist/esm/chunks/{chunk.AHOQXJRN.js → chunk.P6B3UWJ5.js} +2 -2
  86. package/dist/esm/chunks/{chunk.AHOQXJRN.js.map → chunk.P6B3UWJ5.js.map} +0 -0
  87. package/dist/esm/chunks/{chunk.W7UTHKBF.js → chunk.Q6L7T6OJ.js} +2 -2
  88. package/dist/esm/chunks/{chunk.W7UTHKBF.js.map → chunk.Q6L7T6OJ.js.map} +0 -0
  89. package/dist/esm/chunks/{chunk.WGE5R5JK.js → chunk.QBDE7M3E.js} +2 -2
  90. package/dist/esm/chunks/{chunk.WGE5R5JK.js.map → chunk.QBDE7M3E.js.map} +0 -0
  91. package/dist/esm/chunks/{chunk.J6ERQLHJ.js → chunk.RPPBBBYG.js} +2 -2
  92. package/dist/esm/chunks/{chunk.J6ERQLHJ.js.map → chunk.RPPBBBYG.js.map} +2 -2
  93. package/dist/esm/chunks/{chunk.DJSOBAWA.js → chunk.SJSLC6XF.js} +2 -2
  94. package/dist/esm/chunks/{chunk.DJSOBAWA.js.map → chunk.SJSLC6XF.js.map} +0 -0
  95. package/dist/esm/chunks/{chunk.YFIDBZ7V.js → chunk.SLZFPWOH.js} +2 -2
  96. package/dist/esm/chunks/{chunk.YFIDBZ7V.js.map → chunk.SLZFPWOH.js.map} +0 -0
  97. package/dist/esm/chunks/{chunk.WKKNDQYZ.js → chunk.SVHVGMKS.js} +2 -2
  98. package/dist/esm/chunks/{chunk.WKKNDQYZ.js.map → chunk.SVHVGMKS.js.map} +0 -0
  99. package/dist/esm/chunks/{chunk.WMO47F6Z.js → chunk.TLHI6K2R.js} +2 -2
  100. package/dist/esm/chunks/{chunk.WMO47F6Z.js.map → chunk.TLHI6K2R.js.map} +0 -0
  101. package/dist/esm/chunks/{chunk.6BKOGBE6.js → chunk.TR64DV3G.js} +2 -2
  102. package/dist/esm/chunks/{chunk.6BKOGBE6.js.map → chunk.TR64DV3G.js.map} +0 -0
  103. package/dist/esm/chunks/chunk.UHVCXKB4.js +7 -0
  104. package/dist/esm/chunks/chunk.UHVCXKB4.js.map +7 -0
  105. package/dist/esm/chunks/{chunk.MTMZFAWU.js → chunk.V7P3QPNM.js} +2 -2
  106. package/dist/esm/chunks/{chunk.MTMZFAWU.js.map → chunk.V7P3QPNM.js.map} +0 -0
  107. package/dist/esm/chunks/{chunk.ZHCQBWAG.js → chunk.WALEAV54.js} +2 -2
  108. package/dist/esm/chunks/{chunk.ZHCQBWAG.js.map → chunk.WALEAV54.js.map} +0 -0
  109. package/dist/esm/chunks/{chunk.SNGELGOD.js → chunk.WV45FGTW.js} +2 -2
  110. package/dist/esm/chunks/{chunk.SNGELGOD.js.map → chunk.WV45FGTW.js.map} +0 -0
  111. package/dist/esm/chunks/chunk.Y6FFG7XO.js +7 -0
  112. package/dist/esm/chunks/chunk.Y6FFG7XO.js.map +7 -0
  113. package/dist/esm/chunks/{chunk.RZL6S3K3.js → chunk.Y6MPWPZU.js} +2 -2
  114. package/dist/esm/chunks/{chunk.RZL6S3K3.js.map → chunk.Y6MPWPZU.js.map} +0 -0
  115. package/dist/esm/chunks/{chunk.7TQYFMM4.js → chunk.YAJT3P6V.js} +2 -2
  116. package/dist/esm/chunks/{chunk.7TQYFMM4.js.map → chunk.YAJT3P6V.js.map} +0 -0
  117. package/dist/esm/chunks/{chunk.57XBS3DF.js → chunk.YSE5EMB3.js} +2 -2
  118. package/dist/esm/chunks/{chunk.57XBS3DF.js.map → chunk.YSE5EMB3.js.map} +0 -0
  119. package/dist/esm/chunks/{chunk.KZHMDZVS.js → chunk.YWKKZLZ2.js} +2 -2
  120. package/dist/esm/chunks/{chunk.KZHMDZVS.js.map → chunk.YWKKZLZ2.js.map} +0 -0
  121. package/dist/esm/chunks/{chunk.UNTTQM6V.js → chunk.YX5SWK3O.js} +2 -2
  122. package/dist/esm/chunks/{chunk.UNTTQM6V.js.map → chunk.YX5SWK3O.js.map} +0 -0
  123. package/dist/esm/chunks/{chunk.7WWP6WI6.js → chunk.Z5P6EA5L.js} +2 -2
  124. package/dist/esm/chunks/{chunk.7WWP6WI6.js.map → chunk.Z5P6EA5L.js.map} +0 -0
  125. package/dist/esm/chunks/chunk.ZFUVXYDL.js +7 -0
  126. package/dist/esm/chunks/chunk.ZFUVXYDL.js.map +7 -0
  127. package/dist/esm/chunks/{chunk.5HUDHTAK.js → chunk.ZHXPL2MS.js} +2 -2
  128. package/dist/esm/chunks/{chunk.5HUDHTAK.js.map → chunk.ZHXPL2MS.js.map} +0 -0
  129. package/dist/esm/color-picker/index.js +1 -1
  130. package/dist/esm/core/index.js +1 -1
  131. package/dist/esm/core/utils/index.js +1 -1
  132. package/dist/esm/date-picker/index.js +1 -1
  133. package/dist/esm/date-range-picker/index.js +1 -1
  134. package/dist/esm/dialog/index.js +1 -1
  135. package/dist/esm/expansion-panel/index.js +1 -1
  136. package/dist/esm/file-picker/index.js +1 -1
  137. package/dist/esm/icon/index.js +1 -1
  138. package/dist/esm/icon-button/index.js +1 -1
  139. package/dist/esm/index.js +1 -1
  140. package/dist/esm/label-value/index.js +1 -1
  141. package/dist/esm/list-dropdown/index.js +1 -1
  142. package/dist/esm/menu/index.js +1 -1
  143. package/dist/esm/open-icon/index.js +1 -1
  144. package/dist/esm/paginator/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/select/core/index.js +1 -1
  148. package/dist/esm/select/index.js +1 -1
  149. package/dist/esm/select/select/index.js +1 -1
  150. package/dist/esm/select/select-dropdown/index.js +1 -1
  151. package/dist/esm/slider/index.js +1 -1
  152. package/dist/esm/split-view/index.js +1 -1
  153. package/dist/esm/split-view/split-view/index.js +1 -1
  154. package/dist/esm/split-view/split-view-panel/index.js +1 -1
  155. package/dist/esm/stepper/index.js +1 -1
  156. package/dist/esm/stepper/step/index.js +1 -1
  157. package/dist/esm/stepper/stepper/index.js +1 -1
  158. package/dist/esm/switch/index.js +1 -1
  159. package/dist/esm/table/index.js +1 -1
  160. package/dist/esm/tabs/index.js +1 -1
  161. package/dist/esm/tabs/tab-bar/index.js +1 -1
  162. package/dist/esm/text-field/index.js +1 -1
  163. package/dist/esm/time-picker/index.js +1 -1
  164. package/dist/esm/toast/index.js +1 -1
  165. package/dist/esm/toolbar/index.js +1 -1
  166. package/esm/autocomplete/autocomplete-adapter.d.ts +2 -0
  167. package/esm/autocomplete/autocomplete-adapter.js +10 -0
  168. package/esm/autocomplete/autocomplete-constants.js +2 -1
  169. package/esm/autocomplete/autocomplete-foundation.d.ts +1 -0
  170. package/esm/autocomplete/autocomplete-foundation.js +9 -0
  171. package/esm/badge/badge.js +2 -2
  172. package/esm/button-toggle/button-toggle-group/button-toggle-group-constants.d.ts +1 -1
  173. package/esm/button-toggle/button-toggle-group/button-toggle-group.d.ts +4 -1
  174. package/esm/core/utils/utils.d.ts +6 -0
  175. package/esm/core/utils/utils.js +10 -0
  176. package/esm/expansion-panel/expansion-panel-foundation.js +2 -2
  177. package/esm/field/field-constants.d.ts +3 -0
  178. package/esm/field/field-constants.js +4 -0
  179. package/esm/field/field.js +3 -3
  180. package/esm/menu/menu-foundation.d.ts +1 -0
  181. package/esm/menu/menu-foundation.js +6 -3
  182. package/esm/select/core/base-select-adapter.d.ts +2 -0
  183. package/esm/select/core/base-select-adapter.js +17 -7
  184. package/esm/select/core/base-select-foundation.d.ts +1 -0
  185. package/esm/select/core/base-select-foundation.js +7 -0
  186. package/esm/split-view/split-view/split-view-adapter.d.ts +4 -0
  187. package/esm/split-view/split-view/split-view-adapter.js +7 -1
  188. package/esm/split-view/split-view/split-view-foundation.d.ts +4 -0
  189. package/esm/split-view/split-view/split-view-foundation.js +12 -0
  190. package/esm/split-view/split-view/split-view.d.ts +5 -0
  191. package/esm/split-view/split-view/split-view.js +5 -0
  192. package/esm/split-view/split-view-panel/split-view-panel-foundation.js +2 -2
  193. package/esm/split-view/split-view-panel/split-view-panel.d.ts +5 -0
  194. package/esm/split-view/split-view-panel/split-view-panel.js +6 -1
  195. package/esm/toolbar/toolbar.js +1 -1
  196. package/package.json +1 -1
  197. package/styles/badge/_mixins.scss +5 -1
  198. package/styles/toolbar/_mixins.scss +2 -2
  199. package/styles/toolbar/toolbar.scss +6 -0
  200. package/dist/esm/chunks/chunk.4DS3GUQ5.js +0 -12
  201. package/dist/esm/chunks/chunk.5QK7XR2W.js +0 -7
  202. package/dist/esm/chunks/chunk.5QK7XR2W.js.map +0 -7
  203. package/dist/esm/chunks/chunk.7GT5LOI3.js +0 -7
  204. package/dist/esm/chunks/chunk.7GT5LOI3.js.map +0 -7
  205. package/dist/esm/chunks/chunk.AABG6MSC.js +0 -7
  206. package/dist/esm/chunks/chunk.GP7WDYWQ.js +0 -7
  207. package/dist/esm/chunks/chunk.GP7WDYWQ.js.map +0 -7
  208. package/dist/esm/chunks/chunk.R46EDURP.js +0 -7
  209. package/dist/esm/chunks/chunk.R46EDURP.js.map +0 -7
  210. package/dist/esm/chunks/chunk.SFFYXKJW.js +0 -7
  211. package/dist/esm/chunks/chunk.SHSR5RZ4.js +0 -7
  212. package/dist/esm/chunks/chunk.SHSR5RZ4.js.map +0 -7
  213. package/dist/esm/chunks/chunk.WSGJIPQJ.js +0 -7
  214. package/dist/esm/chunks/chunk.WSGJIPQJ.js.map +0 -7
  215. package/dist/esm/chunks/chunk.YWQZURLM.js +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/menu/menu-constants.ts", "../../src/menu/menu-adapter.ts", "../../src/menu/menu-foundation.ts", "../../src/menu/menu.ts", "../../src/menu/index.ts"],
4
- "sourcesContent": ["import { COMPONENT_NAME_PREFIX } from '../constants';\nimport { IListDropdownOption, IListDropdownOptionGroup } from '../list-dropdown';\n\nconst elementName: keyof HTMLElementTagNameMap = `${COMPONENT_NAME_PREFIX}menu`;\n\nconst classes = {\n POPUP: 'forge-menu__popup',\n MENU: 'mdc-menu'\n};\n\nconst selectors = {\n TOGGLE: `.${COMPONENT_NAME_PREFIX}menu__toggle, [${elementName}-toggle], button, [type=button]`,\n MENU_LIST: 'forge-list'\n};\n\nconst attributes = {\n OPEN: 'open',\n PLACEMENT: 'placement',\n SELECTED_INDEX: 'selected-index',\n SELECTED_VALUE: 'selected-value',\n DENSE: 'dense',\n ICON_CLASS: 'icon-class',\n PERSIST_SELECTION: 'persist-selection',\n MODE: 'mode',\n SYNC_POPUP_WIDTH: 'sync-popup-width',\n POPUP_CLASSES: 'popup-classes',\n OPTION_LIMIT: 'option-limit',\n OBSERVE_SCROLL: 'observe-scroll',\n OBSERVE_SCROLL_THRESHOLD: 'observe-scroll-threshold'\n};\n\nconst events = {\n SELECT: `${elementName}-select`,\n OPEN: `${elementName}-open`,\n CLOSE: `${elementName}-close`,\n ACTIVE_CHANGE: `${elementName}-active-change`\n};\n\nconst numbers = {\n CHILD_MOUSE_LEAVE_TIMEOUT: 300,\n POPUP_MOUSE_LEAVE_TIMEOUT: 500\n};\n\nexport const MENU_CONSTANTS = {\n elementName,\n classes,\n selectors,\n attributes,\n events,\n numbers\n};\n\nexport interface IMenuSelectEventData<T = any, K = any> {\n index: number;\n value?: T;\n parentValue?: K;\n}\n\nexport interface IMenuActiveChangeEventData {\n id: string;\n}\n\nexport interface IMenuOption<T = any> extends IListDropdownOption<T> {\n icon?: string;\n selected?: boolean;\n}\n\nexport interface IMenuOptionGroup extends IListDropdownOptionGroup {}\n\nexport type MenuOptionBuilder = (option: IMenuOption, parentElement: HTMLElement) => HTMLElement | string | void;\nexport type MenuOptionFactory = (() => IMenuOption[]) | (() => Promise<IMenuOption[]>);\nexport type MenuMode = 'click' | 'cascade';\n", "import { BaseAdapter, IBaseAdapter } from '../core/base/base-adapter';\nimport { IMenuOption } from './index';\nimport { IMenuComponent } from './menu';\nimport { MENU_CONSTANTS, IMenuSelectEventData } from './menu-constants';\nimport { IListDropdownConfig, IListDropdown, ListDropdown } from '../list-dropdown';\nimport { IListComponent, IListItemComponent, LIST_CONSTANTS, LIST_ITEM_CONSTANTS } from '../list';\n\nexport interface IMenuAdapter extends IBaseAdapter {\n getDropdownElement(): HTMLElement | null;\n initializeTarget(): void;\n initializeAccessibility(id: string): void;\n hasTargetElement(): boolean;\n addTargetListener(event: string, callback: (event: Event) => void, bubbles?: boolean): void;\n removeTargetListener(event: string, callback: (event: Event) => void): void;\n attachMenu(config: IListDropdownConfig): void;\n detachMenu(): void;\n setOptions(options: IMenuOption[]): void;\n getActiveOptionIndex(): number;\n setActiveOption(index: number): void;\n activateFirstOption(): void;\n propagateKey(key: string): void;\n proxyKeyboardEventToChild(evt: KeyboardEvent, id: string): void;\n toggleChildMenu(index: number, open?: boolean): void;\n focusTarget(): void;\n isTargetFocused(): boolean;\n updateActiveDescendant(id: string): void;\n isOwnElement(element: Element): boolean;\n addDropdownListener(type: string, listener: (evt: any) => void): void;\n createChildMenu(index: number, parentValue: any, openCb: (index: number) => void, closeCb: (index: number) => void, selectCb: (data: IMenuSelectEventData) => void): IMenuComponent;\n closeOtherChildMenus(excludeIndex?: number): void;\n setSelectedValues(values: any[]): void;\n}\n\nexport class MenuAdapter extends BaseAdapter<IMenuComponent> implements IMenuAdapter {\n private _targetElement: HTMLElement | null;\n private _listDropdown?: IListDropdown;\n private _childMenus = new Map<number, IMenuComponent>();\n\n constructor(component: IMenuComponent) {\n super(component);\n }\n\n public getDropdownElement(): HTMLElement | null {\n return this._listDropdown?.dropdownElement ?? null;\n }\n\n public hasTargetElement(): boolean {\n return !!this._targetElement;\n }\n\n public initializeTarget(): void {\n this._targetElement = this._component.querySelector(MENU_CONSTANTS.selectors.TOGGLE);\n if (!this._targetElement) {\n this._targetElement = this._component.firstElementChild as HTMLElement;\n }\n }\n\n public initializeAccessibility(id: string): void {\n if (!this._targetElement) {\n return;\n }\n\n this._targetElement.setAttribute('aria-atomic', 'true');\n this._targetElement.setAttribute('aria-live', 'assertive');\n this._targetElement.setAttribute('aria-haspopup', 'true');\n this._targetElement.setAttribute('aria-expanded', 'false');\n\n if (!this._targetElement.hasAttribute('aria-label')) {\n this._targetElement.setAttribute('aria-label', this._targetElement.textContent || '');\n }\n }\n\n public addTargetListener(event: string, callback: (event: Event) => void, bubbles = false): void {\n if (this._targetElement) {\n this._targetElement.addEventListener(event, callback, bubbles);\n }\n }\n\n public removeTargetListener(event: string, callback: (event: Event) => void): void {\n if (this._targetElement) {\n this._targetElement.removeEventListener(event, callback);\n }\n }\n\n public attachMenu(config: IListDropdownConfig): void {\n if (this._listDropdown || !this._targetElement) {\n return;\n }\n this._listDropdown = new ListDropdown(this._targetElement as HTMLElement, config);\n this._listDropdown.open();\n this._targetElement.setAttribute('aria-expanded', 'true');\n this._targetElement.setAttribute('aria-controls', `list-dropdown-popup-${config.id}`);\n }\n\n public setOptions(options: IMenuOption[]): void {\n if (this._listDropdown) {\n this._listDropdown.setOptions(options);\n }\n }\n\n public detachMenu(): void {\n if (this._targetElement) {\n this._targetElement.removeAttribute('aria-activedescendant');\n this._targetElement.removeAttribute('aria-expanded');\n this._targetElement.removeAttribute('aria-controls');\n }\n\n if (this._listDropdown) {\n this._listDropdown.close();\n this._listDropdown.destroy();\n this._listDropdown = undefined;\n }\n }\n\n public setActiveOption(index: number): void {\n this._listDropdown?.activateOption(index);\n }\n\n public activateFirstOption(): void {\n this._listDropdown?.activateFirstOption();\n }\n\n public getActiveOptionIndex(): number {\n return this._listDropdown?.getActiveOptionIndex() ?? -1;\n }\n\n public focusTarget(): void {\n if (this._targetElement) {\n this._targetElement.focus();\n }\n }\n\n public isTargetFocused(): boolean {\n return document.activeElement === this._targetElement;\n }\n\n public updateActiveDescendant(id: string): void {\n if (!this._targetElement) {\n return;\n }\n if (id) {\n this._targetElement.setAttribute('aria-activedescendant', id);\n } else {\n this._targetElement.removeAttribute('aria-activedescendant');\n }\n }\n\n public addDropdownListener(type: string, listener: (evt: any) => void): void {\n if (!this._listDropdown || !this._listDropdown.dropdownElement) {\n return;\n }\n this._listDropdown.dropdownElement.addEventListener(type, listener);\n }\n\n public isOwnElement(el: Element): boolean {\n if (!this._targetElement || !this._listDropdown || !this._listDropdown.dropdownElement) {\n return false;\n }\n return this._targetElement.contains(el) || !!this._listDropdown.dropdownElement.contains(el);\n }\n\n public propagateKey(key: string): void {\n this._listDropdown?.handleKey(key);\n }\n\n public proxyKeyboardEventToChild(evt: KeyboardEvent, id: string): void {\n if (!this.getDropdownElement()) {\n return;\n }\n const openMenu = this._getOpenChildMenu(id);\n if (openMenu) {\n openMenu.propagateKeyEvent(evt);\n }\n }\n\n public toggleChildMenu(index: number, open?: boolean): void {\n const listItems = this._getListItems();\n const listItem = listItems[index];\n const childMenu = listItem.parentElement as IMenuComponent;\n if (childMenu && childMenu.tagName.toLowerCase() === MENU_CONSTANTS.elementName) {\n if (open === undefined) {\n childMenu.open = !childMenu.open;\n } else {\n childMenu.open = open;\n }\n }\n }\n\n public createChildMenu(index: number, parentValue: any, openCb: (index: number) => void, closeCb: (index: number) => void, selectCb: (data: IMenuSelectEventData) => void): IMenuComponent {\n const menu = document.createElement('forge-menu');\n menu.style.display = 'block';\n\n // Set listeners to notify the parent menu when anything important happens within a child menu that needs to be propagated to the root menu\n menu.addEventListener(MENU_CONSTANTS.events.OPEN, () => {\n this._childMenus.set(index, menu);\n openCb(index);\n });\n menu.addEventListener(MENU_CONSTANTS.events.CLOSE, () => {\n this._childMenus.delete(index);\n closeCb(index);\n });\n menu.addEventListener(MENU_CONSTANTS.events.SELECT, (evt: CustomEvent<IMenuSelectEventData>) => {\n evt.stopPropagation();\n selectCb({ ...evt.detail, parentValue });\n });\n\n return menu;\n }\n\n public closeOtherChildMenus(excludeIndex?: number): void {\n const menusToRemove: number[] = [];\n this._childMenus.forEach((menu, index) => {\n if (index !== excludeIndex) {\n menu.open = false;\n menusToRemove.push(index);\n }\n });\n menusToRemove.forEach(index => this._childMenus.delete(index));\n }\n\n public setSelectedValues(values: any[]): void {\n this._listDropdown?.setSelectedValues(values);\n }\n\n private _getOpenChildMenu(id: string): IMenuComponent | null {\n if (!this.getDropdownElement()) {\n return null;\n }\n const list = this._getOwnList(id);\n return list ? list.querySelector(`${MENU_CONSTANTS.elementName}[${MENU_CONSTANTS.attributes.OPEN}]`) : null;\n }\n\n private _getOwnList(id: string): IListComponent | null {\n const popup = this.getDropdownElement();\n if (!popup) {\n return null;\n }\n return popup.querySelector(`${LIST_CONSTANTS.elementName}[id=\"list-dropdown-list-${id}\"]`);\n }\n\n private _getListItems(): IListItemComponent[] {\n const popup = this.getDropdownElement();\n if (!popup) {\n return [];\n }\n const listElement = popup.querySelector(LIST_CONSTANTS.elementName);\n if (listElement) {\n return Array.from(listElement.querySelectorAll(LIST_ITEM_CONSTANTS.elementName)) as IListItemComponent[];\n }\n return [];\n }\n}\n", "import { ICustomElementFoundation, isArray, randomChars } from '@tylertech/forge-core';\nimport { ICON_CLASS_NAME } from '../constants';\nimport { CascadingListDropdownAwareFoundation, IListDropdownCascadingElementFactoryConfig, IListDropdownConfig, ListDropdownAsyncStyle, ListDropdownType } from '../list-dropdown';\nimport { isListDropdownOptionType, ListDropdownOptionType } from '../list-dropdown/list-dropdown-utils';\nimport { IPopupPosition, PopupPlacement } from '../popup';\nimport { IMenuOption } from './index';\nimport { IMenuAdapter } from './menu-adapter';\nimport { IMenuActiveChangeEventData, IMenuOptionGroup, IMenuSelectEventData, MenuMode, MenuOptionBuilder, MenuOptionFactory, MENU_CONSTANTS } from './menu-constants';\n\nexport interface IMenuFoundation extends ICustomElementFoundation {\n initialize(): void;\n disconnect(): void;\n onKeydown(evt: KeyboardEvent): void;\n open: boolean;\n options: Array<IMenuOption | IMenuOptionGroup>;\n optionsFactory: MenuOptionFactory | undefined;\n selectedIndex: number;\n selectedValue: any;\n placement: string;\n dense: boolean;\n iconClass: string;\n persistSelection: boolean;\n mode: MenuMode;\n popupOffset: IPopupPosition;\n optionBuilder: MenuOptionBuilder | undefined;\n}\n\nexport class MenuFoundation extends CascadingListDropdownAwareFoundation<IMenuOption | IMenuOptionGroup> implements IMenuFoundation {\n private _optionsFactory: MenuOptionFactory | undefined;\n private _placement: PopupPlacement = 'bottom-start';\n private _dense = false;\n private _selectedValue: any;\n private _iconClass = ICON_CLASS_NAME;\n private _persistSelection = false;\n private _mode: MenuMode = 'click';\n private _popupOffset: IPopupPosition;\n private _optionBuilder: MenuOptionBuilder | undefined;\n private _identifier: string;\n private _clickListener: (evt: MouseEvent) => void;\n private _blurListener: (evt: MouseEvent) => void;\n private _selectListener: (value: any) => void;\n private _keydownListener: (evt: KeyboardEvent) => void;\n private _activeChangeListener: (id: string) => void;\n \n constructor(private _adapter: IMenuAdapter) {\n super({\n popupTimeout: MENU_CONSTANTS.numbers.POPUP_MOUSE_LEAVE_TIMEOUT,\n targetTimeout: MENU_CONSTANTS.numbers.CHILD_MOUSE_LEAVE_TIMEOUT\n });\n this._identifier = randomChars();\n this._clickListener = evt => this._onTargetClick(evt);\n this._blurListener = evt => this._onTargetBlur(evt);\n this._selectListener = value => this._handleSelectEvent(value);\n this._keydownListener = evt => this.onKeydown(evt);\n this._activeChangeListener = id => this._onActiveOptionChanged(id);\n }\n\n public initialize(): void {\n this._adapter.initializeTarget();\n this._adapter.initializeAccessibility(this._identifier);\n this._initializeInteractionListeners();\n }\n\n public disconnect(): void {\n if (this._open) {\n this._closeDropdown();\n }\n this._destroyInteractionListeners();\n }\n\n private _applyMode(): void {\n if (!this._adapter.hasTargetElement()) {\n return;\n }\n\n if (this._mode !== 'cascade') {\n this._adapter.addTargetListener('click', this._clickListener);\n } else {\n this._attachCascadingListeners();\n }\n }\n\n private _initializeInteractionListeners(): void {\n if (!this._adapter.hasTargetElement()) {\n return;\n }\n this._applyMode();\n this._adapter.addTargetListener('keydown', this._keydownListener, true);\n this._adapter.addTargetListener('blur', this._blurListener);\n }\n\n private _destroyInteractionListeners(): void {\n if (!this._adapter.hasTargetElement()) {\n return;\n }\n this._adapter.removeTargetListener('keydown', this._clickListener);\n this._adapter.removeTargetListener('blur', this._blurListener);\n this._adapter.removeTargetListener('click', this._clickListener);\n this._detachCascadingListeners();\n }\n\n protected _attachCascadingListeners(): void {\n this._adapter.addTargetListener('mouseenter', this._targetMouseEnterListener);\n this._adapter.addTargetListener('mouseleave', this._targetMouseLeaveListener);\n\n // We listen for document mousemove events only to track mouse coords for use when determining\n // if popups should open/close after specific delays\n this._adapter.addDocumentListener('mousemove', this._documentMouseMoveListener);\n }\n\n protected _detachCascadingListeners(): void {\n this._adapter.removeTargetListener('mouseenter', this._targetMouseEnterListener);\n this._adapter.removeTargetListener('mouseleave', this._targetMouseLeaveListener);\n this._adapter.removeDocumentListener('mousemove', this._documentMouseMoveListener);\n }\n\n private get _nonDividerOptions(): IMenuOption[] {\n return this._flatOptions.filter(o => !o.divider);\n }\n\n private get _flatOptions(): IMenuOption[] {\n if (isListDropdownOptionType(this._options, ListDropdownOptionType.Group)) {\n return (this._options as IMenuOptionGroup[]).reduce((previousValue, currentValue) => previousValue.concat(currentValue.options), [] as IMenuOption[]) as IMenuOption[];\n }\n return this._options as IMenuOption[];\n }\n\n private _onTargetClick(evt: MouseEvent): void {\n if (this._open) {\n this._closeDropdown();\n return;\n }\n this.open = !this._open;\n if (this._open) {\n this._adapter.focusTarget();\n }\n }\n\n private _onTargetBlur(evt: Event): void {\n if (this._open) {\n this._closeDropdown();\n }\n }\n\n private _onActiveOptionChanged(id: string): void {\n // We need to dispatch an event when the active descendant changes to propagate that to the proper target element\n const data: IMenuActiveChangeEventData = { id };\n const canSetActiveDescendant = this._adapter.emitHostEvent(MENU_CONSTANTS.events.ACTIVE_CHANGE, data, true, true);\n if (this._mode !== 'cascade' && canSetActiveDescendant) {\n this._adapter.updateActiveDescendant(id);\n }\n }\n\n public onKeydown(evt: KeyboardEvent): void {\n // If we have any child menus open, we need to proxy the keyboard events to those and exit\n if (this._childOpen) {\n // If escape is pressed while other menus are open then we need to close everything\n if (evt.code === 'Escape') {\n evt.preventDefault();\n this._adapter.closeOtherChildMenus();\n this._closeDropdown();\n return;\n }\n this._adapter.proxyKeyboardEventToChild(evt, this._identifier);\n return;\n }\n\n switch (evt.code) {\n case 'Tab':\n if (this._open) {\n this._selectActiveOption();\n }\n break;\n case 'Escape':\n if (this._open) {\n evt.preventDefault();\n this._closeDropdown();\n }\n break;\n case 'Space':\n evt.preventDefault();\n\n if (this._open) {\n this._closeDropdown();\n } else {\n this._openDropdown();\n }\n break;\n case 'Home':\n case 'End':\n if (this._open) {\n evt.preventDefault();\n this._adapter.propagateKey(evt.code);\n }\n break;\n case 'Enter':\n if (!this._open) {\n return;\n }\n\n evt.stopImmediatePropagation();\n evt.preventDefault();\n\n this._adapter.propagateKey(evt.code);\n\n // Check if we need to toggle the child menu open state\n const activeIndex = this._adapter.getActiveOptionIndex();\n const activeOption = this._nonDividerOptions[activeIndex];\n if (activeOption && activeOption.options && activeOption.options.length) {\n this._adapter.toggleChildMenu(activeIndex);\n }\n break;\n case 'ArrowUp':\n case 'ArrowDown':\n if (this._open) {\n evt.stopImmediatePropagation();\n }\n\n evt.preventDefault();\n\n if (!this._open && evt.code === 'ArrowDown') {\n this._openDropdown();\n this._adapter.activateFirstOption();\n return;\n }\n\n this._adapter.propagateKey(evt.code);\n break;\n case 'ArrowLeft':\n if (this._open) {\n evt.stopImmediatePropagation();\n }\n if (this._mode === 'cascade' && this._open) {\n this._closeDropdown();\n }\n break;\n case 'ArrowRight':\n if (this._open) {\n evt.stopImmediatePropagation();\n }\n if (!this._open) {\n return;\n }\n const hoveredIndex = this._adapter.getActiveOptionIndex();\n const hoveredOption = this._nonDividerOptions[hoveredIndex];\n if (hoveredOption && hoveredOption.options) {\n this._adapter.toggleChildMenu(hoveredIndex, evt.code === 'ArrowRight');\n return;\n }\n break;\n }\n }\n\n private async _openMenu(): Promise<void> {\n this._open = true;\n let options: IMenuOption[] = [];\n\n if (typeof this._optionsFactory === 'function') {\n this._loadOptionsAsync();\n this._options = [];\n } else {\n if (!this._options || !this._options.length) {\n return;\n }\n options = this._options as IMenuOption[];\n }\n\n if (!this._persistSelection) {\n options.forEach(o => o.selected = false);\n }\n\n const flatOptions = this._flatOptions;\n\n // Map the old \"icon\" property to the new \"leadingIcon\" property (if exists)\n flatOptions.filter(o => o.icon).forEach(o => o.leadingIcon = o.icon);\n\n const selectedValues = this._persistSelection ? this._getSelectedValues() : [];\n\n const config: IListDropdownConfig = {\n id: this._identifier,\n type: ListDropdownType.Menu,\n options: this._options,\n selectedValues,\n iconClass: this._iconClass,\n dense: this._dense,\n multiple: false,\n popupStatic: true,\n allowBusy: true,\n asyncStyle: ListDropdownAsyncStyle.Spinner,\n optionBuilder: this._optionBuilder,\n optionLimit: this._optionLimit,\n headerBuilder: this._popupHeaderBuilder,\n footerBuilder: this._popupFooterBuilder,\n observeScroll: this._observeScroll,\n observeScrollThreshold: this._observeScrollThreshold,\n popupPlacement: this._placement,\n activeStartIndex: this._mode === 'cascade' ? 0 : undefined,\n popupClasses: [\n MENU_CONSTANTS.classes.POPUP,\n MENU_CONSTANTS.classes.MENU,\n ...this._popupClasses as string[]\n ],\n syncWidth: this._syncPopupWidth,\n activeChangeCallback: this._activeChangeListener,\n selectCallback: this._selectListener,\n popupOffset: this._popupOffset,\n cascadingElementFactory: params => this._createCascadingElement(params)\n };\n\n this._adapter.setHostAttribute(MENU_CONSTANTS.attributes.OPEN, '');\n this._adapter.attachMenu(config);\n\n // If this menu is in a hover mode, we need to listen for mouse enter/leave events to know when the user is hovering over the popup\n if (this._mode === 'cascade') {\n this._adapter.addDropdownListener('mouseenter', this._childPopupMouseEnterListener);\n this._adapter.addDropdownListener('mouseleave', this._childPopupMouseLeaveListener);\n }\n \n this._adapter.addDropdownListener(MENU_CONSTANTS.events.ACTIVE_CHANGE, (evt: CustomEvent<IMenuActiveChangeEventData>) => {\n this._onActiveOptionChanged(evt.detail.id);\n });\n this._adapter.emitHostEvent(MENU_CONSTANTS.events.OPEN);\n }\n\n private _closeMenu(): void {\n this._open = false;\n this._childOpen = false;\n this._adapter.detachMenu();\n\n if (this._activeMouseLeaveTimeout !== undefined) {\n window.clearTimeout(this._activeMouseLeaveTimeout);\n }\n\n this._adapter.removeHostAttribute(MENU_CONSTANTS.attributes.OPEN);\n this._adapter.emitHostEvent(MENU_CONSTANTS.events.CLOSE);\n }\n\n private _loadOptionsAsync(): Promise<void> {\n if (!this._optionsFactory) {\n if (this._open) {\n this._closeMenu();\n }\n return Promise.resolve();\n }\n\n return Promise.resolve(this._optionsFactory())\n .then(results => {\n if (!this._persistSelection) {\n results.forEach(o => o.selected = false);\n }\n\n if (this._open) {\n if (results && isArray(results) && results.length) {\n this._options = results;\n this._adapter.setOptions(results);\n const selectedValues = this._getSelectedValues();\n if (selectedValues.length) {\n this._adapter.setSelectedValues(selectedValues);\n }\n } else if (this._open) {\n this._closeDropdown();\n }\n }\n })\n .catch(e => {\n console.error('An unexpected error ocurred while opening the menu:', e);\n if (this._open) {\n this._closeDropdown();\n }\n });\n }\n\n private _handleSelectEvent(value: any): void {\n const index = this._nonDividerOptions.findIndex(o => o.value === value);\n if (index < 0) {\n return;\n }\n this._selectOptionByIndex(index);\n }\n\n private _selectActiveOption(): void {\n const index = this._adapter.getActiveOptionIndex();\n if (index >= 0 && this._nonDividerOptions[index]) {\n this._selectOptionByIndex(index);\n }\n }\n\n private _selectOptionByIndex(index: number): void {\n const { options, value } = this._nonDividerOptions[index];\n\n // We ignore selections if the option has child options\n if (options) {\n this._adapter.setActiveOption(index);\n return;\n }\n\n this._closeDropdown();\n \n const data: IMenuSelectEventData = { index, value };\n const isCancelled = !this._adapter.emitHostEvent(MENU_CONSTANTS.events.SELECT, data, true, true);\n if (!isCancelled) {\n this._selectedValue = this._persistSelection ? value : undefined;\n }\n }\n\n private _getSelectedValues(): any[] {\n const values = this._flatOptions.filter(o => o.selected).map(o => o.value);\n if (this._selectedValue !== undefined) {\n values.push(this._selectedValue);\n }\n return values;\n }\n\n /** Called when a child menu option is selected. */\n protected _onCascadingOptionSelected(data: IMenuSelectEventData): void {\n if (this._persistSelection) {\n this._selectedValue = data.value;\n }\n this._adapter.emitHostEvent(MENU_CONSTANTS.events.SELECT, data);\n this._closeDropdown();\n }\n\n /** Called when a child menu is opened off of one of our menu options. */\n protected _onCascadingChildOpen(index: number): void {\n super._clearMouseLeaveTimeout();\n this._adapter.closeOtherChildMenus(index);\n this._childOpen = true;\n this._adapter.setActiveOption(index);\n }\n\n /** Called when a child menu is closed off of one of our menu options. */\n protected _onCascadingChildClose(): void {\n this._childOpen = false;\n }\n\n protected _closeDropdown(): void {\n this._closeMenu();\n }\n\n protected _openDropdown(): void {\n this._openMenu();\n }\n\n protected _isOwnElement(element: Element): boolean {\n return this._adapter.isOwnElement(element);\n }\n\n private _createCascadingElement({ index, options, parentValue }: IListDropdownCascadingElementFactoryConfig): HTMLElement {\n const menu = this._adapter.createChildMenu(\n index,\n parentValue,\n this._onCascadingChildOpen.bind(this),\n this._onCascadingChildClose.bind(this),\n this._onCascadingOptionSelected.bind(this)\n );\n menu.mode = 'cascade';\n menu.popupOffset = { x: 0, y: -8 };\n menu.dense = this._dense;\n menu.placement = 'right-start';\n menu.persistSelection = this._persistSelection;\n if (this._persistSelection) {\n menu.selectedValue = this._selectedValue;\n }\n menu.options = options;\n menu.optionBuilder = this._optionBuilder;\n menu.iconClass = this._iconClass;\n\n return menu;\n }\n\n public get open(): boolean {\n return this._open;\n }\n public set open(value: boolean) {\n value = Boolean(value);\n if (this._open !== value) {\n this._open = value;\n if (value) {\n this._openDropdown();\n } else {\n this._closeDropdown();\n }\n }\n }\n\n public set options(options: IMenuOption[]) {\n if (typeof options === 'function') {\n this.optionsFactory = options;\n } else {\n this.optionsFactory = undefined;\n // Intentional shallow copy of member properties. These member objects have properties that are references to functions.\n // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone\n // function to the core library.\n this._options = options.map(o => ({ ...o }));\n \n if (this._open) {\n this._adapter.setOptions(this._options as IMenuOption[]);\n if (this._persistSelection) {\n const selectedValues = this._getSelectedValues();\n if (selectedValues.length) {\n this._adapter.setSelectedValues(selectedValues);\n }\n }\n }\n }\n }\n public get options(): IMenuOption[] {\n if (!this._options) {\n return [];\n }\n\n // Intentional shallow copy of member properties. These member objects have properties that are references to functions.\n // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone\n // function to the core library.\n return this._flatOptions.map(o => ({ ...o }));\n }\n\n public set optionsFactory(factory: MenuOptionFactory | undefined) {\n this._optionsFactory = factory;\n }\n\n public set selectedIndex(value: number) {\n const option = this._nonDividerOptions[value];\n if (option && option.value !== this._selectedValue) {\n this.selectedValue = option.value;\n }\n }\n public get selectedIndex(): number {\n return this._selectedValue !== undefined ? this._nonDividerOptions.findIndex(o => o.value === this._selectedValue) : -1;\n }\n\n public set selectedValue(value: any) {\n if (this._selectedValue !== value) {\n this._selectedValue = value;\n this._adapter.setSelectedValues(this._selectedValue);\n }\n }\n public get selectedValue(): any {\n return this._selectedValue;\n }\n\n public get placement(): PopupPlacement {\n return this._placement;\n }\n public set placement(value: PopupPlacement) {\n if (this._placement !== value) {\n this._placement = value || 'bottom-start';\n this._adapter.setHostAttribute(MENU_CONSTANTS.attributes.PLACEMENT, this._placement);\n }\n }\n\n public get dense(): boolean {\n return this._dense;\n }\n public set dense(value: boolean) {\n this._dense = value;\n }\n\n public get iconClass(): string {\n return this._iconClass;\n }\n public set iconClass(value: string) {\n this._iconClass = value;\n }\n\n public get persistSelection(): boolean {\n return this._persistSelection;\n }\n public set persistSelection(value: boolean) {\n if (this._persistSelection === value) {\n return;\n }\n\n this._persistSelection = value;\n this._adapter.toggleHostAttribute(MENU_CONSTANTS.attributes.PERSIST_SELECTION, this._persistSelection);\n\n if (!this._persistSelection) {\n this._flatOptions.forEach(o => o.selected = false);\n this._selectedValue = undefined;\n }\n }\n\n public get mode(): MenuMode {\n return this._mode;\n }\n public set mode(value: MenuMode) {\n if (this._mode !== value) {\n this._mode = value;\n this._destroyInteractionListeners();\n this._applyMode();\n this._adapter.setHostAttribute(MENU_CONSTANTS.attributes.MODE, this._mode);\n }\n }\n\n public get popupOffset(): IPopupPosition {\n return this._popupOffset;\n }\n public set popupOffset(value: IPopupPosition) {\n this._popupOffset = value;\n }\n\n public get optionBuilder(): MenuOptionBuilder | undefined {\n return this._optionBuilder;\n }\n public set optionBuilder(cb: MenuOptionBuilder | undefined) {\n this._optionBuilder = cb;\n }\n\n public get popupElement(): HTMLElement | null {\n return this._adapter.getDropdownElement();\n }\n}\n", "import { attachShadowTemplate, coerceBoolean, CustomElement, ensureChildren, FoundationProperty, isDefined } from '@tylertech/forge-core';\nimport { tylIconArrowRight } from '@tylertech/tyler-icons/standard';\nimport { CircularProgressComponent } from '../circular-progress';\nimport { IconRegistry } from '../icon';\nimport { LinearProgressComponent } from '../linear-progress';\nimport { ListComponent } from '../list';\nimport { IListDropdownAware, ListDropdownAware } from '../list-dropdown/list-dropdown-aware';\nimport { IPopupPosition, PopupComponent, PopupPlacement } from '../popup';\nimport { MenuAdapter } from './menu-adapter';\nimport { IMenuActiveChangeEventData, IMenuOption, IMenuOptionGroup, IMenuSelectEventData, MenuMode, MenuOptionBuilder, MenuOptionFactory, MENU_CONSTANTS } from './menu-constants';\nimport { MenuFoundation } from './menu-foundation';\n\nconst template = '<template><slot></slot></template>';\nconst styles = ':host{display:inline-block}:host([hidden]){display:none}';\n\nexport interface IMenuComponent extends IListDropdownAware {\n open: boolean;\n options: Array<IMenuOption | IMenuOptionGroup> | MenuOptionFactory;\n selectedIndex: number;\n selectedValue: number;\n placement: PopupPlacement;\n dense: boolean;\n iconClass: string;\n persistSelection: boolean;\n mode: MenuMode;\n popupOffset: IPopupPosition;\n optionBuilder: MenuOptionBuilder | undefined;\n popupElement: HTMLElement | undefined;\n propagateKeyEvent(evt: KeyboardEvent): void;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'forge-menu': IMenuComponent;\n }\n\n interface HTMLElementEventMap {\n 'forge-menu-select': CustomEvent<IMenuSelectEventData>;\n 'forge-menu-open': CustomEvent<void>;\n 'forge-menu-close': CustomEvent<void>;\n 'forge-menu-active-change': CustomEvent<IMenuActiveChangeEventData>;\n }\n}\n\n/**\n * The web component class behind the `<forge-menu>` custom element.\n * \n * @tag forge-menu\n */\n@CustomElement({\n name: MENU_CONSTANTS.elementName,\n dependencies: [\n PopupComponent,\n ListComponent,\n CircularProgressComponent,\n LinearProgressComponent\n ]\n})\nexport class MenuComponent extends ListDropdownAware implements IMenuComponent {\n public static get observedAttributes(): string[] {\n return [\n MENU_CONSTANTS.attributes.OPEN,\n MENU_CONSTANTS.attributes.PLACEMENT,\n MENU_CONSTANTS.attributes.SELECTED_INDEX,\n MENU_CONSTANTS.attributes.SELECTED_VALUE,\n MENU_CONSTANTS.attributes.DENSE,\n MENU_CONSTANTS.attributes.ICON_CLASS,\n MENU_CONSTANTS.attributes.PERSIST_SELECTION,\n MENU_CONSTANTS.attributes.MODE,\n MENU_CONSTANTS.attributes.SYNC_POPUP_WIDTH,\n MENU_CONSTANTS.attributes.POPUP_CLASSES,\n MENU_CONSTANTS.attributes.OPTION_LIMIT,\n MENU_CONSTANTS.attributes.OBSERVE_SCROLL,\n MENU_CONSTANTS.attributes.OBSERVE_SCROLL_THRESHOLD\n ];\n }\n\n private _foundation: MenuFoundation;\n\n constructor() {\n super();\n IconRegistry.define(tylIconArrowRight);\n this._foundation = new MenuFoundation(new MenuAdapter(this));\n attachShadowTemplate(this, template, styles);\n }\n\n public connectedCallback(): void {\n if (this.children.length) {\n this._foundation.initialize();\n } else {\n ensureChildren(this).then(() => this._foundation.initialize());\n }\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n switch (name) {\n case MENU_CONSTANTS.attributes.OPEN:\n this._foundation.open = isDefined(newValue);\n break;\n case MENU_CONSTANTS.attributes.PLACEMENT:\n this._foundation.placement = newValue as PopupPlacement;\n break;\n case MENU_CONSTANTS.attributes.SELECTED_INDEX:\n this._foundation.selectedIndex = Number(newValue);\n break;\n case MENU_CONSTANTS.attributes.SELECTED_VALUE:\n this._foundation.selectedValue = newValue;\n break;\n case MENU_CONSTANTS.attributes.DENSE:\n this._foundation.dense = coerceBoolean(newValue);\n break;\n case MENU_CONSTANTS.attributes.ICON_CLASS:\n this._foundation.iconClass = newValue;\n break;\n case MENU_CONSTANTS.attributes.PERSIST_SELECTION:\n this.persistSelection = coerceBoolean(newValue);\n break;\n case MENU_CONSTANTS.attributes.MODE:\n this.mode = newValue as MenuMode;\n break;\n }\n }\n\n public disconnectedCallback(): void {\n this._foundation.disconnect();\n }\n\n /** Gets/sets the open state. */\n @FoundationProperty()\n public open: boolean;\n\n /** Gets/sets the array of options to display in the menu. */\n @FoundationProperty()\n public options: Array<IMenuOption | IMenuOptionGroup> | MenuOptionFactory;\n\n /** Gets/sets the selected option to the index. Does not support cascading menus. */\n @FoundationProperty()\n public selectedIndex: number;\n\n /** Gets/sets the value of the option to select. */\n @FoundationProperty()\n public selectedValue: any;\n\n /** Gets/sets the menu placement (default is bottom-left). */\n @FoundationProperty()\n public placement: `${PopupPlacement}`;\n\n /** Gets/sets dense state of the list options used in the menu popup. */\n @FoundationProperty()\n public dense: boolean;\n\n /** Gets/sets the class name to use for option icons. */\n @FoundationProperty()\n public iconClass: string;\n\n /**\n * Gets/sets whether selection of menu items is persisted.\n * @deprecated Please use `<forge-select-dropdown>` for handling selection states.\n */\n @FoundationProperty()\n public persistSelection: boolean;\n\n /** Gets/sets the mode that this menu is using. */\n @FoundationProperty()\n public mode: MenuMode;\n\n /** Sets the position adustment on the internal popup element. */\n @FoundationProperty()\n public popupOffset: IPopupPosition;\n\n /** Sets the callback that will be executed for each option in the dropdown for producing custom option templates. */\n @FoundationProperty()\n public optionBuilder: MenuOptionBuilder;\n\n /** Gets the currently active popup element when the dropdown is open. */\n @FoundationProperty({ set: false })\n public popupElement: HTMLElement | undefined;\n\n /** Force propagates the key event from another element this component. */\n public propagateKeyEvent(evt: KeyboardEvent): void {\n this._foundation.onKeydown(evt);\n }\n}\n", "import { defineCustomElement } from '@tylertech/forge-core';\n\nimport { MenuComponent } from './menu';\n\nexport * from './menu-adapter';\nexport * from './menu-constants';\nexport * from './menu-foundation';\nexport * from './menu';\n\nexport function defineMenuComponent(): void {\n defineCustomElement(MenuComponent);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { COMPONENT_NAME_PREFIX } from '../constants';\nimport { IListDropdownOption, IListDropdownOptionGroup } from '../list-dropdown';\n\nconst elementName: keyof HTMLElementTagNameMap = `${COMPONENT_NAME_PREFIX}menu`;\n\nconst classes = {\n POPUP: 'forge-menu__popup',\n MENU: 'mdc-menu'\n};\n\nconst selectors = {\n TOGGLE: `.${COMPONENT_NAME_PREFIX}menu__toggle, [${elementName}-toggle], button, [type=button]`,\n MENU_LIST: 'forge-list'\n};\n\nconst attributes = {\n OPEN: 'open',\n PLACEMENT: 'placement',\n SELECTED_INDEX: 'selected-index',\n SELECTED_VALUE: 'selected-value',\n DENSE: 'dense',\n ICON_CLASS: 'icon-class',\n PERSIST_SELECTION: 'persist-selection',\n MODE: 'mode',\n SYNC_POPUP_WIDTH: 'sync-popup-width',\n POPUP_CLASSES: 'popup-classes',\n OPTION_LIMIT: 'option-limit',\n OBSERVE_SCROLL: 'observe-scroll',\n OBSERVE_SCROLL_THRESHOLD: 'observe-scroll-threshold'\n};\n\nconst events = {\n SELECT: `${elementName}-select`,\n OPEN: `${elementName}-open`,\n CLOSE: `${elementName}-close`,\n ACTIVE_CHANGE: `${elementName}-active-change`\n};\n\nconst numbers = {\n CHILD_MOUSE_LEAVE_TIMEOUT: 300,\n POPUP_MOUSE_LEAVE_TIMEOUT: 500\n};\n\nexport const MENU_CONSTANTS = {\n elementName,\n classes,\n selectors,\n attributes,\n events,\n numbers\n};\n\nexport interface IMenuSelectEventData<T = any, K = any> {\n index: number;\n value?: T;\n parentValue?: K;\n}\n\nexport interface IMenuActiveChangeEventData {\n id: string;\n}\n\nexport interface IMenuOption<T = any> extends IListDropdownOption<T> {\n icon?: string;\n selected?: boolean;\n}\n\nexport interface IMenuOptionGroup extends IListDropdownOptionGroup {}\n\nexport type MenuOptionBuilder = (option: IMenuOption, parentElement: HTMLElement) => HTMLElement | string | void;\nexport type MenuOptionFactory = (() => IMenuOption[]) | (() => Promise<IMenuOption[]>);\nexport type MenuMode = 'click' | 'cascade';\n", "import { BaseAdapter, IBaseAdapter } from '../core/base/base-adapter';\nimport { IMenuOption } from './index';\nimport { IMenuComponent } from './menu';\nimport { MENU_CONSTANTS, IMenuSelectEventData } from './menu-constants';\nimport { IListDropdownConfig, IListDropdown, ListDropdown } from '../list-dropdown';\nimport { IListComponent, IListItemComponent, LIST_CONSTANTS, LIST_ITEM_CONSTANTS } from '../list';\n\nexport interface IMenuAdapter extends IBaseAdapter {\n getDropdownElement(): HTMLElement | null;\n initializeTarget(): void;\n initializeAccessibility(id: string): void;\n hasTargetElement(): boolean;\n addTargetListener(event: string, callback: (event: Event) => void, bubbles?: boolean): void;\n removeTargetListener(event: string, callback: (event: Event) => void): void;\n attachMenu(config: IListDropdownConfig): void;\n detachMenu(): void;\n setOptions(options: IMenuOption[]): void;\n getActiveOptionIndex(): number;\n setActiveOption(index: number): void;\n activateFirstOption(): void;\n propagateKey(key: string): void;\n proxyKeyboardEventToChild(evt: KeyboardEvent, id: string): void;\n toggleChildMenu(index: number, open?: boolean): void;\n focusTarget(): void;\n isTargetFocused(): boolean;\n updateActiveDescendant(id: string): void;\n isOwnElement(element: Element): boolean;\n addDropdownListener(type: string, listener: (evt: any) => void): void;\n createChildMenu(index: number, parentValue: any, openCb: (index: number) => void, closeCb: (index: number) => void, selectCb: (data: IMenuSelectEventData) => void): IMenuComponent;\n closeOtherChildMenus(excludeIndex?: number): void;\n setSelectedValues(values: any[]): void;\n}\n\nexport class MenuAdapter extends BaseAdapter<IMenuComponent> implements IMenuAdapter {\n private _targetElement: HTMLElement | null;\n private _listDropdown?: IListDropdown;\n private _childMenus = new Map<number, IMenuComponent>();\n\n constructor(component: IMenuComponent) {\n super(component);\n }\n\n public getDropdownElement(): HTMLElement | null {\n return this._listDropdown?.dropdownElement ?? null;\n }\n\n public hasTargetElement(): boolean {\n return !!this._targetElement;\n }\n\n public initializeTarget(): void {\n this._targetElement = this._component.querySelector(MENU_CONSTANTS.selectors.TOGGLE);\n if (!this._targetElement) {\n this._targetElement = this._component.firstElementChild as HTMLElement;\n }\n }\n\n public initializeAccessibility(id: string): void {\n if (!this._targetElement) {\n return;\n }\n\n this._targetElement.setAttribute('aria-atomic', 'true');\n this._targetElement.setAttribute('aria-live', 'assertive');\n this._targetElement.setAttribute('aria-haspopup', 'true');\n this._targetElement.setAttribute('aria-expanded', 'false');\n\n if (!this._targetElement.hasAttribute('aria-label')) {\n this._targetElement.setAttribute('aria-label', this._targetElement.textContent || '');\n }\n }\n\n public addTargetListener(event: string, callback: (event: Event) => void, bubbles = false): void {\n if (this._targetElement) {\n this._targetElement.addEventListener(event, callback, bubbles);\n }\n }\n\n public removeTargetListener(event: string, callback: (event: Event) => void): void {\n if (this._targetElement) {\n this._targetElement.removeEventListener(event, callback);\n }\n }\n\n public attachMenu(config: IListDropdownConfig): void {\n if (this._listDropdown || !this._targetElement) {\n return;\n }\n this._listDropdown = new ListDropdown(this._targetElement as HTMLElement, config);\n this._listDropdown.open();\n this._targetElement.setAttribute('aria-expanded', 'true');\n this._targetElement.setAttribute('aria-controls', `list-dropdown-popup-${config.id}`);\n }\n\n public setOptions(options: IMenuOption[]): void {\n if (this._listDropdown) {\n this._listDropdown.setOptions(options);\n }\n }\n\n public detachMenu(): void {\n if (this._targetElement) {\n this._targetElement.removeAttribute('aria-activedescendant');\n this._targetElement.removeAttribute('aria-expanded');\n this._targetElement.removeAttribute('aria-controls');\n }\n\n if (this._listDropdown) {\n this._listDropdown.close();\n this._listDropdown.destroy();\n this._listDropdown = undefined;\n }\n }\n\n public setActiveOption(index: number): void {\n this._listDropdown?.activateOption(index);\n }\n\n public activateFirstOption(): void {\n this._listDropdown?.activateFirstOption();\n }\n\n public getActiveOptionIndex(): number {\n return this._listDropdown?.getActiveOptionIndex() ?? -1;\n }\n\n public focusTarget(): void {\n if (this._targetElement) {\n this._targetElement.focus();\n }\n }\n\n public isTargetFocused(): boolean {\n return document.activeElement === this._targetElement;\n }\n\n public updateActiveDescendant(id: string): void {\n if (!this._targetElement) {\n return;\n }\n if (id) {\n this._targetElement.setAttribute('aria-activedescendant', id);\n } else {\n this._targetElement.removeAttribute('aria-activedescendant');\n }\n }\n\n public addDropdownListener(type: string, listener: (evt: any) => void): void {\n if (!this._listDropdown || !this._listDropdown.dropdownElement) {\n return;\n }\n this._listDropdown.dropdownElement.addEventListener(type, listener);\n }\n\n public isOwnElement(el: Element): boolean {\n if (!this._targetElement || !this._listDropdown || !this._listDropdown.dropdownElement) {\n return false;\n }\n return this._targetElement.contains(el) || !!this._listDropdown.dropdownElement.contains(el);\n }\n\n public propagateKey(key: string): void {\n this._listDropdown?.handleKey(key);\n }\n\n public proxyKeyboardEventToChild(evt: KeyboardEvent, id: string): void {\n if (!this.getDropdownElement()) {\n return;\n }\n const openMenu = this._getOpenChildMenu(id);\n if (openMenu) {\n openMenu.propagateKeyEvent(evt);\n }\n }\n\n public toggleChildMenu(index: number, open?: boolean): void {\n const listItems = this._getListItems();\n const listItem = listItems[index];\n const childMenu = listItem.parentElement as IMenuComponent;\n if (childMenu && childMenu.tagName.toLowerCase() === MENU_CONSTANTS.elementName) {\n if (open === undefined) {\n childMenu.open = !childMenu.open;\n } else {\n childMenu.open = open;\n }\n }\n }\n\n public createChildMenu(index: number, parentValue: any, openCb: (index: number) => void, closeCb: (index: number) => void, selectCb: (data: IMenuSelectEventData) => void): IMenuComponent {\n const menu = document.createElement('forge-menu');\n menu.style.display = 'block';\n\n // Set listeners to notify the parent menu when anything important happens within a child menu that needs to be propagated to the root menu\n menu.addEventListener(MENU_CONSTANTS.events.OPEN, () => {\n this._childMenus.set(index, menu);\n openCb(index);\n });\n menu.addEventListener(MENU_CONSTANTS.events.CLOSE, () => {\n this._childMenus.delete(index);\n closeCb(index);\n });\n menu.addEventListener(MENU_CONSTANTS.events.SELECT, (evt: CustomEvent<IMenuSelectEventData>) => {\n evt.stopPropagation();\n selectCb({ ...evt.detail, parentValue });\n });\n\n return menu;\n }\n\n public closeOtherChildMenus(excludeIndex?: number): void {\n const menusToRemove: number[] = [];\n this._childMenus.forEach((menu, index) => {\n if (index !== excludeIndex) {\n menu.open = false;\n menusToRemove.push(index);\n }\n });\n menusToRemove.forEach(index => this._childMenus.delete(index));\n }\n\n public setSelectedValues(values: any[]): void {\n this._listDropdown?.setSelectedValues(values);\n }\n\n private _getOpenChildMenu(id: string): IMenuComponent | null {\n if (!this.getDropdownElement()) {\n return null;\n }\n const list = this._getOwnList(id);\n return list ? list.querySelector(`${MENU_CONSTANTS.elementName}[${MENU_CONSTANTS.attributes.OPEN}]`) : null;\n }\n\n private _getOwnList(id: string): IListComponent | null {\n const popup = this.getDropdownElement();\n if (!popup) {\n return null;\n }\n return popup.querySelector(`${LIST_CONSTANTS.elementName}[id=\"list-dropdown-list-${id}\"]`);\n }\n\n private _getListItems(): IListItemComponent[] {\n const popup = this.getDropdownElement();\n if (!popup) {\n return [];\n }\n const listElement = popup.querySelector(LIST_CONSTANTS.elementName);\n if (listElement) {\n return Array.from(listElement.querySelectorAll(LIST_ITEM_CONSTANTS.elementName)) as IListItemComponent[];\n }\n return [];\n }\n}\n", "import { ICustomElementFoundation, isArray, randomChars } from '@tylertech/forge-core';\nimport { ICON_CLASS_NAME } from '../constants';\nimport { CascadingListDropdownAwareFoundation, IListDropdownCascadingElementFactoryConfig, IListDropdownConfig, ListDropdownAsyncStyle, ListDropdownType } from '../list-dropdown';\nimport { isListDropdownOptionType, ListDropdownOptionType } from '../list-dropdown/list-dropdown-utils';\nimport { IPopupPosition, PopupPlacement } from '../popup';\nimport { IMenuOption } from './index';\nimport { IMenuAdapter } from './menu-adapter';\nimport { IMenuActiveChangeEventData, IMenuOptionGroup, IMenuSelectEventData, MenuMode, MenuOptionBuilder, MenuOptionFactory, MENU_CONSTANTS } from './menu-constants';\n\nexport interface IMenuFoundation extends ICustomElementFoundation {\n initialize(): void;\n disconnect(): void;\n onKeydown(evt: KeyboardEvent): void;\n open: boolean;\n options: Array<IMenuOption | IMenuOptionGroup>;\n optionsFactory: MenuOptionFactory | undefined;\n selectedIndex: number;\n selectedValue: any;\n placement: string;\n dense: boolean;\n iconClass: string;\n persistSelection: boolean;\n mode: MenuMode;\n popupOffset: IPopupPosition;\n optionBuilder: MenuOptionBuilder | undefined;\n}\n\nexport class MenuFoundation extends CascadingListDropdownAwareFoundation<IMenuOption | IMenuOptionGroup> implements IMenuFoundation {\n private _optionsFactory: MenuOptionFactory | undefined;\n private _placement: PopupPlacement = 'bottom-start';\n private _dense = false;\n private _selectedValue: any;\n private _iconClass = ICON_CLASS_NAME;\n private _persistSelection = false;\n private _mode: MenuMode = 'click';\n private _popupOffset: IPopupPosition;\n private _optionBuilder: MenuOptionBuilder | undefined;\n private _identifier: string;\n private _clickListener: (evt: MouseEvent) => void;\n private _blurListener: (evt: MouseEvent) => void;\n private _selectListener: (value: any) => void;\n private _keydownListener: (evt: KeyboardEvent) => void;\n private _activeChangeListener: (id: string) => void;\n \n constructor(private _adapter: IMenuAdapter) {\n super({\n popupTimeout: MENU_CONSTANTS.numbers.POPUP_MOUSE_LEAVE_TIMEOUT,\n targetTimeout: MENU_CONSTANTS.numbers.CHILD_MOUSE_LEAVE_TIMEOUT\n });\n this._identifier = randomChars();\n this._clickListener = evt => this._onTargetClick(evt);\n this._blurListener = evt => this._onTargetBlur(evt);\n this._selectListener = value => this._handleSelectEvent(value);\n this._keydownListener = evt => this.onKeydown(evt);\n this._activeChangeListener = id => this._onActiveOptionChanged(id);\n }\n\n public initialize(): void {\n this._adapter.initializeTarget();\n this._adapter.initializeAccessibility(this._identifier);\n this._initializeInteractionListeners();\n }\n\n public disconnect(): void {\n if (this._open) {\n this._closeDropdown();\n }\n this._destroyInteractionListeners();\n }\n\n private _applyMode(): void {\n if (!this._adapter.hasTargetElement()) {\n return;\n }\n\n if (this._mode !== 'cascade') {\n this._adapter.addTargetListener('click', this._clickListener);\n } else {\n this._attachCascadingListeners();\n }\n }\n\n private _initializeInteractionListeners(): void {\n if (!this._adapter.hasTargetElement()) {\n return;\n }\n this._applyMode();\n this._adapter.addTargetListener('keydown', this._keydownListener, true);\n this._adapter.addTargetListener('blur', this._blurListener);\n }\n\n private _destroyInteractionListeners(): void {\n if (!this._adapter.hasTargetElement()) {\n return;\n }\n this._adapter.removeTargetListener('keydown', this._clickListener);\n this._adapter.removeTargetListener('blur', this._blurListener);\n this._adapter.removeTargetListener('click', this._clickListener);\n this._detachCascadingListeners();\n }\n\n protected _attachCascadingListeners(): void {\n this._adapter.addTargetListener('mouseenter', this._targetMouseEnterListener);\n this._adapter.addTargetListener('mouseleave', this._targetMouseLeaveListener);\n\n // We listen for document mousemove events only to track mouse coords for use when determining\n // if popups should open/close after specific delays\n this._adapter.addDocumentListener('mousemove', this._documentMouseMoveListener);\n }\n\n protected _detachCascadingListeners(): void {\n this._adapter.removeTargetListener('mouseenter', this._targetMouseEnterListener);\n this._adapter.removeTargetListener('mouseleave', this._targetMouseLeaveListener);\n this._adapter.removeDocumentListener('mousemove', this._documentMouseMoveListener);\n }\n\n private get _nonDividerOptions(): IMenuOption[] {\n return this._flatOptions.filter(o => !o.divider);\n }\n\n private get _flatOptions(): IMenuOption[] {\n if (isListDropdownOptionType(this._options, ListDropdownOptionType.Group)) {\n return (this._options as IMenuOptionGroup[]).reduce((previousValue, currentValue) => previousValue.concat(currentValue.options), [] as IMenuOption[]) as IMenuOption[];\n }\n return this._options as IMenuOption[];\n }\n\n private _onTargetClick(evt: MouseEvent): void {\n if (this._open) {\n this._closeDropdown();\n return;\n }\n this.open = !this._open;\n if (this._open) {\n this._adapter.focusTarget();\n }\n }\n\n private _onTargetBlur(evt: Event): void {\n if (this._open) {\n this._closeDropdown();\n }\n }\n\n private _onActiveOptionChanged(id: string): void {\n // We need to dispatch an event when the active descendant changes to propagate that to the proper target element\n const data: IMenuActiveChangeEventData = { id };\n const canSetActiveDescendant = this._adapter.emitHostEvent(MENU_CONSTANTS.events.ACTIVE_CHANGE, data, true, true);\n if (this._mode !== 'cascade' && canSetActiveDescendant) {\n this._adapter.updateActiveDescendant(id);\n }\n }\n\n public onKeydown(evt: KeyboardEvent): void {\n // If we have any child menus open, we need to proxy the keyboard events to those and exit\n if (this._childOpen) {\n // If escape is pressed while other menus are open then we need to close everything\n if (evt.code === 'Escape') {\n evt.preventDefault();\n this._adapter.closeOtherChildMenus();\n this._closeDropdown();\n return;\n }\n this._adapter.proxyKeyboardEventToChild(evt, this._identifier);\n return;\n }\n\n switch (evt.code) {\n case 'Tab':\n if (this._open) {\n this._selectActiveOption();\n }\n break;\n case 'Escape':\n if (this._open) {\n evt.preventDefault();\n this._closeDropdown();\n }\n break;\n case 'Space':\n evt.preventDefault();\n\n if (this._open) {\n this._closeDropdown();\n } else {\n this._openDropdown();\n }\n break;\n case 'Home':\n case 'End':\n if (this._open) {\n evt.preventDefault();\n this._adapter.propagateKey(evt.code);\n }\n break;\n case 'Enter':\n if (!this._open) {\n return;\n }\n\n evt.stopImmediatePropagation();\n evt.preventDefault();\n\n this._adapter.propagateKey(evt.code);\n\n // Check if we need to toggle the child menu open state\n const activeIndex = this._adapter.getActiveOptionIndex();\n const activeOption = this._nonDividerOptions[activeIndex];\n if (activeOption && activeOption.options && activeOption.options.length) {\n this._adapter.toggleChildMenu(activeIndex);\n }\n break;\n case 'ArrowUp':\n case 'ArrowDown':\n if (this._open) {\n evt.stopImmediatePropagation();\n }\n\n evt.preventDefault();\n\n if (!this._open && evt.code === 'ArrowDown') {\n this._openDropdown();\n this._adapter.activateFirstOption();\n return;\n }\n\n this._adapter.propagateKey(evt.code);\n break;\n case 'ArrowLeft':\n if (this._open) {\n evt.stopImmediatePropagation();\n }\n if (this._mode === 'cascade' && this._open) {\n this._closeDropdown();\n }\n break;\n case 'ArrowRight':\n if (this._open) {\n evt.stopImmediatePropagation();\n }\n if (!this._open) {\n return;\n }\n const hoveredIndex = this._adapter.getActiveOptionIndex();\n const hoveredOption = this._nonDividerOptions[hoveredIndex];\n if (hoveredOption && hoveredOption.options) {\n this._adapter.toggleChildMenu(hoveredIndex, evt.code === 'ArrowRight');\n return;\n }\n break;\n }\n }\n\n private async _openMenu(): Promise<void> {\n this._open = true;\n let options: IMenuOption[] = [];\n\n if (typeof this._optionsFactory === 'function') {\n this._loadOptionsAsync();\n this._options = [];\n } else {\n if (!this._options || !this._options.length) {\n return;\n }\n options = this._options as IMenuOption[];\n }\n\n if (!this._persistSelection) {\n options.forEach(o => o.selected = false);\n }\n\n this._mapIconToLeadingIcon();\n\n const selectedValues = this._persistSelection ? this._getSelectedValues() : [];\n\n const config: IListDropdownConfig = {\n id: this._identifier,\n type: ListDropdownType.Menu,\n options: this._options,\n selectedValues,\n iconClass: this._iconClass,\n dense: this._dense,\n multiple: false,\n popupStatic: true,\n allowBusy: true,\n asyncStyle: ListDropdownAsyncStyle.Spinner,\n optionBuilder: this._optionBuilder,\n optionLimit: this._optionLimit,\n headerBuilder: this._popupHeaderBuilder,\n footerBuilder: this._popupFooterBuilder,\n observeScroll: this._observeScroll,\n observeScrollThreshold: this._observeScrollThreshold,\n popupPlacement: this._placement,\n activeStartIndex: this._mode === 'cascade' ? 0 : undefined,\n popupClasses: [\n MENU_CONSTANTS.classes.POPUP,\n MENU_CONSTANTS.classes.MENU,\n ...this._popupClasses as string[]\n ],\n syncWidth: this._syncPopupWidth,\n activeChangeCallback: this._activeChangeListener,\n selectCallback: this._selectListener,\n popupOffset: this._popupOffset,\n cascadingElementFactory: params => this._createCascadingElement(params)\n };\n\n this._adapter.setHostAttribute(MENU_CONSTANTS.attributes.OPEN, '');\n this._adapter.attachMenu(config);\n\n // If this menu is in a hover mode, we need to listen for mouse enter/leave events to know when the user is hovering over the popup\n if (this._mode === 'cascade') {\n this._adapter.addDropdownListener('mouseenter', this._childPopupMouseEnterListener);\n this._adapter.addDropdownListener('mouseleave', this._childPopupMouseLeaveListener);\n }\n \n this._adapter.addDropdownListener(MENU_CONSTANTS.events.ACTIVE_CHANGE, (evt: CustomEvent<IMenuActiveChangeEventData>) => {\n this._onActiveOptionChanged(evt.detail.id);\n });\n this._adapter.emitHostEvent(MENU_CONSTANTS.events.OPEN);\n }\n\n private _closeMenu(): void {\n this._open = false;\n this._childOpen = false;\n this._adapter.detachMenu();\n\n if (this._activeMouseLeaveTimeout !== undefined) {\n window.clearTimeout(this._activeMouseLeaveTimeout);\n }\n\n this._adapter.removeHostAttribute(MENU_CONSTANTS.attributes.OPEN);\n this._adapter.emitHostEvent(MENU_CONSTANTS.events.CLOSE);\n }\n\n private _loadOptionsAsync(): Promise<void> {\n if (!this._optionsFactory) {\n if (this._open) {\n this._closeMenu();\n }\n return Promise.resolve();\n }\n\n return Promise.resolve(this._optionsFactory())\n .then(results => {\n if (!this._persistSelection) {\n results.forEach(o => o.selected = false);\n }\n\n if (this._open) {\n if (results && isArray(results) && results.length) {\n this._options = results;\n this._adapter.setOptions(results);\n const selectedValues = this._getSelectedValues();\n if (selectedValues.length) {\n this._adapter.setSelectedValues(selectedValues);\n }\n } else if (this._open) {\n this._closeDropdown();\n }\n }\n })\n .catch(e => {\n console.error('An unexpected error ocurred while opening the menu:', e);\n if (this._open) {\n this._closeDropdown();\n }\n });\n }\n\n private _handleSelectEvent(value: any): void {\n const index = this._nonDividerOptions.findIndex(o => o.value === value);\n if (index < 0) {\n return;\n }\n this._selectOptionByIndex(index);\n }\n\n private _selectActiveOption(): void {\n const index = this._adapter.getActiveOptionIndex();\n if (index >= 0 && this._nonDividerOptions[index]) {\n this._selectOptionByIndex(index);\n }\n }\n\n private _selectOptionByIndex(index: number): void {\n const { options, value } = this._nonDividerOptions[index];\n\n // We ignore selections if the option has child options\n if (options) {\n this._adapter.setActiveOption(index);\n return;\n }\n\n this._closeDropdown();\n \n const data: IMenuSelectEventData = { index, value };\n const isCancelled = !this._adapter.emitHostEvent(MENU_CONSTANTS.events.SELECT, data, true, true);\n if (!isCancelled) {\n this._selectedValue = this._persistSelection ? value : undefined;\n }\n }\n\n private _getSelectedValues(): any[] {\n const values = this._flatOptions.filter(o => o.selected).map(o => o.value);\n if (this._selectedValue !== undefined) {\n values.push(this._selectedValue);\n }\n return values;\n }\n\n /** Called when a child menu option is selected. */\n protected _onCascadingOptionSelected(data: IMenuSelectEventData): void {\n if (this._persistSelection) {\n this._selectedValue = data.value;\n }\n this._adapter.emitHostEvent(MENU_CONSTANTS.events.SELECT, data);\n this._closeDropdown();\n }\n\n /** Called when a child menu is opened off of one of our menu options. */\n protected _onCascadingChildOpen(index: number): void {\n super._clearMouseLeaveTimeout();\n this._adapter.closeOtherChildMenus(index);\n this._childOpen = true;\n this._adapter.setActiveOption(index);\n }\n\n /** Called when a child menu is closed off of one of our menu options. */\n protected _onCascadingChildClose(): void {\n this._childOpen = false;\n }\n\n protected _closeDropdown(): void {\n this._closeMenu();\n }\n\n protected _openDropdown(): void {\n this._openMenu();\n }\n\n protected _isOwnElement(element: Element): boolean {\n return this._adapter.isOwnElement(element);\n }\n\n private _createCascadingElement({ index, options, parentValue }: IListDropdownCascadingElementFactoryConfig): HTMLElement {\n const menu = this._adapter.createChildMenu(\n index,\n parentValue,\n this._onCascadingChildOpen.bind(this),\n this._onCascadingChildClose.bind(this),\n this._onCascadingOptionSelected.bind(this)\n );\n menu.mode = 'cascade';\n menu.popupOffset = { x: 0, y: -8 };\n menu.dense = this._dense;\n menu.placement = 'right-start';\n menu.persistSelection = this._persistSelection;\n if (this._persistSelection) {\n menu.selectedValue = this._selectedValue;\n }\n menu.options = options;\n menu.optionBuilder = this._optionBuilder;\n menu.iconClass = this._iconClass;\n\n return menu;\n }\n\n private _mapIconToLeadingIcon(): void {\n // For backwards compatibility with old API, map the old \"icon\" property to the new \"leadingIcon\" property (if exists)\n this._flatOptions.filter(o => o.icon).forEach(o => o.leadingIcon = o.icon);\n }\n\n public get open(): boolean {\n return this._open;\n }\n public set open(value: boolean) {\n value = Boolean(value);\n if (this._open !== value) {\n this._open = value;\n if (value) {\n this._openDropdown();\n } else {\n this._closeDropdown();\n }\n }\n }\n\n public set options(options: IMenuOption[]) {\n if (typeof options === 'function') {\n this.optionsFactory = options;\n } else {\n this.optionsFactory = undefined;\n // Intentional shallow copy of member properties. These member objects have properties that are references to functions.\n // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone\n // function to the core library.\n this._options = options.map(o => ({ ...o }));\n \n if (this._open) {\n this._mapIconToLeadingIcon();\n this._adapter.setOptions(this._options as IMenuOption[]);\n if (this._persistSelection) {\n const selectedValues = this._getSelectedValues();\n if (selectedValues.length) {\n this._adapter.setSelectedValues(selectedValues);\n }\n }\n }\n }\n }\n public get options(): IMenuOption[] {\n if (!this._options) {\n return [];\n }\n\n // Intentional shallow copy of member properties. These member objects have properties that are references to functions.\n // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone\n // function to the core library.\n return this._flatOptions.map(o => ({ ...o }));\n }\n\n public set optionsFactory(factory: MenuOptionFactory | undefined) {\n this._optionsFactory = factory;\n }\n\n public set selectedIndex(value: number) {\n const option = this._nonDividerOptions[value];\n if (option && option.value !== this._selectedValue) {\n this.selectedValue = option.value;\n }\n }\n public get selectedIndex(): number {\n return this._selectedValue !== undefined ? this._nonDividerOptions.findIndex(o => o.value === this._selectedValue) : -1;\n }\n\n public set selectedValue(value: any) {\n if (this._selectedValue !== value) {\n this._selectedValue = value;\n this._adapter.setSelectedValues(this._selectedValue);\n }\n }\n public get selectedValue(): any {\n return this._selectedValue;\n }\n\n public get placement(): PopupPlacement {\n return this._placement;\n }\n public set placement(value: PopupPlacement) {\n if (this._placement !== value) {\n this._placement = value || 'bottom-start';\n this._adapter.setHostAttribute(MENU_CONSTANTS.attributes.PLACEMENT, this._placement);\n }\n }\n\n public get dense(): boolean {\n return this._dense;\n }\n public set dense(value: boolean) {\n this._dense = value;\n }\n\n public get iconClass(): string {\n return this._iconClass;\n }\n public set iconClass(value: string) {\n this._iconClass = value;\n }\n\n public get persistSelection(): boolean {\n return this._persistSelection;\n }\n public set persistSelection(value: boolean) {\n if (this._persistSelection === value) {\n return;\n }\n\n this._persistSelection = value;\n this._adapter.toggleHostAttribute(MENU_CONSTANTS.attributes.PERSIST_SELECTION, this._persistSelection);\n\n if (!this._persistSelection) {\n this._flatOptions.forEach(o => o.selected = false);\n this._selectedValue = undefined;\n }\n }\n\n public get mode(): MenuMode {\n return this._mode;\n }\n public set mode(value: MenuMode) {\n if (this._mode !== value) {\n this._mode = value;\n this._destroyInteractionListeners();\n this._applyMode();\n this._adapter.setHostAttribute(MENU_CONSTANTS.attributes.MODE, this._mode);\n }\n }\n\n public get popupOffset(): IPopupPosition {\n return this._popupOffset;\n }\n public set popupOffset(value: IPopupPosition) {\n this._popupOffset = value;\n }\n\n public get optionBuilder(): MenuOptionBuilder | undefined {\n return this._optionBuilder;\n }\n public set optionBuilder(cb: MenuOptionBuilder | undefined) {\n this._optionBuilder = cb;\n }\n\n public get popupElement(): HTMLElement | null {\n return this._adapter.getDropdownElement();\n }\n}\n", "import { attachShadowTemplate, coerceBoolean, CustomElement, ensureChildren, FoundationProperty, isDefined } from '@tylertech/forge-core';\nimport { tylIconArrowRight } from '@tylertech/tyler-icons/standard';\nimport { CircularProgressComponent } from '../circular-progress';\nimport { IconRegistry } from '../icon';\nimport { LinearProgressComponent } from '../linear-progress';\nimport { ListComponent } from '../list';\nimport { IListDropdownAware, ListDropdownAware } from '../list-dropdown/list-dropdown-aware';\nimport { IPopupPosition, PopupComponent, PopupPlacement } from '../popup';\nimport { MenuAdapter } from './menu-adapter';\nimport { IMenuActiveChangeEventData, IMenuOption, IMenuOptionGroup, IMenuSelectEventData, MenuMode, MenuOptionBuilder, MenuOptionFactory, MENU_CONSTANTS } from './menu-constants';\nimport { MenuFoundation } from './menu-foundation';\n\nconst template = '<template><slot></slot></template>';\nconst styles = ':host{display:inline-block}:host([hidden]){display:none}';\n\nexport interface IMenuComponent extends IListDropdownAware {\n open: boolean;\n options: Array<IMenuOption | IMenuOptionGroup> | MenuOptionFactory;\n selectedIndex: number;\n selectedValue: number;\n placement: PopupPlacement;\n dense: boolean;\n iconClass: string;\n persistSelection: boolean;\n mode: MenuMode;\n popupOffset: IPopupPosition;\n optionBuilder: MenuOptionBuilder | undefined;\n popupElement: HTMLElement | undefined;\n propagateKeyEvent(evt: KeyboardEvent): void;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'forge-menu': IMenuComponent;\n }\n\n interface HTMLElementEventMap {\n 'forge-menu-select': CustomEvent<IMenuSelectEventData>;\n 'forge-menu-open': CustomEvent<void>;\n 'forge-menu-close': CustomEvent<void>;\n 'forge-menu-active-change': CustomEvent<IMenuActiveChangeEventData>;\n }\n}\n\n/**\n * The web component class behind the `<forge-menu>` custom element.\n * \n * @tag forge-menu\n */\n@CustomElement({\n name: MENU_CONSTANTS.elementName,\n dependencies: [\n PopupComponent,\n ListComponent,\n CircularProgressComponent,\n LinearProgressComponent\n ]\n})\nexport class MenuComponent extends ListDropdownAware implements IMenuComponent {\n public static get observedAttributes(): string[] {\n return [\n MENU_CONSTANTS.attributes.OPEN,\n MENU_CONSTANTS.attributes.PLACEMENT,\n MENU_CONSTANTS.attributes.SELECTED_INDEX,\n MENU_CONSTANTS.attributes.SELECTED_VALUE,\n MENU_CONSTANTS.attributes.DENSE,\n MENU_CONSTANTS.attributes.ICON_CLASS,\n MENU_CONSTANTS.attributes.PERSIST_SELECTION,\n MENU_CONSTANTS.attributes.MODE,\n MENU_CONSTANTS.attributes.SYNC_POPUP_WIDTH,\n MENU_CONSTANTS.attributes.POPUP_CLASSES,\n MENU_CONSTANTS.attributes.OPTION_LIMIT,\n MENU_CONSTANTS.attributes.OBSERVE_SCROLL,\n MENU_CONSTANTS.attributes.OBSERVE_SCROLL_THRESHOLD\n ];\n }\n\n private _foundation: MenuFoundation;\n\n constructor() {\n super();\n IconRegistry.define(tylIconArrowRight);\n this._foundation = new MenuFoundation(new MenuAdapter(this));\n attachShadowTemplate(this, template, styles);\n }\n\n public connectedCallback(): void {\n if (this.children.length) {\n this._foundation.initialize();\n } else {\n ensureChildren(this).then(() => this._foundation.initialize());\n }\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n switch (name) {\n case MENU_CONSTANTS.attributes.OPEN:\n this._foundation.open = isDefined(newValue);\n break;\n case MENU_CONSTANTS.attributes.PLACEMENT:\n this._foundation.placement = newValue as PopupPlacement;\n break;\n case MENU_CONSTANTS.attributes.SELECTED_INDEX:\n this._foundation.selectedIndex = Number(newValue);\n break;\n case MENU_CONSTANTS.attributes.SELECTED_VALUE:\n this._foundation.selectedValue = newValue;\n break;\n case MENU_CONSTANTS.attributes.DENSE:\n this._foundation.dense = coerceBoolean(newValue);\n break;\n case MENU_CONSTANTS.attributes.ICON_CLASS:\n this._foundation.iconClass = newValue;\n break;\n case MENU_CONSTANTS.attributes.PERSIST_SELECTION:\n this.persistSelection = coerceBoolean(newValue);\n break;\n case MENU_CONSTANTS.attributes.MODE:\n this.mode = newValue as MenuMode;\n break;\n }\n }\n\n public disconnectedCallback(): void {\n this._foundation.disconnect();\n }\n\n /** Gets/sets the open state. */\n @FoundationProperty()\n public open: boolean;\n\n /** Gets/sets the array of options to display in the menu. */\n @FoundationProperty()\n public options: Array<IMenuOption | IMenuOptionGroup> | MenuOptionFactory;\n\n /** Gets/sets the selected option to the index. Does not support cascading menus. */\n @FoundationProperty()\n public selectedIndex: number;\n\n /** Gets/sets the value of the option to select. */\n @FoundationProperty()\n public selectedValue: any;\n\n /** Gets/sets the menu placement (default is bottom-left). */\n @FoundationProperty()\n public placement: `${PopupPlacement}`;\n\n /** Gets/sets dense state of the list options used in the menu popup. */\n @FoundationProperty()\n public dense: boolean;\n\n /** Gets/sets the class name to use for option icons. */\n @FoundationProperty()\n public iconClass: string;\n\n /**\n * Gets/sets whether selection of menu items is persisted.\n * @deprecated Please use `<forge-select-dropdown>` for handling selection states.\n */\n @FoundationProperty()\n public persistSelection: boolean;\n\n /** Gets/sets the mode that this menu is using. */\n @FoundationProperty()\n public mode: MenuMode;\n\n /** Sets the position adustment on the internal popup element. */\n @FoundationProperty()\n public popupOffset: IPopupPosition;\n\n /** Sets the callback that will be executed for each option in the dropdown for producing custom option templates. */\n @FoundationProperty()\n public optionBuilder: MenuOptionBuilder;\n\n /** Gets the currently active popup element when the dropdown is open. */\n @FoundationProperty({ set: false })\n public popupElement: HTMLElement | undefined;\n\n /** Force propagates the key event from another element this component. */\n public propagateKeyEvent(evt: KeyboardEvent): void {\n this._foundation.onKeydown(evt);\n }\n}\n", "import { defineCustomElement } from '@tylertech/forge-core';\n\nimport { MenuComponent } from './menu';\n\nexport * from './menu-adapter';\nexport * from './menu-constants';\nexport * from './menu-foundation';\nexport * from './menu';\n\nexport function defineMenuComponent(): void {\n defineCustomElement(MenuComponent);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,5 +3,5 @@
3
3
  * Copyright 2022 Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- import{a as rt}from"./chunk.E37HEAJ5.js";import{d as at}from"./chunk.57XBS3DF.js";import{a as f,b as nt}from"./chunk.IMK2LFWR.js";import{h as st}from"./chunk.WGE5R5JK.js";import{c as et}from"./chunk.D3DLVPPE.js";import{e as tt}from"./chunk.7JTKKFL4.js";import{e as it}from"./chunk.DRFU6POI.js";import{a as E,b as ot}from"./chunk.G5BCWBD5.js";import{j as K}from"./chunk.LZMYHIO2.js";import{a as F}from"./chunk.D4SNVKDA.js";import{a as Q,d as Z,l as w}from"./chunk.7TQYFMM4.js";import{a as $}from"./chunk.24D46RLZ.js";import{g as J}from"./chunk.7ZS4N2FT.js";import{j as b,k as X,m as G,n as q,o as Y,p as j}from"./chunk.AABG6MSC.js";import{a as z}from"./chunk.A23NSEWA.js";import{a as u}from"./chunk.B3IJU6XJ.js";import{a as R,b as B}from"./chunk.BSZ2LBJX.js";import{a as W}from"./chunk.3E5QKMHL.js";import{a as N,e as H,g as V,i as U}from"./chunk.HN4PXH3D.js";import{m as A,s as P,u as x}from"./chunk.R4NDFXVA.js";import{a as S,k as c,l as L,o as y}from"./chunk.G76HB2FK.js";import{a as k,f as p}from"./chunk.MCIQXNKY.js";var h=`${B}time-picker`,lt={TOGGLE:"forge-time-picker-toggle",VALUE:"value",OPEN:"open",ALLOW_SECONDS:"allow-seconds",MASKED:"masked",SHOW_MASK_FORMAT:"show-mask-format",USE_24_HOUR_TIME:"use-24-hour-time",ALLOW_INVALID_TIME:"allow-invalid-time",MIN:"min",MAX:"max",START_TIME:"start-time",STEP:"step",ALLOW_INPUT:"allow-input",SHOW_NOW:"show-now",SHOW_HOUR_OPTIONS:"show-hour-options",DISABLED:"disabled",POPUP_CLASSES:"popup-classes",ALLOW_DROPDOWN:"allow-dropdown"},ft={INPUT:"input, input[forge-time-picker-input]",TOGGLE:`[${lt.TOGGLE}]`},gt={OPEN:`${h}-open`,CLOSE:`${h}-close`,INPUT:`${h}-input`,CHANGE:`${h}-change`},vt={DEFAULT_MINUTE_STEP:60,MAX_DAY_MILLIS:864e5,MAX_DAY_MINUTES:1440},s={elementName:h,attributes:lt,selectors:ft,events:gt,numbers:vt};var g=class extends z{constructor(e){super(e)}initialize(){this._inputElement=this._component.querySelector(s.selectors.INPUT)}initializeMask(e){this._inputMask&&this._inputMask.destroy(),this._inputMask=new J(this._inputElement,e)}destroy(){this._targetElement=void 0,this._toggleElement=void 0,this._inputElement=void 0}destroyMask(){this._inputMask&&(this._inputMask.destroy(),this._inputMask=void 0)}initializeAccessibility(e){this._inputElement.setAttribute("autocomplete","off"),this._inputElement.setAttribute("autocorrect","off"),this._inputElement.setAttribute("autocapitalize","off"),this._inputElement.setAttribute("spellcheck","false"),this._inputElement.setAttribute("role","combobox"),this._inputElement.setAttribute("aria-live","assertive"),this._inputElement.setAttribute("aria-atomic","true"),this._inputElement.setAttribute("aria-haspopup","true"),this._inputElement.setAttribute("aria-expanded","false")}addInputListener(e,i,n){this._inputElement.addEventListener(e,i,{capture:n})}removeInputListener(e,i,n){this._inputElement&&this._inputElement.removeEventListener(e,i,{capture:n})}addToggleListener(e,i){this._toggleElement&&this._toggleElement.addEventListener(e,i)}removeToggleListener(e,i){this._toggleElement&&this._toggleElement.removeEventListener(e,i)}hasInputElement(){return!!this._inputElement}tryCreateToggle(){let e=this._component.querySelector(f.elementName),i=this._component.querySelector(s.selectors.TOGGLE);if(e){let n=e.querySelector(`${E.elementName}[slot=trailing]`);if(n||i){this._toggleElement=n||i;return}let l=document.createElement(E.elementName);l.slot="trailing",l.dense=!0,l.densityLevel=3,l.style.marginRight="4px";let o=document.createElement("button");o.type="button",o.tabIndex=-1,o.setAttribute("aria-label","Toggle time dropdown");let d=document.createElement(Q.elementName);d.name="clock_outline",o.appendChild(d),l.appendChild(o),e.appendChild(l),this._toggleElement=l}else i&&(this._toggleElement=i)}tryFocusInput(){this._inputElement.select()}tryBlurInput(){this._inputElement.blur()}selectInputText(){this._inputElement.select()}isInputDisabled(){return this._inputElement.disabled}isInputFocused(){return P()===this._inputElement}setInputValue(e,i){this._inputElement.value!==e&&(this._inputElement.value=e,this._inputMask&&this._inputMask.update(),i&&(this._emitInputEvent("change"),this._emitInputEvent("input")))}getInputValue(){return this._inputMask?this._inputMask.maskedValue:this._inputElement.value}setDisabled(e){this._inputElement.disabled=e,this._inputElement.setAttribute("aria-disabled",e.toString()),this.setToggleDisabled(e)}attachDropdown(e){this._listDropdown=new st(this._inputElement,e),this._listDropdown.open(),this._inputElement.setAttribute("aria-controls",`list-dropdown-popup-${e.id}`)}detachDropdown(){this._listDropdown&&(this._listDropdown.close(),this._listDropdown.destroy(),this._listDropdown=void 0),this._inputElement.removeAttribute("aria-controls")}propagateKey(e){var i;(i=this._listDropdown)==null||i.handleKey(e)}setActiveDescendant(e){x(this._inputElement,!!e,"aria-activedescendant",e)}getTargetElementWidth(e){return this._getTargetElement(e).getBoundingClientRect().width}_emitInputEvent(e){this._inputElement.dispatchEvent(new Event(e))}emitInputEvent(e,i){U(this._inputElement,e,i)}setInputReadonly(e){this._inputElement.readOnly=e}setToggleDisabled(e){if(this._toggleElement)if(this._toggleElement.setAttribute("aria-disabled",e.toString()),"disabled"in this._toggleElement)this._toggleElement.disabled=e;else{let i=this._toggleElement.querySelector("button");i&&(i.disabled=e)}}activateFirstOption(){var e;(e=this._listDropdown)==null||e.activateFirstOption()}getActiveOption(){var e;return(e=this._listDropdown)==null?void 0:e.getActiveOption()}_getTargetElement(e){return this._targetElement?this._targetElement:(this._targetElement=e?this._component.querySelector(e)||this._getDefaultTargetElement():this._getDefaultTargetElement(),this._targetElement)}_getDefaultTargetElement(){let e=this._component.querySelector(f.elementName);if(e&&e.shadowRoot){let i=V(e,f.selectors.ROOT);if(i)return i}return this._component}};function C(a,t,e){if(!a||/^\s*$/.test(a))return null;let i=0,n=0,l=0;if(b.test(a)){let o=G(a);i=+o.hours||0,n=+o.minutes||0,l=+o.seconds||0}else if(X.test(a)){let o=q(a);i=+o.hours||0,n=+o.minutes||0,l=+o.seconds||0,i===12&&o.meridiem==="AM"&&(i=0),i<12&&o.meridiem==="PM"&&(i+=12)}else return null;return dt(i)+I(n)+(e?O(l):0)}function m(a,t,e){if(typeof a!="number"||a<0)return null;let i=Math.min(pt(a),23),n=Math.min(ut(a),59),o=a/(1e3*60)<720?"AM":"PM";t||(i=i<=12?i:i-12,i===0&&(i=12));let d=`${String(i).padStart(2,"0")}:${String(n).padStart(2,"0")}`;if(e){let _=Math.min(M(a),59);d+=`:${String(_).padStart(2,"0")}`}return t||(d+=` ${o}`),d}function pt(a){return Math.abs(Math.floor(a/(1e3*60*60)))}function ut(a){return Math.abs(Math.floor(v(a)%60))}function v(a){return a/(1e3*60)}function M(a){return Math.abs(Math.floor(It(a)%60))}function It(a){return a/1e3}function dt(a){return a*60*60*1e3}function I(a){return a*60*1e3}function O(a){return a*1e3}function mt(a){return a-O(M(a))}function D(a){let t=new Date,e=t.getHours(),i=t.getMinutes();return dt(e)+I(i)+(a?O(t.getSeconds()):0)}function Rt(a,t,e=!1){a||(a=new Date);let i=C(t,!0,e);if(!i)return a.setHours(0,0,0),a;let n=pt(i),l=828e5;n>l?n=l:n<0&&(n=0);let o=ut(i),d=e?M(i):0;return a.setHours(n,o,d),a}var T=class{constructor(t){this._adapter=t;this._value=null;this._masked=!0;this._use24HourTime=!1;this._showMaskFormat=!1;this._min=null;this._max=null;this._restrictedTimes=[];this._startTime=null;this._step=s.numbers.DEFAULT_MINUTE_STEP;this._allowInput=!0;this._open=!1;this._allowSeconds=!1;this._allowInvalidTime=!1;this._showNow=!1;this._showHourOptions=!0;this._customOptions=[];this._disabled=!1;this._popupClasses=[];this._allowDropdown=!0;this._isInitialized=!1;this._identifier=S(),this._inputListener=e=>this._onInput(e),this._inputKeydownListener=e=>this._onInputKeydown(e),this._toggleMousedownListener=e=>this._onToggleMousedown(e),this._inputFocusListener=e=>this._onInputFocus(e),this._inputBlurListener=e=>this._onInputBlur(e),this._inputMousedownListener=e=>this._onInputMousedown(e)}initialize(){if(this._adapter.initialize(),!this._adapter.hasInputElement())throw new Error("Unable to locate <input> element to attach to.");if(this._adapter.initializeAccessibility(this._identifier),!this._value){let t=this._adapter.getInputValue();this._setValue(this._convertTimeStringToMillis(t,this._use24HourTime,this._allowSeconds))}this._adapter.addInputListener("focus",this._inputFocusListener),this._adapter.addInputListener("blur",this._inputBlurListener),this._adapter.addInputListener("keydown",this._inputKeydownListener,!0),this._formatInputValue(!1),typeof this._value=="number"&&this._applyValue(this._value,!1),this._applyAllowInput(),this._applyAllowDropdown(),this._applyDisabled(),this._applyMask(),this._isInitialized=!0}disconnect(){this._isInitialized=!1,this._adapter.removeInputListener("input",this._inputListener),this._adapter.removeInputListener("focus",this._inputFocusListener),this._adapter.removeInputListener("blur",this._inputBlurListener),this._adapter.removeToggleListener("mousedown",this._toggleMousedownListener),this._adapter.removeInputListener("keydown",this._inputKeydownListener,!0),this._masked&&this._adapter.destroyMask(),this._closeDropdown(),this._adapter.destroy()}_onInput(t){this._handleInput(this._adapter.getInputValue())}_onInputKeydown(t){if(t.shiftKey)switch(t.code){case"Backspace":case"Delete":t.preventDefault(),this._trySetValue(null)&&this._formatInputValue();return}switch(t.code){case"Tab":this._open&&this._selectActiveOption();break;case"Esc":case"Escape":this._open&&(t.preventDefault(),this._closeDropdown(!0));break;case"Down":case"ArrowDown":this._allowDropdown&&(t.preventDefault(),this._open?this._adapter.propagateKey(t.code):(this._openDropdown(),this._adapter.activateFirstOption()));break;case"Up":case"ArrowUp":this._allowDropdown&&(t.preventDefault(),this._open&&this._adapter.propagateKey(t.code));break;case"Enter":case"Home":case"End":this._open&&(t.code==="Enter"&&t.stopPropagation(),t.preventDefault(),this._adapter.propagateKey(t.code));break;case"KeyN":t.preventDefault();let e=D(this._allowSeconds);if(this._value!==e){let i=m(e,!0,this._allowSeconds);this._emitChangeEvent(i)&&(this._applyValue(e),this._selectInputText())}break}}_selectActiveOption(){let t=this._adapter.getActiveOption();t&&this._onSelect(t.value)}_onToggleMousedown(t){this._disabled||!this.allowDropdown||(t.stopPropagation(),!this._adapter.isInputDisabled()&&(t.preventDefault(),this._open?this._closeDropdown(!0):(F.isMobile?this._adapter.tryBlurInput():this._adapter.tryFocusInput(),this._openDropdown())))}_onInputFocus(t){this._allowInput&&this._adapter.selectInputText()}_onInputBlur(t){this._formatInputValue(),this._open&&!this._adapter.isInputFocused()&&this._closeDropdown(!0)}_onInputMousedown(t){!this._allowInput&&!this._open&&(this._openDropdown(),this._adapter.tryFocusInput(),window.requestAnimationFrame(()=>this._adapter.selectInputText()))}_applyDisabled(){this._adapter.setDisabled(this._disabled)}_applyMask(){if(this._masked&&this._allowInput){let t={showMaskFormat:this._showMaskFormat,use24HourTime:this._use24HourTime,showSeconds:this._allowSeconds,prepareCallback:this._prepareMaskCallback,onChange:y(e=>this._handleInput(e),0,!0)};this._adapter.initializeMask(t)}else this._adapter.destroyMask(),this._formatInputValue()}_applyAllowInput(){this._adapter.setInputReadonly(!this._allowInput),this._allowInput?(this._adapter.removeInputListener("mousedown",this._inputMousedownListener),this._masked||this._adapter.addInputListener("input",this._inputListener)):(this._adapter.addInputListener("mousedown",this._inputMousedownListener),this._adapter.removeInputListener("input",this._inputListener))}_applyAllowDropdown(){this._adapter.setToggleDisabled(!this._allowDropdown),this._allowDropdown?(this._adapter.removeToggleListener("mousedown",this._toggleMousedownListener),this._adapter.tryCreateToggle(),this._adapter.addToggleListener("mousedown",this._toggleMousedownListener)):this._open&&this._closeDropdown(!0)}_applyAllowSeconds(){let t=this._value;if(this._allowSeconds){if(this._isInitialized&&t!==this._value){let e=m(this._value,!0,!0);this._emitChangeEvent(e)}}else{if(typeof this._value!="number")return;if(this._setValue(mt(this._value)),this._isInitialized&&t!==this._value){let e=m(this._value,!0,!1);this._emitChangeEvent(e)}}}_handleInput(t){let e=t;if(!this._allowInput)return;this._open&&this._closeDropdown(!0),t=j(t,this._use24HourTime,this._allowSeconds),typeof this._coercionCallback=="function"&&(t=this._coercionCallback.call(null,e,t,this._allowSeconds)),this._isValidTimeFormat(t)||(t="");let i;!this._masked&&typeof this._parseCallback=="function"?i=this._parseCallback.call(null,t):i=this._convertTimeStringToMillis(t,this._use24HourTime,this._allowSeconds),i=this._validateMillis(i),this._trySetValue(i)}_emitChangeEvent(t,e=!1){return this._adapter.emitHostEvent(s.events.CHANGE,t,!0,!e)}_trySetValue(t){if(t===this._value)return!1;let e=m(t,!0,this._allowSeconds);return this._masked&&this._adapter.emitInputEvent(s.events.INPUT,e),this._value!==t&&this._emitChangeEvent(e)?(this._setValue(t),!0):!1}_setValue(t){this._value=this._normalizeTimeValue(t)}_validateMillis(t){if(typeof t=="number"){let e=typeof this._min=="number"&&t<this._min,i=typeof this._max=="number"&&t>this._max;(e||i)&&(t=null)}return typeof t=="number"&&this._restrictedTimes.length&&this._restrictedTimes.includes(t)&&(t=null),t}_isValidTimeFormat(t){return!this._masked&&typeof this._validationCallback=="function"?this._validationCallback.call(this,t):Y(t)}_isValidInputValue(t){return b.test(t)}_onSelect(t){if(this._closeDropdown(!0),!t.isCustom&&t.metadata==="now"&&(t.time=D(this._allowSeconds)),t.isCustom)if(typeof t.customCallback=="function"){let n=t.customCallback.call(null,t.metadata);if(typeof n!="number")throw new Error("Custom options must provide a time of day value in milliseconds.");t.time=n}else throw new Error("You must implement a `toMilliseconds` callback that returns the time value to use for this custom option.");if(this._value===t.time)return;let e=m(t.time,!0,this._allowSeconds);!this._emitChangeEvent(e)||(this._applyValue(t.time),this._selectInputText())}_selectInputText(){window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{this._adapter.isInputFocused()&&this._adapter.selectInputText()})})}_applyValue(t,e=!0){this._setValue(t);let i=this._formatValue(this._value);this._adapter.getInputValue()!==i&&this._adapter.setInputValue(i,e)}_normalizeTimeValue(t){return t==null?null:t<0?0:t>s.numbers.MAX_DAY_MILLIS?s.numbers.MAX_DAY_MILLIS:t}_openDropdown(){let t=this._generateTimeOptions();if(!this.allowDropdown||!t.length)return;this._formatInputValue(),this._open=!0,this._adapter.setHostAttribute(s.attributes.OPEN);let e=t.filter(o=>!o.divider&&!o.disabled),i=[],n;if(t.length){if(this._value!=null){let o=this._findClosestOptionIndex(this._value,e);o>=0&&(e[o].value.time===this._value?i=[e[o].value]:n=o)}else if(typeof this._startTime=="number"){let o=this._findClosestOptionIndex(this._startTime,e);o>=0&&o<e.length&&(n=o)}}let l={id:`forge-time-picker-${this._identifier}`,selectedValues:i,syncWidth:!0,activeStartIndex:n,popupClasses:this._popupClasses,popupStatic:!0,type:"standard",options:t,selectCallback:o=>this._onSelect(o),closeCallback:()=>this._closeDropdown(!0),activeChangeCallback:o=>this._adapter.setActiveDescendant(o),targetWidthCallback:()=>this._adapter.getTargetElementWidth(this._popupTarget)};this._adapter.attachDropdown(l),this._adapter.emitHostEvent(s.events.OPEN,void 0,!1)}_closeDropdown(t=!1){this._open=!1,this._adapter.removeHostAttribute(s.attributes.OPEN),this._adapter.detachDropdown(),t&&this._adapter.emitHostEvent(s.events.CLOSE,!0,!1)}_findClosestOptionIndex(t,e){let i=e.reduce((n,l)=>Math.abs((l.value.time||0)-t)<Math.abs((n.value.time||0)-t)?l:n);return e.indexOf(i)}_formatInputValue(t=!0){let e=this._adapter.getInputValue();if(this._allowInvalidTime&&!this._masked&&e&&!this._value)return;let i=this._formatValue(this._value);e!==i&&this._adapter.setInputValue(i,t)}_generateTimeOptions(){let t=this._min!=null?Math.max(v(this._min),0):0,e=this._max!=null?Math.min(v(this._max),s.numbers.MAX_DAY_MINUTES):s.numbers.MAX_DAY_MINUTES,i=this._step,n=[],l=[];if(this._showHourOptions){for(let d=t;d<=e&&d!==s.numbers.MAX_DAY_MINUTES;d+=i){let _=I(d),_t=this._restrictedTimes.includes(_),ht=m(_,this._use24HourTime,!1)||"",bt={time:_};n.push({label:ht,value:bt,disabled:_t})}let o=n.findIndex(d=>d.value.time/1e3/60>=720);o>=0&&o<n.length-1&&n.splice(o,0,{label:"",value:null,divider:!0})}if(this._showNow){let o={time:null,metadata:"now"};l.push({label:"Now",value:o})}if(Array.isArray(this._customOptions)&&this._customOptions.length){let o=this._customOptions.map(d=>{let _={time:null,metadata:d.value,isCustom:!0,customCallback:d.toMilliseconds};return{label:d.label,value:_}});l=[...l,...o]}return l.length&&(n.length&&n.splice(0,0,{label:"",value:null,divider:!0}),l.forEach((o,d)=>n.splice(d,0,o))),n}_convertTimeStringToMillis(t,e,i){return(!t||!this._isValidTimeFormat(t))&&(t=""),C(t,e,i)}_formatValue(t){return!this._masked&&typeof this._formatCallback=="function"?this._formatCallback.call(null,t,this._use24HourTime,this._allowSeconds):m(this._value,this._use24HourTime,this._allowSeconds)||""}_warnInvalidFormat(t){console.warn(`The specified value "${t}" 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.`)}get open(){return this._open}set open(t){this._open!==t&&this._isInitialized&&(this._open=t,this._open?this._openDropdown():this._closeDropdown())}get masked(){return this._masked}set masked(t){this._masked!==t&&(this._masked=t,this._isInitialized&&(this._masked?(this._adapter.removeInputListener("input",this._inputListener),this._applyMask()):(this._adapter.destroyMask(),this._formatInputValue(),this._adapter.addInputListener("input",this._inputListener))))}get showMaskFormat(){return this._showMaskFormat}set showMaskFormat(t){this._showMaskFormat!==t&&(this._showMaskFormat=t,this._isInitialized&&this._applyMask())}get allowSeconds(){return this._allowSeconds}set allowSeconds(t){this._allowSeconds!==t&&(this._allowSeconds=!!t,this._applyAllowSeconds(),this._isInitialized&&(this._applyMask(),this._formatInputValue()),this._adapter.setHostAttribute(s.attributes.ALLOW_SECONDS,`${!!t}`))}get use24HourTime(){return this._use24HourTime}set use24HourTime(t){this._use24HourTime!==t&&(this._use24HourTime=!!t,this._isInitialized&&(this._adapter.destroyMask(),this._formatInputValue(),this._applyMask()),this._adapter.setHostAttribute(s.attributes.USE_24_HOUR_TIME,`${!!t}`))}get allowInvalidTime(){return this._allowInvalidTime}set allowInvalidTime(t){this._allowInvalidTime!==t&&(this._allowInvalidTime=!!t,this._adapter.setHostAttribute(s.attributes.ALLOW_INVALID_TIME,`${!!t}`))}get value(){return m(this._value,!0,this._allowSeconds)}set value(t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}let e=this._validateMillis(this._convertTimeStringToMillis(t,!0,!0));this._setValue(e),this._isInitialized&&this._applyValue(this._value)}get min(){return m(this._min,!0,this._allowSeconds)}set min(t){if(this._min!==t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}this._min=this._convertTimeStringToMillis(t,!0,this._allowSeconds);let e=this._validateMillis(this._value);this._setValue(e),this._isInitialized&&this._applyValue(e)}}get max(){return m(this._max,!0,this._allowSeconds)}set max(t){if(this._max!==t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}this._max=this._convertTimeStringToMillis(t,!0,this._allowSeconds);let e=this._validateMillis(this._value);this._setValue(e),this._isInitialized&&this._applyValue(e)}}get restrictedTimes(){return this._restrictedTimes.map(t=>m(t,!0,this._allowSeconds)).filter(t=>typeof t=="string")}set restrictedTimes(t){Array.isArray(t)||(t=[]),this._restrictedTimes=t.filter(e=>typeof e=="string").map(e=>this._convertTimeStringToMillis(e,!0,!0)).filter(e=>typeof e=="number")}get startTime(){return m(this._startTime,!0,this._allowSeconds)}set startTime(t){if(this._startTime!==t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}this._startTime=this._convertTimeStringToMillis(t,!0,this._allowSeconds)}}get step(){return this._step}set step(t){this._step=t}get allowInput(){return this._allowInput}set allowInput(t){this._allowInput!==t&&(this._allowInput=t,this._isInitialized&&(this._applyAllowInput(),this._applyMask()))}get popupTarget(){return this._popupTarget}set popupTarget(t){this._popupTarget!==t&&(this._popupTarget=t)}get showNow(){return this._showNow}set showNow(t){this._showNow!==t&&(this._showNow=t)}get showHourOptions(){return this._showHourOptions}set showHourOptions(t){this._showHourOptions!==t&&(this._showHourOptions=t)}get customOptions(){return this._customOptions}set customOptions(t){this._customOptions=Array.isArray(t)?t:[]}set validationCallback(t){this._validationCallback=t,this._isInitialized&&this._applyMask()}set parseCallback(t){this._parseCallback=t}set formatCallback(t){this._formatCallback=t}set coercionCallback(t){this._coercionCallback=t}set prepareMaskCallback(t){this._prepareMaskCallback=t,this._isInitialized&&this._applyMask()}get disabled(){return this._disabled}set disabled(t){this._disabled!==t&&(this._disabled=!!t,this._isInitialized&&this._applyDisabled(),this._adapter.toggleHostAttribute(s.attributes.DISABLED,this._disabled))}get popupClasses(){return Array.isArray(this._popupClasses)?[...this._popupClasses]:this._popupClasses}set popupClasses(t){Array.isArray(t)?this._popupClasses=[...t]:this._popupClasses=[t]}get allowDropdown(){return this._allowDropdown}set allowDropdown(t){this._allowDropdown!==t&&(this._allowDropdown=t,this._isInitialized&&this._applyAllowDropdown())}};var Tt="<template><slot></slot></template>",kt=":host{display:block}:host([hidden]){display:none}",r=class extends W{constructor(){super();Z.define([rt,K]),H(this,Tt,kt),this._foundation=new T(new g(this))}static get observedAttributes(){return[s.attributes.VALUE,s.attributes.OPEN,s.attributes.ALLOW_SECONDS,s.attributes.MASKED,s.attributes.SHOW_MASK_FORMAT,s.attributes.USE_24_HOUR_TIME,s.attributes.ALLOW_INVALID_TIME,s.attributes.MIN,s.attributes.MAX,s.attributes.START_TIME,s.attributes.STEP,s.attributes.ALLOW_INPUT,s.attributes.SHOW_NOW,s.attributes.SHOW_HOUR_OPTIONS,s.attributes.DISABLED,s.attributes.POPUP_CLASSES,s.attributes.ALLOW_DROPDOWN]}connectedCallback(){this.querySelector(s.selectors.INPUT)?this._foundation.initialize():A(this,s.selectors.INPUT).then(()=>this._foundation.initialize())}disconnectedCallback(){this._foundation.disconnect()}attributeChangedCallback(e,i,n){switch(e){case s.attributes.VALUE:this.value=n;break;case s.attributes.OPEN:this.open=c(n);break;case s.attributes.ALLOW_SECONDS:this.allowSeconds=c(n);break;case s.attributes.MASKED:this.masked=c(n);break;case s.attributes.SHOW_MASK_FORMAT:this.showMaskFormat=c(n);break;case s.attributes.USE_24_HOUR_TIME:this.use24HourTime=c(n);break;case s.attributes.ALLOW_INVALID_TIME:this.allowInvalidTime=c(n);break;case s.attributes.SHOW_NOW:this.showNow=c(n);break;case s.attributes.SHOW_HOUR_OPTIONS:this.showHourOptions=c(n);break;case s.attributes.MIN:this.min=n;break;case s.attributes.MAX:this.max=n;break;case s.attributes.START_TIME:this.startTime=n;break;case s.attributes.STEP:this.step=L(n);break;case s.attributes.ALLOW_INPUT:this.allowInput=c(n);break;case s.attributes.DISABLED:this.disabled=c(n);break;case s.attributes.POPUP_CLASSES:this.popupClasses=n;break;case s.attributes.ALLOW_DROPDOWN:this.allowDropdown=c(n);break}}};p([u()],r.prototype,"value",2),p([u()],r.prototype,"open",2),p([u()],r.prototype,"allowSeconds",2),p([u()],r.prototype,"masked",2),p([u()],r.prototype,"showMaskFormat",2),p([u()],r.prototype,"use24HourTime",2),p([u()],r.prototype,"allowInvalidTime",2),p([u()],r.prototype,"min",2),p([u()],r.prototype,"max",2),p([u()],r.prototype,"restrictedTimes",2),p([u()],r.prototype,"startTime",2),p([u()],r.prototype,"step",2),p([u()],r.prototype,"allowInput",2),p([u()],r.prototype,"showNow",2),p([u()],r.prototype,"showHourOptions",2),p([u()],r.prototype,"customOptions",2),p([u()],r.prototype,"validationCallback",2),p([u()],r.prototype,"parseCallback",2),p([u()],r.prototype,"formatCallback",2),p([u()],r.prototype,"coercionCallback",2),p([u()],r.prototype,"prepareMaskCallback",2),p([u()],r.prototype,"disabled",2),p([u()],r.prototype,"popupClasses",2),p([u()],r.prototype,"allowDropdown",2),p([u()],r.prototype,"popupTarget",2),r=p([R({name:s.elementName,dependencies:[et,tt,ot,w,it,w,at]})],r);var ct=class extends ${constructor(e){super(e)}_build(){let e=document.createElement(s.elementName);return this._attachTextField(e),e}get inputElement(){return this._textFieldDelegate.inputElement}get textFieldElement(){return this._textFieldDelegate.element}get value(){return this._element.value}set value(e){this._element.value=e}get disabled(){return this._element.disabled}set disabled(e){this._element.disabled=e}get invalid(){return this._textFieldDelegate.invalid||!1}set invalid(e){this._textFieldDelegate.invalid=e}onChange(e){this._element.addEventListener(s.events.CHANGE,i=>{var n;return e((n=i.detail)!=null?n:"")})}onInput(e){this._element.masked?this._element.addEventListener(s.events.INPUT,i=>{var n;return e((n=i.detail)!=null?n:"")}):this._textFieldDelegate.inputElement.addEventListener("input",i=>e(i.target.value))}onFocus(e){this._textFieldDelegate.inputElement.addEventListener("focus",i=>e(i))}onBlur(e){this._textFieldDelegate.inputElement.addEventListener("blur",i=>e(i))}_attachTextField(e){var n,l,o,d;let i={props:k({},(l=(n=this._config.options)==null?void 0:n.textFieldDelegateConfig)==null?void 0:l.props),options:k({},(d=(o=this._config.options)==null?void 0:o.textFieldDelegateConfig)==null?void 0:d.options)};this._textFieldDelegate=new nt(i),e.appendChild(this._textFieldDelegate.element)}};function xe(){N(r)}export{s as a,g as b,C as c,m as d,pt as e,ut as f,v as g,M as h,It as i,dt as j,I as k,O as l,mt as m,D as n,Rt as o,T as p,r as q,ct as r,xe as s};
7
- //# sourceMappingURL=chunk.5SRA2RH3.js.map
6
+ import{a as rt}from"./chunk.E37HEAJ5.js";import{d as at}from"./chunk.YSE5EMB3.js";import{a as f,b as nt}from"./chunk.IMK2LFWR.js";import{h as st}from"./chunk.QBDE7M3E.js";import{c as et}from"./chunk.D3DLVPPE.js";import{e as tt}from"./chunk.7JTKKFL4.js";import{e as it}from"./chunk.DRFU6POI.js";import{a as E,b as ot}from"./chunk.BOENNFXE.js";import{j as K}from"./chunk.LZMYHIO2.js";import{a as F}from"./chunk.D4SNVKDA.js";import{a as Q,d as Z,l as w}from"./chunk.YAJT3P6V.js";import{a as $}from"./chunk.24D46RLZ.js";import{g as J}from"./chunk.7ZS4N2FT.js";import{j as b,k as X,m as G,n as q,o as Y,p as j}from"./chunk.KYCC3C3M.js";import{a as z}from"./chunk.A23NSEWA.js";import{a as u}from"./chunk.B3IJU6XJ.js";import{a as R,b as B}from"./chunk.BSZ2LBJX.js";import{a as W}from"./chunk.3E5QKMHL.js";import{a as N,e as H,g as V,i as U}from"./chunk.HN4PXH3D.js";import{m as A,s as P,u as x}from"./chunk.R4NDFXVA.js";import{a as S,k as c,l as L,o as y}from"./chunk.G76HB2FK.js";import{a as k,f as p}from"./chunk.MCIQXNKY.js";var h=`${B}time-picker`,lt={TOGGLE:"forge-time-picker-toggle",VALUE:"value",OPEN:"open",ALLOW_SECONDS:"allow-seconds",MASKED:"masked",SHOW_MASK_FORMAT:"show-mask-format",USE_24_HOUR_TIME:"use-24-hour-time",ALLOW_INVALID_TIME:"allow-invalid-time",MIN:"min",MAX:"max",START_TIME:"start-time",STEP:"step",ALLOW_INPUT:"allow-input",SHOW_NOW:"show-now",SHOW_HOUR_OPTIONS:"show-hour-options",DISABLED:"disabled",POPUP_CLASSES:"popup-classes",ALLOW_DROPDOWN:"allow-dropdown"},ft={INPUT:"input, input[forge-time-picker-input]",TOGGLE:`[${lt.TOGGLE}]`},gt={OPEN:`${h}-open`,CLOSE:`${h}-close`,INPUT:`${h}-input`,CHANGE:`${h}-change`},vt={DEFAULT_MINUTE_STEP:60,MAX_DAY_MILLIS:864e5,MAX_DAY_MINUTES:1440},s={elementName:h,attributes:lt,selectors:ft,events:gt,numbers:vt};var g=class extends z{constructor(e){super(e)}initialize(){this._inputElement=this._component.querySelector(s.selectors.INPUT)}initializeMask(e){this._inputMask&&this._inputMask.destroy(),this._inputMask=new J(this._inputElement,e)}destroy(){this._targetElement=void 0,this._toggleElement=void 0,this._inputElement=void 0}destroyMask(){this._inputMask&&(this._inputMask.destroy(),this._inputMask=void 0)}initializeAccessibility(e){this._inputElement.setAttribute("autocomplete","off"),this._inputElement.setAttribute("autocorrect","off"),this._inputElement.setAttribute("autocapitalize","off"),this._inputElement.setAttribute("spellcheck","false"),this._inputElement.setAttribute("role","combobox"),this._inputElement.setAttribute("aria-live","assertive"),this._inputElement.setAttribute("aria-atomic","true"),this._inputElement.setAttribute("aria-haspopup","true"),this._inputElement.setAttribute("aria-expanded","false")}addInputListener(e,i,n){this._inputElement.addEventListener(e,i,{capture:n})}removeInputListener(e,i,n){this._inputElement&&this._inputElement.removeEventListener(e,i,{capture:n})}addToggleListener(e,i){this._toggleElement&&this._toggleElement.addEventListener(e,i)}removeToggleListener(e,i){this._toggleElement&&this._toggleElement.removeEventListener(e,i)}hasInputElement(){return!!this._inputElement}tryCreateToggle(){let e=this._component.querySelector(f.elementName),i=this._component.querySelector(s.selectors.TOGGLE);if(e){let n=e.querySelector(`${E.elementName}[slot=trailing]`);if(n||i){this._toggleElement=n||i;return}let l=document.createElement(E.elementName);l.slot="trailing",l.dense=!0,l.densityLevel=3,l.style.marginRight="4px";let o=document.createElement("button");o.type="button",o.tabIndex=-1,o.setAttribute("aria-label","Toggle time dropdown");let d=document.createElement(Q.elementName);d.name="clock_outline",o.appendChild(d),l.appendChild(o),e.appendChild(l),this._toggleElement=l}else i&&(this._toggleElement=i)}tryFocusInput(){this._inputElement.select()}tryBlurInput(){this._inputElement.blur()}selectInputText(){this._inputElement.select()}isInputDisabled(){return this._inputElement.disabled}isInputFocused(){return P()===this._inputElement}setInputValue(e,i){this._inputElement.value!==e&&(this._inputElement.value=e,this._inputMask&&this._inputMask.update(),i&&(this._emitInputEvent("change"),this._emitInputEvent("input")))}getInputValue(){return this._inputMask?this._inputMask.maskedValue:this._inputElement.value}setDisabled(e){this._inputElement.disabled=e,this._inputElement.setAttribute("aria-disabled",e.toString()),this.setToggleDisabled(e)}attachDropdown(e){this._listDropdown=new st(this._inputElement,e),this._listDropdown.open(),this._inputElement.setAttribute("aria-controls",`list-dropdown-popup-${e.id}`)}detachDropdown(){this._listDropdown&&(this._listDropdown.close(),this._listDropdown.destroy(),this._listDropdown=void 0),this._inputElement.removeAttribute("aria-controls")}propagateKey(e){var i;(i=this._listDropdown)==null||i.handleKey(e)}setActiveDescendant(e){x(this._inputElement,!!e,"aria-activedescendant",e)}getTargetElementWidth(e){return this._getTargetElement(e).getBoundingClientRect().width}_emitInputEvent(e){this._inputElement.dispatchEvent(new Event(e))}emitInputEvent(e,i){U(this._inputElement,e,i)}setInputReadonly(e){this._inputElement.readOnly=e}setToggleDisabled(e){if(this._toggleElement)if(this._toggleElement.setAttribute("aria-disabled",e.toString()),"disabled"in this._toggleElement)this._toggleElement.disabled=e;else{let i=this._toggleElement.querySelector("button");i&&(i.disabled=e)}}activateFirstOption(){var e;(e=this._listDropdown)==null||e.activateFirstOption()}getActiveOption(){var e;return(e=this._listDropdown)==null?void 0:e.getActiveOption()}_getTargetElement(e){return this._targetElement?this._targetElement:(this._targetElement=e?this._component.querySelector(e)||this._getDefaultTargetElement():this._getDefaultTargetElement(),this._targetElement)}_getDefaultTargetElement(){let e=this._component.querySelector(f.elementName);if(e&&e.shadowRoot){let i=V(e,f.selectors.ROOT);if(i)return i}return this._component}};function C(a,t,e){if(!a||/^\s*$/.test(a))return null;let i=0,n=0,l=0;if(b.test(a)){let o=G(a);i=+o.hours||0,n=+o.minutes||0,l=+o.seconds||0}else if(X.test(a)){let o=q(a);i=+o.hours||0,n=+o.minutes||0,l=+o.seconds||0,i===12&&o.meridiem==="AM"&&(i=0),i<12&&o.meridiem==="PM"&&(i+=12)}else return null;return dt(i)+I(n)+(e?O(l):0)}function m(a,t,e){if(typeof a!="number"||a<0)return null;let i=Math.min(pt(a),23),n=Math.min(ut(a),59),o=a/(1e3*60)<720?"AM":"PM";t||(i=i<=12?i:i-12,i===0&&(i=12));let d=`${String(i).padStart(2,"0")}:${String(n).padStart(2,"0")}`;if(e){let _=Math.min(M(a),59);d+=`:${String(_).padStart(2,"0")}`}return t||(d+=` ${o}`),d}function pt(a){return Math.abs(Math.floor(a/(1e3*60*60)))}function ut(a){return Math.abs(Math.floor(v(a)%60))}function v(a){return a/(1e3*60)}function M(a){return Math.abs(Math.floor(It(a)%60))}function It(a){return a/1e3}function dt(a){return a*60*60*1e3}function I(a){return a*60*1e3}function O(a){return a*1e3}function mt(a){return a-O(M(a))}function D(a){let t=new Date,e=t.getHours(),i=t.getMinutes();return dt(e)+I(i)+(a?O(t.getSeconds()):0)}function Rt(a,t,e=!1){a||(a=new Date);let i=C(t,!0,e);if(!i)return a.setHours(0,0,0),a;let n=pt(i),l=828e5;n>l?n=l:n<0&&(n=0);let o=ut(i),d=e?M(i):0;return a.setHours(n,o,d),a}var T=class{constructor(t){this._adapter=t;this._value=null;this._masked=!0;this._use24HourTime=!1;this._showMaskFormat=!1;this._min=null;this._max=null;this._restrictedTimes=[];this._startTime=null;this._step=s.numbers.DEFAULT_MINUTE_STEP;this._allowInput=!0;this._open=!1;this._allowSeconds=!1;this._allowInvalidTime=!1;this._showNow=!1;this._showHourOptions=!0;this._customOptions=[];this._disabled=!1;this._popupClasses=[];this._allowDropdown=!0;this._isInitialized=!1;this._identifier=S(),this._inputListener=e=>this._onInput(e),this._inputKeydownListener=e=>this._onInputKeydown(e),this._toggleMousedownListener=e=>this._onToggleMousedown(e),this._inputFocusListener=e=>this._onInputFocus(e),this._inputBlurListener=e=>this._onInputBlur(e),this._inputMousedownListener=e=>this._onInputMousedown(e)}initialize(){if(this._adapter.initialize(),!this._adapter.hasInputElement())throw new Error("Unable to locate <input> element to attach to.");if(this._adapter.initializeAccessibility(this._identifier),!this._value){let t=this._adapter.getInputValue();this._setValue(this._convertTimeStringToMillis(t,this._use24HourTime,this._allowSeconds))}this._adapter.addInputListener("focus",this._inputFocusListener),this._adapter.addInputListener("blur",this._inputBlurListener),this._adapter.addInputListener("keydown",this._inputKeydownListener,!0),this._formatInputValue(!1),typeof this._value=="number"&&this._applyValue(this._value,!1),this._applyAllowInput(),this._applyAllowDropdown(),this._applyDisabled(),this._applyMask(),this._isInitialized=!0}disconnect(){this._isInitialized=!1,this._adapter.removeInputListener("input",this._inputListener),this._adapter.removeInputListener("focus",this._inputFocusListener),this._adapter.removeInputListener("blur",this._inputBlurListener),this._adapter.removeToggleListener("mousedown",this._toggleMousedownListener),this._adapter.removeInputListener("keydown",this._inputKeydownListener,!0),this._masked&&this._adapter.destroyMask(),this._closeDropdown(),this._adapter.destroy()}_onInput(t){this._handleInput(this._adapter.getInputValue())}_onInputKeydown(t){if(t.shiftKey)switch(t.code){case"Backspace":case"Delete":t.preventDefault(),this._trySetValue(null)&&this._formatInputValue();return}switch(t.code){case"Tab":this._open&&this._selectActiveOption();break;case"Esc":case"Escape":this._open&&(t.preventDefault(),this._closeDropdown(!0));break;case"Down":case"ArrowDown":this._allowDropdown&&(t.preventDefault(),this._open?this._adapter.propagateKey(t.code):(this._openDropdown(),this._adapter.activateFirstOption()));break;case"Up":case"ArrowUp":this._allowDropdown&&(t.preventDefault(),this._open&&this._adapter.propagateKey(t.code));break;case"Enter":case"Home":case"End":this._open&&(t.code==="Enter"&&t.stopPropagation(),t.preventDefault(),this._adapter.propagateKey(t.code));break;case"KeyN":t.preventDefault();let e=D(this._allowSeconds);if(this._value!==e){let i=m(e,!0,this._allowSeconds);this._emitChangeEvent(i)&&(this._applyValue(e),this._selectInputText())}break}}_selectActiveOption(){let t=this._adapter.getActiveOption();t&&this._onSelect(t.value)}_onToggleMousedown(t){this._disabled||!this.allowDropdown||(t.stopPropagation(),!this._adapter.isInputDisabled()&&(t.preventDefault(),this._open?this._closeDropdown(!0):(F.isMobile?this._adapter.tryBlurInput():this._adapter.tryFocusInput(),this._openDropdown())))}_onInputFocus(t){this._allowInput&&this._adapter.selectInputText()}_onInputBlur(t){this._formatInputValue(),this._open&&!this._adapter.isInputFocused()&&this._closeDropdown(!0)}_onInputMousedown(t){!this._allowInput&&!this._open&&(this._openDropdown(),this._adapter.tryFocusInput(),window.requestAnimationFrame(()=>this._adapter.selectInputText()))}_applyDisabled(){this._adapter.setDisabled(this._disabled)}_applyMask(){if(this._masked&&this._allowInput){let t={showMaskFormat:this._showMaskFormat,use24HourTime:this._use24HourTime,showSeconds:this._allowSeconds,prepareCallback:this._prepareMaskCallback,onChange:y(e=>this._handleInput(e),0,!0)};this._adapter.initializeMask(t)}else this._adapter.destroyMask(),this._formatInputValue()}_applyAllowInput(){this._adapter.setInputReadonly(!this._allowInput),this._allowInput?(this._adapter.removeInputListener("mousedown",this._inputMousedownListener),this._masked||this._adapter.addInputListener("input",this._inputListener)):(this._adapter.addInputListener("mousedown",this._inputMousedownListener),this._adapter.removeInputListener("input",this._inputListener))}_applyAllowDropdown(){this._adapter.setToggleDisabled(!this._allowDropdown),this._allowDropdown?(this._adapter.removeToggleListener("mousedown",this._toggleMousedownListener),this._adapter.tryCreateToggle(),this._adapter.addToggleListener("mousedown",this._toggleMousedownListener)):this._open&&this._closeDropdown(!0)}_applyAllowSeconds(){let t=this._value;if(this._allowSeconds){if(this._isInitialized&&t!==this._value){let e=m(this._value,!0,!0);this._emitChangeEvent(e)}}else{if(typeof this._value!="number")return;if(this._setValue(mt(this._value)),this._isInitialized&&t!==this._value){let e=m(this._value,!0,!1);this._emitChangeEvent(e)}}}_handleInput(t){let e=t;if(!this._allowInput)return;this._open&&this._closeDropdown(!0),t=j(t,this._use24HourTime,this._allowSeconds),typeof this._coercionCallback=="function"&&(t=this._coercionCallback.call(null,e,t,this._allowSeconds)),this._isValidTimeFormat(t)||(t="");let i;!this._masked&&typeof this._parseCallback=="function"?i=this._parseCallback.call(null,t):i=this._convertTimeStringToMillis(t,this._use24HourTime,this._allowSeconds),i=this._validateMillis(i),this._trySetValue(i)}_emitChangeEvent(t,e=!1){return this._adapter.emitHostEvent(s.events.CHANGE,t,!0,!e)}_trySetValue(t){if(t===this._value)return!1;let e=m(t,!0,this._allowSeconds);return this._masked&&this._adapter.emitInputEvent(s.events.INPUT,e),this._value!==t&&this._emitChangeEvent(e)?(this._setValue(t),!0):!1}_setValue(t){this._value=this._normalizeTimeValue(t)}_validateMillis(t){if(typeof t=="number"){let e=typeof this._min=="number"&&t<this._min,i=typeof this._max=="number"&&t>this._max;(e||i)&&(t=null)}return typeof t=="number"&&this._restrictedTimes.length&&this._restrictedTimes.includes(t)&&(t=null),t}_isValidTimeFormat(t){return!this._masked&&typeof this._validationCallback=="function"?this._validationCallback.call(this,t):Y(t)}_isValidInputValue(t){return b.test(t)}_onSelect(t){if(this._closeDropdown(!0),!t.isCustom&&t.metadata==="now"&&(t.time=D(this._allowSeconds)),t.isCustom)if(typeof t.customCallback=="function"){let n=t.customCallback.call(null,t.metadata);if(typeof n!="number")throw new Error("Custom options must provide a time of day value in milliseconds.");t.time=n}else throw new Error("You must implement a `toMilliseconds` callback that returns the time value to use for this custom option.");if(this._value===t.time)return;let e=m(t.time,!0,this._allowSeconds);!this._emitChangeEvent(e)||(this._applyValue(t.time),this._selectInputText())}_selectInputText(){window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{this._adapter.isInputFocused()&&this._adapter.selectInputText()})})}_applyValue(t,e=!0){this._setValue(t);let i=this._formatValue(this._value);this._adapter.getInputValue()!==i&&this._adapter.setInputValue(i,e)}_normalizeTimeValue(t){return t==null?null:t<0?0:t>s.numbers.MAX_DAY_MILLIS?s.numbers.MAX_DAY_MILLIS:t}_openDropdown(){let t=this._generateTimeOptions();if(!this.allowDropdown||!t.length)return;this._formatInputValue(),this._open=!0,this._adapter.setHostAttribute(s.attributes.OPEN);let e=t.filter(o=>!o.divider&&!o.disabled),i=[],n;if(t.length){if(this._value!=null){let o=this._findClosestOptionIndex(this._value,e);o>=0&&(e[o].value.time===this._value?i=[e[o].value]:n=o)}else if(typeof this._startTime=="number"){let o=this._findClosestOptionIndex(this._startTime,e);o>=0&&o<e.length&&(n=o)}}let l={id:`forge-time-picker-${this._identifier}`,selectedValues:i,syncWidth:!0,activeStartIndex:n,popupClasses:this._popupClasses,popupStatic:!0,type:"standard",options:t,selectCallback:o=>this._onSelect(o),closeCallback:()=>this._closeDropdown(!0),activeChangeCallback:o=>this._adapter.setActiveDescendant(o),targetWidthCallback:()=>this._adapter.getTargetElementWidth(this._popupTarget)};this._adapter.attachDropdown(l),this._adapter.emitHostEvent(s.events.OPEN,void 0,!1)}_closeDropdown(t=!1){this._open=!1,this._adapter.removeHostAttribute(s.attributes.OPEN),this._adapter.detachDropdown(),t&&this._adapter.emitHostEvent(s.events.CLOSE,!0,!1)}_findClosestOptionIndex(t,e){let i=e.reduce((n,l)=>Math.abs((l.value.time||0)-t)<Math.abs((n.value.time||0)-t)?l:n);return e.indexOf(i)}_formatInputValue(t=!0){let e=this._adapter.getInputValue();if(this._allowInvalidTime&&!this._masked&&e&&!this._value)return;let i=this._formatValue(this._value);e!==i&&this._adapter.setInputValue(i,t)}_generateTimeOptions(){let t=this._min!=null?Math.max(v(this._min),0):0,e=this._max!=null?Math.min(v(this._max),s.numbers.MAX_DAY_MINUTES):s.numbers.MAX_DAY_MINUTES,i=this._step,n=[],l=[];if(this._showHourOptions){for(let d=t;d<=e&&d!==s.numbers.MAX_DAY_MINUTES;d+=i){let _=I(d),_t=this._restrictedTimes.includes(_),ht=m(_,this._use24HourTime,!1)||"",bt={time:_};n.push({label:ht,value:bt,disabled:_t})}let o=n.findIndex(d=>d.value.time/1e3/60>=720);o>=0&&o<n.length-1&&n.splice(o,0,{label:"",value:null,divider:!0})}if(this._showNow){let o={time:null,metadata:"now"};l.push({label:"Now",value:o})}if(Array.isArray(this._customOptions)&&this._customOptions.length){let o=this._customOptions.map(d=>{let _={time:null,metadata:d.value,isCustom:!0,customCallback:d.toMilliseconds};return{label:d.label,value:_}});l=[...l,...o]}return l.length&&(n.length&&n.splice(0,0,{label:"",value:null,divider:!0}),l.forEach((o,d)=>n.splice(d,0,o))),n}_convertTimeStringToMillis(t,e,i){return(!t||!this._isValidTimeFormat(t))&&(t=""),C(t,e,i)}_formatValue(t){return!this._masked&&typeof this._formatCallback=="function"?this._formatCallback.call(null,t,this._use24HourTime,this._allowSeconds):m(this._value,this._use24HourTime,this._allowSeconds)||""}_warnInvalidFormat(t){console.warn(`The specified value "${t}" 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.`)}get open(){return this._open}set open(t){this._open!==t&&this._isInitialized&&(this._open=t,this._open?this._openDropdown():this._closeDropdown())}get masked(){return this._masked}set masked(t){this._masked!==t&&(this._masked=t,this._isInitialized&&(this._masked?(this._adapter.removeInputListener("input",this._inputListener),this._applyMask()):(this._adapter.destroyMask(),this._formatInputValue(),this._adapter.addInputListener("input",this._inputListener))))}get showMaskFormat(){return this._showMaskFormat}set showMaskFormat(t){this._showMaskFormat!==t&&(this._showMaskFormat=t,this._isInitialized&&this._applyMask())}get allowSeconds(){return this._allowSeconds}set allowSeconds(t){this._allowSeconds!==t&&(this._allowSeconds=!!t,this._applyAllowSeconds(),this._isInitialized&&(this._applyMask(),this._formatInputValue()),this._adapter.setHostAttribute(s.attributes.ALLOW_SECONDS,`${!!t}`))}get use24HourTime(){return this._use24HourTime}set use24HourTime(t){this._use24HourTime!==t&&(this._use24HourTime=!!t,this._isInitialized&&(this._adapter.destroyMask(),this._formatInputValue(),this._applyMask()),this._adapter.setHostAttribute(s.attributes.USE_24_HOUR_TIME,`${!!t}`))}get allowInvalidTime(){return this._allowInvalidTime}set allowInvalidTime(t){this._allowInvalidTime!==t&&(this._allowInvalidTime=!!t,this._adapter.setHostAttribute(s.attributes.ALLOW_INVALID_TIME,`${!!t}`))}get value(){return m(this._value,!0,this._allowSeconds)}set value(t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}let e=this._validateMillis(this._convertTimeStringToMillis(t,!0,!0));this._setValue(e),this._isInitialized&&this._applyValue(this._value)}get min(){return m(this._min,!0,this._allowSeconds)}set min(t){if(this._min!==t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}this._min=this._convertTimeStringToMillis(t,!0,this._allowSeconds);let e=this._validateMillis(this._value);this._setValue(e),this._isInitialized&&this._applyValue(e)}}get max(){return m(this._max,!0,this._allowSeconds)}set max(t){if(this._max!==t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}this._max=this._convertTimeStringToMillis(t,!0,this._allowSeconds);let e=this._validateMillis(this._value);this._setValue(e),this._isInitialized&&this._applyValue(e)}}get restrictedTimes(){return this._restrictedTimes.map(t=>m(t,!0,this._allowSeconds)).filter(t=>typeof t=="string")}set restrictedTimes(t){Array.isArray(t)||(t=[]),this._restrictedTimes=t.filter(e=>typeof e=="string").map(e=>this._convertTimeStringToMillis(e,!0,!0)).filter(e=>typeof e=="number")}get startTime(){return m(this._startTime,!0,this._allowSeconds)}set startTime(t){if(this._startTime!==t){if(t&&!this._isValidInputValue(t)){this._warnInvalidFormat(t);return}this._startTime=this._convertTimeStringToMillis(t,!0,this._allowSeconds)}}get step(){return this._step}set step(t){this._step=t}get allowInput(){return this._allowInput}set allowInput(t){this._allowInput!==t&&(this._allowInput=t,this._isInitialized&&(this._applyAllowInput(),this._applyMask()))}get popupTarget(){return this._popupTarget}set popupTarget(t){this._popupTarget!==t&&(this._popupTarget=t)}get showNow(){return this._showNow}set showNow(t){this._showNow!==t&&(this._showNow=t)}get showHourOptions(){return this._showHourOptions}set showHourOptions(t){this._showHourOptions!==t&&(this._showHourOptions=t)}get customOptions(){return this._customOptions}set customOptions(t){this._customOptions=Array.isArray(t)?t:[]}set validationCallback(t){this._validationCallback=t,this._isInitialized&&this._applyMask()}set parseCallback(t){this._parseCallback=t}set formatCallback(t){this._formatCallback=t}set coercionCallback(t){this._coercionCallback=t}set prepareMaskCallback(t){this._prepareMaskCallback=t,this._isInitialized&&this._applyMask()}get disabled(){return this._disabled}set disabled(t){this._disabled!==t&&(this._disabled=!!t,this._isInitialized&&this._applyDisabled(),this._adapter.toggleHostAttribute(s.attributes.DISABLED,this._disabled))}get popupClasses(){return Array.isArray(this._popupClasses)?[...this._popupClasses]:this._popupClasses}set popupClasses(t){Array.isArray(t)?this._popupClasses=[...t]:this._popupClasses=[t]}get allowDropdown(){return this._allowDropdown}set allowDropdown(t){this._allowDropdown!==t&&(this._allowDropdown=t,this._isInitialized&&this._applyAllowDropdown())}};var Tt="<template><slot></slot></template>",kt=":host{display:block}:host([hidden]){display:none}",r=class extends W{constructor(){super();Z.define([rt,K]),H(this,Tt,kt),this._foundation=new T(new g(this))}static get observedAttributes(){return[s.attributes.VALUE,s.attributes.OPEN,s.attributes.ALLOW_SECONDS,s.attributes.MASKED,s.attributes.SHOW_MASK_FORMAT,s.attributes.USE_24_HOUR_TIME,s.attributes.ALLOW_INVALID_TIME,s.attributes.MIN,s.attributes.MAX,s.attributes.START_TIME,s.attributes.STEP,s.attributes.ALLOW_INPUT,s.attributes.SHOW_NOW,s.attributes.SHOW_HOUR_OPTIONS,s.attributes.DISABLED,s.attributes.POPUP_CLASSES,s.attributes.ALLOW_DROPDOWN]}connectedCallback(){this.querySelector(s.selectors.INPUT)?this._foundation.initialize():A(this,s.selectors.INPUT).then(()=>this._foundation.initialize())}disconnectedCallback(){this._foundation.disconnect()}attributeChangedCallback(e,i,n){switch(e){case s.attributes.VALUE:this.value=n;break;case s.attributes.OPEN:this.open=c(n);break;case s.attributes.ALLOW_SECONDS:this.allowSeconds=c(n);break;case s.attributes.MASKED:this.masked=c(n);break;case s.attributes.SHOW_MASK_FORMAT:this.showMaskFormat=c(n);break;case s.attributes.USE_24_HOUR_TIME:this.use24HourTime=c(n);break;case s.attributes.ALLOW_INVALID_TIME:this.allowInvalidTime=c(n);break;case s.attributes.SHOW_NOW:this.showNow=c(n);break;case s.attributes.SHOW_HOUR_OPTIONS:this.showHourOptions=c(n);break;case s.attributes.MIN:this.min=n;break;case s.attributes.MAX:this.max=n;break;case s.attributes.START_TIME:this.startTime=n;break;case s.attributes.STEP:this.step=L(n);break;case s.attributes.ALLOW_INPUT:this.allowInput=c(n);break;case s.attributes.DISABLED:this.disabled=c(n);break;case s.attributes.POPUP_CLASSES:this.popupClasses=n;break;case s.attributes.ALLOW_DROPDOWN:this.allowDropdown=c(n);break}}};p([u()],r.prototype,"value",2),p([u()],r.prototype,"open",2),p([u()],r.prototype,"allowSeconds",2),p([u()],r.prototype,"masked",2),p([u()],r.prototype,"showMaskFormat",2),p([u()],r.prototype,"use24HourTime",2),p([u()],r.prototype,"allowInvalidTime",2),p([u()],r.prototype,"min",2),p([u()],r.prototype,"max",2),p([u()],r.prototype,"restrictedTimes",2),p([u()],r.prototype,"startTime",2),p([u()],r.prototype,"step",2),p([u()],r.prototype,"allowInput",2),p([u()],r.prototype,"showNow",2),p([u()],r.prototype,"showHourOptions",2),p([u()],r.prototype,"customOptions",2),p([u()],r.prototype,"validationCallback",2),p([u()],r.prototype,"parseCallback",2),p([u()],r.prototype,"formatCallback",2),p([u()],r.prototype,"coercionCallback",2),p([u()],r.prototype,"prepareMaskCallback",2),p([u()],r.prototype,"disabled",2),p([u()],r.prototype,"popupClasses",2),p([u()],r.prototype,"allowDropdown",2),p([u()],r.prototype,"popupTarget",2),r=p([R({name:s.elementName,dependencies:[et,tt,ot,w,it,w,at]})],r);var ct=class extends ${constructor(e){super(e)}_build(){let e=document.createElement(s.elementName);return this._attachTextField(e),e}get inputElement(){return this._textFieldDelegate.inputElement}get textFieldElement(){return this._textFieldDelegate.element}get value(){return this._element.value}set value(e){this._element.value=e}get disabled(){return this._element.disabled}set disabled(e){this._element.disabled=e}get invalid(){return this._textFieldDelegate.invalid||!1}set invalid(e){this._textFieldDelegate.invalid=e}onChange(e){this._element.addEventListener(s.events.CHANGE,i=>{var n;return e((n=i.detail)!=null?n:"")})}onInput(e){this._element.masked?this._element.addEventListener(s.events.INPUT,i=>{var n;return e((n=i.detail)!=null?n:"")}):this._textFieldDelegate.inputElement.addEventListener("input",i=>e(i.target.value))}onFocus(e){this._textFieldDelegate.inputElement.addEventListener("focus",i=>e(i))}onBlur(e){this._textFieldDelegate.inputElement.addEventListener("blur",i=>e(i))}_attachTextField(e){var n,l,o,d;let i={props:k({},(l=(n=this._config.options)==null?void 0:n.textFieldDelegateConfig)==null?void 0:l.props),options:k({},(d=(o=this._config.options)==null?void 0:o.textFieldDelegateConfig)==null?void 0:d.options)};this._textFieldDelegate=new nt(i),e.appendChild(this._textFieldDelegate.element)}};function xe(){N(r)}export{s as a,g as b,C as c,m as d,pt as e,ut as f,v as g,M as h,It as i,dt as j,I as k,O as l,mt as m,D as n,Rt as o,T as p,r as q,ct as r,xe as s};
7
+ //# sourceMappingURL=chunk.KKF2ZZMD.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Tyler Technologies, Inc.
4
+ * License: Apache-2.0
5
+ */
6
+ import{g as l}from"./chunk.G76HB2FK.js";var M=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/,T=/a-z/i,g=10;function A(e){if(e=e.replace(/_|\s/g,""),M.test(e)){let a=new Date(e);if(T.test(e)||a.setMinutes(a.getMinutes()+a.getTimezoneOffset()),l(a))return a}let t=[];e.indexOf("/")!==-1?t=e.split("/"):e.indexOf("-")!==-1?t=e.split("-"):(e.length===6||e.length===8)&&!isNaN(+e)&&(t=[e.substring(0,2),e.substring(2,4),e.substring(4)]);let s=t.length===3,[n,i,r]=t;if(n==="0"&&(n="1"),i==="0"&&(i="1"),typeof r=="string"&&r.length===3&&(r=r.padEnd(4,"0")),s){let a=n.length===1||n.length===2,c=i.length===1||i.length===2,p=r.length===2||r.length===4;if(!a||!c||!p)return null}else return null;if(r.length===2){let a=new Date().getFullYear()-(100-g),c=new Date().getFullYear()+g,p=String(a).slice(0,2),b=String(c).slice(0,2),S=+String(c).slice(2);r=+r<=S?`${b}${r}`:`${p}${r}`}let o=+n,u=+i,f=+r;o>12&&(o=12);let d=new Date(f,o,0).getDate();u>d&&(u=d);let m=new Date(f,o-1,u,0,0,0,0);return l(m)?m:null}function C(e){let t=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0"),n=e.getFullYear();return[t,s,n].join("/")}function I(e,t){return!e&&!t?!0:!e||!t||!l(e)||!l(t)?!1:e.setHours(0,0,0,0)===t.setHours(0,0,0,0)}function D(e,t){return new Date(t!=null?t:1970,e+1,0)}function _(e,t){return D(e,t).getDate()}function w(e,t){let s=document.createElement("div");s.innerHTML=e;for(let i=s.childNodes.length-1;i>=0;i--)s.childNodes[i].nodeName.toLowerCase()!=="svg"&&s.removeChild(s.childNodes[i]);let n=s.firstElementChild;return n&&n.nodeName.toLowerCase()==="svg"&&h(n)?(t&&n.setAttribute("viewBox",t),!n.hasAttribute("viewBox")&&t&&n.setAttribute("viewBox",t),n.removeAttribute("height"),n.removeAttribute("width"),n):null}function h(e){if(e.nodeType!==1)return!0;if(e.nodeName.toLowerCase()==="script")return!1;let t=Array.from(e.attributes);for(let n of t)if(typeof n.name=="string"&&n.name.toLowerCase().startsWith("on"))return!1;let s=Array.from(e.childNodes);for(let n of s)if(!h(n))return!1;return!0}var x=/^(0?[0-9]|1\d|2[0-3]):([0-5]\d)(:([0-5]\d))?$/,E=/^(0?[1-9]|1[0-2]):([0-5]\d)(:([0-5]\d))?\s*([AaPp][Mm])?$/,L=/^(\d\d?):?(\d\d?)(:?(\d?\d?))?\s*([AaPp][Mm]?)?$/;function Y(e){let t=e.match(x)||[null,0,0,null,0],s=t[1],n=t[2],i=t[4];return{hours:s,minutes:n,seconds:i}}function R(e){let t=e.match(E)||[null,0,0,null,0,"AM"],s=t[1],n=t[2],i=t[4],r=t[5];return{hours:s,minutes:n,seconds:i,meridiem:r}}function P(e){return x.test(e)||E.test(e)}function $(e,t,s){if(e=e&&typeof e=="string"?e.replace(/_|\s/g,""):"",/^\s*$/.test(e))return"";let n=e.match(L);if(!n)return"";let i=n[1],r=n[2],o=n[4],u=n[5];t?u="":/[AaPp][Mm]/.test(u)?u=u.toUpperCase():/^[AaPp]/.test(u)?u.toLowerCase().startsWith("a")?u="AM":u.toLowerCase().startsWith("p")&&(u="PM"):u="";let f=+i||0,d=+r||0,m=!u||t?23:12;if(f>=m?i=String(m):f<0&&(i="00"),r!==void 0&&(d>59?r="59":d<0?r="00":r=r.padStart(2,"0")),o!==void 0){let c=+o||0;c>59?o="59":c<0?o="00":o=o.padStart(2,"0")}let a=i;return r!==void 0&&(a+=`:${r}`,o===void 0&&s&&(o="00")),o!==void 0&&(a+=`:${o}`),u&&(a+=` ${u}`),a}function H(e,t){let n=e.toLowerCase().indexOf(t.toLowerCase());if(n!==-1){let i=n+t.length,r=document.createElement("span"),o=document.createElement("span");return o.style.fontWeight="bold",o.textContent=e.substring(n,i),r.appendChild(document.createTextNode(e.substring(0,n))),r.appendChild(o),r.appendChild(document.createTextNode(e.substring(i))),r}}function V(e,{capture:t=!0,pointerenter:s=!0,focusin:n=!0}={}){return new Promise(i=>{let r={once:!0,capture:t},o=()=>{n&&e.removeEventListener("focusin",u,r),i("pointerenter")},u=()=>{s&&e.removeEventListener("pointerenter",o,r),i("focusin")};s&&e.addEventListener("pointerenter",o,r),n&&e.addEventListener("focusin",u,r)})}function G(e,t){return t===0?0:e/100*t}function v(e,t){return t===0?0:e*100/t}function W(e,t,s,n=0,i=100){let r=s-t,o=e-t;return!r||!o?n:o*i/r+n}function U(...e){return Math.min(...e.map(t=>t!=null?t:Number.POSITIVE_INFINITY))}function j(...e){return Math.max(...e.map(t=>t!=null?t:Number.NEGATIVE_INFINITY))}function z(e,t){Object.keys(e).filter(s=>s in t).forEach(s=>t[s]=e[s])}export{M as a,T as b,A as c,C as d,I as e,D as f,_ as g,w as h,h as i,x as j,E as k,L as l,Y as m,R as n,P as o,$ as p,H as q,V as r,G as s,v as t,W as u,U as v,j as w,z as x};
7
+ //# sourceMappingURL=chunk.KYCC3C3M.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/core/utils/date-utils.ts", "../../src/core/utils/svg-utils.ts", "../../src/core/utils/time-utils.ts", "../../src/core/utils/utils.ts"],
4
- "sourcesContent": ["import { isValidDate } from '@tylertech/forge-core';\n\nexport const ISO_8601_REGEX = /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24\\:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\nexport const ISO_TIMEZONE_REGEX = /a-z/i;\nconst FUTURE_YEAR_COERCION = 10; // The number of years in the future to coerce two-digit years into current century\n\n/**\n * Parses a date string value to a `Date` object in local time.\n * @param str The date string value.\n */\nexport function parseDateString(value: string): Date | null {\n value = value.replace(/_|\\s/g, ''); // Remove potential extraneous characters\n\n // We first check if this is a valid date in ISO 8601 format and return it if so\n if (ISO_8601_REGEX.test(value)) {\n const iso8601Date = new Date(value);\n\n // This is an ISO string, but does it have a timezone? If not, we add current timezone offset\n if (!ISO_TIMEZONE_REGEX.test(value)) {\n iso8601Date.setMinutes(iso8601Date.getMinutes() + iso8601Date.getTimezoneOffset());\n }\n\n if (isValidDate(iso8601Date)) {\n return iso8601Date;\n }\n }\n\n let values: string[] = [];\n\n // We accept dates with a \"/\" or \"-\" separator and in the format of MM/DD/YYYY\n if (value.indexOf('/') !== -1) {\n values = value.split('/');\n } else if (value.indexOf('-') !== -1) {\n values = value.split('-');\n } else if ((value.length === 6 || value.length === 8) && !isNaN(+value)) {\n values = [value.substring(0, 2), value.substring(2, 4), value.substring(4)];\n }\n\n const hasMonthDayYear = values.length === 3;\n let [month, day, year] = values;\n\n // Ensure are month and year values are coerced from 0 to 1 in case of incomplete entry\n if (month === '0') {\n month = '1';\n }\n if (day === '0') {\n day = '1';\n }\n\n // Trap for the case where only 3 digit years are entered\n if (typeof year === 'string' && year.length === 3) {\n year = year.padEnd(4, '0');\n }\n \n if (hasMonthDayYear) {\n const isValidMonthLength = month.length === 1 || month.length === 2;\n const isValidDayLength = day.length === 1 || day.length === 2;\n const isValidYearLength = year.length === 2 || year.length === 4;\n\n if (!isValidMonthLength || !isValidDayLength || !isValidYearLength) {\n return null;\n }\n } else {\n return null;\n }\n\n // Check if we need to coerce two-digit years to the four-digit equivalent\n if (year.length === 2) {\n const minYear = new Date().getFullYear() - (100 - FUTURE_YEAR_COERCION);\n const maxYear = new Date().getFullYear() + FUTURE_YEAR_COERCION;\n const minYearCentury = String(minYear).slice(0, 2);\n const maxYearCentury = String(maxYear).slice(0, 2);\n const normalizedMaxYear = +String(maxYear).slice(2);\n year = +year <= normalizedMaxYear ? `${maxYearCentury}${year}` : `${minYearCentury}${year}`;\n }\n\n let numMonth = +month;\n let numDay = +day;\n const numYear = +year;\n\n if (numMonth > 12) {\n numMonth = 12;\n }\n\n const maxDaysInMonth = new Date(numYear, numMonth, 0).getDate();\n\n if (numDay > maxDaysInMonth) {\n numDay = maxDaysInMonth;\n }\n\n const parsedDate = new Date(numYear, numMonth - 1, numDay, 0, 0, 0, 0);\n return isValidDate(parsedDate) ? parsedDate : null;\n}\n\n/**\n * Formats a `Date` to a specified format.\n * @param str The date string value.\n */\nexport function formatDate(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const year = date.getFullYear();\n return [month, day, year].join('/');\n}\n\n/**\n * Determines if two date objects are equal.\n * \n * Note: Time values are ignored.\n * @param first The date to compare.\n * @param second The date to compare the first date to. \n * @returns A boolean whether the two dates are equivalent.\n */\nexport function isSameDate(first?: Date | null, second?: Date | null): boolean {\n if (!first && !second) {\n return true;\n } else if (!first || !second) {\n return false;\n } else if (!isValidDate(first) || !isValidDate(second)) {\n return false;\n }\n return first.setHours(0, 0, 0, 0) === second.setHours(0, 0, 0, 0);\n}\n\n/** \n * Returns the last date on a month.\n * \n * @param month The month.\n * @param year The year of the month, needed for February otherwise optional.\n * @returns The last date of the given month.\n */\nexport function getLastDateOfMonth(month: number, year?: number): Date {\n return new Date(year ?? 1970, month + 1, 0);\n}\n\n/**\n * Returns the number of days in a month.\n * \n * @param month The month to find the length of.\n * @param year The year to check within, needed for February otherwise optional.\n * @returns The number of days in the month.\n */\nexport function getMonthLength(month: number, year?: number): number {\n return getLastDateOfMonth(month, year).getDate();\n}\n", "/**\n * Creates an SVG element from a string.\n */\nexport function createSvgFromString(svgContent: string, defaultViewBox?: string): SVGSVGElement | null {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // Remove all non-svg child nodes\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n const svgElm = div.firstElementChild as SVGSVGElement;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg' && isSafeSvg(svgElm)) {\n // Check if a custom viewbox value was provided and use that if so\n if (defaultViewBox) {\n svgElm.setAttribute('viewBox', defaultViewBox);\n }\n\n // Force a default viewBox if one doesn't exist (this ensures our icon is scalable)\n if (!svgElm.hasAttribute('viewBox') && defaultViewBox) {\n svgElm.setAttribute('viewBox', defaultViewBox);\n }\n\n // Remove any height and width attributes to ensure that the icon is properly scalable\n svgElm.removeAttribute('height');\n svgElm.removeAttribute('width');\n\n return svgElm;\n }\n\n return null;\n}\n\n/**\n * Determines if the provided element is a safe SVG to use.\n * @param el The element reference to test.\n */\nexport function isSafeSvg(el: Element): boolean {\n if (el.nodeType !== 1) {\n return true;\n }\n\n // Validate no <script> tags exist\n if (el.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n // Ensure there are no inline listeners\n const attributes = Array.from(el.attributes);\n for (const attr of attributes) {\n if (typeof attr.name === 'string' && attr.name.toLowerCase().startsWith('on')) {\n return false;\n }\n }\n\n // Ensure all child nodes are valid\n const childNodes = Array.from(el.childNodes) as Element[];\n for (const node of childNodes) {\n if (!isSafeSvg(node)) {\n return false;\n }\n }\n\n return true;\n}\n", "export const TWENTY_FOUR_HOUR_TIME_REGEX = /^(0?[0-9]|1\\d|2[0-3]):([0-5]\\d)(:([0-5]\\d))?$/;\nexport const TWELVE_HOUR_TIME_REGEX = /^(0?[1-9]|1[0-2]):([0-5]\\d)(:([0-5]\\d))?\\s*([AaPp][Mm])?$/;\nexport const PARSEABLE_TIME_FORMAT = /^(\\d\\d?):?(\\d\\d?)(:?(\\d?\\d?))?\\s*([AaPp][Mm]?)?$/;\n\nexport function tokenize24HourTimeString(value: string): { hours: string; minutes: string; seconds: string } {\n const matches = value.match(TWENTY_FOUR_HOUR_TIME_REGEX) as RegExpMatchArray || [null, 0, 0, null, 0];\n const hours = matches[1];\n const minutes = matches[2];\n const seconds = matches[4];\n return { hours, minutes, seconds };\n}\n\nexport function tokenize12HourTimeString(value: string): { hours: string; minutes: string; seconds: string; meridiem: string } {\n const matches = value.match(TWELVE_HOUR_TIME_REGEX) as RegExpMatchArray || [null, 0, 0, null, 0, 'AM'];\n const hours = matches[1];\n const minutes = matches[2];\n const seconds = matches[4];\n const meridiem = matches[5];\n return { hours, minutes, seconds, meridiem };\n}\n\nexport function isSupportedTimeFormat(value: string): boolean {\n return TWENTY_FOUR_HOUR_TIME_REGEX.test(value) ||\n TWELVE_HOUR_TIME_REGEX.test(value);\n}\n\nexport function tryCoerceTimeString(str: string, use24HourTime: boolean, allowSeconds: boolean): string {\n str = str && typeof str === 'string' ? str.replace(/_|\\s/g, '') : '';\n if (/^\\s*$/.test(str)) {\n return '';\n }\n\n const matches = str.match(PARSEABLE_TIME_FORMAT);\n if (!matches) {\n return '';\n }\n\n let hoursStr = matches[1];\n let minutesStr = matches[2];\n let secondsStr = matches[4];\n let meridiem = matches[5];\n\n // Normalize the meridiem string\n if (use24HourTime) {\n meridiem = '';\n } else if (/[AaPp][Mm]/.test(meridiem)) {\n meridiem = meridiem.toUpperCase();\n } else {\n if (/^[AaPp]/.test(meridiem)) {\n if (meridiem.toLowerCase().startsWith('a')) {\n meridiem = 'AM';\n } else if (meridiem.toLowerCase().startsWith('p')) {\n meridiem = 'PM';\n }\n } else {\n meridiem = '';\n }\n }\n\n const hoursNum = +hoursStr || 0;\n const minutesNum = +minutesStr || 0;\n\n // Clamp and normalize hours\n const maxHours = !meridiem || use24HourTime ? 23 : 12;\n if (hoursNum >= maxHours) {\n hoursStr = String(maxHours);\n } else if (hoursNum < 0) {\n hoursStr = '00';\n }\n\n // Clamp and normalize minutes\n if (minutesStr !== undefined) {\n if (minutesNum > 59) {\n minutesStr = '59';\n } else if (minutesNum < 0) {\n minutesStr = '00';\n } else {\n minutesStr = minutesStr.padStart(2, '0');\n }\n }\n\n // Clamp and normalize seconds (if applicable)\n if (secondsStr !== undefined) {\n const secondsNum = +secondsStr || 0;\n if (secondsNum > 59) {\n secondsStr = '59';\n } else if (secondsNum < 0) {\n secondsStr = '00';\n } else {\n secondsStr = secondsStr.padStart(2, '0');\n }\n }\n\n // Build resulting time string\n let timeStr = hoursStr;\n if (minutesStr !== undefined) {\n timeStr += `:${minutesStr}`;\n if (secondsStr === undefined && allowSeconds) {\n secondsStr = '00';\n }\n }\n if (secondsStr !== undefined) {\n timeStr += `:${secondsStr}`;\n }\n if (meridiem) {\n timeStr += ` ${meridiem}`;\n }\n\n return timeStr;\n}\n", "/**\n * Highlights text in the given label by converting it to HTML and using a `<span>` tag to show the highlighted text within the original label.\n * @param label The full text.\n * @param highlightText The text to highlight.\n */\nexport function highlightTextHTML(label: string, highlightText: string): HTMLElement | undefined {\n const text = label.toLowerCase();\n const startIndex = text.indexOf(highlightText.toLowerCase());\n\n if (startIndex !== -1) {\n const endIndex = startIndex + highlightText.length;\n const wrapperSpan = document.createElement('span');\n const highlightSpan = document.createElement('span');\n\n highlightSpan.style.fontWeight = 'bold';\n highlightSpan.textContent = label.substring(startIndex, endIndex);\n \n wrapperSpan.appendChild(document.createTextNode(label.substring(0, startIndex)));\n wrapperSpan.appendChild(highlightSpan);\n wrapperSpan.appendChild(document.createTextNode(label.substring(endIndex)));\n \n return wrapperSpan;\n }\n\n return undefined;\n}\n\n\n/**\n * Awaits user interaction on an element in the form of `pointerenter` or `focusin` to let a listener know\n * when the user has attempted to interact with the provided element.\n * \n * The listeners are only called once, and the other is removed after one of the listeners is called.\n * @param element The element to listen to.\n * @param capture Whether to use capturing listeners or not.\n * @returns A `Promise` that will be resolved when either of the listeners has executed.\n */\nexport function userInteractionListener(element: HTMLElement, { capture = true, pointerenter = true, focusin = true } = {}): Promise<'pointerenter' | 'focusin'> {\n return new Promise<'pointerenter' | 'focusin'>(resolve => {\n const listenerOpts: EventListenerOptions & { once: boolean } = { once: true, capture };\n \n const handlePointerenter = (): void => {\n if (focusin) {\n element.removeEventListener('focusin', handleFocusin, listenerOpts);\n }\n resolve('pointerenter');\n };\n \n const handleFocusin = (): void => {\n if (pointerenter) {\n element.removeEventListener('pointerenter', handlePointerenter, listenerOpts);\n }\n resolve('focusin');\n };\n\n if (pointerenter) {\n element.addEventListener('pointerenter', handlePointerenter, listenerOpts);\n }\n if (focusin) {\n element.addEventListener('focusin', handleFocusin, listenerOpts);\n }\n });\n}\n\n/**\n * Converts a percent value to pixels.\n * @param amount A percent value.\n * @param containerSize The size of the parent element along the relevant axis.\n * @returns A pixel value.\n */\nexport function percentToPixels(amount: number, containerSize: number): number {\n if (containerSize === 0) {\n return 0;\n }\n return amount / 100 * containerSize;\n}\n\n/**\n * Converts a pixel value to a percentage.\n * @param amount A pixel value.\n * @param containerSize The size of the parent element along the relevant axis.\n * @returns A percent value.\n */\nexport function pixelsToPercent(amount: number, containerSize: number): number {\n if (containerSize === 0) {\n return 0;\n }\n return amount * 100 / containerSize;\n}\n\n/**\n * Scales a value from one range to another.\n * @param value The original number value.\n * @param fromMin The lower bound of the input range.\n * @param fromMax The upper bound of the input range.\n * @param toMin The lower bound of the output range (defaults to 0).\n * @param toMax The lower bound of the output range (defaults to 100).\n * @returns A value mapped to the output range.\n */\nexport function scaleValue(value: number, fromMin: number, fromMax: number, toMin = 0, toMax = 100): number {\n const range = fromMax - fromMin;\n const adjustedValue = value - fromMin;\n if (!range || !adjustedValue) {\n return toMin;\n }\n return adjustedValue * toMax / range + toMin;\n}\n\n/**\n * Returns the min of a set of numbers where some values may be undefined.\n * @param args `number` or `undefined` values to compare.\n * @returns The min value or `Number.POSITIVE_INFINITY` if all values are `undefined`.\n */\nexport function safeMin(...args: (number | undefined)[]): number {\n return Math.min(...args.map(arg => arg ?? Number.POSITIVE_INFINITY));\n}\n\n/**\n * Returns the max of a set of numbers where some values may be undefined.\n * @param args `number` or `undefined` values to compare.\n * @returns The max value or `Number.NEGATIVE_INFINITY` if all values are `undefined`.\n */\nexport function safeMax(...args: (number | undefined)[]): number {\n return Math.max(...args.map(arg => arg ?? Number.NEGATIVE_INFINITY));\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { isValidDate } from '@tylertech/forge-core';\n\nexport const ISO_8601_REGEX = /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24\\:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\nexport const ISO_TIMEZONE_REGEX = /a-z/i;\nconst FUTURE_YEAR_COERCION = 10; // The number of years in the future to coerce two-digit years into current century\n\n/**\n * Parses a date string value to a `Date` object in local time.\n * @param str The date string value.\n */\nexport function parseDateString(value: string): Date | null {\n value = value.replace(/_|\\s/g, ''); // Remove potential extraneous characters\n\n // We first check if this is a valid date in ISO 8601 format and return it if so\n if (ISO_8601_REGEX.test(value)) {\n const iso8601Date = new Date(value);\n\n // This is an ISO string, but does it have a timezone? If not, we add current timezone offset\n if (!ISO_TIMEZONE_REGEX.test(value)) {\n iso8601Date.setMinutes(iso8601Date.getMinutes() + iso8601Date.getTimezoneOffset());\n }\n\n if (isValidDate(iso8601Date)) {\n return iso8601Date;\n }\n }\n\n let values: string[] = [];\n\n // We accept dates with a \"/\" or \"-\" separator and in the format of MM/DD/YYYY\n if (value.indexOf('/') !== -1) {\n values = value.split('/');\n } else if (value.indexOf('-') !== -1) {\n values = value.split('-');\n } else if ((value.length === 6 || value.length === 8) && !isNaN(+value)) {\n values = [value.substring(0, 2), value.substring(2, 4), value.substring(4)];\n }\n\n const hasMonthDayYear = values.length === 3;\n let [month, day, year] = values;\n\n // Ensure are month and year values are coerced from 0 to 1 in case of incomplete entry\n if (month === '0') {\n month = '1';\n }\n if (day === '0') {\n day = '1';\n }\n\n // Trap for the case where only 3 digit years are entered\n if (typeof year === 'string' && year.length === 3) {\n year = year.padEnd(4, '0');\n }\n \n if (hasMonthDayYear) {\n const isValidMonthLength = month.length === 1 || month.length === 2;\n const isValidDayLength = day.length === 1 || day.length === 2;\n const isValidYearLength = year.length === 2 || year.length === 4;\n\n if (!isValidMonthLength || !isValidDayLength || !isValidYearLength) {\n return null;\n }\n } else {\n return null;\n }\n\n // Check if we need to coerce two-digit years to the four-digit equivalent\n if (year.length === 2) {\n const minYear = new Date().getFullYear() - (100 - FUTURE_YEAR_COERCION);\n const maxYear = new Date().getFullYear() + FUTURE_YEAR_COERCION;\n const minYearCentury = String(minYear).slice(0, 2);\n const maxYearCentury = String(maxYear).slice(0, 2);\n const normalizedMaxYear = +String(maxYear).slice(2);\n year = +year <= normalizedMaxYear ? `${maxYearCentury}${year}` : `${minYearCentury}${year}`;\n }\n\n let numMonth = +month;\n let numDay = +day;\n const numYear = +year;\n\n if (numMonth > 12) {\n numMonth = 12;\n }\n\n const maxDaysInMonth = new Date(numYear, numMonth, 0).getDate();\n\n if (numDay > maxDaysInMonth) {\n numDay = maxDaysInMonth;\n }\n\n const parsedDate = new Date(numYear, numMonth - 1, numDay, 0, 0, 0, 0);\n return isValidDate(parsedDate) ? parsedDate : null;\n}\n\n/**\n * Formats a `Date` to a specified format.\n * @param str The date string value.\n */\nexport function formatDate(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const year = date.getFullYear();\n return [month, day, year].join('/');\n}\n\n/**\n * Determines if two date objects are equal.\n * \n * Note: Time values are ignored.\n * @param first The date to compare.\n * @param second The date to compare the first date to. \n * @returns A boolean whether the two dates are equivalent.\n */\nexport function isSameDate(first?: Date | null, second?: Date | null): boolean {\n if (!first && !second) {\n return true;\n } else if (!first || !second) {\n return false;\n } else if (!isValidDate(first) || !isValidDate(second)) {\n return false;\n }\n return first.setHours(0, 0, 0, 0) === second.setHours(0, 0, 0, 0);\n}\n\n/** \n * Returns the last date on a month.\n * \n * @param month The month.\n * @param year The year of the month, needed for February otherwise optional.\n * @returns The last date of the given month.\n */\nexport function getLastDateOfMonth(month: number, year?: number): Date {\n return new Date(year ?? 1970, month + 1, 0);\n}\n\n/**\n * Returns the number of days in a month.\n * \n * @param month The month to find the length of.\n * @param year The year to check within, needed for February otherwise optional.\n * @returns The number of days in the month.\n */\nexport function getMonthLength(month: number, year?: number): number {\n return getLastDateOfMonth(month, year).getDate();\n}\n", "/**\n * Creates an SVG element from a string.\n */\nexport function createSvgFromString(svgContent: string, defaultViewBox?: string): SVGSVGElement | null {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // Remove all non-svg child nodes\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n const svgElm = div.firstElementChild as SVGSVGElement;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg' && isSafeSvg(svgElm)) {\n // Check if a custom viewbox value was provided and use that if so\n if (defaultViewBox) {\n svgElm.setAttribute('viewBox', defaultViewBox);\n }\n\n // Force a default viewBox if one doesn't exist (this ensures our icon is scalable)\n if (!svgElm.hasAttribute('viewBox') && defaultViewBox) {\n svgElm.setAttribute('viewBox', defaultViewBox);\n }\n\n // Remove any height and width attributes to ensure that the icon is properly scalable\n svgElm.removeAttribute('height');\n svgElm.removeAttribute('width');\n\n return svgElm;\n }\n\n return null;\n}\n\n/**\n * Determines if the provided element is a safe SVG to use.\n * @param el The element reference to test.\n */\nexport function isSafeSvg(el: Element): boolean {\n if (el.nodeType !== 1) {\n return true;\n }\n\n // Validate no <script> tags exist\n if (el.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n // Ensure there are no inline listeners\n const attributes = Array.from(el.attributes);\n for (const attr of attributes) {\n if (typeof attr.name === 'string' && attr.name.toLowerCase().startsWith('on')) {\n return false;\n }\n }\n\n // Ensure all child nodes are valid\n const childNodes = Array.from(el.childNodes) as Element[];\n for (const node of childNodes) {\n if (!isSafeSvg(node)) {\n return false;\n }\n }\n\n return true;\n}\n", "export const TWENTY_FOUR_HOUR_TIME_REGEX = /^(0?[0-9]|1\\d|2[0-3]):([0-5]\\d)(:([0-5]\\d))?$/;\nexport const TWELVE_HOUR_TIME_REGEX = /^(0?[1-9]|1[0-2]):([0-5]\\d)(:([0-5]\\d))?\\s*([AaPp][Mm])?$/;\nexport const PARSEABLE_TIME_FORMAT = /^(\\d\\d?):?(\\d\\d?)(:?(\\d?\\d?))?\\s*([AaPp][Mm]?)?$/;\n\nexport function tokenize24HourTimeString(value: string): { hours: string; minutes: string; seconds: string } {\n const matches = value.match(TWENTY_FOUR_HOUR_TIME_REGEX) as RegExpMatchArray || [null, 0, 0, null, 0];\n const hours = matches[1];\n const minutes = matches[2];\n const seconds = matches[4];\n return { hours, minutes, seconds };\n}\n\nexport function tokenize12HourTimeString(value: string): { hours: string; minutes: string; seconds: string; meridiem: string } {\n const matches = value.match(TWELVE_HOUR_TIME_REGEX) as RegExpMatchArray || [null, 0, 0, null, 0, 'AM'];\n const hours = matches[1];\n const minutes = matches[2];\n const seconds = matches[4];\n const meridiem = matches[5];\n return { hours, minutes, seconds, meridiem };\n}\n\nexport function isSupportedTimeFormat(value: string): boolean {\n return TWENTY_FOUR_HOUR_TIME_REGEX.test(value) ||\n TWELVE_HOUR_TIME_REGEX.test(value);\n}\n\nexport function tryCoerceTimeString(str: string, use24HourTime: boolean, allowSeconds: boolean): string {\n str = str && typeof str === 'string' ? str.replace(/_|\\s/g, '') : '';\n if (/^\\s*$/.test(str)) {\n return '';\n }\n\n const matches = str.match(PARSEABLE_TIME_FORMAT);\n if (!matches) {\n return '';\n }\n\n let hoursStr = matches[1];\n let minutesStr = matches[2];\n let secondsStr = matches[4];\n let meridiem = matches[5];\n\n // Normalize the meridiem string\n if (use24HourTime) {\n meridiem = '';\n } else if (/[AaPp][Mm]/.test(meridiem)) {\n meridiem = meridiem.toUpperCase();\n } else {\n if (/^[AaPp]/.test(meridiem)) {\n if (meridiem.toLowerCase().startsWith('a')) {\n meridiem = 'AM';\n } else if (meridiem.toLowerCase().startsWith('p')) {\n meridiem = 'PM';\n }\n } else {\n meridiem = '';\n }\n }\n\n const hoursNum = +hoursStr || 0;\n const minutesNum = +minutesStr || 0;\n\n // Clamp and normalize hours\n const maxHours = !meridiem || use24HourTime ? 23 : 12;\n if (hoursNum >= maxHours) {\n hoursStr = String(maxHours);\n } else if (hoursNum < 0) {\n hoursStr = '00';\n }\n\n // Clamp and normalize minutes\n if (minutesStr !== undefined) {\n if (minutesNum > 59) {\n minutesStr = '59';\n } else if (minutesNum < 0) {\n minutesStr = '00';\n } else {\n minutesStr = minutesStr.padStart(2, '0');\n }\n }\n\n // Clamp and normalize seconds (if applicable)\n if (secondsStr !== undefined) {\n const secondsNum = +secondsStr || 0;\n if (secondsNum > 59) {\n secondsStr = '59';\n } else if (secondsNum < 0) {\n secondsStr = '00';\n } else {\n secondsStr = secondsStr.padStart(2, '0');\n }\n }\n\n // Build resulting time string\n let timeStr = hoursStr;\n if (minutesStr !== undefined) {\n timeStr += `:${minutesStr}`;\n if (secondsStr === undefined && allowSeconds) {\n secondsStr = '00';\n }\n }\n if (secondsStr !== undefined) {\n timeStr += `:${secondsStr}`;\n }\n if (meridiem) {\n timeStr += ` ${meridiem}`;\n }\n\n return timeStr;\n}\n", "/**\n * Highlights text in the given label by converting it to HTML and using a `<span>` tag to show the highlighted text within the original label.\n * @param label The full text.\n * @param highlightText The text to highlight.\n */\nexport function highlightTextHTML(label: string, highlightText: string): HTMLElement | undefined {\n const text = label.toLowerCase();\n const startIndex = text.indexOf(highlightText.toLowerCase());\n\n if (startIndex !== -1) {\n const endIndex = startIndex + highlightText.length;\n const wrapperSpan = document.createElement('span');\n const highlightSpan = document.createElement('span');\n\n highlightSpan.style.fontWeight = 'bold';\n highlightSpan.textContent = label.substring(startIndex, endIndex);\n \n wrapperSpan.appendChild(document.createTextNode(label.substring(0, startIndex)));\n wrapperSpan.appendChild(highlightSpan);\n wrapperSpan.appendChild(document.createTextNode(label.substring(endIndex)));\n \n return wrapperSpan;\n }\n\n return undefined;\n}\n\n\n/**\n * Awaits user interaction on an element in the form of `pointerenter` or `focusin` to let a listener know\n * when the user has attempted to interact with the provided element.\n * \n * The listeners are only called once, and the other is removed after one of the listeners is called.\n * @param element The element to listen to.\n * @param capture Whether to use capturing listeners or not.\n * @returns A `Promise` that will be resolved when either of the listeners has executed.\n */\nexport function userInteractionListener(element: HTMLElement, { capture = true, pointerenter = true, focusin = true } = {}): Promise<'pointerenter' | 'focusin'> {\n return new Promise<'pointerenter' | 'focusin'>(resolve => {\n const listenerOpts: EventListenerOptions & { once: boolean } = { once: true, capture };\n \n const handlePointerenter = (): void => {\n if (focusin) {\n element.removeEventListener('focusin', handleFocusin, listenerOpts);\n }\n resolve('pointerenter');\n };\n \n const handleFocusin = (): void => {\n if (pointerenter) {\n element.removeEventListener('pointerenter', handlePointerenter, listenerOpts);\n }\n resolve('focusin');\n };\n\n if (pointerenter) {\n element.addEventListener('pointerenter', handlePointerenter, listenerOpts);\n }\n if (focusin) {\n element.addEventListener('focusin', handleFocusin, listenerOpts);\n }\n });\n}\n\n/**\n * Converts a percent value to pixels.\n * @param amount A percent value.\n * @param containerSize The size of the parent element along the relevant axis.\n * @returns A pixel value.\n */\nexport function percentToPixels(amount: number, containerSize: number): number {\n if (containerSize === 0) {\n return 0;\n }\n return amount / 100 * containerSize;\n}\n\n/**\n * Converts a pixel value to a percentage.\n * @param amount A pixel value.\n * @param containerSize The size of the parent element along the relevant axis.\n * @returns A percent value.\n */\nexport function pixelsToPercent(amount: number, containerSize: number): number {\n if (containerSize === 0) {\n return 0;\n }\n return amount * 100 / containerSize;\n}\n\n/**\n * Scales a value from one range to another.\n * @param value The original number value.\n * @param fromMin The lower bound of the input range.\n * @param fromMax The upper bound of the input range.\n * @param toMin The lower bound of the output range (defaults to 0).\n * @param toMax The lower bound of the output range (defaults to 100).\n * @returns A value mapped to the output range.\n */\nexport function scaleValue(value: number, fromMin: number, fromMax: number, toMin = 0, toMax = 100): number {\n const range = fromMax - fromMin;\n const adjustedValue = value - fromMin;\n if (!range || !adjustedValue) {\n return toMin;\n }\n return adjustedValue * toMax / range + toMin;\n}\n\n/**\n * Returns the min of a set of numbers where some values may be undefined.\n * @param args `number` or `undefined` values to compare.\n * @returns The min value or `Number.POSITIVE_INFINITY` if all values are `undefined`.\n */\nexport function safeMin(...args: (number | undefined)[]): number {\n return Math.min(...args.map(arg => arg ?? Number.POSITIVE_INFINITY));\n}\n\n/**\n * Returns the max of a set of numbers where some values may be undefined.\n * @param args `number` or `undefined` values to compare.\n * @returns The max value or `Number.NEGATIVE_INFINITY` if all values are `undefined`.\n */\nexport function safeMax(...args: (number | undefined)[]): number {\n return Math.max(...args.map(arg => arg ?? Number.NEGATIVE_INFINITY));\n}\n\n/**\n * Copies properties from one object to another, much like Object.assign(), but only where properties exist in both source objects.\n * @param from The object to apply properties from.\n * @param to The object to apply property values to.\n */\nexport function assignMatchingProperties(from: object, to: object): void {\n Object.keys(from)\n .filter(prop => prop in to)\n .forEach(prop => to[prop] = from[prop]);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }