@educarehq/solaris-ui 0.2.0 → 0.3.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 (225) hide show
  1. package/esm2022/index.js +40 -1
  2. package/esm2022/index.js.map +1 -1
  3. package/esm2022/lib/components/actions/button/index.js +3 -0
  4. package/esm2022/lib/components/actions/button/index.js.map +1 -0
  5. package/esm2022/lib/components/data-display/badge/index.js +3 -0
  6. package/esm2022/lib/components/data-display/badge/index.js.map +1 -0
  7. package/esm2022/lib/components/data-display/divider/component/divider.component.js +46 -0
  8. package/esm2022/lib/components/data-display/divider/component/divider.component.js.map +1 -0
  9. package/esm2022/lib/components/data-display/divider/index.js +2 -0
  10. package/esm2022/lib/components/data-display/divider/index.js.map +1 -0
  11. package/esm2022/lib/components/data-display/divider/model/divider.types.js +1 -0
  12. package/esm2022/lib/components/data-display/divider/model/divider.types.js.map +1 -0
  13. package/esm2022/lib/components/feedback/toast/component/toast.component.js +268 -0
  14. package/esm2022/lib/components/feedback/toast/component/toast.component.js.map +1 -0
  15. package/esm2022/lib/components/feedback/toast/container/toast-container.component.js +24 -0
  16. package/esm2022/lib/components/feedback/toast/container/toast-container.component.js.map +1 -0
  17. package/esm2022/lib/components/feedback/toast/model/toast.types.js +1 -0
  18. package/esm2022/lib/components/feedback/toast/model/toast.types.js.map +1 -0
  19. package/esm2022/lib/components/feedback/toast/provider/provide-solaris-toast.js +17 -0
  20. package/esm2022/lib/components/feedback/toast/provider/provide-solaris-toast.js.map +1 -0
  21. package/esm2022/lib/components/feedback/toast/service/toast.service.js +219 -0
  22. package/esm2022/lib/components/feedback/toast/service/toast.service.js.map +1 -0
  23. package/esm2022/lib/components/feedback/toast/token/toast.tokens.js +13 -0
  24. package/esm2022/lib/components/feedback/toast/token/toast.tokens.js.map +1 -0
  25. package/esm2022/lib/components/forms/email-field/component/email-field.component.js +5 -4
  26. package/esm2022/lib/components/forms/email-field/component/email-field.component.js.map +1 -1
  27. package/esm2022/lib/components/forms/form-field/component/form-field.component.js +50 -2
  28. package/esm2022/lib/components/forms/form-field/component/form-field.component.js.map +1 -1
  29. package/esm2022/lib/components/forms/form-field/directives/form-field-trigger.directive.js.map +1 -1
  30. package/esm2022/lib/components/forms/form-field/index.js.map +1 -1
  31. package/esm2022/lib/components/forms/multi-select/component/multi-select.component.js +11 -28
  32. package/esm2022/lib/components/forms/multi-select/component/multi-select.component.js.map +1 -1
  33. package/esm2022/lib/components/forms/multi-select/model/multi-select.types.js.map +1 -1
  34. package/esm2022/lib/components/forms/option/component/option.component.js +2 -2
  35. package/esm2022/lib/components/forms/option/component/option.component.js.map +1 -1
  36. package/esm2022/lib/components/forms/password-field/component/password-field.component.js +2 -2
  37. package/esm2022/lib/components/forms/password-field/component/password-field.component.js.map +1 -1
  38. package/esm2022/lib/components/forms/radio/component/radio.component.js +2 -2
  39. package/esm2022/lib/components/forms/select/component/select.component.js +4 -8
  40. package/esm2022/lib/components/forms/select/component/select.component.js.map +1 -1
  41. package/esm2022/lib/components/icon/component/solaris-icon.component.js +2 -2
  42. package/esm2022/lib/components/icon/component/solaris-icon.component.js.map +1 -1
  43. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu-group.component.js +27 -0
  44. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu-group.component.js.map +1 -0
  45. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu-item.component.js +96 -0
  46. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu-item.component.js.map +1 -0
  47. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu-label.component.js +22 -0
  48. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu-label.component.js.map +1 -0
  49. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu.component.js +105 -0
  50. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-menu.component.js.map +1 -0
  51. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-submenu-trigger.component.js +95 -0
  52. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-submenu-trigger.component.js.map +1 -0
  53. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-submenu.component.js +631 -0
  54. package/esm2022/lib/components/interaction/dropdown-menu/component/dropdown-submenu.component.js.map +1 -0
  55. package/esm2022/lib/components/interaction/dropdown-menu/directives/dropdown-menu-trigger.directive.js +365 -0
  56. package/esm2022/lib/components/interaction/dropdown-menu/directives/dropdown-menu-trigger.directive.js.map +1 -0
  57. package/esm2022/lib/components/interaction/dropdown-menu/index.js +8 -0
  58. package/esm2022/lib/components/interaction/dropdown-menu/index.js.map +1 -0
  59. package/esm2022/lib/components/interaction/dropdown-menu/model/dropdown-menu-navigation.js +3 -0
  60. package/esm2022/lib/components/interaction/dropdown-menu/model/dropdown-menu-navigation.js.map +1 -0
  61. package/esm2022/lib/components/interaction/dropdown-menu/model/dropdown-menu.types.js +1 -0
  62. package/esm2022/lib/components/interaction/dropdown-menu/model/dropdown-menu.types.js.map +1 -0
  63. package/esm2022/lib/components/interaction/dropdown-menu/model/dropdown-submenu.types.js +1 -0
  64. package/esm2022/lib/components/interaction/dropdown-menu/model/dropdown-submenu.types.js.map +1 -0
  65. package/esm2022/lib/components/interaction/popover/component/popover-panel.component.js +2 -2
  66. package/esm2022/lib/components/interaction/popover/component/popover-panel.component.js.map +1 -1
  67. package/esm2022/lib/components/interaction/popover/directives/popover-trigger.directive.js +28 -20
  68. package/esm2022/lib/components/interaction/popover/directives/popover-trigger.directive.js.map +1 -1
  69. package/esm2022/lib/components/interaction/tooltip/component/tooltip-panel.component.js.map +1 -1
  70. package/esm2022/lib/components/interaction/tooltip/directive/tooltip.directive.js.map +1 -1
  71. package/esm2022/lib/components/interaction/tooltip/model/tooltip-position.js.map +1 -1
  72. package/esm2022/lib/components/navigation/editable-tabs/component/editable-tabs.component.js +323 -0
  73. package/esm2022/lib/components/navigation/editable-tabs/component/editable-tabs.component.js.map +1 -0
  74. package/esm2022/lib/components/navigation/editable-tabs/editable-tab/editable-tab.component.js +34 -0
  75. package/esm2022/lib/components/navigation/editable-tabs/editable-tab/editable-tab.component.js.map +1 -0
  76. package/esm2022/lib/components/navigation/editable-tabs/model/editable-tabs.types.js +1 -0
  77. package/esm2022/lib/components/navigation/editable-tabs/model/editable-tabs.types.js.map +1 -0
  78. package/esm2022/lib/components/navigation/segmented-control/component/segmented-control.component.js +242 -0
  79. package/esm2022/lib/components/navigation/segmented-control/component/segmented-control.component.js.map +1 -0
  80. package/esm2022/lib/components/navigation/segmented-control/item/segmented-item.component.js +197 -0
  81. package/esm2022/lib/components/navigation/segmented-control/item/segmented-item.component.js.map +1 -0
  82. package/esm2022/lib/components/navigation/segmented-control/model/segmented-control.types.js +1 -0
  83. package/esm2022/lib/components/navigation/segmented-control/model/segmented-control.types.js.map +1 -0
  84. package/esm2022/lib/components/navigation/segmented-control/token/segmented-control.tokens.js +3 -0
  85. package/esm2022/lib/components/navigation/segmented-control/token/segmented-control.tokens.js.map +1 -0
  86. package/esm2022/lib/components/navigation/stepper/actions/stepper-actions.component.js +15 -0
  87. package/esm2022/lib/components/navigation/stepper/actions/stepper-actions.component.js.map +1 -0
  88. package/esm2022/lib/components/navigation/stepper/component/stepper.component.js +99 -0
  89. package/esm2022/lib/components/navigation/stepper/component/stepper.component.js.map +1 -0
  90. package/esm2022/lib/components/navigation/stepper/content/stepper-content.component.js +13 -0
  91. package/esm2022/lib/components/navigation/stepper/content/stepper-content.component.js.map +1 -0
  92. package/esm2022/lib/components/navigation/stepper/model/stepper.types.js +1 -0
  93. package/esm2022/lib/components/navigation/stepper/model/stepper.types.js.map +1 -0
  94. package/esm2022/lib/components/navigation/stepper/step/step.component.js +91 -0
  95. package/esm2022/lib/components/navigation/stepper/step/step.component.js.map +1 -0
  96. package/esm2022/lib/components/navigation/stepper/token/stepper.tokens.js +3 -0
  97. package/esm2022/lib/components/navigation/stepper/token/stepper.tokens.js.map +1 -0
  98. package/esm2022/lib/components/navigation/tabs/component/tabs.component.js +169 -0
  99. package/esm2022/lib/components/navigation/tabs/component/tabs.component.js.map +1 -0
  100. package/esm2022/lib/components/navigation/tabs/index.js +5 -0
  101. package/esm2022/lib/components/navigation/tabs/index.js.map +1 -0
  102. package/esm2022/lib/components/navigation/tabs/model/tabs.types.js +1 -0
  103. package/esm2022/lib/components/navigation/tabs/model/tabs.types.js.map +1 -0
  104. package/esm2022/lib/components/navigation/tabs/tab/tab.component.js +195 -0
  105. package/esm2022/lib/components/navigation/tabs/tab/tab.component.js.map +1 -0
  106. package/esm2022/lib/components/navigation/tabs/tab-panel/tab-panel.component.js +55 -0
  107. package/esm2022/lib/components/navigation/tabs/tab-panel/tab-panel.component.js.map +1 -0
  108. package/esm2022/lib/components/navigation/tabs/token/tabs.tokens.js +3 -0
  109. package/esm2022/lib/components/navigation/tabs/token/tabs.tokens.js.map +1 -0
  110. package/esm2022/lib/components/overlay/dialog/component/dialog.component.js +49 -0
  111. package/esm2022/lib/components/overlay/dialog/component/dialog.component.js.map +1 -0
  112. package/esm2022/lib/components/overlay/dialog/components/dialog-actions.component.js +37 -0
  113. package/esm2022/lib/components/overlay/dialog/components/dialog-actions.component.js.map +1 -0
  114. package/esm2022/lib/components/overlay/dialog/components/dialog-content.component.js +13 -0
  115. package/esm2022/lib/components/overlay/dialog/components/dialog-content.component.js.map +1 -0
  116. package/esm2022/lib/components/overlay/dialog/components/dialog-header.component.js +32 -0
  117. package/esm2022/lib/components/overlay/dialog/components/dialog-header.component.js.map +1 -0
  118. package/esm2022/lib/components/overlay/dialog/container/dialog-container.component.js +142 -0
  119. package/esm2022/lib/components/overlay/dialog/container/dialog-container.component.js.map +1 -0
  120. package/esm2022/lib/components/overlay/dialog/flow/dialog-flow.component.js +56 -0
  121. package/esm2022/lib/components/overlay/dialog/flow/dialog-flow.component.js.map +1 -0
  122. package/esm2022/lib/components/overlay/dialog/flow/dialog-step.component.js +20 -0
  123. package/esm2022/lib/components/overlay/dialog/flow/dialog-step.component.js.map +1 -0
  124. package/esm2022/lib/components/overlay/dialog/model/dialog.types.js +1 -0
  125. package/esm2022/lib/components/overlay/dialog/model/dialog.types.js.map +1 -0
  126. package/esm2022/lib/components/overlay/dialog/provider/provide-solaris-dialog.js +13 -0
  127. package/esm2022/lib/components/overlay/dialog/provider/provide-solaris-dialog.js.map +1 -0
  128. package/esm2022/lib/components/overlay/dialog/service/dialog-ref.js +23 -0
  129. package/esm2022/lib/components/overlay/dialog/service/dialog-ref.js.map +1 -0
  130. package/esm2022/lib/components/overlay/dialog/service/dialog.service.js +111 -0
  131. package/esm2022/lib/components/overlay/dialog/service/dialog.service.js.map +1 -0
  132. package/esm2022/lib/components/overlay/dialog/token/dialog-data.token.js +4 -0
  133. package/esm2022/lib/components/overlay/dialog/token/dialog-data.token.js.map +1 -0
  134. package/esm2022/lib/components/overlay/dialog/token/dialog.tokens.js +15 -0
  135. package/esm2022/lib/components/overlay/dialog/token/dialog.tokens.js.map +1 -0
  136. package/esm2022/lib/services/icon/icons/groups/actions.js +242 -0
  137. package/esm2022/lib/services/icon/icons/groups/actions.js.map +1 -0
  138. package/esm2022/lib/services/icon/icons/groups/data.js +129 -0
  139. package/esm2022/lib/services/icon/icons/groups/data.js.map +1 -0
  140. package/esm2022/lib/services/icon/icons/groups/layout.js +50 -0
  141. package/esm2022/lib/services/icon/icons/groups/layout.js.map +1 -0
  142. package/esm2022/lib/services/icon/icons/groups/navigation.js +354 -0
  143. package/esm2022/lib/services/icon/icons/groups/navigation.js.map +1 -0
  144. package/esm2022/lib/services/icon/icons/groups/status.js +70 -0
  145. package/esm2022/lib/services/icon/icons/groups/status.js.map +1 -0
  146. package/esm2022/lib/services/icon/icons/groups/theme.js +49 -0
  147. package/esm2022/lib/services/icon/icons/groups/theme.js.map +1 -0
  148. package/esm2022/lib/services/icon/icons/solaris-built-in-icons.js +12 -204
  149. package/esm2022/lib/services/icon/icons/solaris-built-in-icons.js.map +1 -1
  150. package/esm2022/lib/services/icon/model/solaris-icon-definition.interface.js.map +1 -1
  151. package/esm2022/lib/services/icon/model/solaris-icon.types.js.map +1 -1
  152. package/esm2022/lib/services/translation/model/solaris-translate-defaults.js +56 -0
  153. package/esm2022/lib/services/translation/model/solaris-translate-defaults.js.map +1 -1
  154. package/index.d.ts +92 -1
  155. package/lib/components/actions/button/index.d.ts +3 -0
  156. package/lib/components/data-display/badge/index.d.ts +3 -0
  157. package/lib/components/data-display/divider/component/divider.component.d.ts +17 -0
  158. package/lib/components/data-display/divider/index.d.ts +2 -0
  159. package/lib/components/data-display/divider/model/divider.types.d.ts +5 -0
  160. package/lib/components/feedback/toast/component/toast.component.d.ts +62 -0
  161. package/lib/components/feedback/toast/container/toast-container.component.d.ts +10 -0
  162. package/lib/components/feedback/toast/model/toast.types.d.ts +106 -0
  163. package/lib/components/feedback/toast/provider/provide-solaris-toast.d.ts +3 -0
  164. package/lib/components/feedback/toast/service/toast.service.d.ts +36 -0
  165. package/lib/components/feedback/toast/token/toast.tokens.d.ts +5 -0
  166. package/lib/components/forms/email-field/component/email-field.component.d.ts +2 -1
  167. package/lib/components/forms/form-field/component/form-field.component.d.ts +6 -0
  168. package/lib/components/forms/multi-select/component/multi-select.component.d.ts +4 -7
  169. package/lib/components/forms/select/component/select.component.d.ts +2 -2
  170. package/lib/components/interaction/dropdown-menu/component/dropdown-menu-group.component.d.ts +10 -0
  171. package/lib/components/interaction/dropdown-menu/component/dropdown-menu-item.component.d.ts +28 -0
  172. package/lib/components/interaction/dropdown-menu/component/dropdown-menu-label.component.d.ts +7 -0
  173. package/lib/components/interaction/dropdown-menu/component/dropdown-menu.component.d.ts +21 -0
  174. package/lib/components/interaction/dropdown-menu/component/dropdown-submenu-trigger.component.d.ts +21 -0
  175. package/lib/components/interaction/dropdown-menu/component/dropdown-submenu.component.d.ts +68 -0
  176. package/lib/components/interaction/dropdown-menu/directives/dropdown-menu-trigger.directive.d.ts +61 -0
  177. package/lib/components/interaction/dropdown-menu/index.d.ts +9 -0
  178. package/lib/components/interaction/dropdown-menu/model/dropdown-menu-navigation.d.ts +8 -0
  179. package/lib/components/interaction/dropdown-menu/model/dropdown-menu.types.d.ts +11 -0
  180. package/lib/components/interaction/dropdown-menu/model/dropdown-submenu.types.d.ts +2 -0
  181. package/lib/components/navigation/editable-tabs/component/editable-tabs.component.d.ts +69 -0
  182. package/lib/components/navigation/editable-tabs/editable-tab/editable-tab.component.d.ts +20 -0
  183. package/lib/components/navigation/editable-tabs/model/editable-tabs.types.d.ts +60 -0
  184. package/lib/components/navigation/segmented-control/component/segmented-control.component.d.ts +64 -0
  185. package/lib/components/navigation/segmented-control/item/segmented-item.component.d.ts +35 -0
  186. package/lib/components/navigation/segmented-control/model/segmented-control.types.d.ts +12 -0
  187. package/lib/components/navigation/segmented-control/token/segmented-control.tokens.d.ts +22 -0
  188. package/lib/components/navigation/stepper/actions/stepper-actions.component.d.ts +7 -0
  189. package/lib/components/navigation/stepper/component/stepper.component.d.ts +36 -0
  190. package/lib/components/navigation/stepper/content/stepper-content.component.d.ts +5 -0
  191. package/lib/components/navigation/stepper/model/stepper.types.d.ts +15 -0
  192. package/lib/components/navigation/stepper/step/step.component.d.ts +27 -0
  193. package/lib/components/navigation/stepper/token/stepper.tokens.d.ts +13 -0
  194. package/lib/components/navigation/tabs/component/tabs.component.d.ts +47 -0
  195. package/lib/components/navigation/tabs/index.d.ts +6 -0
  196. package/lib/components/navigation/tabs/model/tabs.types.d.ts +17 -0
  197. package/lib/components/navigation/tabs/tab/tab.component.d.ts +38 -0
  198. package/lib/components/navigation/tabs/tab-panel/tab-panel.component.d.ts +15 -0
  199. package/lib/components/navigation/tabs/token/tabs.tokens.d.ts +19 -0
  200. package/lib/components/overlay/dialog/component/dialog.component.d.ts +29 -0
  201. package/lib/components/overlay/dialog/components/dialog-actions.component.d.ts +12 -0
  202. package/lib/components/overlay/dialog/components/dialog-content.component.d.ts +5 -0
  203. package/lib/components/overlay/dialog/components/dialog-header.component.d.ts +19 -0
  204. package/lib/components/overlay/dialog/container/dialog-container.component.d.ts +32 -0
  205. package/lib/components/overlay/dialog/flow/dialog-flow.component.d.ts +19 -0
  206. package/lib/components/overlay/dialog/flow/dialog-step.component.d.ts +7 -0
  207. package/lib/components/overlay/dialog/model/dialog.types.d.ts +87 -0
  208. package/lib/components/overlay/dialog/provider/provide-solaris-dialog.d.ts +3 -0
  209. package/lib/components/overlay/dialog/service/dialog-ref.d.ts +11 -0
  210. package/lib/components/overlay/dialog/service/dialog.service.d.ts +20 -0
  211. package/lib/components/overlay/dialog/token/dialog-data.token.d.ts +4 -0
  212. package/lib/components/overlay/dialog/token/dialog.tokens.d.ts +4 -0
  213. package/lib/services/icon/icons/groups/actions.d.ts +2 -0
  214. package/lib/services/icon/icons/groups/data.d.ts +2 -0
  215. package/lib/services/icon/icons/groups/layout.d.ts +2 -0
  216. package/lib/services/icon/icons/groups/navigation.d.ts +2 -0
  217. package/lib/services/icon/icons/groups/status.d.ts +2 -0
  218. package/lib/services/icon/icons/groups/theme.d.ts +2 -0
  219. package/lib/services/icon/model/solaris-icon-definition.interface.d.ts +10 -1
  220. package/lib/services/icon/model/solaris-icon.types.d.ts +1 -1
  221. package/package.json +1 -1
  222. package/styles/_dropdown-menu.scss +72 -0
  223. package/styles/_popover.scss +24 -19
  224. package/styles/_toast.scss +9 -0
  225. package/styles/_tooltip.scss +3 -3
@@ -0,0 +1,631 @@
1
+ import { Component, ElementRef, Injector, ViewContainerRef, contentChild, computed, input, signal, inject, DestroyRef, } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import { Overlay, OverlayConfig, } from '@angular/cdk/overlay';
4
+ import { ComponentPortal } from '@angular/cdk/portal';
5
+ import { SolarisPopoverPanelComponent } from '../../popover';
6
+ import { SOLARIS_POPOVER_PANEL_DATA, } from '../../popover/token/popover.tokens';
7
+ import { SolarisDropdownMenuComponent } from './dropdown-menu.component';
8
+ import { SolarisDropdownSubmenuTriggerComponent } from './dropdown-submenu-trigger.component';
9
+ import * as i0 from "@angular/core";
10
+ export class SolarisDropdownSubmenuComponent {
11
+ elementRef = inject(ElementRef);
12
+ viewContainerRef = inject(ViewContainerRef);
13
+ destroyRef = inject(DestroyRef);
14
+ document = inject(DOCUMENT);
15
+ injector = inject(Injector);
16
+ overlay = inject(Overlay);
17
+ openMode = input('hover-click', ...(ngDevMode ? [{ debugName: "openMode" }] : /* istanbul ignore next */ []));
18
+ placement = input('right-start', ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
19
+ matchTriggerWidth = input(false, ...(ngDevMode ? [{ debugName: "matchTriggerWidth" }] : /* istanbul ignore next */ []));
20
+ minWidth = input(null, ...(ngDevMode ? [{ debugName: "minWidth" }] : /* istanbul ignore next */ []));
21
+ maxWidth = input(null, ...(ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []));
22
+ openDelay = input(120, ...(ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []));
23
+ closeDelay = input(160, ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
24
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
25
+ nestedMenu = contentChild(SolarisDropdownMenuComponent, ...(ngDevMode ? [{ debugName: "nestedMenu" }] : /* istanbul ignore next */ []));
26
+ triggerChild = contentChild(SolarisDropdownSubmenuTriggerComponent, ...(ngDevMode ? [{ debugName: "triggerChild" }] : /* istanbul ignore next */ []));
27
+ nestedMenuPanelId = computed(() => {
28
+ return this.nestedMenu()?.panelId ?? null;
29
+ }, ...(ngDevMode ? [{ debugName: "nestedMenuPanelId" }] : /* istanbul ignore next */ []));
30
+ isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
31
+ overlayRef = null;
32
+ outsideClickCleanup = null;
33
+ keydownCleanup = null;
34
+ itemClickCleanup = null;
35
+ panelMouseEnterCleanup = null;
36
+ panelMouseLeaveCleanup = null;
37
+ openTimer = null;
38
+ closeTimer = null;
39
+ constructor() {
40
+ // SECURITY_EXCEPTION: nativeElement required to store submenu reference. SSR-safe via ElementRef.
41
+ this.elementRef.nativeElement['__solarisSubmenu'] = this;
42
+ // SECURITY_EXCEPTION: nativeElement.addEventListener required for custom events. SSR-safe.
43
+ this.elementRef.nativeElement.addEventListener('solaris-submenu-child-opened', () => this.clearCloseTimer());
44
+ // SECURITY_EXCEPTION: nativeElement.addEventListener required for custom events. SSR-safe.
45
+ this.elementRef.nativeElement.addEventListener('solaris-submenu-child-closed', () => {
46
+ if (this.isOpen() &&
47
+ !this.isPointerInside() &&
48
+ !this.hasOpenChildSubmenu()) {
49
+ this.close();
50
+ }
51
+ });
52
+ this.destroyRef.onDestroy(() => {
53
+ if (this.overlayRef) {
54
+ this.overlayRef = null;
55
+ }
56
+ this.clearTimers();
57
+ });
58
+ }
59
+ toggle() {
60
+ if (this.isOpen()) {
61
+ this.close();
62
+ }
63
+ else {
64
+ this.open();
65
+ }
66
+ }
67
+ open() {
68
+ if (this.isOpen() || this.disabled()) {
69
+ return;
70
+ }
71
+ this.closeSiblingSubmenus();
72
+ this.clearTimers();
73
+ this.createOverlay();
74
+ this.attachMenu();
75
+ this.addOutsideClickHandler();
76
+ this.addKeydownHandler();
77
+ this.addItemClickHandler();
78
+ this.addPanelMouseHandlers();
79
+ this.isOpen.set(true);
80
+ this.notifyParentKeepAlive();
81
+ }
82
+ close() {
83
+ if (!this.isOpen()) {
84
+ return;
85
+ }
86
+ this.detachMenu();
87
+ this.isOpen.set(false);
88
+ this.triggerChild()?.focus();
89
+ this.notifyParentChildClosed();
90
+ }
91
+ onTriggerHover() {
92
+ if (!this.openMode().includes('hover')) {
93
+ return;
94
+ }
95
+ this.clearCloseTimer();
96
+ if (!this.isOpen()) {
97
+ this.openTimer = setTimeout(() => {
98
+ this.open();
99
+ }, this.openDelay());
100
+ }
101
+ }
102
+ onTriggerLeave() {
103
+ if (!this.openMode().includes('hover')) {
104
+ return;
105
+ }
106
+ if (this.hasOpenChildSubmenu()) {
107
+ return;
108
+ }
109
+ this.clearOpenTimer();
110
+ this.closeTimer = setTimeout(() => {
111
+ if (!this.isPointerInside()) {
112
+ this.close();
113
+ }
114
+ }, this.closeDelay());
115
+ }
116
+ addPanelMouseHandlers() {
117
+ this.removePanelMouseHandlers();
118
+ if (!this.overlayRef)
119
+ return;
120
+ this.panelMouseEnterCleanup = this.rendererListen(this.overlayRef.overlayElement, 'mouseenter', () => this.clearCloseTimer());
121
+ this.panelMouseLeaveCleanup = this.rendererListen(this.overlayRef.overlayElement, 'mouseleave', () => {
122
+ if (!this.openMode().includes('hover'))
123
+ return;
124
+ if (this.hasOpenChildSubmenu())
125
+ return;
126
+ this.closeTimer = setTimeout(() => {
127
+ this.close();
128
+ }, this.closeDelay());
129
+ });
130
+ }
131
+ removePanelMouseHandlers() {
132
+ if (this.panelMouseEnterCleanup) {
133
+ this.panelMouseEnterCleanup();
134
+ this.panelMouseEnterCleanup = null;
135
+ }
136
+ if (this.panelMouseLeaveCleanup) {
137
+ this.panelMouseLeaveCleanup();
138
+ this.panelMouseLeaveCleanup = null;
139
+ }
140
+ }
141
+ isPointerInside() {
142
+ // SECURITY_EXCEPTION: nativeElement required for hover detection via ElementRef. Read-only, SSR-safe.
143
+ const triggerEl = this.elementRef.nativeElement;
144
+ const overlayEl = this.overlayRef?.overlayElement;
145
+ if (overlayEl) {
146
+ return triggerEl.matches(':hover') || overlayEl.matches(':hover');
147
+ }
148
+ return triggerEl.matches(':hover');
149
+ }
150
+ notifyParentKeepAlive() {
151
+ // SECURITY_EXCEPTION: nativeElement.dispatchEvent required for custom event. SSR-safe.
152
+ this.elementRef.nativeElement.dispatchEvent(new CustomEvent('solaris-submenu-child-opened', {
153
+ bubbles: true,
154
+ composed: true,
155
+ }));
156
+ }
157
+ notifyParentChildClosed() {
158
+ // SECURITY_EXCEPTION: nativeElement.dispatchEvent required for custom event. SSR-safe.
159
+ this.elementRef.nativeElement.dispatchEvent(new CustomEvent('solaris-submenu-child-closed', {
160
+ bubbles: true,
161
+ composed: true,
162
+ }));
163
+ }
164
+ hasOpenChildSubmenu() {
165
+ if (!this.overlayRef)
166
+ return false;
167
+ const overlayEl = this.overlayRef.overlayElement;
168
+ const childSubmenus = overlayEl.querySelectorAll('solaris-dropdown-submenu');
169
+ for (let i = 0; i < childSubmenus.length; i++) {
170
+ const child = childSubmenus[i];
171
+ const submenu = child['__solarisSubmenu'];
172
+ if (submenu?.isOpen())
173
+ return true;
174
+ }
175
+ return false;
176
+ }
177
+ closeSiblingSubmenus() {
178
+ // SECURITY_EXCEPTION: nativeElement.parentElement required to traverse DOM. Read-only, SSR-safe.
179
+ const parent = this.elementRef.nativeElement.parentElement;
180
+ if (!parent)
181
+ return;
182
+ const siblings = parent.querySelectorAll(':scope > solaris-dropdown-submenu');
183
+ for (let i = 0; i < siblings.length; i++) {
184
+ const sibling = siblings[i];
185
+ // SECURITY_EXCEPTION: nativeElement identity comparison. Read-only, SSR-safe.
186
+ if (sibling !== this.elementRef.nativeElement) {
187
+ const submenu = sibling['__solarisSubmenu'];
188
+ submenu?.close();
189
+ }
190
+ }
191
+ }
192
+ createOverlay() {
193
+ this.disposeOverlay();
194
+ const positionStrategy = this.createPositionStrategy();
195
+ const scrollStrategy = this.overlay.scrollStrategies.reposition();
196
+ const config = new OverlayConfig({
197
+ positionStrategy,
198
+ scrollStrategy,
199
+ disposeOnNavigation: true,
200
+ panelClass: 'solaris-dropdown-menu-overlay',
201
+ });
202
+ this.overlayRef = this.overlay.create(config);
203
+ }
204
+ createPositionStrategy() {
205
+ const positions = this.getPositions();
206
+ return this.overlay
207
+ .position()
208
+ .flexibleConnectedTo(this.elementRef)
209
+ .withPositions(positions)
210
+ .withFlexibleDimensions(true)
211
+ .withPush(true);
212
+ }
213
+ getPositions() {
214
+ const placement = this.placement();
215
+ const offset = 16;
216
+ let primary;
217
+ let fallbacks;
218
+ switch (placement) {
219
+ case 'right-start':
220
+ primary = {
221
+ originX: 'end',
222
+ originY: 'top',
223
+ overlayX: 'start',
224
+ overlayY: 'top',
225
+ offsetX: offset,
226
+ };
227
+ fallbacks = [
228
+ {
229
+ originX: 'start',
230
+ originY: 'top',
231
+ overlayX: 'end',
232
+ overlayY: 'top',
233
+ offsetX: -offset,
234
+ },
235
+ {
236
+ originX: 'end',
237
+ originY: 'bottom',
238
+ overlayX: 'start',
239
+ overlayY: 'bottom',
240
+ offsetX: offset,
241
+ },
242
+ {
243
+ originX: 'start',
244
+ originY: 'bottom',
245
+ overlayX: 'end',
246
+ overlayY: 'bottom',
247
+ offsetX: -offset,
248
+ },
249
+ {
250
+ originX: 'end',
251
+ originY: 'center',
252
+ overlayX: 'start',
253
+ overlayY: 'center',
254
+ offsetX: offset,
255
+ },
256
+ {
257
+ originX: 'start',
258
+ originY: 'center',
259
+ overlayX: 'end',
260
+ overlayY: 'center',
261
+ offsetX: -offset,
262
+ },
263
+ ];
264
+ break;
265
+ case 'right':
266
+ primary = {
267
+ originX: 'end',
268
+ originY: 'center',
269
+ overlayX: 'start',
270
+ overlayY: 'center',
271
+ offsetX: offset,
272
+ };
273
+ fallbacks = [
274
+ {
275
+ originX: 'start',
276
+ originY: 'center',
277
+ overlayX: 'end',
278
+ overlayY: 'center',
279
+ offsetX: -offset,
280
+ },
281
+ {
282
+ originX: 'end',
283
+ originY: 'top',
284
+ overlayX: 'start',
285
+ overlayY: 'top',
286
+ offsetX: offset,
287
+ },
288
+ {
289
+ originX: 'start',
290
+ originY: 'top',
291
+ overlayX: 'end',
292
+ overlayY: 'top',
293
+ offsetX: -offset,
294
+ },
295
+ ];
296
+ break;
297
+ case 'right-end':
298
+ primary = {
299
+ originX: 'end',
300
+ originY: 'bottom',
301
+ overlayX: 'start',
302
+ overlayY: 'bottom',
303
+ offsetX: offset,
304
+ };
305
+ fallbacks = [
306
+ {
307
+ originX: 'start',
308
+ originY: 'bottom',
309
+ overlayX: 'end',
310
+ overlayY: 'bottom',
311
+ offsetX: -offset,
312
+ },
313
+ {
314
+ originX: 'end',
315
+ originY: 'top',
316
+ overlayX: 'start',
317
+ overlayY: 'top',
318
+ offsetX: offset,
319
+ },
320
+ {
321
+ originX: 'start',
322
+ originY: 'top',
323
+ overlayX: 'end',
324
+ overlayY: 'top',
325
+ offsetX: -offset,
326
+ },
327
+ ];
328
+ break;
329
+ case 'left-start':
330
+ primary = {
331
+ originX: 'start',
332
+ originY: 'top',
333
+ overlayX: 'end',
334
+ overlayY: 'top',
335
+ offsetX: -offset,
336
+ };
337
+ fallbacks = [
338
+ {
339
+ originX: 'end',
340
+ originY: 'top',
341
+ overlayX: 'start',
342
+ overlayY: 'top',
343
+ offsetX: offset,
344
+ },
345
+ {
346
+ originX: 'start',
347
+ originY: 'bottom',
348
+ overlayX: 'end',
349
+ overlayY: 'bottom',
350
+ offsetX: -offset,
351
+ },
352
+ {
353
+ originX: 'end',
354
+ originY: 'bottom',
355
+ overlayX: 'start',
356
+ overlayY: 'bottom',
357
+ offsetX: offset,
358
+ },
359
+ ];
360
+ break;
361
+ case 'left':
362
+ primary = {
363
+ originX: 'start',
364
+ originY: 'center',
365
+ overlayX: 'end',
366
+ overlayY: 'center',
367
+ offsetX: -offset,
368
+ };
369
+ fallbacks = [
370
+ {
371
+ originX: 'end',
372
+ originY: 'center',
373
+ overlayX: 'start',
374
+ overlayY: 'center',
375
+ offsetX: offset,
376
+ },
377
+ {
378
+ originX: 'start',
379
+ originY: 'top',
380
+ overlayX: 'end',
381
+ overlayY: 'top',
382
+ offsetX: -offset,
383
+ },
384
+ {
385
+ originX: 'end',
386
+ originY: 'top',
387
+ overlayX: 'start',
388
+ overlayY: 'top',
389
+ offsetX: offset,
390
+ },
391
+ ];
392
+ break;
393
+ case 'left-end':
394
+ primary = {
395
+ originX: 'start',
396
+ originY: 'bottom',
397
+ overlayX: 'end',
398
+ overlayY: 'bottom',
399
+ offsetX: -offset,
400
+ };
401
+ fallbacks = [
402
+ {
403
+ originX: 'end',
404
+ originY: 'bottom',
405
+ overlayX: 'start',
406
+ overlayY: 'bottom',
407
+ offsetX: offset,
408
+ },
409
+ {
410
+ originX: 'start',
411
+ originY: 'top',
412
+ overlayX: 'end',
413
+ overlayY: 'top',
414
+ offsetX: -offset,
415
+ },
416
+ {
417
+ originX: 'end',
418
+ originY: 'top',
419
+ overlayX: 'start',
420
+ overlayY: 'top',
421
+ offsetX: offset,
422
+ },
423
+ ];
424
+ break;
425
+ }
426
+ return [primary, ...fallbacks];
427
+ }
428
+ attachMenu() {
429
+ if (!this.overlayRef)
430
+ return;
431
+ const menu = this.nestedMenu();
432
+ if (!menu)
433
+ return;
434
+ const data = {
435
+ contentTemplate: menu.contentTemplate(),
436
+ appearance: 'surface',
437
+ padding: 'none',
438
+ radius: 'md',
439
+ role: undefined,
440
+ panelId: menu.panelId,
441
+ autoFocus: false,
442
+ };
443
+ const panelInjector = Injector.create({
444
+ parent: this.injector,
445
+ providers: [{ provide: SOLARIS_POPOVER_PANEL_DATA, useValue: data }],
446
+ });
447
+ const portal = new ComponentPortal(SolarisPopoverPanelComponent, this.viewContainerRef, panelInjector);
448
+ this.overlayRef.attach(portal);
449
+ this.updateOverlaySize();
450
+ setTimeout(() => {
451
+ menu.focusFirstItem();
452
+ });
453
+ }
454
+ detachMenu() {
455
+ if (this.overlayRef) {
456
+ this.overlayRef.detach();
457
+ this.disposeOverlay();
458
+ }
459
+ this.removeOutsideClickHandler();
460
+ this.removeKeydownHandler();
461
+ }
462
+ disposeOverlay() {
463
+ if (this.overlayRef) {
464
+ try {
465
+ this.overlayRef.dispose();
466
+ }
467
+ catch {
468
+ // Injector may already be destroyed during test teardown
469
+ }
470
+ this.overlayRef = null;
471
+ }
472
+ this.removeOutsideClickHandler();
473
+ this.removeKeydownHandler();
474
+ this.removeItemClickHandler();
475
+ this.removePanelMouseHandlers();
476
+ }
477
+ addOutsideClickHandler() {
478
+ this.removeOutsideClickHandler();
479
+ this.outsideClickCleanup = this.rendererListen(this.document, 'click', this.handleOutsideClick);
480
+ }
481
+ removeOutsideClickHandler() {
482
+ if (this.outsideClickCleanup) {
483
+ this.outsideClickCleanup();
484
+ this.outsideClickCleanup = null;
485
+ }
486
+ }
487
+ handleOutsideClick = (event) => {
488
+ if (!this.overlayRef)
489
+ return;
490
+ const overlayElement = this.overlayRef.overlayElement;
491
+ // SECURITY_EXCEPTION: nativeElement needed for outside-click containment check. ElementRef SSR-safe.
492
+ const triggerElement = this.elementRef.nativeElement;
493
+ const target = event.target;
494
+ if (!target)
495
+ return;
496
+ if (overlayElement.contains(target) || triggerElement.contains(target))
497
+ return;
498
+ if (this.hasOpenChildSubmenu())
499
+ return;
500
+ this.close();
501
+ };
502
+ addItemClickHandler() {
503
+ this.removeItemClickHandler();
504
+ if (!this.overlayRef)
505
+ return;
506
+ this.itemClickCleanup = this.rendererListen(this.overlayRef.overlayElement, 'click', this.handleItemClick);
507
+ }
508
+ removeItemClickHandler() {
509
+ if (this.itemClickCleanup) {
510
+ this.itemClickCleanup();
511
+ this.itemClickCleanup = null;
512
+ }
513
+ }
514
+ handleItemClick = (event) => {
515
+ if (!this.overlayRef)
516
+ return;
517
+ const target = event.target;
518
+ if (target.closest('solaris-dropdown-menu-item')) {
519
+ this.close();
520
+ }
521
+ };
522
+ addKeydownHandler() {
523
+ this.removeKeydownHandler();
524
+ if (!this.overlayRef)
525
+ return;
526
+ this.keydownCleanup = this.rendererListen(this.overlayRef.overlayElement, 'keydown', this.handleOverlayKeydown);
527
+ }
528
+ removeKeydownHandler() {
529
+ if (this.keydownCleanup) {
530
+ this.keydownCleanup();
531
+ this.keydownCleanup = null;
532
+ }
533
+ }
534
+ handleOverlayKeydown = (event) => {
535
+ if (this.isOpen() && this.nestedMenu()) {
536
+ this.handleKeydown(event);
537
+ }
538
+ };
539
+ handleKeydown(event) {
540
+ const menu = this.nestedMenu();
541
+ if (!menu)
542
+ return;
543
+ switch (event.key) {
544
+ case 'ArrowDown':
545
+ event.preventDefault();
546
+ menu.focusNextItem();
547
+ break;
548
+ case 'ArrowUp':
549
+ event.preventDefault();
550
+ menu.focusPreviousItem();
551
+ break;
552
+ case 'Home':
553
+ event.preventDefault();
554
+ menu.focusFirstItem();
555
+ break;
556
+ case 'End':
557
+ event.preventDefault();
558
+ menu.focusLastItem();
559
+ break;
560
+ case 'Enter':
561
+ case ' ':
562
+ event.preventDefault();
563
+ menu.activateFocusedItem();
564
+ this.close();
565
+ break;
566
+ case 'ArrowLeft':
567
+ case 'Escape':
568
+ event.preventDefault();
569
+ this.close();
570
+ break;
571
+ default:
572
+ if (event.key.length === 1 &&
573
+ !event.ctrlKey &&
574
+ !event.metaKey &&
575
+ !event.altKey) {
576
+ menu.focusItemByLabel(event.key);
577
+ }
578
+ break;
579
+ }
580
+ }
581
+ rendererListen(target, event, callback) {
582
+ target.addEventListener(event, callback);
583
+ return () => {
584
+ target.removeEventListener(event, callback);
585
+ };
586
+ }
587
+ updateOverlaySize() {
588
+ if (!this.overlayRef)
589
+ return;
590
+ const size = {};
591
+ const minW = this.minWidth();
592
+ const maxW = this.maxWidth();
593
+ if (minW !== null) {
594
+ size.minWidth = minW;
595
+ }
596
+ if (maxW !== null) {
597
+ size.maxWidth = maxW;
598
+ }
599
+ this.overlayRef.updateSize(size);
600
+ }
601
+ clearTimers() {
602
+ this.clearOpenTimer();
603
+ this.clearCloseTimer();
604
+ }
605
+ clearOpenTimer() {
606
+ if (this.openTimer) {
607
+ clearTimeout(this.openTimer);
608
+ this.openTimer = null;
609
+ }
610
+ }
611
+ clearCloseTimer() {
612
+ if (this.closeTimer) {
613
+ clearTimeout(this.closeTimer);
614
+ this.closeTimer = null;
615
+ }
616
+ }
617
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisDropdownSubmenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
618
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: SolarisDropdownSubmenuComponent, isStandalone: true, selector: "solaris-dropdown-submenu", inputs: { openMode: { classPropertyName: "openMode", publicName: "openMode", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, matchTriggerWidth: { classPropertyName: "matchTriggerWidth", publicName: "matchTriggerWidth", isSignal: true, isRequired: false, transformFunction: null }, minWidth: { classPropertyName: "minWidth", publicName: "minWidth", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, openDelay: { classPropertyName: "openDelay", publicName: "openDelay", isSignal: true, isRequired: false, transformFunction: null }, closeDelay: { classPropertyName: "closeDelay", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "solaris-dropdown-submenu" }, queries: [{ propertyName: "nestedMenu", first: true, predicate: SolarisDropdownMenuComponent, descendants: true, isSignal: true }, { propertyName: "triggerChild", first: true, predicate: SolarisDropdownSubmenuTriggerComponent, descendants: true, isSignal: true }], ngImport: i0, template: '<ng-content />', isInline: true });
619
+ }
620
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisDropdownSubmenuComponent, decorators: [{
621
+ type: Component,
622
+ args: [{
623
+ selector: 'solaris-dropdown-submenu',
624
+ standalone: true,
625
+ template: '<ng-content />',
626
+ host: {
627
+ class: 'solaris-dropdown-submenu',
628
+ },
629
+ }]
630
+ }], ctorParameters: () => [], propDecorators: { openMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "openMode", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], matchTriggerWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "matchTriggerWidth", required: false }] }], minWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidth", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], openDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "openDelay", required: false }] }], closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], nestedMenu: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SolarisDropdownMenuComponent), { isSignal: true }] }], triggerChild: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SolarisDropdownSubmenuTriggerComponent), { isSignal: true }] }] } });
631
+ //# sourceMappingURL=dropdown-submenu.component.js.map