@tailng-ui/primitives 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/README.md +36 -0
  2. package/package.json +13 -0
  3. package/src/index.d.ts +55 -0
  4. package/src/index.d.ts.map +1 -0
  5. package/src/index.js +61 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/feedback/empty/tng-empty.d.ts +16 -0
  8. package/src/lib/feedback/empty/tng-empty.d.ts.map +1 -0
  9. package/src/lib/feedback/empty/tng-empty.js +68 -0
  10. package/src/lib/feedback/empty/tng-empty.js.map +1 -0
  11. package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts +24 -0
  12. package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts.map +1 -0
  13. package/src/lib/feedback/progress-bar/tng-progress-bar.js +100 -0
  14. package/src/lib/feedback/progress-bar/tng-progress-bar.js.map +1 -0
  15. package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts +21 -0
  16. package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts.map +1 -0
  17. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js +87 -0
  18. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js.map +1 -0
  19. package/src/lib/feedback/skeleton/tng-skeleton.d.ts +11 -0
  20. package/src/lib/feedback/skeleton/tng-skeleton.d.ts.map +1 -0
  21. package/src/lib/feedback/skeleton/tng-skeleton.js +44 -0
  22. package/src/lib/feedback/skeleton/tng-skeleton.js.map +1 -0
  23. package/src/lib/feedback/toast/tng-toast.d.ts +20 -0
  24. package/src/lib/feedback/toast/tng-toast.d.ts.map +1 -0
  25. package/src/lib/feedback/toast/tng-toast.js +79 -0
  26. package/src/lib/feedback/toast/tng-toast.js.map +1 -0
  27. package/src/lib/form/_shared/id/index.d.ts +4 -0
  28. package/src/lib/form/_shared/id/index.d.ts.map +1 -0
  29. package/src/lib/form/_shared/id/index.js +4 -0
  30. package/src/lib/form/_shared/id/index.js.map +1 -0
  31. package/src/lib/form/_shared/id/tng-unique-id.provider.d.ts +11 -0
  32. package/src/lib/form/_shared/id/tng-unique-id.provider.d.ts.map +1 -0
  33. package/src/lib/form/_shared/id/tng-unique-id.provider.js +15 -0
  34. package/src/lib/form/_shared/id/tng-unique-id.provider.js.map +1 -0
  35. package/src/lib/form/_shared/id/tng-unique-id.service.d.ts +9 -0
  36. package/src/lib/form/_shared/id/tng-unique-id.service.d.ts.map +1 -0
  37. package/src/lib/form/_shared/id/tng-unique-id.service.js +18 -0
  38. package/src/lib/form/_shared/id/tng-unique-id.service.js.map +1 -0
  39. package/src/lib/form/_shared/id/tng-unique-id.token.d.ts +8 -0
  40. package/src/lib/form/_shared/id/tng-unique-id.token.d.ts.map +1 -0
  41. package/src/lib/form/_shared/id/tng-unique-id.token.js +13 -0
  42. package/src/lib/form/_shared/id/tng-unique-id.token.js.map +1 -0
  43. package/src/lib/form/_shared/select/tng-select.host-api.d.ts +28 -0
  44. package/src/lib/form/_shared/select/tng-select.host-api.d.ts.map +1 -0
  45. package/src/lib/form/_shared/select/tng-select.host-api.js +1 -0
  46. package/src/lib/form/_shared/select/tng-select.host-api.js.map +1 -0
  47. package/src/lib/form/_shared/select/tng-select.overlay.shared.d.ts +38 -0
  48. package/src/lib/form/_shared/select/tng-select.overlay.shared.d.ts.map +1 -0
  49. package/src/lib/form/_shared/select/tng-select.overlay.shared.js +226 -0
  50. package/src/lib/form/_shared/select/tng-select.overlay.shared.js.map +1 -0
  51. package/src/lib/form/_shared/select/tng-select.parts.shared.d.ts +35 -0
  52. package/src/lib/form/_shared/select/tng-select.parts.shared.d.ts.map +1 -0
  53. package/src/lib/form/_shared/select/tng-select.parts.shared.js +199 -0
  54. package/src/lib/form/_shared/select/tng-select.parts.shared.js.map +1 -0
  55. package/src/lib/form/_shared/select/tng-select.tokens.shared.d.ts +8 -0
  56. package/src/lib/form/_shared/select/tng-select.tokens.shared.d.ts.map +1 -0
  57. package/src/lib/form/_shared/select/tng-select.tokens.shared.js +7 -0
  58. package/src/lib/form/_shared/select/tng-select.tokens.shared.js.map +1 -0
  59. package/src/lib/form/autocomplete/index.d.ts +7 -0
  60. package/src/lib/form/autocomplete/index.d.ts.map +1 -0
  61. package/src/lib/form/autocomplete/index.js +6 -0
  62. package/src/lib/form/autocomplete/index.js.map +1 -0
  63. package/src/lib/form/autocomplete/tng-autocomplete.d.ts +52 -0
  64. package/src/lib/form/autocomplete/tng-autocomplete.d.ts.map +1 -0
  65. package/src/lib/form/autocomplete/tng-autocomplete.js +95 -0
  66. package/src/lib/form/autocomplete/tng-autocomplete.js.map +1 -0
  67. package/src/lib/form/autocomplete/tng-autocomplete.listbox.d.ts +19 -0
  68. package/src/lib/form/autocomplete/tng-autocomplete.listbox.d.ts.map +1 -0
  69. package/src/lib/form/autocomplete/tng-autocomplete.listbox.js +123 -0
  70. package/src/lib/form/autocomplete/tng-autocomplete.listbox.js.map +1 -0
  71. package/src/lib/form/autocomplete/tng-autocomplete.listbox.tokens.d.ts +4 -0
  72. package/src/lib/form/autocomplete/tng-autocomplete.listbox.tokens.d.ts.map +1 -0
  73. package/src/lib/form/autocomplete/tng-autocomplete.listbox.tokens.js +3 -0
  74. package/src/lib/form/autocomplete/tng-autocomplete.listbox.tokens.js.map +1 -0
  75. package/src/lib/form/autocomplete/tng-autocomplete.listbox.types.d.ts +4 -0
  76. package/src/lib/form/autocomplete/tng-autocomplete.listbox.types.d.ts.map +1 -0
  77. package/src/lib/form/autocomplete/tng-autocomplete.listbox.types.js +1 -0
  78. package/src/lib/form/autocomplete/tng-autocomplete.listbox.types.js.map +1 -0
  79. package/src/lib/form/autocomplete/tng-autocomplete.overlay.d.ts +40 -0
  80. package/src/lib/form/autocomplete/tng-autocomplete.overlay.d.ts.map +1 -0
  81. package/src/lib/form/autocomplete/tng-autocomplete.overlay.js +236 -0
  82. package/src/lib/form/autocomplete/tng-autocomplete.overlay.js.map +1 -0
  83. package/src/lib/form/autocomplete/tng-autocomplete.parts.d.ts +38 -0
  84. package/src/lib/form/autocomplete/tng-autocomplete.parts.d.ts.map +1 -0
  85. package/src/lib/form/autocomplete/tng-autocomplete.parts.js +252 -0
  86. package/src/lib/form/autocomplete/tng-autocomplete.parts.js.map +1 -0
  87. package/src/lib/form/autocomplete/tng-autocomplete.tokens.d.ts +4 -0
  88. package/src/lib/form/autocomplete/tng-autocomplete.tokens.d.ts.map +1 -0
  89. package/src/lib/form/autocomplete/tng-autocomplete.tokens.js +3 -0
  90. package/src/lib/form/autocomplete/tng-autocomplete.tokens.js.map +1 -0
  91. package/src/lib/form/button-toggle/tng-button-toggle.d.ts +164 -0
  92. package/src/lib/form/button-toggle/tng-button-toggle.d.ts.map +1 -0
  93. package/src/lib/form/button-toggle/tng-button-toggle.js +1097 -0
  94. package/src/lib/form/button-toggle/tng-button-toggle.js.map +1 -0
  95. package/src/lib/form/checkbox/tng-checkbox.d.ts +48 -0
  96. package/src/lib/form/checkbox/tng-checkbox.d.ts.map +1 -0
  97. package/src/lib/form/checkbox/tng-checkbox.js +234 -0
  98. package/src/lib/form/checkbox/tng-checkbox.js.map +1 -0
  99. package/src/lib/form/chips/tng-chips.d.ts +4 -0
  100. package/src/lib/form/chips/tng-chips.d.ts.map +1 -0
  101. package/src/lib/form/chips/tng-chips.js +16 -0
  102. package/src/lib/form/chips/tng-chips.js.map +1 -0
  103. package/src/lib/form/combobox/tng-combobox.d.ts +4 -0
  104. package/src/lib/form/combobox/tng-combobox.d.ts.map +1 -0
  105. package/src/lib/form/combobox/tng-combobox.js +16 -0
  106. package/src/lib/form/combobox/tng-combobox.js.map +1 -0
  107. package/src/lib/form/input/tng-input.d.ts +87 -0
  108. package/src/lib/form/input/tng-input.d.ts.map +1 -0
  109. package/src/lib/form/input/tng-input.js +393 -0
  110. package/src/lib/form/input/tng-input.js.map +1 -0
  111. package/src/lib/form/input-otp/tng-input-otp.d.ts +7 -0
  112. package/src/lib/form/input-otp/tng-input-otp.d.ts.map +1 -0
  113. package/src/lib/form/input-otp/tng-input-otp.js +33 -0
  114. package/src/lib/form/input-otp/tng-input-otp.js.map +1 -0
  115. package/src/lib/form/label/tng-label.d.ts +6 -0
  116. package/src/lib/form/label/tng-label.d.ts.map +1 -0
  117. package/src/lib/form/label/tng-label.js +25 -0
  118. package/src/lib/form/label/tng-label.js.map +1 -0
  119. package/src/lib/form/listbox/listbox.directive.d.ts +51 -0
  120. package/src/lib/form/listbox/listbox.directive.d.ts.map +1 -0
  121. package/src/lib/form/listbox/listbox.directive.js +439 -0
  122. package/src/lib/form/listbox/listbox.directive.js.map +1 -0
  123. package/src/lib/form/listbox/option.directive.d.ts +22 -0
  124. package/src/lib/form/listbox/option.directive.d.ts.map +1 -0
  125. package/src/lib/form/listbox/option.directive.js +109 -0
  126. package/src/lib/form/listbox/option.directive.js.map +1 -0
  127. package/src/lib/form/listbox/tokens.d.ts +14 -0
  128. package/src/lib/form/listbox/tokens.d.ts.map +1 -0
  129. package/src/lib/form/listbox/tokens.js +13 -0
  130. package/src/lib/form/listbox/tokens.js.map +1 -0
  131. package/src/lib/form/multi-autocomplete/index.d.ts +10 -0
  132. package/src/lib/form/multi-autocomplete/index.d.ts.map +1 -0
  133. package/src/lib/form/multi-autocomplete/index.js +10 -0
  134. package/src/lib/form/multi-autocomplete/index.js.map +1 -0
  135. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.d.ts +11 -0
  136. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.d.ts.map +1 -0
  137. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.js +98 -0
  138. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.js.map +1 -0
  139. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.d.ts +10 -0
  140. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.d.ts.map +1 -0
  141. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.js +45 -0
  142. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.js.map +1 -0
  143. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.d.ts +43 -0
  144. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.d.ts.map +1 -0
  145. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.js +150 -0
  146. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.js.map +1 -0
  147. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.d.ts +20 -0
  148. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.d.ts.map +1 -0
  149. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.js +138 -0
  150. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.js.map +1 -0
  151. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.tokens.d.ts +4 -0
  152. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.tokens.d.ts.map +1 -0
  153. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.tokens.js +3 -0
  154. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.tokens.js.map +1 -0
  155. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.types.d.ts +18 -0
  156. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.types.d.ts.map +1 -0
  157. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.types.js +2 -0
  158. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.types.js.map +1 -0
  159. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.d.ts +4 -0
  160. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.d.ts.map +1 -0
  161. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.js +17 -0
  162. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.js.map +1 -0
  163. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.tokens.d.ts +4 -0
  164. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.tokens.d.ts.map +1 -0
  165. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.tokens.js +3 -0
  166. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.tokens.js.map +1 -0
  167. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts +21 -0
  168. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts.map +1 -0
  169. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js +241 -0
  170. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js.map +1 -0
  171. package/src/lib/form/multi-select/index.d.ts +7 -0
  172. package/src/lib/form/multi-select/index.d.ts.map +1 -0
  173. package/src/lib/form/multi-select/index.js +6 -0
  174. package/src/lib/form/multi-select/index.js.map +1 -0
  175. package/src/lib/form/multi-select/tng-multi-select.d.ts +45 -0
  176. package/src/lib/form/multi-select/tng-multi-select.d.ts.map +1 -0
  177. package/src/lib/form/multi-select/tng-multi-select.js +136 -0
  178. package/src/lib/form/multi-select/tng-multi-select.js.map +1 -0
  179. package/src/lib/form/multi-select/tng-multi-select.listbox.d.ts +21 -0
  180. package/src/lib/form/multi-select/tng-multi-select.listbox.d.ts.map +1 -0
  181. package/src/lib/form/multi-select/tng-multi-select.listbox.js +107 -0
  182. package/src/lib/form/multi-select/tng-multi-select.listbox.js.map +1 -0
  183. package/src/lib/form/multi-select/tng-multi-select.listbox.tokens.d.ts +3 -0
  184. package/src/lib/form/multi-select/tng-multi-select.listbox.tokens.d.ts.map +1 -0
  185. package/src/lib/form/multi-select/tng-multi-select.listbox.tokens.js +3 -0
  186. package/src/lib/form/multi-select/tng-multi-select.listbox.tokens.js.map +1 -0
  187. package/src/lib/form/multi-select/tng-multi-select.listbox.types.d.ts +3 -0
  188. package/src/lib/form/multi-select/tng-multi-select.listbox.types.d.ts.map +1 -0
  189. package/src/lib/form/multi-select/tng-multi-select.listbox.types.js +1 -0
  190. package/src/lib/form/multi-select/tng-multi-select.listbox.types.js.map +1 -0
  191. package/src/lib/form/multi-select/tng-multi-select.overlay.d.ts +5 -0
  192. package/src/lib/form/multi-select/tng-multi-select.overlay.d.ts.map +1 -0
  193. package/src/lib/form/multi-select/tng-multi-select.overlay.js +5 -0
  194. package/src/lib/form/multi-select/tng-multi-select.overlay.js.map +1 -0
  195. package/src/lib/form/multi-select/tng-multi-select.parts.d.ts +5 -0
  196. package/src/lib/form/multi-select/tng-multi-select.parts.d.ts.map +1 -0
  197. package/src/lib/form/multi-select/tng-multi-select.parts.js +5 -0
  198. package/src/lib/form/multi-select/tng-multi-select.parts.js.map +1 -0
  199. package/src/lib/form/multi-select/tng-multi-select.tokens.d.ts +4 -0
  200. package/src/lib/form/multi-select/tng-multi-select.tokens.d.ts.map +1 -0
  201. package/src/lib/form/multi-select/tng-multi-select.tokens.js +3 -0
  202. package/src/lib/form/multi-select/tng-multi-select.tokens.js.map +1 -0
  203. package/src/lib/form/multiselect/tng-multiselect.d.ts +4 -0
  204. package/src/lib/form/multiselect/tng-multiselect.d.ts.map +1 -0
  205. package/src/lib/form/multiselect/tng-multiselect.js +16 -0
  206. package/src/lib/form/multiselect/tng-multiselect.js.map +1 -0
  207. package/src/lib/form/radio/tng-radio.d.ts +20 -0
  208. package/src/lib/form/radio/tng-radio.d.ts.map +1 -0
  209. package/src/lib/form/radio/tng-radio.js +86 -0
  210. package/src/lib/form/radio/tng-radio.js.map +1 -0
  211. package/src/lib/form/select/tng-select.d.ts +38 -0
  212. package/src/lib/form/select/tng-select.d.ts.map +1 -0
  213. package/src/lib/form/select/tng-select.js +106 -0
  214. package/src/lib/form/select/tng-select.js.map +1 -0
  215. package/src/lib/form/select/tng-select.listbox.d.ts +20 -0
  216. package/src/lib/form/select/tng-select.listbox.d.ts.map +1 -0
  217. package/src/lib/form/select/tng-select.listbox.js +123 -0
  218. package/src/lib/form/select/tng-select.listbox.js.map +1 -0
  219. package/src/lib/form/select/tng-select.listbox.tokens.d.ts +3 -0
  220. package/src/lib/form/select/tng-select.listbox.tokens.d.ts.map +1 -0
  221. package/src/lib/form/select/tng-select.listbox.tokens.js +3 -0
  222. package/src/lib/form/select/tng-select.listbox.tokens.js.map +1 -0
  223. package/src/lib/form/select/tng-select.listbox.types.d.ts +4 -0
  224. package/src/lib/form/select/tng-select.listbox.types.d.ts.map +1 -0
  225. package/src/lib/form/select/tng-select.listbox.types.js +1 -0
  226. package/src/lib/form/select/tng-select.listbox.types.js.map +1 -0
  227. package/src/lib/form/select/tng-select.overlay.d.ts +5 -0
  228. package/src/lib/form/select/tng-select.overlay.d.ts.map +1 -0
  229. package/src/lib/form/select/tng-select.overlay.js +5 -0
  230. package/src/lib/form/select/tng-select.overlay.js.map +1 -0
  231. package/src/lib/form/select/tng-select.parts.d.ts +5 -0
  232. package/src/lib/form/select/tng-select.parts.d.ts.map +1 -0
  233. package/src/lib/form/select/tng-select.parts.js +5 -0
  234. package/src/lib/form/select/tng-select.parts.js.map +1 -0
  235. package/src/lib/form/select/tng-select.tokens.d.ts +4 -0
  236. package/src/lib/form/select/tng-select.tokens.d.ts.map +1 -0
  237. package/src/lib/form/select/tng-select.tokens.js +3 -0
  238. package/src/lib/form/select/tng-select.tokens.js.map +1 -0
  239. package/src/lib/form/slider/tng-slider.d.ts +19 -0
  240. package/src/lib/form/slider/tng-slider.d.ts.map +1 -0
  241. package/src/lib/form/slider/tng-slider.js +84 -0
  242. package/src/lib/form/slider/tng-slider.js.map +1 -0
  243. package/src/lib/form/switch/tng-switch.d.ts +19 -0
  244. package/src/lib/form/switch/tng-switch.d.ts.map +1 -0
  245. package/src/lib/form/switch/tng-switch.js +79 -0
  246. package/src/lib/form/switch/tng-switch.js.map +1 -0
  247. package/src/lib/form/textarea/tng-textarea.d.ts +23 -0
  248. package/src/lib/form/textarea/tng-textarea.d.ts.map +1 -0
  249. package/src/lib/form/textarea/tng-textarea.js +119 -0
  250. package/src/lib/form/textarea/tng-textarea.js.map +1 -0
  251. package/src/lib/form/toggle/tng-toggle.d.ts +44 -0
  252. package/src/lib/form/toggle/tng-toggle.d.ts.map +1 -0
  253. package/src/lib/form/toggle/tng-toggle.js +203 -0
  254. package/src/lib/form/toggle/tng-toggle.js.map +1 -0
  255. package/src/lib/form/toggle-group/tng-toggle-group.d.ts +35 -0
  256. package/src/lib/form/toggle-group/tng-toggle-group.d.ts.map +1 -0
  257. package/src/lib/form/toggle-group/tng-toggle-group.js +156 -0
  258. package/src/lib/form/toggle-group/tng-toggle-group.js.map +1 -0
  259. package/src/lib/internal/combobox/combobox.active.d.ts +17 -0
  260. package/src/lib/internal/combobox/combobox.active.d.ts.map +1 -0
  261. package/src/lib/internal/combobox/combobox.active.js +19 -0
  262. package/src/lib/internal/combobox/combobox.active.js.map +1 -0
  263. package/src/lib/internal/combobox/combobox.commit.d.ts +20 -0
  264. package/src/lib/internal/combobox/combobox.commit.d.ts.map +1 -0
  265. package/src/lib/internal/combobox/combobox.commit.js +34 -0
  266. package/src/lib/internal/combobox/combobox.commit.js.map +1 -0
  267. package/src/lib/internal/combobox/combobox.keyboard.d.ts +39 -0
  268. package/src/lib/internal/combobox/combobox.keyboard.d.ts.map +1 -0
  269. package/src/lib/internal/combobox/combobox.keyboard.js +88 -0
  270. package/src/lib/internal/combobox/combobox.keyboard.js.map +1 -0
  271. package/src/lib/internal/combobox/combobox.listbox-api.d.ts +19 -0
  272. package/src/lib/internal/combobox/combobox.listbox-api.d.ts.map +1 -0
  273. package/src/lib/internal/combobox/combobox.listbox-api.js +5 -0
  274. package/src/lib/internal/combobox/combobox.listbox-api.js.map +1 -0
  275. package/src/lib/internal/combobox/index.d.ts +5 -0
  276. package/src/lib/internal/combobox/index.d.ts.map +1 -0
  277. package/src/lib/internal/combobox/index.js +4 -0
  278. package/src/lib/internal/combobox/index.js.map +1 -0
  279. package/src/lib/layout/accordion/tng-accordion.d.ts +150 -0
  280. package/src/lib/layout/accordion/tng-accordion.d.ts.map +1 -0
  281. package/src/lib/layout/accordion/tng-accordion.js +852 -0
  282. package/src/lib/layout/accordion/tng-accordion.js.map +1 -0
  283. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts +4 -0
  284. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts.map +1 -0
  285. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js +16 -0
  286. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js.map +1 -0
  287. package/src/lib/layout/card/tng-card.d.ts +31 -0
  288. package/src/lib/layout/card/tng-card.d.ts.map +1 -0
  289. package/src/lib/layout/card/tng-card.js +133 -0
  290. package/src/lib/layout/card/tng-card.js.map +1 -0
  291. package/src/lib/layout/collapsible/tng-collapsible.d.ts +28 -0
  292. package/src/lib/layout/collapsible/tng-collapsible.d.ts.map +1 -0
  293. package/src/lib/layout/collapsible/tng-collapsible.js +123 -0
  294. package/src/lib/layout/collapsible/tng-collapsible.js.map +1 -0
  295. package/src/lib/layout/drawer/tng-drawer.d.ts +177 -0
  296. package/src/lib/layout/drawer/tng-drawer.d.ts.map +1 -0
  297. package/src/lib/layout/drawer/tng-drawer.js +1147 -0
  298. package/src/lib/layout/drawer/tng-drawer.js.map +1 -0
  299. package/src/lib/layout/grid/tng-grid.d.ts +4 -0
  300. package/src/lib/layout/grid/tng-grid.d.ts.map +1 -0
  301. package/src/lib/layout/grid/tng-grid.js +16 -0
  302. package/src/lib/layout/grid/tng-grid.js.map +1 -0
  303. package/src/lib/layout/separator/tng-separator.d.ts +11 -0
  304. package/src/lib/layout/separator/tng-separator.d.ts.map +1 -0
  305. package/src/lib/layout/separator/tng-separator.js +47 -0
  306. package/src/lib/layout/separator/tng-separator.js.map +1 -0
  307. package/src/lib/layout/stepper/tng-stepper.d.ts +4 -0
  308. package/src/lib/layout/stepper/tng-stepper.d.ts.map +1 -0
  309. package/src/lib/layout/stepper/tng-stepper.js +16 -0
  310. package/src/lib/layout/stepper/tng-stepper.js.map +1 -0
  311. package/src/lib/layout/tree/tng-tree.d.ts +4 -0
  312. package/src/lib/layout/tree/tng-tree.d.ts.map +1 -0
  313. package/src/lib/layout/tree/tng-tree.js +16 -0
  314. package/src/lib/layout/tree/tng-tree.js.map +1 -0
  315. package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts +17 -0
  316. package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts.map +1 -0
  317. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js +72 -0
  318. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js.map +1 -0
  319. package/src/lib/navigation/context-menu/tng-context-menu.d.ts +36 -0
  320. package/src/lib/navigation/context-menu/tng-context-menu.d.ts.map +1 -0
  321. package/src/lib/navigation/context-menu/tng-context-menu.js +159 -0
  322. package/src/lib/navigation/context-menu/tng-context-menu.js.map +1 -0
  323. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts +4 -0
  324. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts.map +1 -0
  325. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js +16 -0
  326. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js.map +1 -0
  327. package/src/lib/navigation/menu/tng-menu.d.ts +173 -0
  328. package/src/lib/navigation/menu/tng-menu.d.ts.map +1 -0
  329. package/src/lib/navigation/menu/tng-menu.js +1026 -0
  330. package/src/lib/navigation/menu/tng-menu.js.map +1 -0
  331. package/src/lib/navigation/menubar/tng-menubar.d.ts +64 -0
  332. package/src/lib/navigation/menubar/tng-menubar.d.ts.map +1 -0
  333. package/src/lib/navigation/menubar/tng-menubar.js +478 -0
  334. package/src/lib/navigation/menubar/tng-menubar.js.map +1 -0
  335. package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts +4 -0
  336. package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts.map +1 -0
  337. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js +16 -0
  338. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js.map +1 -0
  339. package/src/lib/navigation/tabs/tng-tabs.d.ts +234 -0
  340. package/src/lib/navigation/tabs/tng-tabs.d.ts.map +1 -0
  341. package/src/lib/navigation/tabs/tng-tabs.js +1350 -0
  342. package/src/lib/navigation/tabs/tng-tabs.js.map +1 -0
  343. package/src/lib/navigation/toolbar/tng-toolbar.d.ts +4 -0
  344. package/src/lib/navigation/toolbar/tng-toolbar.d.ts.map +1 -0
  345. package/src/lib/navigation/toolbar/tng-toolbar.js +16 -0
  346. package/src/lib/navigation/toolbar/tng-toolbar.js.map +1 -0
  347. package/src/lib/overlay/tooltip/tng-tooltip.d.ts +25 -0
  348. package/src/lib/overlay/tooltip/tng-tooltip.d.ts.map +1 -0
  349. package/src/lib/overlay/tooltip/tng-tooltip.js +99 -0
  350. package/src/lib/overlay/tooltip/tng-tooltip.js.map +1 -0
  351. package/src/lib/utility/avatar/tng-avatar.d.ts +10 -0
  352. package/src/lib/utility/avatar/tng-avatar.d.ts.map +1 -0
  353. package/src/lib/utility/avatar/tng-avatar.js +42 -0
  354. package/src/lib/utility/avatar/tng-avatar.js.map +1 -0
  355. package/src/lib/utility/badge/tng-badge.d.ts +63 -0
  356. package/src/lib/utility/badge/tng-badge.d.ts.map +1 -0
  357. package/src/lib/utility/badge/tng-badge.js +345 -0
  358. package/src/lib/utility/badge/tng-badge.js.map +1 -0
  359. package/src/lib/utility/code-block/tng-code-block.d.ts +16 -0
  360. package/src/lib/utility/code-block/tng-code-block.d.ts.map +1 -0
  361. package/src/lib/utility/code-block/tng-code-block.js +68 -0
  362. package/src/lib/utility/code-block/tng-code-block.js.map +1 -0
  363. package/src/lib/utility/copy/tng-copy.d.ts +75 -0
  364. package/src/lib/utility/copy/tng-copy.d.ts.map +1 -0
  365. package/src/lib/utility/copy/tng-copy.js +544 -0
  366. package/src/lib/utility/copy/tng-copy.js.map +1 -0
  367. package/src/lib/utility/press/tng-press.d.ts +33 -0
  368. package/src/lib/utility/press/tng-press.d.ts.map +1 -0
  369. package/src/lib/utility/press/tng-press.js +207 -0
  370. package/src/lib/utility/press/tng-press.js.map +1 -0
  371. package/src/lib/utility/tag/tng-tag.d.ts +4 -0
  372. package/src/lib/utility/tag/tng-tag.d.ts.map +1 -0
  373. package/src/lib/utility/tag/tng-tag.js +16 -0
  374. package/src/lib/utility/tag/tng-tag.js.map +1 -0
@@ -0,0 +1,109 @@
1
+ import { __decorate } from "tslib";
2
+ // option.directive.ts
3
+ import { Directive, ElementRef, HostBinding, HostListener, effect, inject, input, signal, } from '@angular/core';
4
+ import { createTngIdFactory } from '@tailng-ui/cdk';
5
+ import { TNG_LISTBOX } from './tokens';
6
+ const createId = createTngIdFactory('tng-option');
7
+ let TngOptionDirective = class TngOptionDirective {
8
+ tngValue = input();
9
+ disabled = input(false);
10
+ el = inject((ElementRef));
11
+ listbox = inject(TNG_LISTBOX);
12
+ id = createId();
13
+ // gate to ensure we only push updates after initial registration
14
+ registered = signal(false);
15
+ // ✅ effect is created in injection context (field initializer)
16
+ _syncDisabled = effect(() => {
17
+ if (!this.registered())
18
+ return;
19
+ this.listbox.updateOptionDisabled(this.id, this.disabled());
20
+ });
21
+ role = 'option';
22
+ get hostId() {
23
+ return this.id;
24
+ }
25
+ get ariaSelected() {
26
+ return this.isSelected() ? 'true' : 'false';
27
+ }
28
+ get ariaDisabled() {
29
+ return this.disabled() ? 'true' : null;
30
+ }
31
+ // ✅ Tailwind-friendly state attributes (presence based)
32
+ get dataActive() {
33
+ return this.listbox.isActive(this.id) ? '' : null;
34
+ }
35
+ get dataSelected() {
36
+ return this.isSelected() ? '' : null;
37
+ }
38
+ get dataDisabled() {
39
+ return this.disabled() ? '' : null;
40
+ }
41
+ ngAfterViewInit() {
42
+ const value = this.tngValue();
43
+ if (value === undefined)
44
+ return;
45
+ const text = this.el.nativeElement.textContent?.trim() ?? '';
46
+ // pass text for typeahead
47
+ this.listbox.registerOption(this.id, value, this.disabled(), text, this.el.nativeElement);
48
+ this.registered.set(true);
49
+ }
50
+ ngOnDestroy() {
51
+ this.listbox.unregisterOption(this.id);
52
+ this.registered.set(false);
53
+ // Angular will destroy directive + tear down effect automatically
54
+ }
55
+ onPointerDown(event) {
56
+ if (this.disabled()) {
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ return;
60
+ }
61
+ if (event.button !== 0)
62
+ return;
63
+ // Prevent focus from moving / text selection, keep listbox behavior stable.
64
+ event.preventDefault();
65
+ this.listbox.handleOptionClick(this.id, event.shiftKey);
66
+ }
67
+ isSelected() {
68
+ if (this.listbox.isSelected(this.id))
69
+ return true;
70
+ if (this.disabled())
71
+ return false;
72
+ const value = this.tngValue();
73
+ if (value === undefined)
74
+ return false;
75
+ return this.listbox.isValueSelected(value);
76
+ }
77
+ };
78
+ __decorate([
79
+ HostBinding('attr.role')
80
+ ], TngOptionDirective.prototype, "role", void 0);
81
+ __decorate([
82
+ HostBinding('attr.id')
83
+ ], TngOptionDirective.prototype, "hostId", null);
84
+ __decorate([
85
+ HostBinding('attr.aria-selected')
86
+ ], TngOptionDirective.prototype, "ariaSelected", null);
87
+ __decorate([
88
+ HostBinding('attr.aria-disabled')
89
+ ], TngOptionDirective.prototype, "ariaDisabled", null);
90
+ __decorate([
91
+ HostBinding('attr.data-active')
92
+ ], TngOptionDirective.prototype, "dataActive", null);
93
+ __decorate([
94
+ HostBinding('attr.data-selected')
95
+ ], TngOptionDirective.prototype, "dataSelected", null);
96
+ __decorate([
97
+ HostBinding('attr.data-disabled')
98
+ ], TngOptionDirective.prototype, "dataDisabled", null);
99
+ __decorate([
100
+ HostListener('pointerdown', ['$event'])
101
+ ], TngOptionDirective.prototype, "onPointerDown", null);
102
+ TngOptionDirective = __decorate([
103
+ Directive({
104
+ selector: '[tngOption]',
105
+ standalone: true,
106
+ })
107
+ ], TngOptionDirective);
108
+ export { TngOptionDirective };
109
+ //# sourceMappingURL=option.directive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option.directive.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/option.directive.ts"],"names":[],"mappings":"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","sourcesContent":["// option.directive.ts\nimport {\n AfterViewInit,\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n OnDestroy,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport { TNG_LISTBOX } from './tokens';\n\nconst createId = createTngIdFactory('tng-option');\n\n@Directive({\n selector: '[tngOption]',\n standalone: true,\n})\nexport class TngOptionDirective<T = unknown> implements AfterViewInit, OnDestroy {\n tngValue = input<T | undefined>();\n disabled = input<boolean>(false);\n\n private el = inject(ElementRef<HTMLElement>);\n private listbox = inject(TNG_LISTBOX);\n private id = createId();\n\n // gate to ensure we only push updates after initial registration\n private registered = signal(false);\n\n // ✅ effect is created in injection context (field initializer)\n private readonly _syncDisabled = effect(() => {\n if (!this.registered()) return;\n this.listbox.updateOptionDisabled(this.id, this.disabled());\n });\n\n @HostBinding('attr.role')\n role = 'option';\n\n @HostBinding('attr.id')\n get hostId() {\n return this.id;\n }\n\n @HostBinding('attr.aria-selected')\n get ariaSelected(): 'true' | 'false' {\n return this.isSelected() ? 'true' : 'false';\n }\n\n @HostBinding('attr.aria-disabled')\n get ariaDisabled(): 'true' | null {\n return this.disabled() ? 'true' : null;\n }\n\n // ✅ Tailwind-friendly state attributes (presence based)\n @HostBinding('attr.data-active')\n get dataActive(): '' | null {\n return this.listbox.isActive(this.id) ? '' : null;\n }\n\n @HostBinding('attr.data-selected')\n get dataSelected(): '' | null {\n return this.isSelected() ? '' : null;\n }\n\n @HostBinding('attr.data-disabled')\n get dataDisabled(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n ngAfterViewInit() {\n const value = this.tngValue();\n if (value === undefined) return;\n\n const text = this.el.nativeElement.textContent?.trim() ?? '';\n // pass text for typeahead\n this.listbox.registerOption(this.id, value, this.disabled(), text, this.el.nativeElement);\n\n this.registered.set(true);\n }\n\n ngOnDestroy() {\n this.listbox.unregisterOption(this.id);\n this.registered.set(false);\n // Angular will destroy directive + tear down effect automatically\n }\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(event: PointerEvent) {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (event.button !== 0) return;\n\n // Prevent focus from moving / text selection, keep listbox behavior stable.\n event.preventDefault();\n\n this.listbox.handleOptionClick(this.id, event.shiftKey);\n }\n\n private isSelected(): boolean {\n if (this.listbox.isSelected(this.id)) return true;\n if (this.disabled()) return false;\n\n const value = this.tngValue();\n if (value === undefined) return false;\n\n return this.listbox.isValueSelected(value);\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import type { TngListboxDirective } from './listbox.directive';
3
+ export declare const TNG_LISTBOX: InjectionToken<TngListboxDirective<any>>;
4
+ /** Optional override for listbox typeahead behavior. If provided, wins over the input(). */
5
+ export declare const TNG_LISTBOX_FORCE_TYPEAHEAD: InjectionToken<boolean>;
6
+ /** Optional override for listbox multiple behavior. If provided, wins over the input(). */
7
+ export declare const TNG_LISTBOX_FORCE_MULTIPLE: InjectionToken<boolean>;
8
+ /**
9
+ * When true, unregistering options should not mutate the external listbox value.
10
+ * This is useful for filterable composites where options can temporarily unmount
11
+ * while the controlled value should remain authoritative.
12
+ */
13
+ export declare const TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER: InjectionToken<boolean>;
14
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,eAAO,MAAM,WAAW,0CACqC,CAAC;AAE9D,4FAA4F;AAC5F,eAAO,MAAM,2BAA2B,yBACoB,CAAC;AAE7D,2FAA2F;AAC3F,eAAO,MAAM,0BAA0B,yBACoB,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,wCAAwC,yBACoB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const TNG_LISTBOX = new InjectionToken('TNG_LISTBOX');
3
+ /** Optional override for listbox typeahead behavior. If provided, wins over the input(). */
4
+ export const TNG_LISTBOX_FORCE_TYPEAHEAD = new InjectionToken('TNG_LISTBOX_FORCE_TYPEAHEAD');
5
+ /** Optional override for listbox multiple behavior. If provided, wins over the input(). */
6
+ export const TNG_LISTBOX_FORCE_MULTIPLE = new InjectionToken('TNG_LISTBOX_FORCE_MULTIPLE');
7
+ /**
8
+ * When true, unregistering options should not mutate the external listbox value.
9
+ * This is useful for filterable composites where options can temporarily unmount
10
+ * while the controlled value should remain authoritative.
11
+ */
12
+ export const TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER = new InjectionToken('TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER');
13
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,CAAC,MAAM,WAAW,GACtB,IAAI,cAAc,CAA2B,aAAa,CAAC,CAAC;AAE9D,4FAA4F;AAC5F,MAAM,CAAC,MAAM,2BAA2B,GACtC,IAAI,cAAc,CAAU,6BAA6B,CAAC,CAAC;AAE7D,2FAA2F;AAC3F,MAAM,CAAC,MAAM,0BAA0B,GACrC,IAAI,cAAc,CAAU,4BAA4B,CAAC,CAAC;AAE5D;;;;GAIG;AACH,MAAM,CAAC,MAAM,wCAAwC,GACnD,IAAI,cAAc,CAAU,0CAA0C,CAAC,CAAC","sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { TngListboxDirective } from './listbox.directive';\n\nexport const TNG_LISTBOX =\n new InjectionToken<TngListboxDirective<any>>('TNG_LISTBOX');\n\n/** Optional override for listbox typeahead behavior. If provided, wins over the input(). */\nexport const TNG_LISTBOX_FORCE_TYPEAHEAD =\n new InjectionToken<boolean>('TNG_LISTBOX_FORCE_TYPEAHEAD');\n\n/** Optional override for listbox multiple behavior. If provided, wins over the input(). */\nexport const TNG_LISTBOX_FORCE_MULTIPLE =\n new InjectionToken<boolean>('TNG_LISTBOX_FORCE_MULTIPLE');\n\n/**\n * When true, unregistering options should not mutate the external listbox value.\n * This is useful for filterable composites where options can temporarily unmount\n * while the controlled value should remain authoritative.\n */\nexport const TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER =\n new InjectionToken<boolean>('TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER');\n"]}
@@ -0,0 +1,10 @@
1
+ export * from './tng-multi-autocomplete';
2
+ export * from './tng-multi-autocomplete.trigger';
3
+ export * from './tng-multi-autocomplete.tokens';
4
+ export * from './tng-multi-autocomplete.listbox';
5
+ export * from './tng-multi-autocomplete.listbox.tokens';
6
+ export * from './tng-multi-autocomplete.listbox.types';
7
+ export * from './tng-multi-autocomplete.chip';
8
+ export * from './tng-multi-autocomplete.content';
9
+ export * from './tng-multi-autocomplete.overlay';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAEhD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './tng-multi-autocomplete';
2
+ export * from './tng-multi-autocomplete.trigger';
3
+ export * from './tng-multi-autocomplete.tokens';
4
+ export * from './tng-multi-autocomplete.listbox';
5
+ export * from './tng-multi-autocomplete.listbox.tokens';
6
+ export * from './tng-multi-autocomplete.listbox.types';
7
+ export * from './tng-multi-autocomplete.chip';
8
+ export * from './tng-multi-autocomplete.content';
9
+ export * from './tng-multi-autocomplete.overlay';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAEhD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC","sourcesContent":["export * from './tng-multi-autocomplete';\nexport * from './tng-multi-autocomplete.trigger';\nexport * from './tng-multi-autocomplete.tokens';\n\nexport * from './tng-multi-autocomplete.listbox';\nexport * from './tng-multi-autocomplete.listbox.tokens';\nexport * from './tng-multi-autocomplete.listbox.types';\n\nexport * from './tng-multi-autocomplete.chip';\nexport * from './tng-multi-autocomplete.content';\nexport * from './tng-multi-autocomplete.overlay';"]}
@@ -0,0 +1,11 @@
1
+ export declare class TngMultiAutocompleteChip<T = unknown> {
2
+ private readonly multi;
3
+ private readonly el;
4
+ /** The value represented by this chip (needed for Delete/Backspace remove). */
5
+ readonly tngValue: import("@angular/core").InputSignal<T | null>;
6
+ protected readonly dataSlot: "multi-autocomplete-chip";
7
+ protected readonly tabIndex = -1;
8
+ focus(): void;
9
+ protected onKeydown(event: KeyboardEvent): void;
10
+ }
11
+ //# sourceMappingURL=tng-multi-autocomplete.chip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-multi-autocomplete.chip.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.ts"],"names":[],"mappings":"AAYA,qBAKa,wBAAwB,CAAC,CAAC,GAAG,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2D;IACjF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmC;IAEtD,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,gDAAyB;IAG1C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,yBAAyB,CAAU;IAGjE,SAAS,CAAC,QAAQ,CAAC,QAAQ,MAAM;IAEjC,KAAK,IAAI,IAAI;IAKb,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;CAqFhD"}
@@ -0,0 +1,98 @@
1
+ import { __decorate } from "tslib";
2
+ import { Directive, ElementRef, HostBinding, HostListener, inject, input, } from '@angular/core';
3
+ import { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';
4
+ let TngMultiAutocompleteChip = class TngMultiAutocompleteChip {
5
+ multi = inject(TNG_MULTI_AUTOCOMPLETE);
6
+ el = inject((ElementRef));
7
+ /** The value represented by this chip (needed for Delete/Backspace remove). */
8
+ tngValue = input(null);
9
+ dataSlot = 'multi-autocomplete-chip';
10
+ tabIndex = -1;
11
+ focus() {
12
+ this.el.nativeElement.focus();
13
+ }
14
+ onKeydown(event) {
15
+ const host = this.multi.hostElement;
16
+ const chips = Array.from(host.querySelectorAll('[data-slot="multi-autocomplete-chip"]'));
17
+ const currentIndex = chips.indexOf(this.el.nativeElement);
18
+ if (currentIndex < 0)
19
+ return;
20
+ // ArrowLeft → previous chip (if any)
21
+ if (event.key === 'ArrowLeft') {
22
+ event.preventDefault();
23
+ event.stopPropagation();
24
+ const prev = chips[currentIndex - 1];
25
+ prev?.focus();
26
+ return;
27
+ }
28
+ // ArrowRight → next chip else input trigger
29
+ if (event.key === 'ArrowRight') {
30
+ event.preventDefault();
31
+ event.stopPropagation();
32
+ const next = chips[currentIndex + 1];
33
+ if (next) {
34
+ next.focus();
35
+ return;
36
+ }
37
+ const input = host.querySelector('[data-slot="multi-autocomplete-trigger"]');
38
+ input?.focus();
39
+ return;
40
+ }
41
+ // Delete / Backspace → remove this chip value
42
+ if (event.key === 'Delete' || event.key === 'Backspace') {
43
+ if (this.multi.disabled())
44
+ return;
45
+ const v = this.tngValue();
46
+ if (v == null)
47
+ return;
48
+ event.preventDefault();
49
+ event.stopPropagation();
50
+ // Choose next focus target *before* removing
51
+ const prev = chips[currentIndex - 1] ?? null;
52
+ const next = chips[currentIndex + 1] ?? null;
53
+ const input = host.querySelector('[data-slot="multi-autocomplete-trigger"]');
54
+ // remove selected value
55
+ this.multi.remove(v);
56
+ // focus after DOM updates
57
+ queueMicrotask(() => {
58
+ (prev ?? next ?? input)?.focus?.();
59
+ });
60
+ return;
61
+ }
62
+ // Home → first chip
63
+ if (event.key === 'Home') {
64
+ event.preventDefault();
65
+ event.stopPropagation();
66
+ const first = chips[0] ?? null;
67
+ first?.focus();
68
+ return;
69
+ }
70
+ // End → last chip (if any) else input trigger
71
+ // End → input trigger (jump out of chips)
72
+ if (event.key === 'End') {
73
+ event.preventDefault();
74
+ event.stopPropagation();
75
+ const input = host.querySelector('[data-slot="multi-autocomplete-trigger"]');
76
+ input?.focus();
77
+ return;
78
+ }
79
+ }
80
+ };
81
+ __decorate([
82
+ HostBinding('attr.data-slot')
83
+ ], TngMultiAutocompleteChip.prototype, "dataSlot", void 0);
84
+ __decorate([
85
+ HostBinding('attr.tabindex')
86
+ ], TngMultiAutocompleteChip.prototype, "tabIndex", void 0);
87
+ __decorate([
88
+ HostListener('keydown', ['$event'])
89
+ ], TngMultiAutocompleteChip.prototype, "onKeydown", null);
90
+ TngMultiAutocompleteChip = __decorate([
91
+ Directive({
92
+ selector: '[tngMultiAutocompleteChip]',
93
+ exportAs: 'tngMultiAutocompleteChip',
94
+ standalone: true,
95
+ })
96
+ ], TngMultiAutocompleteChip);
97
+ export { TngMultiAutocompleteChip };
98
+ //# sourceMappingURL=tng-multi-autocomplete.chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-multi-autocomplete.chip.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EACZ,MAAM,EACN,KAAK,GACN,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAQlE,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAClB,KAAK,GAAG,MAAM,CAA0B,sBAAsB,CAAC,CAAC;IAChE,EAAE,GAAG,MAAM,CAAC,CAAA,UAAuB,CAAA,CAAC,CAAC;IAEtD,+EAA+E;IACtE,QAAQ,GAAG,KAAK,CAAW,IAAI,CAAC,CAAC;IAGvB,QAAQ,GAAG,yBAAkC,CAAC;IAG9C,QAAQ,GAAG,CAAC,CAAC,CAAC;IAEjC,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAGS,SAAS,CAAC,KAAoB;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,IAAI,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CAC9C,CAAC;QAEnB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QAC1D,IAAI,YAAY,GAAG,CAAC;YAAE,OAAO;QAE7B,qCAAqC;QACrC,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,KAAK,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YAExB,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACrC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,0CAA0C,CAAuB,CAAC;YACnG,KAAK,EAAE,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,8CAA8C;QAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACxD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAAE,OAAO;YAElC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,IAAI;gBAAE,OAAO;YAEtB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YAExB,6CAA6C;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,0CAA0C,CAAuB,CAAC;YAEnG,wBAAwB;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAErB,0BAA0B;YAC1B,cAAc,CAAC,GAAG,EAAE;gBAClB,CAAC,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YAExB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YAC/B,KAAK,EAAE,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,8CAA8C;QAC1C,0CAA0C;QAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YAExB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAC9B,0CAA0C,CACrB,CAAC;YAExB,KAAK,EAAE,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;IACH,CAAC;CACF,CAAA;AA/FoB;IADlB,WAAW,CAAC,gBAAgB,CAAC;0DACmC;AAG9C;IADlB,WAAW,CAAC,eAAe,CAAC;0DACI;AAOvB;IADT,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;yDAqFnC;AAtGU,wBAAwB;IALpC,SAAS,CAAC;QACT,QAAQ,EAAE,4BAA4B;QACtC,QAAQ,EAAE,0BAA0B;QACpC,UAAU,EAAE,IAAI;KACjB,CAAC;GACW,wBAAwB,CAuGpC","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n input,\n} from '@angular/core';\n\nimport { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';\nimport type { TngMultiAutocomplete } from './tng-multi-autocomplete';\n\n@Directive({\n selector: '[tngMultiAutocompleteChip]',\n exportAs: 'tngMultiAutocompleteChip',\n standalone: true,\n})\nexport class TngMultiAutocompleteChip<T = unknown> {\n private readonly multi = inject<TngMultiAutocomplete<T>>(TNG_MULTI_AUTOCOMPLETE);\n private readonly el = inject(ElementRef<HTMLElement>);\n\n /** The value represented by this chip (needed for Delete/Backspace remove). */\n readonly tngValue = input<T | null>(null);\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'multi-autocomplete-chip' as const;\n\n @HostBinding('attr.tabindex')\n protected readonly tabIndex = -1;\n\n focus(): void {\n this.el.nativeElement.focus();\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n const host = this.multi.hostElement;\n\n const chips = Array.from(\n host.querySelectorAll('[data-slot=\"multi-autocomplete-chip\"]'),\n ) as HTMLElement[];\n\n const currentIndex = chips.indexOf(this.el.nativeElement);\n if (currentIndex < 0) return;\n\n // ArrowLeft → previous chip (if any)\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n event.stopPropagation();\n const prev = chips[currentIndex - 1];\n prev?.focus();\n return;\n }\n\n // ArrowRight → next chip else input trigger\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n event.stopPropagation();\n\n const next = chips[currentIndex + 1];\n if (next) {\n next.focus();\n return;\n }\n\n const input = host.querySelector('[data-slot=\"multi-autocomplete-trigger\"]') as HTMLElement | null;\n input?.focus();\n return;\n }\n\n // Delete / Backspace → remove this chip value\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.multi.disabled()) return;\n\n const v = this.tngValue();\n if (v == null) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n // Choose next focus target *before* removing\n const prev = chips[currentIndex - 1] ?? null;\n const next = chips[currentIndex + 1] ?? null;\n const input = host.querySelector('[data-slot=\"multi-autocomplete-trigger\"]') as HTMLElement | null;\n\n // remove selected value\n this.multi.remove(v);\n\n // focus after DOM updates\n queueMicrotask(() => {\n (prev ?? next ?? input)?.focus?.();\n });\n\n return;\n }\n\n // Home → first chip\n if (event.key === 'Home') {\n event.preventDefault();\n event.stopPropagation();\n\n const first = chips[0] ?? null;\n first?.focus();\n return;\n }\n\n // End → last chip (if any) else input trigger\n // End → input trigger (jump out of chips)\n if (event.key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n\n const input = host.querySelector(\n '[data-slot=\"multi-autocomplete-trigger\"]',\n ) as HTMLElement | null;\n\n input?.focus();\n return;\n }\n }\n}"]}
@@ -0,0 +1,10 @@
1
+ export declare class TngMultiAutocompleteContent {
2
+ private readonly multi;
3
+ private readonly destroyRef;
4
+ readonly id: string;
5
+ protected readonly dataSlot: "multi-autocomplete-content";
6
+ protected get hidden(): '' | null;
7
+ protected get ariaBusy(): 'true' | null;
8
+ constructor();
9
+ }
10
+ //# sourceMappingURL=tng-multi-autocomplete.content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-multi-autocomplete.content.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.ts"],"names":[],"mappings":"AAOA,qBAKa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAGjD,QAAQ,CAAC,EAAE,SAAqB;IAGhC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,4BAA4B,CAAU;IAGpE,SAAS,KAAK,MAAM,IAAI,EAAE,GAAG,IAAI,CAEhC;IAGD,SAAS,KAAK,QAAQ,IAAI,MAAM,GAAG,IAAI,CAEtC;;CAQF"}
@@ -0,0 +1,45 @@
1
+ import { __decorate } from "tslib";
2
+ import { DestroyRef, Directive, HostBinding, inject } from '@angular/core';
3
+ import { createTngIdFactory } from '@tailng-ui/cdk';
4
+ import { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';
5
+ const createContentId = createTngIdFactory('tng-multi-autocomplete-content');
6
+ let TngMultiAutocompleteContent = class TngMultiAutocompleteContent {
7
+ multi = inject(TNG_MULTI_AUTOCOMPLETE);
8
+ destroyRef = inject(DestroyRef);
9
+ id = createContentId();
10
+ dataSlot = 'multi-autocomplete-content';
11
+ get hidden() {
12
+ return this.multi.open() ? null : '';
13
+ }
14
+ get ariaBusy() {
15
+ return this.multi.loading() ? 'true' : null;
16
+ }
17
+ constructor() {
18
+ this.multi.setContentId(this.id);
19
+ this.destroyRef.onDestroy(() => {
20
+ if (this.multi.getContentId() === this.id)
21
+ this.multi.setContentId(null);
22
+ });
23
+ }
24
+ };
25
+ __decorate([
26
+ HostBinding('attr.id')
27
+ ], TngMultiAutocompleteContent.prototype, "id", void 0);
28
+ __decorate([
29
+ HostBinding('attr.data-slot')
30
+ ], TngMultiAutocompleteContent.prototype, "dataSlot", void 0);
31
+ __decorate([
32
+ HostBinding('attr.hidden')
33
+ ], TngMultiAutocompleteContent.prototype, "hidden", null);
34
+ __decorate([
35
+ HostBinding('attr.aria-busy')
36
+ ], TngMultiAutocompleteContent.prototype, "ariaBusy", null);
37
+ TngMultiAutocompleteContent = __decorate([
38
+ Directive({
39
+ selector: '[tngMultiAutocompleteContent]',
40
+ exportAs: 'tngMultiAutocompleteContent',
41
+ standalone: true,
42
+ })
43
+ ], TngMultiAutocompleteContent);
44
+ export { TngMultiAutocompleteContent };
45
+ //# sourceMappingURL=tng-multi-autocomplete.content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-multi-autocomplete.content.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAGzE,MAAM,eAAe,GAAG,kBAAkB,CAAC,gCAAgC,CAAC,CAAC;AAOtE,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACrB,KAAK,GAAG,MAAM,CAAuB,sBAAsB,CAAC,CAAC;IAC7D,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAGxC,EAAE,GAAG,eAAe,EAAE,CAAC;IAGb,QAAQ,GAAG,4BAAqC,CAAC;IAGpE,IAAc,MAAM;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;IAGD,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED;QACE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;YAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AArBU;IADR,WAAW,CAAC,SAAS,CAAC;uDACS;AAGb;IADlB,WAAW,CAAC,gBAAgB,CAAC;6DACsC;AAGpE;IADC,WAAW,CAAC,aAAa,CAAC;yDAG1B;AAGD;IADC,WAAW,CAAC,gBAAgB,CAAC;2DAG7B;AAlBU,2BAA2B;IALvC,SAAS,CAAC;QACT,QAAQ,EAAE,+BAA+B;QACzC,QAAQ,EAAE,6BAA6B;QACvC,UAAU,EAAE,IAAI;KACjB,CAAC;GACW,2BAA2B,CA0BvC","sourcesContent":["import { DestroyRef, Directive, HostBinding, inject } from '@angular/core';\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';\nimport type { TngMultiAutocomplete } from './tng-multi-autocomplete';\n\nconst createContentId = createTngIdFactory('tng-multi-autocomplete-content');\n\n@Directive({\n selector: '[tngMultiAutocompleteContent]',\n exportAs: 'tngMultiAutocompleteContent',\n standalone: true,\n})\nexport class TngMultiAutocompleteContent {\n private readonly multi = inject<TngMultiAutocomplete>(TNG_MULTI_AUTOCOMPLETE);\n private readonly destroyRef = inject(DestroyRef);\n\n @HostBinding('attr.id')\n readonly id = createContentId();\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'multi-autocomplete-content' as const;\n\n @HostBinding('attr.hidden')\n protected get hidden(): '' | null {\n return this.multi.open() ? null : '';\n }\n\n @HostBinding('attr.aria-busy')\n protected get ariaBusy(): 'true' | null {\n return this.multi.loading() ? 'true' : null;\n }\n\n constructor() {\n this.multi.setContentId(this.id);\n this.destroyRef.onDestroy(() => {\n if (this.multi.getContentId() === this.id) this.multi.setContentId(null);\n });\n }\n}"]}
@@ -0,0 +1,43 @@
1
+ import type { TngMultiAutocompleteListboxApi } from './tng-multi-autocomplete.listbox.types';
2
+ export declare class TngMultiAutocomplete<T = unknown> {
3
+ readonly hostElement: any;
4
+ /** Whether overlay is open. */
5
+ readonly open: import("@angular/core").ModelSignal<boolean>;
6
+ /** Disabled state. */
7
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
8
+ /** Selected values (always array). */
9
+ readonly value: import("@angular/core").ModelSignal<readonly T[]>;
10
+ /** Current input query (used for filtering). */
11
+ readonly query: import("@angular/core").ModelSignal<string>;
12
+ /** Emits whenever query changes (focus-open emit, typing, selection-clear, etc.) */
13
+ readonly queryChange: import("@angular/core").OutputEmitterRef<string>;
14
+ /** Optional states (styling/aria). */
15
+ readonly loading: import("@angular/core").InputSignal<boolean>;
16
+ readonly invalid: import("@angular/core").InputSignal<boolean>;
17
+ private _contentId;
18
+ private _listboxId;
19
+ private _activeId;
20
+ private _listboxApi;
21
+ protected readonly dataSlot: "multi-autocomplete";
22
+ protected get dataState(): 'open' | 'closed';
23
+ protected get dataDisabled(): '' | null;
24
+ protected get dataLoading(): '' | null;
25
+ protected get dataInvalid(): '' | null;
26
+ openSelect(): void;
27
+ close(): void;
28
+ toggleOpen(): void;
29
+ add(value: T): void;
30
+ remove(value: T): void;
31
+ toggle(value: T): void;
32
+ clear(): void;
33
+ removeLast(): void;
34
+ setContentId(id: string | null): void;
35
+ getContentId(): string | null;
36
+ setListboxId(id: string | null): void;
37
+ getListboxId(): string | null;
38
+ setActiveDescendantId(id: string | null): void;
39
+ getActiveDescendantId(): string | null;
40
+ setListboxApi(api: TngMultiAutocompleteListboxApi | null): void;
41
+ getListboxApi(): TngMultiAutocompleteListboxApi | null;
42
+ }
43
+ //# sourceMappingURL=tng-multi-autocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-multi-autocomplete.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAE7F,qBAMa,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC3C,QAAQ,CAAC,WAAW,MAAiD;IAErE,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,+CAAyB;IAEtC,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,+CAAyB;IAE1C,sCAAsC;IACtC,QAAQ,CAAC,KAAK,oDAA2B;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,8CAAqB;IAEnC,oFAAoF;IACpF,QAAQ,CAAC,WAAW,mDAAoB;IAExC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,+CAAyB;IACzC,QAAQ,CAAC,OAAO,+CAAyB;IAGzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAA+C;IAKlE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,oBAAoB,CAAU;IAG5D,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG,QAAQ,CAE3C;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAEtC;IAGD,SAAS,KAAK,WAAW,IAAI,EAAE,GAAG,IAAI,CAErC;IAGD,SAAS,KAAK,WAAW,IAAI,EAAE,GAAG,IAAI,CAErC;IAID,UAAU,IAAI,IAAI;IAKlB,KAAK,IAAI,IAAI;IAIb,UAAU,IAAI,IAAI;IASlB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAUnB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAWtB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAatB,KAAK,IAAI,IAAI;IAKb,UAAU,IAAI,IAAI;IAalB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAGrC,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAGrC,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAG9C,qBAAqB,IAAI,MAAM,GAAG,IAAI;IAItC,aAAa,CAAC,GAAG,EAAE,8BAA8B,GAAG,IAAI,GAAG,IAAI;IAG/D,aAAa,IAAI,8BAA8B,GAAG,IAAI;CAGvD"}
@@ -0,0 +1,150 @@
1
+ import { __decorate } from "tslib";
2
+ import { Directive, ElementRef, HostBinding, inject, input, model, output, } from '@angular/core';
3
+ import { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';
4
+ let TngMultiAutocomplete = class TngMultiAutocomplete {
5
+ hostElement = inject((ElementRef)).nativeElement;
6
+ /** Whether overlay is open. */
7
+ open = model(false);
8
+ /** Disabled state. */
9
+ disabled = input(false);
10
+ /** Selected values (always array). */
11
+ value = model([]);
12
+ /** Current input query (used for filtering). */
13
+ query = model('');
14
+ /** Emits whenever query changes (focus-open emit, typing, selection-clear, etc.) */
15
+ queryChange = output();
16
+ /** Optional states (styling/aria). */
17
+ loading = input(false);
18
+ invalid = input(false);
19
+ // ---- internal bridge state ----
20
+ _contentId = null;
21
+ _listboxId = null;
22
+ _activeId = null;
23
+ _listboxApi = null;
24
+ // ---- host styling hooks ----
25
+ dataSlot = 'multi-autocomplete';
26
+ get dataState() {
27
+ return this.open() ? 'open' : 'closed';
28
+ }
29
+ get dataDisabled() {
30
+ return this.disabled() ? '' : null;
31
+ }
32
+ get dataLoading() {
33
+ return this.loading() ? '' : null;
34
+ }
35
+ get dataInvalid() {
36
+ return this.invalid() ? '' : null;
37
+ }
38
+ // ---- overlay control ----
39
+ openSelect() {
40
+ if (this.disabled())
41
+ return;
42
+ this.open.set(true);
43
+ }
44
+ close() {
45
+ this.open.set(false);
46
+ }
47
+ toggleOpen() {
48
+ if (this.disabled())
49
+ return;
50
+ this.open.set(!this.open());
51
+ }
52
+ // =========================================================
53
+ // Selection API
54
+ // =========================================================
55
+ add(value) {
56
+ if (this.disabled())
57
+ return;
58
+ const current = this.value();
59
+ const exists = current.some((v) => Object.is(v, value));
60
+ if (exists)
61
+ return;
62
+ this.value.set([...current, value]);
63
+ }
64
+ remove(value) {
65
+ if (this.disabled())
66
+ return;
67
+ const current = this.value();
68
+ const next = current.filter((v) => !Object.is(v, value));
69
+ if (next.length !== current.length) {
70
+ this.value.set(next);
71
+ }
72
+ }
73
+ toggle(value) {
74
+ if (this.disabled())
75
+ return;
76
+ const current = this.value();
77
+ const exists = current.some((v) => Object.is(v, value));
78
+ if (exists) {
79
+ this.value.set(current.filter((v) => !Object.is(v, value)));
80
+ }
81
+ else {
82
+ this.value.set([...current, value]);
83
+ }
84
+ }
85
+ clear() {
86
+ if (this.disabled())
87
+ return;
88
+ this.value.set([]);
89
+ }
90
+ removeLast() {
91
+ if (this.disabled())
92
+ return;
93
+ const current = this.value();
94
+ if (current.length === 0)
95
+ return;
96
+ this.value.set(current.slice(0, -1));
97
+ }
98
+ // =========================================================
99
+ // Listbox bridge
100
+ // =========================================================
101
+ setContentId(id) {
102
+ this._contentId = id;
103
+ }
104
+ getContentId() {
105
+ return this._contentId;
106
+ }
107
+ setListboxId(id) {
108
+ this._listboxId = id;
109
+ }
110
+ getListboxId() {
111
+ return this._listboxId;
112
+ }
113
+ setActiveDescendantId(id) {
114
+ this._activeId = id;
115
+ }
116
+ getActiveDescendantId() {
117
+ return this._activeId;
118
+ }
119
+ setListboxApi(api) {
120
+ this._listboxApi = api;
121
+ }
122
+ getListboxApi() {
123
+ return this._listboxApi;
124
+ }
125
+ };
126
+ __decorate([
127
+ HostBinding('attr.data-slot')
128
+ ], TngMultiAutocomplete.prototype, "dataSlot", void 0);
129
+ __decorate([
130
+ HostBinding('attr.data-state')
131
+ ], TngMultiAutocomplete.prototype, "dataState", null);
132
+ __decorate([
133
+ HostBinding('attr.data-disabled')
134
+ ], TngMultiAutocomplete.prototype, "dataDisabled", null);
135
+ __decorate([
136
+ HostBinding('attr.data-loading')
137
+ ], TngMultiAutocomplete.prototype, "dataLoading", null);
138
+ __decorate([
139
+ HostBinding('attr.data-invalid')
140
+ ], TngMultiAutocomplete.prototype, "dataInvalid", null);
141
+ TngMultiAutocomplete = __decorate([
142
+ Directive({
143
+ selector: '[tngMultiAutocomplete]',
144
+ exportAs: 'tngMultiAutocomplete',
145
+ standalone: true,
146
+ providers: [{ provide: TNG_MULTI_AUTOCOMPLETE, useExisting: TngMultiAutocomplete }],
147
+ })
148
+ ], TngMultiAutocomplete);
149
+ export { TngMultiAutocomplete };
150
+ //# sourceMappingURL=tng-multi-autocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-multi-autocomplete.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';\nimport type { TngMultiAutocompleteListboxApi } from './tng-multi-autocomplete.listbox.types';\n\n@Directive({\n selector: '[tngMultiAutocomplete]',\n exportAs: 'tngMultiAutocomplete',\n standalone: true,\n providers: [{ provide: TNG_MULTI_AUTOCOMPLETE, useExisting: TngMultiAutocomplete }],\n})\nexport class TngMultiAutocomplete<T = unknown> {\n readonly hostElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n /** Whether overlay is open. */\n readonly open = model<boolean>(false);\n\n /** Disabled state. */\n readonly disabled = input<boolean>(false);\n\n /** Selected values (always array). */\n readonly value = model<readonly T[]>([]);\n\n /** Current input query (used for filtering). */\n readonly query = model<string>('');\n\n /** Emits whenever query changes (focus-open emit, typing, selection-clear, etc.) */\n readonly queryChange = output<string>();\n\n /** Optional states (styling/aria). */\n readonly loading = input<boolean>(false);\n readonly invalid = input<boolean>(false);\n\n // ---- internal bridge state ----\n private _contentId: string | null = null;\n private _listboxId: string | null = null;\n private _activeId: string | null = null;\n private _listboxApi: TngMultiAutocompleteListboxApi | null = null;\n\n // ---- host styling hooks ----\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'multi-autocomplete' as const;\n\n @HostBinding('attr.data-state')\n protected get dataState(): 'open' | 'closed' {\n return this.open() ? 'open' : 'closed';\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabled(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.data-loading')\n protected get dataLoading(): '' | null {\n return this.loading() ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalid(): '' | null {\n return this.invalid() ? '' : null;\n }\n\n // ---- overlay control ----\n\n openSelect(): void {\n if (this.disabled()) return;\n this.open.set(true);\n }\n\n close(): void {\n this.open.set(false);\n }\n\n toggleOpen(): void {\n if (this.disabled()) return;\n this.open.set(!this.open());\n }\n\n // =========================================================\n // Selection API\n // =========================================================\n\n add(value: T): void {\n if (this.disabled()) return;\n\n const current = this.value();\n const exists = current.some((v) => Object.is(v, value));\n if (exists) return;\n\n this.value.set([...current, value]);\n }\n\n remove(value: T): void {\n if (this.disabled()) return;\n\n const current = this.value();\n const next = current.filter((v) => !Object.is(v, value));\n\n if (next.length !== current.length) {\n this.value.set(next);\n }\n }\n\n toggle(value: T): void {\n if (this.disabled()) return;\n\n const current = this.value();\n const exists = current.some((v) => Object.is(v, value));\n\n if (exists) {\n this.value.set(current.filter((v) => !Object.is(v, value)));\n } else {\n this.value.set([...current, value]);\n }\n }\n\n clear(): void {\n if (this.disabled()) return;\n this.value.set([]);\n }\n\n removeLast(): void {\n if (this.disabled()) return;\n\n const current = this.value();\n if (current.length === 0) return;\n\n this.value.set(current.slice(0, -1));\n }\n\n // =========================================================\n // Listbox bridge\n // =========================================================\n\n setContentId(id: string | null): void {\n this._contentId = id;\n }\n getContentId(): string | null {\n return this._contentId;\n }\n\n setListboxId(id: string | null): void {\n this._listboxId = id;\n }\n getListboxId(): string | null {\n return this._listboxId;\n }\n\n setActiveDescendantId(id: string | null): void {\n this._activeId = id;\n }\n getActiveDescendantId(): string | null {\n return this._activeId;\n }\n\n setListboxApi(api: TngMultiAutocompleteListboxApi | null): void {\n this._listboxApi = api;\n }\n getListboxApi(): TngMultiAutocompleteListboxApi | null {\n return this._listboxApi;\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { TngMultiAutocompleteListboxApi } from './tng-multi-autocomplete.listbox.types';
2
+ export declare class TngMultiAutocompleteListbox<T = unknown> implements TngMultiAutocompleteListboxApi<T> {
3
+ private readonly multi;
4
+ private readonly destroyRef;
5
+ private readonly listbox;
6
+ protected readonly dataSlot: "multi-autocomplete-listbox";
7
+ protected readonly id: string;
8
+ constructor();
9
+ getHostId(): string | null;
10
+ getActiveId(): string | null;
11
+ ensureActive(pref?: 'first' | 'last'): void;
12
+ handleKey(key: string, shiftKey?: boolean): boolean;
13
+ commitActive(): void;
14
+ protected onListboxValueChange(value: T | readonly T[] | null): void;
15
+ getValue?(): readonly T[];
16
+ }
17
+ export declare class TngMultiAutocompleteOption<T = unknown> {
18
+ protected readonly dataSlot: "multi-autocomplete-option";
19
+ }
20
+ //# sourceMappingURL=tng-multi-autocomplete.listbox.d.ts.map