@hashicorp/design-system-components 4.13.0 → 4.14.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 (306) hide show
  1. package/declarations/components/hds/accordion/index.d.ts +1 -2
  2. package/declarations/components/hds/accordion/index.d.ts.map +1 -1
  3. package/declarations/components/hds/accordion/item/button.d.ts +1 -2
  4. package/declarations/components/hds/accordion/item/button.d.ts.map +1 -1
  5. package/declarations/components/hds/alert/index.d.ts +1 -28
  6. package/declarations/components/hds/alert/index.d.ts.map +1 -1
  7. package/declarations/components/hds/app-side-nav/index.d.ts +45 -0
  8. package/declarations/components/hds/app-side-nav/index.d.ts.map +1 -0
  9. package/declarations/components/hds/app-side-nav/list/back-link.d.ts +15 -0
  10. package/declarations/components/hds/app-side-nav/list/back-link.d.ts.map +1 -0
  11. package/declarations/components/hds/app-side-nav/list/index.d.ts +32 -0
  12. package/declarations/components/hds/app-side-nav/list/index.d.ts.map +1 -0
  13. package/declarations/components/hds/app-side-nav/list/item.d.ts +14 -0
  14. package/declarations/components/hds/app-side-nav/list/item.d.ts.map +1 -0
  15. package/declarations/components/hds/app-side-nav/list/link.d.ts +24 -0
  16. package/declarations/components/hds/app-side-nav/list/link.d.ts.map +1 -0
  17. package/declarations/components/hds/app-side-nav/list/title.d.ts +19 -0
  18. package/declarations/components/hds/app-side-nav/list/title.d.ts.map +1 -0
  19. package/declarations/components/hds/app-side-nav/portal/index.d.ts +27 -0
  20. package/declarations/components/hds/app-side-nav/portal/index.d.ts.map +1 -0
  21. package/declarations/components/hds/app-side-nav/portal/target.d.ts +37 -0
  22. package/declarations/components/hds/app-side-nav/portal/target.d.ts.map +1 -0
  23. package/declarations/components/hds/app-side-nav/toggle-button.d.ts +15 -0
  24. package/declarations/components/hds/app-side-nav/toggle-button.d.ts.map +1 -0
  25. package/declarations/components/hds/button-set/index.d.ts +1 -1
  26. package/declarations/components/hds/button-set/index.d.ts.map +1 -1
  27. package/declarations/components/hds/dropdown/index.d.ts +3 -0
  28. package/declarations/components/hds/dropdown/index.d.ts.map +1 -1
  29. package/declarations/components/hds/dropdown/toggle/chevron.d.ts +1 -1
  30. package/declarations/components/hds/dropdown/toggle/chevron.d.ts.map +1 -1
  31. package/declarations/components/hds/flyout/body.d.ts +2 -1
  32. package/declarations/components/hds/flyout/body.d.ts.map +1 -1
  33. package/declarations/components/hds/flyout/description.d.ts +3 -3
  34. package/declarations/components/hds/flyout/description.d.ts.map +1 -1
  35. package/declarations/components/hds/flyout/footer.d.ts +1 -2
  36. package/declarations/components/hds/flyout/footer.d.ts.map +1 -1
  37. package/declarations/components/hds/form/character-count/index.d.ts +1 -2
  38. package/declarations/components/hds/form/character-count/index.d.ts.map +1 -1
  39. package/declarations/components/hds/form/checkbox/group.d.ts +1 -1
  40. package/declarations/components/hds/form/checkbox/group.d.ts.map +1 -1
  41. package/declarations/components/hds/form/file-input/base.d.ts +1 -1
  42. package/declarations/components/hds/form/file-input/base.d.ts.map +1 -1
  43. package/declarations/components/hds/form/file-input/field.d.ts +1 -1
  44. package/declarations/components/hds/form/file-input/field.d.ts.map +1 -1
  45. package/declarations/components/hds/form/masked-input/base.d.ts +1 -23
  46. package/declarations/components/hds/form/masked-input/base.d.ts.map +1 -1
  47. package/declarations/components/hds/form/masked-input/field.d.ts +1 -1
  48. package/declarations/components/hds/form/masked-input/field.d.ts.map +1 -1
  49. package/declarations/components/hds/form/radio/group.d.ts +1 -1
  50. package/declarations/components/hds/form/radio/group.d.ts.map +1 -1
  51. package/declarations/components/hds/form/radio-card/group.d.ts +1 -1
  52. package/declarations/components/hds/form/radio-card/group.d.ts.map +1 -1
  53. package/declarations/components/hds/form/select/field.d.ts +1 -1
  54. package/declarations/components/hds/form/select/field.d.ts.map +1 -1
  55. package/declarations/components/hds/form/super-select/after-options.d.ts +1 -1
  56. package/declarations/components/hds/form/super-select/after-options.d.ts.map +1 -1
  57. package/declarations/components/hds/form/super-select/multiple/field.d.ts +1 -2
  58. package/declarations/components/hds/form/super-select/multiple/field.d.ts.map +1 -1
  59. package/declarations/components/hds/form/super-select/option-group.d.ts +1 -2
  60. package/declarations/components/hds/form/super-select/option-group.d.ts.map +1 -1
  61. package/declarations/components/hds/form/super-select/placeholder.d.ts +1 -1
  62. package/declarations/components/hds/form/super-select/placeholder.d.ts.map +1 -1
  63. package/declarations/components/hds/form/super-select/single/field.d.ts +1 -2
  64. package/declarations/components/hds/form/super-select/single/field.d.ts.map +1 -1
  65. package/declarations/components/hds/form/text-input/field.d.ts +3 -18
  66. package/declarations/components/hds/form/text-input/field.d.ts.map +1 -1
  67. package/declarations/components/hds/form/textarea/field.d.ts +1 -1
  68. package/declarations/components/hds/form/textarea/field.d.ts.map +1 -1
  69. package/declarations/components/hds/form/toggle/base.d.ts +1 -1
  70. package/declarations/components/hds/form/toggle/base.d.ts.map +1 -1
  71. package/declarations/components/hds/form/toggle/group.d.ts +1 -1
  72. package/declarations/components/hds/form/toggle/group.d.ts.map +1 -1
  73. package/declarations/components/hds/modal/body.d.ts +2 -1
  74. package/declarations/components/hds/modal/body.d.ts.map +1 -1
  75. package/declarations/components/hds/page-header/index.d.ts +1 -1
  76. package/declarations/components/hds/page-header/index.d.ts.map +1 -1
  77. package/declarations/components/hds/pagination/compact/index.d.ts +1 -1
  78. package/declarations/components/hds/pagination/compact/index.d.ts.map +1 -1
  79. package/declarations/components/hds/pagination/info/index.d.ts +1 -2
  80. package/declarations/components/hds/pagination/info/index.d.ts.map +1 -1
  81. package/declarations/components/hds/pagination/nav/arrow.d.ts +1 -1
  82. package/declarations/components/hds/pagination/nav/arrow.d.ts.map +1 -1
  83. package/declarations/components/hds/pagination/nav/number.d.ts +1 -1
  84. package/declarations/components/hds/pagination/nav/number.d.ts.map +1 -1
  85. package/declarations/components/hds/pagination/numbered/index.d.ts +1 -1
  86. package/declarations/components/hds/pagination/numbered/index.d.ts.map +1 -1
  87. package/declarations/components/hds/pagination/size-selector/index.d.ts +1 -2
  88. package/declarations/components/hds/pagination/size-selector/index.d.ts.map +1 -1
  89. package/declarations/components/hds/popover-primitive/index.d.ts +1 -0
  90. package/declarations/components/hds/popover-primitive/index.d.ts.map +1 -1
  91. package/declarations/components/hds/reveal/index.d.ts +1 -2
  92. package/declarations/components/hds/reveal/index.d.ts.map +1 -1
  93. package/declarations/components/hds/rich-tooltip/index.d.ts +1 -2
  94. package/declarations/components/hds/rich-tooltip/index.d.ts.map +1 -1
  95. package/declarations/components/hds/segmented-group/index.d.ts +1 -1
  96. package/declarations/components/hds/segmented-group/index.d.ts.map +1 -1
  97. package/declarations/components/hds/separator/index.d.ts +1 -2
  98. package/declarations/components/hds/separator/index.d.ts.map +1 -1
  99. package/declarations/components/hds/side-nav/header/home-link.d.ts +1 -2
  100. package/declarations/components/hds/side-nav/header/home-link.d.ts.map +1 -1
  101. package/declarations/components/hds/side-nav/header/icon-button.d.ts +1 -2
  102. package/declarations/components/hds/side-nav/header/icon-button.d.ts.map +1 -1
  103. package/declarations/components/hds/side-nav/header/index.d.ts +1 -1
  104. package/declarations/components/hds/side-nav/header/index.d.ts.map +1 -1
  105. package/declarations/components/hds/side-nav/index.d.ts +10 -10
  106. package/declarations/components/hds/side-nav/index.d.ts.map +1 -1
  107. package/declarations/components/hds/side-nav/list/index.d.ts +6 -3
  108. package/declarations/components/hds/side-nav/list/index.d.ts.map +1 -1
  109. package/declarations/components/hds/side-nav/list/title.d.ts +8 -3
  110. package/declarations/components/hds/side-nav/list/title.d.ts.map +1 -1
  111. package/declarations/components/hds/side-nav/portal/index.d.ts +1 -1
  112. package/declarations/components/hds/side-nav/portal/index.d.ts.map +1 -1
  113. package/declarations/components/hds/side-nav/portal/target.d.ts +2 -3
  114. package/declarations/components/hds/side-nav/portal/target.d.ts.map +1 -1
  115. package/declarations/components/hds/side-nav/toggle-button.d.ts +1 -1
  116. package/declarations/components/hds/side-nav/toggle-button.d.ts.map +1 -1
  117. package/declarations/components/hds/stepper/step/indicator.d.ts +1 -2
  118. package/declarations/components/hds/stepper/step/indicator.d.ts.map +1 -1
  119. package/declarations/components/hds/stepper/task/indicator.d.ts +1 -2
  120. package/declarations/components/hds/stepper/task/indicator.d.ts.map +1 -1
  121. package/declarations/components/hds/table/index.d.ts +1 -0
  122. package/declarations/components/hds/table/index.d.ts.map +1 -1
  123. package/declarations/components/hds/table/th-selectable.d.ts +1 -0
  124. package/declarations/components/hds/table/th-selectable.d.ts.map +1 -1
  125. package/declarations/components/hds/tabs/index.d.ts +1 -2
  126. package/declarations/components/hds/tabs/index.d.ts.map +1 -1
  127. package/declarations/components/hds/tag/index.d.ts +1 -2
  128. package/declarations/components/hds/tag/index.d.ts.map +1 -1
  129. package/declarations/modifiers/hds-anchored-position.d.ts +10 -0
  130. package/declarations/modifiers/hds-anchored-position.d.ts.map +1 -1
  131. package/declarations/modifiers/hds-clipboard.d.ts.map +1 -1
  132. package/declarations/modifiers/hds-register-event.d.ts +9 -0
  133. package/declarations/modifiers/hds-register-event.d.ts.map +1 -1
  134. package/declarations/template-registry.d.ts +36 -0
  135. package/declarations/template-registry.d.ts.map +1 -1
  136. package/dist/components/hds/accordion/index.js.map +1 -1
  137. package/dist/components/hds/accordion/item/button.js.map +1 -1
  138. package/dist/components/hds/alert/description.js +2 -2
  139. package/dist/components/hds/alert/index.js +11 -33
  140. package/dist/components/hds/alert/index.js.map +1 -1
  141. package/dist/components/hds/app-footer/item.js +2 -2
  142. package/dist/components/hds/app-footer/link.js +2 -2
  143. package/dist/components/hds/app-frame/parts/footer.js +2 -2
  144. package/dist/components/hds/app-frame/parts/header.js +2 -2
  145. package/dist/components/hds/app-frame/parts/main.js +2 -2
  146. package/dist/components/hds/app-frame/parts/modals.js +2 -2
  147. package/dist/components/hds/app-frame/parts/sidebar.js +2 -2
  148. package/dist/components/hds/app-side-nav/index.js +187 -0
  149. package/dist/components/hds/app-side-nav/index.js.map +1 -0
  150. package/dist/components/hds/app-side-nav/list/back-link.js +16 -0
  151. package/dist/components/hds/app-side-nav/list/back-link.js.map +1 -0
  152. package/dist/components/hds/app-side-nav/list/index.js +33 -0
  153. package/dist/components/hds/app-side-nav/list/index.js.map +1 -0
  154. package/dist/components/hds/app-side-nav/list/item.js +16 -0
  155. package/dist/components/hds/app-side-nav/list/item.js.map +1 -0
  156. package/dist/components/hds/app-side-nav/list/link.js +16 -0
  157. package/dist/components/hds/app-side-nav/list/link.js.map +1 -0
  158. package/dist/components/hds/app-side-nav/list/title.js +29 -0
  159. package/dist/components/hds/app-side-nav/list/title.js.map +1 -0
  160. package/dist/components/hds/app-side-nav/portal/index.js +16 -0
  161. package/dist/components/hds/app-side-nav/portal/index.js.map +1 -0
  162. package/dist/components/hds/app-side-nav/portal/target.js +173 -0
  163. package/dist/components/hds/app-side-nav/portal/target.js.map +1 -0
  164. package/dist/components/hds/app-side-nav/toggle-button.js +16 -0
  165. package/dist/components/hds/app-side-nav/toggle-button.js.map +1 -0
  166. package/dist/components/hds/application-state/body.js +2 -2
  167. package/dist/components/hds/application-state/footer.js +2 -2
  168. package/dist/components/hds/application-state/media.js +2 -2
  169. package/dist/components/hds/button-set/index.js +2 -2
  170. package/dist/components/hds/button-set/index.js.map +1 -1
  171. package/dist/components/hds/code-block/copy-button.js +2 -2
  172. package/dist/components/hds/code-block/description.js +2 -2
  173. package/dist/components/hds/dialog-primitive/body.js +2 -2
  174. package/dist/components/hds/dialog-primitive/description.js +2 -2
  175. package/dist/components/hds/dialog-primitive/overlay.js +2 -2
  176. package/dist/components/hds/dialog-primitive/wrapper.js +2 -2
  177. package/dist/components/hds/dropdown/footer.js +2 -2
  178. package/dist/components/hds/dropdown/header.js +2 -2
  179. package/dist/components/hds/dropdown/index.js +7 -3
  180. package/dist/components/hds/dropdown/index.js.map +1 -1
  181. package/dist/components/hds/dropdown/list-item/generic.js +2 -2
  182. package/dist/components/hds/dropdown/list-item/separator.js +2 -2
  183. package/dist/components/hds/dropdown/toggle/chevron.js +2 -2
  184. package/dist/components/hds/dropdown/toggle/chevron.js.map +1 -1
  185. package/dist/components/hds/flyout/body.js +2 -2
  186. package/dist/components/hds/flyout/body.js.map +1 -1
  187. package/dist/components/hds/flyout/description.js +2 -2
  188. package/dist/components/hds/flyout/description.js.map +1 -1
  189. package/dist/components/hds/flyout/footer.js.map +1 -1
  190. package/dist/components/hds/form/character-count/index.js.map +1 -1
  191. package/dist/components/hds/form/checkbox/base.js +2 -2
  192. package/dist/components/hds/form/checkbox/field.js +2 -2
  193. package/dist/components/hds/form/checkbox/group.js +2 -2
  194. package/dist/components/hds/form/checkbox/group.js.map +1 -1
  195. package/dist/components/hds/form/error/message.js +2 -2
  196. package/dist/components/hds/form/file-input/base.js +2 -2
  197. package/dist/components/hds/form/file-input/base.js.map +1 -1
  198. package/dist/components/hds/form/file-input/field.js +2 -2
  199. package/dist/components/hds/form/file-input/field.js.map +1 -1
  200. package/dist/components/hds/form/masked-input/base.js +5 -34
  201. package/dist/components/hds/form/masked-input/base.js.map +1 -1
  202. package/dist/components/hds/form/masked-input/field.js +2 -2
  203. package/dist/components/hds/form/masked-input/field.js.map +1 -1
  204. package/dist/components/hds/form/radio/base.js +2 -2
  205. package/dist/components/hds/form/radio/field.js +2 -2
  206. package/dist/components/hds/form/radio/group.js +2 -2
  207. package/dist/components/hds/form/radio/group.js.map +1 -1
  208. package/dist/components/hds/form/radio-card/description.js +2 -2
  209. package/dist/components/hds/form/radio-card/group.js +2 -2
  210. package/dist/components/hds/form/radio-card/group.js.map +1 -1
  211. package/dist/components/hds/form/radio-card/label.js +2 -2
  212. package/dist/components/hds/form/select/field.js +2 -2
  213. package/dist/components/hds/form/select/field.js.map +1 -1
  214. package/dist/components/hds/form/super-select/after-options.js +2 -2
  215. package/dist/components/hds/form/super-select/after-options.js.map +1 -1
  216. package/dist/components/hds/form/super-select/multiple/field.js.map +1 -1
  217. package/dist/components/hds/form/super-select/option-group.js.map +1 -1
  218. package/dist/components/hds/form/super-select/placeholder.js +2 -2
  219. package/dist/components/hds/form/super-select/placeholder.js.map +1 -1
  220. package/dist/components/hds/form/super-select/single/field.js.map +1 -1
  221. package/dist/components/hds/form/text-input/field.js +10 -33
  222. package/dist/components/hds/form/text-input/field.js.map +1 -1
  223. package/dist/components/hds/form/textarea/field.js +2 -2
  224. package/dist/components/hds/form/textarea/field.js.map +1 -1
  225. package/dist/components/hds/form/toggle/base.js +2 -2
  226. package/dist/components/hds/form/toggle/base.js.map +1 -1
  227. package/dist/components/hds/form/toggle/field.js +2 -2
  228. package/dist/components/hds/form/toggle/group.js +2 -2
  229. package/dist/components/hds/form/toggle/group.js.map +1 -1
  230. package/dist/components/hds/form/visibility-toggle/index.js +2 -2
  231. package/dist/components/hds/modal/body.js +2 -2
  232. package/dist/components/hds/modal/body.js.map +1 -1
  233. package/dist/components/hds/page-header/actions.js +2 -2
  234. package/dist/components/hds/page-header/badges.js +2 -2
  235. package/dist/components/hds/page-header/description.js +2 -2
  236. package/dist/components/hds/page-header/index.js +2 -2
  237. package/dist/components/hds/page-header/index.js.map +1 -1
  238. package/dist/components/hds/page-header/subtitle.js +2 -2
  239. package/dist/components/hds/page-header/title.js +2 -2
  240. package/dist/components/hds/pagination/compact/index.js +4 -3
  241. package/dist/components/hds/pagination/compact/index.js.map +1 -1
  242. package/dist/components/hds/pagination/info/index.js.map +1 -1
  243. package/dist/components/hds/pagination/nav/arrow.js.map +1 -1
  244. package/dist/components/hds/pagination/nav/ellipsis.js +2 -2
  245. package/dist/components/hds/pagination/nav/number.js.map +1 -1
  246. package/dist/components/hds/pagination/numbered/index.js +5 -7
  247. package/dist/components/hds/pagination/numbered/index.js.map +1 -1
  248. package/dist/components/hds/pagination/size-selector/index.js.map +1 -1
  249. package/dist/components/hds/popover-primitive/index.js +4 -5
  250. package/dist/components/hds/popover-primitive/index.js.map +1 -1
  251. package/dist/components/hds/reveal/index.js.map +1 -1
  252. package/dist/components/hds/rich-tooltip/index.js.map +1 -1
  253. package/dist/components/hds/segmented-group/index.js +2 -2
  254. package/dist/components/hds/segmented-group/index.js.map +1 -1
  255. package/dist/components/hds/separator/index.js.map +1 -1
  256. package/dist/components/hds/side-nav/base.js +3 -3
  257. package/dist/components/hds/side-nav/base.js.map +1 -1
  258. package/dist/components/hds/side-nav/header/home-link.js.map +1 -1
  259. package/dist/components/hds/side-nav/header/icon-button.js.map +1 -1
  260. package/dist/components/hds/side-nav/header/index.js +2 -2
  261. package/dist/components/hds/side-nav/header/index.js.map +1 -1
  262. package/dist/components/hds/side-nav/index.js +37 -36
  263. package/dist/components/hds/side-nav/index.js.map +1 -1
  264. package/dist/components/hds/side-nav/list/back-link.js +2 -2
  265. package/dist/components/hds/side-nav/list/index.js +27 -10
  266. package/dist/components/hds/side-nav/list/index.js.map +1 -1
  267. package/dist/components/hds/side-nav/list/item.js +2 -2
  268. package/dist/components/hds/side-nav/list/link.js +2 -2
  269. package/dist/components/hds/side-nav/list/title.js +23 -10
  270. package/dist/components/hds/side-nav/list/title.js.map +1 -1
  271. package/dist/components/hds/side-nav/portal/index.js +2 -2
  272. package/dist/components/hds/side-nav/portal/index.js.map +1 -1
  273. package/dist/components/hds/side-nav/portal/target.js.map +1 -1
  274. package/dist/components/hds/side-nav/toggle-button.js +2 -2
  275. package/dist/components/hds/side-nav/toggle-button.js.map +1 -1
  276. package/dist/components/hds/stepper/step/indicator.js.map +1 -1
  277. package/dist/components/hds/stepper/task/indicator.js.map +1 -1
  278. package/dist/components/hds/table/index.js +6 -8
  279. package/dist/components/hds/table/index.js.map +1 -1
  280. package/dist/components/hds/table/th-selectable.js +4 -5
  281. package/dist/components/hds/table/th-selectable.js.map +1 -1
  282. package/dist/components/hds/tabs/index.js +2 -3
  283. package/dist/components/hds/tabs/index.js.map +1 -1
  284. package/dist/components/hds/tag/index.js.map +1 -1
  285. package/dist/components/hds/toast/index.js +3 -3
  286. package/dist/components/hds/toast/index.js.map +1 -1
  287. package/dist/components/hds/tooltip-button/index.js.map +1 -1
  288. package/dist/components/hds/yield/index.js +2 -2
  289. package/dist/modifiers/hds-anchored-position.js +15 -16
  290. package/dist/modifiers/hds-anchored-position.js.map +1 -1
  291. package/dist/modifiers/hds-clipboard.js +15 -6
  292. package/dist/modifiers/hds-clipboard.js.map +1 -1
  293. package/dist/modifiers/hds-register-event.js.map +1 -1
  294. package/dist/styles/@hashicorp/design-system-components.css +41 -293
  295. package/dist/styles/@hashicorp/design-system-components.scss +2 -1
  296. package/dist/styles/components/app-side-nav/content.scss +182 -0
  297. package/dist/styles/components/app-side-nav/index.scss +9 -0
  298. package/dist/styles/components/app-side-nav/main.scss +147 -0
  299. package/dist/styles/components/app-side-nav/toggle-button.scss +101 -0
  300. package/dist/styles/components/app-side-nav/vars.scss +36 -0
  301. package/dist/styles/components/dropdown.scss +6 -0
  302. package/dist/styles/components/side-nav/content.scss +5 -0
  303. package/package.json +5 -5
  304. package/dist/_app_/components/hds/app-header/home-link.js +0 -1
  305. package/dist/_app_/components/hds/app-header/index.js +0 -1
  306. package/dist/_app_/components/hds/app-header/menu-button.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/tabs/index.hbs","../../../../src/components/hds/tabs/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n{{! template-lint-disable no-invalid-role }}\\n<div\\n class={{this.classNames}}\\n {{did-insert this.didInsert}}\\n {{did-update this.didUpdateSelectedTabIndex this.selectedTabIndex}}\\n {{did-update this.didUpdateSelectedTabId this.selectedTabId}}\\n {{did-update this.didUpdateParentVisibility @isParentVisible}}\\n ...attributes\\n>\\n <div class=\\\"hds-tabs__tablist-wrapper\\\">\\n <ul class=\\\"hds-tabs__tablist\\\" role=\\\"tablist\\\">\\n {{yield\\n (hash\\n Tab=(component\\n \\\"hds/tabs/tab\\\"\\n didInsertNode=this.didInsertTab\\n didUpdateNode=this.didUpdateTab\\n willDestroyNode=this.willDestroyTab\\n tabIds=this.tabIds\\n selectedTabIndex=this.selectedTabIndex\\n onClick=this.onClick\\n onKeyUp=this.onKeyUp\\n )\\n )\\n }}\\n <li class=\\\"hds-tabs__tab-indicator\\\" role=\\\"presentation\\\"></li>\\n </ul>\\n </div>\\n\\n {{yield\\n (hash\\n Panel=(component\\n \\\"hds/tabs/panel\\\"\\n didInsertNode=this.didInsertPanel\\n willDestroyNode=this.willDestroyPanel\\n tabIds=this.tabIds\\n panelIds=this.panelIds\\n selectedTabIndex=this.selectedTabIndex\\n )\\n )\\n }}\\n</div>\\n{{! template-lint-enable no-invalid-role }}\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { assert, warn } from '@ember/debug';\nimport { next, schedule } from '@ember/runloop';\nimport { HdsTabsSizeValues } from './types.ts';\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsTabsTabSignature } from './tab';\nimport type { HdsTabsPanelSignature } from './panel';\nimport type { HdsTabsTabIds, HdsTabsPanelIds, HdsTabsSizes } from './types.ts';\n\nexport const DEFAULT_SIZE: HdsTabsSizes = 'medium' as const;\nexport const SIZES: HdsTabsSizes[] = Object.values(HdsTabsSizeValues);\ninterface HdsTabsSignature {\n Args: {\n size?: HdsTabsSizes;\n onClickTab?: (event: MouseEvent, tabIndex: number) => void;\n selectedTabIndex?: HdsTabsTabSignature['Args']['selectedTabIndex'];\n isParentVisible?: boolean;\n };\n Blocks: {\n default: [\n {\n Tab?: ComponentLike<HdsTabsTabSignature>;\n Panel?: ComponentLike<HdsTabsPanelSignature>;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsTabs extends Component<HdsTabsSignature> {\n @tracked tabNodes: HTMLButtonElement[] = [];\n @tracked tabIds: HdsTabsTabIds = [];\n @tracked panelNodes: HTMLElement[] = [];\n @tracked panelIds: HdsTabsPanelIds = [];\n @tracked _selectedTabIndex = this.args.selectedTabIndex ?? 0;\n @tracked selectedTabId?: string;\n @tracked isControlled: boolean;\n\n /**\n * Sets the size of Tabs\n * Accepted values: medium, large\n *\n * @param size\n * @type {string}\n * @default 'medium'\n */\n get size(): HdsTabsSizes {\n const { size = DEFAULT_SIZE } = this.args;\n\n assert(\n `@size for \"Hds::Tabs\" must be one of the following: ${SIZES.join(\n ', '\n )}; received: ${size}`,\n SIZES.includes(size)\n );\n\n return size;\n }\n\n constructor(owner: unknown, args: HdsTabsSignature['Args']) {\n super(owner, args);\n\n // this is to determine if the \"selected\" tab logic is controlled in the consumers' code or is maintained as an internal state\n this.isControlled = this.args.selectedTabIndex !== undefined;\n }\n\n get selectedTabIndex(): number {\n if (this.isControlled) {\n return this.args.selectedTabIndex!;\n } else {\n return this._selectedTabIndex;\n }\n }\n\n set selectedTabIndex(value) {\n if (this.isControlled) {\n // noop\n } else {\n this._selectedTabIndex = value;\n }\n }\n\n /**\n * Get the class names to apply to the component.\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-tabs'];\n\n // add a class based on the @size argument\n classes.push(`hds-tabs--size-${this.size}`);\n\n return classes.join(' ');\n }\n\n @action\n didInsert(): void {\n assert(\n 'The number of Tabs must be equal to the number of Panels',\n this.tabNodes.length === this.panelNodes.length\n );\n\n if (this.selectedTabId) {\n this.selectedTabIndex = this.tabIds.indexOf(this.selectedTabId);\n }\n\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.setTabIndicator();\n });\n }\n\n @action\n didUpdateSelectedTabIndex(): void {\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.setTabIndicator();\n });\n }\n\n @action\n didUpdateSelectedTabId(): void {\n // if the selected tab is set dynamically (eg. in a `each` loop)\n // the `Tab` nodes will be re-inserted/rendered, which means the `this.selectedTabId` variable changes\n // but the parent `Tabs` component has already been rendered/inserted but doesn't re-render\n // so the value of the `selectedTabIndex` is not updated, unless we trigger a recalculation\n // using the `did-update` modifier that checks for changes in the `this.selectedTabId` variable\n if (this.selectedTabId) {\n this.selectedTabIndex = this.tabIds.indexOf(this.selectedTabId);\n }\n }\n\n @action\n didUpdateParentVisibility(): void {\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.setTabIndicator();\n });\n }\n\n @action\n didInsertTab(element: HTMLButtonElement, isSelected?: boolean): void {\n this.tabNodes = [...this.tabNodes, element];\n this.tabIds = [...this.tabIds, element.id];\n if (isSelected) {\n this.selectedTabId = element.id;\n }\n }\n\n @action\n didUpdateTab(tabIndex: number, isSelected?: boolean): void {\n if (isSelected) {\n this.selectedTabIndex = tabIndex;\n }\n this.setTabIndicator();\n }\n\n @action\n willDestroyTab(element: HTMLButtonElement): void {\n this.tabNodes = this.tabNodes.filter(\n (node): boolean => node.id !== element.id\n );\n this.tabIds = this.tabIds.filter((tabId): boolean => tabId !== element.id);\n }\n\n @action\n didInsertPanel(element: HTMLElement, panelId: string): void {\n this.panelNodes = [...this.panelNodes, element];\n this.panelIds = [...this.panelIds, panelId];\n }\n\n @action\n willDestroyPanel(element: HTMLElement): void {\n this.panelNodes = this.panelNodes.filter(\n (node): boolean => node.id !== element.id\n );\n this.panelIds = this.panelIds.filter(\n (panelId): boolean => panelId !== element.id\n );\n }\n\n @action\n onClick(event: MouseEvent, tabIndex: number): void {\n this.selectedTabIndex = tabIndex;\n this.setTabIndicator();\n\n // invoke the callback function if it's provided as argument\n if (typeof this.args.onClickTab === 'function') {\n this.args.onClickTab(event, tabIndex);\n }\n }\n\n @action\n onKeyUp(tabIndex: number, event: KeyboardEvent): void {\n const leftArrow = 'ArrowLeft';\n const rightArrow = 'ArrowRight';\n const enterKey = 'Enter';\n const spaceKey = ' ';\n\n if (event.key === rightArrow) {\n const nextTabIndex = (tabIndex + 1) % this.tabIds.length;\n this.focusTab(nextTabIndex, event);\n } else if (event.key === leftArrow) {\n const prevTabIndex =\n (tabIndex + this.tabIds.length - 1) % this.tabIds.length;\n this.focusTab(prevTabIndex, event);\n } else if (event.key === enterKey || event.key === spaceKey) {\n this.selectedTabIndex = tabIndex;\n }\n // scroll selected tab into view (it may be out of view when activated using a keyboard with `prev/next`)\n const parentNode = this.tabNodes[this.selectedTabIndex]?.parentNode;\n if (parentNode instanceof HTMLElement) {\n parentNode.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }\n\n // Focus tab for keyboard & mouse navigation:\n focusTab(tabIndex: number, event: KeyboardEvent): void {\n event.preventDefault();\n this.tabNodes[tabIndex]?.focus();\n }\n\n setTabIndicator(): void {\n // eslint-disable-next-line ember/no-runloop\n next((): void => {\n const tabElem = this.tabNodes[this.selectedTabIndex];\n\n if (tabElem != null) {\n const tabElemParentNode = tabElem.parentNode as HTMLElement;\n const tabsElemClosestList = tabElem.closest(\n '.hds-tabs__tablist'\n ) as HTMLElement;\n\n // this condition is `null` if any of the parents has `display: none`\n if (tabElemParentNode.offsetParent) {\n const tabLeftPos = tabElemParentNode.offsetLeft;\n const tabWidth = tabElemParentNode.offsetWidth;\n\n // Set CSS custom properties for indicator\n tabsElemClosestList.style.setProperty(\n '--indicator-left-pos',\n tabLeftPos + 'px'\n );\n tabsElemClosestList.style.setProperty(\n '--indicator-width',\n tabWidth + 'px'\n );\n }\n } else {\n let message = '';\n message +=\n '\"Hds::Tabs\" has tried to set the indicator for an element that doesn\\'t exist';\n if (this.tabNodes.length === 0) {\n message +=\n ' (the array `this.tabNodes` is empty, there are no tabs, probably already destroyed)';\n } else {\n message += ` (the value ${\n this.selectedTabIndex\n } of \\`this.selectedTabIndex\\` is out of bound for the array \\`this.tabNodes\\`, whose index range is [0 - ${\n this.tabNodes.length - 1\n }])`;\n }\n // https://api.emberjs.com/ember/5.3/classes/@ember%2Fdebug/methods/warn?anchor=warn\n warn(message, true, {\n id: 'hds-debug.tabs.setTabIndicator-tabElem-not-available',\n });\n }\n });\n }\n}\n"],"names":["DEFAULT_SIZE","SIZES","Object","values","HdsTabsSizeValues","HdsTabs","_class","Component","size","args","assert","join","includes","constructor","owner","_initializerDefineProperty","_descriptor","_descriptor2","_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","isControlled","selectedTabIndex","undefined","_selectedTabIndex","value","classNames","classes","push","didInsert","tabNodes","length","panelNodes","selectedTabId","tabIds","indexOf","schedule","setTabIndicator","didUpdateSelectedTabIndex","didUpdateSelectedTabId","didUpdateParentVisibility","didInsertTab","element","isSelected","id","didUpdateTab","tabIndex","willDestroyTab","filter","node","tabId","didInsertPanel","panelId","panelIds","willDestroyPanel","onClick","event","onClickTab","onKeyUp","leftArrow","rightArrow","enterKey","spaceKey","key","nextTabIndex","focusTab","prevTabIndex","parentNode","HTMLElement","scrollIntoView","behavior","block","inline","preventDefault","focus","next","tabElem","tabElemParentNode","tabsElemClosestList","closest","offsetParent","tabLeftPos","offsetLeft","tabWidth","offsetWidth","style","setProperty","message","warn","_applyDecoratedDescriptor","prototype","tracked","configurable","enumerable","writable","initializer","action","getOwnPropertyDescriptor","setComponentTemplate","TEMPLATE"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/tabs/index.hbs","../../../../src/components/hds/tabs/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n{{! template-lint-disable no-invalid-role }}\\n<div\\n class={{this.classNames}}\\n {{did-insert this.didInsert}}\\n {{did-update this.didUpdateSelectedTabIndex this.selectedTabIndex}}\\n {{did-update this.didUpdateSelectedTabId this.selectedTabId}}\\n {{did-update this.didUpdateParentVisibility @isParentVisible}}\\n ...attributes\\n>\\n <div class=\\\"hds-tabs__tablist-wrapper\\\">\\n <ul class=\\\"hds-tabs__tablist\\\" role=\\\"tablist\\\">\\n {{yield\\n (hash\\n Tab=(component\\n \\\"hds/tabs/tab\\\"\\n didInsertNode=this.didInsertTab\\n didUpdateNode=this.didUpdateTab\\n willDestroyNode=this.willDestroyTab\\n tabIds=this.tabIds\\n selectedTabIndex=this.selectedTabIndex\\n onClick=this.onClick\\n onKeyUp=this.onKeyUp\\n )\\n )\\n }}\\n <li class=\\\"hds-tabs__tab-indicator\\\" role=\\\"presentation\\\"></li>\\n </ul>\\n </div>\\n\\n {{yield\\n (hash\\n Panel=(component\\n \\\"hds/tabs/panel\\\"\\n didInsertNode=this.didInsertPanel\\n willDestroyNode=this.willDestroyPanel\\n tabIds=this.tabIds\\n panelIds=this.panelIds\\n selectedTabIndex=this.selectedTabIndex\\n )\\n )\\n }}\\n</div>\\n{{! template-lint-enable no-invalid-role }}\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { assert, warn } from '@ember/debug';\nimport { next, schedule } from '@ember/runloop';\nimport { HdsTabsSizeValues } from './types.ts';\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsTabsTabSignature } from './tab';\nimport type { HdsTabsPanelSignature } from './panel';\nimport type { HdsTabsTabIds, HdsTabsPanelIds, HdsTabsSizes } from './types.ts';\n\nexport const DEFAULT_SIZE: HdsTabsSizes = 'medium' as const;\nexport const SIZES: HdsTabsSizes[] = Object.values(HdsTabsSizeValues);\nexport interface HdsTabsSignature {\n Args: {\n size?: HdsTabsSizes;\n onClickTab?: (event: MouseEvent, tabIndex: number) => void;\n selectedTabIndex?: HdsTabsTabSignature['Args']['selectedTabIndex'];\n isParentVisible?: boolean;\n };\n Blocks: {\n default: [\n {\n Tab?: ComponentLike<HdsTabsTabSignature>;\n Panel?: ComponentLike<HdsTabsPanelSignature>;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsTabs extends Component<HdsTabsSignature> {\n @tracked tabNodes: HTMLButtonElement[] = [];\n @tracked tabIds: HdsTabsTabIds = [];\n @tracked panelNodes: HTMLElement[] = [];\n @tracked panelIds: HdsTabsPanelIds = [];\n @tracked _selectedTabIndex;\n @tracked selectedTabId?: string;\n @tracked isControlled: boolean;\n\n /**\n * Sets the size of Tabs\n * Accepted values: medium, large\n *\n * @param size\n * @type {string}\n * @default 'medium'\n */\n get size(): HdsTabsSizes {\n const { size = DEFAULT_SIZE } = this.args;\n\n assert(\n `@size for \"Hds::Tabs\" must be one of the following: ${SIZES.join(\n ', '\n )}; received: ${size}`,\n SIZES.includes(size)\n );\n\n return size;\n }\n\n constructor(owner: unknown, args: HdsTabsSignature['Args']) {\n super(owner, args);\n\n // this is to determine if the \"selected\" tab logic is controlled in the consumers' code or is maintained as an internal state\n this.isControlled = this.args.selectedTabIndex !== undefined;\n this._selectedTabIndex = this.args.selectedTabIndex ?? 0;\n }\n\n get selectedTabIndex(): number {\n if (this.isControlled) {\n return this.args.selectedTabIndex!;\n } else {\n return this._selectedTabIndex;\n }\n }\n\n set selectedTabIndex(value) {\n if (this.isControlled) {\n // noop\n } else {\n this._selectedTabIndex = value;\n }\n }\n\n /**\n * Get the class names to apply to the component.\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-tabs'];\n\n // add a class based on the @size argument\n classes.push(`hds-tabs--size-${this.size}`);\n\n return classes.join(' ');\n }\n\n @action\n didInsert(): void {\n assert(\n 'The number of Tabs must be equal to the number of Panels',\n this.tabNodes.length === this.panelNodes.length\n );\n\n if (this.selectedTabId) {\n this.selectedTabIndex = this.tabIds.indexOf(this.selectedTabId);\n }\n\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.setTabIndicator();\n });\n }\n\n @action\n didUpdateSelectedTabIndex(): void {\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.setTabIndicator();\n });\n }\n\n @action\n didUpdateSelectedTabId(): void {\n // if the selected tab is set dynamically (eg. in a `each` loop)\n // the `Tab` nodes will be re-inserted/rendered, which means the `this.selectedTabId` variable changes\n // but the parent `Tabs` component has already been rendered/inserted but doesn't re-render\n // so the value of the `selectedTabIndex` is not updated, unless we trigger a recalculation\n // using the `did-update` modifier that checks for changes in the `this.selectedTabId` variable\n if (this.selectedTabId) {\n this.selectedTabIndex = this.tabIds.indexOf(this.selectedTabId);\n }\n }\n\n @action\n didUpdateParentVisibility(): void {\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.setTabIndicator();\n });\n }\n\n @action\n didInsertTab(element: HTMLButtonElement, isSelected?: boolean): void {\n this.tabNodes = [...this.tabNodes, element];\n this.tabIds = [...this.tabIds, element.id];\n if (isSelected) {\n this.selectedTabId = element.id;\n }\n }\n\n @action\n didUpdateTab(tabIndex: number, isSelected?: boolean): void {\n if (isSelected) {\n this.selectedTabIndex = tabIndex;\n }\n this.setTabIndicator();\n }\n\n @action\n willDestroyTab(element: HTMLButtonElement): void {\n this.tabNodes = this.tabNodes.filter(\n (node): boolean => node.id !== element.id\n );\n this.tabIds = this.tabIds.filter((tabId): boolean => tabId !== element.id);\n }\n\n @action\n didInsertPanel(element: HTMLElement, panelId: string): void {\n this.panelNodes = [...this.panelNodes, element];\n this.panelIds = [...this.panelIds, panelId];\n }\n\n @action\n willDestroyPanel(element: HTMLElement): void {\n this.panelNodes = this.panelNodes.filter(\n (node): boolean => node.id !== element.id\n );\n this.panelIds = this.panelIds.filter(\n (panelId): boolean => panelId !== element.id\n );\n }\n\n @action\n onClick(event: MouseEvent, tabIndex: number): void {\n this.selectedTabIndex = tabIndex;\n this.setTabIndicator();\n\n // invoke the callback function if it's provided as argument\n if (typeof this.args.onClickTab === 'function') {\n this.args.onClickTab(event, tabIndex);\n }\n }\n\n @action\n onKeyUp(tabIndex: number, event: KeyboardEvent): void {\n const leftArrow = 'ArrowLeft';\n const rightArrow = 'ArrowRight';\n const enterKey = 'Enter';\n const spaceKey = ' ';\n\n if (event.key === rightArrow) {\n const nextTabIndex = (tabIndex + 1) % this.tabIds.length;\n this.focusTab(nextTabIndex, event);\n } else if (event.key === leftArrow) {\n const prevTabIndex =\n (tabIndex + this.tabIds.length - 1) % this.tabIds.length;\n this.focusTab(prevTabIndex, event);\n } else if (event.key === enterKey || event.key === spaceKey) {\n this.selectedTabIndex = tabIndex;\n }\n // scroll selected tab into view (it may be out of view when activated using a keyboard with `prev/next`)\n const parentNode = this.tabNodes[this.selectedTabIndex]?.parentNode;\n if (parentNode instanceof HTMLElement) {\n parentNode.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }\n\n // Focus tab for keyboard & mouse navigation:\n focusTab(tabIndex: number, event: KeyboardEvent): void {\n event.preventDefault();\n this.tabNodes[tabIndex]?.focus();\n }\n\n setTabIndicator(): void {\n // eslint-disable-next-line ember/no-runloop\n next((): void => {\n const tabElem = this.tabNodes[this.selectedTabIndex];\n\n if (tabElem != null) {\n const tabElemParentNode = tabElem.parentNode as HTMLElement;\n const tabsElemClosestList = tabElem.closest(\n '.hds-tabs__tablist'\n ) as HTMLElement;\n\n // this condition is `null` if any of the parents has `display: none`\n if (tabElemParentNode.offsetParent) {\n const tabLeftPos = tabElemParentNode.offsetLeft;\n const tabWidth = tabElemParentNode.offsetWidth;\n\n // Set CSS custom properties for indicator\n tabsElemClosestList.style.setProperty(\n '--indicator-left-pos',\n tabLeftPos + 'px'\n );\n tabsElemClosestList.style.setProperty(\n '--indicator-width',\n tabWidth + 'px'\n );\n }\n } else {\n let message = '';\n message +=\n '\"Hds::Tabs\" has tried to set the indicator for an element that doesn\\'t exist';\n if (this.tabNodes.length === 0) {\n message +=\n ' (the array `this.tabNodes` is empty, there are no tabs, probably already destroyed)';\n } else {\n message += ` (the value ${\n this.selectedTabIndex\n } of \\`this.selectedTabIndex\\` is out of bound for the array \\`this.tabNodes\\`, whose index range is [0 - ${\n this.tabNodes.length - 1\n }])`;\n }\n // https://api.emberjs.com/ember/5.3/classes/@ember%2Fdebug/methods/warn?anchor=warn\n warn(message, true, {\n id: 'hds-debug.tabs.setTabIndicator-tabElem-not-available',\n });\n }\n });\n }\n}\n"],"names":["DEFAULT_SIZE","SIZES","Object","values","HdsTabsSizeValues","HdsTabs","_class","Component","size","args","assert","join","includes","constructor","owner","_initializerDefineProperty","_descriptor","_descriptor2","_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","isControlled","selectedTabIndex","undefined","_selectedTabIndex","value","classNames","classes","push","didInsert","tabNodes","length","panelNodes","selectedTabId","tabIds","indexOf","schedule","setTabIndicator","didUpdateSelectedTabIndex","didUpdateSelectedTabId","didUpdateParentVisibility","didInsertTab","element","isSelected","id","didUpdateTab","tabIndex","willDestroyTab","filter","node","tabId","didInsertPanel","panelId","panelIds","willDestroyPanel","onClick","event","onClickTab","onKeyUp","leftArrow","rightArrow","enterKey","spaceKey","key","nextTabIndex","focusTab","prevTabIndex","parentNode","HTMLElement","scrollIntoView","behavior","block","inline","preventDefault","focus","next","tabElem","tabElemParentNode","tabsElemClosestList","closest","offsetParent","tabLeftPos","offsetLeft","tabWidth","offsetWidth","style","setProperty","message","warn","_applyDecoratedDescriptor","prototype","tracked","configurable","enumerable","writable","initializer","action","getOwnPropertyDescriptor","setComponentTemplate","TEMPLATE"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/tag/index.hbs","../../../../src/components/hds/tag/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n<Hds::Text::Body class={{this.classNames}} @tag=\\\"span\\\" @size=\\\"100\\\" @weight=\\\"medium\\\" @color=\\\"primary\\\" ...attributes>\\n {{#if this.onDismiss}}\\n <button class=\\\"hds-tag__dismiss\\\" type=\\\"button\\\" aria-label={{this.ariaLabel}} {{on \\\"click\\\" this.onDismiss}}>\\n <Hds::Icon class=\\\"hds-tag__dismiss-icon\\\" @name=\\\"x\\\" @size=\\\"16\\\" />\\n </button>\\n {{/if}}\\n {{#if (or @href @route)}}\\n <Hds::Interactive\\n class=\\\"hds-tag__link\\\"\\n @current-when={{@current-when}}\\n @models={{hds-link-to-models @model @models}}\\n @query={{hds-link-to-query @query}}\\n @replace={{@replace}}\\n @route={{@route}}\\n @isRouteExternal={{@isRouteExternal}}\\n @href={{@href}}\\n @isHrefExternal={{@isHrefExternal}}\\n >\\n {{this.text}}\\n </Hds::Interactive>\\n {{else}}\\n <span class=\\\"hds-tag__text\\\">\\n {{this.text}}\\n </span>\\n {{/if}}\\n</Hds::Text::Body>\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\n\nimport { HdsTagColorValues } from './types.ts';\nimport type { HdsTagColors } from './types.ts';\nimport type { HdsInteractiveSignature } from '../interactive/';\n\nexport const COLORS: string[] = Object.values(HdsTagColorValues);\nexport const DEFAULT_COLOR = HdsTagColorValues.Primary;\n\ninterface HdsTagSignature {\n Args: HdsInteractiveSignature['Args'] & {\n color?: HdsTagColors;\n text: string;\n ariaLabel?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onDismiss?: (event: MouseEvent, ...args: any[]) => void;\n };\n Element: HTMLSpanElement;\n}\n\nexport default class HdsTag extends Component<HdsTagSignature> {\n /**\n * @param onDismiss\n * @type {function}\n * @default () => {}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get onDismiss(): ((event: MouseEvent, ...args: any[]) => void) | false {\n const { onDismiss } = this.args;\n\n if (typeof onDismiss === 'function') {\n return onDismiss;\n } else {\n return false;\n }\n }\n\n /**\n * @param text\n * @type {string}\n * @description The text of the tag. If no text value is defined, an error will be thrown.\n */\n get text(): string {\n const { text } = this.args;\n\n assert('@text for \"Hds::Tag\" must have a valid value', text !== undefined);\n\n return text;\n }\n\n /**\n * @param ariaLabel\n * @type {string}\n * @default 'Dismiss'\n */\n get ariaLabel(): string {\n const tagAriaLabel = this.args.ariaLabel ?? 'Dismiss';\n return tagAriaLabel + ' ' + this.args.text;\n }\n\n /**\n * @param color\n * @type {string}\n * @default primary\n * @description Determines the color of link to be used; acceptable values are `primary` and `secondary`\n */\n get color(): HdsTagColors | false {\n if (this.args.href || this.args.route) {\n const { color = DEFAULT_COLOR } = this.args;\n assert(\n `@color for \"Hds::Tag\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n return color;\n } else if (this.args.color) {\n assert(\n '@color can only be applied to \"Hds::Tag\" along with either @href or @route',\n this.args.href || this.args.route\n );\n }\n return false;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-tag'];\n\n // add a class based on the @color argument\n if (this.color) {\n classes.push(`hds-tag--color-${this.color}`);\n }\n\n return classes.join(' ');\n }\n}\n"],"names":["COLORS","Object","values","HdsTagColorValues","DEFAULT_COLOR","Primary","HdsTag","Component","onDismiss","args","text","assert","undefined","ariaLabel","tagAriaLabel","color","href","route","join","includes","classNames","classes","push","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;AACA,eAAe,kBAAkB,CAAC,y+BAAy+B;;ACD3gC;AACA;AACA;AACA;;AASO,MAAMA,MAAgB,GAAGC,MAAM,CAACC,MAAM,CAACC,iBAAiB,EAAC;AACnDC,MAAAA,aAAa,GAAGD,iBAAiB,CAACE,QAAO;AAavC,MAAMC,MAAM,SAASC,SAAS,CAAkB;AAC7D;AACF;AACA;AACA;AACA;AACE;EACA,IAAIC,SAASA,GAA0D;IACrE,MAAM;AAAEA,MAAAA,SAAAA;KAAW,GAAG,IAAI,CAACC,IAAI,CAAA;AAE/B,IAAA,IAAI,OAAOD,SAAS,KAAK,UAAU,EAAE;AACnC,MAAA,OAAOA,SAAS,CAAA;AAClB,KAAC,MAAM;AACL,MAAA,OAAO,KAAK,CAAA;AACd,KAAA;AACF,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIE,IAAIA,GAAW;IACjB,MAAM;AAAEA,MAAAA,IAAAA;KAAM,GAAG,IAAI,CAACD,IAAI,CAAA;AAE1BE,IAAAA,MAAM,CAAC,8CAA8C,EAAED,IAAI,KAAKE,SAAS,CAAC,CAAA;AAE1E,IAAA,OAAOF,IAAI,CAAA;AACb,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIG,SAASA,GAAW;IACtB,MAAMC,YAAY,GAAG,IAAI,CAACL,IAAI,CAACI,SAAS,IAAI,SAAS,CAAA;IACrD,OAAOC,YAAY,GAAG,GAAG,GAAG,IAAI,CAACL,IAAI,CAACC,IAAI,CAAA;AAC5C,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACE,IAAIK,KAAKA,GAAyB;IAChC,IAAI,IAAI,CAACN,IAAI,CAACO,IAAI,IAAI,IAAI,CAACP,IAAI,CAACQ,KAAK,EAAE;MACrC,MAAM;AAAEF,QAAAA,KAAK,GAAGX,aAAAA;OAAe,GAAG,IAAI,CAACK,IAAI,CAAA;AAC3CE,MAAAA,MAAM,CACJ,CAAuDX,oDAAAA,EAAAA,MAAM,CAACkB,IAAI,CAChE,IACF,CAAC,CAAA,YAAA,EAAeH,KAAK,CAAA,CAAE,EACvBf,MAAM,CAACmB,QAAQ,CAACJ,KAAK,CACvB,CAAC,CAAA;AACD,MAAA,OAAOA,KAAK,CAAA;AACd,KAAC,MAAM,IAAI,IAAI,CAACN,IAAI,CAACM,KAAK,EAAE;AAC1BJ,MAAAA,MAAM,CACJ,4EAA4E,EAC5E,IAAI,CAACF,IAAI,CAACO,IAAI,IAAI,IAAI,CAACP,IAAI,CAACQ,KAC9B,CAAC,CAAA;AACH,KAAA;AACA,IAAA,OAAO,KAAK,CAAA;AACd,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIG,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAA;;AAE3B;IACA,IAAI,IAAI,CAACN,KAAK,EAAE;MACdM,OAAO,CAACC,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAACP,KAAK,EAAE,CAAC,CAAA;AAC9C,KAAA;AAEA,IAAA,OAAOM,OAAO,CAACH,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,GAAA;AACF,CAAA;AAACK,oBAAA,CAAAC,QAAA,EAhFoBlB,MAAM,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/tag/index.hbs","../../../../src/components/hds/tag/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n<Hds::Text::Body class={{this.classNames}} @tag=\\\"span\\\" @size=\\\"100\\\" @weight=\\\"medium\\\" @color=\\\"primary\\\" ...attributes>\\n {{#if this.onDismiss}}\\n <button class=\\\"hds-tag__dismiss\\\" type=\\\"button\\\" aria-label={{this.ariaLabel}} {{on \\\"click\\\" this.onDismiss}}>\\n <Hds::Icon class=\\\"hds-tag__dismiss-icon\\\" @name=\\\"x\\\" @size=\\\"16\\\" />\\n </button>\\n {{/if}}\\n {{#if (or @href @route)}}\\n <Hds::Interactive\\n class=\\\"hds-tag__link\\\"\\n @current-when={{@current-when}}\\n @models={{hds-link-to-models @model @models}}\\n @query={{hds-link-to-query @query}}\\n @replace={{@replace}}\\n @route={{@route}}\\n @isRouteExternal={{@isRouteExternal}}\\n @href={{@href}}\\n @isHrefExternal={{@isHrefExternal}}\\n >\\n {{this.text}}\\n </Hds::Interactive>\\n {{else}}\\n <span class=\\\"hds-tag__text\\\">\\n {{this.text}}\\n </span>\\n {{/if}}\\n</Hds::Text::Body>\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\n\nimport { HdsTagColorValues } from './types.ts';\nimport type { HdsTagColors } from './types.ts';\nimport type { HdsInteractiveSignature } from '../interactive/';\n\nexport const COLORS: string[] = Object.values(HdsTagColorValues);\nexport const DEFAULT_COLOR = HdsTagColorValues.Primary;\n\nexport interface HdsTagSignature {\n Args: HdsInteractiveSignature['Args'] & {\n color?: HdsTagColors;\n text: string;\n ariaLabel?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onDismiss?: (event: MouseEvent, ...args: any[]) => void;\n };\n Element: HTMLSpanElement;\n}\n\nexport default class HdsTag extends Component<HdsTagSignature> {\n /**\n * @param onDismiss\n * @type {function}\n * @default () => {}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get onDismiss(): ((event: MouseEvent, ...args: any[]) => void) | false {\n const { onDismiss } = this.args;\n\n if (typeof onDismiss === 'function') {\n return onDismiss;\n } else {\n return false;\n }\n }\n\n /**\n * @param text\n * @type {string}\n * @description The text of the tag. If no text value is defined, an error will be thrown.\n */\n get text(): string {\n const { text } = this.args;\n\n assert('@text for \"Hds::Tag\" must have a valid value', text !== undefined);\n\n return text;\n }\n\n /**\n * @param ariaLabel\n * @type {string}\n * @default 'Dismiss'\n */\n get ariaLabel(): string {\n const tagAriaLabel = this.args.ariaLabel ?? 'Dismiss';\n return tagAriaLabel + ' ' + this.args.text;\n }\n\n /**\n * @param color\n * @type {string}\n * @default primary\n * @description Determines the color of link to be used; acceptable values are `primary` and `secondary`\n */\n get color(): HdsTagColors | false {\n if (this.args.href || this.args.route) {\n const { color = DEFAULT_COLOR } = this.args;\n assert(\n `@color for \"Hds::Tag\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n return color;\n } else if (this.args.color) {\n assert(\n '@color can only be applied to \"Hds::Tag\" along with either @href or @route',\n this.args.href || this.args.route\n );\n }\n return false;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-tag'];\n\n // add a class based on the @color argument\n if (this.color) {\n classes.push(`hds-tag--color-${this.color}`);\n }\n\n return classes.join(' ');\n }\n}\n"],"names":["COLORS","Object","values","HdsTagColorValues","DEFAULT_COLOR","Primary","HdsTag","Component","onDismiss","args","text","assert","undefined","ariaLabel","tagAriaLabel","color","href","route","join","includes","classNames","classes","push","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;AACA,eAAe,kBAAkB,CAAC,y+BAAy+B;;ACD3gC;AACA;AACA;AACA;;AASO,MAAMA,MAAgB,GAAGC,MAAM,CAACC,MAAM,CAACC,iBAAiB,EAAC;AACnDC,MAAAA,aAAa,GAAGD,iBAAiB,CAACE,QAAO;AAavC,MAAMC,MAAM,SAASC,SAAS,CAAkB;AAC7D;AACF;AACA;AACA;AACA;AACE;EACA,IAAIC,SAASA,GAA0D;IACrE,MAAM;AAAEA,MAAAA,SAAAA;KAAW,GAAG,IAAI,CAACC,IAAI,CAAA;AAE/B,IAAA,IAAI,OAAOD,SAAS,KAAK,UAAU,EAAE;AACnC,MAAA,OAAOA,SAAS,CAAA;AAClB,KAAC,MAAM;AACL,MAAA,OAAO,KAAK,CAAA;AACd,KAAA;AACF,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIE,IAAIA,GAAW;IACjB,MAAM;AAAEA,MAAAA,IAAAA;KAAM,GAAG,IAAI,CAACD,IAAI,CAAA;AAE1BE,IAAAA,MAAM,CAAC,8CAA8C,EAAED,IAAI,KAAKE,SAAS,CAAC,CAAA;AAE1E,IAAA,OAAOF,IAAI,CAAA;AACb,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIG,SAASA,GAAW;IACtB,MAAMC,YAAY,GAAG,IAAI,CAACL,IAAI,CAACI,SAAS,IAAI,SAAS,CAAA;IACrD,OAAOC,YAAY,GAAG,GAAG,GAAG,IAAI,CAACL,IAAI,CAACC,IAAI,CAAA;AAC5C,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACE,IAAIK,KAAKA,GAAyB;IAChC,IAAI,IAAI,CAACN,IAAI,CAACO,IAAI,IAAI,IAAI,CAACP,IAAI,CAACQ,KAAK,EAAE;MACrC,MAAM;AAAEF,QAAAA,KAAK,GAAGX,aAAAA;OAAe,GAAG,IAAI,CAACK,IAAI,CAAA;AAC3CE,MAAAA,MAAM,CACJ,CAAuDX,oDAAAA,EAAAA,MAAM,CAACkB,IAAI,CAChE,IACF,CAAC,CAAA,YAAA,EAAeH,KAAK,CAAA,CAAE,EACvBf,MAAM,CAACmB,QAAQ,CAACJ,KAAK,CACvB,CAAC,CAAA;AACD,MAAA,OAAOA,KAAK,CAAA;AACd,KAAC,MAAM,IAAI,IAAI,CAACN,IAAI,CAACM,KAAK,EAAE;AAC1BJ,MAAAA,MAAM,CACJ,4EAA4E,EAC5E,IAAI,CAACF,IAAI,CAACO,IAAI,IAAI,IAAI,CAACP,IAAI,CAACQ,KAC9B,CAAC,CAAA;AACH,KAAA;AACA,IAAA,OAAO,KAAK,CAAA;AACd,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIG,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAA;;AAE3B;IACA,IAAI,IAAI,CAACN,KAAK,EAAE;MACdM,OAAO,CAACC,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAACP,KAAK,EAAE,CAAC,CAAA;AAC9C,KAAA;AAEA,IAAA,OAAOM,OAAO,CAACH,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,GAAA;AACF,CAAA;AAACK,oBAAA,CAAAC,QAAA,EAhFoBlB,MAAM,CAAA;;;;"}
@@ -1,15 +1,15 @@
1
- import templateOnlyComponent from '@ember/component/template-only';
1
+ import TemplateOnlyComponent from '@ember/component/template-only';
2
2
  import { precompileTemplate } from '@ember/template-compilation';
3
3
  import { setComponentTemplate } from '@ember/component';
4
4
 
5
- var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<Hds::Alert\n class=\"hds-toast\"\n @type=\"inline\"\n @color={{@color}}\n @icon={{@icon}}\n @onDismiss={{@onDismiss}}\n ...attributes\n as |A|\n>\n {{yield\n (hash Title=A.Title Description=A.Description Button=A.Button LinkStandalone=A.LinkStandalone Generic=A.Generic)\n }}\n</Hds::Alert>");
5
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<Hds::Alert\n class=\"hds-toast\"\n @type=\"inline\"\n @color={{@color}}\n @icon={{@icon}}\n @onDismiss={{@onDismiss}}\n role=\"alert\"\n aria-live=\"polite\"\n ...attributes\n as |A|\n>\n {{yield\n (hash Title=A.Title Description=A.Description Button=A.Button LinkStandalone=A.LinkStandalone Generic=A.Generic)\n }}\n</Hds::Alert>");
6
6
 
7
7
  /**
8
8
  * Copyright (c) HashiCorp, Inc.
9
9
  * SPDX-License-Identifier: MPL-2.0
10
10
  */
11
11
 
12
- const HdsToast = templateOnlyComponent();
12
+ const HdsToast = TemplateOnlyComponent();
13
13
  var index = setComponentTemplate(TEMPLATE, HdsToast);
14
14
 
15
15
  export { index as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/toast/index.hbs","../../../../src/components/hds/toast/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n<Hds::Alert\\n class=\\\"hds-toast\\\"\\n @type=\\\"inline\\\"\\n @color={{@color}}\\n @icon={{@icon}}\\n @onDismiss={{@onDismiss}}\\n ...attributes\\n as |A|\\n>\\n {{yield\\n (hash Title=A.Title Description=A.Description Button=A.Button LinkStandalone=A.LinkStandalone Generic=A.Generic)\\n }}\\n</Hds::Alert>\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport TemplateOnlyComponent from '@ember/component/template-only';\nimport type { HdsAlertSignature } from '../alert/';\n\nexport interface HdsToastSignature extends Omit<HdsAlertSignature, 'Args'> {\n Args: Omit<HdsAlertSignature['Args'], 'type'>;\n}\n\nconst HdsToast = TemplateOnlyComponent<HdsToastSignature>();\n\nexport default HdsToast;\n"],"names":["HdsToast","TemplateOnlyComponent","setComponentTemplate","TEMPLATE"],"mappings":";;;;AACA,eAAe,kBAAkB,CAAC,+XAA+X;;ACDja;AACA;AACA;AACA;;AASA,MAAMA,QAAQ,GAAGC,qBAAqB,EAAqB,CAAA;AAE3D,YAAAC,oBAAA,CAAAC,QAAA,EAAeH,QAAQ,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/toast/index.hbs","../../../../src/components/hds/toast/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n<Hds::Alert\\n class=\\\"hds-toast\\\"\\n @type=\\\"inline\\\"\\n @color={{@color}}\\n @icon={{@icon}}\\n @onDismiss={{@onDismiss}}\\n role=\\\"alert\\\"\\n aria-live=\\\"polite\\\"\\n ...attributes\\n as |A|\\n>\\n {{yield\\n (hash Title=A.Title Description=A.Description Button=A.Button LinkStandalone=A.LinkStandalone Generic=A.Generic)\\n }}\\n</Hds::Alert>\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport TemplateOnlyComponent from '@ember/component/template-only';\nimport type { HdsAlertSignature } from '../alert/';\n\nexport interface HdsToastSignature extends Omit<HdsAlertSignature, 'Args'> {\n Args: Omit<HdsAlertSignature['Args'], 'type'>;\n}\n\nconst HdsToast = TemplateOnlyComponent<HdsToastSignature>();\n\nexport default HdsToast;\n"],"names":["HdsToast","TemplateOnlyComponent","setComponentTemplate","TEMPLATE"],"mappings":";;;;AACA,eAAe,kBAAkB,CAAC,yaAAya;;ACD3c;AACA;AACA;AACA;;AASA,MAAMA,QAAQ,GAAGC,qBAAqB,EAAqB,CAAA;AAE3D,YAAAC,oBAAA,CAAAC,QAAA,EAAeH,QAAQ,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/tooltip-button/index.hbs","../../../../src/components/hds/tooltip-button/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n\\n<button\\n type=\\\"button\\\"\\n class={{this.classNames}}\\n {{hds-tooltip this.text options=this.options}}\\n ...attributes\\n>{{~yield~}}</button>\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\n\nimport type { Props as TippyProps } from 'tippy.js';\n\nimport { HdsTooltipPlacementValues } from './types.ts';\nimport type { HdsTooltipPlacements } from './types.ts';\n\nexport const PLACEMENTS: string[] = Object.values(HdsTooltipPlacementValues);\n\nexport interface HdsTooltipSignature {\n Args: {\n extraTippyOptions?: Partial<Omit<TippyProps, 'placement' | 'offset'>>;\n isInline?: boolean;\n offset?: [number, number];\n placement?: HdsTooltipPlacements;\n text: string;\n };\n Blocks: {\n default: [];\n };\n Element: HTMLButtonElement;\n}\n\nexport default class HdsTooltip extends Component<HdsTooltipSignature> {\n /**\n * @param text\n * @type {string}\n * @description text content for tooltip\n */\n get text(): string {\n const { text } = this.args;\n\n assert(\n '@text for \"Hds::TooltipButton\" must have a valid value',\n text !== undefined\n );\n\n return text;\n }\n\n get options(): Partial<TippyProps> {\n const { placement = HdsTooltipPlacementValues.Top, extraTippyOptions } =\n this.args;\n\n assert(\n '@placement for \"Hds::TooltipButton\" must have a valid value',\n placement == undefined || PLACEMENTS.includes(placement)\n );\n\n return {\n ...(extraTippyOptions ? extraTippyOptions : {}),\n placement: placement,\n // takes array of 2 numbers (skidding, distance): array(0, 10)\n offset: this.args.offset ? this.args.offset : [0, 10],\n };\n }\n\n /**\n * @param isInline\n * @type {boolean}\n * @default true\n * @description sets display for the button\n */\n get isInline(): boolean {\n const { isInline = true } = this.args;\n return isInline;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-tooltip-button'];\n\n // add a class based on the @isInline argument\n if (this.isInline) {\n classes.push('hds-tooltip-button--is-inline');\n } else {\n classes.push('hds-tooltip-button--is-block');\n }\n\n return classes.join(' ');\n }\n}\n"],"names":["PLACEMENTS","Object","values","HdsTooltipPlacementValues","HdsTooltip","Component","text","args","assert","undefined","options","placement","Top","extraTippyOptions","includes","offset","isInline","classNames","classes","push","join","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;AACA,eAAe,kBAAkB,CAAC,mOAAmO;;ACDrQ;AACA;AACA;AACA;;AAUO,MAAMA,UAAoB,GAAGC,MAAM,CAACC,MAAM,CAACC,yBAAyB,EAAC;AAgB7D,MAAMC,UAAU,SAASC,SAAS,CAAsB;AACrE;AACF;AACA;AACA;AACA;EACE,IAAIC,IAAIA,GAAW;IACjB,MAAM;AAAEA,MAAAA,IAAAA;KAAM,GAAG,IAAI,CAACC,IAAI,CAAA;AAE1BC,IAAAA,MAAM,CACJ,wDAAwD,EACxDF,IAAI,KAAKG,SACX,CAAC,CAAA;AAED,IAAA,OAAOH,IAAI,CAAA;AACb,GAAA;EAEA,IAAII,OAAOA,GAAwB;IACjC,MAAM;MAAEC,SAAS,GAAGR,yBAAyB,CAACS,GAAG;AAAEC,MAAAA,iBAAAA;KAAmB,GACpE,IAAI,CAACN,IAAI,CAAA;AAEXC,IAAAA,MAAM,CACJ,6DAA6D,EAC7DG,SAAS,IAAIF,SAAS,IAAIT,UAAU,CAACc,QAAQ,CAACH,SAAS,CACzD,CAAC,CAAA;IAED,OAAO;AACL,MAAA,IAAIE,iBAAiB,GAAGA,iBAAiB,GAAG,EAAE;AAC9CF,MAAAA,SAAS,EAAEA,SAAS;AACpB;AACAI,MAAAA,MAAM,EAAE,IAAI,CAACR,IAAI,CAACQ,MAAM,GAAG,IAAI,CAACR,IAAI,CAACQ,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAA;KACrD,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACE,IAAIC,QAAQA,GAAY;IACtB,MAAM;AAAEA,MAAAA,QAAQ,GAAG,IAAA;KAAM,GAAG,IAAI,CAACT,IAAI,CAAA;AACrC,IAAA,OAAOS,QAAQ,CAAA;AACjB,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIC,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,oBAAoB,CAAC,CAAA;;AAEtC;IACA,IAAI,IAAI,CAACF,QAAQ,EAAE;AACjBE,MAAAA,OAAO,CAACC,IAAI,CAAC,+BAA+B,CAAC,CAAA;AAC/C,KAAC,MAAM;AACLD,MAAAA,OAAO,CAACC,IAAI,CAAC,8BAA8B,CAAC,CAAA;AAC9C,KAAA;AAEA,IAAA,OAAOD,OAAO,CAACE,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,GAAA;AACF,CAAA;AAACC,oBAAA,CAAAC,QAAA,EA9DoBlB,UAAU,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/tooltip-button/index.hbs","../../../../src/components/hds/tooltip-button/index.ts"],"sourcesContent":["import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"{{!\\n Copyright (c) HashiCorp, Inc.\\n SPDX-License-Identifier: MPL-2.0\\n}}\\n\\n<button\\n type=\\\"button\\\"\\n class={{this.classNames}}\\n {{hds-tooltip this.text options=this.options}}\\n ...attributes\\n>{{~yield~}}</button>\")","/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\n\nimport type { Props as TippyProps } from 'tippy.js';\n\nimport { HdsTooltipPlacementValues } from './types.ts';\nimport type { HdsTooltipPlacements } from './types.ts';\n\nexport const PLACEMENTS: string[] = Object.values(HdsTooltipPlacementValues);\n\nexport interface HdsTooltipSignature {\n Args: {\n extraTippyOptions?: Partial<Omit<TippyProps, 'placement' | 'offset'>>;\n isInline?: boolean;\n offset?: [number, number];\n placement?: HdsTooltipPlacements;\n text: string;\n };\n Blocks: {\n default: [];\n };\n Element: HTMLButtonElement;\n}\n\nexport default class HdsTooltip extends Component<HdsTooltipSignature> {\n /**\n * @param text\n * @type {string}\n * @description text content for tooltip\n */\n get text(): string {\n const { text } = this.args;\n\n assert(\n '@text for \"Hds::TooltipButton\" must have a valid value',\n text !== undefined\n );\n\n return text;\n }\n\n get options(): Partial<TippyProps> {\n const { placement = HdsTooltipPlacementValues.Top, extraTippyOptions } =\n this.args;\n\n assert(\n '@placement for \"Hds::TooltipButton\" must have a valid value',\n placement == undefined || PLACEMENTS.includes(placement)\n );\n\n return {\n ...(extraTippyOptions ? extraTippyOptions : {}),\n placement: placement,\n // takes array of 2 numbers (skidding, distance): array(0, 10)\n offset: this.args.offset ? this.args.offset : [0, 10],\n };\n }\n\n /**\n * @param isInline\n * @type {boolean}\n * @default true\n * @description sets display for the button\n */\n get isInline(): boolean {\n const { isInline = true } = this.args;\n return isInline;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-tooltip-button'];\n\n // add a class based on the @isInline argument\n if (this.isInline) {\n classes.push('hds-tooltip-button--is-inline');\n } else {\n classes.push('hds-tooltip-button--is-block');\n }\n\n return classes.join(' ');\n }\n}\n"],"names":["PLACEMENTS","Object","values","HdsTooltipPlacementValues","HdsTooltip","Component","text","args","assert","undefined","options","placement","Top","extraTippyOptions","includes","offset","isInline","classNames","classes","push","join","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;AACA,eAAe,kBAAkB,CAAC,mOAAmO;;ACDrQ;AACA;AACA;AACA;;AAUO,MAAMA,UAAoB,GAAGC,MAAM,CAACC,MAAM,CAACC,yBAAyB,EAAC;AAgB7D,MAAMC,UAAU,SAASC,SAAS,CAAsB;AACrE;AACF;AACA;AACA;AACA;EACE,IAAIC,IAAIA,GAAW;IACjB,MAAM;AAAEA,MAAAA,IAAAA;KAAM,GAAG,IAAI,CAACC,IAAI,CAAA;AAE1BC,IAAAA,MAAM,CACJ,wDAAwD,EACxDF,IAAI,KAAKG,SACX,CAAC,CAAA;AAED,IAAA,OAAOH,IAAI,CAAA;AACb,GAAA;EAEA,IAAII,OAAOA,GAAwB;IACjC,MAAM;MAAEC,SAAS,GAAGR,yBAAyB,CAACS,GAAG;AAAEC,MAAAA,iBAAAA;KAAmB,GACpE,IAAI,CAACN,IAAI,CAAA;AAEXC,IAAAA,MAAM,CACJ,6DAA6D,EAC7DG,SAAS,IAAIF,SAAS,IAAIT,UAAU,CAACc,QAAQ,CAACH,SAAS,CACzD,CAAC,CAAA;IAED,OAAO;AACL,MAAA,IAAIE,iBAAiB,GAAGA,iBAAiB,GAAG,EAAE,CAAC;AAC/CF,MAAAA,SAAS,EAAEA,SAAS;AACpB;AACAI,MAAAA,MAAM,EAAE,IAAI,CAACR,IAAI,CAACQ,MAAM,GAAG,IAAI,CAACR,IAAI,CAACQ,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAA;KACrD,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACE,IAAIC,QAAQA,GAAY;IACtB,MAAM;AAAEA,MAAAA,QAAQ,GAAG,IAAA;KAAM,GAAG,IAAI,CAACT,IAAI,CAAA;AACrC,IAAA,OAAOS,QAAQ,CAAA;AACjB,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIC,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,oBAAoB,CAAC,CAAA;;AAEtC;IACA,IAAI,IAAI,CAACF,QAAQ,EAAE;AACjBE,MAAAA,OAAO,CAACC,IAAI,CAAC,+BAA+B,CAAC,CAAA;AAC/C,KAAC,MAAM;AACLD,MAAAA,OAAO,CAACC,IAAI,CAAC,8BAA8B,CAAC,CAAA;AAC9C,KAAA;AAEA,IAAA,OAAOD,OAAO,CAACE,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,GAAA;AACF,CAAA;AAACC,oBAAA,CAAAC,QAAA,EA9DoBlB,UAAU,CAAA;;;;"}
@@ -1,4 +1,4 @@
1
- import templateOnlyComponent from '@ember/component/template-only';
1
+ import TemplateOnlyComponent from '@ember/component/template-only';
2
2
  import { precompileTemplate } from '@ember/template-compilation';
3
3
  import { setComponentTemplate } from '@ember/component';
4
4
 
@@ -9,7 +9,7 @@ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-
9
9
  * SPDX-License-Identifier: MPL-2.0
10
10
  */
11
11
 
12
- const HdsYield = templateOnlyComponent();
12
+ const HdsYield = TemplateOnlyComponent();
13
13
  var index = setComponentTemplate(TEMPLATE, HdsYield);
14
14
 
15
15
  export { index as default };
@@ -1,6 +1,6 @@
1
1
  import { modifier } from 'ember-modifier';
2
2
  import { assert } from '@ember/debug';
3
- import { autoUpdate, limitShift, offset, flip, shift, autoPlacement, arrow, computePosition } from '@floating-ui/dom';
3
+ import { autoUpdate, limitShift, offset, flip, shift, autoPlacement, arrow, size, computePosition } from '@floating-ui/dom';
4
4
 
5
5
  /**
6
6
  * Copyright (c) HashiCorp, Inc.
@@ -35,7 +35,8 @@ const getFloatingUIOptions = options => {
35
35
  middlewareExtra = [],
36
36
  enableCollisionDetection,
37
37
  arrowElement,
38
- arrowPadding
38
+ arrowPadding,
39
+ matchToggleWidth
39
40
  } = options;
40
41
 
41
42
  // we build dynamically the list of middleware functions to invoke, depending on the options provided
@@ -66,21 +67,19 @@ const getFloatingUIOptions = options => {
66
67
  }));
67
68
  }
68
69
 
69
- // TODO? commenting this for now, will need to make this conditional to some argument (and understand how this relates to the `@height` argument)
70
70
  // https://floating-ui.com/docs/size#match-reference-width
71
- // size({
72
- // apply({ rects, elements }) {
73
- // Object.assign(elements.floating.style, {
74
- // width: `${rects.reference.width}px`,
75
- // });
76
- // },
77
- // });
78
- // size({
79
- // apply: ({ availableWidth, availableHeight, middlewareData }) => {
80
- // middlewareData.size = { availableWidth, availableHeight };
81
- // },
82
- // }),
83
-
71
+ if (matchToggleWidth) {
72
+ middleware.push(size({
73
+ apply({
74
+ rects,
75
+ elements
76
+ }) {
77
+ Object.assign(elements.floating.style, {
78
+ width: `${rects.reference.width}px`
79
+ });
80
+ }
81
+ }));
82
+ }
84
83
  middleware.push(...middlewareExtra);
85
84
  return {
86
85
  placement,
@@ -1 +1 @@
1
- {"version":3,"file":"hds-anchored-position.js","sources":["../../src/modifiers/hds-anchored-position.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport { modifier } from 'ember-modifier';\nimport { assert } from '@ember/debug';\n\nimport {\n autoUpdate,\n computePosition,\n offset,\n flip,\n shift,\n limitShift,\n autoPlacement,\n arrow,\n // ---\n // this could be used in the future if we want to give consumers an option to hide the \"floating\" element when the \"anchor\" hides from the viewport\n // see: https://floating-ui.com/docs/hide\n // hide,\n // ---\n // this could be used in the future if we want to give consumers an option to:\n // - let the \"floating\" element auto-resize when there is not enough space (usually vertical) in the viewport to contain the entire \"floating\" element\n // - let the \"floating\" element match the width of the \"trigger\" (it may have min/max width/heigh via CSS too)\n // see: https://floating-ui.com/docs/size\n // notice: below you can find a preliminary code implementation that was tested and worked relatively well\n // size,\n // ---\n} from '@floating-ui/dom';\n\nimport type {\n Placement,\n Strategy,\n OffsetOptions,\n FlipOptions,\n ShiftOptions,\n AutoPlacementOptions,\n ArrowOptions,\n Middleware,\n} from '@floating-ui/dom';\n\nexport const DEFAULT_PLACEMENT = 'bottom';\nexport const PLACEMENTS: Placement[] = [\n 'top',\n 'top-start',\n 'top-end',\n 'right',\n 'right-start',\n 'right-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n];\n\n// share the same default value of \"padding\" for `flip/shift/autoPlacement` options\n// this refers to the minimum distance from the boundaries' edges (the viewport)\n// before the floating element changes its position (flips, shifts, or autoplace itself)\nconst DEFAULT_EDGE_DISTANCE = 8;\n\nexport type FloatingUIOptions = {\n placement?: Placement;\n strategy?: Strategy;\n offsetOptions?: OffsetOptions;\n flipOptions?: FlipOptions;\n shiftOptions?: ShiftOptions;\n autoPlacementOptions?: AutoPlacementOptions;\n middlewareExtra?: Middleware[];\n enableCollisionDetection?: boolean | 'shift' | 'flip' | 'auto';\n arrowElement?: ArrowOptions['element'];\n arrowPadding?: ArrowOptions['padding'];\n};\n\n// we use this function to process all the options provided to the modifier in a single place,\n// in relation to the Floating UI APIs, and keep the modifier code more clean/simple\nexport const getFloatingUIOptions = (\n options: FloatingUIOptions\n): {\n placement: Placement;\n strategy: Strategy;\n middleware: Middleware[];\n} => {\n const {\n placement = DEFAULT_PLACEMENT,\n strategy = 'absolute', // we don't need to use `fixed` if we use the Popover API for the \"floating\" element (it puts the element in the `top-layer`)\n offsetOptions,\n flipOptions = { padding: DEFAULT_EDGE_DISTANCE },\n shiftOptions = { padding: DEFAULT_EDGE_DISTANCE, limiter: limitShift() },\n autoPlacementOptions = { padding: DEFAULT_EDGE_DISTANCE },\n middlewareExtra = [],\n enableCollisionDetection,\n arrowElement,\n arrowPadding,\n } = options;\n\n // we build dynamically the list of middleware functions to invoke, depending on the options provided\n\n const middleware = [];\n\n // https://floating-ui.com/docs/offset\n middleware.push(offset(offsetOptions));\n\n // https://floating-ui.com/docs/flip\n // https://floating-ui.com/docs/shift\n // https://floating-ui.com/docs/autoPlacement\n if (\n enableCollisionDetection === true ||\n enableCollisionDetection === 'flip'\n ) {\n middleware.push(flip(flipOptions));\n }\n if (\n enableCollisionDetection === true ||\n enableCollisionDetection === 'shift'\n ) {\n middleware.push(shift(shiftOptions));\n }\n if (enableCollisionDetection === 'auto') {\n middleware.push(autoPlacement(autoPlacementOptions));\n }\n\n // https://floating-ui.com/docs/arrow\n if (arrowElement) {\n middleware.push(\n arrow({\n element: arrowElement,\n padding: arrowPadding ?? 0,\n })\n );\n }\n\n // TODO? commenting this for now, will need to make this conditional to some argument (and understand how this relates to the `@height` argument)\n // https://floating-ui.com/docs/size#match-reference-width\n // size({\n // apply({ rects, elements }) {\n // Object.assign(elements.floating.style, {\n // width: `${rects.reference.width}px`,\n // });\n // },\n // });\n // size({\n // apply: ({ availableWidth, availableHeight, middlewareData }) => {\n // middlewareData.size = { availableWidth, availableHeight };\n // },\n // }),\n\n middleware.push(...middlewareExtra);\n\n return {\n placement,\n strategy,\n middleware,\n };\n};\n\ninterface HdsAnchoredPositionSignature {\n Element: HTMLElement;\n Args: {\n Positional: [HTMLElement | SVGElement];\n Named: FloatingUIOptions & { arrowSelector?: string };\n };\n}\n\n// Notice: we use a function-based modifier here instead of a class-based one\n// because it's quite simple in its logic, and doesn't require injecting services\n// see: https://github.com/ember-modifier/ember-modifier#function-based-modifiers\n\nexport default modifier<HdsAnchoredPositionSignature>(\n (element, positional, named = {}) => {\n // the element that \"floats\" next to the \"anchor\" (whose position is calculated in relation to the anchor)\n // notice: this is the element the Ember modifier is attached to\n const floatingElement = element;\n\n // the element that acts as an \"anchor\" for the \"floating\" element\n // it can be a DOM (string) selector or a DOM element\n // notice: it's expressed as \"positional\" argument (array of arguments) for the modifier\n const _anchorTarget = positional[0];\n const anchorElement =\n typeof _anchorTarget === 'string'\n ? document.querySelector(_anchorTarget)\n : _anchorTarget;\n\n assert(\n '`hds-anchored-position` modifier - the provided \"anchoring\" element is not defined correctly',\n anchorElement instanceof HTMLElement ||\n anchorElement instanceof SVGElement\n );\n\n // the \"arrow\" element (optional) associated with the \"floating\" element\n // it can be a DOM selector (string) or a DOM element\n // notice: it's declared inside the \"named\" argument (object) for the modifier\n // but we need to extract it also here so it can be used to assign inline styles to it\n let arrowElement: HTMLElement | SVGElement | undefined;\n\n if (named.arrowElement) {\n assert(\n '`hds-anchored-position` modifier - the `element` provided for the \"arrow\" element is not a valid DOM node',\n named.arrowElement instanceof HTMLElement ||\n named.arrowElement instanceof SVGElement\n );\n\n arrowElement = named.arrowElement;\n } else if (named.arrowSelector) {\n assert(\n '`hds-anchored-position` modifier - the `selector` provided for the \"arrow\" element must be a string',\n typeof named.arrowSelector === 'string'\n );\n\n const selectedArrowElement = document.querySelector(named.arrowSelector);\n if (selectedArrowElement instanceof HTMLElement) {\n arrowElement = selectedArrowElement;\n } else {\n assert(\n '`hds-anchored-position` modifier - the `selector` provided for the \"arrow\" element is not a valid DOM selector'\n );\n }\n }\n\n // the Floating UI \"options\" to apply to the \"floating\" element\n // notice: we spread the `named` argument and override its `arrowElement` value instead of setting it directly because Ember complains that modifier's arguments must be immutable\n const floatingOptions = getFloatingUIOptions({ ...named, arrowElement });\n\n const computeFloatingPosition = async () => {\n // important to know: `computePosition()` is not stateful, it only positions the \"floating\" element once\n // see: https://floating-ui.com/docs/computePosition\n const state = await computePosition(\n anchorElement,\n floatingElement,\n floatingOptions\n );\n\n const { x, y, placement, strategy, middlewareData } = state;\n\n Object.assign(floatingElement.style, {\n position: strategy,\n top: `${y}px`,\n left: `${x}px`,\n // TODO? commenting this for now, will need to make this conditional to some argument (and understand how this relates to the `@height` argument)\n // maxHeight: `${middlewareData.size.availableHeight - 10}px`,\n });\n\n if (arrowElement && middlewareData.arrow) {\n // we assign a \"data\" attribute to the \"arrow\" element so we can use CSS (in the consuming components) to position/rotate it accordingly and we avoid calculating at runtime values that technically we already know\n // (similar to what Tippy.js does: https://github.com/atomiks/tippyjs/blob/master/src/scss/svg-arrow.scss)\n // IMPORTANT: floating-ui assumes the \"arrow\" container is square!\n arrowElement.setAttribute(\n 'data-hds-anchored-arrow-placement',\n placement\n );\n\n // we set `x` or `y` value (depends on the position of the arrow in relation to the \"floating\" element placement)\n // see: https://floating-ui.com/docs/arrow#usage\n Object.assign(arrowElement.style, {\n left:\n middlewareData.arrow.x != null ? `${middlewareData.arrow.x}px` : '',\n top:\n middlewareData.arrow.y != null ? `${middlewareData.arrow.y}px` : '',\n });\n }\n };\n\n // the `autoUpdate` function automatically updates the position of the floating element when necessary.\n // it should only be called when the floating element is mounted on the DOM or visible on the screen.\n // it returns a \"cleanup\" function that should be invoked when the floating element is removed from the DOM or hidden from the screen.\n // see: https://floating-ui.com/docs/autoUpdate\n const cleanupFloatingUI = autoUpdate(\n anchorElement,\n floatingElement,\n computeFloatingPosition\n );\n\n // this (teardown) function is run when the element is removed from the DOM\n return (): void => {\n cleanupFloatingUI();\n };\n }\n);\n"],"names":["DEFAULT_PLACEMENT","PLACEMENTS","DEFAULT_EDGE_DISTANCE","getFloatingUIOptions","options","placement","strategy","offsetOptions","flipOptions","padding","shiftOptions","limiter","limitShift","autoPlacementOptions","middlewareExtra","enableCollisionDetection","arrowElement","arrowPadding","middleware","push","offset","flip","shift","autoPlacement","arrow","element","modifier","positional","named","floatingElement","_anchorTarget","anchorElement","document","querySelector","assert","HTMLElement","SVGElement","arrowSelector","selectedArrowElement","floatingOptions","computeFloatingPosition","state","computePosition","x","y","middlewareData","Object","assign","style","position","top","left","setAttribute","cleanupFloatingUI","autoUpdate"],"mappings":"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"}
1
+ {"version":3,"file":"hds-anchored-position.js","sources":["../../src/modifiers/hds-anchored-position.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport { modifier } from 'ember-modifier';\nimport { assert } from '@ember/debug';\n\nimport {\n autoUpdate,\n computePosition,\n offset,\n flip,\n shift,\n limitShift,\n autoPlacement,\n arrow,\n // ---\n // this could be used in the future if we want to give consumers an option to hide the \"floating\" element when the \"anchor\" hides from the viewport\n // see: https://floating-ui.com/docs/hide\n // hide,\n // ---\n size,\n} from '@floating-ui/dom';\n\nimport type {\n Placement,\n Strategy,\n OffsetOptions,\n FlipOptions,\n ShiftOptions,\n AutoPlacementOptions,\n ArrowOptions,\n Middleware,\n} from '@floating-ui/dom';\n\nexport const DEFAULT_PLACEMENT = 'bottom';\nexport const PLACEMENTS: Placement[] = [\n 'top',\n 'top-start',\n 'top-end',\n 'right',\n 'right-start',\n 'right-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n];\n\n// share the same default value of \"padding\" for `flip/shift/autoPlacement` options\n// this refers to the minimum distance from the boundaries' edges (the viewport)\n// before the floating element changes its position (flips, shifts, or autoplace itself)\nconst DEFAULT_EDGE_DISTANCE = 8;\n\nexport type FloatingUIOptions = {\n placement?: Placement;\n strategy?: Strategy;\n offsetOptions?: OffsetOptions;\n flipOptions?: FlipOptions;\n shiftOptions?: ShiftOptions;\n autoPlacementOptions?: AutoPlacementOptions;\n middlewareExtra?: Middleware[];\n enableCollisionDetection?: boolean | 'shift' | 'flip' | 'auto';\n arrowElement?: ArrowOptions['element'];\n arrowPadding?: ArrowOptions['padding'];\n matchToggleWidth?: boolean;\n};\n\n// we use this function to process all the options provided to the modifier in a single place,\n// in relation to the Floating UI APIs, and keep the modifier code more clean/simple\nexport const getFloatingUIOptions = (\n options: FloatingUIOptions\n): {\n placement: Placement;\n strategy: Strategy;\n middleware: Middleware[];\n} => {\n const {\n placement = DEFAULT_PLACEMENT,\n strategy = 'absolute', // we don't need to use `fixed` if we use the Popover API for the \"floating\" element (it puts the element in the `top-layer`)\n offsetOptions,\n flipOptions = { padding: DEFAULT_EDGE_DISTANCE },\n shiftOptions = { padding: DEFAULT_EDGE_DISTANCE, limiter: limitShift() },\n autoPlacementOptions = { padding: DEFAULT_EDGE_DISTANCE },\n middlewareExtra = [],\n enableCollisionDetection,\n arrowElement,\n arrowPadding,\n matchToggleWidth,\n } = options;\n\n // we build dynamically the list of middleware functions to invoke, depending on the options provided\n\n const middleware = [];\n\n // https://floating-ui.com/docs/offset\n middleware.push(offset(offsetOptions));\n\n // https://floating-ui.com/docs/flip\n // https://floating-ui.com/docs/shift\n // https://floating-ui.com/docs/autoPlacement\n if (\n enableCollisionDetection === true ||\n enableCollisionDetection === 'flip'\n ) {\n middleware.push(flip(flipOptions));\n }\n if (\n enableCollisionDetection === true ||\n enableCollisionDetection === 'shift'\n ) {\n middleware.push(shift(shiftOptions));\n }\n if (enableCollisionDetection === 'auto') {\n middleware.push(autoPlacement(autoPlacementOptions));\n }\n\n // https://floating-ui.com/docs/arrow\n if (arrowElement) {\n middleware.push(\n arrow({\n element: arrowElement,\n padding: arrowPadding ?? 0,\n })\n );\n }\n\n // https://floating-ui.com/docs/size#match-reference-width\n if (matchToggleWidth) {\n middleware.push(\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n });\n },\n })\n );\n }\n\n middleware.push(...middlewareExtra);\n\n return {\n placement,\n strategy,\n middleware,\n };\n};\n\nexport interface HdsAnchoredPositionSignature {\n Element: HTMLElement;\n Args: {\n Positional: [HTMLElement | SVGElement];\n Named: FloatingUIOptions & { arrowSelector?: string };\n };\n}\n\n// Notice: we use a function-based modifier here instead of a class-based one\n// because it's quite simple in its logic, and doesn't require injecting services\n// see: https://github.com/ember-modifier/ember-modifier#function-based-modifiers\n\nexport default modifier<HdsAnchoredPositionSignature>(\n (element, positional, named = {}) => {\n // the element that \"floats\" next to the \"anchor\" (whose position is calculated in relation to the anchor)\n // notice: this is the element the Ember modifier is attached to\n const floatingElement = element;\n\n // the element that acts as an \"anchor\" for the \"floating\" element\n // it can be a DOM (string) selector or a DOM element\n // notice: it's expressed as \"positional\" argument (array of arguments) for the modifier\n const _anchorTarget = positional[0];\n const anchorElement =\n typeof _anchorTarget === 'string'\n ? document.querySelector(_anchorTarget)\n : _anchorTarget;\n\n assert(\n '`hds-anchored-position` modifier - the provided \"anchoring\" element is not defined correctly',\n anchorElement instanceof HTMLElement ||\n anchorElement instanceof SVGElement\n );\n\n // the \"arrow\" element (optional) associated with the \"floating\" element\n // it can be a DOM selector (string) or a DOM element\n // notice: it's declared inside the \"named\" argument (object) for the modifier\n // but we need to extract it also here so it can be used to assign inline styles to it\n let arrowElement: HTMLElement | SVGElement | undefined;\n\n if (named.arrowElement) {\n assert(\n '`hds-anchored-position` modifier - the `element` provided for the \"arrow\" element is not a valid DOM node',\n named.arrowElement instanceof HTMLElement ||\n named.arrowElement instanceof SVGElement\n );\n\n arrowElement = named.arrowElement;\n } else if (named.arrowSelector) {\n assert(\n '`hds-anchored-position` modifier - the `selector` provided for the \"arrow\" element must be a string',\n typeof named.arrowSelector === 'string'\n );\n\n const selectedArrowElement = document.querySelector(named.arrowSelector);\n if (selectedArrowElement instanceof HTMLElement) {\n arrowElement = selectedArrowElement;\n } else {\n assert(\n '`hds-anchored-position` modifier - the `selector` provided for the \"arrow\" element is not a valid DOM selector'\n );\n }\n }\n\n // the Floating UI \"options\" to apply to the \"floating\" element\n // notice: we spread the `named` argument and override its `arrowElement` value instead of setting it directly because Ember complains that modifier's arguments must be immutable\n const floatingOptions = getFloatingUIOptions({ ...named, arrowElement });\n\n const computeFloatingPosition = async () => {\n // important to know: `computePosition()` is not stateful, it only positions the \"floating\" element once\n // see: https://floating-ui.com/docs/computePosition\n const state = await computePosition(\n anchorElement,\n floatingElement,\n floatingOptions\n );\n\n const { x, y, placement, strategy, middlewareData } = state;\n\n Object.assign(floatingElement.style, {\n position: strategy,\n top: `${y}px`,\n left: `${x}px`,\n // TODO? commenting this for now, will need to make this conditional to some argument (and understand how this relates to the `@height` argument)\n // maxHeight: `${middlewareData.size.availableHeight - 10}px`,\n });\n\n if (arrowElement && middlewareData.arrow) {\n // we assign a \"data\" attribute to the \"arrow\" element so we can use CSS (in the consuming components) to position/rotate it accordingly and we avoid calculating at runtime values that technically we already know\n // (similar to what Tippy.js does: https://github.com/atomiks/tippyjs/blob/master/src/scss/svg-arrow.scss)\n // IMPORTANT: floating-ui assumes the \"arrow\" container is square!\n arrowElement.setAttribute(\n 'data-hds-anchored-arrow-placement',\n placement\n );\n\n // we set `x` or `y` value (depends on the position of the arrow in relation to the \"floating\" element placement)\n // see: https://floating-ui.com/docs/arrow#usage\n Object.assign(arrowElement.style, {\n left:\n middlewareData.arrow.x != null ? `${middlewareData.arrow.x}px` : '',\n top:\n middlewareData.arrow.y != null ? `${middlewareData.arrow.y}px` : '',\n });\n }\n };\n\n // the `autoUpdate` function automatically updates the position of the floating element when necessary.\n // it should only be called when the floating element is mounted on the DOM or visible on the screen.\n // it returns a \"cleanup\" function that should be invoked when the floating element is removed from the DOM or hidden from the screen.\n // see: https://floating-ui.com/docs/autoUpdate\n const cleanupFloatingUI = autoUpdate(\n anchorElement,\n floatingElement,\n computeFloatingPosition\n );\n\n // this (teardown) function is run when the element is removed from the DOM\n return (): void => {\n cleanupFloatingUI();\n };\n }\n);\n"],"names":["DEFAULT_PLACEMENT","PLACEMENTS","DEFAULT_EDGE_DISTANCE","getFloatingUIOptions","options","placement","strategy","offsetOptions","flipOptions","padding","shiftOptions","limiter","limitShift","autoPlacementOptions","middlewareExtra","enableCollisionDetection","arrowElement","arrowPadding","matchToggleWidth","middleware","push","offset","flip","shift","autoPlacement","arrow","element","size","apply","rects","elements","Object","assign","floating","style","width","reference","modifier","positional","named","floatingElement","_anchorTarget","anchorElement","document","querySelector","assert","HTMLElement","SVGElement","arrowSelector","selectedArrowElement","floatingOptions","computeFloatingPosition","state","computePosition","x","y","middlewareData","position","top","left","setAttribute","cleanupFloatingUI","autoUpdate"],"mappings":";;;;AAAA;AACA;AACA;AACA;;AAiCO,MAAMA,iBAAiB,GAAG,SAAQ;AAClC,MAAMC,UAAuB,GAAG,CACrC,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,EACP,aAAa,EACb,WAAW,EACX,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,UAAU,EACX;;AAED;AACA;AACA;AACA,MAAMC,qBAAqB,GAAG,CAAC,CAAA;AAgB/B;AACA;AACaC,MAAAA,oBAAoB,GAC/BC,OAA0B,IAKvB;EACH,MAAM;AACJC,IAAAA,SAAS,GAAGL,iBAAiB;AAC7BM,IAAAA,QAAQ,GAAG,UAAU;AAAE;IACvBC,aAAa;AACbC,IAAAA,WAAW,GAAG;AAAEC,MAAAA,OAAO,EAAEP,qBAAAA;KAAuB;AAChDQ,IAAAA,YAAY,GAAG;AAAED,MAAAA,OAAO,EAAEP,qBAAqB;MAAES,OAAO,EAAEC,UAAU,EAAC;KAAG;AACxEC,IAAAA,oBAAoB,GAAG;AAAEJ,MAAAA,OAAO,EAAEP,qBAAAA;KAAuB;AACzDY,IAAAA,eAAe,GAAG,EAAE;IACpBC,wBAAwB;IACxBC,YAAY;IACZC,YAAY;AACZC,IAAAA,gBAAAA;AACF,GAAC,GAAGd,OAAO,CAAA;;AAEX;;EAEA,MAAMe,UAAU,GAAG,EAAE,CAAA;;AAErB;AACAA,EAAAA,UAAU,CAACC,IAAI,CAACC,MAAM,CAACd,aAAa,CAAC,CAAC,CAAA;;AAEtC;AACA;AACA;AACA,EAAA,IACEQ,wBAAwB,KAAK,IAAI,IACjCA,wBAAwB,KAAK,MAAM,EACnC;AACAI,IAAAA,UAAU,CAACC,IAAI,CAACE,IAAI,CAACd,WAAW,CAAC,CAAC,CAAA;AACpC,GAAA;AACA,EAAA,IACEO,wBAAwB,KAAK,IAAI,IACjCA,wBAAwB,KAAK,OAAO,EACpC;AACAI,IAAAA,UAAU,CAACC,IAAI,CAACG,KAAK,CAACb,YAAY,CAAC,CAAC,CAAA;AACtC,GAAA;EACA,IAAIK,wBAAwB,KAAK,MAAM,EAAE;AACvCI,IAAAA,UAAU,CAACC,IAAI,CAACI,aAAa,CAACX,oBAAoB,CAAC,CAAC,CAAA;AACtD,GAAA;;AAEA;AACA,EAAA,IAAIG,YAAY,EAAE;AAChBG,IAAAA,UAAU,CAACC,IAAI,CACbK,KAAK,CAAC;AACJC,MAAAA,OAAO,EAAEV,YAAY;MACrBP,OAAO,EAAEQ,YAAY,IAAI,CAAA;AAC3B,KAAC,CACH,CAAC,CAAA;AACH,GAAA;;AAEA;AACA,EAAA,IAAIC,gBAAgB,EAAE;AACpBC,IAAAA,UAAU,CAACC,IAAI,CACbO,IAAI,CAAC;AACHC,MAAAA,KAAKA,CAAC;QAAEC,KAAK;AAAEC,QAAAA,QAAAA;AAAS,OAAC,EAAE;QACzBC,MAAM,CAACC,MAAM,CAACF,QAAQ,CAACG,QAAQ,CAACC,KAAK,EAAE;AACrCC,UAAAA,KAAK,EAAE,CAAGN,EAAAA,KAAK,CAACO,SAAS,CAACD,KAAK,CAAA,EAAA,CAAA;AACjC,SAAC,CAAC,CAAA;AACJ,OAAA;AACF,KAAC,CACH,CAAC,CAAA;AACH,GAAA;AAEAhB,EAAAA,UAAU,CAACC,IAAI,CAAC,GAAGN,eAAe,CAAC,CAAA;EAEnC,OAAO;IACLT,SAAS;IACTC,QAAQ;AACRa,IAAAA,UAAAA;GACD,CAAA;AACH,EAAC;AAUD;AACA;AACA;;AAEA,+BAAekB,QAAQ,CACrB,CAACX,OAAO,EAAEY,UAAU,EAAEC,KAAK,GAAG,EAAE,KAAK;AACnC;AACA;EACA,MAAMC,eAAe,GAAGd,OAAO,CAAA;;AAE/B;AACA;AACA;AACA,EAAA,MAAMe,aAAa,GAAGH,UAAU,CAAC,CAAC,CAAC,CAAA;AACnC,EAAA,MAAMI,aAAa,GACjB,OAAOD,aAAa,KAAK,QAAQ,GAC7BE,QAAQ,CAACC,aAAa,CAACH,aAAa,CAAC,GACrCA,aAAa,CAAA;EAEnBI,MAAM,CACJ,8FAA8F,EAC9FH,aAAa,YAAYI,WAAW,IAClCJ,aAAa,YAAYK,UAC7B,CAAC,CAAA;;AAED;AACA;AACA;AACA;AACA,EAAA,IAAI/B,YAAkD,CAAA;EAEtD,IAAIuB,KAAK,CAACvB,YAAY,EAAE;AACtB6B,IAAAA,MAAM,CACJ,2GAA2G,EAC3GN,KAAK,CAACvB,YAAY,YAAY8B,WAAW,IACvCP,KAAK,CAACvB,YAAY,YAAY+B,UAClC,CAAC,CAAA;IAED/B,YAAY,GAAGuB,KAAK,CAACvB,YAAY,CAAA;AACnC,GAAC,MAAM,IAAIuB,KAAK,CAACS,aAAa,EAAE;IAC9BH,MAAM,CACJ,qGAAqG,EACrG,OAAON,KAAK,CAACS,aAAa,KAAK,QACjC,CAAC,CAAA;IAED,MAAMC,oBAAoB,GAAGN,QAAQ,CAACC,aAAa,CAACL,KAAK,CAACS,aAAa,CAAC,CAAA;IACxE,IAAIC,oBAAoB,YAAYH,WAAW,EAAE;AAC/C9B,MAAAA,YAAY,GAAGiC,oBAAoB,CAAA;AACrC,KAAC,MAAM;MACLJ,MAAM,CACJ,gHACF,CAAC,CAAA;AACH,KAAA;AACF,GAAA;;AAEA;AACA;EACA,MAAMK,eAAe,GAAG/C,oBAAoB,CAAC;AAAE,IAAA,GAAGoC,KAAK;AAAEvB,IAAAA,YAAAA;AAAa,GAAC,CAAC,CAAA;AAExE,EAAA,MAAMmC,uBAAuB,GAAG,YAAY;AAC1C;AACA;IACA,MAAMC,KAAK,GAAG,MAAMC,eAAe,CACjCX,aAAa,EACbF,eAAe,EACfU,eACF,CAAC,CAAA;IAED,MAAM;MAAEI,CAAC;MAAEC,CAAC;MAAElD,SAAS;MAAEC,QAAQ;AAAEkD,MAAAA,cAAAA;AAAe,KAAC,GAAGJ,KAAK,CAAA;AAE3DrB,IAAAA,MAAM,CAACC,MAAM,CAACQ,eAAe,CAACN,KAAK,EAAE;AACnCuB,MAAAA,QAAQ,EAAEnD,QAAQ;MAClBoD,GAAG,EAAE,CAAGH,EAAAA,CAAC,CAAI,EAAA,CAAA;MACbI,IAAI,EAAE,GAAGL,CAAC,CAAA,EAAA,CAAA;AACV;AACA;AACF,KAAC,CAAC,CAAA;AAEF,IAAA,IAAItC,YAAY,IAAIwC,cAAc,CAAC/B,KAAK,EAAE;AACxC;AACA;AACA;AACAT,MAAAA,YAAY,CAAC4C,YAAY,CACvB,mCAAmC,EACnCvD,SACF,CAAC,CAAA;;AAED;AACA;AACA0B,MAAAA,MAAM,CAACC,MAAM,CAAChB,YAAY,CAACkB,KAAK,EAAE;AAChCyB,QAAAA,IAAI,EACFH,cAAc,CAAC/B,KAAK,CAAC6B,CAAC,IAAI,IAAI,GAAG,CAAA,EAAGE,cAAc,CAAC/B,KAAK,CAAC6B,CAAC,CAAA,EAAA,CAAI,GAAG,EAAE;AACrEI,QAAAA,GAAG,EACDF,cAAc,CAAC/B,KAAK,CAAC8B,CAAC,IAAI,IAAI,GAAG,CAAA,EAAGC,cAAc,CAAC/B,KAAK,CAAC8B,CAAC,IAAI,GAAG,EAAA;AACrE,OAAC,CAAC,CAAA;AACJ,KAAA;GACD,CAAA;;AAED;AACA;AACA;AACA;EACA,MAAMM,iBAAiB,GAAGC,UAAU,CAClCpB,aAAa,EACbF,eAAe,EACfW,uBACF,CAAC,CAAA;;AAED;AACA,EAAA,OAAO,MAAY;AACjBU,IAAAA,iBAAiB,EAAE,CAAA;GACpB,CAAA;AACH,CACF,CAAC;;;;"}
@@ -77,12 +77,21 @@ const writeTextToClipboard = async textToCopy => {
77
77
  // DEBUG uncomment this for easy debugging
78
78
  // console.log('success', textToCopy);
79
79
  return true;
80
- } catch (error) {
81
- // clipboard write failed
82
- // this probably never happens (see comment above) or happens only for very old browsers that don't for which `navigator.clipboard` is undefined
83
- warn(`copy action failed, please check your browser‘s permissions: ${JSON.stringify(error)}`, {
84
- id: 'hds-clipboard.write-text-to-clipboard.catch-error'
85
- });
80
+ } catch {
81
+ // if it is not a secure context, use the polyfill
82
+ // to test that this works in a non-secure context, access the port through your IP address (ie. XXX.XXX.X.XXX:4200/)
83
+ if (!navigator.clipboard) {
84
+ try {
85
+ const clipboard = await import('clipboard-polyfill');
86
+ await clipboard.writeText(textToCopy);
87
+ return true;
88
+ } catch (error) {
89
+ warn(`copy action failed, unable to use clipboard-polyfill: ${JSON.stringify(error)}`, {
90
+ id: 'hds-clipboard.write-text-to-clipboard.catch-error'
91
+ });
92
+ return false;
93
+ }
94
+ }
86
95
  return false;
87
96
  }
88
97
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"hds-clipboard.js","sources":["../../src/modifiers/hds-clipboard.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport { modifier } from 'ember-modifier';\nimport { assert, warn } from '@ember/debug';\n\ntype TextToCopy = string | number | bigint;\ntype TargetToCopy = HTMLElement | string;\n\nexport interface HdsClipboardModifierSignature {\n Element: HTMLElement;\n Args: {\n Named: {\n text?: TextToCopy;\n target?: TargetToCopy;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSuccess?: (...args: any[]) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onError?: (...args: any[]) => void;\n };\n };\n}\n\nexport const getTextToCopy = (text: TextToCopy): string => {\n let textToCopy: string = '';\n\n if (text) {\n if (typeof text === 'string') {\n textToCopy = text;\n } else if (\n // context: https://github.com/hashicorp/design-system/pull/1564\n typeof text === 'number' ||\n typeof text === 'bigint'\n ) {\n textToCopy = text.toString();\n } else {\n assert(\n `\\`hds-clipboard\\` modifier - \\`text\\` argument must be a string - provided: ${typeof text}`\n );\n }\n }\n return textToCopy;\n};\n\nexport const getTargetElement = (\n target: string | Node\n): HTMLElement | undefined => {\n let targetElement: HTMLElement | null;\n\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n\n if (!targetElement) {\n console.error(\n '`hds-clipboard` modifier - `target` selector provided does not point to an existing DOM node, check your selector string',\n targetElement\n );\n return;\n }\n } else if (target instanceof HTMLElement) {\n targetElement = target;\n } else {\n if (target instanceof NodeList) {\n assert(\n '`hds-clipboard` modifier - `target` argument must be a string or a DOM node - provided: a list of DOM nodes'\n );\n } else {\n assert(\n `\\`hds-clipboard\\` modifier - \\`target\\` argument must be a string or a DOM node - provided: ${typeof target}`\n );\n }\n }\n return targetElement;\n};\n\nexport const getTextToCopyFromTargetElement = (\n targetElement: TargetToCopy\n): string => {\n let textToCopy: string = '';\n\n if (targetElement instanceof HTMLElement) {\n if (\n targetElement instanceof HTMLInputElement || // targetElement.nodeName === 'INPUT' ||\n targetElement instanceof HTMLTextAreaElement || // targetElement.nodeName === 'TEXTAREA' ||\n targetElement instanceof HTMLSelectElement // targetElement.nodeName === 'SELECT'\n ) {\n textToCopy = targetElement.value;\n } else {\n // simplest approach\n textToCopy = targetElement.innerText;\n\n // approach based on text selection (left for backup just in case)\n // var selection = window.getSelection();\n // var range = document.createRange();\n // selection.removeAllRanges();\n // range.selectNodeContents(targetElement);\n // selection.addRange(range);\n // textToCopy = selection.toString();\n // selection.removeAllRanges();\n }\n }\n return textToCopy;\n};\n\nexport const writeTextToClipboard = async (\n textToCopy: string\n): Promise<boolean> => {\n // finally copy the text to the clipboard using the Clipboard API\n // https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API\n if (textToCopy) {\n try {\n // notice: the \"clipboard-write\" permission is granted automatically to pages when they are in the active tab\n // https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/write\n await navigator.clipboard.writeText(textToCopy);\n // DEBUG uncomment this for easy debugging\n // console.log('success', textToCopy);\n return true;\n } catch (error) {\n // clipboard write failed\n // this probably never happens (see comment above) or happens only for very old browsers that don't for which `navigator.clipboard` is undefined\n warn(\n `copy action failed, please check your browser‘s permissions: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-clipboard.write-text-to-clipboard.catch-error',\n }\n );\n return false;\n }\n } else {\n return false;\n }\n};\n\nexport const copyToClipboard = async (\n text?: TextToCopy,\n target?: TargetToCopy\n): Promise<boolean> => {\n let textToCopy: string = '';\n\n if (text) {\n textToCopy = getTextToCopy(text);\n } else if (target) {\n const targetElement = getTargetElement(target);\n if (targetElement) {\n textToCopy = getTextToCopyFromTargetElement(targetElement);\n }\n } else {\n assert(\n '`hds-clipboard` modifier - either a `text` or a `target` argument is required'\n );\n }\n const success = await writeTextToClipboard(textToCopy);\n return success;\n};\n\n// Notice: we use a function-based modifier here instead of a class-based one\n// because it's quite simple in its logic, and doesn't require injecting services\n// see: https://github.com/ember-modifier/ember-modifier#function-based-modifiers\n\nexport default modifier<HdsClipboardModifierSignature>(\n (element, _positional, named): (() => void) => {\n assert(\n '`hds-clipboard` modifier - the modifier must be applied to an element',\n element\n );\n\n const { text, target, onSuccess, onError } = named;\n\n const onClick = async (event: MouseEvent): Promise<void> => {\n const trigger = event.currentTarget;\n const success = await copyToClipboard(text, target);\n\n // fire the `onSuccess/onError` callbacks (if provided)\n if (success) {\n if (typeof onSuccess === 'function') {\n onSuccess({ trigger, text, target });\n }\n } else {\n if (typeof onError === 'function') {\n onError({ trigger, text, target });\n }\n }\n };\n\n // add the \"onClick\" event listener to the element\n element.addEventListener('click', onClick);\n\n // this (teardown) function is run when the element is removed\n return (): void => {\n element.removeEventListener('click', onClick);\n };\n }\n);\n"],"names":["getTextToCopy","text","textToCopy","toString","assert","getTargetElement","target","targetElement","document","querySelector","console","error","HTMLElement","NodeList","getTextToCopyFromTargetElement","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","value","innerText","writeTextToClipboard","navigator","clipboard","writeText","warn","JSON","stringify","id","copyToClipboard","success","modifier","element","_positional","named","onSuccess","onError","onClick","event","trigger","currentTarget","addEventListener","removeEventListener"],"mappings":"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"}
1
+ {"version":3,"file":"hds-clipboard.js","sources":["../../src/modifiers/hds-clipboard.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport { modifier } from 'ember-modifier';\nimport { assert, warn } from '@ember/debug';\n\ntype TextToCopy = string | number | bigint;\ntype TargetToCopy = HTMLElement | string;\n\nexport interface HdsClipboardModifierSignature {\n Element: HTMLElement;\n Args: {\n Named: {\n text?: TextToCopy;\n target?: TargetToCopy;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSuccess?: (...args: any[]) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onError?: (...args: any[]) => void;\n };\n };\n}\n\nexport const getTextToCopy = (text: TextToCopy): string => {\n let textToCopy: string = '';\n\n if (text) {\n if (typeof text === 'string') {\n textToCopy = text;\n } else if (\n // context: https://github.com/hashicorp/design-system/pull/1564\n typeof text === 'number' ||\n typeof text === 'bigint'\n ) {\n textToCopy = text.toString();\n } else {\n assert(\n `\\`hds-clipboard\\` modifier - \\`text\\` argument must be a string - provided: ${typeof text}`\n );\n }\n }\n return textToCopy;\n};\n\nexport const getTargetElement = (\n target: string | Node\n): HTMLElement | undefined => {\n let targetElement: HTMLElement | null;\n\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n\n if (!targetElement) {\n console.error(\n '`hds-clipboard` modifier - `target` selector provided does not point to an existing DOM node, check your selector string',\n targetElement\n );\n return;\n }\n } else if (target instanceof HTMLElement) {\n targetElement = target;\n } else {\n if (target instanceof NodeList) {\n assert(\n '`hds-clipboard` modifier - `target` argument must be a string or a DOM node - provided: a list of DOM nodes'\n );\n } else {\n assert(\n `\\`hds-clipboard\\` modifier - \\`target\\` argument must be a string or a DOM node - provided: ${typeof target}`\n );\n }\n }\n return targetElement;\n};\n\nexport const getTextToCopyFromTargetElement = (\n targetElement: TargetToCopy\n): string => {\n let textToCopy: string = '';\n\n if (targetElement instanceof HTMLElement) {\n if (\n targetElement instanceof HTMLInputElement || // targetElement.nodeName === 'INPUT' ||\n targetElement instanceof HTMLTextAreaElement || // targetElement.nodeName === 'TEXTAREA' ||\n targetElement instanceof HTMLSelectElement // targetElement.nodeName === 'SELECT'\n ) {\n textToCopy = targetElement.value;\n } else {\n // simplest approach\n textToCopy = targetElement.innerText;\n\n // approach based on text selection (left for backup just in case)\n // var selection = window.getSelection();\n // var range = document.createRange();\n // selection.removeAllRanges();\n // range.selectNodeContents(targetElement);\n // selection.addRange(range);\n // textToCopy = selection.toString();\n // selection.removeAllRanges();\n }\n }\n return textToCopy;\n};\n\nexport const writeTextToClipboard = async (\n textToCopy: string\n): Promise<boolean> => {\n // finally copy the text to the clipboard using the Clipboard API\n // https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API\n if (textToCopy) {\n try {\n // notice: the \"clipboard-write\" permission is granted automatically to pages when they are in the active tab\n // https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/write\n await navigator.clipboard.writeText(textToCopy);\n // DEBUG uncomment this for easy debugging\n // console.log('success', textToCopy);\n return true;\n } catch {\n // if it is not a secure context, use the polyfill\n // to test that this works in a non-secure context, access the port through your IP address (ie. XXX.XXX.X.XXX:4200/)\n if (!navigator.clipboard) {\n try {\n const clipboard = await import('clipboard-polyfill');\n await clipboard.writeText(textToCopy);\n return true;\n } catch (error) {\n warn(\n `copy action failed, unable to use clipboard-polyfill: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-clipboard.write-text-to-clipboard.catch-error',\n }\n );\n return false;\n }\n }\n\n return false;\n }\n } else {\n return false;\n }\n};\n\nexport const copyToClipboard = async (\n text?: TextToCopy,\n target?: TargetToCopy\n): Promise<boolean> => {\n let textToCopy: string = '';\n\n if (text) {\n textToCopy = getTextToCopy(text);\n } else if (target) {\n const targetElement = getTargetElement(target);\n if (targetElement) {\n textToCopy = getTextToCopyFromTargetElement(targetElement);\n }\n } else {\n assert(\n '`hds-clipboard` modifier - either a `text` or a `target` argument is required'\n );\n }\n const success = await writeTextToClipboard(textToCopy);\n return success;\n};\n\n// Notice: we use a function-based modifier here instead of a class-based one\n// because it's quite simple in its logic, and doesn't require injecting services\n// see: https://github.com/ember-modifier/ember-modifier#function-based-modifiers\n\nexport default modifier<HdsClipboardModifierSignature>(\n (element, _positional, named): (() => void) => {\n assert(\n '`hds-clipboard` modifier - the modifier must be applied to an element',\n element\n );\n\n const { text, target, onSuccess, onError } = named;\n\n const onClick = async (event: MouseEvent): Promise<void> => {\n const trigger = event.currentTarget;\n const success = await copyToClipboard(text, target);\n\n // fire the `onSuccess/onError` callbacks (if provided)\n if (success) {\n if (typeof onSuccess === 'function') {\n onSuccess({ trigger, text, target });\n }\n } else {\n if (typeof onError === 'function') {\n onError({ trigger, text, target });\n }\n }\n };\n\n // add the \"onClick\" event listener to the element\n element.addEventListener('click', onClick);\n\n // this (teardown) function is run when the element is removed\n return (): void => {\n element.removeEventListener('click', onClick);\n };\n }\n);\n"],"names":["getTextToCopy","text","textToCopy","toString","assert","getTargetElement","target","targetElement","document","querySelector","console","error","HTMLElement","NodeList","getTextToCopyFromTargetElement","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","value","innerText","writeTextToClipboard","navigator","clipboard","writeText","warn","JSON","stringify","id","copyToClipboard","success","modifier","element","_positional","named","onSuccess","onError","onClick","event","trigger","currentTarget","addEventListener","removeEventListener"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hds-register-event.js","sources":["../../src/modifiers/hds-register-event.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport { modifier } from 'ember-modifier';\ninterface HdsRegisterEventSignature {\n Element: HTMLElement;\n Args: {\n Positional: [keyof ElementEventMap, EventListener];\n Named: { useCapture?: boolean };\n };\n}\n\n// Notice: we use a function-based modifier here instead of a class-based one\n// because it's quite simple in its logic, and doesn't require injecting services\n// see: https://github.com/ember-modifier/ember-modifier#function-based-modifiers\n\n// this modifier is a \"replacement\" of the standard `{{on 'event' myFunction}}`\n// it's needed because the {{on}} modifier can't be applied conditionally, apparently\n// see: https://github.com/emberjs/ember.js/issues/19869#issuecomment-1909118910\n// see: https://github.com/emberjs/ember.js/pull/20629\n// see also: https://github.com/emberjs/ember.js/blob/main/packages/%40ember/-internals/glimmer/lib/modifiers/on.ts#L30\nexport default modifier<HdsRegisterEventSignature>(\n (element, positional, named = {}) => {\n // the \"target\" element the listeners are added to\n // notice: this is the element the Ember modifier is attached to\n const targetElement = element;\n // the event name and handler to apply to the element\n // notice: it's expressed as \"positional\" argument (array) for the modifier\n const [event, eventHandler] = positional;\n // the options for the `addEventListener()` method\n // see: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n // notice: it's expressed as \"named\" argument (object) for the modifier\n const { useCapture = false } = named;\n\n targetElement.addEventListener(event, eventHandler, useCapture);\n\n // this (teardown) function is run when the element is removed from the DOM\n return (): void => {\n targetElement.removeEventListener(event, eventHandler, useCapture);\n };\n }\n);\n"],"names":["modifier","element","positional","named","targetElement","event","eventHandler","useCapture","addEventListener","removeEventListener"],"mappings":";;AAAA;AACA;AACA;AACA;;AAWA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAeA,QAAQ,CACrB,CAACC,OAAO,EAAEC,UAAU,EAAEC,KAAK,GAAG,EAAE,KAAK;AACnC;AACA;EACA,MAAMC,aAAa,GAAGH,OAAO,CAAA;AAC7B;AACA;AACA,EAAA,MAAM,CAACI,KAAK,EAAEC,YAAY,CAAC,GAAGJ,UAAU,CAAA;AACxC;AACA;AACA;EACA,MAAM;AAAEK,IAAAA,UAAU,GAAG,KAAA;AAAM,GAAC,GAAGJ,KAAK,CAAA;EAEpCC,aAAa,CAACI,gBAAgB,CAACH,KAAK,EAAEC,YAAY,EAAEC,UAAU,CAAC,CAAA;;AAE/D;AACA,EAAA,OAAO,MAAY;IACjBH,aAAa,CAACK,mBAAmB,CAACJ,KAAK,EAAEC,YAAY,EAAEC,UAAU,CAAC,CAAA;GACnE,CAAA;AACH,CACF,CAAC;;;;"}
1
+ {"version":3,"file":"hds-register-event.js","sources":["../../src/modifiers/hds-register-event.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport { modifier } from 'ember-modifier';\nexport interface HdsRegisterEventSignature {\n Element: HTMLElement;\n Args: {\n Positional: [keyof ElementEventMap, EventListener];\n Named: { useCapture?: boolean };\n };\n}\n\n// Notice: we use a function-based modifier here instead of a class-based one\n// because it's quite simple in its logic, and doesn't require injecting services\n// see: https://github.com/ember-modifier/ember-modifier#function-based-modifiers\n\n// this modifier is a \"replacement\" of the standard `{{on 'event' myFunction}}`\n// it's needed because the {{on}} modifier can't be applied conditionally, apparently\n// see: https://github.com/emberjs/ember.js/issues/19869#issuecomment-1909118910\n// see: https://github.com/emberjs/ember.js/pull/20629\n// see also: https://github.com/emberjs/ember.js/blob/main/packages/%40ember/-internals/glimmer/lib/modifiers/on.ts#L30\nexport default modifier<HdsRegisterEventSignature>(\n (element, positional, named = {}) => {\n // the \"target\" element the listeners are added to\n // notice: this is the element the Ember modifier is attached to\n const targetElement = element;\n // the event name and handler to apply to the element\n // notice: it's expressed as \"positional\" argument (array) for the modifier\n const [event, eventHandler] = positional;\n // the options for the `addEventListener()` method\n // see: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n // notice: it's expressed as \"named\" argument (object) for the modifier\n const { useCapture = false } = named;\n\n targetElement.addEventListener(event, eventHandler, useCapture);\n\n // this (teardown) function is run when the element is removed from the DOM\n return (): void => {\n targetElement.removeEventListener(event, eventHandler, useCapture);\n };\n }\n);\n"],"names":["modifier","element","positional","named","targetElement","event","eventHandler","useCapture","addEventListener","removeEventListener"],"mappings":";;AAAA;AACA;AACA;AACA;;AAWA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAeA,QAAQ,CACrB,CAACC,OAAO,EAAEC,UAAU,EAAEC,KAAK,GAAG,EAAE,KAAK;AACnC;AACA;EACA,MAAMC,aAAa,GAAGH,OAAO,CAAA;AAC7B;AACA;AACA,EAAA,MAAM,CAACI,KAAK,EAAEC,YAAY,CAAC,GAAGJ,UAAU,CAAA;AACxC;AACA;AACA;EACA,MAAM;AAAEK,IAAAA,UAAU,GAAG,KAAA;AAAM,GAAC,GAAGJ,KAAK,CAAA;EAEpCC,aAAa,CAACI,gBAAgB,CAACH,KAAK,EAAEC,YAAY,EAAEC,UAAU,CAAC,CAAA;;AAE/D;AACA,EAAA,OAAO,MAAY;IACjBH,aAAa,CAACK,mBAAmB,CAACJ,KAAK,EAAEC,YAAY,EAAEC,UAAU,CAAC,CAAA;GACnE,CAAA;AACH,CACF,CAAC;;;;"}