@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,156 @@
1
+ import { __decorate } from "tslib";
2
+ import { Directive, HostBinding, booleanAttribute, input, output, signal, } from '@angular/core';
3
+ function coerceSelectionMode(value) {
4
+ return value === 'single' ? 'single' : 'multiple';
5
+ }
6
+ function normalizeStringValue(value) {
7
+ if (value === undefined || value === null) {
8
+ return null;
9
+ }
10
+ const normalized = value.trim();
11
+ return normalized.length > 0 ? normalized : null;
12
+ }
13
+ function normalizeStringArray(value) {
14
+ if (!Array.isArray(value) || value.length === 0) {
15
+ return [];
16
+ }
17
+ const normalized = [];
18
+ for (const item of value) {
19
+ const normalizedItem = normalizeStringValue(item);
20
+ if (normalizedItem === null || normalized.includes(normalizedItem)) {
21
+ continue;
22
+ }
23
+ normalized.push(normalizedItem);
24
+ }
25
+ return normalized;
26
+ }
27
+ let TngToggleGroup = class TngToggleGroup {
28
+ internalSingleValue = signal(null);
29
+ internalMultipleValues = signal([]);
30
+ ariaLabel = input(null);
31
+ ariaLabelledby = input(null);
32
+ orientation = input('horizontal');
33
+ selectionMode = input('multiple', {
34
+ transform: coerceSelectionMode,
35
+ });
36
+ disabled = input(false, {
37
+ transform: booleanAttribute,
38
+ });
39
+ value = input(undefined);
40
+ values = input(undefined);
41
+ defaultValue = input(null);
42
+ defaultValues = input([]);
43
+ valueChange = output();
44
+ valuesChange = output();
45
+ ngOnInit() {
46
+ this.internalSingleValue.set(normalizeStringValue(this.defaultValue()));
47
+ this.internalMultipleValues.set(normalizeStringArray(this.defaultValues()));
48
+ }
49
+ isGroupDisabled() {
50
+ return this.disabled();
51
+ }
52
+ isItemSelected(itemValue) {
53
+ if (this.selectionMode() === 'single') {
54
+ return this.resolveSingleValue() === itemValue;
55
+ }
56
+ return this.resolveMultipleValues().includes(itemValue);
57
+ }
58
+ toggleItem(itemValue) {
59
+ if (this.disabled()) {
60
+ return this.isItemSelected(itemValue);
61
+ }
62
+ if (this.selectionMode() === 'single') {
63
+ const currentValue = this.resolveSingleValue();
64
+ const nextValue = currentValue === itemValue ? null : itemValue;
65
+ if (!this.isSingleControlled()) {
66
+ this.internalSingleValue.set(nextValue);
67
+ }
68
+ if (nextValue !== currentValue) {
69
+ this.valueChange.emit(nextValue);
70
+ }
71
+ return nextValue === itemValue;
72
+ }
73
+ const currentValues = this.resolveMultipleValues();
74
+ const isSelected = currentValues.includes(itemValue);
75
+ const nextValues = isSelected
76
+ ? currentValues.filter((value) => value !== itemValue)
77
+ : [...currentValues, itemValue];
78
+ if (!this.isMultipleControlled()) {
79
+ this.internalMultipleValues.set(nextValues);
80
+ }
81
+ if (nextValues.length !== currentValues.length || !isSelected) {
82
+ this.valuesChange.emit(nextValues);
83
+ }
84
+ return !isSelected;
85
+ }
86
+ isSingleControlled() {
87
+ return this.value() !== undefined;
88
+ }
89
+ isMultipleControlled() {
90
+ return this.values() !== undefined;
91
+ }
92
+ resolveSingleValue() {
93
+ if (this.isSingleControlled()) {
94
+ return normalizeStringValue(this.value() ?? null);
95
+ }
96
+ return this.internalSingleValue();
97
+ }
98
+ resolveMultipleValues() {
99
+ if (this.isMultipleControlled()) {
100
+ return normalizeStringArray(this.values());
101
+ }
102
+ return this.internalMultipleValues();
103
+ }
104
+ get ariaLabelAttr() {
105
+ return normalizeStringValue(this.ariaLabel());
106
+ }
107
+ get ariaLabelledbyAttr() {
108
+ return normalizeStringValue(this.ariaLabelledby());
109
+ }
110
+ get ariaDisabledAttr() {
111
+ return this.disabled() ? 'true' : null;
112
+ }
113
+ get dataDisabledAttr() {
114
+ return this.disabled() ? '' : null;
115
+ }
116
+ get dataOrientationAttr() {
117
+ return this.orientation();
118
+ }
119
+ get dataSelectionModeAttr() {
120
+ return this.selectionMode();
121
+ }
122
+ dataSlot = 'toggle-group';
123
+ roleAttr = 'group';
124
+ };
125
+ __decorate([
126
+ HostBinding('attr.aria-label')
127
+ ], TngToggleGroup.prototype, "ariaLabelAttr", null);
128
+ __decorate([
129
+ HostBinding('attr.aria-labelledby')
130
+ ], TngToggleGroup.prototype, "ariaLabelledbyAttr", null);
131
+ __decorate([
132
+ HostBinding('attr.aria-disabled')
133
+ ], TngToggleGroup.prototype, "ariaDisabledAttr", null);
134
+ __decorate([
135
+ HostBinding('attr.data-disabled')
136
+ ], TngToggleGroup.prototype, "dataDisabledAttr", null);
137
+ __decorate([
138
+ HostBinding('attr.data-orientation')
139
+ ], TngToggleGroup.prototype, "dataOrientationAttr", null);
140
+ __decorate([
141
+ HostBinding('attr.data-selection-mode')
142
+ ], TngToggleGroup.prototype, "dataSelectionModeAttr", null);
143
+ __decorate([
144
+ HostBinding('attr.data-slot')
145
+ ], TngToggleGroup.prototype, "dataSlot", void 0);
146
+ __decorate([
147
+ HostBinding('attr.role')
148
+ ], TngToggleGroup.prototype, "roleAttr", void 0);
149
+ TngToggleGroup = __decorate([
150
+ Directive({
151
+ selector: '[tngToggleGroup]',
152
+ exportAs: 'tngToggleGroup',
153
+ })
154
+ ], TngToggleGroup);
155
+ export { TngToggleGroup };
156
+ //# sourceMappingURL=tng-toggle-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-toggle-group.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/toggle-group/tng-toggle-group.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n HostBinding,\n OnInit,\n booleanAttribute,\n input,\n output,\n signal,\n} from '@angular/core';\n\ntype TngToggleGroupSelectionMode = 'multiple' | 'single';\n\nfunction coerceSelectionMode(value: unknown): TngToggleGroupSelectionMode {\n return value === 'single' ? 'single' : 'multiple';\n}\n\nfunction normalizeStringValue(value: string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeStringArray(value: readonly string[] | null | undefined): readonly string[] {\n if (!Array.isArray(value) || value.length === 0) {\n return [];\n }\n\n const normalized: string[] = [];\n for (const item of value) {\n const normalizedItem = normalizeStringValue(item);\n if (normalizedItem === null || normalized.includes(normalizedItem)) {\n continue;\n }\n\n normalized.push(normalizedItem);\n }\n\n return normalized;\n}\n\n@Directive({\n selector: '[tngToggleGroup]',\n exportAs: 'tngToggleGroup',\n})\nexport class TngToggleGroup implements OnInit {\n private readonly internalSingleValue = signal<string | null>(null);\n private readonly internalMultipleValues = signal<readonly string[]>([]);\n\n public readonly ariaLabel = input<string | null>(null);\n public readonly ariaLabelledby = input<string | null>(null);\n public readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\n public readonly selectionMode = input<TngToggleGroupSelectionMode, unknown>('multiple', {\n transform: coerceSelectionMode,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly value = input<string | null | undefined>(undefined);\n public readonly values = input<readonly string[] | undefined>(undefined);\n public readonly defaultValue = input<string | null>(null);\n public readonly defaultValues = input<readonly string[]>([]);\n\n public readonly valueChange = output<string | null>();\n public readonly valuesChange = output<readonly string[]>();\n\n public ngOnInit(): void {\n this.internalSingleValue.set(normalizeStringValue(this.defaultValue()));\n this.internalMultipleValues.set(normalizeStringArray(this.defaultValues()));\n }\n\n public isGroupDisabled(): boolean {\n return this.disabled();\n }\n\n public isItemSelected(itemValue: string): boolean {\n if (this.selectionMode() === 'single') {\n return this.resolveSingleValue() === itemValue;\n }\n\n return this.resolveMultipleValues().includes(itemValue);\n }\n\n public toggleItem(itemValue: string): boolean {\n if (this.disabled()) {\n return this.isItemSelected(itemValue);\n }\n\n if (this.selectionMode() === 'single') {\n const currentValue = this.resolveSingleValue();\n const nextValue = currentValue === itemValue ? null : itemValue;\n\n if (!this.isSingleControlled()) {\n this.internalSingleValue.set(nextValue);\n }\n\n if (nextValue !== currentValue) {\n this.valueChange.emit(nextValue);\n }\n\n return nextValue === itemValue;\n }\n\n const currentValues = this.resolveMultipleValues();\n const isSelected = currentValues.includes(itemValue);\n const nextValues = isSelected\n ? currentValues.filter((value) => value !== itemValue)\n : [...currentValues, itemValue];\n\n if (!this.isMultipleControlled()) {\n this.internalMultipleValues.set(nextValues);\n }\n\n if (nextValues.length !== currentValues.length || !isSelected) {\n this.valuesChange.emit(nextValues);\n }\n\n return !isSelected;\n }\n\n private isSingleControlled(): boolean {\n return this.value() !== undefined;\n }\n\n private isMultipleControlled(): boolean {\n return this.values() !== undefined;\n }\n\n private resolveSingleValue(): string | null {\n if (this.isSingleControlled()) {\n return normalizeStringValue(this.value() ?? null);\n }\n\n return this.internalSingleValue();\n }\n\n private resolveMultipleValues(): readonly string[] {\n if (this.isMultipleControlled()) {\n return normalizeStringArray(this.values());\n }\n\n return this.internalMultipleValues();\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabelAttr(): string | null {\n return normalizeStringValue(this.ariaLabel());\n }\n\n @HostBinding('attr.aria-labelledby')\n protected get ariaLabelledbyAttr(): string | null {\n return normalizeStringValue(this.ariaLabelledby());\n }\n\n @HostBinding('attr.aria-disabled')\n protected get ariaDisabledAttr(): 'true' | null {\n return this.disabled() ? 'true' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.data-orientation')\n protected get dataOrientationAttr(): 'horizontal' | 'vertical' {\n return this.orientation();\n }\n\n @HostBinding('attr.data-selection-mode')\n protected get dataSelectionModeAttr(): TngToggleGroupSelectionMode {\n return this.selectionMode();\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'toggle-group' as const;\n\n @HostBinding('attr.role')\n protected readonly roleAttr = 'group' as const;\n}\n"]}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Active descendant sync helpers.
3
+ * Keeps ensureActive + setActiveDescendantId(getActiveId()) consistent
4
+ * across Select, AutoComplete, etc.
5
+ */
6
+ import type { ComboboxListboxApi } from './combobox.listbox-api';
7
+ /** Callback to set aria-activedescendant on the trigger. */
8
+ export type SetActiveDescendantId = (id: string | null) => void;
9
+ /**
10
+ * Sync aria-activedescendant from listbox active id to the trigger.
11
+ */
12
+ export declare function syncActiveDescendant(listbox: ComboboxListboxApi | null, setActiveDescendantId: SetActiveDescendantId): void;
13
+ /**
14
+ * Ensure an option is active (first or last), then sync activeDescendant.
15
+ */
16
+ export declare function ensureActiveAndSync(listbox: ComboboxListboxApi | null, setActiveDescendantId: SetActiveDescendantId, pref?: 'first' | 'last'): void;
17
+ //# sourceMappingURL=combobox.active.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.active.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.active.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAEhE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,GAAG,IAAI,EAClC,qBAAqB,EAAE,qBAAqB,GAC3C,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,kBAAkB,GAAG,IAAI,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GACtB,IAAI,CAGN"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Active descendant sync helpers.
3
+ * Keeps ensureActive + setActiveDescendantId(getActiveId()) consistent
4
+ * across Select, AutoComplete, etc.
5
+ */
6
+ /**
7
+ * Sync aria-activedescendant from listbox active id to the trigger.
8
+ */
9
+ export function syncActiveDescendant(listbox, setActiveDescendantId) {
10
+ setActiveDescendantId(listbox?.getActiveId() ?? null);
11
+ }
12
+ /**
13
+ * Ensure an option is active (first or last), then sync activeDescendant.
14
+ */
15
+ export function ensureActiveAndSync(listbox, setActiveDescendantId, pref) {
16
+ listbox?.ensureActive(pref);
17
+ syncActiveDescendant(listbox, setActiveDescendantId);
18
+ }
19
+ //# sourceMappingURL=combobox.active.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.active.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.active.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAkC,EAClC,qBAA4C;IAE5C,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAkC,EAClC,qBAA4C,EAC5C,IAAuB;IAEvB,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;AACvD,CAAC","sourcesContent":["/**\n * Active descendant sync helpers.\n * Keeps ensureActive + setActiveDescendantId(getActiveId()) consistent\n * across Select, AutoComplete, etc.\n */\n\nimport type { ComboboxListboxApi } from './combobox.listbox-api';\n\n/** Callback to set aria-activedescendant on the trigger. */\nexport type SetActiveDescendantId = (id: string | null) => void;\n\n/**\n * Sync aria-activedescendant from listbox active id to the trigger.\n */\nexport function syncActiveDescendant(\n listbox: ComboboxListboxApi | null,\n setActiveDescendantId: SetActiveDescendantId\n): void {\n setActiveDescendantId(listbox?.getActiveId() ?? null);\n}\n\n/**\n * Ensure an option is active (first or last), then sync activeDescendant.\n */\nexport function ensureActiveAndSync(\n listbox: ComboboxListboxApi | null,\n setActiveDescendantId: SetActiveDescendantId,\n pref?: 'first' | 'last'\n): void {\n listbox?.ensureActive(pref);\n syncActiveDescendant(listbox, setActiveDescendantId);\n}\n"]}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Normalize + commit helpers for combobox listbox value sync.
3
+ * Listbox emits T | readonly T[] | null; these helpers normalize and compare
4
+ * for Select, AutoComplete, etc.
5
+ */
6
+ /** Listbox value shape (single, array, or null). */
7
+ export type ListboxValueShape<T> = T | readonly T[] | null;
8
+ /**
9
+ * Normalize listbox value to array form (for multi-select).
10
+ */
11
+ export declare function normalizeToArray<T>(value: ListboxValueShape<T>): readonly T[] | null;
12
+ /**
13
+ * Normalize listbox value to single form (for single-select).
14
+ */
15
+ export declare function normalizeToSingle<T>(value: ListboxValueShape<T>): T | null;
16
+ /**
17
+ * Check if two array values are equal (same refs, same order).
18
+ */
19
+ export declare function arraysEqual<T>(a: readonly T[] | null, b: readonly T[] | null): boolean;
20
+ //# sourceMappingURL=combobox.commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.commit.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oDAAoD;AACpD,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;AAE3D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI,CAGpF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAG1E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,EACtB,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,GACrB,OAAO,CAKT"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Normalize + commit helpers for combobox listbox value sync.
3
+ * Listbox emits T | readonly T[] | null; these helpers normalize and compare
4
+ * for Select, AutoComplete, etc.
5
+ */
6
+ /**
7
+ * Normalize listbox value to array form (for multi-select).
8
+ */
9
+ export function normalizeToArray(value) {
10
+ if (value === null)
11
+ return null;
12
+ return (Array.isArray(value) ? value : [value]);
13
+ }
14
+ /**
15
+ * Normalize listbox value to single form (for single-select).
16
+ */
17
+ export function normalizeToSingle(value) {
18
+ if (value === null)
19
+ return null;
20
+ return (Array.isArray(value) ? (value[0] ?? null) : value);
21
+ }
22
+ /**
23
+ * Check if two array values are equal (same refs, same order).
24
+ */
25
+ export function arraysEqual(a, b) {
26
+ if (a === null && b === null)
27
+ return true;
28
+ if (a === null || b === null)
29
+ return false;
30
+ if (a.length !== b.length)
31
+ return false;
32
+ return a.every((x, i) => Object.is(x, b[i]));
33
+ }
34
+ //# sourceMappingURL=combobox.commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.commit.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAI,KAA2B;IAC7D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAiB,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAI,KAA2B;IAC9D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAa,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,CAAsB,EACtB,CAAsB;IAEtB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["/**\n * Normalize + commit helpers for combobox listbox value sync.\n * Listbox emits T | readonly T[] | null; these helpers normalize and compare\n * for Select, AutoComplete, etc.\n */\n\n/** Listbox value shape (single, array, or null). */\nexport type ListboxValueShape<T> = T | readonly T[] | null;\n\n/**\n * Normalize listbox value to array form (for multi-select).\n */\nexport function normalizeToArray<T>(value: ListboxValueShape<T>): readonly T[] | null {\n if (value === null) return null;\n return (Array.isArray(value) ? value : [value]) as readonly T[];\n}\n\n/**\n * Normalize listbox value to single form (for single-select).\n */\nexport function normalizeToSingle<T>(value: ListboxValueShape<T>): T | null {\n if (value === null) return null;\n return (Array.isArray(value) ? (value[0] ?? null) : value) as T | null;\n}\n\n/**\n * Check if two array values are equal (same refs, same order).\n */\nexport function arraysEqual<T>(\n a: readonly T[] | null,\n b: readonly T[] | null\n): boolean {\n if (a === null && b === null) return true;\n if (a === null || b === null) return false;\n if (a.length !== b.length) return false;\n return a.every((x, i) => Object.is(x, b[i]));\n}\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Shared combobox keyboard "brain" for Select and AutoComplete.
3
+ * Handles closed-state keys, open-state keys, typeahead, and activeDescendant sync.
4
+ */
5
+ import type { ComboboxListboxApi } from './combobox.listbox-api';
6
+ export type { ComboboxListboxApi } from './combobox.listbox-api';
7
+ /** Context passed to the combobox keyboard handler. */
8
+ export interface ComboboxKeyboardContext {
9
+ disabled: boolean;
10
+ open: boolean;
11
+ /** Open the popup and prepare for interaction (e.g. Select opens list, AutoComplete opens + may filter). */
12
+ openSelect: () => void;
13
+ close: () => void;
14
+ listbox: ComboboxListboxApi | null;
15
+ /** Sync aria-activedescendant on the trigger (who owns it). */
16
+ setActiveDescendantId: (id: string | null) => void;
17
+ /** When true (multiselect), Enter toggles options; we must not call commitActive again when handleKey already ran. */
18
+ multiSelect?: boolean;
19
+ }
20
+ /** Options to customize keyboard behavior (e.g. AutoComplete may disable typeahead). */
21
+ export interface ComboboxKeyboardOptions {
22
+ /** Enable typeahead when open. Default true. AutoComplete may set false and handle in input. */
23
+ enableTypeahead?: boolean;
24
+ /** Keys that open when closed. Default: ArrowDown, ArrowUp, Enter, Space. */
25
+ keysToOpen?: readonly string[];
26
+ /** Keys that open when closed but must NOT preventDefault (e.g. Backspace/Delete so input can delete). */
27
+ keysToOpenNoPreventDefault?: readonly string[];
28
+ /**
29
+ * When true (default), Space commits the active option when open (Select behavior).
30
+ * When false (AutoComplete), Space inserts into input like normal typing (e.g. "United St" for filtering).
31
+ */
32
+ spaceCommits?: boolean;
33
+ }
34
+ /**
35
+ * Handles combobox keyboard events. Call from the trigger's keydown handler.
36
+ * Mutates `event` (preventDefault/stopPropagation) when the key is handled.
37
+ */
38
+ export declare function handleComboboxKeydown(event: KeyboardEvent, context: ComboboxKeyboardContext, options?: ComboboxKeyboardOptions): void;
39
+ //# sourceMappingURL=combobox.keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.keyboard.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.keyboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,uDAAuD;AACvD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,4GAA4G;IAC5G,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,+DAA+D;IAC/D,qBAAqB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,sHAAsH;IACtH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wFAAwF;AACxF,MAAM,WAAW,uBAAuB;IACtC,gGAAgG;IAChG,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,0GAA0G;IAC1G,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAUD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,uBAAuB,EAChC,OAAO,GAAE,uBAA4B,GACpC,IAAI,CAyFN"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Shared combobox keyboard "brain" for Select and AutoComplete.
3
+ * Handles closed-state keys, open-state keys, typeahead, and activeDescendant sync.
4
+ */
5
+ import { ensureActiveAndSync, syncActiveDescendant } from './combobox.active';
6
+ const DEFAULT_KEYS_TO_OPEN = [
7
+ 'ArrowDown',
8
+ 'ArrowUp',
9
+ 'Enter',
10
+ ' ',
11
+ 'Spacebar',
12
+ ];
13
+ /**
14
+ * Handles combobox keyboard events. Call from the trigger's keydown handler.
15
+ * Mutates `event` (preventDefault/stopPropagation) when the key is handled.
16
+ */
17
+ export function handleComboboxKeydown(event, context, options = {}) {
18
+ if (context.disabled)
19
+ return;
20
+ const { enableTypeahead = true, keysToOpen = DEFAULT_KEYS_TO_OPEN, keysToOpenNoPreventDefault = [], spaceCommits = true, } = options;
21
+ // --- Closed state: ArrowDown/ArrowUp/Enter/Space open + set active ---
22
+ if (!context.open) {
23
+ if (keysToOpen.includes(event.key)) {
24
+ const noPrevent = keysToOpenNoPreventDefault.includes(event.key);
25
+ if (!noPrevent) {
26
+ event.preventDefault();
27
+ }
28
+ context.openSelect();
29
+ ensureActiveAndSync(context.listbox, context.setActiveDescendantId, event.key === 'ArrowUp' ? 'last' : 'first');
30
+ }
31
+ return;
32
+ }
33
+ // --- Open state ---
34
+ // Tab: close and allow browser to move focus (do not preventDefault)
35
+ if (event.key === 'Tab') {
36
+ context.close();
37
+ return;
38
+ }
39
+ // Escape: close
40
+ if (event.key === 'Escape') {
41
+ if (!event.defaultPrevented) {
42
+ event.preventDefault();
43
+ event.stopPropagation();
44
+ context.close();
45
+ }
46
+ return;
47
+ }
48
+ // Space: when spaceCommits (Select) → commit; when !spaceCommits (AutoComplete) → return so input receives it
49
+ if (event.key === ' ' || event.key === 'Spacebar') {
50
+ if (spaceCommits) {
51
+ event.preventDefault();
52
+ context.listbox?.commitActive();
53
+ }
54
+ return;
55
+ }
56
+ // Typeahead: single char (exclude Space, modifiers) → route to listbox or ignore
57
+ if (enableTypeahead &&
58
+ event.key.length === 1 &&
59
+ event.key !== ' ' &&
60
+ !event.ctrlKey &&
61
+ !event.metaKey &&
62
+ !event.altKey) {
63
+ const moved = context.listbox?.typeahead?.(event.key) ?? false;
64
+ if (moved) {
65
+ syncActiveDescendant(context.listbox, context.setActiveDescendantId);
66
+ event.preventDefault();
67
+ }
68
+ return;
69
+ }
70
+ // Arrow keys, Home, End, etc.
71
+ const moved = context.listbox?.handleKey(event.key, event.shiftKey) ?? false;
72
+ if (moved) {
73
+ syncActiveDescendant(context.listbox, context.setActiveDescendantId);
74
+ event.preventDefault();
75
+ // Single-select: listbox did select-active. Still need commitActive to close overlay.
76
+ // Multi-select: listbox did toggle-active. Do NOT call commitActive—it would toggle again.
77
+ if (event.key === 'Enter' && !context.multiSelect) {
78
+ context.listbox?.commitActive();
79
+ }
80
+ return;
81
+ }
82
+ // Enter: listbox did not handle it (no active). Fallback: close if we have a selection.
83
+ if (event.key === 'Enter') {
84
+ event.preventDefault();
85
+ context.listbox?.commitActive();
86
+ }
87
+ }
88
+ //# sourceMappingURL=combobox.keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.keyboard.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.keyboard.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared combobox keyboard \"brain\" for Select and AutoComplete.\n * Handles closed-state keys, open-state keys, typeahead, and activeDescendant sync.\n */\n\nimport { ensureActiveAndSync, syncActiveDescendant } from './combobox.active';\nimport type { ComboboxListboxApi } from './combobox.listbox-api';\nexport type { ComboboxListboxApi } from './combobox.listbox-api';\n\n/** Context passed to the combobox keyboard handler. */\nexport interface ComboboxKeyboardContext {\n disabled: boolean;\n open: boolean;\n /** Open the popup and prepare for interaction (e.g. Select opens list, AutoComplete opens + may filter). */\n openSelect: () => void;\n close: () => void;\n listbox: ComboboxListboxApi | null;\n /** Sync aria-activedescendant on the trigger (who owns it). */\n setActiveDescendantId: (id: string | null) => void;\n /** When true (multiselect), Enter toggles options; we must not call commitActive again when handleKey already ran. */\n multiSelect?: boolean;\n}\n\n/** Options to customize keyboard behavior (e.g. AutoComplete may disable typeahead). */\nexport interface ComboboxKeyboardOptions {\n /** Enable typeahead when open. Default true. AutoComplete may set false and handle in input. */\n enableTypeahead?: boolean;\n /** Keys that open when closed. Default: ArrowDown, ArrowUp, Enter, Space. */\n keysToOpen?: readonly string[];\n /** Keys that open when closed but must NOT preventDefault (e.g. Backspace/Delete so input can delete). */\n keysToOpenNoPreventDefault?: readonly string[];\n /**\n * When true (default), Space commits the active option when open (Select behavior).\n * When false (AutoComplete), Space inserts into input like normal typing (e.g. \"United St\" for filtering).\n */\n spaceCommits?: boolean;\n}\n\nconst DEFAULT_KEYS_TO_OPEN = [\n 'ArrowDown',\n 'ArrowUp',\n 'Enter',\n ' ',\n 'Spacebar',\n] as const;\n\n/**\n * Handles combobox keyboard events. Call from the trigger's keydown handler.\n * Mutates `event` (preventDefault/stopPropagation) when the key is handled.\n */\nexport function handleComboboxKeydown(\n event: KeyboardEvent,\n context: ComboboxKeyboardContext,\n options: ComboboxKeyboardOptions = {}\n): void {\n if (context.disabled) return;\n\n const {\n enableTypeahead = true,\n keysToOpen = DEFAULT_KEYS_TO_OPEN,\n keysToOpenNoPreventDefault = [],\n spaceCommits = true,\n } = options;\n\n // --- Closed state: ArrowDown/ArrowUp/Enter/Space open + set active ---\n if (!context.open) {\n if (keysToOpen.includes(event.key)) {\n const noPrevent = keysToOpenNoPreventDefault.includes(event.key);\n if (!noPrevent) {\n event.preventDefault();\n }\n context.openSelect();\n ensureActiveAndSync(\n context.listbox,\n context.setActiveDescendantId,\n event.key === 'ArrowUp' ? 'last' : 'first'\n );\n }\n return;\n }\n\n // --- Open state ---\n\n // Tab: close and allow browser to move focus (do not preventDefault)\n if (event.key === 'Tab') {\n context.close();\n return;\n }\n\n // Escape: close\n if (event.key === 'Escape') {\n if (!event.defaultPrevented) {\n event.preventDefault();\n event.stopPropagation();\n context.close();\n }\n return;\n }\n\n // Space: when spaceCommits (Select) → commit; when !spaceCommits (AutoComplete) → return so input receives it\n if (event.key === ' ' || event.key === 'Spacebar') {\n if (spaceCommits) {\n event.preventDefault();\n context.listbox?.commitActive();\n }\n return;\n }\n\n // Typeahead: single char (exclude Space, modifiers) → route to listbox or ignore\n if (\n enableTypeahead &&\n event.key.length === 1 &&\n event.key !== ' ' &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n const moved = context.listbox?.typeahead?.(event.key) ?? false;\n if (moved) {\n syncActiveDescendant(context.listbox, context.setActiveDescendantId);\n event.preventDefault();\n }\n return;\n }\n\n // Arrow keys, Home, End, etc.\n const moved = context.listbox?.handleKey(event.key, event.shiftKey) ?? false;\n if (moved) {\n syncActiveDescendant(context.listbox, context.setActiveDescendantId);\n event.preventDefault();\n // Single-select: listbox did select-active. Still need commitActive to close overlay.\n // Multi-select: listbox did toggle-active. Do NOT call commitActive—it would toggle again.\n if (event.key === 'Enter' && !context.multiSelect) {\n context.listbox?.commitActive();\n }\n return;\n }\n\n // Enter: listbox did not handle it (no active). Fallback: close if we have a selection.\n if (event.key === 'Enter') {\n event.preventDefault();\n context.listbox?.commitActive();\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared listbox bridge contract for combobox-based controls (Select, AutoComplete).
3
+ * Used by SelectTrigger and AutocompleteInput to communicate with the listbox.
4
+ */
5
+ export interface ComboboxListboxApi {
6
+ /** Host element id of the listbox (for aria-controls). */
7
+ getHostId(): string | null;
8
+ /** Currently active/focused option id (for aria-activedescendant). */
9
+ getActiveId(): string | null;
10
+ /** Ensure an option is active; pref 'first' | 'last' when opening. */
11
+ ensureActive(pref?: 'first' | 'last'): void;
12
+ /** Handle arrow keys, Home, End, etc. Returns true if focus/selection moved. */
13
+ handleKey(key: string, shiftKey?: boolean): boolean;
14
+ /** Typeahead by character. Optional (Autocomplete may omit). */
15
+ typeahead?: (key: string) => boolean;
16
+ /** Commit/select the active option (Enter/Space semantics). */
17
+ commitActive(): void;
18
+ }
19
+ //# sourceMappingURL=combobox.listbox-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.listbox-api.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.listbox-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;IAC3B,sEAAsE;IACtE,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;IAE7B,sEAAsE;IACtE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAE5C,gFAAgF;IAChF,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAEpD,gEAAgE;IAChE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAErC,+DAA+D;IAC/D,YAAY,IAAI,IAAI,CAAC;CACtB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared listbox bridge contract for combobox-based controls (Select, AutoComplete).
3
+ * Used by SelectTrigger and AutocompleteInput to communicate with the listbox.
4
+ */
5
+ //# sourceMappingURL=combobox.listbox-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.listbox-api.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/combobox.listbox-api.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * Shared listbox bridge contract for combobox-based controls (Select, AutoComplete).\n * Used by SelectTrigger and AutocompleteInput to communicate with the listbox.\n */\n\nexport interface ComboboxListboxApi {\n /** Host element id of the listbox (for aria-controls). */\n getHostId(): string | null;\n /** Currently active/focused option id (for aria-activedescendant). */\n getActiveId(): string | null;\n\n /** Ensure an option is active; pref 'first' | 'last' when opening. */\n ensureActive(pref?: 'first' | 'last'): void;\n\n /** Handle arrow keys, Home, End, etc. Returns true if focus/selection moved. */\n handleKey(key: string, shiftKey?: boolean): boolean;\n\n /** Typeahead by character. Optional (Autocomplete may omit). */\n typeahead?: (key: string) => boolean;\n\n /** Commit/select the active option (Enter/Space semantics). */\n commitActive(): void;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export { ensureActiveAndSync, syncActiveDescendant, type SetActiveDescendantId, } from './combobox.active';
2
+ export type { ComboboxListboxApi } from './combobox.listbox-api';
3
+ export { arraysEqual, normalizeToArray, normalizeToSingle, type ListboxValueShape, } from './combobox.commit';
4
+ export { handleComboboxKeydown, type ComboboxKeyboardContext, type ComboboxKeyboardOptions, } from './combobox.keyboard';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,qBAAqB,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ensureActiveAndSync, syncActiveDescendant, } from './combobox.active';
2
+ export { arraysEqual, normalizeToArray, normalizeToSingle, } from './combobox.commit';
3
+ export { handleComboboxKeydown, } from './combobox.keyboard';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/internal/combobox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC","sourcesContent":["export {\n ensureActiveAndSync,\n syncActiveDescendant,\n type SetActiveDescendantId,\n} from './combobox.active';\nexport type { ComboboxListboxApi } from './combobox.listbox-api';\nexport {\n arraysEqual,\n normalizeToArray,\n normalizeToSingle,\n type ListboxValueShape,\n} from './combobox.commit';\nexport {\n handleComboboxKeydown,\n type ComboboxKeyboardContext,\n type ComboboxKeyboardOptions,\n} from './combobox.keyboard';\n"]}