@tailng-ui/components 0.1.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 (266) hide show
  1. package/README.md +26 -0
  2. package/package.json +14 -0
  3. package/src/index.d.ts +7 -0
  4. package/src/index.d.ts.map +1 -0
  5. package/src/index.js +7 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/feedback/empty/tng-empty.component.d.ts +14 -0
  8. package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -0
  9. package/src/lib/feedback/empty/tng-empty.component.js +60 -0
  10. package/src/lib/feedback/empty/tng-empty.component.js.map +1 -0
  11. package/src/lib/feedback/index.d.ts +11 -0
  12. package/src/lib/feedback/index.d.ts.map +1 -0
  13. package/src/lib/feedback/index.js +11 -0
  14. package/src/lib/feedback/index.js.map +1 -0
  15. package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts +10 -0
  16. package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -0
  17. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +37 -0
  18. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -0
  19. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts +14 -0
  20. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -0
  21. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +55 -0
  22. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -0
  23. package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts +10 -0
  24. package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -0
  25. package/src/lib/feedback/skeleton/tng-skeleton.component.js +33 -0
  26. package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -0
  27. package/src/lib/feedback/toast/tng-toast.component.d.ts +40 -0
  28. package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -0
  29. package/src/lib/feedback/toast/tng-toast.component.js +111 -0
  30. package/src/lib/feedback/toast/tng-toast.component.js.map +1 -0
  31. package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts +26 -0
  32. package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts.map +1 -0
  33. package/src/lib/form/autocomplete/tng-autocomplete.component.js +104 -0
  34. package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -0
  35. package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts +44 -0
  36. package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -0
  37. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +123 -0
  38. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -0
  39. package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts +14 -0
  40. package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -0
  41. package/src/lib/form/button-toggle/tng-button-toggle.component.js +65 -0
  42. package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -0
  43. package/src/lib/form/checkbox/tng-checkbox.component.d.ts +38 -0
  44. package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -0
  45. package/src/lib/form/checkbox/tng-checkbox.component.js +138 -0
  46. package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -0
  47. package/src/lib/form/chips/tng-chips.component.d.ts +4 -0
  48. package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -0
  49. package/src/lib/form/chips/tng-chips.component.js +16 -0
  50. package/src/lib/form/chips/tng-chips.component.js.map +1 -0
  51. package/src/lib/form/combobox/tng-combobox.component.d.ts +4 -0
  52. package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -0
  53. package/src/lib/form/combobox/tng-combobox.component.js +16 -0
  54. package/src/lib/form/combobox/tng-combobox.component.js.map +1 -0
  55. package/src/lib/form/index.d.ts +37 -0
  56. package/src/lib/form/index.d.ts.map +1 -0
  57. package/src/lib/form/index.js +37 -0
  58. package/src/lib/form/index.js.map +1 -0
  59. package/src/lib/form/input/tng-input.component.d.ts +16 -0
  60. package/src/lib/form/input/tng-input.component.d.ts.map +1 -0
  61. package/src/lib/form/input/tng-input.component.js +52 -0
  62. package/src/lib/form/input/tng-input.component.js.map +1 -0
  63. package/src/lib/form/input-otp/tng-input-otp.component.d.ts +13 -0
  64. package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -0
  65. package/src/lib/form/input-otp/tng-input-otp.component.js +138 -0
  66. package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -0
  67. package/src/lib/form/label/tng-label.component.d.ts +8 -0
  68. package/src/lib/form/label/tng-label.component.d.ts.map +1 -0
  69. package/src/lib/form/label/tng-label.component.js +29 -0
  70. package/src/lib/form/label/tng-label.component.js.map +1 -0
  71. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts +55 -0
  72. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts.map +1 -0
  73. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js +126 -0
  74. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js.map +1 -0
  75. package/src/lib/form/multiselect/tng-multiselect.component.d.ts +49 -0
  76. package/src/lib/form/multiselect/tng-multiselect.component.d.ts.map +1 -0
  77. package/src/lib/form/multiselect/tng-multiselect.component.js +112 -0
  78. package/src/lib/form/multiselect/tng-multiselect.component.js.map +1 -0
  79. package/src/lib/form/radio/tng-radio.component.d.ts +12 -0
  80. package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -0
  81. package/src/lib/form/radio/tng-radio.component.js +45 -0
  82. package/src/lib/form/radio/tng-radio.component.js.map +1 -0
  83. package/src/lib/form/select/tng-select.component.d.ts +40 -0
  84. package/src/lib/form/select/tng-select.component.d.ts.map +1 -0
  85. package/src/lib/form/select/tng-select.component.js +98 -0
  86. package/src/lib/form/select/tng-select.component.js.map +1 -0
  87. package/src/lib/form/select/tng-select.slots.d.ts +25 -0
  88. package/src/lib/form/select/tng-select.slots.d.ts.map +1 -0
  89. package/src/lib/form/select/tng-select.slots.js +23 -0
  90. package/src/lib/form/select/tng-select.slots.js.map +1 -0
  91. package/src/lib/form/slider/tng-slider.component.d.ts +11 -0
  92. package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -0
  93. package/src/lib/form/slider/tng-slider.component.js +48 -0
  94. package/src/lib/form/slider/tng-slider.component.js.map +1 -0
  95. package/src/lib/form/switch/tng-switch.component.d.ts +18 -0
  96. package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -0
  97. package/src/lib/form/switch/tng-switch.component.js +57 -0
  98. package/src/lib/form/switch/tng-switch.component.js.map +1 -0
  99. package/src/lib/form/textarea/tng-textarea.component.d.ts +17 -0
  100. package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -0
  101. package/src/lib/form/textarea/tng-textarea.component.js +54 -0
  102. package/src/lib/form/textarea/tng-textarea.component.js.map +1 -0
  103. package/src/lib/form/toggle/tng-toggle.component.d.ts +39 -0
  104. package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -0
  105. package/src/lib/form/toggle/tng-toggle.component.js +152 -0
  106. package/src/lib/form/toggle/tng-toggle.component.js.map +1 -0
  107. package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts +3 -0
  108. package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -0
  109. package/src/lib/form/toggle-group/tng-toggle-group.component.js +34 -0
  110. package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -0
  111. package/src/lib/layout/accordion/tng-accordion.component.d.ts +11 -0
  112. package/src/lib/layout/accordion/tng-accordion.component.d.ts.map +1 -0
  113. package/src/lib/layout/accordion/tng-accordion.component.js +158 -0
  114. package/src/lib/layout/accordion/tng-accordion.component.js.map +1 -0
  115. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts +4 -0
  116. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -0
  117. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +16 -0
  118. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -0
  119. package/src/lib/layout/card/tng-card.component.d.ts +42 -0
  120. package/src/lib/layout/card/tng-card.component.d.ts.map +1 -0
  121. package/src/lib/layout/card/tng-card.component.js +186 -0
  122. package/src/lib/layout/card/tng-card.component.js.map +1 -0
  123. package/src/lib/layout/collapsible/tng-collapsible.component.d.ts +11 -0
  124. package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -0
  125. package/src/lib/layout/collapsible/tng-collapsible.component.js +40 -0
  126. package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -0
  127. package/src/lib/layout/drawer/tng-drawer.component.d.ts +12 -0
  128. package/src/lib/layout/drawer/tng-drawer.component.d.ts.map +1 -0
  129. package/src/lib/layout/drawer/tng-drawer.component.js +77 -0
  130. package/src/lib/layout/drawer/tng-drawer.component.js.map +1 -0
  131. package/src/lib/layout/grid/tng-grid.component.d.ts +4 -0
  132. package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -0
  133. package/src/lib/layout/grid/tng-grid.component.js +16 -0
  134. package/src/lib/layout/grid/tng-grid.component.js.map +1 -0
  135. package/src/lib/layout/index.d.ts +16 -0
  136. package/src/lib/layout/index.d.ts.map +1 -0
  137. package/src/lib/layout/index.js +16 -0
  138. package/src/lib/layout/index.js.map +1 -0
  139. package/src/lib/layout/separator/tng-separator.component.d.ts +6 -0
  140. package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -0
  141. package/src/lib/layout/separator/tng-separator.component.js +19 -0
  142. package/src/lib/layout/separator/tng-separator.component.js.map +1 -0
  143. package/src/lib/layout/stepper/tng-stepper.component.d.ts +4 -0
  144. package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -0
  145. package/src/lib/layout/stepper/tng-stepper.component.js +16 -0
  146. package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -0
  147. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts +28 -0
  148. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -0
  149. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +86 -0
  150. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -0
  151. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts +10 -0
  152. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -0
  153. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +29 -0
  154. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -0
  155. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts +3 -0
  156. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -0
  157. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +15 -0
  158. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -0
  159. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts +6 -0
  160. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -0
  161. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +16 -0
  162. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -0
  163. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts +6 -0
  164. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -0
  165. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +18 -0
  166. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -0
  167. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts +23 -0
  168. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -0
  169. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +155 -0
  170. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -0
  171. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts +4 -0
  172. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -0
  173. package/src/lib/navigation/context-menu/tng-context-menu.component.js +16 -0
  174. package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -0
  175. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts +10 -0
  176. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -0
  177. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +54 -0
  178. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -0
  179. package/src/lib/navigation/index.d.ts +27 -0
  180. package/src/lib/navigation/index.d.ts.map +1 -0
  181. package/src/lib/navigation/index.js +27 -0
  182. package/src/lib/navigation/index.js.map +1 -0
  183. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts +15 -0
  184. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts.map +1 -0
  185. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js +85 -0
  186. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js.map +1 -0
  187. package/src/lib/navigation/menu/tng-menu.component.d.ts +13 -0
  188. package/src/lib/navigation/menu/tng-menu.component.d.ts.map +1 -0
  189. package/src/lib/navigation/menu/tng-menu.component.js +92 -0
  190. package/src/lib/navigation/menu/tng-menu.component.js.map +1 -0
  191. package/src/lib/navigation/menubar/tng-menubar.component.d.ts +5 -0
  192. package/src/lib/navigation/menubar/tng-menubar.component.d.ts.map +1 -0
  193. package/src/lib/navigation/menubar/tng-menubar.component.js +29 -0
  194. package/src/lib/navigation/menubar/tng-menubar.component.js.map +1 -0
  195. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts +4 -0
  196. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -0
  197. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +16 -0
  198. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -0
  199. package/src/lib/navigation/tabs/tng-tabs.component.d.ts +5 -0
  200. package/src/lib/navigation/tabs/tng-tabs.component.d.ts.map +1 -0
  201. package/src/lib/navigation/tabs/tng-tabs.component.js +41 -0
  202. package/src/lib/navigation/tabs/tng-tabs.component.js.map +1 -0
  203. package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts +4 -0
  204. package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -0
  205. package/src/lib/navigation/toolbar/tng-toolbar.component.js +16 -0
  206. package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -0
  207. package/src/lib/overlay/dialog/tng-dialog.component.d.ts +43 -0
  208. package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -0
  209. package/src/lib/overlay/dialog/tng-dialog.component.js +286 -0
  210. package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -0
  211. package/src/lib/overlay/index.d.ts +7 -0
  212. package/src/lib/overlay/index.d.ts.map +1 -0
  213. package/src/lib/overlay/index.js +7 -0
  214. package/src/lib/overlay/index.js.map +1 -0
  215. package/src/lib/overlay/popover/tng-popover.component.d.ts +28 -0
  216. package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -0
  217. package/src/lib/overlay/popover/tng-popover.component.js +133 -0
  218. package/src/lib/overlay/popover/tng-popover.component.js.map +1 -0
  219. package/src/lib/overlay/tng-overlay-runtime.d.ts +11 -0
  220. package/src/lib/overlay/tng-overlay-runtime.d.ts.map +1 -0
  221. package/src/lib/overlay/tng-overlay-runtime.js +11 -0
  222. package/src/lib/overlay/tng-overlay-runtime.js.map +1 -0
  223. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts +31 -0
  224. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -0
  225. package/src/lib/overlay/tooltip/tng-tooltip.component.js +111 -0
  226. package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -0
  227. package/src/lib/utility/avatar/tng-avatar.component.d.ts +19 -0
  228. package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -0
  229. package/src/lib/utility/avatar/tng-avatar.component.js +66 -0
  230. package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -0
  231. package/src/lib/utility/badge/tng-badge.component.d.ts +4 -0
  232. package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -0
  233. package/src/lib/utility/badge/tng-badge.component.js +13 -0
  234. package/src/lib/utility/badge/tng-badge.component.js.map +1 -0
  235. package/src/lib/utility/button/tng-button.component.d.ts +18 -0
  236. package/src/lib/utility/button/tng-button.component.d.ts.map +1 -0
  237. package/src/lib/utility/button/tng-button.component.js +32 -0
  238. package/src/lib/utility/button/tng-button.component.js.map +1 -0
  239. package/src/lib/utility/code-block/highlighting.d.ts +96 -0
  240. package/src/lib/utility/code-block/highlighting.d.ts.map +1 -0
  241. package/src/lib/utility/code-block/highlighting.js +220 -0
  242. package/src/lib/utility/code-block/highlighting.js.map +1 -0
  243. package/src/lib/utility/code-block/tng-code-block.component.d.ts +118 -0
  244. package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -0
  245. package/src/lib/utility/code-block/tng-code-block.component.js +586 -0
  246. package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -0
  247. package/src/lib/utility/copy-button/tng-copy-button.component.d.ts +39 -0
  248. package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -0
  249. package/src/lib/utility/copy-button/tng-copy-button.component.js +127 -0
  250. package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -0
  251. package/src/lib/utility/index.d.ts +17 -0
  252. package/src/lib/utility/index.d.ts.map +1 -0
  253. package/src/lib/utility/index.js +16 -0
  254. package/src/lib/utility/index.js.map +1 -0
  255. package/src/lib/utility/tag/tng-tag.component.d.ts +10 -0
  256. package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -0
  257. package/src/lib/utility/tag/tng-tag.component.js +18 -0
  258. package/src/lib/utility/tag/tng-tag.component.js.map +1 -0
  259. package/src/lib/utility/tree/tng-tree.component.d.ts +72 -0
  260. package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -0
  261. package/src/lib/utility/tree/tng-tree.component.js +336 -0
  262. package/src/lib/utility/tree/tng-tree.component.js.map +1 -0
  263. package/src/test-setup.d.ts +3 -0
  264. package/src/test-setup.d.ts.map +1 -0
  265. package/src/test-setup.js +10 -0
  266. package/src/test-setup.js.map +1 -0
@@ -0,0 +1,286 @@
1
+ import { __decorate } from "tslib";
2
+ import { afterNextRender, booleanAttribute, Component, effect, inject, Injector, input, output, viewChild, } from '@angular/core';
3
+ import { createOverlayScrollLockManager, createTngIdFactory, } from '@tailng-ui/cdk';
4
+ import { tngOverlayRuntime } from '../tng-overlay-runtime';
5
+ const createDialogId = createTngIdFactory('tng-dialog');
6
+ const focusableSelector = [
7
+ 'a[href]',
8
+ 'button:not([disabled])',
9
+ 'input:not([disabled])',
10
+ 'select:not([disabled])',
11
+ 'textarea:not([disabled])',
12
+ '[tabindex]:not([tabindex="-1"])',
13
+ ].join(',');
14
+ function readKeyboardEvent(event) {
15
+ return event instanceof KeyboardEvent ? event : null;
16
+ }
17
+ function resolveActiveElement(documentRef) {
18
+ if (!(documentRef instanceof Document)) {
19
+ return null;
20
+ }
21
+ const activeElement = documentRef.activeElement;
22
+ return activeElement instanceof HTMLElement ? activeElement : null;
23
+ }
24
+ function resolveFocusableElements(container) {
25
+ if (!(container instanceof HTMLElement)) {
26
+ return [];
27
+ }
28
+ const candidates = Array.from(container.querySelectorAll(focusableSelector));
29
+ const focusableElements = [];
30
+ for (const candidate of candidates) {
31
+ if (!candidate.hasAttribute('disabled')) {
32
+ focusableElements.push(candidate);
33
+ }
34
+ }
35
+ return focusableElements;
36
+ }
37
+ function resolveFirstFocusableWithin(container) {
38
+ return resolveFocusableElements(container)[0] ?? null;
39
+ }
40
+ function resolveMarkedInitialElement(container) {
41
+ if (!(container instanceof HTMLElement)) {
42
+ return null;
43
+ }
44
+ const markedInitial = container.querySelector('[data-tng-dialog-initial-focus]');
45
+ if (markedInitial === null) {
46
+ return null;
47
+ }
48
+ if (resolveFocusableElements(container).includes(markedInitial)) {
49
+ return markedInitial;
50
+ }
51
+ return resolveFirstFocusableWithin(markedInitial);
52
+ }
53
+ function toScrollLockDocument(documentRef) {
54
+ if (!(documentRef instanceof Document)) {
55
+ return null;
56
+ }
57
+ return documentRef;
58
+ }
59
+ function toDialogCloseReason(reason) {
60
+ if (reason === 'escape-key') {
61
+ return 'escape';
62
+ }
63
+ if (reason === 'outside-pointer') {
64
+ return 'backdrop';
65
+ }
66
+ return null;
67
+ }
68
+ let TngDialogComponent = class TngDialogComponent {
69
+ closeOnBackdrop = input(true, {
70
+ transform: booleanAttribute,
71
+ });
72
+ closeOnEscape = input(true, {
73
+ transform: booleanAttribute,
74
+ });
75
+ description = input(null);
76
+ open = input(false, {
77
+ transform: booleanAttribute,
78
+ });
79
+ size = input('md');
80
+ title = input('Dialog');
81
+ closed = output();
82
+ openChange = output();
83
+ descriptionId;
84
+ panelId;
85
+ titleId;
86
+ documentRef = typeof document === 'undefined' ? null : document;
87
+ injector = inject(Injector);
88
+ panelRef = viewChild('panelRef');
89
+ scrollLock = createOverlayScrollLockManager({
90
+ documentRef: toScrollLockDocument(this.documentRef),
91
+ });
92
+ instanceId = createDialogId();
93
+ isActive = false;
94
+ isLayerRegistered = false;
95
+ restoreFocusElement = null;
96
+ openStateEffect = effect(() => {
97
+ if (this.open()) {
98
+ this.activateDialog();
99
+ return;
100
+ }
101
+ this.deactivateDialog();
102
+ });
103
+ constructor() {
104
+ this.descriptionId = `${this.instanceId}-description`;
105
+ this.panelId = `${this.instanceId}-panel`;
106
+ this.titleId = `${this.instanceId}-title`;
107
+ }
108
+ close() {
109
+ this.requestClose('programmatic');
110
+ }
111
+ ngOnDestroy() {
112
+ this.openStateEffect.destroy();
113
+ this.deactivateDialog();
114
+ }
115
+ onCloseButtonClick() {
116
+ this.requestClose('close-button');
117
+ }
118
+ onPanelKeydown(event) {
119
+ const keyboardEvent = readKeyboardEvent(event);
120
+ if (keyboardEvent === null) {
121
+ return;
122
+ }
123
+ if (keyboardEvent.key === 'Tab') {
124
+ this.trapTabNavigation(event);
125
+ }
126
+ }
127
+ activateDialog() {
128
+ if (this.isActive) {
129
+ return;
130
+ }
131
+ this.isActive = true;
132
+ this.registerOverlayLayer();
133
+ this.restoreFocusElement = resolveActiveElement(this.documentRef);
134
+ this.scrollLock.acquire(this.instanceId);
135
+ afterNextRender(() => {
136
+ this.focusInitialElement();
137
+ }, { injector: this.injector });
138
+ }
139
+ deactivateDialog() {
140
+ if (!this.isActive) {
141
+ return;
142
+ }
143
+ this.isActive = false;
144
+ this.unregisterOverlayLayer();
145
+ this.scrollLock.release(this.instanceId);
146
+ this.restoreFocusElement?.focus();
147
+ this.restoreFocusElement = null;
148
+ }
149
+ handleOverlayDismiss(reason) {
150
+ const closeReason = toDialogCloseReason(reason);
151
+ if (closeReason === null) {
152
+ return;
153
+ }
154
+ this.requestClose(closeReason);
155
+ }
156
+ registerOverlayLayer() {
157
+ if (this.isLayerRegistered) {
158
+ return;
159
+ }
160
+ this.isLayerRegistered = true;
161
+ tngOverlayRuntime.registerLayer({
162
+ containsTarget: (target, path) => {
163
+ const panel = this.panelRef()?.nativeElement;
164
+ if (panel === undefined) {
165
+ return false;
166
+ }
167
+ if (path.includes(panel)) {
168
+ return true;
169
+ }
170
+ return target instanceof Node ? panel.contains(target) : false;
171
+ },
172
+ dismissOnEscape: this.closeOnEscape(),
173
+ dismissOnOutsidePointer: this.closeOnBackdrop(),
174
+ id: this.instanceId,
175
+ modal: true,
176
+ onDismiss: (reason) => {
177
+ this.handleOverlayDismiss(reason);
178
+ },
179
+ priority: 100,
180
+ });
181
+ }
182
+ unregisterOverlayLayer() {
183
+ if (!this.isLayerRegistered) {
184
+ return;
185
+ }
186
+ this.isLayerRegistered = false;
187
+ tngOverlayRuntime.unregisterLayer(this.instanceId);
188
+ }
189
+ focusInitialElement() {
190
+ const panel = this.panelRef()?.nativeElement;
191
+ if (panel === undefined) {
192
+ return;
193
+ }
194
+ const markedInitial = resolveMarkedInitialElement(panel);
195
+ if (markedInitial !== null) {
196
+ markedInitial.focus();
197
+ return;
198
+ }
199
+ const firstFocusable = resolveFirstFocusableWithin(panel);
200
+ if (firstFocusable !== null) {
201
+ firstFocusable.focus();
202
+ return;
203
+ }
204
+ panel.focus();
205
+ }
206
+ preventAndFocus(event, target) {
207
+ const keyboardEvent = readKeyboardEvent(event);
208
+ if (keyboardEvent === null || !(target instanceof HTMLElement)) {
209
+ return;
210
+ }
211
+ keyboardEvent.preventDefault();
212
+ target.focus();
213
+ }
214
+ requestClose(reason) {
215
+ this.closed.emit(reason);
216
+ this.openChange.emit(false);
217
+ }
218
+ resolveFocusTrapState(panel) {
219
+ if (!(panel instanceof HTMLElement)) {
220
+ return null;
221
+ }
222
+ const focusableElements = resolveFocusableElements(panel);
223
+ const first = focusableElements[0];
224
+ if (first === undefined) {
225
+ return null;
226
+ }
227
+ return {
228
+ activeElement: resolveActiveElement(this.documentRef),
229
+ first,
230
+ last: focusableElements[focusableElements.length - 1] ?? first,
231
+ panel,
232
+ };
233
+ }
234
+ focusEdgeWhenOutsidePanel(event, focusState) {
235
+ const state = focusState;
236
+ const activeElement = state.activeElement;
237
+ if (activeElement !== null && state.panel.contains(activeElement)) {
238
+ return false;
239
+ }
240
+ const keyboardEvent = readKeyboardEvent(event);
241
+ if (keyboardEvent === null) {
242
+ return true;
243
+ }
244
+ const edge = keyboardEvent.shiftKey ? state.last : state.first;
245
+ this.preventAndFocus(keyboardEvent, edge);
246
+ return true;
247
+ }
248
+ wrapTabAtEdges(event, focusState) {
249
+ const state = focusState;
250
+ const keyboardEvent = readKeyboardEvent(event);
251
+ if (keyboardEvent === null) {
252
+ return;
253
+ }
254
+ if (keyboardEvent.shiftKey && state.activeElement === state.first) {
255
+ this.preventAndFocus(keyboardEvent, state.last);
256
+ return;
257
+ }
258
+ if (!keyboardEvent.shiftKey && state.activeElement === state.last) {
259
+ this.preventAndFocus(keyboardEvent, state.first);
260
+ }
261
+ }
262
+ trapTabNavigation(event) {
263
+ const panel = this.panelRef()?.nativeElement;
264
+ if (panel === undefined) {
265
+ return;
266
+ }
267
+ const focusState = this.resolveFocusTrapState(panel);
268
+ if (focusState === null) {
269
+ this.preventAndFocus(event, panel);
270
+ return;
271
+ }
272
+ if (this.focusEdgeWhenOutsidePanel(event, focusState)) {
273
+ return;
274
+ }
275
+ this.wrapTabAtEdges(event, focusState);
276
+ }
277
+ };
278
+ TngDialogComponent = __decorate([
279
+ Component({
280
+ selector: 'tng-dialog',
281
+ templateUrl: './tng-dialog.component.html',
282
+ styleUrl: './tng-dialog.component.css',
283
+ })
284
+ ], TngDialogComponent);
285
+ export { TngDialogComponent };
286
+ //# sourceMappingURL=tng-dialog.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-dialog.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/overlay/dialog/tng-dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n Component,\n effect,\n inject,\n Injector,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport type { ElementRef, OnDestroy } from '@angular/core';\nimport {\n createOverlayScrollLockManager,\n createTngIdFactory,\n type TngOverlayDismissReason,\n} from '@tailng-ui/cdk';\nimport type { TngScrollLockDocument } from '@tailng-ui/cdk/overlay';\nimport { tngOverlayRuntime } from '../tng-overlay-runtime';\n\nconst createDialogId = createTngIdFactory('tng-dialog');\n\nconst focusableSelector = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\ntype TngFocusTrapState = Readonly<{\n activeElement: HTMLElement | null;\n first: HTMLElement;\n last: HTMLElement;\n panel: HTMLElement;\n}>;\n\nexport type TngDialogCloseReason = 'backdrop' | 'close-button' | 'escape' | 'programmatic';\nexport type TngDialogSize = 'lg' | 'md' | 'sm';\n\nfunction readKeyboardEvent(event: unknown): KeyboardEvent | null {\n return event instanceof KeyboardEvent ? event : null;\n}\n\nfunction resolveActiveElement(documentRef: unknown): HTMLElement | null {\n if (!(documentRef instanceof Document)) {\n return null;\n }\n\n const activeElement = documentRef.activeElement;\n return activeElement instanceof HTMLElement ? activeElement : null;\n}\n\nfunction resolveFocusableElements(container: unknown): readonly HTMLElement[] {\n if (!(container instanceof HTMLElement)) {\n return [];\n }\n\n const candidates = Array.from(container.querySelectorAll<HTMLElement>(focusableSelector));\n const focusableElements: HTMLElement[] = [];\n for (const candidate of candidates) {\n if (!candidate.hasAttribute('disabled')) {\n focusableElements.push(candidate);\n }\n }\n\n return focusableElements;\n}\n\nfunction resolveFirstFocusableWithin(container: unknown): HTMLElement | null {\n return resolveFocusableElements(container)[0] ?? null;\n}\n\nfunction resolveMarkedInitialElement(container: unknown): HTMLElement | null {\n if (!(container instanceof HTMLElement)) {\n return null;\n }\n\n const markedInitial = container.querySelector<HTMLElement>('[data-tng-dialog-initial-focus]');\n if (markedInitial === null) {\n return null;\n }\n\n if (resolveFocusableElements(container).includes(markedInitial)) {\n return markedInitial;\n }\n\n return resolveFirstFocusableWithin(markedInitial);\n}\n\nfunction toScrollLockDocument(documentRef: unknown): TngScrollLockDocument | null {\n if (!(documentRef instanceof Document)) {\n return null;\n }\n\n return documentRef as unknown as TngScrollLockDocument;\n}\n\nfunction toDialogCloseReason(reason: TngOverlayDismissReason): TngDialogCloseReason | null {\n if (reason === 'escape-key') {\n return 'escape';\n }\n\n if (reason === 'outside-pointer') {\n return 'backdrop';\n }\n\n return null;\n}\n\n@Component({\n selector: 'tng-dialog',\n templateUrl: './tng-dialog.component.html',\n styleUrl: './tng-dialog.component.css',\n})\nexport class TngDialogComponent implements OnDestroy {\n public readonly closeOnBackdrop = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly closeOnEscape = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly description = input<string | null>(null);\n public readonly open = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly size = input<TngDialogSize>('md');\n public readonly title = input<string>('Dialog');\n\n public readonly closed = output<TngDialogCloseReason>();\n public readonly openChange = output<boolean>();\n\n protected readonly descriptionId: string;\n protected readonly panelId: string;\n protected readonly titleId: string;\n\n private readonly documentRef = typeof document === 'undefined' ? null : document;\n private readonly injector = inject(Injector);\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panelRef');\n private readonly scrollLock = createOverlayScrollLockManager({\n documentRef: toScrollLockDocument(this.documentRef),\n });\n private readonly instanceId = createDialogId();\n private isActive = false;\n private isLayerRegistered = false;\n private restoreFocusElement: HTMLElement | null = null;\n\n private readonly openStateEffect = effect((): void => {\n if (this.open()) {\n this.activateDialog();\n return;\n }\n\n this.deactivateDialog();\n });\n\n public constructor() {\n this.descriptionId = `${this.instanceId}-description`;\n this.panelId = `${this.instanceId}-panel`;\n this.titleId = `${this.instanceId}-title`;\n }\n\n public close(): void {\n this.requestClose('programmatic');\n }\n\n public ngOnDestroy(): void {\n this.openStateEffect.destroy();\n this.deactivateDialog();\n }\n\n public onCloseButtonClick(): void {\n this.requestClose('close-button');\n }\n\n public onPanelKeydown(event: unknown): void {\n const keyboardEvent = readKeyboardEvent(event);\n if (keyboardEvent === null) {\n return;\n }\n\n if (keyboardEvent.key === 'Tab') {\n this.trapTabNavigation(event);\n }\n }\n\n private activateDialog(): void {\n if (this.isActive) {\n return;\n }\n\n this.isActive = true;\n this.registerOverlayLayer();\n this.restoreFocusElement = resolveActiveElement(this.documentRef);\n this.scrollLock.acquire(this.instanceId);\n afterNextRender(\n (): void => {\n this.focusInitialElement();\n },\n { injector: this.injector },\n );\n }\n\n private deactivateDialog(): void {\n if (!this.isActive) {\n return;\n }\n\n this.isActive = false;\n this.unregisterOverlayLayer();\n this.scrollLock.release(this.instanceId);\n this.restoreFocusElement?.focus();\n this.restoreFocusElement = null;\n }\n\n private handleOverlayDismiss(reason: TngOverlayDismissReason): void {\n const closeReason = toDialogCloseReason(reason);\n if (closeReason === null) {\n return;\n }\n\n this.requestClose(closeReason);\n }\n\n private registerOverlayLayer(): void {\n if (this.isLayerRegistered) {\n return;\n }\n\n this.isLayerRegistered = true;\n tngOverlayRuntime.registerLayer({\n containsTarget: (target: unknown, path: readonly unknown[]): boolean => {\n const panel = this.panelRef()?.nativeElement;\n if (panel === undefined) {\n return false;\n }\n\n if (path.includes(panel)) {\n return true;\n }\n\n return target instanceof Node ? panel.contains(target) : false;\n },\n dismissOnEscape: this.closeOnEscape(),\n dismissOnOutsidePointer: this.closeOnBackdrop(),\n id: this.instanceId,\n modal: true,\n onDismiss: (reason: TngOverlayDismissReason): void => {\n this.handleOverlayDismiss(reason);\n },\n priority: 100,\n });\n }\n\n private unregisterOverlayLayer(): void {\n if (!this.isLayerRegistered) {\n return;\n }\n\n this.isLayerRegistered = false;\n tngOverlayRuntime.unregisterLayer(this.instanceId);\n }\n\n private focusInitialElement(): void {\n const panel = this.panelRef()?.nativeElement;\n if (panel === undefined) {\n return;\n }\n\n const markedInitial = resolveMarkedInitialElement(panel);\n if (markedInitial !== null) {\n markedInitial.focus();\n return;\n }\n\n const firstFocusable = resolveFirstFocusableWithin(panel);\n if (firstFocusable !== null) {\n firstFocusable.focus();\n return;\n }\n\n panel.focus();\n }\n\n private preventAndFocus(event: unknown, target: unknown): void {\n const keyboardEvent = readKeyboardEvent(event);\n if (keyboardEvent === null || !(target instanceof HTMLElement)) {\n return;\n }\n\n keyboardEvent.preventDefault();\n target.focus();\n }\n\n private requestClose(reason: TngDialogCloseReason): void {\n this.closed.emit(reason);\n this.openChange.emit(false);\n }\n\n private resolveFocusTrapState(panel: unknown): TngFocusTrapState | null {\n if (!(panel instanceof HTMLElement)) {\n return null;\n }\n\n const focusableElements = resolveFocusableElements(panel);\n const first = focusableElements[0];\n if (first === undefined) {\n return null;\n }\n\n return {\n activeElement: resolveActiveElement(this.documentRef),\n first,\n last: focusableElements[focusableElements.length - 1] ?? first,\n panel,\n };\n }\n\n private focusEdgeWhenOutsidePanel(event: unknown, focusState: unknown): boolean {\n const state = focusState as TngFocusTrapState;\n const activeElement = state.activeElement;\n if (activeElement !== null && state.panel.contains(activeElement)) {\n return false;\n }\n\n const keyboardEvent = readKeyboardEvent(event);\n if (keyboardEvent === null) {\n return true;\n }\n\n const edge = keyboardEvent.shiftKey ? state.last : state.first;\n this.preventAndFocus(keyboardEvent, edge);\n return true;\n }\n\n private wrapTabAtEdges(event: unknown, focusState: unknown): void {\n const state = focusState as TngFocusTrapState;\n const keyboardEvent = readKeyboardEvent(event);\n if (keyboardEvent === null) {\n return;\n }\n\n if (keyboardEvent.shiftKey && state.activeElement === state.first) {\n this.preventAndFocus(keyboardEvent, state.last);\n return;\n }\n\n if (!keyboardEvent.shiftKey && state.activeElement === state.last) {\n this.preventAndFocus(keyboardEvent, state.first);\n }\n }\n\n private trapTabNavigation(event: unknown): void {\n const panel = this.panelRef()?.nativeElement;\n if (panel === undefined) {\n return;\n }\n\n const focusState = this.resolveFocusTrapState(panel);\n if (focusState === null) {\n this.preventAndFocus(event, panel);\n return;\n }\n\n if (this.focusEdgeWhenOutsidePanel(event, focusState)) {\n return;\n }\n\n this.wrapTabAtEdges(event, focusState);\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export * from './dialog/tng-dialog.component';
2
+ export { TngDialogComponent as TngDialog } from './dialog/tng-dialog.component';
3
+ export * from './popover/tng-popover.component';
4
+ export { TngPopoverComponent as TngPopover } from './popover/tng-popover.component';
5
+ export * from './tooltip/tng-tooltip.component';
6
+ export { TngTooltipComponent as TngTooltip } from './tooltip/tng-tooltip.component';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/components/src/lib/overlay/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,kBAAkB,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAChF,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACpF,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './dialog/tng-dialog.component';
2
+ export { TngDialogComponent as TngDialog } from './dialog/tng-dialog.component';
3
+ export * from './popover/tng-popover.component';
4
+ export { TngPopoverComponent as TngPopover } from './popover/tng-popover.component';
5
+ export * from './tooltip/tng-tooltip.component';
6
+ export { TngTooltipComponent as TngTooltip } from './tooltip/tng-tooltip.component';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/components/src/lib/overlay/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,kBAAkB,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAChF,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACpF,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,mBAAmB,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC","sourcesContent":["export * from './dialog/tng-dialog.component';\nexport { TngDialogComponent as TngDialog } from './dialog/tng-dialog.component';\nexport * from './popover/tng-popover.component';\nexport { TngPopoverComponent as TngPopover } from './popover/tng-popover.component';\nexport * from './tooltip/tng-tooltip.component';\nexport { TngTooltipComponent as TngTooltip } from './tooltip/tng-tooltip.component';\n"]}
@@ -0,0 +1,28 @@
1
+ import type { OnDestroy } from '@angular/core';
2
+ export type TngPopoverCloseReason = 'escape' | 'outside-pointer' | 'programmatic' | 'trigger-toggle';
3
+ export declare class TngPopoverComponent implements OnDestroy {
4
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
5
+ readonly closeOnEscape: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
6
+ readonly closeOnOutsidePointer: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
7
+ readonly open: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
8
+ readonly triggerLabel: import("@angular/core").InputSignal<string>;
9
+ readonly closed: import("@angular/core").OutputEmitterRef<TngPopoverCloseReason>;
10
+ readonly openChange: import("@angular/core").OutputEmitterRef<boolean>;
11
+ protected readonly panelId: string;
12
+ private readonly hostRef;
13
+ private readonly injector;
14
+ private readonly panelRef;
15
+ private readonly instanceId;
16
+ private isLayerRegistered;
17
+ private readonly openStateEffect;
18
+ constructor();
19
+ close(): void;
20
+ ngOnDestroy(): void;
21
+ onTriggerClick(): void;
22
+ private handleOverlayDismiss;
23
+ private registerOverlayLayer;
24
+ private unregisterOverlayLayer;
25
+ private focusInitialElement;
26
+ private requestClose;
27
+ }
28
+ //# sourceMappingURL=tng-popover.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-popover.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/overlay/popover/tng-popover.component.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAe/C,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,iBAAiB,GACjB,cAAc,GACd,gBAAgB,CAAC;AAsBrB,qBAKa,mBAAoB,YAAW,SAAS;IACnD,SAAgB,SAAS,8CAA4B;IACrD,SAAgB,aAAa,8EAE1B;IACH,SAAgB,qBAAqB,8EAElC;IACH,SAAgB,IAAI,8EAEjB;IACH,SAAgB,YAAY,8CAAmC;IAE/D,SAAgB,MAAM,kEAAmC;IACzD,SAAgB,UAAU,oDAAqB;IAE/C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkD;IAC3E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAQ7B;;IAMI,KAAK,IAAI,IAAI;IAIb,WAAW,IAAI,IAAI;IAKnB,cAAc,IAAI,IAAI;IAS7B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,YAAY;CAIrB"}
@@ -0,0 +1,133 @@
1
+ import { __decorate } from "tslib";
2
+ import { afterNextRender, booleanAttribute, Component, ElementRef, effect, inject, Injector, input, output, viewChild, } from '@angular/core';
3
+ import { createTngIdFactory } from '@tailng-ui/cdk';
4
+ import { tngOverlayRuntime } from '../tng-overlay-runtime';
5
+ const createPopoverId = createTngIdFactory('tng-popover');
6
+ const focusableSelector = [
7
+ 'a[href]',
8
+ 'button:not([disabled])',
9
+ 'input:not([disabled])',
10
+ 'select:not([disabled])',
11
+ 'textarea:not([disabled])',
12
+ '[tabindex]:not([tabindex="-1"])',
13
+ ].join(',');
14
+ function resolveFocusableElements(container) {
15
+ if (!(container instanceof HTMLElement)) {
16
+ return [];
17
+ }
18
+ return Array.from(container.querySelectorAll(focusableSelector));
19
+ }
20
+ function toPopoverCloseReason(reason) {
21
+ if (reason === 'escape-key') {
22
+ return 'escape';
23
+ }
24
+ if (reason === 'outside-pointer') {
25
+ return 'outside-pointer';
26
+ }
27
+ return null;
28
+ }
29
+ let TngPopoverComponent = class TngPopoverComponent {
30
+ ariaLabel = input('Popover');
31
+ closeOnEscape = input(true, {
32
+ transform: booleanAttribute,
33
+ });
34
+ closeOnOutsidePointer = input(true, {
35
+ transform: booleanAttribute,
36
+ });
37
+ open = input(false, {
38
+ transform: booleanAttribute,
39
+ });
40
+ triggerLabel = input('Toggle Popover');
41
+ closed = output();
42
+ openChange = output();
43
+ panelId;
44
+ hostRef = inject(ElementRef);
45
+ injector = inject(Injector);
46
+ panelRef = viewChild('panelRef');
47
+ instanceId = createPopoverId();
48
+ isLayerRegistered = false;
49
+ openStateEffect = effect(() => {
50
+ if (this.open()) {
51
+ this.registerOverlayLayer();
52
+ this.focusInitialElement();
53
+ return;
54
+ }
55
+ this.unregisterOverlayLayer();
56
+ });
57
+ constructor() {
58
+ this.panelId = `${this.instanceId}-panel`;
59
+ }
60
+ close() {
61
+ this.requestClose('programmatic');
62
+ }
63
+ ngOnDestroy() {
64
+ this.openStateEffect.destroy();
65
+ this.unregisterOverlayLayer();
66
+ }
67
+ onTriggerClick() {
68
+ if (this.open()) {
69
+ this.requestClose('trigger-toggle');
70
+ return;
71
+ }
72
+ this.openChange.emit(true);
73
+ }
74
+ handleOverlayDismiss(reason) {
75
+ const closeReason = toPopoverCloseReason(reason);
76
+ if (closeReason === null) {
77
+ return;
78
+ }
79
+ this.requestClose(closeReason);
80
+ }
81
+ registerOverlayLayer() {
82
+ if (this.isLayerRegistered) {
83
+ return;
84
+ }
85
+ this.isLayerRegistered = true;
86
+ tngOverlayRuntime.registerLayer({
87
+ containsTarget: (target) => {
88
+ return target instanceof Node ? this.hostRef.nativeElement.contains(target) : false;
89
+ },
90
+ dismissOnEscape: this.closeOnEscape(),
91
+ dismissOnOutsidePointer: this.closeOnOutsidePointer(),
92
+ id: this.instanceId,
93
+ onDismiss: (reason) => {
94
+ this.handleOverlayDismiss(reason);
95
+ },
96
+ priority: 110,
97
+ });
98
+ }
99
+ unregisterOverlayLayer() {
100
+ if (!this.isLayerRegistered) {
101
+ return;
102
+ }
103
+ this.isLayerRegistered = false;
104
+ tngOverlayRuntime.unregisterLayer(this.instanceId);
105
+ }
106
+ focusInitialElement() {
107
+ afterNextRender(() => {
108
+ const panel = this.panelRef()?.nativeElement;
109
+ if (panel === undefined) {
110
+ return;
111
+ }
112
+ const firstFocusable = resolveFocusableElements(panel)[0];
113
+ if (firstFocusable !== undefined) {
114
+ firstFocusable.focus();
115
+ return;
116
+ }
117
+ panel.focus();
118
+ }, { injector: this.injector });
119
+ }
120
+ requestClose(reason) {
121
+ this.closed.emit(reason);
122
+ this.openChange.emit(false);
123
+ }
124
+ };
125
+ TngPopoverComponent = __decorate([
126
+ Component({
127
+ selector: 'tng-popover',
128
+ templateUrl: './tng-popover.component.html',
129
+ styleUrl: './tng-popover.component.css',
130
+ })
131
+ ], TngPopoverComponent);
132
+ export { TngPopoverComponent };
133
+ //# sourceMappingURL=tng-popover.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-popover.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/overlay/popover/tng-popover.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n Component,\n ElementRef,\n effect,\n inject,\n Injector,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport type { OnDestroy } from '@angular/core';\nimport { createTngIdFactory, type TngOverlayDismissReason } from '@tailng-ui/cdk';\nimport { tngOverlayRuntime } from '../tng-overlay-runtime';\n\nconst createPopoverId = createTngIdFactory('tng-popover');\n\nconst focusableSelector = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nexport type TngPopoverCloseReason =\n | 'escape'\n | 'outside-pointer'\n | 'programmatic'\n | 'trigger-toggle';\n\nfunction resolveFocusableElements(container: unknown): readonly HTMLElement[] {\n if (!(container instanceof HTMLElement)) {\n return [];\n }\n\n return Array.from(container.querySelectorAll<HTMLElement>(focusableSelector));\n}\n\nfunction toPopoverCloseReason(reason: TngOverlayDismissReason): TngPopoverCloseReason | null {\n if (reason === 'escape-key') {\n return 'escape';\n }\n\n if (reason === 'outside-pointer') {\n return 'outside-pointer';\n }\n\n return null;\n}\n\n@Component({\n selector: 'tng-popover',\n templateUrl: './tng-popover.component.html',\n styleUrl: './tng-popover.component.css',\n})\nexport class TngPopoverComponent implements OnDestroy {\n public readonly ariaLabel = input<string>('Popover');\n public readonly closeOnEscape = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly closeOnOutsidePointer = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly open = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly triggerLabel = input<string>('Toggle Popover');\n\n public readonly closed = output<TngPopoverCloseReason>();\n public readonly openChange = output<boolean>();\n\n protected readonly panelId: string;\n\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panelRef');\n private readonly instanceId = createPopoverId();\n private isLayerRegistered = false;\n private readonly openStateEffect = effect((): void => {\n if (this.open()) {\n this.registerOverlayLayer();\n this.focusInitialElement();\n return;\n }\n\n this.unregisterOverlayLayer();\n });\n\n public constructor() {\n this.panelId = `${this.instanceId}-panel`;\n }\n\n public close(): void {\n this.requestClose('programmatic');\n }\n\n public ngOnDestroy(): void {\n this.openStateEffect.destroy();\n this.unregisterOverlayLayer();\n }\n\n public onTriggerClick(): void {\n if (this.open()) {\n this.requestClose('trigger-toggle');\n return;\n }\n\n this.openChange.emit(true);\n }\n\n private handleOverlayDismiss(reason: TngOverlayDismissReason): void {\n const closeReason = toPopoverCloseReason(reason);\n if (closeReason === null) {\n return;\n }\n\n this.requestClose(closeReason);\n }\n\n private registerOverlayLayer(): void {\n if (this.isLayerRegistered) {\n return;\n }\n\n this.isLayerRegistered = true;\n tngOverlayRuntime.registerLayer({\n containsTarget: (target: unknown): boolean => {\n return target instanceof Node ? this.hostRef.nativeElement.contains(target) : false;\n },\n dismissOnEscape: this.closeOnEscape(),\n dismissOnOutsidePointer: this.closeOnOutsidePointer(),\n id: this.instanceId,\n onDismiss: (reason: TngOverlayDismissReason): void => {\n this.handleOverlayDismiss(reason);\n },\n priority: 110,\n });\n }\n\n private unregisterOverlayLayer(): void {\n if (!this.isLayerRegistered) {\n return;\n }\n\n this.isLayerRegistered = false;\n tngOverlayRuntime.unregisterLayer(this.instanceId);\n }\n\n private focusInitialElement(): void {\n afterNextRender(\n (): void => {\n const panel = this.panelRef()?.nativeElement;\n if (panel === undefined) {\n return;\n }\n\n const firstFocusable = resolveFocusableElements(panel)[0];\n if (firstFocusable !== undefined) {\n firstFocusable.focus();\n return;\n }\n\n panel.focus();\n },\n { injector: this.injector },\n );\n }\n\n private requestClose(reason: TngPopoverCloseReason): void {\n this.closed.emit(reason);\n this.openChange.emit(false);\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ export declare const tngOverlayRuntime: Readonly<{
2
+ clearLayers: () => void;
3
+ dispatchKeydown: (event: import("@tailng-ui/cdk").TngOverlayKeyboardEvent) => void;
4
+ dispatchPointerDown: (event: import("@tailng-ui/cdk").TngOverlayPointerEvent) => void;
5
+ dismissById: (id: string, reason: import("@tailng-ui/cdk").TngOverlayDismissReason) => void;
6
+ getLayerIds: () => readonly string[];
7
+ isTopLayer: (id: string) => boolean;
8
+ registerLayer: (layer: import("@tailng-ui/cdk").TngOverlayLayer) => void;
9
+ unregisterLayer: (id: string) => void;
10
+ }>;
11
+ //# sourceMappingURL=tng-overlay-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-overlay-runtime.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/components/src/lib/overlay/tng-overlay-runtime.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB;;;;;;;;;EAE5B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { createOverlayRuntime } from '@tailng-ui/cdk';
2
+ function resolveGlobalDocument() {
3
+ if (typeof document === 'undefined') {
4
+ return null;
5
+ }
6
+ return document;
7
+ }
8
+ export const tngOverlayRuntime = createOverlayRuntime({
9
+ documentRef: resolveGlobalDocument(),
10
+ });
11
+ //# sourceMappingURL=tng-overlay-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-overlay-runtime.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/components/src/lib/overlay/tng-overlay-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,SAAS,qBAAqB;IAC5B,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;IACpD,WAAW,EAAE,qBAAqB,EAAE;CACrC,CAAC,CAAC","sourcesContent":["import { createOverlayRuntime } from '@tailng-ui/cdk';\n\nfunction resolveGlobalDocument(): Document | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n return document;\n}\n\nexport const tngOverlayRuntime = createOverlayRuntime({\n documentRef: resolveGlobalDocument(),\n});\n"]}
@@ -0,0 +1,31 @@
1
+ import type { OnDestroy } from '@angular/core';
2
+ import { type TngTooltipSide } from '@tailng-ui/primitives';
3
+ type TngTooltipKeyboardEvent = Readonly<Pick<KeyboardEvent, 'key'>> & Readonly<{
4
+ preventDefault: () => void;
5
+ }>;
6
+ export declare function normalizeTngTooltipDelay(value: number): number;
7
+ export declare function shouldCloseTngTooltipForKey(key: string): boolean;
8
+ export declare class TngTooltipComponent implements OnDestroy {
9
+ private closeTimerId;
10
+ private openTimerId;
11
+ readonly ariaLabel: import("@angular/core").InputSignal<string | null>;
12
+ readonly closeDelay: import("@angular/core").InputSignal<number>;
13
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
14
+ readonly openDelay: import("@angular/core").InputSignal<number>;
15
+ readonly side: import("@angular/core").InputSignal<TngTooltipSide>;
16
+ readonly text: import("@angular/core").InputSignal<string>;
17
+ readonly triggerLabel: import("@angular/core").InputSignal<string>;
18
+ readonly openChange: import("@angular/core").OutputEmitterRef<boolean>;
19
+ protected readonly open: import("@angular/core").WritableSignal<boolean>;
20
+ protected readonly tooltipId: string;
21
+ private readonly syncDisabledState;
22
+ ngOnDestroy(): void;
23
+ protected onCloseIntent(): void;
24
+ protected onOpenIntent(): void;
25
+ protected onTriggerKeydown(event: TngTooltipKeyboardEvent): void;
26
+ private clearCloseTimer;
27
+ private clearOpenTimer;
28
+ private setOpen;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=tng-tooltip.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-tooltip.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/overlay/tooltip/tng-tooltip.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,uBAAuB,CAAC;AAE/B,KAAK,uBAAuB,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,GACjE,QAAQ,CAAC;IAAE,cAAc,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAAC;AAI3C,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,qBAMa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,WAAW,CAA8C;IAEjE,SAAgB,SAAS,qDAA8B;IACvD,SAAgB,UAAU,8CAAqB;IAC/C,SAAgB,QAAQ,8EAErB;IACH,SAAgB,SAAS,8CAAsB;IAC/C,SAAgB,IAAI,sDAAgC;IACpD,SAAgB,IAAI,8CAAqC;IACzD,SAAgB,YAAY,8CAAyB;IAErD,SAAgB,UAAU,oDAAqB;IAC/C,SAAS,CAAC,QAAQ,CAAC,IAAI,kDAAiB;IACxC,SAAS,CAAC,QAAQ,CAAC,SAAS,SAAsB;IAElD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAI/B;IAEI,WAAW,IAAI,IAAI;IAM1B,SAAS,CAAC,aAAa,IAAI,IAAI;IAkB/B,SAAS,CAAC,YAAY,IAAI,IAAI;IAkB9B,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI;IAehE,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,OAAO;CAQhB"}