@tailng-ui/components 0.17.0 → 0.18.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 (257) hide show
  1. package/package.json +16 -5
  2. package/src/lib/feedback/empty/tng-empty.component.d.ts +16 -1
  3. package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -1
  4. package/src/lib/feedback/empty/tng-empty.component.js +47 -57
  5. package/src/lib/feedback/empty/tng-empty.component.js.map +1 -1
  6. package/src/lib/feedback/index.d.ts +0 -5
  7. package/src/lib/feedback/index.d.ts.map +1 -1
  8. package/src/lib/feedback/index.js +4 -5
  9. package/src/lib/feedback/index.js.map +1 -1
  10. package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts +4 -0
  11. package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -1
  12. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +16 -26
  13. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -1
  14. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts +4 -0
  15. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -1
  16. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +18 -32
  17. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -1
  18. package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts +4 -0
  19. package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -1
  20. package/src/lib/feedback/skeleton/tng-skeleton.component.js +14 -20
  21. package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -1
  22. package/src/lib/feedback/toast/tng-toast.component.d.ts +4 -1
  23. package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -1
  24. package/src/lib/feedback/toast/tng-toast.component.js +17 -19
  25. package/src/lib/feedback/toast/tng-toast.component.js.map +1 -1
  26. package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts +4 -0
  27. package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts.map +1 -1
  28. package/src/lib/form/autocomplete/tng-autocomplete.component.js +46 -49
  29. package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -1
  30. package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts +3 -0
  31. package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -1
  32. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +33 -58
  33. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -1
  34. package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts +3 -0
  35. package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -1
  36. package/src/lib/form/button-toggle/tng-button-toggle.component.js +15 -26
  37. package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -1
  38. package/src/lib/form/checkbox/tng-checkbox.component.d.ts +3 -0
  39. package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -1
  40. package/src/lib/form/checkbox/tng-checkbox.component.js +32 -42
  41. package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -1
  42. package/src/lib/form/chips/tng-chips.component.d.ts +3 -0
  43. package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -1
  44. package/src/lib/form/chips/tng-chips.component.js +14 -19
  45. package/src/lib/form/chips/tng-chips.component.js.map +1 -1
  46. package/src/lib/form/combobox/tng-combobox.component.d.ts +3 -0
  47. package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -1
  48. package/src/lib/form/combobox/tng-combobox.component.js +10 -13
  49. package/src/lib/form/combobox/tng-combobox.component.js.map +1 -1
  50. package/src/lib/form/datepicker/tng-datepicker.component.d.ts +4 -1
  51. package/src/lib/form/datepicker/tng-datepicker.component.d.ts.map +1 -1
  52. package/src/lib/form/datepicker/tng-datepicker.component.js +58 -98
  53. package/src/lib/form/datepicker/tng-datepicker.component.js.map +1 -1
  54. package/src/lib/form/form-field/tng-form-field.component.d.ts +3 -0
  55. package/src/lib/form/form-field/tng-form-field.component.d.ts.map +1 -1
  56. package/src/lib/form/form-field/tng-form-field.component.js +28 -33
  57. package/src/lib/form/form-field/tng-form-field.component.js.map +1 -1
  58. package/src/lib/form/index.d.ts +0 -20
  59. package/src/lib/form/index.d.ts.map +1 -1
  60. package/src/lib/form/index.js +4 -20
  61. package/src/lib/form/index.js.map +1 -1
  62. package/src/lib/form/input/tng-input.component.d.ts +3 -0
  63. package/src/lib/form/input/tng-input.component.d.ts.map +1 -1
  64. package/src/lib/form/input/tng-input.component.js +49 -60
  65. package/src/lib/form/input/tng-input.component.js.map +1 -1
  66. package/src/lib/form/input-otp/tng-input-otp.component.d.ts +3 -0
  67. package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -1
  68. package/src/lib/form/input-otp/tng-input-otp.component.js +55 -69
  69. package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -1
  70. package/src/lib/form/label/tng-label.component.d.ts +3 -0
  71. package/src/lib/form/label/tng-label.component.d.ts.map +1 -1
  72. package/src/lib/form/label/tng-label.component.js +12 -19
  73. package/src/lib/form/label/tng-label.component.js.map +1 -1
  74. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts +4 -0
  75. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts.map +1 -1
  76. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js +40 -43
  77. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js.map +1 -1
  78. package/src/lib/form/multiselect/tng-multiselect.component.d.ts +4 -0
  79. package/src/lib/form/multiselect/tng-multiselect.component.d.ts.map +1 -1
  80. package/src/lib/form/multiselect/tng-multiselect.component.js +49 -52
  81. package/src/lib/form/multiselect/tng-multiselect.component.js.map +1 -1
  82. package/src/lib/form/radio/tng-radio.component.d.ts +3 -0
  83. package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -1
  84. package/src/lib/form/radio/tng-radio.component.js +18 -33
  85. package/src/lib/form/radio/tng-radio.component.js.map +1 -1
  86. package/src/lib/form/select/tng-select.component.d.ts +4 -0
  87. package/src/lib/form/select/tng-select.component.d.ts.map +1 -1
  88. package/src/lib/form/select/tng-select.component.js +52 -53
  89. package/src/lib/form/select/tng-select.component.js.map +1 -1
  90. package/src/lib/form/select/tng-select.slots.d.ts +5 -0
  91. package/src/lib/form/select/tng-select.slots.d.ts.map +1 -1
  92. package/src/lib/form/select/tng-select.slots.js +21 -17
  93. package/src/lib/form/select/tng-select.slots.js.map +1 -1
  94. package/src/lib/form/slider/tng-slider.component.d.ts +3 -0
  95. package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -1
  96. package/src/lib/form/slider/tng-slider.component.js +14 -27
  97. package/src/lib/form/slider/tng-slider.component.js.map +1 -1
  98. package/src/lib/form/switch/tng-switch.component.d.ts +3 -0
  99. package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -1
  100. package/src/lib/form/switch/tng-switch.component.js +15 -24
  101. package/src/lib/form/switch/tng-switch.component.js.map +1 -1
  102. package/src/lib/form/textarea/tng-textarea.component.d.ts +3 -0
  103. package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -1
  104. package/src/lib/form/textarea/tng-textarea.component.js +19 -36
  105. package/src/lib/form/textarea/tng-textarea.component.js.map +1 -1
  106. package/src/lib/form/toggle/tng-toggle.component.d.ts +3 -0
  107. package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -1
  108. package/src/lib/form/toggle/tng-toggle.component.js +41 -41
  109. package/src/lib/form/toggle/tng-toggle.component.js.map +1 -1
  110. package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts +4 -0
  111. package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -1
  112. package/src/lib/form/toggle-group/tng-toggle-group.component.js +28 -31
  113. package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -1
  114. package/src/lib/layout/accordion/tng-accordion.component.d.ts +10 -0
  115. package/src/lib/layout/accordion/tng-accordion.component.d.ts.map +1 -1
  116. package/src/lib/layout/accordion/tng-accordion.component.js +49 -148
  117. package/src/lib/layout/accordion/tng-accordion.component.js.map +1 -1
  118. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts +3 -0
  119. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -1
  120. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +10 -13
  121. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -1
  122. package/src/lib/layout/card/tng-card.component.d.ts +21 -0
  123. package/src/lib/layout/card/tng-card.component.d.ts.map +1 -1
  124. package/src/lib/layout/card/tng-card.component.js +92 -136
  125. package/src/lib/layout/card/tng-card.component.js.map +1 -1
  126. package/src/lib/layout/collapsible/tng-collapsible.component.d.ts +3 -0
  127. package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -1
  128. package/src/lib/layout/collapsible/tng-collapsible.component.js +17 -24
  129. package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -1
  130. package/src/lib/layout/drawer/tng-drawer.component.d.ts +4 -0
  131. package/src/lib/layout/drawer/tng-drawer.component.d.ts.map +1 -1
  132. package/src/lib/layout/drawer/tng-drawer.component.js +48 -51
  133. package/src/lib/layout/drawer/tng-drawer.component.js.map +1 -1
  134. package/src/lib/layout/grid/tng-grid.component.d.ts +8 -0
  135. package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -1
  136. package/src/lib/layout/grid/tng-grid.component.js +48 -110
  137. package/src/lib/layout/grid/tng-grid.component.js.map +1 -1
  138. package/src/lib/layout/index.d.ts +1 -8
  139. package/src/lib/layout/index.d.ts.map +1 -1
  140. package/src/lib/layout/index.js +5 -8
  141. package/src/lib/layout/index.js.map +1 -1
  142. package/src/lib/layout/separator/tng-separator.component.d.ts +3 -0
  143. package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -1
  144. package/src/lib/layout/separator/tng-separator.component.js +11 -16
  145. package/src/lib/layout/separator/tng-separator.component.js.map +1 -1
  146. package/src/lib/layout/stepper/tng-stepper.component.d.ts +3 -0
  147. package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -1
  148. package/src/lib/layout/stepper/tng-stepper.component.js +10 -13
  149. package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -1
  150. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts +4 -0
  151. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -1
  152. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +47 -49
  153. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -1
  154. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts +4 -0
  155. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -1
  156. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +16 -18
  157. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -1
  158. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts +4 -0
  159. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -1
  160. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +10 -12
  161. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -1
  162. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts +3 -0
  163. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -1
  164. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +12 -10
  165. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -1
  166. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts +4 -0
  167. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -1
  168. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +12 -14
  169. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -1
  170. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts +4 -0
  171. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -1
  172. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +23 -25
  173. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -1
  174. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts +5 -0
  175. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -1
  176. package/src/lib/navigation/context-menu/tng-context-menu.component.js +24 -26
  177. package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -1
  178. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts +4 -0
  179. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -1
  180. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +19 -23
  181. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -1
  182. package/src/lib/navigation/index.d.ts +0 -12
  183. package/src/lib/navigation/index.d.ts.map +1 -1
  184. package/src/lib/navigation/index.js +4 -12
  185. package/src/lib/navigation/index.js.map +1 -1
  186. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts +3 -0
  187. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts.map +1 -1
  188. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js +22 -20
  189. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js.map +1 -1
  190. package/src/lib/navigation/menu/tng-menu.component.d.ts +5 -0
  191. package/src/lib/navigation/menu/tng-menu.component.d.ts.map +1 -1
  192. package/src/lib/navigation/menu/tng-menu.component.js +21 -23
  193. package/src/lib/navigation/menu/tng-menu.component.js.map +1 -1
  194. package/src/lib/navigation/menubar/tng-menubar.component.d.ts +5 -0
  195. package/src/lib/navigation/menubar/tng-menubar.component.d.ts.map +1 -1
  196. package/src/lib/navigation/menubar/tng-menubar.component.js +20 -22
  197. package/src/lib/navigation/menubar/tng-menubar.component.js.map +1 -1
  198. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts +4 -0
  199. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -1
  200. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +11 -13
  201. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -1
  202. package/src/lib/navigation/tabs/tng-tabs.component.d.ts +5 -0
  203. package/src/lib/navigation/tabs/tng-tabs.component.d.ts.map +1 -1
  204. package/src/lib/navigation/tabs/tng-tabs.component.js +32 -34
  205. package/src/lib/navigation/tabs/tng-tabs.component.js.map +1 -1
  206. package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts +4 -0
  207. package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -1
  208. package/src/lib/navigation/toolbar/tng-toolbar.component.js +11 -13
  209. package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -1
  210. package/src/lib/overlay/dialog/tng-dialog.component.d.ts +4 -0
  211. package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -1
  212. package/src/lib/overlay/dialog/tng-dialog.component.js +18 -25
  213. package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -1
  214. package/src/lib/overlay/index.d.ts +0 -3
  215. package/src/lib/overlay/index.d.ts.map +1 -1
  216. package/src/lib/overlay/index.js +4 -3
  217. package/src/lib/overlay/index.js.map +1 -1
  218. package/src/lib/overlay/popover/tng-popover.component.d.ts +4 -0
  219. package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -1
  220. package/src/lib/overlay/popover/tng-popover.component.js +23 -37
  221. package/src/lib/overlay/popover/tng-popover.component.js.map +1 -1
  222. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts +4 -0
  223. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -1
  224. package/src/lib/overlay/tooltip/tng-tooltip.component.js +17 -21
  225. package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -1
  226. package/src/lib/utility/avatar/tng-avatar.component.d.ts +4 -1
  227. package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -1
  228. package/src/lib/utility/avatar/tng-avatar.component.js +20 -22
  229. package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -1
  230. package/src/lib/utility/badge/tng-badge.component.d.ts +4 -0
  231. package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -1
  232. package/src/lib/utility/badge/tng-badge.component.js +13 -10
  233. package/src/lib/utility/badge/tng-badge.component.js.map +1 -1
  234. package/src/lib/utility/button/tng-button.component.d.ts +4 -1
  235. package/src/lib/utility/button/tng-button.component.d.ts.map +1 -1
  236. package/src/lib/utility/button/tng-button.component.js +19 -29
  237. package/src/lib/utility/button/tng-button.component.js.map +1 -1
  238. package/src/lib/utility/code-block/tng-code-block.component.d.ts +4 -0
  239. package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -1
  240. package/src/lib/utility/code-block/tng-code-block.component.js +73 -103
  241. package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -1
  242. package/src/lib/utility/copy-button/tng-copy-button.component.d.ts +4 -1
  243. package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -1
  244. package/src/lib/utility/copy-button/tng-copy-button.component.js +28 -36
  245. package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -1
  246. package/src/lib/utility/index.d.ts +1 -9
  247. package/src/lib/utility/index.d.ts.map +1 -1
  248. package/src/lib/utility/index.js +5 -8
  249. package/src/lib/utility/index.js.map +1 -1
  250. package/src/lib/utility/tag/tng-tag.component.d.ts +4 -1
  251. package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -1
  252. package/src/lib/utility/tag/tng-tag.component.js +18 -24
  253. package/src/lib/utility/tag/tng-tag.component.js.map +1 -1
  254. package/src/lib/utility/tree/tng-tree.component.d.ts +4 -1
  255. package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -1
  256. package/src/lib/utility/tree/tng-tree.component.js +23 -25
  257. package/src/lib/utility/tree/tng-tree.component.js.map +1 -1
@@ -1,33 +1,27 @@
1
- import { __decorate } from "tslib";
2
1
  import { booleanAttribute, Component, input } from '@angular/core';
3
2
  import { TngSkeleton as TngSkeletonPrimitive } from '@tailng-ui/primitives';
3
+ import * as i0 from "@angular/core";
4
4
  export function resolveTngSkeletonCssSize(value, fallback) {
5
5
  const normalizedValue = value.trim();
6
6
  return normalizedValue.length > 0 ? normalizedValue : fallback;
7
7
  }
8
- let TngSkeletonComponent = class TngSkeletonComponent {
9
- animated = input(true, {
10
- transform: booleanAttribute,
11
- });
12
- height = input('1rem');
13
- rounded = input(true, {
14
- transform: booleanAttribute,
15
- });
16
- width = input('100%');
8
+ export class TngSkeletonComponent {
9
+ animated = input(true, { ...(ngDevMode ? { debugName: "animated" } : {}), transform: booleanAttribute });
10
+ height = input('1rem', ...(ngDevMode ? [{ debugName: "height" }] : []));
11
+ rounded = input(true, { ...(ngDevMode ? { debugName: "rounded" } : {}), transform: booleanAttribute });
12
+ width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
17
13
  resolveHeight() {
18
14
  return resolveTngSkeletonCssSize(this.height(), '1rem');
19
15
  }
20
16
  resolveWidth() {
21
17
  return resolveTngSkeletonCssSize(this.width(), '100%');
22
18
  }
23
- };
24
- TngSkeletonComponent = __decorate([
25
- Component({
26
- selector: 'tng-skeleton',
27
- imports: [TngSkeletonPrimitive],
28
- templateUrl: './tng-skeleton.component.html',
29
- styleUrl: './tng-skeleton.component.css',
30
- })
31
- ], TngSkeletonComponent);
32
- export { TngSkeletonComponent };
19
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.1", type: TngSkeletonComponent, isStandalone: true, selector: "tng-skeleton", inputs: { animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n tngSkeleton\n class=\"tng-skeleton\"\n [animated]=\"animated()\"\n [rounded]=\"rounded()\"\n [style.width]=\"resolveWidth()\"\n [style.height]=\"resolveHeight()\"\n></div>\n", styles: [":host {\n display: block;\n}\n\n.tng-skeleton {\n background: linear-gradient(\n 90deg,\n var(--tng-semantic-foreground-secondary) 0%,\n var(--tng-semantic-border-subtle) 50%,\n var(--tng-semantic-foreground-secondary) 100%\n );\n background-size: 220% 100%;\n}\n\n.tng-skeleton[data-rounded='true'] {\n border-radius: 0.6rem;\n}\n\n.tng-skeleton[data-rounded='false'] {\n border-radius: 0;\n}\n\n.tng-skeleton[data-animated='true'] {\n animation: tng-skeleton-shimmer 1.3s linear infinite;\n}\n\n@keyframes tng-skeleton-shimmer {\n 0% {\n background-position: 200% 0;\n }\n\n 100% {\n background-position: -20% 0;\n }\n}\n"], dependencies: [{ kind: "directive", type: TngSkeletonPrimitive, selector: "[tngSkeleton]", inputs: ["animated", "rounded"], exportAs: ["tngSkeleton"] }] });
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngSkeletonComponent, decorators: [{
23
+ type: Component,
24
+ args: [{ selector: 'tng-skeleton', imports: [TngSkeletonPrimitive], template: "<div\n tngSkeleton\n class=\"tng-skeleton\"\n [animated]=\"animated()\"\n [rounded]=\"rounded()\"\n [style.width]=\"resolveWidth()\"\n [style.height]=\"resolveHeight()\"\n></div>\n", styles: [":host {\n display: block;\n}\n\n.tng-skeleton {\n background: linear-gradient(\n 90deg,\n var(--tng-semantic-foreground-secondary) 0%,\n var(--tng-semantic-border-subtle) 50%,\n var(--tng-semantic-foreground-secondary) 100%\n );\n background-size: 220% 100%;\n}\n\n.tng-skeleton[data-rounded='true'] {\n border-radius: 0.6rem;\n}\n\n.tng-skeleton[data-rounded='false'] {\n border-radius: 0;\n}\n\n.tng-skeleton[data-animated='true'] {\n animation: tng-skeleton-shimmer 1.3s linear infinite;\n}\n\n@keyframes tng-skeleton-shimmer {\n 0% {\n background-position: 200% 0;\n }\n\n 100% {\n background-position: -20% 0;\n }\n}\n"] }]
25
+ }], propDecorators: { animated: [{ type: i0.Input, args: [{ isSignal: true, alias: "animated", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }] } });
26
+ export { TngSkeletonComponent as TngSkeleton };
33
27
  //# sourceMappingURL=tng-skeleton.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-skeleton.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/skeleton/tng-skeleton.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE5E,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,QAAgB;IACvE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjE,CAAC;AAQM,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACf,QAAQ,GAAG,KAAK,CAA4B,IAAI,EAAE;QAChE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,MAAM,GAAG,KAAK,CAAS,MAAM,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,CAA4B,IAAI,EAAE;QAC/D,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,KAAK,GAAG,KAAK,CAAS,MAAM,CAAC,CAAC;IAEvC,aAAa;QAClB,OAAO,yBAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAEM,YAAY;QACjB,OAAO,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;CACF,CAAA;AAjBY,oBAAoB;IANhC,SAAS,CAAC;QACT,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,8BAA8B;KACzC,CAAC;GACW,oBAAoB,CAiBhC","sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport { TngSkeleton as TngSkeletonPrimitive } from '@tailng-ui/primitives';\n\nexport function resolveTngSkeletonCssSize(value: string, fallback: string): string {\n const normalizedValue = value.trim();\n return normalizedValue.length > 0 ? normalizedValue : fallback;\n}\n\n@Component({\n selector: 'tng-skeleton',\n imports: [TngSkeletonPrimitive],\n templateUrl: './tng-skeleton.component.html',\n styleUrl: './tng-skeleton.component.css',\n})\nexport class TngSkeletonComponent {\n public readonly animated = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly height = input<string>('1rem');\n public readonly rounded = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly width = input<string>('100%');\n\n public resolveHeight(): string {\n return resolveTngSkeletonCssSize(this.height(), '1rem');\n }\n\n public resolveWidth(): string {\n return resolveTngSkeletonCssSize(this.width(), '100%');\n }\n}\n"]}
1
+ {"version":3,"file":"tng-skeleton.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/skeleton/tng-skeleton.component.ts","../../../../../../../../libs/tailng-ui/components/src/lib/feedback/skeleton/tng-skeleton.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;;AAE5E,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,QAAgB;IACvE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjE,CAAC;AAQD,MAAM,OAAO,oBAAoB;IACf,QAAQ,GAAG,KAAK,CAA4B,IAAI,qDAC9D,SAAS,EAAE,gBAAgB,GAC3B,CAAC;IACa,MAAM,GAAG,KAAK,CAAS,MAAM,kDAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,CAA4B,IAAI,oDAC7D,SAAS,EAAE,gBAAgB,GAC3B,CAAC;IACa,KAAK,GAAG,KAAK,CAAS,MAAM,iDAAC,CAAC;IAEvC,aAAa;QAClB,OAAO,yBAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAEM,YAAY;QACjB,OAAO,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;uGAhBU,oBAAoB;2FAApB,oBAAoB,skBCdjC,4LAQA,ssBDEY,oBAAoB;;2FAInB,oBAAoB;kBANhC,SAAS;+BACE,cAAc,WACf,CAAC,oBAAoB,CAAC;;AAsBjC,OAAO,EAAE,oBAAoB,IAAI,WAAW,EAAE,CAAC","sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport { TngSkeleton as TngSkeletonPrimitive } from '@tailng-ui/primitives';\n\nexport function resolveTngSkeletonCssSize(value: string, fallback: string): string {\n const normalizedValue = value.trim();\n return normalizedValue.length > 0 ? normalizedValue : fallback;\n}\n\n@Component({\n selector: 'tng-skeleton',\n imports: [TngSkeletonPrimitive],\n templateUrl: './tng-skeleton.component.html',\n styleUrl: './tng-skeleton.component.css',\n})\nexport class TngSkeletonComponent {\n public readonly animated = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly height = input<string>('1rem');\n public readonly rounded = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly width = input<string>('100%');\n\n public resolveHeight(): string {\n return resolveTngSkeletonCssSize(this.height(), '1rem');\n }\n\n public resolveWidth(): string {\n return resolveTngSkeletonCssSize(this.width(), '100%');\n }\n}\nexport { TngSkeletonComponent as TngSkeleton };\n","<div\n tngSkeleton\n class=\"tng-skeleton\"\n [animated]=\"animated()\"\n [rounded]=\"rounded()\"\n [style.width]=\"resolveWidth()\"\n [style.height]=\"resolveHeight()\"\n></div>\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { OnDestroy } from '@angular/core';
2
2
  import type { ElementRef } from '@angular/core';
3
3
  import type { TngToastTone } from '@tailng-ui/primitives';
4
+ import * as i0 from "@angular/core";
4
5
  export type TngToastMode = 'snackbar' | 'toast';
5
6
  export type TngToastPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
6
7
  export type TngToastDismissReason = 'escape' | 'manual' | 'timeout';
@@ -84,6 +85,8 @@ export declare class TngToastComponent implements OnDestroy {
84
85
  private unregisterFocusLayer;
85
86
  private unregisterOverlayLayer;
86
87
  private scheduleDismiss;
88
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngToastComponent, never>;
89
+ static ɵcmp: i0.ɵɵComponentDeclaration<TngToastComponent, "tng-toast", never, { "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "dismissedWithReason": "dismissedWithReason"; }, never, never, true, never>;
87
90
  }
88
- export {};
91
+ export { TngToastComponent as TngToast };
89
92
  //# sourceMappingURL=tng-toast.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-toast.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/toast/tng-toast.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tng-toast.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/toast/tng-toast.component.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { __decorate } from "tslib";
2
1
  import { Component, effect, input, output, signal, viewChild } from '@angular/core';
3
2
  import { createTngIdFactory, createTngKeyedTimerController, resolveFocusableElements, } from '@tailng-ui/cdk';
4
3
  import { TngToastItem as TngToastItemPrimitive, TngToastViewport as TngToastViewportPrimitive, } from '@tailng-ui/primitives';
5
4
  import { tngOverlayFocusHandoff } from '../../overlay/tng-overlay-focus-handoff';
6
5
  import { tngOverlayRuntime } from '../../overlay/tng-overlay-runtime';
6
+ import * as i0 from "@angular/core";
7
7
  const createToastLayerId = createTngIdFactory('tng-toast-layer');
8
8
  export function normalizeTngToastDuration(value, fallback) {
9
9
  if (!Number.isFinite(value) || value < 0) {
@@ -46,7 +46,7 @@ function normalizeTngToastAction(action) {
46
46
  onSelect: action.onSelect,
47
47
  };
48
48
  }
49
- let TngToastComponent = class TngToastComponent {
49
+ export class TngToastComponent {
50
50
  createToastId = createTngIdFactory('tng-toast');
51
51
  dismissTimers = createTngKeyedTimerController();
52
52
  documentRef = typeof document === 'undefined' ? null : document;
@@ -55,14 +55,14 @@ let TngToastComponent = class TngToastComponent {
55
55
  isFocusLayerActive = false;
56
56
  isFocusLayerRegistered = false;
57
57
  isOverlayLayerRegistered = false;
58
- duration = input(4000);
59
- maxVisible = input(4);
60
- mode = input('toast');
61
- position = input('bottom-right');
58
+ duration = input(4000, ...(ngDevMode ? [{ debugName: "duration" }] : []));
59
+ maxVisible = input(4, ...(ngDevMode ? [{ debugName: "maxVisible" }] : []));
60
+ mode = input('toast', ...(ngDevMode ? [{ debugName: "mode" }] : []));
61
+ position = input('bottom-right', ...(ngDevMode ? [{ debugName: "position" }] : []));
62
62
  dismissed = output();
63
63
  dismissedWithReason = output();
64
- toasts = signal([]);
65
- viewportRef = viewChild('viewportRef');
64
+ toasts = signal([], ...(ngDevMode ? [{ debugName: "toasts" }] : []));
65
+ viewportRef = viewChild('viewportRef', ...(ngDevMode ? [{ debugName: "viewportRef" }] : []));
66
66
  overlayLayerEffect = effect(() => {
67
67
  if (this.toasts().length > 0) {
68
68
  this.registerOverlayLayer();
@@ -71,7 +71,7 @@ let TngToastComponent = class TngToastComponent {
71
71
  }
72
72
  this.deactivateFocusLayer();
73
73
  this.unregisterOverlayLayer();
74
- });
74
+ }, ...(ngDevMode ? [{ debugName: "overlayLayerEffect" }] : []));
75
75
  dismiss(id, reason = 'manual') {
76
76
  const currentToasts = this.toasts();
77
77
  const nextToasts = currentToasts.filter((toast) => toast.id !== id);
@@ -309,14 +309,12 @@ let TngToastComponent = class TngToastComponent {
309
309
  this.dismiss(toast.id, 'timeout');
310
310
  });
311
311
  }
312
- };
313
- TngToastComponent = __decorate([
314
- Component({
315
- selector: 'tng-toast',
316
- imports: [TngToastItemPrimitive, TngToastViewportPrimitive],
317
- templateUrl: './tng-toast.component.html',
318
- styleUrl: './tng-toast.component.css',
319
- })
320
- ], TngToastComponent);
321
- export { TngToastComponent };
312
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
313
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngToastComponent, isStandalone: true, selector: "tng-toast", inputs: { duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, maxVisible: { classPropertyName: "maxVisible", publicName: "maxVisible", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed", dismissedWithReason: "dismissedWithReason" }, viewQueries: [{ propertyName: "viewportRef", first: true, predicate: ["viewportRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<section\n tngToastViewport\n #viewportRef\n class=\"tng-toast-viewport\"\n [attr.data-mode]=\"mode()\"\n [attr.data-position]=\"position()\"\n (focusin)=\"onViewportFocusin($event)\"\n>\n @for (toast of toasts(); track toast.id) {\n <article\n tngToastItem\n class=\"tng-toast-item\"\n [attr.data-toast-id]=\"toast.id\"\n [tone]=\"toast.tone\"\n tabindex=\"0\"\n >\n <div class=\"tng-toast-body\">\n @if (toast.title !== null) {\n <p class=\"tng-toast-title\">{{ toast.title }}</p>\n }\n <p class=\"tng-toast-message\">{{ toast.message }}</p>\n @if (toast.action !== null) {\n <button\n type=\"button\"\n class=\"tng-toast-action\"\n (click)=\"onActionClick(toast)\"\n >\n {{ toast.action.label }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"tng-toast-close\"\n aria-label=\"Dismiss notification\"\n (click)=\"dismiss(toast.id)\"\n >\n &times;\n </button>\n </article>\n }\n</section>\n", styles: [":host {\n display: contents;\n}\n\n.tng-toast-viewport {\n display: grid;\n gap: 0.65rem;\n max-width: min(32rem, calc(100vw - 2rem));\n pointer-events: none;\n position: fixed;\n z-index: 1200;\n}\n\n.tng-toast-viewport[data-position='top-left'] {\n left: 1rem;\n top: 1rem;\n}\n\n.tng-toast-viewport[data-position='top-right'] {\n right: 1rem;\n top: 1rem;\n}\n\n.tng-toast-viewport[data-position='bottom-left'] {\n bottom: 1rem;\n left: 1rem;\n}\n\n.tng-toast-viewport[data-position='bottom-right'] {\n bottom: 1rem;\n right: 1rem;\n}\n\n.tng-toast-item {\n align-items: flex-start;\n background: var(--tng-semantic-background-surface);\n border: 1px solid var(--tng-semantic-border-default);\n border-radius: 0.85rem;\n box-shadow: 0 16px 30px color-mix(in srgb, var(--tng-semantic-foreground-primary) 35%, transparent);\n color: var(--tng-semantic-foreground-primary);\n display: grid;\n gap: 0.6rem;\n grid-template-columns: 1fr auto;\n min-width: 14rem;\n padding: 0.75rem 0.85rem;\n pointer-events: auto;\n}\n\n.tng-toast-item[data-tone='success'] {\n border-color: var(--tng-semantic-accent-success);\n}\n\n.tng-toast-item[data-tone='warning'] {\n border-color: var(--tng-semantic-accent-warning);\n}\n\n.tng-toast-item[data-tone='danger'] {\n border-color: var(--tng-semantic-accent-danger);\n}\n\n.tng-toast-item:focus-visible {\n outline: 2px solid var(--tng-semantic-accent-brand);\n outline-offset: 2px;\n}\n\n.tng-toast-viewport[data-mode='snackbar'] .tng-toast-item {\n border-radius: 0.7rem;\n max-width: 36rem;\n min-width: min(22rem, calc(100vw - 2rem));\n}\n\n.tng-toast-body {\n display: grid;\n gap: 0.2rem;\n}\n\n.tng-toast-title {\n font-size: 0.83rem;\n font-weight: 700;\n line-height: 1.35;\n margin: 0;\n}\n\n.tng-toast-message {\n font-size: 0.79rem;\n line-height: 1.45;\n margin: 0;\n opacity: 0.95;\n}\n\n.tng-toast-action {\n align-items: center;\n align-self: start;\n background: color-mix(in srgb, var(--tng-semantic-accent-brand) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--tng-semantic-accent-brand) 55%, transparent);\n border-radius: 0.55rem;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n font-size: 0.74rem;\n font-weight: 600;\n line-height: 1.3;\n margin-top: 0.2rem;\n min-height: 1.65rem;\n padding: 0.25rem 0.6rem;\n}\n\n.tng-toast-action:hover {\n background: color-mix(in srgb, var(--tng-semantic-accent-brand) 20%, transparent);\n}\n\n.tng-toast-action:focus-visible {\n outline: 2px solid var(--tng-semantic-accent-brand);\n outline-offset: 2px;\n}\n\n.tng-toast-close {\n align-items: center;\n background: transparent;\n border: 0;\n border-radius: 0.45rem;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n font-size: 1.1rem;\n height: 1.45rem;\n justify-content: center;\n line-height: 1;\n opacity: 0.85;\n width: 1.45rem;\n}\n\n.tng-toast-close:hover {\n background: color-mix(in srgb, var(--tng-semantic-border-strong) 25%, transparent);\n opacity: 1;\n}\n\n.tng-toast-close:focus-visible {\n outline: 2px solid var(--tng-semantic-accent-brand);\n outline-offset: 2px;\n}\n"], dependencies: [{ kind: "directive", type: TngToastItemPrimitive, selector: "[tngToastItem]", inputs: ["open", "tone"], exportAs: ["tngToastItem"] }, { kind: "directive", type: TngToastViewportPrimitive, selector: "[tngToastViewport]", exportAs: ["tngToastViewport"] }] });
314
+ }
315
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngToastComponent, decorators: [{
316
+ type: Component,
317
+ args: [{ selector: 'tng-toast', imports: [TngToastItemPrimitive, TngToastViewportPrimitive], template: "<section\n tngToastViewport\n #viewportRef\n class=\"tng-toast-viewport\"\n [attr.data-mode]=\"mode()\"\n [attr.data-position]=\"position()\"\n (focusin)=\"onViewportFocusin($event)\"\n>\n @for (toast of toasts(); track toast.id) {\n <article\n tngToastItem\n class=\"tng-toast-item\"\n [attr.data-toast-id]=\"toast.id\"\n [tone]=\"toast.tone\"\n tabindex=\"0\"\n >\n <div class=\"tng-toast-body\">\n @if (toast.title !== null) {\n <p class=\"tng-toast-title\">{{ toast.title }}</p>\n }\n <p class=\"tng-toast-message\">{{ toast.message }}</p>\n @if (toast.action !== null) {\n <button\n type=\"button\"\n class=\"tng-toast-action\"\n (click)=\"onActionClick(toast)\"\n >\n {{ toast.action.label }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"tng-toast-close\"\n aria-label=\"Dismiss notification\"\n (click)=\"dismiss(toast.id)\"\n >\n &times;\n </button>\n </article>\n }\n</section>\n", styles: [":host {\n display: contents;\n}\n\n.tng-toast-viewport {\n display: grid;\n gap: 0.65rem;\n max-width: min(32rem, calc(100vw - 2rem));\n pointer-events: none;\n position: fixed;\n z-index: 1200;\n}\n\n.tng-toast-viewport[data-position='top-left'] {\n left: 1rem;\n top: 1rem;\n}\n\n.tng-toast-viewport[data-position='top-right'] {\n right: 1rem;\n top: 1rem;\n}\n\n.tng-toast-viewport[data-position='bottom-left'] {\n bottom: 1rem;\n left: 1rem;\n}\n\n.tng-toast-viewport[data-position='bottom-right'] {\n bottom: 1rem;\n right: 1rem;\n}\n\n.tng-toast-item {\n align-items: flex-start;\n background: var(--tng-semantic-background-surface);\n border: 1px solid var(--tng-semantic-border-default);\n border-radius: 0.85rem;\n box-shadow: 0 16px 30px color-mix(in srgb, var(--tng-semantic-foreground-primary) 35%, transparent);\n color: var(--tng-semantic-foreground-primary);\n display: grid;\n gap: 0.6rem;\n grid-template-columns: 1fr auto;\n min-width: 14rem;\n padding: 0.75rem 0.85rem;\n pointer-events: auto;\n}\n\n.tng-toast-item[data-tone='success'] {\n border-color: var(--tng-semantic-accent-success);\n}\n\n.tng-toast-item[data-tone='warning'] {\n border-color: var(--tng-semantic-accent-warning);\n}\n\n.tng-toast-item[data-tone='danger'] {\n border-color: var(--tng-semantic-accent-danger);\n}\n\n.tng-toast-item:focus-visible {\n outline: 2px solid var(--tng-semantic-accent-brand);\n outline-offset: 2px;\n}\n\n.tng-toast-viewport[data-mode='snackbar'] .tng-toast-item {\n border-radius: 0.7rem;\n max-width: 36rem;\n min-width: min(22rem, calc(100vw - 2rem));\n}\n\n.tng-toast-body {\n display: grid;\n gap: 0.2rem;\n}\n\n.tng-toast-title {\n font-size: 0.83rem;\n font-weight: 700;\n line-height: 1.35;\n margin: 0;\n}\n\n.tng-toast-message {\n font-size: 0.79rem;\n line-height: 1.45;\n margin: 0;\n opacity: 0.95;\n}\n\n.tng-toast-action {\n align-items: center;\n align-self: start;\n background: color-mix(in srgb, var(--tng-semantic-accent-brand) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--tng-semantic-accent-brand) 55%, transparent);\n border-radius: 0.55rem;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n font-size: 0.74rem;\n font-weight: 600;\n line-height: 1.3;\n margin-top: 0.2rem;\n min-height: 1.65rem;\n padding: 0.25rem 0.6rem;\n}\n\n.tng-toast-action:hover {\n background: color-mix(in srgb, var(--tng-semantic-accent-brand) 20%, transparent);\n}\n\n.tng-toast-action:focus-visible {\n outline: 2px solid var(--tng-semantic-accent-brand);\n outline-offset: 2px;\n}\n\n.tng-toast-close {\n align-items: center;\n background: transparent;\n border: 0;\n border-radius: 0.45rem;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n font-size: 1.1rem;\n height: 1.45rem;\n justify-content: center;\n line-height: 1;\n opacity: 0.85;\n width: 1.45rem;\n}\n\n.tng-toast-close:hover {\n background: color-mix(in srgb, var(--tng-semantic-border-strong) 25%, transparent);\n opacity: 1;\n}\n\n.tng-toast-close:focus-visible {\n outline: 2px solid var(--tng-semantic-accent-brand);\n outline-offset: 2px;\n}\n"] }]
318
+ }], propDecorators: { duration: [{ type: i0.Input, args: [{ isSignal: true, alias: "duration", required: false }] }], maxVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisible", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], dismissed: [{ type: i0.Output, args: ["dismissed"] }], dismissedWithReason: [{ type: i0.Output, args: ["dismissedWithReason"] }], viewportRef: [{ type: i0.ViewChild, args: ['viewportRef', { isSignal: true }] }] } });
319
+ export { TngToastComponent as TngToast };
322
320
  //# sourceMappingURL=tng-toast.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-toast.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/toast/tng-toast.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, effect, input, output, signal, viewChild } from '@angular/core';\nimport type { OnDestroy } from '@angular/core';\nimport {\n createTngIdFactory,\n createTngKeyedTimerController,\n resolveFocusableElements,\n} from '@tailng-ui/cdk';\nimport type { ElementRef } from '@angular/core';\nimport type { TngOverlayDismissReason } from '@tailng-ui/cdk';\nimport type { TngToastTone } from '@tailng-ui/primitives';\nimport {\n TngToastItem as TngToastItemPrimitive,\n TngToastViewport as TngToastViewportPrimitive,\n} from '@tailng-ui/primitives';\nimport { tngOverlayFocusHandoff } from '../../overlay/tng-overlay-focus-handoff';\nimport { tngOverlayRuntime } from '../../overlay/tng-overlay-runtime';\n\nexport type TngToastMode = 'snackbar' | 'toast';\nexport type TngToastPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';\nexport type TngToastDismissReason = 'escape' | 'manual' | 'timeout';\n\nexport type TngToastDismissEvent = Readonly<{\n id: string;\n reason: TngToastDismissReason;\n}>;\n\nexport type TngToastAction = Readonly<{\n dismissOnSelect: boolean;\n label: string;\n onSelect?: (id: string) => void;\n}>;\n\nexport type TngToastActionOptions = Readonly<{\n dismissOnSelect?: boolean;\n label: string;\n onSelect?: (id: string) => void;\n}>;\n\nexport type TngToastOptions = Readonly<\n Partial<{\n action: TngToastActionOptions | null;\n duration: number;\n title: string | null;\n tone: TngToastTone;\n }>\n>;\n\ntype TngToastRecord = Readonly<{\n action: TngToastAction | null;\n duration: number;\n id: string;\n message: string;\n title: string | null;\n tone: TngToastTone;\n}>;\n\nconst createToastLayerId = createTngIdFactory('tng-toast-layer');\n\nexport function normalizeTngToastDuration(value: number, fallback: number): number {\n if (!Number.isFinite(value) || value < 0) {\n return fallback;\n }\n\n return value;\n}\n\nexport function normalizeTngToastMaxVisible(value: number): number {\n if (!Number.isFinite(value) || value < 1) {\n return 1;\n }\n\n return Math.floor(value);\n}\n\nexport function resolveTngToastNextSlice<TValue>(\n values: readonly TValue[],\n maxVisible: number,\n): readonly TValue[] {\n if (values.length <= maxVisible) {\n return values;\n }\n\n return values.slice(values.length - maxVisible);\n}\n\nexport function shouldDismissTngToastForKey(key: string): boolean {\n return key === 'Escape';\n}\n\nfunction mapOverlayDismissReasonToToastDismissReason(\n reason: TngOverlayDismissReason,\n): TngToastDismissReason | null {\n if (reason === 'escape-key') {\n return 'escape';\n }\n\n return null;\n}\n\nfunction normalizeTngToastAction(\n action: TngToastActionOptions | null | undefined,\n): TngToastAction | null {\n if (action === null || action === undefined) {\n return null;\n }\n\n const normalizedLabel = action.label.trim();\n if (normalizedLabel.length === 0) {\n return null;\n }\n\n return {\n dismissOnSelect: action.dismissOnSelect ?? true,\n label: normalizedLabel,\n onSelect: action.onSelect,\n };\n}\n\n@Component({\n selector: 'tng-toast',\n imports: [TngToastItemPrimitive, TngToastViewportPrimitive],\n templateUrl: './tng-toast.component.html',\n styleUrl: './tng-toast.component.css',\n})\nexport class TngToastComponent implements OnDestroy {\n private readonly createToastId = createTngIdFactory('tng-toast');\n private readonly dismissTimers = createTngKeyedTimerController<string>();\n private readonly documentRef = typeof document === 'undefined' ? null : document;\n private readonly overlayLayerId = createToastLayerId();\n private readonly createToastFocusId = createTngIdFactory('tng-toast-focus', this.overlayLayerId);\n private isFocusLayerActive = false;\n private isFocusLayerRegistered = false;\n private isOverlayLayerRegistered = false;\n\n public readonly duration = input<number>(4000);\n public readonly maxVisible = input<number>(4);\n public readonly mode = input<TngToastMode>('toast');\n public readonly position = input<TngToastPosition>('bottom-right');\n\n public readonly dismissed = output<string>();\n public readonly dismissedWithReason = output<TngToastDismissEvent>();\n protected readonly toasts = signal<readonly TngToastRecord[]>([]);\n protected readonly viewportRef = viewChild<ElementRef<HTMLElement>>('viewportRef');\n\n private readonly overlayLayerEffect = effect((): void => {\n if (this.toasts().length > 0) {\n this.registerOverlayLayer();\n this.activateFocusLayer();\n return;\n }\n\n this.deactivateFocusLayer();\n this.unregisterOverlayLayer();\n });\n\n public dismiss(id: string, reason: TngToastDismissReason = 'manual'): void {\n const currentToasts = this.toasts();\n const nextToasts = currentToasts.filter((toast) => toast.id !== id);\n if (nextToasts.length === currentToasts.length) {\n return;\n }\n\n this.clearDismissTimer(id);\n this.toasts.set(nextToasts);\n this.dismissedWithReason.emit({\n id,\n reason,\n });\n this.dismissed.emit(id);\n }\n\n public ngOnDestroy(): void {\n this.overlayLayerEffect.destroy();\n this.deactivateFocusLayer();\n this.unregisterFocusLayer();\n this.unregisterOverlayLayer();\n this.dismissTimers.clearAll();\n }\n\n public show(message: string, options: TngToastOptions = {}): string {\n const id = this.createToastId();\n const fallbackDuration = this.duration();\n const resolvedDuration = normalizeTngToastDuration(\n options.duration ?? fallbackDuration,\n fallbackDuration,\n );\n const resolvedAction = normalizeTngToastAction(options.action);\n const nextToast: TngToastRecord = {\n action: resolvedAction,\n duration: resolvedDuration,\n id,\n message,\n title: options.title ?? null,\n tone: options.tone ?? 'neutral',\n };\n\n const previousToasts = this.toasts();\n const visibleLimit = normalizeTngToastMaxVisible(this.maxVisible());\n const nextToasts = resolveTngToastNextSlice([...previousToasts, nextToast], visibleLimit);\n const nextIds = new Set(nextToasts.map((toast) => toast.id));\n\n for (const previousToast of previousToasts) {\n if (!nextIds.has(previousToast.id)) {\n this.clearDismissTimer(previousToast.id);\n }\n }\n\n this.toasts.set(nextToasts);\n this.scheduleDismiss(nextToast);\n return id;\n }\n\n protected onActionClick(toast: TngToastRecord): void {\n toast.action?.onSelect?.(toast.id);\n if (toast.action?.dismissOnSelect ?? false) {\n this.dismiss(toast.id, 'manual');\n }\n }\n\n protected onViewportFocusin(event: FocusEvent): void {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement) || !viewportElement.contains(target)) {\n return;\n }\n\n const targetId = this.ensureElementId(target);\n tngOverlayFocusHandoff.recordFocus(this.overlayLayerId, targetId);\n }\n\n private clearDismissTimer(id: string): void {\n this.dismissTimers.cancel(id);\n }\n\n private handleOverlayDismiss(reason: TngOverlayDismissReason): void {\n const dismissReason = mapOverlayDismissReasonToToastDismissReason(reason);\n if (dismissReason === null) {\n return;\n }\n\n const toastId = this.resolveEscapeDismissToastId();\n if (toastId === null) {\n return;\n }\n\n this.dismiss(toastId, dismissReason);\n }\n\n private registerOverlayLayer(): void {\n if (this.isOverlayLayerRegistered) {\n return;\n }\n\n this.isOverlayLayerRegistered = true;\n tngOverlayRuntime.registerLayer({\n containsTarget: (target: unknown, path: readonly unknown[]): boolean => {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return false;\n }\n\n if (path.includes(viewportElement)) {\n return true;\n }\n\n return target instanceof Node ? viewportElement.contains(target) : false;\n },\n dismissOnEscape: true,\n dismissOnOutsidePointer: false,\n id: this.overlayLayerId,\n onDismiss: (reason: TngOverlayDismissReason): void => {\n this.handleOverlayDismiss(reason);\n },\n priority: -100,\n });\n }\n\n private resolveEscapeDismissToastId(): string | null {\n const latestToast = this.toasts()[this.toasts().length - 1];\n const fallbackToastId = latestToast?.id ?? null;\n\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined || this.documentRef === null) {\n return fallbackToastId;\n }\n\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement) || !viewportElement.contains(activeElement)) {\n return fallbackToastId;\n }\n\n const focusedToast = activeElement.closest<HTMLElement>('[data-slot=\"toast-item\"][data-toast-id]');\n return focusedToast?.getAttribute('data-toast-id') ?? fallbackToastId;\n }\n\n private activateFocusLayer(): void {\n this.registerFocusLayer();\n if (this.isFocusLayerActive) {\n return;\n }\n\n this.isFocusLayerActive = true;\n const activeElementId = this.resolveActiveElementId();\n tngOverlayFocusHandoff.activateLayer(this.overlayLayerId, activeElementId);\n }\n\n private deactivateFocusLayer(): void {\n if (!this.isFocusLayerActive) {\n return;\n }\n\n this.isFocusLayerActive = false;\n const restoreFocusTargetId = tngOverlayFocusHandoff.deactivateLayer(this.overlayLayerId);\n if (restoreFocusTargetId === null || !this.shouldRestoreFocus()) {\n return;\n }\n\n const restoreElement = this.resolveElementById(restoreFocusTargetId);\n restoreElement?.focus();\n }\n\n private ensureElementId(element: HTMLElement): string {\n const existingId = element.id.trim();\n if (existingId.length > 0) {\n return existingId;\n }\n\n const nextId = this.createToastFocusId();\n element.id = nextId;\n return nextId;\n }\n\n private registerFocusLayer(): void {\n if (this.isFocusLayerRegistered) {\n return;\n }\n\n this.isFocusLayerRegistered = true;\n tngOverlayFocusHandoff.registerLayer({\n layerId: this.overlayLayerId,\n members: (): readonly string[] => {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return [];\n }\n\n return this.resolveFocusableMemberIds(viewportElement);\n },\n restoreFocus: true,\n trapFocus: false,\n });\n }\n\n private resolveActiveElementId(): string | null {\n if (this.documentRef === null) {\n return null;\n }\n\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement)) {\n return null;\n }\n\n return this.ensureElementId(activeElement);\n }\n\n private resolveElementById(id: string): HTMLElement | null {\n if (this.documentRef === null) {\n return null;\n }\n\n const element = this.documentRef.getElementById(id);\n return element instanceof HTMLElement ? element : null;\n }\n\n private resolveFocusableMemberIds(viewportElement: HTMLElement): readonly string[] {\n const focusableMembers = resolveFocusableElements(viewportElement);\n const ids: string[] = [];\n const seenIds = new Set<string>();\n\n for (const member of focusableMembers) {\n const id = this.ensureElementId(member);\n if (seenIds.has(id)) {\n continue;\n }\n\n seenIds.add(id);\n ids.push(id);\n }\n\n return ids;\n }\n\n private shouldRestoreFocus(): boolean {\n if (this.documentRef === null) {\n return false;\n }\n\n const viewportElement = this.viewportRef()?.nativeElement;\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement)) {\n return true;\n }\n\n if (activeElement === this.documentRef.body) {\n return true;\n }\n\n if (viewportElement === undefined) {\n return false;\n }\n\n return viewportElement.contains(activeElement);\n }\n\n private unregisterFocusLayer(): void {\n if (!this.isFocusLayerRegistered) {\n return;\n }\n\n this.isFocusLayerRegistered = false;\n tngOverlayFocusHandoff.unregisterLayer(this.overlayLayerId);\n }\n\n private unregisterOverlayLayer(): void {\n if (!this.isOverlayLayerRegistered) {\n return;\n }\n\n this.isOverlayLayerRegistered = false;\n tngOverlayRuntime.unregisterLayer(this.overlayLayerId);\n }\n\n private scheduleDismiss(toast: TngToastRecord): void {\n this.clearDismissTimer(toast.id);\n if (toast.duration === 0) {\n return;\n }\n\n this.dismissTimers.schedule(toast.id, toast.duration, () => {\n this.dismiss(toast.id, 'timeout');\n });\n }\n}\n"]}
1
+ {"version":3,"file":"tng-toast.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/toast/tng-toast.component.ts","../../../../../../../../libs/tailng-ui/components/src/lib/feedback/toast/tng-toast.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, effect, input, output, signal, viewChild } from '@angular/core';\nimport type { OnDestroy } from '@angular/core';\nimport {\n createTngIdFactory,\n createTngKeyedTimerController,\n resolveFocusableElements,\n} from '@tailng-ui/cdk';\nimport type { ElementRef } from '@angular/core';\nimport type { TngOverlayDismissReason } from '@tailng-ui/cdk';\nimport type { TngToastTone } from '@tailng-ui/primitives';\nimport {\n TngToastItem as TngToastItemPrimitive,\n TngToastViewport as TngToastViewportPrimitive,\n} from '@tailng-ui/primitives';\nimport { tngOverlayFocusHandoff } from '../../overlay/tng-overlay-focus-handoff';\nimport { tngOverlayRuntime } from '../../overlay/tng-overlay-runtime';\n\nexport type TngToastMode = 'snackbar' | 'toast';\nexport type TngToastPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';\nexport type TngToastDismissReason = 'escape' | 'manual' | 'timeout';\n\nexport type TngToastDismissEvent = Readonly<{\n id: string;\n reason: TngToastDismissReason;\n}>;\n\nexport type TngToastAction = Readonly<{\n dismissOnSelect: boolean;\n label: string;\n onSelect?: (id: string) => void;\n}>;\n\nexport type TngToastActionOptions = Readonly<{\n dismissOnSelect?: boolean;\n label: string;\n onSelect?: (id: string) => void;\n}>;\n\nexport type TngToastOptions = Readonly<\n Partial<{\n action: TngToastActionOptions | null;\n duration: number;\n title: string | null;\n tone: TngToastTone;\n }>\n>;\n\ntype TngToastRecord = Readonly<{\n action: TngToastAction | null;\n duration: number;\n id: string;\n message: string;\n title: string | null;\n tone: TngToastTone;\n}>;\n\nconst createToastLayerId = createTngIdFactory('tng-toast-layer');\n\nexport function normalizeTngToastDuration(value: number, fallback: number): number {\n if (!Number.isFinite(value) || value < 0) {\n return fallback;\n }\n\n return value;\n}\n\nexport function normalizeTngToastMaxVisible(value: number): number {\n if (!Number.isFinite(value) || value < 1) {\n return 1;\n }\n\n return Math.floor(value);\n}\n\nexport function resolveTngToastNextSlice<TValue>(\n values: readonly TValue[],\n maxVisible: number,\n): readonly TValue[] {\n if (values.length <= maxVisible) {\n return values;\n }\n\n return values.slice(values.length - maxVisible);\n}\n\nexport function shouldDismissTngToastForKey(key: string): boolean {\n return key === 'Escape';\n}\n\nfunction mapOverlayDismissReasonToToastDismissReason(\n reason: TngOverlayDismissReason,\n): TngToastDismissReason | null {\n if (reason === 'escape-key') {\n return 'escape';\n }\n\n return null;\n}\n\nfunction normalizeTngToastAction(\n action: TngToastActionOptions | null | undefined,\n): TngToastAction | null {\n if (action === null || action === undefined) {\n return null;\n }\n\n const normalizedLabel = action.label.trim();\n if (normalizedLabel.length === 0) {\n return null;\n }\n\n return {\n dismissOnSelect: action.dismissOnSelect ?? true,\n label: normalizedLabel,\n onSelect: action.onSelect,\n };\n}\n\n@Component({\n selector: 'tng-toast',\n imports: [TngToastItemPrimitive, TngToastViewportPrimitive],\n templateUrl: './tng-toast.component.html',\n styleUrl: './tng-toast.component.css',\n})\nexport class TngToastComponent implements OnDestroy {\n private readonly createToastId = createTngIdFactory('tng-toast');\n private readonly dismissTimers = createTngKeyedTimerController<string>();\n private readonly documentRef = typeof document === 'undefined' ? null : document;\n private readonly overlayLayerId = createToastLayerId();\n private readonly createToastFocusId = createTngIdFactory('tng-toast-focus', this.overlayLayerId);\n private isFocusLayerActive = false;\n private isFocusLayerRegistered = false;\n private isOverlayLayerRegistered = false;\n\n public readonly duration = input<number>(4000);\n public readonly maxVisible = input<number>(4);\n public readonly mode = input<TngToastMode>('toast');\n public readonly position = input<TngToastPosition>('bottom-right');\n\n public readonly dismissed = output<string>();\n public readonly dismissedWithReason = output<TngToastDismissEvent>();\n protected readonly toasts = signal<readonly TngToastRecord[]>([]);\n protected readonly viewportRef = viewChild<ElementRef<HTMLElement>>('viewportRef');\n\n private readonly overlayLayerEffect = effect((): void => {\n if (this.toasts().length > 0) {\n this.registerOverlayLayer();\n this.activateFocusLayer();\n return;\n }\n\n this.deactivateFocusLayer();\n this.unregisterOverlayLayer();\n });\n\n public dismiss(id: string, reason: TngToastDismissReason = 'manual'): void {\n const currentToasts = this.toasts();\n const nextToasts = currentToasts.filter((toast) => toast.id !== id);\n if (nextToasts.length === currentToasts.length) {\n return;\n }\n\n this.clearDismissTimer(id);\n this.toasts.set(nextToasts);\n this.dismissedWithReason.emit({\n id,\n reason,\n });\n this.dismissed.emit(id);\n }\n\n public ngOnDestroy(): void {\n this.overlayLayerEffect.destroy();\n this.deactivateFocusLayer();\n this.unregisterFocusLayer();\n this.unregisterOverlayLayer();\n this.dismissTimers.clearAll();\n }\n\n public show(message: string, options: TngToastOptions = {}): string {\n const id = this.createToastId();\n const fallbackDuration = this.duration();\n const resolvedDuration = normalizeTngToastDuration(\n options.duration ?? fallbackDuration,\n fallbackDuration,\n );\n const resolvedAction = normalizeTngToastAction(options.action);\n const nextToast: TngToastRecord = {\n action: resolvedAction,\n duration: resolvedDuration,\n id,\n message,\n title: options.title ?? null,\n tone: options.tone ?? 'neutral',\n };\n\n const previousToasts = this.toasts();\n const visibleLimit = normalizeTngToastMaxVisible(this.maxVisible());\n const nextToasts = resolveTngToastNextSlice([...previousToasts, nextToast], visibleLimit);\n const nextIds = new Set(nextToasts.map((toast) => toast.id));\n\n for (const previousToast of previousToasts) {\n if (!nextIds.has(previousToast.id)) {\n this.clearDismissTimer(previousToast.id);\n }\n }\n\n this.toasts.set(nextToasts);\n this.scheduleDismiss(nextToast);\n return id;\n }\n\n protected onActionClick(toast: TngToastRecord): void {\n toast.action?.onSelect?.(toast.id);\n if (toast.action?.dismissOnSelect ?? false) {\n this.dismiss(toast.id, 'manual');\n }\n }\n\n protected onViewportFocusin(event: FocusEvent): void {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement) || !viewportElement.contains(target)) {\n return;\n }\n\n const targetId = this.ensureElementId(target);\n tngOverlayFocusHandoff.recordFocus(this.overlayLayerId, targetId);\n }\n\n private clearDismissTimer(id: string): void {\n this.dismissTimers.cancel(id);\n }\n\n private handleOverlayDismiss(reason: TngOverlayDismissReason): void {\n const dismissReason = mapOverlayDismissReasonToToastDismissReason(reason);\n if (dismissReason === null) {\n return;\n }\n\n const toastId = this.resolveEscapeDismissToastId();\n if (toastId === null) {\n return;\n }\n\n this.dismiss(toastId, dismissReason);\n }\n\n private registerOverlayLayer(): void {\n if (this.isOverlayLayerRegistered) {\n return;\n }\n\n this.isOverlayLayerRegistered = true;\n tngOverlayRuntime.registerLayer({\n containsTarget: (target: unknown, path: readonly unknown[]): boolean => {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return false;\n }\n\n if (path.includes(viewportElement)) {\n return true;\n }\n\n return target instanceof Node ? viewportElement.contains(target) : false;\n },\n dismissOnEscape: true,\n dismissOnOutsidePointer: false,\n id: this.overlayLayerId,\n onDismiss: (reason: TngOverlayDismissReason): void => {\n this.handleOverlayDismiss(reason);\n },\n priority: -100,\n });\n }\n\n private resolveEscapeDismissToastId(): string | null {\n const latestToast = this.toasts()[this.toasts().length - 1];\n const fallbackToastId = latestToast?.id ?? null;\n\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined || this.documentRef === null) {\n return fallbackToastId;\n }\n\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement) || !viewportElement.contains(activeElement)) {\n return fallbackToastId;\n }\n\n const focusedToast = activeElement.closest<HTMLElement>('[data-slot=\"toast-item\"][data-toast-id]');\n return focusedToast?.getAttribute('data-toast-id') ?? fallbackToastId;\n }\n\n private activateFocusLayer(): void {\n this.registerFocusLayer();\n if (this.isFocusLayerActive) {\n return;\n }\n\n this.isFocusLayerActive = true;\n const activeElementId = this.resolveActiveElementId();\n tngOverlayFocusHandoff.activateLayer(this.overlayLayerId, activeElementId);\n }\n\n private deactivateFocusLayer(): void {\n if (!this.isFocusLayerActive) {\n return;\n }\n\n this.isFocusLayerActive = false;\n const restoreFocusTargetId = tngOverlayFocusHandoff.deactivateLayer(this.overlayLayerId);\n if (restoreFocusTargetId === null || !this.shouldRestoreFocus()) {\n return;\n }\n\n const restoreElement = this.resolveElementById(restoreFocusTargetId);\n restoreElement?.focus();\n }\n\n private ensureElementId(element: HTMLElement): string {\n const existingId = element.id.trim();\n if (existingId.length > 0) {\n return existingId;\n }\n\n const nextId = this.createToastFocusId();\n element.id = nextId;\n return nextId;\n }\n\n private registerFocusLayer(): void {\n if (this.isFocusLayerRegistered) {\n return;\n }\n\n this.isFocusLayerRegistered = true;\n tngOverlayFocusHandoff.registerLayer({\n layerId: this.overlayLayerId,\n members: (): readonly string[] => {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return [];\n }\n\n return this.resolveFocusableMemberIds(viewportElement);\n },\n restoreFocus: true,\n trapFocus: false,\n });\n }\n\n private resolveActiveElementId(): string | null {\n if (this.documentRef === null) {\n return null;\n }\n\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement)) {\n return null;\n }\n\n return this.ensureElementId(activeElement);\n }\n\n private resolveElementById(id: string): HTMLElement | null {\n if (this.documentRef === null) {\n return null;\n }\n\n const element = this.documentRef.getElementById(id);\n return element instanceof HTMLElement ? element : null;\n }\n\n private resolveFocusableMemberIds(viewportElement: HTMLElement): readonly string[] {\n const focusableMembers = resolveFocusableElements(viewportElement);\n const ids: string[] = [];\n const seenIds = new Set<string>();\n\n for (const member of focusableMembers) {\n const id = this.ensureElementId(member);\n if (seenIds.has(id)) {\n continue;\n }\n\n seenIds.add(id);\n ids.push(id);\n }\n\n return ids;\n }\n\n private shouldRestoreFocus(): boolean {\n if (this.documentRef === null) {\n return false;\n }\n\n const viewportElement = this.viewportRef()?.nativeElement;\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement)) {\n return true;\n }\n\n if (activeElement === this.documentRef.body) {\n return true;\n }\n\n if (viewportElement === undefined) {\n return false;\n }\n\n return viewportElement.contains(activeElement);\n }\n\n private unregisterFocusLayer(): void {\n if (!this.isFocusLayerRegistered) {\n return;\n }\n\n this.isFocusLayerRegistered = false;\n tngOverlayFocusHandoff.unregisterLayer(this.overlayLayerId);\n }\n\n private unregisterOverlayLayer(): void {\n if (!this.isOverlayLayerRegistered) {\n return;\n }\n\n this.isOverlayLayerRegistered = false;\n tngOverlayRuntime.unregisterLayer(this.overlayLayerId);\n }\n\n private scheduleDismiss(toast: TngToastRecord): void {\n this.clearDismissTimer(toast.id);\n if (toast.duration === 0) {\n return;\n }\n\n this.dismissTimers.schedule(toast.id, toast.duration, () => {\n this.dismiss(toast.id, 'timeout');\n });\n }\n}\nexport { TngToastComponent as TngToast };\n","<section\n tngToastViewport\n #viewportRef\n class=\"tng-toast-viewport\"\n [attr.data-mode]=\"mode()\"\n [attr.data-position]=\"position()\"\n (focusin)=\"onViewportFocusin($event)\"\n>\n @for (toast of toasts(); track toast.id) {\n <article\n tngToastItem\n class=\"tng-toast-item\"\n [attr.data-toast-id]=\"toast.id\"\n [tone]=\"toast.tone\"\n tabindex=\"0\"\n >\n <div class=\"tng-toast-body\">\n @if (toast.title !== null) {\n <p class=\"tng-toast-title\">{{ toast.title }}</p>\n }\n <p class=\"tng-toast-message\">{{ toast.message }}</p>\n @if (toast.action !== null) {\n <button\n type=\"button\"\n class=\"tng-toast-action\"\n (click)=\"onActionClick(toast)\"\n >\n {{ toast.action.label }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"tng-toast-close\"\n aria-label=\"Dismiss notification\"\n (click)=\"dismiss(toast.id)\"\n >\n &times;\n </button>\n </article>\n }\n</section>\n"]}
@@ -1,4 +1,6 @@
1
1
  import { TngAutocomplete } from '@tailng-ui/primitives';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@tailng-ui/primitives";
2
4
  export type TngAutocompleteGetValue<O, V> = (opt: O) => V;
3
5
  export type TngAutocompleteGetLabel<O> = (opt: O) => string;
4
6
  export type TngAutocompleteIsDisabled<O> = (opt: O) => boolean;
@@ -22,5 +24,7 @@ export declare class TngAutocompleteComponent<O = unknown, V = unknown> {
22
24
  protected readonly displayText: import("@angular/core").Signal<string>;
23
25
  protected onInput(ev: Event): void;
24
26
  private findOption;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngAutocompleteComponent<any, any>, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<TngAutocompleteComponent<any, any>, "tng-autocomplete", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "getOptionValue": { "alias": "getOptionValue"; "required": false; "isSignal": true; }; "getOptionLabel": { "alias": "getOptionLabel"; "required": false; "isSignal": true; }; "isOptionDisabled": { "alias": "isOptionDisabled"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "iconText": { "alias": "iconText"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.TngAutocomplete; inputs: { "open": "open"; "value": "value"; "disabled": "disabled"; "loading": "loading"; "invalid": "invalid"; "labelId": "labelId"; "descriptionId": "descriptionId"; "errorId": "errorId"; }; outputs: { "openChange": "openChange"; "valueChange": "valueChange"; }; }]>;
25
29
  }
26
30
  //# sourceMappingURL=tng-autocomplete.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-autocomplete.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/autocomplete/tng-autocomplete.component.ts"],"names":[],"mappings":"AASA,OAAO,EACL,eAAe,EAQhB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC1D,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;AAC5D,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AAC/D,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AAE3E,qBA8Ba,wBAAwB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IAC5D,SAAS,CAAC,QAAQ,CAAC,SAAS,qBAA+C;IAE3E,QAAQ,CAAC,OAAO,oDAA2B;IAC3C,QAAQ,CAAC,WAAW,8CAAoC;IAExD,QAAQ,CAAC,cAAc,qEAErB;IACF,QAAQ,CAAC,cAAc,kEAOrB;IACF,QAAQ,CAAC,gBAAgB,oEAEvB;IACF,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,iEAGb;IAEH,QAAQ,CAAC,QAAQ,8CAAsB;IAEvC,QAAQ,CAAC,SAAS,8CAAiC;IAEnD,SAAS,CAAC,QAAQ,CAAC,KAAK,iDAAc;;IAatC,SAAS,CAAC,QAAQ,CAAC,cAAc,2CAQ9B;IAEH,SAAS,CAAC,QAAQ,CAAC,aAAa,yCAG7B;IAEH,SAAS,CAAC,QAAQ,CAAC,eAAe,+CAQ/B;IAEH,SAAS,CAAC,QAAQ,CAAC,WAAW,yCAE5B;IAEF,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI;IAKlC,OAAO,CAAC,UAAU;CAQnB"}
1
+ {"version":3,"file":"tng-autocomplete.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/autocomplete/tng-autocomplete.component.ts"],"names":[],"mappings":"AASA,OAAO,EACL,eAAe,EAQhB,MAAM,uBAAuB,CAAC;;;AAE/B,MAAM,MAAM,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC1D,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;AAC5D,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AAC/D,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AAE3E,qBA8Ba,wBAAwB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IAC5D,SAAS,CAAC,QAAQ,CAAC,SAAS,qBAA+C;IAE3E,QAAQ,CAAC,OAAO,oDAA2B;IAC3C,QAAQ,CAAC,WAAW,8CAAoC;IAExD,QAAQ,CAAC,cAAc,qEAErB;IACF,QAAQ,CAAC,cAAc,kEAOrB;IACF,QAAQ,CAAC,gBAAgB,oEAEvB;IACF,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,iEAGb;IAEH,QAAQ,CAAC,QAAQ,8CAAsB;IAEvC,QAAQ,CAAC,SAAS,8CAAiC;IAEnD,SAAS,CAAC,QAAQ,CAAC,KAAK,iDAAc;;IAatC,SAAS,CAAC,QAAQ,CAAC,cAAc,2CAQ9B;IAEH,SAAS,CAAC,QAAQ,CAAC,aAAa,yCAG7B;IAEH,SAAS,CAAC,QAAQ,CAAC,eAAe,+CAQ/B;IAEH,SAAS,CAAC,QAAQ,CAAC,WAAW,yCAE5B;IAEF,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI;IAKlC,OAAO,CAAC,UAAU;yCA7EP,wBAAwB;2CAAxB,wBAAwB;CAqFpC"}
@@ -1,23 +1,24 @@
1
- import { __decorate } from "tslib";
2
1
  import { Component, computed, effect, inject, input, signal, } from '@angular/core';
3
2
  import { TngAutocomplete, TngAutocompleteTrigger, TngAutocompleteTriggerContainer, TngAutocompleteIcon, TngAutocompleteContent, TngAutocompleteOverlay, TngAutocompleteListbox, TngAutocompleteOption, } from '@tailng-ui/primitives';
4
- let TngAutocompleteComponent = class TngAutocompleteComponent {
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@tailng-ui/primitives";
5
+ export class TngAutocompleteComponent {
5
6
  primitive = inject(TngAutocomplete);
6
- options = input([]);
7
- placeholder = input('Type to search…');
8
- getOptionValue = input(((opt) => opt?.value));
7
+ options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
8
+ placeholder = input('Type to search…', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
9
+ getOptionValue = input(((opt) => opt?.value), ...(ngDevMode ? [{ debugName: "getOptionValue" }] : []));
9
10
  getOptionLabel = input(((opt) => String(opt?.label ??
10
11
  opt?.value ??
11
- opt)));
12
- isOptionDisabled = input(((opt) => !!opt?.disabled));
12
+ opt)), ...(ngDevMode ? [{ debugName: "getOptionLabel" }] : []));
13
+ isOptionDisabled = input(((opt) => !!opt?.disabled), ...(ngDevMode ? [{ debugName: "isOptionDisabled" }] : []));
13
14
  /** Default: track by value, id, or option (stable identity for async/replaced options). */
14
15
  trackBy = input((_, opt) => {
15
16
  const o = opt;
16
17
  return o?.['value'] ?? o?.['id'] ?? opt;
17
- });
18
- iconText = input('▾');
19
- ariaLabel = input('Autocomplete');
20
- query = signal('');
18
+ }, ...(ngDevMode ? [{ debugName: "trackBy" }] : []));
19
+ iconText = input('▾', ...(ngDevMode ? [{ debugName: "iconText" }] : []));
20
+ ariaLabel = input('Autocomplete', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
21
+ query = signal('', ...(ngDevMode ? [{ debugName: "query" }] : []));
21
22
  constructor() {
22
23
  effect(() => {
23
24
  const v = this.primitive.value();
@@ -38,11 +39,11 @@ let TngAutocompleteComponent = class TngAutocompleteComponent {
38
39
  return opt;
39
40
  }
40
41
  return null;
41
- });
42
+ }, ...(ngDevMode ? [{ debugName: "selectedOption" }] : []));
42
43
  selectedLabel = computed(() => {
43
44
  const opt = this.selectedOption();
44
45
  return opt ? this.getOptionLabel()(opt) : '';
45
- });
46
+ }, ...(ngDevMode ? [{ debugName: "selectedLabel" }] : []));
46
47
  filteredOptions = computed(() => {
47
48
  const q = this.query().toLowerCase().trim();
48
49
  const list = this.options();
@@ -50,8 +51,8 @@ let TngAutocompleteComponent = class TngAutocompleteComponent {
50
51
  return list;
51
52
  const getLabel = this.getOptionLabel();
52
53
  return list.filter((opt) => getLabel(opt).toLowerCase().includes(q));
53
- });
54
- displayText = computed(() => this.primitive.open() ? this.query() : this.selectedLabel());
54
+ }, ...(ngDevMode ? [{ debugName: "filteredOptions" }] : []));
55
+ displayText = computed(() => this.primitive.open() ? this.query() : this.selectedLabel(), ...(ngDevMode ? [{ debugName: "displayText" }] : []));
55
56
  onInput(ev) {
56
57
  const val = ev.target.value;
57
58
  this.query.set(val);
@@ -66,38 +67,34 @@ let TngAutocompleteComponent = class TngAutocompleteComponent {
66
67
  }
67
68
  return null;
68
69
  }
69
- };
70
- TngAutocompleteComponent = __decorate([
71
- Component({
72
- selector: 'tng-autocomplete',
73
- imports: [
74
- TngAutocompleteTrigger,
75
- TngAutocompleteTriggerContainer,
76
- TngAutocompleteIcon,
77
- TngAutocompleteContent,
78
- TngAutocompleteOverlay,
79
- TngAutocompleteListbox,
80
- TngAutocompleteOption,
81
- ],
82
- hostDirectives: [
83
- {
84
- directive: TngAutocomplete,
85
- inputs: [
86
- 'open',
87
- 'value',
88
- 'disabled',
89
- 'loading',
90
- 'invalid',
91
- 'labelId',
92
- 'descriptionId',
93
- 'errorId',
94
- ],
95
- outputs: ['openChange', 'valueChange'],
96
- },
97
- ],
98
- templateUrl: './tng-autocomplete.component.html',
99
- styleUrl: './tng-autocomplete.component.css',
100
- })
101
- ], TngAutocompleteComponent);
102
- export { TngAutocompleteComponent };
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngAutocompleteComponent, isStandalone: true, selector: "tng-autocomplete", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, getOptionValue: { classPropertyName: "getOptionValue", publicName: "getOptionValue", isSignal: true, isRequired: false, transformFunction: null }, getOptionLabel: { classPropertyName: "getOptionLabel", publicName: "getOptionLabel", isSignal: true, isRequired: false, transformFunction: null }, isOptionDisabled: { classPropertyName: "isOptionDisabled", publicName: "isOptionDisabled", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null }, iconText: { classPropertyName: "iconText", publicName: "iconText", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: i1.TngAutocomplete, inputs: ["open", "open", "value", "value", "disabled", "disabled", "loading", "loading", "invalid", "invalid", "labelId", "labelId", "descriptionId", "descriptionId", "errorId", "errorId"], outputs: ["openChange", "openChange", "valueChange", "valueChange"] }], ngImport: i0, template: "<div tngAutocompleteTriggerContainer>\n <input\n tngAutocompleteTrigger\n type=\"text\"\n [value]=\"displayText()\"\n (input)=\"onInput($event)\"\n [attr.placeholder]=\"placeholder()\"\n [attr.aria-label]=\"ariaLabel()\"\n />\n <span tngAutocompleteIcon aria-hidden=\"true\">\n {{ iconText() }}\n </span>\n</div>\n\n<div tngAutocompleteContent>\n <div tngAutocompleteOverlay>\n <ul tngAutocompleteListbox [value]=\"primitive.value()\">\n @for (opt of filteredOptions(); track trackBy()($index, opt)) {\n <li\n tngAutocompleteOption\n [tngValue]=\"getOptionValue()(opt)\"\n [disabled]=\"isOptionDisabled()(opt)\"\n >\n {{ getOptionLabel()(opt) }}\n </li>\n }\n @if (filteredOptions().length === 0) {\n <li data-slot=\"autocomplete-empty\">No matches</li>\n }\n </ul>\n </div>\n</div>\n", styles: [":host {\n display: block;\n}\n"], dependencies: [{ kind: "directive", type: TngAutocompleteTrigger, selector: "[tngAutocompleteTrigger]", exportAs: ["tngAutocompleteTrigger"] }, { kind: "directive", type: TngAutocompleteTriggerContainer, selector: "[tngAutocompleteTriggerContainer]", exportAs: ["tngAutocompleteTriggerContainer"] }, { kind: "directive", type: TngAutocompleteIcon, selector: "[tngAutocompleteIcon]", exportAs: ["tngAutocompleteIcon"] }, { kind: "directive", type: TngAutocompleteContent, selector: "[tngAutocompleteContent]", exportAs: ["tngAutocompleteContent"] }, { kind: "directive", type: TngAutocompleteOverlay, selector: "[tngAutocompleteOverlay]", inputs: ["placement", "offset", "collision"], exportAs: ["tngAutocompleteOverlay"] }, { kind: "directive", type: TngAutocompleteListbox, selector: "[tngAutocompleteListbox]" }, { kind: "directive", type: TngAutocompleteOption, selector: "[tngAutocompleteOption]" }] });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngAutocompleteComponent, decorators: [{
74
+ type: Component,
75
+ args: [{ selector: 'tng-autocomplete', imports: [
76
+ TngAutocompleteTrigger,
77
+ TngAutocompleteTriggerContainer,
78
+ TngAutocompleteIcon,
79
+ TngAutocompleteContent,
80
+ TngAutocompleteOverlay,
81
+ TngAutocompleteListbox,
82
+ TngAutocompleteOption,
83
+ ], hostDirectives: [
84
+ {
85
+ directive: TngAutocomplete,
86
+ inputs: [
87
+ 'open',
88
+ 'value',
89
+ 'disabled',
90
+ 'loading',
91
+ 'invalid',
92
+ 'labelId',
93
+ 'descriptionId',
94
+ 'errorId',
95
+ ],
96
+ outputs: ['openChange', 'valueChange'],
97
+ },
98
+ ], template: "<div tngAutocompleteTriggerContainer>\n <input\n tngAutocompleteTrigger\n type=\"text\"\n [value]=\"displayText()\"\n (input)=\"onInput($event)\"\n [attr.placeholder]=\"placeholder()\"\n [attr.aria-label]=\"ariaLabel()\"\n />\n <span tngAutocompleteIcon aria-hidden=\"true\">\n {{ iconText() }}\n </span>\n</div>\n\n<div tngAutocompleteContent>\n <div tngAutocompleteOverlay>\n <ul tngAutocompleteListbox [value]=\"primitive.value()\">\n @for (opt of filteredOptions(); track trackBy()($index, opt)) {\n <li\n tngAutocompleteOption\n [tngValue]=\"getOptionValue()(opt)\"\n [disabled]=\"isOptionDisabled()(opt)\"\n >\n {{ getOptionLabel()(opt) }}\n </li>\n }\n @if (filteredOptions().length === 0) {\n <li data-slot=\"autocomplete-empty\">No matches</li>\n }\n </ul>\n </div>\n</div>\n", styles: [":host {\n display: block;\n}\n"] }]
99
+ }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], getOptionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "getOptionValue", required: false }] }], getOptionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "getOptionLabel", required: false }] }], isOptionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOptionDisabled", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], iconText: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconText", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
103
100
  //# sourceMappingURL=tng-autocomplete.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/autocomplete/tng-autocomplete.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n TngAutocomplete,\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n} from '@tailng-ui/primitives';\n\nexport type TngAutocompleteGetValue<O, V> = (opt: O) => V;\nexport type TngAutocompleteGetLabel<O> = (opt: O) => string;\nexport type TngAutocompleteIsDisabled<O> = (opt: O) => boolean;\nexport type TngAutocompleteTrackBy<O> = (index: number, opt: O) => unknown;\n\n@Component({\n selector: 'tng-autocomplete',\n imports: [\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n ],\n hostDirectives: [\n {\n directive: TngAutocomplete,\n inputs: [\n 'open',\n 'value',\n 'disabled',\n 'loading',\n 'invalid',\n 'labelId',\n 'descriptionId',\n 'errorId',\n ],\n outputs: ['openChange', 'valueChange'],\n },\n ],\n templateUrl: './tng-autocomplete.component.html',\n styleUrl: './tng-autocomplete.component.css',\n})\nexport class TngAutocompleteComponent<O = unknown, V = unknown> {\n protected readonly primitive = inject<TngAutocomplete<V>>(TngAutocomplete);\n\n readonly options = input<readonly O[]>([]);\n readonly placeholder = input<string>('Type to search…');\n\n readonly getOptionValue = input<TngAutocompleteGetValue<O, V>>(\n ((opt: unknown) => (opt as { value?: V })?.value) as TngAutocompleteGetValue<O, V>,\n );\n readonly getOptionLabel = input<TngAutocompleteGetLabel<O>>(\n ((opt: unknown) =>\n String(\n (opt as { label?: string; value?: unknown })?.label ??\n (opt as { value?: unknown })?.value ??\n opt,\n )) as TngAutocompleteGetLabel<O>,\n );\n readonly isOptionDisabled = input<TngAutocompleteIsDisabled<O>>(\n ((opt: unknown) => !!(opt as { disabled?: boolean })?.disabled) as TngAutocompleteIsDisabled<O>,\n );\n /** Default: track by value, id, or option (stable identity for async/replaced options). */\n readonly trackBy = input<TngAutocompleteTrackBy<O>>((_, opt) => {\n const o = opt as Record<string, unknown> | null | undefined;\n return o?.['value'] ?? o?.['id'] ?? opt;\n });\n\n readonly iconText = input<string>('▾');\n\n readonly ariaLabel = input<string>('Autocomplete');\n\n protected readonly query = signal('');\n\n constructor() {\n effect(() => {\n const v = this.primitive.value();\n const open = this.primitive.open();\n if (!open) {\n const opt = this.findOption(v);\n this.query.set(opt ? this.getOptionLabel()(opt) : '');\n }\n });\n }\n\n protected readonly selectedOption = computed<O | null>(() => {\n const v = this.primitive.value();\n if (v === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), v)) return opt;\n }\n return null;\n });\n\n protected readonly selectedLabel = computed<string>(() => {\n const opt = this.selectedOption();\n return opt ? this.getOptionLabel()(opt) : '';\n });\n\n protected readonly filteredOptions = computed<readonly O[]>(() => {\n const q = this.query().toLowerCase().trim();\n const list = this.options();\n if (!q) return list;\n const getLabel = this.getOptionLabel();\n return list.filter((opt) =>\n getLabel(opt).toLowerCase().includes(q),\n );\n });\n\n protected readonly displayText = computed<string>(() =>\n this.primitive.open() ? this.query() : this.selectedLabel(),\n );\n\n protected onInput(ev: Event): void {\n const val = (ev.target as HTMLInputElement).value;\n this.query.set(val);\n }\n\n private findOption(value: V | null): O | null {\n if (value === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), value)) return opt;\n }\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"tng-autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/autocomplete/tng-autocomplete.component.ts","../../../../../../../../libs/tailng-ui/components/src/lib/form/autocomplete/tng-autocomplete.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n TngAutocomplete,\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n} from '@tailng-ui/primitives';\n\nexport type TngAutocompleteGetValue<O, V> = (opt: O) => V;\nexport type TngAutocompleteGetLabel<O> = (opt: O) => string;\nexport type TngAutocompleteIsDisabled<O> = (opt: O) => boolean;\nexport type TngAutocompleteTrackBy<O> = (index: number, opt: O) => unknown;\n\n@Component({\n selector: 'tng-autocomplete',\n imports: [\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n ],\n hostDirectives: [\n {\n directive: TngAutocomplete,\n inputs: [\n 'open',\n 'value',\n 'disabled',\n 'loading',\n 'invalid',\n 'labelId',\n 'descriptionId',\n 'errorId',\n ],\n outputs: ['openChange', 'valueChange'],\n },\n ],\n templateUrl: './tng-autocomplete.component.html',\n styleUrl: './tng-autocomplete.component.css',\n})\nexport class TngAutocompleteComponent<O = unknown, V = unknown> {\n protected readonly primitive = inject<TngAutocomplete<V>>(TngAutocomplete);\n\n readonly options = input<readonly O[]>([]);\n readonly placeholder = input<string>('Type to search…');\n\n readonly getOptionValue = input<TngAutocompleteGetValue<O, V>>(\n ((opt: unknown) => (opt as { value?: V })?.value) as TngAutocompleteGetValue<O, V>,\n );\n readonly getOptionLabel = input<TngAutocompleteGetLabel<O>>(\n ((opt: unknown) =>\n String(\n (opt as { label?: string; value?: unknown })?.label ??\n (opt as { value?: unknown })?.value ??\n opt,\n )) as TngAutocompleteGetLabel<O>,\n );\n readonly isOptionDisabled = input<TngAutocompleteIsDisabled<O>>(\n ((opt: unknown) => !!(opt as { disabled?: boolean })?.disabled) as TngAutocompleteIsDisabled<O>,\n );\n /** Default: track by value, id, or option (stable identity for async/replaced options). */\n readonly trackBy = input<TngAutocompleteTrackBy<O>>((_, opt) => {\n const o = opt as Record<string, unknown> | null | undefined;\n return o?.['value'] ?? o?.['id'] ?? opt;\n });\n\n readonly iconText = input<string>('▾');\n\n readonly ariaLabel = input<string>('Autocomplete');\n\n protected readonly query = signal('');\n\n constructor() {\n effect(() => {\n const v = this.primitive.value();\n const open = this.primitive.open();\n if (!open) {\n const opt = this.findOption(v);\n this.query.set(opt ? this.getOptionLabel()(opt) : '');\n }\n });\n }\n\n protected readonly selectedOption = computed<O | null>(() => {\n const v = this.primitive.value();\n if (v === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), v)) return opt;\n }\n return null;\n });\n\n protected readonly selectedLabel = computed<string>(() => {\n const opt = this.selectedOption();\n return opt ? this.getOptionLabel()(opt) : '';\n });\n\n protected readonly filteredOptions = computed<readonly O[]>(() => {\n const q = this.query().toLowerCase().trim();\n const list = this.options();\n if (!q) return list;\n const getLabel = this.getOptionLabel();\n return list.filter((opt) =>\n getLabel(opt).toLowerCase().includes(q),\n );\n });\n\n protected readonly displayText = computed<string>(() =>\n this.primitive.open() ? this.query() : this.selectedLabel(),\n );\n\n protected onInput(ev: Event): void {\n const val = (ev.target as HTMLInputElement).value;\n this.query.set(val);\n }\n\n private findOption(value: V | null): O | null {\n if (value === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), value)) return opt;\n }\n return null;\n }\n}\n","<div tngAutocompleteTriggerContainer>\n <input\n tngAutocompleteTrigger\n type=\"text\"\n [value]=\"displayText()\"\n (input)=\"onInput($event)\"\n [attr.placeholder]=\"placeholder()\"\n [attr.aria-label]=\"ariaLabel()\"\n />\n <span tngAutocompleteIcon aria-hidden=\"true\">\n {{ iconText() }}\n </span>\n</div>\n\n<div tngAutocompleteContent>\n <div tngAutocompleteOverlay>\n <ul tngAutocompleteListbox [value]=\"primitive.value()\">\n @for (opt of filteredOptions(); track trackBy()($index, opt)) {\n <li\n tngAutocompleteOption\n [tngValue]=\"getOptionValue()(opt)\"\n [disabled]=\"isOptionDisabled()(opt)\"\n >\n {{ getOptionLabel()(opt) }}\n </li>\n }\n @if (filteredOptions().length === 0) {\n <li data-slot=\"autocomplete-empty\">No matches</li>\n }\n </ul>\n </div>\n</div>\n"]}
@@ -1,4 +1,5 @@
1
1
  import { type TngButtonToggleValue } from '@tailng-ui/primitives';
2
+ import * as i0 from "@angular/core";
2
3
  type TngButtonToggleDirection = 'auto' | 'ltr' | 'rtl';
3
4
  type TngButtonToggleOrientation = 'horizontal' | 'vertical';
4
5
  type TngButtonToggleType = 'multiple' | 'single';
@@ -39,6 +40,8 @@ export declare class TngButtonToggleGroupComponent {
39
40
  protected resolvedValues(): readonly TngButtonToggleValue[] | undefined;
40
41
  protected resolvedDefaultValue(): TngButtonToggleValue | null | undefined;
41
42
  protected resolvedDefaultValues(): readonly TngButtonToggleValue[] | undefined;
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngButtonToggleGroupComponent, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<TngButtonToggleGroupComponent, "tng-button-toggle-group", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "activation": { "alias": "activation"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "dir": { "alias": "dir"; "required": false; "isSignal": true; }; "allowEmpty": { "alias": "allowEmpty"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "valueInput": { "alias": "tngButtonToggleValue"; "required": false; "isSignal": true; }; "valuesInput": { "alias": "tngButtonToggleValues"; "required": false; "isSignal": true; }; "defaultValueInput": { "alias": "tngButtonToggleDefaultValue"; "required": false; "isSignal": true; }; "defaultValuesInput": { "alias": "tngButtonToggleDefaultValues"; "required": false; "isSignal": true; }; "valueFallbackInput": { "alias": "value"; "required": false; "isSignal": true; }; "valuesFallbackInput": { "alias": "values"; "required": false; "isSignal": true; }; "defaultValueFallbackInput": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "defaultValuesFallbackInput": { "alias": "defaultValues"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "valuesChange": "valuesChange"; "toggleChange": "toggleChange"; "focusChange": "focusChange"; }, never, ["*"], true, never>;
42
45
  }
43
46
  export {};
44
47
  //# sourceMappingURL=tng-button-toggle-group.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-button-toggle-group.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle-group.component.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,KAAK,wBAAwB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AACvD,KAAK,0BAA0B,GAAG,YAAY,GAAG,UAAU,CAAC;AAC5D,KAAK,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAC;AACjD,KAAK,6BAA6B,GAAG,MAAM,GAAG,QAAQ,CAAC;AA6CvD,qBAMa,6BAA6B;IACxC,SAAgB,SAAS,8CAAwC;IAEjE,SAAgB,IAAI,2DAAwC;IAC5D,SAAgB,UAAU,qEAAgD;IAC1E,SAAgB,WAAW,kEAAmD;IAC9E,SAAgB,GAAG,gEAA2C;IAC9D,SAAgB,UAAU,qEAEvB;IACH,SAAgB,QAAQ,qEAErB;IACH,SAAgB,IAAI,qEAEjB;IAEH,SAAgB,UAAU,qGAGvB;IACH,SAAgB,WAAW,yGAMzB;IACF,SAAgB,iBAAiB,qGAM/B;IACF,SAAgB,kBAAkB,yGAMhC;IAEF,SAAgB,kBAAkB,qGAMhC;IACF,SAAgB,mBAAmB,yGAMjC;IACF,SAAgB,yBAAyB,qGAMvC;IACF,SAAgB,0BAA0B,yGAMvC;IAEH,SAAgB,WAAW,wEAAyC;IACpE,SAAgB,YAAY,4EAA6C;IACzE,SAAgB,YAAY;;;;;;;QAAwC;IACpE,SAAgB,WAAW;;;;QAA6C;IAExE,SAAS,CAAC,aAAa,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASlE,SAAS,CAAC,cAAc,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;IASvE,SAAS,CAAC,oBAAoB,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASzE,SAAS,CAAC,qBAAqB,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;CAQ/E"}
1
+ {"version":3,"file":"tng-button-toggle-group.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle-group.component.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;;AAE/B,KAAK,wBAAwB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AACvD,KAAK,0BAA0B,GAAG,YAAY,GAAG,UAAU,CAAC;AAC5D,KAAK,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAC;AACjD,KAAK,6BAA6B,GAAG,MAAM,GAAG,QAAQ,CAAC;AA6CvD,qBAMa,6BAA6B;IACxC,SAAgB,SAAS,8CAAwC;IAEjE,SAAgB,IAAI,2DAAwC;IAC5D,SAAgB,UAAU,qEAAgD;IAC1E,SAAgB,WAAW,kEAAmD;IAC9E,SAAgB,GAAG,gEAA2C;IAC9D,SAAgB,UAAU,qEAEvB;IACH,SAAgB,QAAQ,qEAErB;IACH,SAAgB,IAAI,qEAEjB;IAEH,SAAgB,UAAU,qGAGvB;IACH,SAAgB,WAAW,yGAMzB;IACF,SAAgB,iBAAiB,qGAM/B;IACF,SAAgB,kBAAkB,yGAMhC;IAEF,SAAgB,kBAAkB,qGAMhC;IACF,SAAgB,mBAAmB,yGAMjC;IACF,SAAgB,yBAAyB,qGAMvC;IACF,SAAgB,0BAA0B,yGAMvC;IAEH,SAAgB,WAAW,wEAAyC;IACpE,SAAgB,YAAY,4EAA6C;IACzE,SAAgB,YAAY;;;;;;;QAAwC;IACpE,SAAgB,WAAW;;;;QAA6C;IAExE,SAAS,CAAC,aAAa,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASlE,SAAS,CAAC,cAAc,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;IASvE,SAAS,CAAC,oBAAoB,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASzE,SAAS,CAAC,qBAAqB,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;yCAxGnE,6BAA6B;2CAA7B,6BAA6B;CAgHzC"}