@hashicorp/react-components 0.0.0 → 1.0.1

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 (586) 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 +18 -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/nav-panel/components/link-list/index.tsx +88 -0
  101. package/src/components/nav-panel/components/link-list/style.module.css +57 -0
  102. package/src/components/nav-panel/components/panel/column/index.tsx +9 -0
  103. package/src/components/nav-panel/components/panel/column/style.module.css +14 -0
  104. package/src/components/nav-panel/components/panel/index.tsx +4 -0
  105. package/src/components/nav-panel/components/panel/root/index.tsx +9 -0
  106. package/src/components/nav-panel/components/panel/root/style.module.css +15 -0
  107. package/src/components/nav-panel/components/promo/index.tsx +79 -0
  108. package/src/components/nav-panel/components/promo/style.module.css +92 -0
  109. package/src/components/nav-panel/index.tsx +6 -0
  110. package/src/components/nav-panel/product-panel/index.tsx +88 -0
  111. package/src/components/nav-panel/product-panel/style.module.css +100 -0
  112. package/src/components/nav-panel/standard-panel/index.tsx +44 -0
  113. package/src/components/nav-panel/standard-panel/style.module.css +11 -0
  114. package/src/components/next-steps/index.tsx +137 -0
  115. package/src/components/next-steps/style.module.css +270 -0
  116. package/src/components/next-steps/types.ts +63 -0
  117. package/src/components/product-badge/index.test.tsx +11 -0
  118. package/src/components/product-badge/index.tsx +42 -0
  119. package/src/components/product-badge/style.module.css +76 -0
  120. package/src/components/products-used/index.tsx +84 -0
  121. package/src/components/products-used/style.module.css +87 -0
  122. package/src/components/products-used/types.ts +31 -0
  123. package/src/components/related-content/index.test.tsx +74 -0
  124. package/src/components/related-content/index.tsx +56 -0
  125. package/src/components/related-content/style.module.css +89 -0
  126. package/src/components/related-content/types.ts +21 -0
  127. package/src/components/subnav/helpers/areBasePathsMatching.ts +13 -0
  128. package/src/components/subnav/helpers/traverse/index.ts +42 -0
  129. package/src/components/subnav/helpers/useHeightRef.ts +42 -0
  130. package/src/components/subnav/helpers/useNavRef.ts +30 -0
  131. package/src/components/subnav/helpers/useOverflowRef.ts +85 -0
  132. package/src/components/subnav/helpers/useStuckRef.ts +51 -0
  133. package/src/components/subnav/index.tsx +199 -0
  134. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +26 -0
  135. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +22 -0
  136. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +87 -0
  137. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +29 -0
  138. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +32 -0
  139. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +85 -0
  140. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +20 -0
  141. package/{packages → src/components}/subnav/partials/CtaLinks/icons/github.svg.js +5 -0
  142. package/src/components/subnav/partials/CtaLinks/icons/star.js +20 -0
  143. package/src/components/subnav/partials/CtaLinks/index.tsx +130 -0
  144. package/src/components/subnav/partials/CtaLinks/style.module.css +45 -0
  145. package/src/components/subnav/partials/DropdownTrigger/index.tsx +35 -0
  146. package/src/components/subnav/partials/DropdownTrigger/style.module.css +36 -0
  147. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +151 -0
  148. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +91 -0
  149. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +139 -0
  150. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +82 -0
  151. package/src/components/subnav/partials/TitleLink/index.tsx +113 -0
  152. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +9 -0
  153. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +9 -0
  154. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +23 -0
  155. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +23 -0
  156. package/src/components/subnav/partials/TitleLink/style.module.css +43 -0
  157. package/src/components/subnav/partials/nav-item-text/index.tsx +37 -0
  158. package/src/components/subnav/partials/nav-item-text/style.module.css +15 -0
  159. package/src/components/subnav/style.module.css +68 -0
  160. package/src/components/subnav/subnav-consts.ts +1 -0
  161. package/src/components/subnav/theme.module.css +50 -0
  162. package/tsconfig.json +14 -0
  163. package/vitest.config.mts +12 -0
  164. package/.circleci/config.yml +0 -8
  165. package/.github/pull_request_template.md +0 -36
  166. package/.github/workflows/publish.yml +0 -181
  167. package/__test-helpers/expect-throw.js +0 -6
  168. package/__test-helpers/extend-expect.js +0 -1
  169. package/__test-helpers/mocks/css-module-mock.js +0 -1
  170. package/__test-helpers/mocks/graphql-fragment-mock.js +0 -1
  171. package/__test-helpers/mocks/svg-mock.js +0 -1
  172. package/babel.config.js +0 -5
  173. package/jest.config.js +0 -13
  174. package/lerna.json +0 -16
  175. package/next.config.js +0 -14
  176. package/packages/accordion/LICENSE +0 -373
  177. package/packages/accordion/README.md +0 -5
  178. package/packages/accordion/index.js +0 -21
  179. package/packages/accordion/package-lock.json +0 -13
  180. package/packages/accordion/package.json +0 -20
  181. package/packages/accordion/partials/AccordionItems/fixtures/default.json +0 -12
  182. package/packages/accordion/partials/AccordionItems/icons/arrow-down.svg +0 -1
  183. package/packages/accordion/partials/AccordionItems/index.js +0 -64
  184. package/packages/accordion/partials/AccordionItems/style.css +0 -2
  185. package/packages/accordion/partials/AccordionItems/styles/content.css +0 -47
  186. package/packages/accordion/partials/AccordionItems/styles/index.css +0 -72
  187. package/packages/accordion/partials/Collapsible/index.js +0 -87
  188. package/packages/accordion/partials/Collapsible/style.css +0 -10
  189. package/packages/accordion/style.css +0 -3
  190. package/packages/accordion/styles/index.css +0 -14
  191. package/packages/alert/LICENSE +0 -373
  192. package/packages/alert/README.md +0 -9
  193. package/packages/alert/fragment.graphql +0 -8
  194. package/packages/alert/index.js +0 -44
  195. package/packages/alert/package.json +0 -22
  196. package/packages/alert/style.css +0 -138
  197. package/packages/alert-banner/LICENSE +0 -373
  198. package/packages/alert-banner/README.md +0 -3
  199. package/packages/alert-banner/close-icon.js +0 -35
  200. package/packages/alert-banner/fragment.graphql +0 -8
  201. package/packages/alert-banner/index.jsx +0 -97
  202. package/packages/alert-banner/package-lock.json +0 -18
  203. package/packages/alert-banner/package.json +0 -26
  204. package/packages/alert-banner/style.css +0 -151
  205. package/packages/button/LICENSE +0 -373
  206. package/packages/button/README.md +0 -19
  207. package/packages/button/fragment.graphql +0 -6
  208. package/packages/button/helpers/normalizeButtonTheme.js +0 -49
  209. package/packages/button/icons/arrow-right.svg.js +0 -1
  210. package/packages/button/icons/chevron-down.svg.js +0 -1
  211. package/packages/button/icons/download.svg.js +0 -1
  212. package/packages/button/icons/external-link.svg.js +0 -1
  213. package/packages/button/index.js +0 -86
  214. package/packages/button/package-lock.json +0 -18
  215. package/packages/button/package.json +0 -21
  216. package/packages/button/styles/index.css +0 -122
  217. package/packages/button/styles/variant-primary.css +0 -232
  218. package/packages/button/styles/variant-secondary.css +0 -179
  219. package/packages/button/styles/variant-tertiary-neutral.css +0 -65
  220. package/packages/button/styles/variant-tertiary.css +0 -182
  221. package/packages/call-to-action/LICENSE +0 -373
  222. package/packages/call-to-action/README.md +0 -3
  223. package/packages/call-to-action/index.js +0 -67
  224. package/packages/call-to-action/package-lock.json +0 -27
  225. package/packages/call-to-action/package.json +0 -21
  226. package/packages/call-to-action/style.css +0 -1
  227. package/packages/call-to-action/styles/_temp-spacing-tokens.css +0 -33
  228. package/packages/call-to-action/styles/common.css +0 -27
  229. package/packages/call-to-action/styles/index.css +0 -4
  230. package/packages/call-to-action/styles/variant-centered.css +0 -44
  231. package/packages/call-to-action/styles/variant-compact.css +0 -46
  232. package/packages/call-to-action/styles/variant-links.css +0 -32
  233. package/packages/callouts/LICENSE +0 -373
  234. package/packages/callouts/README.md +0 -8
  235. package/packages/callouts/index.js +0 -67
  236. package/packages/callouts/package-lock.json +0 -33
  237. package/packages/callouts/package.json +0 -20
  238. package/packages/callouts/partials/callout-item/fixtures/default.json +0 -9
  239. package/packages/callouts/partials/callout-item/index.js +0 -71
  240. package/packages/callouts/partials/callout-item/style.css +0 -76
  241. package/packages/callouts/style.css +0 -1
  242. package/packages/callouts/styles/_temp-reset.css +0 -11
  243. package/packages/callouts/styles/_temp-spacing-tokens.css +0 -41
  244. package/packages/callouts/styles/index.css +0 -124
  245. package/packages/case-study-slider/LICENSE +0 -373
  246. package/packages/case-study-slider/Logo.js +0 -6
  247. package/packages/case-study-slider/StatusBar.js +0 -14
  248. package/packages/case-study-slider/StatusBar.test.js +0 -32
  249. package/packages/case-study-slider/docs.mdx +0 -144
  250. package/packages/case-study-slider/fragment.graphql +0 -33
  251. package/packages/case-study-slider/index.js +0 -229
  252. package/packages/case-study-slider/index.test.js +0 -279
  253. package/packages/case-study-slider/package-lock.json +0 -72
  254. package/packages/case-study-slider/package.json +0 -20
  255. package/packages/case-study-slider/props.js +0 -182
  256. package/packages/case-study-slider/readme.md +0 -7
  257. package/packages/case-study-slider/style.css +0 -176
  258. package/packages/checkbox-input/LICENSE +0 -373
  259. package/packages/checkbox-input/index.js +0 -55
  260. package/packages/checkbox-input/package-lock.json +0 -13
  261. package/packages/checkbox-input/package.json +0 -20
  262. package/packages/checkbox-input/readme.md +0 -19
  263. package/packages/checkbox-input/style.css +0 -110
  264. package/packages/code-block/LICENSE +0 -373
  265. package/packages/code-block/README.md +0 -9
  266. package/packages/code-block/fragment.graphql +0 -10
  267. package/packages/code-block/img/clipboard.svg +0 -1
  268. package/packages/code-block/index.js +0 -85
  269. package/packages/code-block/languages/sentinel.js +0 -71
  270. package/packages/code-block/package-lock.json +0 -68
  271. package/packages/code-block/package.json +0 -22
  272. package/packages/code-block/style.css +0 -162
  273. package/packages/consent-manager/LICENSE +0 -373
  274. package/packages/consent-manager/banner.js +0 -39
  275. package/packages/consent-manager/cookies.js +0 -53
  276. package/packages/consent-manager/dialog.js +0 -286
  277. package/packages/consent-manager/icn_close.js +0 -19
  278. package/packages/consent-manager/index.js +0 -119
  279. package/packages/consent-manager/integrations.js +0 -92
  280. package/packages/consent-manager/load.js +0 -139
  281. package/packages/consent-manager/package-lock.json +0 -45
  282. package/packages/consent-manager/package.json +0 -24
  283. package/packages/consent-manager/style.css +0 -209
  284. package/packages/content/LICENSE +0 -373
  285. package/packages/content/README.md +0 -8
  286. package/packages/content/index.js +0 -9
  287. package/packages/content/package.json +0 -17
  288. package/packages/content/style.css +0 -322
  289. package/packages/content-cta/LICENSE +0 -373
  290. package/packages/content-cta/README.md +0 -3
  291. package/packages/content-cta/docs.mdx +0 -25
  292. package/packages/content-cta/index.js +0 -49
  293. package/packages/content-cta/index.test.js +0 -78
  294. package/packages/content-cta/package-lock.json +0 -27
  295. package/packages/content-cta/package.json +0 -20
  296. package/packages/content-cta/props.js +0 -41
  297. package/packages/content-cta/stories/docs.mdx +0 -0
  298. package/packages/content-cta/stories/examples.stories.js +0 -51
  299. package/packages/content-cta/stories/with-knobs.stories.js +0 -58
  300. package/packages/content-cta/style.css +0 -80
  301. package/packages/docs-page/LICENSE +0 -373
  302. package/packages/docs-page/README.md +0 -51
  303. package/packages/docs-page/components.js +0 -11
  304. package/packages/docs-page/docs.mdx +0 -71
  305. package/packages/docs-page/img/github-logo.svg +0 -1
  306. package/packages/docs-page/index.js +0 -75
  307. package/packages/docs-page/index.test.js +0 -18
  308. package/packages/docs-page/package-lock.json +0 -138
  309. package/packages/docs-page/package.json +0 -28
  310. package/packages/docs-page/props.js +0 -59
  311. package/packages/docs-page/server.js +0 -137
  312. package/packages/docs-page/style.css +0 -120
  313. package/packages/docs-page/temporary_jump-to-section.js +0 -64
  314. package/packages/docs-sidenav/LICENSE +0 -373
  315. package/packages/docs-sidenav/README.md +0 -7
  316. package/packages/docs-sidenav/chevron-icon.js +0 -18
  317. package/packages/docs-sidenav/img/external.svg +0 -7
  318. package/packages/docs-sidenav/index.js +0 -457
  319. package/packages/docs-sidenav/menu-icon.js +0 -14
  320. package/packages/docs-sidenav/package-lock.json +0 -26
  321. package/packages/docs-sidenav/package.json +0 -21
  322. package/packages/docs-sidenav/style.css +0 -302
  323. package/packages/enterprise-alert/LICENSE +0 -373
  324. package/packages/enterprise-alert/README.md +0 -9
  325. package/packages/enterprise-alert/index.js +0 -28
  326. package/packages/enterprise-alert/package-lock.json +0 -13
  327. package/packages/enterprise-alert/package.json +0 -23
  328. package/packages/enterprise-alert/style.css +0 -91
  329. package/packages/featured-slider/LICENSE +0 -373
  330. package/packages/featured-slider/README.md +0 -3
  331. package/packages/featured-slider/StatusBar.js +0 -14
  332. package/packages/featured-slider/docs.mdx +0 -60
  333. package/packages/featured-slider/index.js +0 -231
  334. package/packages/featured-slider/index.test.js +0 -59
  335. package/packages/featured-slider/package-lock.json +0 -66
  336. package/packages/featured-slider/package.json +0 -22
  337. package/packages/featured-slider/props.js +0 -82
  338. package/packages/featured-slider/style.css +0 -204
  339. package/packages/hashi-stack-menu/LICENSE +0 -373
  340. package/packages/hashi-stack-menu/README.md +0 -3
  341. package/packages/hashi-stack-menu/assets/icon-dropdown.svg +0 -1
  342. package/packages/hashi-stack-menu/assets/logo.svg +0 -1
  343. package/packages/hashi-stack-menu/assets/product-icons/boundary-icon-color.svg +0 -1
  344. package/packages/hashi-stack-menu/assets/product-icons/consul-icon-color.svg +0 -1
  345. package/packages/hashi-stack-menu/assets/product-icons/nomad-icon-color.svg +0 -1
  346. package/packages/hashi-stack-menu/assets/product-icons/packer-icon-color.svg +0 -1
  347. package/packages/hashi-stack-menu/assets/product-icons/terraform-icon-color.svg +0 -1
  348. package/packages/hashi-stack-menu/assets/product-icons/vagrant-icon-color.svg +0 -1
  349. package/packages/hashi-stack-menu/assets/product-icons/vault-icon-color.svg +0 -1
  350. package/packages/hashi-stack-menu/assets/product-icons/waypoint-icon-color.svg +0 -1
  351. package/packages/hashi-stack-menu/browse-panel/browse-panel.module.css +0 -33
  352. package/packages/hashi-stack-menu/browse-panel/index.jsx +0 -9
  353. package/packages/hashi-stack-menu/data/index.js +0 -125
  354. package/packages/hashi-stack-menu/hashi-stack-menu.module.css +0 -41
  355. package/packages/hashi-stack-menu/index.jsx +0 -51
  356. package/packages/hashi-stack-menu/nav-item/index.jsx +0 -100
  357. package/packages/hashi-stack-menu/nav-item/nav-item.module.css +0 -64
  358. package/packages/hashi-stack-menu/package-lock.json +0 -18
  359. package/packages/hashi-stack-menu/package.json +0 -17
  360. package/packages/hashi-stack-menu/stack-group/index.jsx +0 -16
  361. package/packages/hashi-stack-menu/stack-group/stack-group.module.css +0 -29
  362. package/packages/hashi-stack-menu/stack-item/index.jsx +0 -35
  363. package/packages/hashi-stack-menu/stack-item/stack-item.module.css +0 -58
  364. package/packages/hashi-stack-menu/stack-menu-section/index.jsx +0 -18
  365. package/packages/hashi-stack-menu/stack-menu-section/stack-menu-section.module.css +0 -26
  366. package/packages/hashi-stack-menu/use-on-click-outside-dropdown.js +0 -22
  367. package/packages/head/LICENSE +0 -373
  368. package/packages/head/README.md +0 -236
  369. package/packages/head/index.d.ts +0 -107
  370. package/packages/head/index.js +0 -66
  371. package/packages/head/package.json +0 -17
  372. package/packages/hero/LICENSE +0 -373
  373. package/packages/hero/README.md +0 -31
  374. package/packages/hero/arrow-icon.js +0 -24
  375. package/packages/hero/carousel.js +0 -153
  376. package/packages/hero/fragment.graphql +0 -55
  377. package/packages/hero/heroLeadForm.js +0 -107
  378. package/packages/hero/index.js +0 -129
  379. package/packages/hero/package-lock.json +0 -273
  380. package/packages/hero/package.json +0 -28
  381. package/packages/hero/style.css +0 -501
  382. package/packages/image/LICENSE +0 -373
  383. package/packages/image/fragment.graphql +0 -5
  384. package/packages/image/index.js +0 -81
  385. package/packages/image/package-lock.json +0 -33
  386. package/packages/image/package.json +0 -21
  387. package/packages/image/readme.md +0 -27
  388. package/packages/inline-svg/LICENSE +0 -373
  389. package/packages/inline-svg/README.md +0 -9
  390. package/packages/inline-svg/docs.mdx +0 -15
  391. package/packages/inline-svg/index.js +0 -23
  392. package/packages/inline-svg/index.test.js +0 -50
  393. package/packages/inline-svg/package.json +0 -30
  394. package/packages/inline-svg/props.js +0 -10
  395. package/packages/learn-callout/LICENSE +0 -373
  396. package/packages/learn-callout/README.md +0 -9
  397. package/packages/learn-callout/docs.mdx +0 -31
  398. package/packages/learn-callout/index.js +0 -57
  399. package/packages/learn-callout/index.test.js +0 -49
  400. package/packages/learn-callout/props.js +0 -47
  401. package/packages/learn-callout/style.css +0 -207
  402. package/packages/link-wrap/LICENSE +0 -373
  403. package/packages/link-wrap/README.md +0 -44
  404. package/packages/link-wrap/index.js +0 -40
  405. package/packages/link-wrap/package-lock.json +0 -5
  406. package/packages/link-wrap/package.json +0 -17
  407. package/packages/logo-grid/LICENSE +0 -373
  408. package/packages/logo-grid/README.md +0 -26
  409. package/packages/logo-grid/fragment.graphql +0 -17
  410. package/packages/logo-grid/index.js +0 -157
  411. package/packages/logo-grid/package-lock.json +0 -111
  412. package/packages/logo-grid/package.json +0 -21
  413. package/packages/logo-grid/style.css +0 -148
  414. package/packages/product-downloader/LICENSE +0 -373
  415. package/packages/product-downloader/README.md +0 -9
  416. package/packages/product-downloader/index.js +0 -102
  417. package/packages/product-downloader/package-lock.json +0 -103
  418. package/packages/product-downloader/package.json +0 -18
  419. package/packages/product-downloader/partials/download-cards/index.jsx +0 -125
  420. package/packages/product-downloader/partials/download-cards/style.module.css +0 -152
  421. package/packages/product-downloader/partials/dropdown/index.jsx +0 -58
  422. package/packages/product-downloader/partials/dropdown/style.module.css +0 -28
  423. package/packages/product-downloader/partials/logos/fastly.svg +0 -7
  424. package/packages/product-downloader/partials/release-information/index.jsx +0 -148
  425. package/packages/product-downloader/partials/release-information/style.module.css +0 -101
  426. package/packages/product-downloader/style.module.css +0 -100
  427. package/packages/product-downloader/utils/downloader.js +0 -136
  428. package/packages/product-features-list/LICENSE +0 -373
  429. package/packages/product-features-list/README.md +0 -3
  430. package/packages/product-features-list/index.js +0 -30
  431. package/packages/product-features-list/package-lock.json +0 -42
  432. package/packages/product-features-list/package.json +0 -20
  433. package/packages/product-features-list/style.css +0 -90
  434. package/packages/search/LICENSE +0 -373
  435. package/packages/search/README.md +0 -188
  436. package/packages/search/hits.js +0 -196
  437. package/packages/search/img/return.svg.js +0 -1
  438. package/packages/search/img/search-legend-enter.svg.js +0 -1
  439. package/packages/search/img/search-legend-escape.svg.js +0 -1
  440. package/packages/search/img/search-legend-page.svg.js +0 -1
  441. package/packages/search/img/search-x.svg.js +0 -1
  442. package/packages/search/img/search.svg.js +0 -1
  443. package/packages/search/img/slash-search-toggle.js +0 -17
  444. package/packages/search/index.js +0 -60
  445. package/packages/search/legend.js +0 -32
  446. package/packages/search/package-lock.json +0 -931
  447. package/packages/search/package.json +0 -29
  448. package/packages/search/provider.js +0 -81
  449. package/packages/search/search-box.js +0 -139
  450. package/packages/search/style.css +0 -366
  451. package/packages/search/tools.js +0 -166
  452. package/packages/section-header/LICENSE +0 -373
  453. package/packages/section-header/README.md +0 -13
  454. package/packages/section-header/fragment.graphql +0 -5
  455. package/packages/section-header/index.js +0 -42
  456. package/packages/section-header/package-lock.json +0 -18
  457. package/packages/section-header/package.json +0 -20
  458. package/packages/section-header/style.css +0 -18
  459. package/packages/select-input/LICENSE +0 -373
  460. package/packages/select-input/README.md +0 -1
  461. package/packages/select-input/img/dropdown-arrow.svg +0 -1
  462. package/packages/select-input/index.js +0 -80
  463. package/packages/select-input/package-lock.json +0 -70
  464. package/packages/select-input/package.json +0 -19
  465. package/packages/select-input/style.css +0 -88
  466. package/packages/subnav/LICENSE +0 -373
  467. package/packages/subnav/README.md +0 -85
  468. package/packages/subnav/helpers/globalThis.js +0 -9
  469. package/packages/subnav/helpers/traverse/index.js +0 -34
  470. package/packages/subnav/helpers/useNavRef.js +0 -16
  471. package/packages/subnav/helpers/useOverflowRef.js +0 -76
  472. package/packages/subnav/helpers/useStuckRef.js +0 -43
  473. package/packages/subnav/icons/boundary-logo-color.svgr.js +0 -32
  474. package/packages/subnav/icons/chevron-down.svg.js +0 -3
  475. package/packages/subnav/icons/consul-logo-color.svgr.js +0 -44
  476. package/packages/subnav/icons/hcp-logo-black-white.svgr.js +0 -29
  477. package/packages/subnav/icons/nomad-logo-color.svgr.js +0 -50
  478. package/packages/subnav/icons/packer-logo-color.svgr.js +0 -40
  479. package/packages/subnav/icons/terraform-logo-color.svgr.js +0 -44
  480. package/packages/subnav/icons/vagrant-logo-color.svgr.js +0 -38
  481. package/packages/subnav/icons/vault-logo-color.svgr.js +0 -32
  482. package/packages/subnav/icons/waypoint-logo-color.svgr.js +0 -28
  483. package/packages/subnav/index.js +0 -107
  484. package/packages/subnav/package-lock.json +0 -56
  485. package/packages/subnav/package.json +0 -25
  486. package/packages/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.js +0 -17
  487. package/packages/subnav/partials/CtaLinks/github-stars-link/index.js +0 -71
  488. package/packages/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.js +0 -25
  489. package/packages/subnav/partials/CtaLinks/github-stars-link/style.css +0 -78
  490. package/packages/subnav/partials/CtaLinks/icons/github-logo.js +0 -14
  491. package/packages/subnav/partials/CtaLinks/icons/star.js +0 -14
  492. package/packages/subnav/partials/CtaLinks/index.js +0 -48
  493. package/packages/subnav/partials/CtaLinks/style.css +0 -32
  494. package/packages/subnav/partials/DropdownTrigger/index.js +0 -20
  495. package/packages/subnav/partials/DropdownTrigger/style.css +0 -27
  496. package/packages/subnav/partials/MenuItemsDefault/index.js +0 -131
  497. package/packages/subnav/partials/MenuItemsDefault/style.css +0 -63
  498. package/packages/subnav/partials/MenuItemsOverflow/index.js +0 -117
  499. package/packages/subnav/partials/MenuItemsOverflow/style.css +0 -38
  500. package/packages/subnav/partials/TitleLink/index.js +0 -40
  501. package/packages/subnav/partials/TitleLink/style.css +0 -21
  502. package/packages/subnav/style.css +0 -6
  503. package/packages/subnav/styles/_temp-g-svg.css +0 -22
  504. package/packages/subnav/styles/_temp-resets.css +0 -15
  505. package/packages/subnav/styles/index.css +0 -103
  506. package/packages/tabbed-accordion/LICENSE +0 -373
  507. package/packages/tabbed-accordion/README.md +0 -3
  508. package/packages/tabbed-accordion/fixtures/base.json +0 -44
  509. package/packages/tabbed-accordion/index.js +0 -27
  510. package/packages/tabbed-accordion/package-lock.json +0 -27
  511. package/packages/tabbed-accordion/package.json +0 -19
  512. package/packages/tabbed-accordion/style/_temp-spacing-tokens.css +0 -36
  513. package/packages/tabbed-accordion/style/index.css +0 -22
  514. package/packages/tabbed-accordion/style.css +0 -1
  515. package/packages/tabs/LICENSE +0 -373
  516. package/packages/tabs/README.md +0 -31
  517. package/packages/tabs/index.js +0 -41
  518. package/packages/tabs/package-lock.json +0 -73
  519. package/packages/tabs/package.json +0 -18
  520. package/packages/tabs/partials/TabTriggers/helpers/smoothScroll.js +0 -77
  521. package/packages/tabs/partials/TabTriggers/icons/chevron-right_black.svg.js +0 -1
  522. package/packages/tabs/partials/TabTriggers/index.js +0 -143
  523. package/packages/tabs/partials/TabTriggers/partials/TabTrigger/icons/tooltip.svg.js +0 -1
  524. package/packages/tabs/partials/TabTriggers/partials/TabTrigger/index.js +0 -37
  525. package/packages/tabs/partials/TabTriggers/partials/TabTrigger/style.css +0 -75
  526. package/packages/tabs/partials/TabTriggers/style.css +0 -152
  527. package/packages/tabs/style.css +0 -67
  528. package/packages/terminal/LICENSE +0 -373
  529. package/packages/terminal/README.md +0 -9
  530. package/packages/terminal/Terminal.module.css +0 -146
  531. package/packages/terminal/index.jsx +0 -46
  532. package/packages/terminal/package.json +0 -17
  533. package/packages/text-input/LICENSE +0 -373
  534. package/packages/text-input/README.md +0 -24
  535. package/packages/text-input/index.js +0 -42
  536. package/packages/text-input/package-lock.json +0 -13
  537. package/packages/text-input/package.json +0 -19
  538. package/packages/text-input/style.css +0 -68
  539. package/packages/text-split/LICENSE +0 -373
  540. package/packages/text-split/README.md +0 -3
  541. package/packages/text-split/index.js +0 -66
  542. package/packages/text-split/package-lock.json +0 -35
  543. package/packages/text-split/package.json +0 -20
  544. package/packages/text-split/partials/button-group/index.js +0 -40
  545. package/packages/text-split/partials/button-group/style.css +0 -28
  546. package/packages/text-split/partials/checkbox-list/icons/check-circle.svg.jsx +0 -39
  547. package/packages/text-split/partials/checkbox-list/index.js +0 -28
  548. package/packages/text-split/partials/checkbox-list/style.css +0 -59
  549. package/packages/text-split/style.css +0 -1
  550. package/packages/text-split/styles/_temp-spacing-tokens.css +0 -37
  551. package/packages/text-split/styles/index.css +0 -86
  552. package/packages/text-split-with-code/LICENSE +0 -373
  553. package/packages/text-split-with-code/README.md +0 -13
  554. package/packages/text-split-with-code/index.js +0 -29
  555. package/packages/text-split-with-code/package-lock.json +0 -117
  556. package/packages/text-split-with-code/package.json +0 -21
  557. package/packages/text-split-with-code/style.css +0 -42
  558. package/packages/text-split-with-image/LICENSE +0 -373
  559. package/packages/text-split-with-image/README.md +0 -12
  560. package/packages/text-split-with-image/index.js +0 -11
  561. package/packages/text-split-with-image/package-lock.json +0 -75
  562. package/packages/text-split-with-image/package.json +0 -17
  563. package/packages/text-split-with-logo-grid/LICENSE +0 -373
  564. package/packages/text-split-with-logo-grid/README.md +0 -8
  565. package/packages/text-split-with-logo-grid/index.js +0 -63
  566. package/packages/text-split-with-logo-grid/package-lock.json +0 -90
  567. package/packages/text-split-with-logo-grid/package.json +0 -18
  568. package/packages/text-split-with-logo-grid/style.css +0 -88
  569. package/packages/toggle/LICENSE +0 -373
  570. package/packages/toggle/index.js +0 -22
  571. package/packages/toggle/package-lock.json +0 -5
  572. package/packages/toggle/package.json +0 -17
  573. package/packages/toggle/readme.md +0 -7
  574. package/packages/toggle/style.css +0 -35
  575. package/packages/vertical-text-block-list/LICENSE +0 -373
  576. package/packages/vertical-text-block-list/README.md +0 -15
  577. package/packages/vertical-text-block-list/index.js +0 -54
  578. package/packages/vertical-text-block-list/package-lock.json +0 -60
  579. package/packages/vertical-text-block-list/package.json +0 -22
  580. package/packages/vertical-text-block-list/style.css +0 -104
  581. package/pages/_app.jsx +0 -5
  582. package/pages/global.css +0 -43
  583. package/pages/index.jsx +0 -16
  584. package/prettier.config.js +0 -4
  585. package/scripts/release-check-branch.sh +0 -15
  586. 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,88 @@
1
+ import Link from 'next/link'
2
+ import { parseUrl } from '../../../../../../../apps/www/lib/parseUrl'
3
+ import { v } from '@web/cms'
4
+ import FlightIcon from '@hashicorp/react-design-system-components/src/components/flight-icon'
5
+ import * as NavigationMenu from '@radix-ui/react-navigation-menu'
6
+ import s from './style.module.css'
7
+
8
+ export interface LinkListProps {
9
+ links: {
10
+ title: string
11
+ url: string
12
+ icon?: string
13
+ description?: string
14
+ iconGradient?: string
15
+ }[]
16
+ linkClickHandler?: (title: string, url: string) => void
17
+ }
18
+
19
+ const GRADIENT_VALUE_MAP = new Map([
20
+ [
21
+ 'ILM',
22
+ {
23
+ iconGradient: 'var(--icon-gradient-infrastructure-lifecycle-management)',
24
+ },
25
+ ],
26
+ [
27
+ 'SLM',
28
+ {
29
+ iconGradient: 'var(--icon-gradient-security-lifecycle-management)',
30
+ },
31
+ ],
32
+ [
33
+ 'Cloud',
34
+ {
35
+ iconGradient: 'var(--icon-gradient-infrastructure-cloud)',
36
+ },
37
+ ],
38
+ ])
39
+
40
+ export default function LinkList({ links, linkClickHandler }: LinkListProps) {
41
+ return (
42
+ <ul className={s.linkList}>
43
+ {links.map((link) => {
44
+ let style
45
+ link.iconGradient
46
+ ? (style = {
47
+ '--iconGradient': GRADIENT_VALUE_MAP.get(v(link.iconGradient))
48
+ ?.iconGradient,
49
+ } as React.CSSProperties)
50
+ : (style = null)
51
+ return (
52
+ <li key={link.title}>
53
+ <NavigationMenu.Link asChild>
54
+ <Link
55
+ className={s.link}
56
+ href={parseUrl(link.url).href}
57
+ onClickCapture={() => {
58
+ linkClickHandler && linkClickHandler(link.title, link.url)
59
+ }}
60
+ >
61
+ {link.iconGradient && link.icon ? (
62
+ <div className={s.iconBackground} style={style}>
63
+ <FlightIcon name={v(link.icon)} />
64
+ </div>
65
+ ) : (
66
+ link.icon && (
67
+ <FlightIcon
68
+ name={v(link.icon)}
69
+ color="var(--token-color-foreground-faint)"
70
+ />
71
+ )
72
+ )}
73
+ <div>
74
+ <div className={link.iconGradient && s.boldTitle}>
75
+ {link.title}
76
+ </div>
77
+ {link.description && (
78
+ <div className={s.description}>{link.description}</div>
79
+ )}
80
+ </div>
81
+ </Link>
82
+ </NavigationMenu.Link>
83
+ </li>
84
+ )
85
+ })}
86
+ </ul>
87
+ )
88
+ }
@@ -0,0 +1,57 @@
1
+ .linkList {
2
+ display: flex;
3
+ list-style: none;
4
+ flex-direction: column;
5
+ gap: var(--hdsplus-spacing-03);
6
+ margin: 0;
7
+ padding: 0;
8
+ }
9
+
10
+ .link {
11
+ color: var(--token-color-foreground-primary);
12
+ display: flex;
13
+ gap: var(--hdsplus-spacing-04);
14
+ padding: var(--hdsplus-spacing-03) var(--hdsplus-spacing-04);
15
+ min-width: 190px;
16
+ align-items: center;
17
+
18
+ &:hover {
19
+ background-color: var(--token-color-surface-interactive-hover);
20
+ border-radius: var(--hdsplus-spacing-01);
21
+ }
22
+
23
+ &:has(.iconBackground) {
24
+ align-items: flex-start;
25
+ }
26
+
27
+ @media (--large) {
28
+ max-width: 416px;
29
+ }
30
+
31
+ &:focus {
32
+ outline: 2px solid var(--token-color-focus-action-internal);
33
+ outline-style: auto;
34
+ }
35
+ }
36
+
37
+ .description {
38
+ font-size: var(--hdsplus-typography-body-200-font-size);
39
+ font-weight: var(--token-typography-font-weight-regular);
40
+ margin-top: var(--hdsplus-spacing-02);
41
+ }
42
+
43
+ .iconBackground {
44
+ background: var(--iconGradient);
45
+ height: var(--hdsplus-spacing-08);
46
+ width: var(--hdsplus-spacing-08);
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ border-radius: 3px;
51
+ flex: none;
52
+ margin-top: 3px;
53
+ }
54
+
55
+ .boldTitle {
56
+ font-weight: var(--font-weight-semi-bold);
57
+ }
@@ -0,0 +1,9 @@
1
+ import s from './style.module.css'
2
+
3
+ export interface NavColumnProps {
4
+ children: React.ReactNode
5
+ }
6
+
7
+ export default function Column({ children }: NavColumnProps) {
8
+ return <div className={s.column}>{children}</div>
9
+ }
@@ -0,0 +1,14 @@
1
+ .column {
2
+ position: relative;
3
+ display: flex;
4
+ flex-direction: column;
5
+ justify-content: flex-start;
6
+ min-width: 190px;
7
+ padding: 0;
8
+ margin: 0 var(--hdsplus-spacing-05);
9
+ border-radius: var(--hdsplus-spacing-03);
10
+
11
+ @media (--large) {
12
+ margin: 0;
13
+ }
14
+ }
@@ -0,0 +1,4 @@
1
+ import Root from './root'
2
+ import Column from './column'
3
+
4
+ export { Root, Column }
@@ -0,0 +1,9 @@
1
+ import s from './style.module.css'
2
+
3
+ interface RootProps {
4
+ children: React.ReactNode
5
+ }
6
+
7
+ export default function Root({ children }: RootProps) {
8
+ return <div className={s.root}>{children}</div>
9
+ }
@@ -0,0 +1,15 @@
1
+ .root {
2
+ width: 100%;
3
+ display: flex;
4
+ flex-direction: column;
5
+ justify-content: space-between;
6
+ /* stylelint-disable-next-line unit-no-unknown */
7
+ min-height: calc(100dvh - var(--hdsplus-spacing-12));
8
+
9
+ @media (--large) {
10
+ justify-content: flex-start;
11
+ height: 100%;
12
+ min-height: fit-content;
13
+ gap: var(--hdsplus-spacing-04);
14
+ }
15
+ }