@hashicorp/react-components 0.0.0 → 1.0.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 (572) hide show
  1. package/.eslintrc.js +4 -0
  2. package/.stylelintrc.js +3 -0
  3. package/.test/setup-vitest.js +1 -0
  4. package/README.md +2 -78
  5. package/global.d.ts +6 -0
  6. package/package.json +29 -29
  7. package/postcss.config.js +21 -0
  8. package/src/components/actions/index.tsx +107 -0
  9. package/src/components/actions/style.module.css +28 -0
  10. package/src/components/actions/types.ts +73 -0
  11. package/src/components/call-to-action/index.tsx +205 -0
  12. package/src/components/call-to-action/styles/variant-centered.module.css +93 -0
  13. package/src/components/call-to-action/styles/variant-compact-grid.module.css +88 -0
  14. package/src/components/call-to-action/styles/variant-compact.module.css +91 -0
  15. package/src/components/call-to-action/styles/variant-links.module.css +85 -0
  16. package/src/components/card/README.md +11 -0
  17. package/src/components/card/card.tsx +45 -0
  18. package/src/components/card/index.test.tsx +69 -0
  19. package/src/components/card/index.tsx +14 -0
  20. package/src/components/card/newsroom-card/index.test.tsx +39 -0
  21. package/src/components/card/newsroom-card/index.tsx +37 -0
  22. package/src/components/card/newsroom-card/style.module.css +12 -0
  23. package/src/components/card/partner-card/index.test.tsx +57 -0
  24. package/src/components/card/partner-card/index.tsx +69 -0
  25. package/src/components/card/partner-card/style.module.css +24 -0
  26. package/src/components/card/person-card/index.test.tsx +71 -0
  27. package/src/components/card/person-card/index.tsx +93 -0
  28. package/src/components/card/person-card/style.module.css +33 -0
  29. package/src/components/card/primitives.tsx +176 -0
  30. package/src/components/card/promo-card/index.tsx +51 -0
  31. package/src/components/card/resource-card/index.test.tsx +48 -0
  32. package/src/components/card/resource-card/index.tsx +37 -0
  33. package/src/components/card/style.module.css +145 -0
  34. package/src/components/card/types.ts +66 -0
  35. package/src/components/card/unified-card/index.tsx +64 -0
  36. package/{packages → src/components}/consent-manager/README.md +44 -1
  37. package/src/components/consent-manager/components/banner/banner.module.css +23 -0
  38. package/src/components/consent-manager/components/banner/banner.test.tsx +31 -0
  39. package/src/components/consent-manager/components/banner/banner.tsx +73 -0
  40. package/src/components/consent-manager/components/dialog/dialog.module.css +145 -0
  41. package/src/components/consent-manager/components/dialog/dialog.test.tsx +194 -0
  42. package/src/components/consent-manager/components/dialog/dialog.tsx +339 -0
  43. package/src/components/consent-manager/img/icn_close.tsx +19 -0
  44. package/src/components/consent-manager/index.test.tsx +334 -0
  45. package/src/components/consent-manager/index.tsx +186 -0
  46. package/src/components/consent-manager/loader/README.md +29 -0
  47. package/src/components/consent-manager/loader/categories.ts +22 -0
  48. package/src/components/consent-manager/loader/index.tsx +94 -0
  49. package/src/components/consent-manager/loader/presets/enterprise.ts +12 -0
  50. package/src/components/consent-manager/loader/presets/oss.ts +10 -0
  51. package/src/components/consent-manager/loader/services.ts +45 -0
  52. package/src/components/consent-manager/scripts/custom.tsx +59 -0
  53. package/src/components/consent-manager/scripts/segment.tsx +87 -0
  54. package/src/components/consent-manager/style.module.css +9 -0
  55. package/src/components/consent-manager/types.ts +55 -0
  56. package/src/components/consent-manager/util/cookies.test.ts +75 -0
  57. package/src/components/consent-manager/util/cookies.ts +70 -0
  58. package/src/components/consent-manager/util/integrations.test.ts +115 -0
  59. package/src/components/consent-manager/util/integrations.ts +110 -0
  60. package/src/components/intro/index.tsx +82 -0
  61. package/src/components/intro/style.module.css +67 -0
  62. package/src/components/intro/types.ts +44 -0
  63. package/src/components/marketo-form/CHANGELOG.md +122 -0
  64. package/src/components/marketo-form/README.md +1 -0
  65. package/src/components/marketo-form/contexts/FormMetadata.ts +11 -0
  66. package/src/components/marketo-form/docs.mdx +197 -0
  67. package/src/components/marketo-form/fixtures/index.ts +185 -0
  68. package/src/components/marketo-form/form/index.tsx +369 -0
  69. package/src/components/marketo-form/index.test.tsx +320 -0
  70. package/src/components/marketo-form/index.ts +11 -0
  71. package/src/components/marketo-form/package.original.json +30 -0
  72. package/src/components/marketo-form/partials/error-message/index.tsx +12 -0
  73. package/src/components/marketo-form/partials/error-message/style.module.css +13 -0
  74. package/src/components/marketo-form/partials/field/index.tsx +90 -0
  75. package/src/components/marketo-form/partials/field-wrapper/index.tsx +26 -0
  76. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +32 -0
  77. package/src/components/marketo-form/partials/fields/email-field/index.tsx +35 -0
  78. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +21 -0
  79. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +37 -0
  80. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +21 -0
  81. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +6 -0
  82. package/src/components/marketo-form/partials/fields/name-field/index.tsx +19 -0
  83. package/src/components/marketo-form/partials/fields/name-field/style.module.css +13 -0
  84. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +48 -0
  85. package/src/components/marketo-form/partials/fields/select-field/index.tsx +39 -0
  86. package/src/components/marketo-form/partials/fields/select-field/style.module.css +5 -0
  87. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +30 -0
  88. package/src/components/marketo-form/partials/fields/text-field/index.tsx +30 -0
  89. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +29 -0
  90. package/src/components/marketo-form/partials/label/index.tsx +24 -0
  91. package/src/components/marketo-form/partials/label/style.module.css +12 -0
  92. package/src/components/marketo-form/partials/visibility-rule/index.tsx +84 -0
  93. package/src/components/marketo-form/props.js +66 -0
  94. package/src/components/marketo-form/server/api-routes.ts +109 -0
  95. package/src/components/marketo-form/server/client.ts +98 -0
  96. package/src/components/marketo-form/server/index.ts +8 -0
  97. package/src/components/marketo-form/types.ts +268 -0
  98. package/src/components/marketo-form/utils.test.tsx +103 -0
  99. package/src/components/marketo-form/utils.ts +445 -0
  100. package/src/components/next-steps/index.tsx +143 -0
  101. package/src/components/next-steps/style.module.css +270 -0
  102. package/src/components/next-steps/types.ts +63 -0
  103. package/src/components/product-badge/index.test.tsx +11 -0
  104. package/src/components/product-badge/index.tsx +42 -0
  105. package/src/components/product-badge/style.module.css +76 -0
  106. package/src/components/products-used/index.tsx +84 -0
  107. package/src/components/products-used/style.module.css +87 -0
  108. package/src/components/products-used/types.ts +31 -0
  109. package/src/components/related-content/index.test.tsx +74 -0
  110. package/src/components/related-content/index.tsx +56 -0
  111. package/src/components/related-content/style.module.css +89 -0
  112. package/src/components/related-content/types.ts +21 -0
  113. package/src/components/subnav/helpers/areBasePathsMatching.ts +13 -0
  114. package/src/components/subnav/helpers/traverse/index.ts +42 -0
  115. package/src/components/subnav/helpers/useHeightRef.ts +42 -0
  116. package/src/components/subnav/helpers/useNavRef.ts +30 -0
  117. package/src/components/subnav/helpers/useOverflowRef.ts +85 -0
  118. package/src/components/subnav/helpers/useStuckRef.ts +51 -0
  119. package/src/components/subnav/index.tsx +199 -0
  120. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +26 -0
  121. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +22 -0
  122. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +87 -0
  123. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +29 -0
  124. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +32 -0
  125. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +85 -0
  126. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +20 -0
  127. package/{packages → src/components}/subnav/partials/CtaLinks/icons/github.svg.js +5 -0
  128. package/src/components/subnav/partials/CtaLinks/icons/star.js +20 -0
  129. package/src/components/subnav/partials/CtaLinks/index.tsx +131 -0
  130. package/src/components/subnav/partials/CtaLinks/style.module.css +45 -0
  131. package/src/components/subnav/partials/DropdownTrigger/index.tsx +35 -0
  132. package/src/components/subnav/partials/DropdownTrigger/style.module.css +36 -0
  133. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +151 -0
  134. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +91 -0
  135. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +139 -0
  136. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +82 -0
  137. package/src/components/subnav/partials/TitleLink/index.tsx +113 -0
  138. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +9 -0
  139. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +9 -0
  140. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +23 -0
  141. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +23 -0
  142. package/src/components/subnav/partials/TitleLink/style.module.css +43 -0
  143. package/src/components/subnav/partials/nav-item-text/index.tsx +37 -0
  144. package/src/components/subnav/partials/nav-item-text/style.module.css +15 -0
  145. package/src/components/subnav/style.module.css +68 -0
  146. package/src/components/subnav/subnav-consts.ts +1 -0
  147. package/src/components/subnav/theme.module.css +50 -0
  148. package/tsconfig.json +14 -0
  149. package/vitest.config.mts +12 -0
  150. package/.circleci/config.yml +0 -8
  151. package/.github/pull_request_template.md +0 -36
  152. package/.github/workflows/publish.yml +0 -181
  153. package/__test-helpers/expect-throw.js +0 -6
  154. package/__test-helpers/extend-expect.js +0 -1
  155. package/__test-helpers/mocks/css-module-mock.js +0 -1
  156. package/__test-helpers/mocks/graphql-fragment-mock.js +0 -1
  157. package/__test-helpers/mocks/svg-mock.js +0 -1
  158. package/babel.config.js +0 -5
  159. package/jest.config.js +0 -13
  160. package/lerna.json +0 -16
  161. package/next.config.js +0 -14
  162. package/packages/accordion/LICENSE +0 -373
  163. package/packages/accordion/README.md +0 -5
  164. package/packages/accordion/index.js +0 -21
  165. package/packages/accordion/package-lock.json +0 -13
  166. package/packages/accordion/package.json +0 -20
  167. package/packages/accordion/partials/AccordionItems/fixtures/default.json +0 -12
  168. package/packages/accordion/partials/AccordionItems/icons/arrow-down.svg +0 -1
  169. package/packages/accordion/partials/AccordionItems/index.js +0 -64
  170. package/packages/accordion/partials/AccordionItems/style.css +0 -2
  171. package/packages/accordion/partials/AccordionItems/styles/content.css +0 -47
  172. package/packages/accordion/partials/AccordionItems/styles/index.css +0 -72
  173. package/packages/accordion/partials/Collapsible/index.js +0 -87
  174. package/packages/accordion/partials/Collapsible/style.css +0 -10
  175. package/packages/accordion/style.css +0 -3
  176. package/packages/accordion/styles/index.css +0 -14
  177. package/packages/alert/LICENSE +0 -373
  178. package/packages/alert/README.md +0 -9
  179. package/packages/alert/fragment.graphql +0 -8
  180. package/packages/alert/index.js +0 -44
  181. package/packages/alert/package.json +0 -22
  182. package/packages/alert/style.css +0 -138
  183. package/packages/alert-banner/LICENSE +0 -373
  184. package/packages/alert-banner/README.md +0 -3
  185. package/packages/alert-banner/close-icon.js +0 -35
  186. package/packages/alert-banner/fragment.graphql +0 -8
  187. package/packages/alert-banner/index.jsx +0 -97
  188. package/packages/alert-banner/package-lock.json +0 -18
  189. package/packages/alert-banner/package.json +0 -26
  190. package/packages/alert-banner/style.css +0 -151
  191. package/packages/button/LICENSE +0 -373
  192. package/packages/button/README.md +0 -19
  193. package/packages/button/fragment.graphql +0 -6
  194. package/packages/button/helpers/normalizeButtonTheme.js +0 -49
  195. package/packages/button/icons/arrow-right.svg.js +0 -1
  196. package/packages/button/icons/chevron-down.svg.js +0 -1
  197. package/packages/button/icons/download.svg.js +0 -1
  198. package/packages/button/icons/external-link.svg.js +0 -1
  199. package/packages/button/index.js +0 -86
  200. package/packages/button/package-lock.json +0 -18
  201. package/packages/button/package.json +0 -21
  202. package/packages/button/styles/index.css +0 -122
  203. package/packages/button/styles/variant-primary.css +0 -232
  204. package/packages/button/styles/variant-secondary.css +0 -179
  205. package/packages/button/styles/variant-tertiary-neutral.css +0 -65
  206. package/packages/button/styles/variant-tertiary.css +0 -182
  207. package/packages/call-to-action/LICENSE +0 -373
  208. package/packages/call-to-action/README.md +0 -3
  209. package/packages/call-to-action/index.js +0 -67
  210. package/packages/call-to-action/package-lock.json +0 -27
  211. package/packages/call-to-action/package.json +0 -21
  212. package/packages/call-to-action/style.css +0 -1
  213. package/packages/call-to-action/styles/_temp-spacing-tokens.css +0 -33
  214. package/packages/call-to-action/styles/common.css +0 -27
  215. package/packages/call-to-action/styles/index.css +0 -4
  216. package/packages/call-to-action/styles/variant-centered.css +0 -44
  217. package/packages/call-to-action/styles/variant-compact.css +0 -46
  218. package/packages/call-to-action/styles/variant-links.css +0 -32
  219. package/packages/callouts/LICENSE +0 -373
  220. package/packages/callouts/README.md +0 -8
  221. package/packages/callouts/index.js +0 -67
  222. package/packages/callouts/package-lock.json +0 -33
  223. package/packages/callouts/package.json +0 -20
  224. package/packages/callouts/partials/callout-item/fixtures/default.json +0 -9
  225. package/packages/callouts/partials/callout-item/index.js +0 -71
  226. package/packages/callouts/partials/callout-item/style.css +0 -76
  227. package/packages/callouts/style.css +0 -1
  228. package/packages/callouts/styles/_temp-reset.css +0 -11
  229. package/packages/callouts/styles/_temp-spacing-tokens.css +0 -41
  230. package/packages/callouts/styles/index.css +0 -124
  231. package/packages/case-study-slider/LICENSE +0 -373
  232. package/packages/case-study-slider/Logo.js +0 -6
  233. package/packages/case-study-slider/StatusBar.js +0 -14
  234. package/packages/case-study-slider/StatusBar.test.js +0 -32
  235. package/packages/case-study-slider/docs.mdx +0 -144
  236. package/packages/case-study-slider/fragment.graphql +0 -33
  237. package/packages/case-study-slider/index.js +0 -229
  238. package/packages/case-study-slider/index.test.js +0 -279
  239. package/packages/case-study-slider/package-lock.json +0 -72
  240. package/packages/case-study-slider/package.json +0 -20
  241. package/packages/case-study-slider/props.js +0 -182
  242. package/packages/case-study-slider/readme.md +0 -7
  243. package/packages/case-study-slider/style.css +0 -176
  244. package/packages/checkbox-input/LICENSE +0 -373
  245. package/packages/checkbox-input/index.js +0 -55
  246. package/packages/checkbox-input/package-lock.json +0 -13
  247. package/packages/checkbox-input/package.json +0 -20
  248. package/packages/checkbox-input/readme.md +0 -19
  249. package/packages/checkbox-input/style.css +0 -110
  250. package/packages/code-block/LICENSE +0 -373
  251. package/packages/code-block/README.md +0 -9
  252. package/packages/code-block/fragment.graphql +0 -10
  253. package/packages/code-block/img/clipboard.svg +0 -1
  254. package/packages/code-block/index.js +0 -85
  255. package/packages/code-block/languages/sentinel.js +0 -71
  256. package/packages/code-block/package-lock.json +0 -68
  257. package/packages/code-block/package.json +0 -22
  258. package/packages/code-block/style.css +0 -162
  259. package/packages/consent-manager/LICENSE +0 -373
  260. package/packages/consent-manager/banner.js +0 -39
  261. package/packages/consent-manager/cookies.js +0 -53
  262. package/packages/consent-manager/dialog.js +0 -286
  263. package/packages/consent-manager/icn_close.js +0 -19
  264. package/packages/consent-manager/index.js +0 -119
  265. package/packages/consent-manager/integrations.js +0 -92
  266. package/packages/consent-manager/load.js +0 -139
  267. package/packages/consent-manager/package-lock.json +0 -45
  268. package/packages/consent-manager/package.json +0 -24
  269. package/packages/consent-manager/style.css +0 -209
  270. package/packages/content/LICENSE +0 -373
  271. package/packages/content/README.md +0 -8
  272. package/packages/content/index.js +0 -9
  273. package/packages/content/package.json +0 -17
  274. package/packages/content/style.css +0 -322
  275. package/packages/content-cta/LICENSE +0 -373
  276. package/packages/content-cta/README.md +0 -3
  277. package/packages/content-cta/docs.mdx +0 -25
  278. package/packages/content-cta/index.js +0 -49
  279. package/packages/content-cta/index.test.js +0 -78
  280. package/packages/content-cta/package-lock.json +0 -27
  281. package/packages/content-cta/package.json +0 -20
  282. package/packages/content-cta/props.js +0 -41
  283. package/packages/content-cta/stories/docs.mdx +0 -0
  284. package/packages/content-cta/stories/examples.stories.js +0 -51
  285. package/packages/content-cta/stories/with-knobs.stories.js +0 -58
  286. package/packages/content-cta/style.css +0 -80
  287. package/packages/docs-page/LICENSE +0 -373
  288. package/packages/docs-page/README.md +0 -51
  289. package/packages/docs-page/components.js +0 -11
  290. package/packages/docs-page/docs.mdx +0 -71
  291. package/packages/docs-page/img/github-logo.svg +0 -1
  292. package/packages/docs-page/index.js +0 -75
  293. package/packages/docs-page/index.test.js +0 -18
  294. package/packages/docs-page/package-lock.json +0 -138
  295. package/packages/docs-page/package.json +0 -28
  296. package/packages/docs-page/props.js +0 -59
  297. package/packages/docs-page/server.js +0 -137
  298. package/packages/docs-page/style.css +0 -120
  299. package/packages/docs-page/temporary_jump-to-section.js +0 -64
  300. package/packages/docs-sidenav/LICENSE +0 -373
  301. package/packages/docs-sidenav/README.md +0 -7
  302. package/packages/docs-sidenav/chevron-icon.js +0 -18
  303. package/packages/docs-sidenav/img/external.svg +0 -7
  304. package/packages/docs-sidenav/index.js +0 -457
  305. package/packages/docs-sidenav/menu-icon.js +0 -14
  306. package/packages/docs-sidenav/package-lock.json +0 -26
  307. package/packages/docs-sidenav/package.json +0 -21
  308. package/packages/docs-sidenav/style.css +0 -302
  309. package/packages/enterprise-alert/LICENSE +0 -373
  310. package/packages/enterprise-alert/README.md +0 -9
  311. package/packages/enterprise-alert/index.js +0 -28
  312. package/packages/enterprise-alert/package-lock.json +0 -13
  313. package/packages/enterprise-alert/package.json +0 -23
  314. package/packages/enterprise-alert/style.css +0 -91
  315. package/packages/featured-slider/LICENSE +0 -373
  316. package/packages/featured-slider/README.md +0 -3
  317. package/packages/featured-slider/StatusBar.js +0 -14
  318. package/packages/featured-slider/docs.mdx +0 -60
  319. package/packages/featured-slider/index.js +0 -231
  320. package/packages/featured-slider/index.test.js +0 -59
  321. package/packages/featured-slider/package-lock.json +0 -66
  322. package/packages/featured-slider/package.json +0 -22
  323. package/packages/featured-slider/props.js +0 -82
  324. package/packages/featured-slider/style.css +0 -204
  325. package/packages/hashi-stack-menu/LICENSE +0 -373
  326. package/packages/hashi-stack-menu/README.md +0 -3
  327. package/packages/hashi-stack-menu/assets/icon-dropdown.svg +0 -1
  328. package/packages/hashi-stack-menu/assets/logo.svg +0 -1
  329. package/packages/hashi-stack-menu/assets/product-icons/boundary-icon-color.svg +0 -1
  330. package/packages/hashi-stack-menu/assets/product-icons/consul-icon-color.svg +0 -1
  331. package/packages/hashi-stack-menu/assets/product-icons/nomad-icon-color.svg +0 -1
  332. package/packages/hashi-stack-menu/assets/product-icons/packer-icon-color.svg +0 -1
  333. package/packages/hashi-stack-menu/assets/product-icons/terraform-icon-color.svg +0 -1
  334. package/packages/hashi-stack-menu/assets/product-icons/vagrant-icon-color.svg +0 -1
  335. package/packages/hashi-stack-menu/assets/product-icons/vault-icon-color.svg +0 -1
  336. package/packages/hashi-stack-menu/assets/product-icons/waypoint-icon-color.svg +0 -1
  337. package/packages/hashi-stack-menu/browse-panel/browse-panel.module.css +0 -33
  338. package/packages/hashi-stack-menu/browse-panel/index.jsx +0 -9
  339. package/packages/hashi-stack-menu/data/index.js +0 -125
  340. package/packages/hashi-stack-menu/hashi-stack-menu.module.css +0 -41
  341. package/packages/hashi-stack-menu/index.jsx +0 -51
  342. package/packages/hashi-stack-menu/nav-item/index.jsx +0 -100
  343. package/packages/hashi-stack-menu/nav-item/nav-item.module.css +0 -64
  344. package/packages/hashi-stack-menu/package-lock.json +0 -18
  345. package/packages/hashi-stack-menu/package.json +0 -17
  346. package/packages/hashi-stack-menu/stack-group/index.jsx +0 -16
  347. package/packages/hashi-stack-menu/stack-group/stack-group.module.css +0 -29
  348. package/packages/hashi-stack-menu/stack-item/index.jsx +0 -35
  349. package/packages/hashi-stack-menu/stack-item/stack-item.module.css +0 -58
  350. package/packages/hashi-stack-menu/stack-menu-section/index.jsx +0 -18
  351. package/packages/hashi-stack-menu/stack-menu-section/stack-menu-section.module.css +0 -26
  352. package/packages/hashi-stack-menu/use-on-click-outside-dropdown.js +0 -22
  353. package/packages/head/LICENSE +0 -373
  354. package/packages/head/README.md +0 -236
  355. package/packages/head/index.d.ts +0 -107
  356. package/packages/head/index.js +0 -66
  357. package/packages/head/package.json +0 -17
  358. package/packages/hero/LICENSE +0 -373
  359. package/packages/hero/README.md +0 -31
  360. package/packages/hero/arrow-icon.js +0 -24
  361. package/packages/hero/carousel.js +0 -153
  362. package/packages/hero/fragment.graphql +0 -55
  363. package/packages/hero/heroLeadForm.js +0 -107
  364. package/packages/hero/index.js +0 -129
  365. package/packages/hero/package-lock.json +0 -273
  366. package/packages/hero/package.json +0 -28
  367. package/packages/hero/style.css +0 -501
  368. package/packages/image/LICENSE +0 -373
  369. package/packages/image/fragment.graphql +0 -5
  370. package/packages/image/index.js +0 -81
  371. package/packages/image/package-lock.json +0 -33
  372. package/packages/image/package.json +0 -21
  373. package/packages/image/readme.md +0 -27
  374. package/packages/inline-svg/LICENSE +0 -373
  375. package/packages/inline-svg/README.md +0 -9
  376. package/packages/inline-svg/docs.mdx +0 -15
  377. package/packages/inline-svg/index.js +0 -23
  378. package/packages/inline-svg/index.test.js +0 -50
  379. package/packages/inline-svg/package.json +0 -30
  380. package/packages/inline-svg/props.js +0 -10
  381. package/packages/learn-callout/LICENSE +0 -373
  382. package/packages/learn-callout/README.md +0 -9
  383. package/packages/learn-callout/docs.mdx +0 -31
  384. package/packages/learn-callout/index.js +0 -57
  385. package/packages/learn-callout/index.test.js +0 -49
  386. package/packages/learn-callout/props.js +0 -47
  387. package/packages/learn-callout/style.css +0 -207
  388. package/packages/link-wrap/LICENSE +0 -373
  389. package/packages/link-wrap/README.md +0 -44
  390. package/packages/link-wrap/index.js +0 -40
  391. package/packages/link-wrap/package-lock.json +0 -5
  392. package/packages/link-wrap/package.json +0 -17
  393. package/packages/logo-grid/LICENSE +0 -373
  394. package/packages/logo-grid/README.md +0 -26
  395. package/packages/logo-grid/fragment.graphql +0 -17
  396. package/packages/logo-grid/index.js +0 -157
  397. package/packages/logo-grid/package-lock.json +0 -111
  398. package/packages/logo-grid/package.json +0 -21
  399. package/packages/logo-grid/style.css +0 -148
  400. package/packages/product-downloader/LICENSE +0 -373
  401. package/packages/product-downloader/README.md +0 -9
  402. package/packages/product-downloader/index.js +0 -102
  403. package/packages/product-downloader/package-lock.json +0 -103
  404. package/packages/product-downloader/package.json +0 -18
  405. package/packages/product-downloader/partials/download-cards/index.jsx +0 -125
  406. package/packages/product-downloader/partials/download-cards/style.module.css +0 -152
  407. package/packages/product-downloader/partials/dropdown/index.jsx +0 -58
  408. package/packages/product-downloader/partials/dropdown/style.module.css +0 -28
  409. package/packages/product-downloader/partials/logos/fastly.svg +0 -7
  410. package/packages/product-downloader/partials/release-information/index.jsx +0 -148
  411. package/packages/product-downloader/partials/release-information/style.module.css +0 -101
  412. package/packages/product-downloader/style.module.css +0 -100
  413. package/packages/product-downloader/utils/downloader.js +0 -136
  414. package/packages/product-features-list/LICENSE +0 -373
  415. package/packages/product-features-list/README.md +0 -3
  416. package/packages/product-features-list/index.js +0 -30
  417. package/packages/product-features-list/package-lock.json +0 -42
  418. package/packages/product-features-list/package.json +0 -20
  419. package/packages/product-features-list/style.css +0 -90
  420. package/packages/search/LICENSE +0 -373
  421. package/packages/search/README.md +0 -188
  422. package/packages/search/hits.js +0 -196
  423. package/packages/search/img/return.svg.js +0 -1
  424. package/packages/search/img/search-legend-enter.svg.js +0 -1
  425. package/packages/search/img/search-legend-escape.svg.js +0 -1
  426. package/packages/search/img/search-legend-page.svg.js +0 -1
  427. package/packages/search/img/search-x.svg.js +0 -1
  428. package/packages/search/img/search.svg.js +0 -1
  429. package/packages/search/img/slash-search-toggle.js +0 -17
  430. package/packages/search/index.js +0 -60
  431. package/packages/search/legend.js +0 -32
  432. package/packages/search/package-lock.json +0 -931
  433. package/packages/search/package.json +0 -29
  434. package/packages/search/provider.js +0 -81
  435. package/packages/search/search-box.js +0 -139
  436. package/packages/search/style.css +0 -366
  437. package/packages/search/tools.js +0 -166
  438. package/packages/section-header/LICENSE +0 -373
  439. package/packages/section-header/README.md +0 -13
  440. package/packages/section-header/fragment.graphql +0 -5
  441. package/packages/section-header/index.js +0 -42
  442. package/packages/section-header/package-lock.json +0 -18
  443. package/packages/section-header/package.json +0 -20
  444. package/packages/section-header/style.css +0 -18
  445. package/packages/select-input/LICENSE +0 -373
  446. package/packages/select-input/README.md +0 -1
  447. package/packages/select-input/img/dropdown-arrow.svg +0 -1
  448. package/packages/select-input/index.js +0 -80
  449. package/packages/select-input/package-lock.json +0 -70
  450. package/packages/select-input/package.json +0 -19
  451. package/packages/select-input/style.css +0 -88
  452. package/packages/subnav/LICENSE +0 -373
  453. package/packages/subnav/README.md +0 -85
  454. package/packages/subnav/helpers/globalThis.js +0 -9
  455. package/packages/subnav/helpers/traverse/index.js +0 -34
  456. package/packages/subnav/helpers/useNavRef.js +0 -16
  457. package/packages/subnav/helpers/useOverflowRef.js +0 -76
  458. package/packages/subnav/helpers/useStuckRef.js +0 -43
  459. package/packages/subnav/icons/boundary-logo-color.svgr.js +0 -32
  460. package/packages/subnav/icons/chevron-down.svg.js +0 -3
  461. package/packages/subnav/icons/consul-logo-color.svgr.js +0 -44
  462. package/packages/subnav/icons/hcp-logo-black-white.svgr.js +0 -29
  463. package/packages/subnav/icons/nomad-logo-color.svgr.js +0 -50
  464. package/packages/subnav/icons/packer-logo-color.svgr.js +0 -40
  465. package/packages/subnav/icons/terraform-logo-color.svgr.js +0 -44
  466. package/packages/subnav/icons/vagrant-logo-color.svgr.js +0 -38
  467. package/packages/subnav/icons/vault-logo-color.svgr.js +0 -32
  468. package/packages/subnav/icons/waypoint-logo-color.svgr.js +0 -28
  469. package/packages/subnav/index.js +0 -107
  470. package/packages/subnav/package-lock.json +0 -56
  471. package/packages/subnav/package.json +0 -25
  472. package/packages/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.js +0 -17
  473. package/packages/subnav/partials/CtaLinks/github-stars-link/index.js +0 -71
  474. package/packages/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.js +0 -25
  475. package/packages/subnav/partials/CtaLinks/github-stars-link/style.css +0 -78
  476. package/packages/subnav/partials/CtaLinks/icons/github-logo.js +0 -14
  477. package/packages/subnav/partials/CtaLinks/icons/star.js +0 -14
  478. package/packages/subnav/partials/CtaLinks/index.js +0 -48
  479. package/packages/subnav/partials/CtaLinks/style.css +0 -32
  480. package/packages/subnav/partials/DropdownTrigger/index.js +0 -20
  481. package/packages/subnav/partials/DropdownTrigger/style.css +0 -27
  482. package/packages/subnav/partials/MenuItemsDefault/index.js +0 -131
  483. package/packages/subnav/partials/MenuItemsDefault/style.css +0 -63
  484. package/packages/subnav/partials/MenuItemsOverflow/index.js +0 -117
  485. package/packages/subnav/partials/MenuItemsOverflow/style.css +0 -38
  486. package/packages/subnav/partials/TitleLink/index.js +0 -40
  487. package/packages/subnav/partials/TitleLink/style.css +0 -21
  488. package/packages/subnav/style.css +0 -6
  489. package/packages/subnav/styles/_temp-g-svg.css +0 -22
  490. package/packages/subnav/styles/_temp-resets.css +0 -15
  491. package/packages/subnav/styles/index.css +0 -103
  492. package/packages/tabbed-accordion/LICENSE +0 -373
  493. package/packages/tabbed-accordion/README.md +0 -3
  494. package/packages/tabbed-accordion/fixtures/base.json +0 -44
  495. package/packages/tabbed-accordion/index.js +0 -27
  496. package/packages/tabbed-accordion/package-lock.json +0 -27
  497. package/packages/tabbed-accordion/package.json +0 -19
  498. package/packages/tabbed-accordion/style/_temp-spacing-tokens.css +0 -36
  499. package/packages/tabbed-accordion/style/index.css +0 -22
  500. package/packages/tabbed-accordion/style.css +0 -1
  501. package/packages/tabs/LICENSE +0 -373
  502. package/packages/tabs/README.md +0 -31
  503. package/packages/tabs/index.js +0 -41
  504. package/packages/tabs/package-lock.json +0 -73
  505. package/packages/tabs/package.json +0 -18
  506. package/packages/tabs/partials/TabTriggers/helpers/smoothScroll.js +0 -77
  507. package/packages/tabs/partials/TabTriggers/icons/chevron-right_black.svg.js +0 -1
  508. package/packages/tabs/partials/TabTriggers/index.js +0 -143
  509. package/packages/tabs/partials/TabTriggers/partials/TabTrigger/icons/tooltip.svg.js +0 -1
  510. package/packages/tabs/partials/TabTriggers/partials/TabTrigger/index.js +0 -37
  511. package/packages/tabs/partials/TabTriggers/partials/TabTrigger/style.css +0 -75
  512. package/packages/tabs/partials/TabTriggers/style.css +0 -152
  513. package/packages/tabs/style.css +0 -67
  514. package/packages/terminal/LICENSE +0 -373
  515. package/packages/terminal/README.md +0 -9
  516. package/packages/terminal/Terminal.module.css +0 -146
  517. package/packages/terminal/index.jsx +0 -46
  518. package/packages/terminal/package.json +0 -17
  519. package/packages/text-input/LICENSE +0 -373
  520. package/packages/text-input/README.md +0 -24
  521. package/packages/text-input/index.js +0 -42
  522. package/packages/text-input/package-lock.json +0 -13
  523. package/packages/text-input/package.json +0 -19
  524. package/packages/text-input/style.css +0 -68
  525. package/packages/text-split/LICENSE +0 -373
  526. package/packages/text-split/README.md +0 -3
  527. package/packages/text-split/index.js +0 -66
  528. package/packages/text-split/package-lock.json +0 -35
  529. package/packages/text-split/package.json +0 -20
  530. package/packages/text-split/partials/button-group/index.js +0 -40
  531. package/packages/text-split/partials/button-group/style.css +0 -28
  532. package/packages/text-split/partials/checkbox-list/icons/check-circle.svg.jsx +0 -39
  533. package/packages/text-split/partials/checkbox-list/index.js +0 -28
  534. package/packages/text-split/partials/checkbox-list/style.css +0 -59
  535. package/packages/text-split/style.css +0 -1
  536. package/packages/text-split/styles/_temp-spacing-tokens.css +0 -37
  537. package/packages/text-split/styles/index.css +0 -86
  538. package/packages/text-split-with-code/LICENSE +0 -373
  539. package/packages/text-split-with-code/README.md +0 -13
  540. package/packages/text-split-with-code/index.js +0 -29
  541. package/packages/text-split-with-code/package-lock.json +0 -117
  542. package/packages/text-split-with-code/package.json +0 -21
  543. package/packages/text-split-with-code/style.css +0 -42
  544. package/packages/text-split-with-image/LICENSE +0 -373
  545. package/packages/text-split-with-image/README.md +0 -12
  546. package/packages/text-split-with-image/index.js +0 -11
  547. package/packages/text-split-with-image/package-lock.json +0 -75
  548. package/packages/text-split-with-image/package.json +0 -17
  549. package/packages/text-split-with-logo-grid/LICENSE +0 -373
  550. package/packages/text-split-with-logo-grid/README.md +0 -8
  551. package/packages/text-split-with-logo-grid/index.js +0 -63
  552. package/packages/text-split-with-logo-grid/package-lock.json +0 -90
  553. package/packages/text-split-with-logo-grid/package.json +0 -18
  554. package/packages/text-split-with-logo-grid/style.css +0 -88
  555. package/packages/toggle/LICENSE +0 -373
  556. package/packages/toggle/index.js +0 -22
  557. package/packages/toggle/package-lock.json +0 -5
  558. package/packages/toggle/package.json +0 -17
  559. package/packages/toggle/readme.md +0 -7
  560. package/packages/toggle/style.css +0 -35
  561. package/packages/vertical-text-block-list/LICENSE +0 -373
  562. package/packages/vertical-text-block-list/README.md +0 -15
  563. package/packages/vertical-text-block-list/index.js +0 -54
  564. package/packages/vertical-text-block-list/package-lock.json +0 -60
  565. package/packages/vertical-text-block-list/package.json +0 -22
  566. package/packages/vertical-text-block-list/style.css +0 -104
  567. package/pages/_app.jsx +0 -5
  568. package/pages/global.css +0 -43
  569. package/pages/index.jsx +0 -16
  570. package/prettier.config.js +0 -4
  571. package/scripts/release-check-branch.sh +0 -15
  572. package/scripts/release-check-npm-auth.sh +0 -39
@@ -0,0 +1,45 @@
1
+ export default {
2
+ googleAnalytics: {
3
+ name: 'Google Analytics',
4
+ description:
5
+ 'Google Analytics is a popular service for tracking web traffic. We use this data to determine what content our users find important so that we can dedicate more resources toward improving what matters most.',
6
+ category: 'Analytics',
7
+ },
8
+ googleTagManager: {
9
+ name: 'Google Tag Manager',
10
+ description:
11
+ 'Google Tag Manager allows us to see how effective our advertising campaigns have been by measuring how many users arrived at our site via external advertisements for HashiCorp services. It is also used for the Google Optimize service, which performs A/B tests designed to optimize the usability of our websites.',
12
+ category: 'Analytics',
13
+ },
14
+ linkedIn: {
15
+ name: 'LinkedIn Insight Tag',
16
+ description:
17
+ 'This small script allows us to see how effective our LinkedIn campaigns are by measuring how many users have clicked prompts on LinkedIn to arrive at our site.',
18
+ category: 'Advertising',
19
+ },
20
+ heap: {
21
+ name: 'Heap',
22
+ description:
23
+ 'Heap is an analytics tool that is used to track interaction with specific elements on websites, like menus or buttons in sequence, as opposed to tracking overall pageviews like Google Analytics. We use this to test our user experience and ensure that people are able to find what they are looking for on our websites.',
24
+ category: 'Analytics',
25
+ },
26
+ marketo: {
27
+ name: 'Marketo V2',
28
+ description:
29
+ 'Marketo is a marketing automation tool that allows us to segment users into different categories based off of their behaviors. We use this information to provide tailored information to users in our email campaigns.',
30
+ category: 'Email Marketing',
31
+ },
32
+ engagio: {
33
+ name: 'Engagio',
34
+ description:
35
+ "Engagio is a service that aids with the company's marketing efforts by estimating the types of visitors that are using our website and the way they move through it, allowing us to optimize content to best fit expectations.",
36
+ category: 'Advertising',
37
+ body: `var _eiq = _eiq || [];var _engagio_settings = {accountId: "a44336530751c27cca1d8124d3f1ad1867bb0c93"};(function() {var ei = document.createElement('script'); ei.type = 'text/javascript'; ei.async = true;ei.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'web-analytics.engagio.com/js/ei.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ei, s);})();`,
38
+ },
39
+ googleAds: {
40
+ name: 'Google Ads (Gtag)',
41
+ description:
42
+ 'This script keeps track of whether those who have clicked on advertisements for HashiCorp services we have run through google have clicked and arrived successfully on our website.',
43
+ category: 'Advertising',
44
+ },
45
+ }
@@ -0,0 +1,59 @@
1
+ import Script from 'next/script'
2
+ import { ConsentManagerService, ConsentManagerPreferences } from '../types'
3
+
4
+ interface CustomScriptProps {
5
+ service: ConsentManagerService
6
+ }
7
+
8
+ interface CustomScriptsProps {
9
+ preferences: ConsentManagerPreferences
10
+ services?: ConsentManagerService[]
11
+ }
12
+
13
+ function CustomScript({ service }: CustomScriptProps) {
14
+ const dataAttrs = service.dataAttrs
15
+ ? Object.fromEntries(
16
+ service.dataAttrs.map((attr) => [`data-${attr.name}`, attr.value])
17
+ )
18
+ : {}
19
+
20
+ const strategy =
21
+ service.strategy ?? service.async ? 'afterInteractive' : 'beforeInteractive'
22
+
23
+ return (
24
+ <Script
25
+ src={service.url}
26
+ strategy={strategy}
27
+ id={service.name}
28
+ {...dataAttrs}
29
+ onLoad={service?.onLoad}
30
+ >
31
+ {service.body ? service.body : null}
32
+ </Script>
33
+ )
34
+ }
35
+
36
+ export default function CustomScripts({
37
+ preferences,
38
+ services = [],
39
+ }: CustomScriptsProps) {
40
+ if (!preferences.loadAll && services?.length === 0) return null
41
+
42
+ let servicesToInject: ConsentManagerService[] = []
43
+
44
+ if (preferences.loadAll) {
45
+ servicesToInject = services
46
+ } else {
47
+ servicesToInject = services.filter(
48
+ (service) => preferences?.custom?.[service.name]
49
+ )
50
+ }
51
+
52
+ return (
53
+ <>
54
+ {servicesToInject.map((service) => (
55
+ <CustomScript service={service} key={service.name} />
56
+ ))}
57
+ </>
58
+ )
59
+ }
@@ -0,0 +1,87 @@
1
+ import Script from 'next/script'
2
+
3
+ declare global {
4
+ interface Window {
5
+ heap?: $TSFixMe
6
+ }
7
+ }
8
+
9
+ // Define a function that's responsible for sending Segment-related properties to Heap
10
+ // We pass this callback function to Segment's ready method (https://segment.com/docs/sources/website/analytics.js/#ready)
11
+ const segmentReadyCb = function passSegmentKeysToHeap() {
12
+ if (!window.heap) return
13
+
14
+ // Send XID
15
+ if (!localStorage.getItem('seg_heap_xid')) {
16
+ const xId = localStorage.getItem('seg_xid')
17
+
18
+ if (xId) {
19
+ window.heap.addUserProperties({
20
+ 'Segment Cross Origin ID': JSON.parse(xId),
21
+ })
22
+ localStorage.setItem('seg_heap_xid', Date.now().toString())
23
+ }
24
+ }
25
+
26
+ // Send Anonymous ID
27
+ if (!localStorage.getItem('seg_heap_anonymous_id')) {
28
+ const anonId = localStorage.getItem('ajs_anonymous_id')
29
+
30
+ if (anonId) {
31
+ window.heap.addUserProperties({
32
+ 'Segment Dotcom Anonymous ID': JSON.parse(anonId),
33
+ })
34
+ localStorage.setItem('seg_heap_anonymous_id', Date.now().toString())
35
+ }
36
+ }
37
+ }
38
+
39
+ // Version of the segment snippet we're using. This is used by:
40
+ // - SegmentScript
41
+ // - SegmentPreloadScript
42
+ const SNIPPET_VERSION = '4.1.0'
43
+
44
+ /**
45
+ * This script is provided by Segment
46
+ * - @see https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/quickstart/#step-2-add-the-segment-snippet
47
+ *
48
+ * It has been modified to “preload” the window.analytics API without loading the full `analytics.js` segment script so we can buffer tracking calls before segment fully loads.
49
+ *
50
+ * This has also been modified to use the HashiCorp proxy, artemis.hashicorp.com & custom filename, instead of cdn.segment.com.
51
+ */
52
+ export const SegmentPreloadScript = () => {
53
+ return (
54
+ <script
55
+ dangerouslySetInnerHTML={{
56
+ __html: `!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t<analytics.methods.length;t++){var e=analytics.methods[t];analytics[e]=analytics.factory(e)}analytics.load=function(t,e){var n=document.createElement("script");n.type="text/javascript";n.async=!0;n.src="https://artemis.hashicorp.com/script/"+t;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(n,a);analytics._loadOptions=e};analytics._cdn="https://artemis.hashicorp.com";analytics.SNIPPET_VERSION="${SNIPPET_VERSION}";}}();`,
57
+ }}
58
+ />
59
+ )
60
+ }
61
+
62
+ export default function SegmentScript({ preferences, writeKey }) {
63
+ if (!preferences.loadAll && !preferences.segment) return null
64
+
65
+ const integrations = Object.assign(
66
+ { All: Boolean(preferences.loadAll), 'Segment.io': true },
67
+ preferences.segment ?? {}
68
+ )
69
+
70
+ return (
71
+ <Script id="segment">
72
+ {/**
73
+ * @note This snippet is provided by Segment and has been modified to
74
+ * use artemis.hashicorp.com instead of cdn.segment.com.
75
+ *
76
+ * @see https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/quickstart/#step-2-add-the-segment-snippet
77
+ */}
78
+ {`!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t<analytics.methods.length;t++){var e=analytics.methods[t];analytics[e]=analytics.factory(e)}analytics.load=function(t,e){var n=document.createElement("script");n.type="text/javascript";n.async=!0;n.src="https://artemis.hashicorp.com/script/"+t;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(n,a);analytics._loadOptions=e};analytics._cdn="https://artemis.hashicorp.com";analytics.SNIPPET_VERSION="${SNIPPET_VERSION}";
79
+ analytics.load("${writeKey}", ${
80
+ integrations ? JSON.stringify({ integrations: integrations }) : {}
81
+ });
82
+ analytics.page();
83
+ analytics.ready(${segmentReadyCb});
84
+ }}();`}
85
+ </Script>
86
+ )
87
+ }
@@ -0,0 +1,9 @@
1
+ .root {
2
+ @media only percy {
3
+ display: none;
4
+ }
5
+
6
+ @media print {
7
+ display: none;
8
+ }
9
+ }
@@ -0,0 +1,55 @@
1
+ import { ScriptProps } from 'next/script'
2
+ export interface ConsentManagerService {
3
+ async?: boolean
4
+ strategy?: Pick<ScriptProps, 'strategy'>
5
+ body?: string
6
+ category: string
7
+ description: string
8
+ name: string
9
+ url?: string
10
+ dataAttrs?: { name: string; value: string }[]
11
+ /**
12
+ * Optional function that determines whether
13
+ * or not the script will load on the page.
14
+ * If left undefined, script will load as usual.
15
+ */
16
+ shouldLoad?: () => boolean
17
+ /**
18
+ * Optional function that runs when a script has
19
+ * finished loading.
20
+ * Docs: https://nextjs.org/docs/pages/api-reference/components/script#onload
21
+ */
22
+ onLoad?: () => void
23
+ }
24
+
25
+ export interface ConsentManagerPreset {
26
+ additionalServices: ConsentManagerService[]
27
+ segmentServices: ConsentManagerService[]
28
+ }
29
+
30
+ export interface ConsentManagerCategory {
31
+ description: string
32
+ name: string
33
+ }
34
+
35
+ export interface ConsentManagerProps {
36
+ additionalServices?: ConsentManagerService[]
37
+ categories?: ConsentManagerCategory[]
38
+ className?: string
39
+ companyName?: string
40
+ cookiePolicyLink?: string
41
+ forceShow?: boolean
42
+ privacyPolicyLink?: string
43
+ segmentServices?: ConsentManagerService[]
44
+ segmentWriteKey?: string
45
+ showDialog?: boolean
46
+ version?: number
47
+ onManagePreferences?: () => void
48
+ onAcceptAll?: () => void
49
+ }
50
+
51
+ export interface ConsentManagerPreferences {
52
+ loadAll?: boolean
53
+ segment?: Record<string, boolean>
54
+ custom?: Record<string, boolean>
55
+ }
@@ -0,0 +1,75 @@
1
+ import cookies from 'js-cookie'
2
+ import * as cookiesJS from './cookies.js'
3
+
4
+ it('should not show preferences loaded before cookies are saved', () => {
5
+ expect(cookiesJS.preferencesSavedAndLoaded()).toBe(false)
6
+ })
7
+
8
+ it('should show preferences loaded if cookies are loaded', () => {
9
+ const preferences = JSON.stringify({ loadAll: true, version: 1 })
10
+ const originalCookiesGet = cookies.get
11
+
12
+ // mocks
13
+ cookies.get = vi.fn().mockImplementationOnce(() => preferences)
14
+ cookiesJS.loadPreferences()
15
+
16
+ const preferencesLoaded = cookiesJS.preferencesSavedAndLoaded()
17
+ expect(preferencesLoaded).toBe(true)
18
+
19
+ cookies.get = originalCookiesGet
20
+ })
21
+
22
+ it('should get the domain', () => {
23
+ const originalLocation = global.window.location
24
+ const originalCookiesGet = cookies.get
25
+ const originalCookiesSet = cookies.set
26
+
27
+ // mocks
28
+ delete global.window.location
29
+ global.window.location = { hostname: 'foo.bar.baz.net' }
30
+ cookies.get = vi.fn().mockImplementationOnce(() => 'baz.net')
31
+ cookies.set = vi.fn()
32
+
33
+ expect(cookiesJS.getDomain()).toBe('baz.net')
34
+
35
+ // restore mocks
36
+ global.window.location = originalLocation
37
+ cookies.get = originalCookiesGet
38
+ cookies.set = originalCookiesSet
39
+ })
40
+
41
+ it('should load preferences', () => {
42
+ const preferences = { loadAll: true, version: 1 }
43
+ const originalCookiesGet = cookies.get
44
+
45
+ // mocks
46
+ cookies.get = vi.fn().mockImplementationOnce(() => preferences)
47
+
48
+ expect(cookiesJS.loadPreferences()).toStrictEqual(preferences)
49
+
50
+ // restore mocks
51
+ cookies.get = originalCookiesGet
52
+ })
53
+
54
+ it('should save preferences', () => {
55
+ global.window.location = { hostname: 'foo.bar.baz.net' }
56
+ const preferences = { loadAll: true, version: 1 }
57
+ const version = 1
58
+ const args = [
59
+ cookiesJS.COOKIE_KEY,
60
+ JSON.stringify(preferences),
61
+ { expires: cookiesJS.COOKIE_EXPIRES, domain: '' },
62
+ ]
63
+ const originalCookiesSet = cookies.set
64
+
65
+ // mocks
66
+ cookies.set = vi.fn()
67
+
68
+ cookiesJS.savePreferences(preferences, version)
69
+
70
+ const lastArgs = cookies.set.mock.calls[cookies.set.mock.calls.length - 1]
71
+
72
+ expect(lastArgs).toStrictEqual(args)
73
+
74
+ cookies.set = originalCookiesSet
75
+ })
@@ -0,0 +1,70 @@
1
+ /*
2
+ Cookies structure:
3
+ {
4
+ { segment: { Hotjar: true, Intercom: false, .. } },
5
+ { custom: { OptinMonster: true } },
6
+ { categories: { Functional: true } }
7
+ }
8
+ */
9
+
10
+ import cookies from 'js-cookie'
11
+ export const COOKIE_KEY = 'hashi-consent-preferences'
12
+ export const COOKIE_EXPIRES = 183
13
+
14
+ let preferences = undefined
15
+ let preferencesLoaded = false
16
+
17
+ export function getDomain() {
18
+ const host = window.location.hostname
19
+ const parts = host.split('.')
20
+ const levels: string[] = []
21
+ let result = ''
22
+
23
+ // get all domain levels
24
+ for (let i = parts.length - 2; i >= 0; i--) {
25
+ levels.push(parts.slice(i).join('.'))
26
+ }
27
+
28
+ // find top level domain
29
+ for (let i = 0; i < levels.length; i++) {
30
+ const cname = '__tld__'
31
+ const domain = levels[i]
32
+ const opts = { domain: '.' + domain }
33
+
34
+ cookies.set(cname, '1', opts)
35
+ if (cookies.get(cname)) {
36
+ cookies.set(cname, 'null', opts)
37
+ result = domain
38
+ break
39
+ }
40
+ }
41
+
42
+ return result
43
+ }
44
+
45
+ export const loadPreferences = () => {
46
+ if (!preferences) {
47
+ const value = cookies.get(COOKIE_KEY)
48
+ if (value && value !== {}.toString()) {
49
+ preferences = JSON.parse(value)
50
+ if (preferences) {
51
+ preferencesLoaded = true
52
+ }
53
+ }
54
+ }
55
+
56
+ return preferences
57
+ }
58
+
59
+ export function savePreferences(prefs, version) {
60
+ const domain = getDomain()
61
+ const prefsWithVersion = Object.assign(prefs, { version: version })
62
+ cookies.set(COOKIE_KEY, JSON.stringify(prefsWithVersion), {
63
+ expires: COOKIE_EXPIRES,
64
+ domain,
65
+ })
66
+ preferences = prefsWithVersion
67
+ preferencesLoaded = true
68
+ }
69
+
70
+ export const preferencesSavedAndLoaded = () => preferencesLoaded
@@ -0,0 +1,115 @@
1
+ test('fetches integrations from segment, formats them as expected', async () => {
2
+ vi.resetModules()
3
+ global.fetch = () =>
4
+ Promise.resolve({
5
+ ok: true,
6
+ json: () => mockSegmentResponse,
7
+ }) as any
8
+ const getIntegrations = await import('./integrations')
9
+ const resp = await getIntegrations.default(
10
+ mockProps.segmentServices,
11
+ mockProps.additionalServices,
12
+ 'XXX - segment key'
13
+ )
14
+ expect(resp['Test Category'][0].name).toBe('Test Non-Segment Service')
15
+ expect(resp['Test Category'][0].origin).toBe('custom')
16
+ expect(resp['Test Category'][1].name).toBe('Test Non-Segment Service 2')
17
+ expect(resp['Test Category'][1].origin).toBe('custom')
18
+ expect(resp['Test Category'][2].name).toBe('Google Analytics')
19
+ expect(resp['Test Category'][2].origin).toBe('segment')
20
+ expect(resp['Test Category'][3].name).toBe('LinkedIn Insight Tag')
21
+ expect(resp['Test Category'][3].origin).toBe('segment')
22
+ expect(resp['Email Marketing'][0].name).toBe('Marketo V2')
23
+ expect(resp['Email Marketing'][0].origin).toBe('segment')
24
+ })
25
+
26
+ const mockSegmentResponse = [
27
+ {
28
+ name: 'Google Analytics',
29
+ creationName: 'Google Analytics',
30
+ description:
31
+ 'Google Analytics is the most popular analytics tool for the web. It’s free and provides a wide range of features. It’s especially good at measuring traffic sources and ad campaigns.',
32
+ website: 'http://google.com/analytics',
33
+ category: 'Test Category',
34
+ },
35
+ {
36
+ name: 'LinkedIn Insight Tag',
37
+ creationName: 'LinkedIn Insight Tag',
38
+ description:
39
+ 'The LinkedIn Insight Tag is a piece of lightweight JavaScript code that you can add to your website to enable in-depth campaign reporting and unlock valuable insights about your website visitors. As a LinkedIn Marketing Solutions customer, you can use the LinkedIn Insight Tag to track conversions, retarget website visitors, and unlock additional insights about members interacting with your ads.',
40
+ website: 'https://www.linkedin.com',
41
+ category: 'Advertising',
42
+ },
43
+ {
44
+ name: 'Marketo V2',
45
+ creationName: 'Marketo V2',
46
+ description:
47
+ 'Marketo is a marketing automation tool that can help you engage customers and prospects.',
48
+ website: 'https://www.marketo.com/',
49
+ category: 'Email Marketing',
50
+ },
51
+ {
52
+ name: 'Heap',
53
+ creationName: 'Heap',
54
+ description:
55
+ 'Heap is an analytics tool that automatically tracks all of the actions your users perform just by flipping a switch, instead of after adding custom tracking code.',
56
+ website: 'http://heapanalytics.com',
57
+ category: 'Analytics',
58
+ },
59
+ {
60
+ name: 'Google Tag Manager',
61
+ creationName: 'Google Tag Manager',
62
+ description:
63
+ 'Google Tag Manager lets you add or update your website tags, easily and for free.',
64
+ website: 'https://www.google.com/analytics/tag-manager/',
65
+ category: 'Tag Managers',
66
+ },
67
+ {
68
+ name: 'Amazon S3',
69
+ creationName: 'Amazon S3',
70
+ description:
71
+ 'Our Amazon S3 copies our log files of your raw API calls from our S3 bucket to yours, where you can then perform custom analysis on them.',
72
+ website: 'http://aws.amazon.com/s3',
73
+ category: 'Analytics',
74
+ },
75
+ ]
76
+
77
+ const mockProps = {
78
+ segmentServices: [
79
+ {
80
+ name: 'LinkedIn Insight Tag',
81
+ category: 'Test Category',
82
+ description: 'description',
83
+ },
84
+ ],
85
+ additionalServices: [
86
+ {
87
+ name: 'Test Non-Segment Service',
88
+ category: 'Test Category',
89
+ description: 'description',
90
+ body: 'test body',
91
+ url: 'test url',
92
+ },
93
+ {
94
+ name: 'Test Non-Segment Service 2',
95
+ category: 'Test Category',
96
+ description: 'description',
97
+ body: 'test body 2',
98
+ url: 'test url 2',
99
+ async: true,
100
+ addToBody: true,
101
+ dataAttrs: [
102
+ {
103
+ name: 'test',
104
+ value: 'foobar',
105
+ },
106
+ ],
107
+ },
108
+ ],
109
+ categories: [
110
+ {
111
+ name: 'Test Category',
112
+ description: 'description',
113
+ },
114
+ ],
115
+ }
@@ -0,0 +1,110 @@
1
+ import type { ConsentManagerService } from '../types'
2
+
3
+ /*
4
+ integrations.js
5
+ Fetches integrations from Segment given write key and applies user-defined
6
+ overrides. Combines with custom scripts to give a complete view into
7
+ scripts that the site is trying to load. Finally, groups it all by category.
8
+ */
9
+
10
+ export type ConsentManagerServiceWithOrigin = ConsentManagerService & {
11
+ origin: string
12
+ }
13
+
14
+ export default function getIntegrations(
15
+ segmentServices: ConsentManagerService[] = [],
16
+ additionalServices: ConsentManagerService[] = [],
17
+ segmentWriteKey: string | undefined
18
+ ): Promise<Record<string, ConsentManagerServiceWithOrigin[]>> {
19
+ return fetchIntegrationsFromSegment(segmentWriteKey)
20
+ .then((segmentOriginated) =>
21
+ zipIntegrations(segmentServices, additionalServices, segmentOriginated)
22
+ )
23
+ .then(groupByCategory)
24
+ }
25
+
26
+ interface SegmentIntegration {
27
+ name: string
28
+ creationName: string
29
+ description: string
30
+ website: string
31
+ category: string
32
+ }
33
+
34
+ // Get integrations from Segment by write key
35
+ async function fetchIntegrationsFromSegment(
36
+ segmentWriteKey: string | undefined
37
+ ) {
38
+ const res = await fetch(
39
+ `https://artemis.hashicorp.com/v1/projects/${segmentWriteKey}/integrations`
40
+ )
41
+ if (!res.ok) {
42
+ throw new Error(
43
+ `Failed to fetch integrations: HTTP ${res.status} ${res.statusText}`
44
+ )
45
+ }
46
+ return (await res.json()) as SegmentIntegration[]
47
+ }
48
+
49
+ // Include developer overrides for fetched Segment integrations
50
+ function zipIntegrations(
51
+ segmentOverrides: ConsentManagerService[],
52
+ additionalServices: ConsentManagerService[] | undefined,
53
+ segmentOriginated: SegmentIntegration[]
54
+ ): ConsentManagerServiceWithOrigin[] {
55
+ // Create Segment integration object with name as key for quick retrieval
56
+ const segmentObj = segmentOriginated.reduce((obj, segment) => {
57
+ obj[segment.name] = segment
58
+ obj[segment.name].origin = 'segment'
59
+ return obj
60
+ }, {})
61
+
62
+ // Go through each developer-defined segment service and update
63
+ // segmentObj with any overrides
64
+ for (let i = 0; i < segmentOverrides.length; i++) {
65
+ if (
66
+ Object.prototype.hasOwnProperty.call(segmentObj, segmentOverrides[i].name)
67
+ ) {
68
+ segmentObj[segmentOverrides[i].name] = Object.assign(
69
+ segmentObj[segmentOverrides[i].name],
70
+ segmentOverrides[i]
71
+ )
72
+ } else {
73
+ /* eslint-disable-next-line */
74
+ console.warn(
75
+ `Unmatched integration config for ${segmentOverrides[i].name}`
76
+ )
77
+ }
78
+ }
79
+
80
+ // Include additional (non-Segment) services
81
+ const allIntegrations = additionalServices
82
+ ? additionalServices.map((integration) => {
83
+ return { ...integration, origin: 'custom' }
84
+ })
85
+ : []
86
+
87
+ for (const key in segmentObj) {
88
+ allIntegrations.push(segmentObj[key])
89
+ }
90
+
91
+ // Returns array with all integrations, with origin key (segment or custom)
92
+ return allIntegrations
93
+ }
94
+
95
+ // Group by category for display purposes
96
+ function groupByCategory(
97
+ integrations: ConsentManagerServiceWithOrigin[]
98
+ ): Record<string, ConsentManagerServiceWithOrigin[]> {
99
+ const grouped: Record<string, ConsentManagerServiceWithOrigin[]> = {}
100
+
101
+ integrations.forEach((integration) => {
102
+ if (Object.prototype.hasOwnProperty.call(grouped, integration.category)) {
103
+ grouped[integration.category].push(integration)
104
+ } else {
105
+ grouped[integration.category] = [integration]
106
+ }
107
+ })
108
+
109
+ return grouped
110
+ }