@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,445 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+
6
+ import { isAnalyticsMethodAvailable } from '@hashicorp/platform-analytics'
7
+ import type {
8
+ MarketoFormField,
9
+ MarketoFormMetadataResponse,
10
+ MarketoSubmissionResponse,
11
+ OnSubmitProps,
12
+ OnSubmitData,
13
+ } from './types'
14
+ import { useFormState } from 'react-hook-form'
15
+ import cookies from 'js-cookie'
16
+
17
+ // Marketo stores field names in two versions, SOAP and REST. Some API
18
+ // endpoints return SOAP names, while others accept REST names. This object
19
+ // contains all fields from our Marketo instance that have a REST name that is
20
+ // different from the SOAP name.
21
+ const soapToRESTFieldNames: Record<string, string> = {
22
+ Address: 'address',
23
+ AnnualRevenue: 'annualRevenue',
24
+ AnonymousIP: 'anonymousIP',
25
+ BillingCity: 'billingCity',
26
+ BillingCountry: 'billingCountry',
27
+ BillingPostalCode: 'billingPostalCode',
28
+ BillingState: 'billingState',
29
+ BillingStreet: 'billingStreet',
30
+ City: 'city',
31
+ Company: 'company',
32
+ Country: 'country',
33
+ DoNotCall: 'doNotCall',
34
+ DoNotCallReason: 'doNotCallReason',
35
+ Email: 'email',
36
+ EmailInvalid: 'emailInvalid',
37
+ EmailInvalidCause: 'emailInvalidCause',
38
+ Fax: 'fax',
39
+ FirstName: 'firstName',
40
+ Industry: 'industry',
41
+ InferredCompany: 'inferredCompany',
42
+ InferredCountry: 'inferredCountry',
43
+ LastName: 'lastName',
44
+ LeadRole: 'leadRole',
45
+ LeadScore: 'leadScore',
46
+ LeadSource: 'leadSource',
47
+ LeadStatus: 'leadStatus',
48
+ MainPhone: 'mainPhone',
49
+ MarketoSocialFacebookDisplayName: 'facebookDisplayName',
50
+ MarketoSocialFacebookId: 'facebookId',
51
+ MarketoSocialFacebookPhotoURL: 'facebookPhotoURL',
52
+ MarketoSocialFacebookProfileURL: 'facebookProfileURL',
53
+ MarketoSocialFacebookReach: 'facebookReach',
54
+ MarketoSocialFacebookReferredEnrollments: 'facebookReferredEnrollments',
55
+ MarketoSocialFacebookReferredVisits: 'facebookReferredVisits',
56
+ MarketoSocialGender: 'gender',
57
+ MarketoSocialLastReferredEnrollment: 'lastReferredEnrollment',
58
+ MarketoSocialLastReferredVisit: 'lastReferredVisit',
59
+ MarketoSocialLinkedInDisplayName: 'linkedInDisplayName',
60
+ MarketoSocialLinkedInId: 'linkedInId',
61
+ MarketoSocialLinkedInPhotoURL: 'linkedInPhotoURL',
62
+ MarketoSocialLinkedInProfileURL: 'linkedInProfileURL',
63
+ MarketoSocialLinkedInReach: 'linkedInReach',
64
+ MarketoSocialLinkedInReferredEnrollments: 'linkedInReferredEnrollments',
65
+ MarketoSocialLinkedInReferredVisits: 'linkedInReferredVisits',
66
+ MarketoSocialSyndicationId: 'syndicationId',
67
+ MarketoSocialTotalReferredEnrollments: 'totalReferredEnrollments',
68
+ MarketoSocialTotalReferredVisits: 'totalReferredVisits',
69
+ MarketoSocialTwitterDisplayName: 'twitterDisplayName',
70
+ MarketoSocialTwitterId: 'twitterId',
71
+ MarketoSocialTwitterPhotoURL: 'twitterPhotoURL',
72
+ MarketoSocialTwitterProfileURL: 'twitterProfileURL',
73
+ MarketoSocialTwitterReach: 'twitterReach',
74
+ MarketoSocialTwitterReferredEnrollments: 'twitterReferredEnrollments',
75
+ MarketoSocialTwitterReferredVisits: 'twitterReferredVisits',
76
+ MiddleName: 'middleName',
77
+ MktoPersonNotes: 'mktoPersonNotes',
78
+ MobilePhone: 'mobilePhone',
79
+ NumberOfEmployees: 'numberOfEmployees',
80
+ Phone: 'phone',
81
+ PostalCode: 'postalCode',
82
+ Rating: 'rating',
83
+ Salutation: 'salutation',
84
+ SICCode: 'sicCode',
85
+ State: 'state',
86
+ Title: 'title',
87
+ Unsubscribed: 'unsubscribed',
88
+ UnsubscribedReason: 'unsubscribedReason',
89
+ Website: 'website',
90
+ }
91
+
92
+ // Given an object with SOAP named keys, returns an object with SOAP
93
+ // names replaced with their REST variants.
94
+ export function convertToRESTFields(
95
+ data: Record<string, unknown>
96
+ ): Record<string, unknown> {
97
+ const restData: Record<string, unknown> = {}
98
+ for (const [key, value] of Object.entries(data)) {
99
+ if (key in soapToRESTFieldNames) {
100
+ restData[soapToRESTFieldNames[key]] = value
101
+ } else {
102
+ restData[key] = value
103
+ }
104
+ }
105
+ return restData
106
+ }
107
+
108
+ // Returns the label for a field.
109
+ export function formattedLabel(field: MarketoFormField): string {
110
+ if ('label' in field && field.label) {
111
+ return field.label
112
+ }
113
+
114
+ return field.id
115
+ }
116
+
117
+ // Returns a Record<string, MarketoFormField[]> that groups fields that should
118
+ // be rendered by a single component.
119
+ //
120
+ // This function allows consumers to define multiple fields that should be
121
+ // rendered by a single component. The configuration is in the following form:
122
+ // const config = {
123
+ // groupName: {
124
+ // fields: ["FieldNameOne", "FieldNameTwo"],
125
+ // component: RenderComponent
126
+ // }
127
+ // }
128
+ // In this instance, MarketoForm will call RenderComponent with a `fields` prop
129
+ // containing the MarketoFormField object for FieldNameOne and FieldNameTwo.
130
+ export function groupFields(
131
+ fields: MarketoFormField[],
132
+ groups: Record<
133
+ string,
134
+ {
135
+ fields: string[]
136
+ component: (props: { fields: MarketoFormField[] }) => JSX.Element
137
+ }
138
+ >
139
+ ): Record<string, MarketoFormField[]> {
140
+ // Final value that will be returned. Keys are group names and values are
141
+ // an array of MarketoFormField objects.
142
+ const grouped: Record<string, MarketoFormField[]> = {}
143
+
144
+ fields.forEach((field) => {
145
+ // Check if groups contains a group targeting this field
146
+ const customGroup = Object.entries(groups).filter(([_, config]) => {
147
+ return config.fields.includes(field.id)
148
+ })
149
+ if (customGroup.length > 0) {
150
+ const customGroupName = customGroup[0][0]
151
+ if (customGroupName in grouped) {
152
+ grouped[customGroupName].push(field)
153
+ } else {
154
+ grouped[customGroupName] = [field]
155
+ }
156
+ } else {
157
+ grouped[field.id] = [field]
158
+ }
159
+ })
160
+
161
+ return grouped
162
+ }
163
+
164
+ // @TODO: export this from the @hashicorp/platform-analytics/utm-params-capture & import in this file
165
+ const UTM_ALLOW_LIST = [
166
+ 'utm_source',
167
+ 'utm_medium',
168
+ 'utm_offer',
169
+ 'utm_campaign',
170
+ 'utm_content',
171
+ 'utm_channel_bucket',
172
+ ]
173
+
174
+ export function getUtmCookies() {
175
+ const allCookies = cookies.get()
176
+
177
+ if (!allCookies) {
178
+ return {}
179
+ }
180
+
181
+ const utmCookies: Record<string, string> = {}
182
+
183
+ for (const [key, value] of Object.entries(allCookies)) {
184
+ if (UTM_ALLOW_LIST.includes(key)) {
185
+ utmCookies[`${key}__c`] = value
186
+ }
187
+ }
188
+
189
+ return utmCookies
190
+ }
191
+
192
+ export const STORED_FIELD_NAMES = ['FirstName', 'LastName', 'Email']
193
+
194
+ // Returns an object representing the default state of the form as defined by
195
+ // the Marketo form's configuration.
196
+ export function calculateDefaultValues(
197
+ fields: MarketoFormField[],
198
+ values?: Record<string, any>
199
+ ): Record<string, string | boolean> {
200
+ const initialValues: Record<string, string | boolean> = {}
201
+ const utmCookies = getUtmCookies()
202
+ fields.forEach((field) => {
203
+ if (
204
+ 'defaultValue' in field &&
205
+ field.defaultValue &&
206
+ field.defaultValue !== ''
207
+ ) {
208
+ if (field.dataType === 'select') {
209
+ // For some reason, the Marketo API returns the value for <select> fields
210
+ // as a JSON encoded string.
211
+ initialValues[field.id] = JSON.parse(field.defaultValue)[0]
212
+ } else {
213
+ initialValues[field.id] = field.defaultValue
214
+ }
215
+ } else if (field.dataType === 'checkbox') {
216
+ initialValues[field.id] = field.fieldMetaData.initiallyChecked
217
+ } else if (utmCookies[field.id]) {
218
+ initialValues[field.id] = utmCookies[field.id]
219
+ } else if (field.dataType !== 'htmltext') {
220
+ // htmltext is a presentational element, and shouldn't have a value
221
+ initialValues[field.id] = ''
222
+ }
223
+ })
224
+ return { ...initialValues, ...values }
225
+ }
226
+
227
+ export function useErrorMessage(id: string): string | undefined {
228
+ const { errors, touchedFields } = useFormState()
229
+
230
+ if (!touchedFields[id] || !errors[id]) {
231
+ return
232
+ }
233
+
234
+ return errors[id]?.message as string
235
+ }
236
+
237
+ export function segmentIdentify(leadFormFields: Record<string, unknown>) {
238
+ // This function is wrapped in a try/catch to prevent Segment errors from
239
+ // interrupting the form submission workflow.
240
+ try {
241
+ if (isAnalyticsMethodAvailable('identify')) {
242
+ const traits: Record<string, unknown> = {}
243
+
244
+ // Segment traits mostly map 1:1 to Marketo REST field names. However,
245
+ // since that's not always the case, we check and set each
246
+ // field individually.
247
+ // Reference: https://segment.com/docs/connections/spec/identify/
248
+ if ('email' in leadFormFields) {
249
+ traits['email'] = leadFormFields['email']
250
+ }
251
+
252
+ if ('firstName' in leadFormFields) {
253
+ traits['firstName'] = leadFormFields['firstName']
254
+ }
255
+
256
+ if ('lastName' in leadFormFields) {
257
+ traits['lastName'] = leadFormFields['lastName']
258
+ }
259
+
260
+ if ('phone' in leadFormFields) {
261
+ traits['phone'] = leadFormFields['phone']
262
+ }
263
+
264
+ if ('title' in leadFormFields) {
265
+ traits['title'] = leadFormFields['title']
266
+ }
267
+
268
+ if ('company' in leadFormFields) {
269
+ traits['company'] = { name: leadFormFields['company'] }
270
+ }
271
+
272
+ if ('country' in leadFormFields) {
273
+ traits['address'] = { country: leadFormFields['country'] }
274
+ }
275
+
276
+ if (Object.keys(traits).length > 0) {
277
+ window.analytics.identify(traits)
278
+ }
279
+ }
280
+ } catch (err) {
281
+ console.error(err)
282
+ }
283
+ }
284
+
285
+ // Returns true if any of the results have a status of skipped
286
+ export function includesSkippedRecords(
287
+ res: MarketoSubmissionResponse
288
+ ): boolean {
289
+ return res.result.some((r) => r.status === 'skipped')
290
+ }
291
+
292
+ export function isValidEmail(value: string): boolean {
293
+ // Source: https://html.spec.whatwg.org/multipage/input.html#email-state-(type=email)
294
+ // Slightly modified to require domains instead of bare TLDs
295
+ /* eslint-disable-next-line no-useless-escape */
296
+ return /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/i.test(
297
+ value
298
+ )
299
+ }
300
+
301
+ interface HandleSubmitFormProps extends OnSubmitProps {
302
+ metadata: MarketoFormMetadataResponse
303
+ data: OnSubmitData
304
+ reset: () => void
305
+ }
306
+
307
+ export const handleSubmitForm = async ({
308
+ data,
309
+ transformData,
310
+ onSubmitError,
311
+ onSubmitStart,
312
+ onSubmitSuccess,
313
+ resetOnSubmission,
314
+ metadata,
315
+ reset,
316
+ }: HandleSubmitFormProps) => {
317
+ const leadFormData = transformData ? transformData(data) : data
318
+
319
+ if (onSubmitStart) {
320
+ onSubmitStart()
321
+ }
322
+
323
+ const leadFormFields = convertToRESTFields(leadFormData)
324
+
325
+ segmentIdentify(leadFormFields)
326
+
327
+ const res = await fetch(`${window.location.origin}/api/marketo/submit`, {
328
+ method: 'POST',
329
+ headers: {
330
+ 'Content-Type': 'application/json',
331
+ },
332
+ body: JSON.stringify({
333
+ input: [
334
+ {
335
+ leadFormFields,
336
+ visitorData: {
337
+ pageURL: window.location.href,
338
+ },
339
+ },
340
+ ],
341
+ formId: metadata.result[0].id,
342
+ }),
343
+ })
344
+ const marketoResponse = (await res.json()) as MarketoSubmissionResponse
345
+ if (
346
+ res.status === 200 &&
347
+ marketoResponse.success &&
348
+ !includesSkippedRecords(marketoResponse)
349
+ ) {
350
+ if (onSubmitSuccess) {
351
+ onSubmitSuccess(leadFormData)
352
+ }
353
+
354
+ // Remove fields that shouldn't be stored in local storage
355
+ const dataToPersist = Object.fromEntries(
356
+ Object.entries(data).filter(([k]) => STORED_FIELD_NAMES.includes(k))
357
+ )
358
+ localStorage.setItem('marketoFormData', JSON.stringify(dataToPersist))
359
+
360
+ if (resetOnSubmission) {
361
+ reset()
362
+ }
363
+ } else {
364
+ console.error(marketoResponse)
365
+ if (onSubmitError) {
366
+ onSubmitError()
367
+ }
368
+
369
+ throw new Error('An error occurred while submitting form.')
370
+ }
371
+ }
372
+
373
+ export const resolverErrors = (
374
+ values: Record<string, string | boolean>,
375
+ fields: MarketoFormField[]
376
+ ) => {
377
+ const errors: Record<string, { message: string }> = {}
378
+
379
+ fields.forEach((field) => {
380
+ if ('required' in field && field.required) {
381
+ if (
382
+ !(field.id in values) ||
383
+ values[field.id] === '' ||
384
+ values[field.id] === false ||
385
+ values[field.id] === undefined ||
386
+ values[field.id] === null ||
387
+ (typeof values[field.id] === 'string' &&
388
+ (values[field.id] as string).trim() === '')
389
+ ) {
390
+ errors[field.id] = {
391
+ message: field.validationMessage ?? 'This field is required.',
392
+ }
393
+ }
394
+ }
395
+
396
+ // Validate that select field value is an allowed value
397
+ if (field.dataType === 'select') {
398
+ if (
399
+ field.id in values &&
400
+ field.fieldMetaData.values &&
401
+ !field.fieldMetaData.values
402
+ .map((v) => v.value)
403
+ .includes(values[field.id] as string)
404
+ ) {
405
+ errors[field.id] = {
406
+ message: field.validationMessage ?? 'Please select an option.',
407
+ }
408
+ }
409
+ }
410
+
411
+ if (field.dataType === 'email') {
412
+ if (field.id in values && !isValidEmail(values[field.id] as string)) {
413
+ errors[field.id] = {
414
+ message:
415
+ field.validationMessage ?? 'Please enter a valid email address.',
416
+ }
417
+ }
418
+ }
419
+ })
420
+
421
+ return errors
422
+ }
423
+
424
+ /**
425
+ * @param fieldsArr MarketoFormField[]
426
+ * @returns MarketoFormField[] with columnSplit property set
427
+ */
428
+ export function setFieldsColumnSplit(fieldsArr: MarketoFormField[]) {
429
+ return fieldsArr.map((f) => {
430
+ const columnSplit = getFieldColumnSplit(fieldsArr, f)
431
+ return { ...f, columnSplit }
432
+ })
433
+ }
434
+
435
+ /**
436
+ * @param allFields MarketoFormField[]
437
+ * @param field MarketoFormField
438
+ * @returns the number of fields in the same row as the given field in Marketo
439
+ */
440
+ export function getFieldColumnSplit(
441
+ allFields: MarketoFormField[],
442
+ field: MarketoFormField
443
+ ) {
444
+ return allFields.filter((item) => item.rowNumber === field.rowNumber)?.length
445
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+
6
+ import * as React from 'react'
7
+ import Badge from '@hashicorp/react-badge'
8
+ import classNames from 'classnames'
9
+ import ExpandableArrow from '@hashicorp/react-expandable-arrow'
10
+ import Intro from '../intro'
11
+ import Link from 'next/link'
12
+ import type { NextStepsProps } from './types'
13
+ import StandaloneLink from '@hashicorp/react-design-system-components/src/components/standalone-link'
14
+ import { IconArrowRight16 } from '@hashicorp/flight-icons/svg-react/arrow-right-16'
15
+ import useProductMeta from '@hashicorp/platform-product-meta'
16
+ import s from './style.module.css'
17
+
18
+ export default function NextSteps({
19
+ appearance = 'light',
20
+ theme = 'hashicorp',
21
+ heading,
22
+ description,
23
+ steps,
24
+ cta,
25
+ }: NextStepsProps) {
26
+ const { slug, themeClass } = useProductMeta(theme)
27
+
28
+ return (
29
+ <section
30
+ className={classNames(
31
+ s.nextSteps,
32
+ s[appearance],
33
+ themeClass,
34
+ slug && s[slug]
35
+ )}
36
+ data-testid="next-steps"
37
+ >
38
+ <div className={s.container}>
39
+ <div className={s.content}>
40
+ <Intro
41
+ appearance={appearance}
42
+ heading={heading}
43
+ description={description}
44
+ />
45
+ </div>
46
+ <div className={s.stepsWrapper}>
47
+ <ul className={s.stepsList}>
48
+ {steps.map((step, index) => {
49
+ const isFeatured = steps.length === 3 && index === 0
50
+ const variant = index === 0 ? 'primary' : 'secondary'
51
+ return (
52
+ <li
53
+ // eslint-disable-next-line react/no-array-index-key
54
+ key={index}
55
+ className={classNames(
56
+ s.stepsListItem,
57
+ isFeatured && s.stepsListItemFeature
58
+ )}
59
+ >
60
+ <Tile
61
+ badge={step.badge}
62
+ theme={theme}
63
+ variant={variant}
64
+ cta={{
65
+ title: step.cta.title,
66
+ url: step.cta.url,
67
+ }}
68
+ heading={step.heading}
69
+ description={step.description}
70
+ />
71
+ </li>
72
+ )
73
+ })}
74
+ </ul>
75
+ {cta ? (
76
+ <div className={s.cta}>
77
+ <p className={s.ctaCopy}>{cta.copy}</p>
78
+ <StandaloneLink
79
+ href={cta.href}
80
+ text={cta.ctaText}
81
+ icon={
82
+ <IconArrowRight16
83
+ width="100%"
84
+ height="100%"
85
+ style={{ display: 'block' }}
86
+ />
87
+ }
88
+ iconPosition="trailing"
89
+ />
90
+ </div>
91
+ ) : null}
92
+ </div>
93
+ </div>
94
+ </section>
95
+ )
96
+ }
97
+
98
+ function Tile({ theme, variant, heading, badge, description, cta }) {
99
+ const [isHovered, setIsHovered] = React.useState(false)
100
+ return (
101
+ <Link href={cta.url} legacyBehavior>
102
+ <a
103
+ className={classNames(s.tile, s[variant])}
104
+ onMouseOver={() => {
105
+ setIsHovered(true)
106
+ }}
107
+ onMouseOut={() => {
108
+ setIsHovered(false)
109
+ }}
110
+ >
111
+ <div className={s.tileInner}>
112
+ <h3 className={s.tileHeading}>
113
+ <span className={s.tileHeadingText}>{heading}</span>
114
+ {badge ? <BadgeWrapper theme={theme}>{badge}</BadgeWrapper> : null}
115
+ </h3>
116
+ {description ? (
117
+ <p className={s.tileDescription}>{description}</p>
118
+ ) : null}
119
+ <span className={s.tileCta}>
120
+ <span className={s.tileCtaLabel}>{cta.title}</span>
121
+ <span className={s.tileCtaIcon}>
122
+ <ExpandableArrow expanded={isHovered} />
123
+ </span>
124
+ </span>
125
+ </div>
126
+ <span className={s.tileScrim} />
127
+ </a>
128
+ </Link>
129
+ )
130
+ }
131
+
132
+ const BadgeWrapper = ({ theme, children }) => {
133
+ const badgeTheme = theme === 'hashicorp' ? 'action' : theme
134
+ const page = theme === 'hashicorp' ? 'action' : 'actionFaint'
135
+
136
+ return (
137
+ <span className={s.tileBadge}>
138
+ <Badge theme={badgeTheme} page={page}>
139
+ {children}
140
+ </Badge>
141
+ </span>
142
+ )
143
+ }