@hashicorp/react-components 1.1.8 → 1.1.11
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.
- package/package.json +4 -8
- package/src/components/nav-panel/components/flight-icon/index.tsx +51 -0
- package/src/components/nav-panel/components/flight-icon/style.module.css +3 -0
- package/src/components/nav-panel/components/link-list/index.tsx +15 -9
- package/src/components/nav-panel/components/link-list/style.module.css +10 -10
- package/src/components/nav-panel/components/panel/column/style.module.css +3 -3
- package/src/components/nav-panel/components/panel/root/style.module.css +6 -6
- package/src/components/nav-panel/components/promo/index.tsx +15 -9
- package/src/components/nav-panel/components/promo/style.module.css +27 -13
- package/src/components/nav-panel/components/text/index.tsx +34 -0
- package/src/components/nav-panel/product-panel/index.tsx +39 -14
- package/src/components/nav-panel/product-panel/style.module.css +78 -37
- package/src/components/nav-panel/standard-panel/index.tsx +3 -0
- package/src/components/nav-panel/standard-panel/style.module.css +2 -2
- package/src/lib/get-localized-link-props/index.test.ts +30 -0
- package/src/lib/get-localized-link-props/index.ts +45 -0
- package/src/lib/parse-url/index.test.ts +40 -1
- package/src/lib/parse-url/index.ts +75 -9
- package/src/lib/send-posthog-event/index.ts +22 -0
- package/src/lib/supported-locales/index.ts +1 -0
- package/src/lib/track-nav-click-event/index.ts +4 -4
- package/src/lib/v/index.ts +4 -5
- package/src/components/actions/index.tsx +0 -107
- package/src/components/actions/style.module.css +0 -28
- package/src/components/actions/types.ts +0 -73
- package/src/components/call-to-action/index.tsx +0 -205
- package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
- package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
- package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
- package/src/components/call-to-action/styles/variant-links.module.css +0 -85
- package/src/components/card/README.md +0 -11
- package/src/components/card/card.tsx +0 -45
- package/src/components/card/index.test.tsx +0 -69
- package/src/components/card/index.tsx +0 -14
- package/src/components/card/newsroom-card/index.test.tsx +0 -39
- package/src/components/card/newsroom-card/index.tsx +0 -37
- package/src/components/card/newsroom-card/style.module.css +0 -12
- package/src/components/card/partner-card/index.test.tsx +0 -57
- package/src/components/card/partner-card/index.tsx +0 -69
- package/src/components/card/partner-card/style.module.css +0 -24
- package/src/components/card/person-card/index.test.tsx +0 -71
- package/src/components/card/person-card/index.tsx +0 -93
- package/src/components/card/person-card/style.module.css +0 -33
- package/src/components/card/primitives.tsx +0 -176
- package/src/components/card/promo-card/index.tsx +0 -51
- package/src/components/card/resource-card/index.test.tsx +0 -48
- package/src/components/card/resource-card/index.tsx +0 -37
- package/src/components/card/style.module.css +0 -145
- package/src/components/card/types.ts +0 -66
- package/src/components/card/unified-card/index.tsx +0 -64
- package/src/components/consent-manager/README.md +0 -73
- package/src/components/consent-manager/components/banner/banner.module.css +0 -23
- package/src/components/consent-manager/components/banner/banner.test.tsx +0 -31
- package/src/components/consent-manager/components/banner/banner.tsx +0 -73
- package/src/components/consent-manager/components/dialog/dialog.module.css +0 -145
- package/src/components/consent-manager/components/dialog/dialog.test.tsx +0 -194
- package/src/components/consent-manager/components/dialog/dialog.tsx +0 -339
- package/src/components/consent-manager/img/icn_close.tsx +0 -19
- package/src/components/consent-manager/index.test.tsx +0 -334
- package/src/components/consent-manager/index.tsx +0 -186
- package/src/components/consent-manager/loader/README.md +0 -29
- package/src/components/consent-manager/loader/categories.ts +0 -22
- package/src/components/consent-manager/loader/index.tsx +0 -94
- package/src/components/consent-manager/loader/presets/enterprise.ts +0 -12
- package/src/components/consent-manager/loader/presets/oss.ts +0 -10
- package/src/components/consent-manager/loader/services.ts +0 -45
- package/src/components/consent-manager/scripts/custom.tsx +0 -59
- package/src/components/consent-manager/scripts/segment.tsx +0 -87
- package/src/components/consent-manager/style.module.css +0 -9
- package/src/components/consent-manager/types.ts +0 -55
- package/src/components/consent-manager/util/cookies.test.ts +0 -75
- package/src/components/consent-manager/util/cookies.ts +0 -70
- package/src/components/consent-manager/util/integrations.test.ts +0 -115
- package/src/components/consent-manager/util/integrations.ts +0 -110
- package/src/components/intro/index.tsx +0 -82
- package/src/components/intro/style.module.css +0 -67
- package/src/components/intro/types.ts +0 -44
- package/src/components/marketo-form/CHANGELOG.md +0 -122
- package/src/components/marketo-form/README.md +0 -1
- package/src/components/marketo-form/contexts/FormMetadata.ts +0 -11
- package/src/components/marketo-form/docs.mdx +0 -197
- package/src/components/marketo-form/fixtures/index.ts +0 -185
- package/src/components/marketo-form/form/index.tsx +0 -369
- package/src/components/marketo-form/index.test.tsx +0 -320
- package/src/components/marketo-form/index.ts +0 -11
- package/src/components/marketo-form/package.original.json +0 -30
- package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
- package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
- package/src/components/marketo-form/partials/field/index.tsx +0 -90
- package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
- package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
- package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
- package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -21
- package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -37
- package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
- package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
- package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
- package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
- package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
- package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
- package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
- package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
- package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
- package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
- package/src/components/marketo-form/partials/label/index.tsx +0 -24
- package/src/components/marketo-form/partials/label/style.module.css +0 -12
- package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
- package/src/components/marketo-form/props.js +0 -66
- package/src/components/marketo-form/server/api-routes.ts +0 -109
- package/src/components/marketo-form/server/client.ts +0 -98
- package/src/components/marketo-form/server/index.ts +0 -8
- package/src/components/marketo-form/types.ts +0 -268
- package/src/components/marketo-form/utils.test.tsx +0 -103
- package/src/components/marketo-form/utils.ts +0 -449
- package/src/components/next-steps/index.tsx +0 -137
- package/src/components/next-steps/style.module.css +0 -270
- package/src/components/next-steps/types.ts +0 -63
- package/src/components/product-badge/index.test.tsx +0 -11
- package/src/components/product-badge/index.tsx +0 -42
- package/src/components/product-badge/style.module.css +0 -76
- package/src/components/products-used/index.tsx +0 -84
- package/src/components/products-used/style.module.css +0 -87
- package/src/components/products-used/types.ts +0 -31
- package/src/components/related-content/index.test.tsx +0 -74
- package/src/components/related-content/index.tsx +0 -56
- package/src/components/related-content/style.module.css +0 -89
- package/src/components/related-content/types.ts +0 -21
- package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
- package/src/components/subnav/helpers/traverse/index.ts +0 -42
- package/src/components/subnav/helpers/useHeightRef.ts +0 -42
- package/src/components/subnav/helpers/useNavRef.ts +0 -30
- package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
- package/src/components/subnav/helpers/useStuckRef.ts +0 -51
- package/src/components/subnav/index.tsx +0 -199
- package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
- package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
- package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
- package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
- package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
- package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -85
- package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
- package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
- package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
- package/src/components/subnav/partials/CtaLinks/index.tsx +0 -130
- package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
- package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
- package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -36
- package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -151
- package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -91
- package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -139
- package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -82
- package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -9
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -9
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
- package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
- package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
- package/src/components/subnav/partials/nav-item-text/style.module.css +0 -15
- package/src/components/subnav/style.module.css +0 -68
- package/src/components/subnav/subnav-consts.ts +0 -1
- package/src/components/subnav/theme.module.css +0 -50
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import cookies from 'js-cookie'
|
|
2
|
-
import * as cookiesJS from './cookies.js'
|
|
3
|
-
|
|
4
|
-
it('should not show preferences loaded before cookies are saved', () => {
|
|
5
|
-
expect(cookiesJS.preferencesSavedAndLoaded()).toBe(false)
|
|
6
|
-
})
|
|
7
|
-
|
|
8
|
-
it('should show preferences loaded if cookies are loaded', () => {
|
|
9
|
-
const preferences = JSON.stringify({ loadAll: true, version: 1 })
|
|
10
|
-
const originalCookiesGet = cookies.get
|
|
11
|
-
|
|
12
|
-
// mocks
|
|
13
|
-
cookies.get = vi.fn().mockImplementationOnce(() => preferences)
|
|
14
|
-
cookiesJS.loadPreferences()
|
|
15
|
-
|
|
16
|
-
const preferencesLoaded = cookiesJS.preferencesSavedAndLoaded()
|
|
17
|
-
expect(preferencesLoaded).toBe(true)
|
|
18
|
-
|
|
19
|
-
cookies.get = originalCookiesGet
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it('should get the domain', () => {
|
|
23
|
-
const originalLocation = global.window.location
|
|
24
|
-
const originalCookiesGet = cookies.get
|
|
25
|
-
const originalCookiesSet = cookies.set
|
|
26
|
-
|
|
27
|
-
// mocks
|
|
28
|
-
delete global.window.location
|
|
29
|
-
global.window.location = { hostname: 'foo.bar.baz.net' }
|
|
30
|
-
cookies.get = vi.fn().mockImplementationOnce(() => 'baz.net')
|
|
31
|
-
cookies.set = vi.fn()
|
|
32
|
-
|
|
33
|
-
expect(cookiesJS.getDomain()).toBe('baz.net')
|
|
34
|
-
|
|
35
|
-
// restore mocks
|
|
36
|
-
global.window.location = originalLocation
|
|
37
|
-
cookies.get = originalCookiesGet
|
|
38
|
-
cookies.set = originalCookiesSet
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should load preferences', () => {
|
|
42
|
-
const preferences = { loadAll: true, version: 1 }
|
|
43
|
-
const originalCookiesGet = cookies.get
|
|
44
|
-
|
|
45
|
-
// mocks
|
|
46
|
-
cookies.get = vi.fn().mockImplementationOnce(() => preferences)
|
|
47
|
-
|
|
48
|
-
expect(cookiesJS.loadPreferences()).toStrictEqual(preferences)
|
|
49
|
-
|
|
50
|
-
// restore mocks
|
|
51
|
-
cookies.get = originalCookiesGet
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
it('should save preferences', () => {
|
|
55
|
-
global.window.location = { hostname: 'foo.bar.baz.net' }
|
|
56
|
-
const preferences = { loadAll: true, version: 1 }
|
|
57
|
-
const version = 1
|
|
58
|
-
const args = [
|
|
59
|
-
cookiesJS.COOKIE_KEY,
|
|
60
|
-
JSON.stringify(preferences),
|
|
61
|
-
{ expires: cookiesJS.COOKIE_EXPIRES, domain: '' },
|
|
62
|
-
]
|
|
63
|
-
const originalCookiesSet = cookies.set
|
|
64
|
-
|
|
65
|
-
// mocks
|
|
66
|
-
cookies.set = vi.fn()
|
|
67
|
-
|
|
68
|
-
cookiesJS.savePreferences(preferences, version)
|
|
69
|
-
|
|
70
|
-
const lastArgs = cookies.set.mock.calls[cookies.set.mock.calls.length - 1]
|
|
71
|
-
|
|
72
|
-
expect(lastArgs).toStrictEqual(args)
|
|
73
|
-
|
|
74
|
-
cookies.set = originalCookiesSet
|
|
75
|
-
})
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Cookies structure:
|
|
3
|
-
{
|
|
4
|
-
{ segment: { Hotjar: true, Intercom: false, .. } },
|
|
5
|
-
{ custom: { OptinMonster: true } },
|
|
6
|
-
{ categories: { Functional: true } }
|
|
7
|
-
}
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import cookies from 'js-cookie'
|
|
11
|
-
export const COOKIE_KEY = 'hashi-consent-preferences'
|
|
12
|
-
export const COOKIE_EXPIRES = 183
|
|
13
|
-
|
|
14
|
-
let preferences = undefined
|
|
15
|
-
let preferencesLoaded = false
|
|
16
|
-
|
|
17
|
-
export function getDomain() {
|
|
18
|
-
const host = window.location.hostname
|
|
19
|
-
const parts = host.split('.')
|
|
20
|
-
const levels: string[] = []
|
|
21
|
-
let result = ''
|
|
22
|
-
|
|
23
|
-
// get all domain levels
|
|
24
|
-
for (let i = parts.length - 2; i >= 0; i--) {
|
|
25
|
-
levels.push(parts.slice(i).join('.'))
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// find top level domain
|
|
29
|
-
for (let i = 0; i < levels.length; i++) {
|
|
30
|
-
const cname = '__tld__'
|
|
31
|
-
const domain = levels[i]
|
|
32
|
-
const opts = { domain: '.' + domain }
|
|
33
|
-
|
|
34
|
-
cookies.set(cname, '1', opts)
|
|
35
|
-
if (cookies.get(cname)) {
|
|
36
|
-
cookies.set(cname, 'null', opts)
|
|
37
|
-
result = domain
|
|
38
|
-
break
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return result
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export const loadPreferences = () => {
|
|
46
|
-
if (!preferences) {
|
|
47
|
-
const value = cookies.get(COOKIE_KEY)
|
|
48
|
-
if (value && value !== {}.toString()) {
|
|
49
|
-
preferences = JSON.parse(value)
|
|
50
|
-
if (preferences) {
|
|
51
|
-
preferencesLoaded = true
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return preferences
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function savePreferences(prefs, version) {
|
|
60
|
-
const domain = getDomain()
|
|
61
|
-
const prefsWithVersion = Object.assign(prefs, { version: version })
|
|
62
|
-
cookies.set(COOKIE_KEY, JSON.stringify(prefsWithVersion), {
|
|
63
|
-
expires: COOKIE_EXPIRES,
|
|
64
|
-
domain,
|
|
65
|
-
})
|
|
66
|
-
preferences = prefsWithVersion
|
|
67
|
-
preferencesLoaded = true
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export const preferencesSavedAndLoaded = () => preferencesLoaded
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
test('fetches integrations from segment, formats them as expected', async () => {
|
|
2
|
-
vi.resetModules()
|
|
3
|
-
global.fetch = () =>
|
|
4
|
-
Promise.resolve({
|
|
5
|
-
ok: true,
|
|
6
|
-
json: () => mockSegmentResponse,
|
|
7
|
-
}) as any
|
|
8
|
-
const getIntegrations = await import('./integrations')
|
|
9
|
-
const resp = await getIntegrations.default(
|
|
10
|
-
mockProps.segmentServices,
|
|
11
|
-
mockProps.additionalServices,
|
|
12
|
-
'XXX - segment key'
|
|
13
|
-
)
|
|
14
|
-
expect(resp['Test Category'][0].name).toBe('Test Non-Segment Service')
|
|
15
|
-
expect(resp['Test Category'][0].origin).toBe('custom')
|
|
16
|
-
expect(resp['Test Category'][1].name).toBe('Test Non-Segment Service 2')
|
|
17
|
-
expect(resp['Test Category'][1].origin).toBe('custom')
|
|
18
|
-
expect(resp['Test Category'][2].name).toBe('Google Analytics')
|
|
19
|
-
expect(resp['Test Category'][2].origin).toBe('segment')
|
|
20
|
-
expect(resp['Test Category'][3].name).toBe('LinkedIn Insight Tag')
|
|
21
|
-
expect(resp['Test Category'][3].origin).toBe('segment')
|
|
22
|
-
expect(resp['Email Marketing'][0].name).toBe('Marketo V2')
|
|
23
|
-
expect(resp['Email Marketing'][0].origin).toBe('segment')
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
const mockSegmentResponse = [
|
|
27
|
-
{
|
|
28
|
-
name: 'Google Analytics',
|
|
29
|
-
creationName: 'Google Analytics',
|
|
30
|
-
description:
|
|
31
|
-
'Google Analytics is the most popular analytics tool for the web. It’s free and provides a wide range of features. It’s especially good at measuring traffic sources and ad campaigns.',
|
|
32
|
-
website: 'http://google.com/analytics',
|
|
33
|
-
category: 'Test Category',
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'LinkedIn Insight Tag',
|
|
37
|
-
creationName: 'LinkedIn Insight Tag',
|
|
38
|
-
description:
|
|
39
|
-
'The LinkedIn Insight Tag is a piece of lightweight JavaScript code that you can add to your website to enable in-depth campaign reporting and unlock valuable insights about your website visitors. As a LinkedIn Marketing Solutions customer, you can use the LinkedIn Insight Tag to track conversions, retarget website visitors, and unlock additional insights about members interacting with your ads.',
|
|
40
|
-
website: 'https://www.linkedin.com',
|
|
41
|
-
category: 'Advertising',
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
name: 'Marketo V2',
|
|
45
|
-
creationName: 'Marketo V2',
|
|
46
|
-
description:
|
|
47
|
-
'Marketo is a marketing automation tool that can help you engage customers and prospects.',
|
|
48
|
-
website: 'https://www.marketo.com/',
|
|
49
|
-
category: 'Email Marketing',
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
name: 'Heap',
|
|
53
|
-
creationName: 'Heap',
|
|
54
|
-
description:
|
|
55
|
-
'Heap is an analytics tool that automatically tracks all of the actions your users perform just by flipping a switch, instead of after adding custom tracking code.',
|
|
56
|
-
website: 'http://heapanalytics.com',
|
|
57
|
-
category: 'Analytics',
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
name: 'Google Tag Manager',
|
|
61
|
-
creationName: 'Google Tag Manager',
|
|
62
|
-
description:
|
|
63
|
-
'Google Tag Manager lets you add or update your website tags, easily and for free.',
|
|
64
|
-
website: 'https://www.google.com/analytics/tag-manager/',
|
|
65
|
-
category: 'Tag Managers',
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
name: 'Amazon S3',
|
|
69
|
-
creationName: 'Amazon S3',
|
|
70
|
-
description:
|
|
71
|
-
'Our Amazon S3 copies our log files of your raw API calls from our S3 bucket to yours, where you can then perform custom analysis on them.',
|
|
72
|
-
website: 'http://aws.amazon.com/s3',
|
|
73
|
-
category: 'Analytics',
|
|
74
|
-
},
|
|
75
|
-
]
|
|
76
|
-
|
|
77
|
-
const mockProps = {
|
|
78
|
-
segmentServices: [
|
|
79
|
-
{
|
|
80
|
-
name: 'LinkedIn Insight Tag',
|
|
81
|
-
category: 'Test Category',
|
|
82
|
-
description: 'description',
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
additionalServices: [
|
|
86
|
-
{
|
|
87
|
-
name: 'Test Non-Segment Service',
|
|
88
|
-
category: 'Test Category',
|
|
89
|
-
description: 'description',
|
|
90
|
-
body: 'test body',
|
|
91
|
-
url: 'test url',
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
name: 'Test Non-Segment Service 2',
|
|
95
|
-
category: 'Test Category',
|
|
96
|
-
description: 'description',
|
|
97
|
-
body: 'test body 2',
|
|
98
|
-
url: 'test url 2',
|
|
99
|
-
async: true,
|
|
100
|
-
addToBody: true,
|
|
101
|
-
dataAttrs: [
|
|
102
|
-
{
|
|
103
|
-
name: 'test',
|
|
104
|
-
value: 'foobar',
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
categories: [
|
|
110
|
-
{
|
|
111
|
-
name: 'Test Category',
|
|
112
|
-
description: 'description',
|
|
113
|
-
},
|
|
114
|
-
],
|
|
115
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import type { ConsentManagerService } from '../types'
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
integrations.js
|
|
5
|
-
Fetches integrations from Segment given write key and applies user-defined
|
|
6
|
-
overrides. Combines with custom scripts to give a complete view into
|
|
7
|
-
scripts that the site is trying to load. Finally, groups it all by category.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
export type ConsentManagerServiceWithOrigin = ConsentManagerService & {
|
|
11
|
-
origin: string
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default function getIntegrations(
|
|
15
|
-
segmentServices: ConsentManagerService[] = [],
|
|
16
|
-
additionalServices: ConsentManagerService[] = [],
|
|
17
|
-
segmentWriteKey: string | undefined
|
|
18
|
-
): Promise<Record<string, ConsentManagerServiceWithOrigin[]>> {
|
|
19
|
-
return fetchIntegrationsFromSegment(segmentWriteKey)
|
|
20
|
-
.then((segmentOriginated) =>
|
|
21
|
-
zipIntegrations(segmentServices, additionalServices, segmentOriginated)
|
|
22
|
-
)
|
|
23
|
-
.then(groupByCategory)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
interface SegmentIntegration {
|
|
27
|
-
name: string
|
|
28
|
-
creationName: string
|
|
29
|
-
description: string
|
|
30
|
-
website: string
|
|
31
|
-
category: string
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Get integrations from Segment by write key
|
|
35
|
-
async function fetchIntegrationsFromSegment(
|
|
36
|
-
segmentWriteKey: string | undefined
|
|
37
|
-
) {
|
|
38
|
-
const res = await fetch(
|
|
39
|
-
`https://artemis.hashicorp.com/v1/projects/${segmentWriteKey}/integrations`
|
|
40
|
-
)
|
|
41
|
-
if (!res.ok) {
|
|
42
|
-
throw new Error(
|
|
43
|
-
`Failed to fetch integrations: HTTP ${res.status} ${res.statusText}`
|
|
44
|
-
)
|
|
45
|
-
}
|
|
46
|
-
return (await res.json()) as SegmentIntegration[]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Include developer overrides for fetched Segment integrations
|
|
50
|
-
function zipIntegrations(
|
|
51
|
-
segmentOverrides: ConsentManagerService[],
|
|
52
|
-
additionalServices: ConsentManagerService[] | undefined,
|
|
53
|
-
segmentOriginated: SegmentIntegration[]
|
|
54
|
-
): ConsentManagerServiceWithOrigin[] {
|
|
55
|
-
// Create Segment integration object with name as key for quick retrieval
|
|
56
|
-
const segmentObj = segmentOriginated.reduce((obj, segment) => {
|
|
57
|
-
obj[segment.name] = segment
|
|
58
|
-
obj[segment.name].origin = 'segment'
|
|
59
|
-
return obj
|
|
60
|
-
}, {})
|
|
61
|
-
|
|
62
|
-
// Go through each developer-defined segment service and update
|
|
63
|
-
// segmentObj with any overrides
|
|
64
|
-
for (let i = 0; i < segmentOverrides.length; i++) {
|
|
65
|
-
if (
|
|
66
|
-
Object.prototype.hasOwnProperty.call(segmentObj, segmentOverrides[i].name)
|
|
67
|
-
) {
|
|
68
|
-
segmentObj[segmentOverrides[i].name] = Object.assign(
|
|
69
|
-
segmentObj[segmentOverrides[i].name],
|
|
70
|
-
segmentOverrides[i]
|
|
71
|
-
)
|
|
72
|
-
} else {
|
|
73
|
-
/* eslint-disable-next-line */
|
|
74
|
-
console.warn(
|
|
75
|
-
`Unmatched integration config for ${segmentOverrides[i].name}`
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Include additional (non-Segment) services
|
|
81
|
-
const allIntegrations = additionalServices
|
|
82
|
-
? additionalServices.map((integration) => {
|
|
83
|
-
return { ...integration, origin: 'custom' }
|
|
84
|
-
})
|
|
85
|
-
: []
|
|
86
|
-
|
|
87
|
-
for (const key in segmentObj) {
|
|
88
|
-
allIntegrations.push(segmentObj[key])
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Returns array with all integrations, with origin key (segment or custom)
|
|
92
|
-
return allIntegrations
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Group by category for display purposes
|
|
96
|
-
function groupByCategory(
|
|
97
|
-
integrations: ConsentManagerServiceWithOrigin[]
|
|
98
|
-
): Record<string, ConsentManagerServiceWithOrigin[]> {
|
|
99
|
-
const grouped: Record<string, ConsentManagerServiceWithOrigin[]> = {}
|
|
100
|
-
|
|
101
|
-
integrations.forEach((integration) => {
|
|
102
|
-
if (Object.prototype.hasOwnProperty.call(grouped, integration.category)) {
|
|
103
|
-
grouped[integration.category].push(integration)
|
|
104
|
-
} else {
|
|
105
|
-
grouped[integration.category] = [integration]
|
|
106
|
-
}
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
return grouped
|
|
110
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) HashiCorp, Inc.
|
|
3
|
-
* SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import classNames from 'classnames'
|
|
7
|
-
import type { IntroProps } from './types'
|
|
8
|
-
import Actions from '../actions'
|
|
9
|
-
import s from './style.module.css'
|
|
10
|
-
|
|
11
|
-
export default function Intro({
|
|
12
|
-
appearance = 'light',
|
|
13
|
-
textAlignment = 'left',
|
|
14
|
-
eyebrow,
|
|
15
|
-
heading,
|
|
16
|
-
headingElement: HeadingElement = 'h2',
|
|
17
|
-
headingSize = 2,
|
|
18
|
-
description,
|
|
19
|
-
actions,
|
|
20
|
-
}: IntroProps) {
|
|
21
|
-
const headingSizeClassname = `g-type-display-${headingSize}`
|
|
22
|
-
const descriptionSizeClassname =
|
|
23
|
-
headingSize === 1 ? 'g-type-body-large' : 'g-type-body'
|
|
24
|
-
const descriptionClassName = classNames(
|
|
25
|
-
s.description,
|
|
26
|
-
descriptionSizeClassname
|
|
27
|
-
)
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
className={classNames(s.intro, s[appearance], s[textAlignment])}
|
|
31
|
-
data-testid="intro"
|
|
32
|
-
>
|
|
33
|
-
{eyebrow ? <p className={s.eyebrow}>{eyebrow}</p> : null}
|
|
34
|
-
<HeadingElement className={classNames(s.heading, headingSizeClassname)}>
|
|
35
|
-
{heading}
|
|
36
|
-
</HeadingElement>
|
|
37
|
-
<Description className={descriptionClassName}>{description}</Description>
|
|
38
|
-
{actions && actions.ctas && actions.ctas.length > 0 ? (
|
|
39
|
-
<div className={s.actions}>
|
|
40
|
-
<Actions
|
|
41
|
-
appearance={appearance}
|
|
42
|
-
layout={actions.layout}
|
|
43
|
-
alignment={textAlignment}
|
|
44
|
-
theme={actions.theme}
|
|
45
|
-
size={actions.size}
|
|
46
|
-
ctas={actions.ctas}
|
|
47
|
-
/>
|
|
48
|
-
</div>
|
|
49
|
-
) : null}
|
|
50
|
-
</div>
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const containsHTML = (str: string) => /<[a-z][\s\S]*>/i.test(str)
|
|
55
|
-
|
|
56
|
-
function Description({
|
|
57
|
-
className,
|
|
58
|
-
children,
|
|
59
|
-
}: {
|
|
60
|
-
className: string
|
|
61
|
-
children: IntroProps['description']
|
|
62
|
-
}) {
|
|
63
|
-
// ReactNode
|
|
64
|
-
if (typeof children === 'object') {
|
|
65
|
-
return <div className={className}>{children}</div>
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// HTML String
|
|
69
|
-
if (typeof children === 'string' && containsHTML(children)) {
|
|
70
|
-
return (
|
|
71
|
-
<div
|
|
72
|
-
dangerouslySetInnerHTML={{
|
|
73
|
-
__html: children,
|
|
74
|
-
}}
|
|
75
|
-
className={className}
|
|
76
|
-
/>
|
|
77
|
-
)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// String
|
|
81
|
-
return <p className={className}>{children}</p>
|
|
82
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) HashiCorp, Inc.
|
|
3
|
-
* SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
.intro {
|
|
7
|
-
position: relative;
|
|
8
|
-
display: flex;
|
|
9
|
-
flex-direction: column;
|
|
10
|
-
|
|
11
|
-
&.center {
|
|
12
|
-
text-align: center;
|
|
13
|
-
align-items: center;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.eyebrow {
|
|
18
|
-
--color: var(--wpl-neutral-500);
|
|
19
|
-
|
|
20
|
-
composes: hdsplus-typography-label from global;
|
|
21
|
-
font-weight: var(--font-weight-bold);
|
|
22
|
-
text-transform: uppercase;
|
|
23
|
-
margin: 0 0 32px;
|
|
24
|
-
color: var(--color);
|
|
25
|
-
|
|
26
|
-
@nest .dark & {
|
|
27
|
-
--color: var(--wpl-neutral-300);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
.heading {
|
|
32
|
-
--color: var(--wpl-neutral-900);
|
|
33
|
-
|
|
34
|
-
margin: 0;
|
|
35
|
-
color: var(--color);
|
|
36
|
-
|
|
37
|
-
@nest .dark & {
|
|
38
|
-
--color: var(--wpl-neutral-0);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
.description {
|
|
43
|
-
--color: var(--wpl-neutral-500);
|
|
44
|
-
|
|
45
|
-
margin: 16px 0 0;
|
|
46
|
-
color: var(--color);
|
|
47
|
-
|
|
48
|
-
@nest .dark & {
|
|
49
|
-
--color: var(--wpl-neutral-400);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
& > * {
|
|
53
|
-
color: inherit;
|
|
54
|
-
|
|
55
|
-
&:first-child {
|
|
56
|
-
margin-top: 0;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
&:last-child {
|
|
60
|
-
margin-bottom: 0;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.actions {
|
|
66
|
-
margin-top: 32px;
|
|
67
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) HashiCorp, Inc.
|
|
3
|
-
* SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { ActionsProps } from '../actions/types'
|
|
7
|
-
import React from 'react'
|
|
8
|
-
|
|
9
|
-
type WithOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
|
|
10
|
-
|
|
11
|
-
export interface IntroProps {
|
|
12
|
-
/**
|
|
13
|
-
* Display intro on light or dark backgrounds.
|
|
14
|
-
*/
|
|
15
|
-
appearance?: 'light' | 'dark'
|
|
16
|
-
/**
|
|
17
|
-
* Controls the text alignment rendering.
|
|
18
|
-
*/
|
|
19
|
-
textAlignment?: 'left' | 'center'
|
|
20
|
-
/**
|
|
21
|
-
* Optional text displayed above the heading.
|
|
22
|
-
*/
|
|
23
|
-
eyebrow?: string
|
|
24
|
-
/**
|
|
25
|
-
* Text displayed within the heading element.
|
|
26
|
-
*/
|
|
27
|
-
heading: string
|
|
28
|
-
/**
|
|
29
|
-
* Controls which element the heading renders as.
|
|
30
|
-
*/
|
|
31
|
-
headingElement?: 'h1' | 'h2' | 'h3' | 'h4'
|
|
32
|
-
/**
|
|
33
|
-
* Controls the size at which the heading is rendered.
|
|
34
|
-
*/
|
|
35
|
-
headingSize?: 1 | 2 | 3
|
|
36
|
-
/**
|
|
37
|
-
* Text following the heading element.
|
|
38
|
-
*/
|
|
39
|
-
description: string | React.ReactNode
|
|
40
|
-
/**
|
|
41
|
-
* Render CTAs following the description element.
|
|
42
|
-
*/
|
|
43
|
-
actions?: WithOptional<ActionsProps, 'ctas'>
|
|
44
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# @hashicorp/react-marketo-form
|
|
2
|
-
|
|
3
|
-
## 0.9.0
|
|
4
|
-
|
|
5
|
-
### Minor Changes
|
|
6
|
-
|
|
7
|
-
- [#928](https://github.com/hashicorp/react-components/pull/928) [`cc787d0f`](https://github.com/hashicorp/react-components/commit/cc787d0f5c880fe5d569b68ea54d56e5bc1642b6) Thanks [@dstaley](https://github.com/dstaley)! - Add support for htmltext fields
|
|
8
|
-
|
|
9
|
-
### Patch Changes
|
|
10
|
-
|
|
11
|
-
- [#972](https://github.com/hashicorp/react-components/pull/972) [`dbb75084`](https://github.com/hashicorp/react-components/commit/dbb75084839ef20949c37114ea3e58ebd955b33d) Thanks [@dstaley](https://github.com/dstaley)! - Remove content API
|
|
12
|
-
|
|
13
|
-
## 0.8.4
|
|
14
|
-
|
|
15
|
-
### Patch Changes
|
|
16
|
-
|
|
17
|
-
- [#959](https://github.com/hashicorp/react-components/pull/959) [`2084dc74`](https://github.com/hashicorp/react-components/commit/2084dc74bb3390227011c9b2052b4ac393554b6e) Thanks [@dstaley](https://github.com/dstaley)! - Treat all-whitespace values as invalid
|
|
18
|
-
|
|
19
|
-
## 0.8.3
|
|
20
|
-
|
|
21
|
-
### Patch Changes
|
|
22
|
-
|
|
23
|
-
- [#941](https://github.com/hashicorp/react-components/pull/941) [`855af8ac`](https://github.com/hashicorp/react-components/commit/855af8ac0cad8a89920b733c1f914d2dff91c391) Thanks [@BRKalow](https://github.com/BRKalow)! - Updates @hashicorp/platform-analytics to address type errors.
|
|
24
|
-
|
|
25
|
-
- Updated dependencies [[`b4ac21ad`](https://github.com/hashicorp/react-components/commit/b4ac21adec2d76163e1f6a9c3ca5173440d4a934)]:
|
|
26
|
-
- @hashicorp/react-form-fields@0.2.0
|
|
27
|
-
|
|
28
|
-
## 0.8.2
|
|
29
|
-
|
|
30
|
-
### Patch Changes
|
|
31
|
-
|
|
32
|
-
- [#886](https://github.com/hashicorp/react-components/pull/886) [`cbb148e4`](https://github.com/hashicorp/react-components/commit/cbb148e409f362333e6e898b529cd5c92462b79c) Thanks [@dstaley](https://github.com/dstaley)! - Require emails to have domains
|
|
33
|
-
|
|
34
|
-
## 0.8.1
|
|
35
|
-
|
|
36
|
-
### Patch Changes
|
|
37
|
-
|
|
38
|
-
- [#884](https://github.com/hashicorp/react-components/pull/884) [`d7a4fda2`](https://github.com/hashicorp/react-components/commit/d7a4fda22665ab92ad075c66ca11811b13d819ce) Thanks [@dstaley](https://github.com/dstaley)! - Explicitly set default values for hidden fields
|
|
39
|
-
|
|
40
|
-
## 0.8.0
|
|
41
|
-
|
|
42
|
-
### Minor Changes
|
|
43
|
-
|
|
44
|
-
- [#857](https://github.com/hashicorp/react-components/pull/857) [`2dfb913c`](https://github.com/hashicorp/react-components/commit/2dfb913cde43b4354183bbd04e65975aadd995e5) Thanks [@dstaley](https://github.com/dstaley)! - Add support for Marketo-driven localization
|
|
45
|
-
|
|
46
|
-
### Patch Changes
|
|
47
|
-
|
|
48
|
-
- Updated dependencies [[`3c65a8bf`](https://github.com/hashicorp/react-components/commit/3c65a8bf3a6699fe9fca4422f6ff04a26ffeefd4)]:
|
|
49
|
-
- @hashicorp/react-form-fields@0.1.1
|
|
50
|
-
|
|
51
|
-
## 0.7.1
|
|
52
|
-
|
|
53
|
-
### Patch Changes
|
|
54
|
-
|
|
55
|
-
- [#868](https://github.com/hashicorp/react-components/pull/868) [`10a7dc7f`](https://github.com/hashicorp/react-components/commit/10a7dc7f92b55533a8a0c0c0216999695b165913) Thanks [@dstaley](https://github.com/dstaley)! - - `MarketoForm` will now treat skipped records as errors, and correctly invoke any `onSubmitError` handlers.
|
|
56
|
-
- Added a new `onSubmitStart` handler that's called as soon as the submission process begins.
|
|
57
|
-
|
|
58
|
-
## 0.7.0
|
|
59
|
-
|
|
60
|
-
### Minor Changes
|
|
61
|
-
|
|
62
|
-
- [#816](https://github.com/hashicorp/react-components/pull/816) [`e6c258c8`](https://github.com/hashicorp/react-components/commit/e6c258c860adb36363827995cb89e54ea2b5f21e) Thanks [@dstaley](https://github.com/dstaley)! - Use @hashicorp/react-form-fields for base field inputs
|
|
63
|
-
|
|
64
|
-
## 0.6.0
|
|
65
|
-
|
|
66
|
-
### Minor Changes
|
|
67
|
-
|
|
68
|
-
- [#832](https://github.com/hashicorp/react-components/pull/832) [`50fbf782`](https://github.com/hashicorp/react-components/commit/50fbf782f2e0c7640f2d26e4f07f0fe477bad245) Thanks [@dstaley](https://github.com/dstaley)! - Call segment.identify on form submissions
|
|
69
|
-
|
|
70
|
-
## 0.5.0
|
|
71
|
-
|
|
72
|
-
### Minor Changes
|
|
73
|
-
|
|
74
|
-
- [#828](https://github.com/hashicorp/react-components/pull/828) [`bafded5c`](https://github.com/hashicorp/react-components/commit/bafded5c510546f1ea236e3455d7af8fb5060115) Thanks [@nandereck](https://github.com/nandereck)! - Allow for hidden autofill values to be passed through
|
|
75
|
-
|
|
76
|
-
## 0.4.0
|
|
77
|
-
|
|
78
|
-
### Minor Changes
|
|
79
|
-
|
|
80
|
-
- [#815](https://github.com/hashicorp/react-components/pull/815) [`5850beac`](https://github.com/hashicorp/react-components/commit/5850beac3128d64d2b9853f023640d33461672e2) Thanks [@nandereck](https://github.com/nandereck)! - Surface field ID on the FieldWrapper component
|
|
81
|
-
|
|
82
|
-
## 0.3.2
|
|
83
|
-
|
|
84
|
-
### Patch Changes
|
|
85
|
-
|
|
86
|
-
- [#791](https://github.com/hashicorp/react-components/pull/791) [`6bd4f1cb`](https://github.com/hashicorp/react-components/commit/6bd4f1cbf150b2f6238500004e00bd116c25a40a) Thanks [@dstaley](https://github.com/dstaley)! - Export Field component for external usage
|
|
87
|
-
|
|
88
|
-
## 0.3.1
|
|
89
|
-
|
|
90
|
-
### Patch Changes
|
|
91
|
-
|
|
92
|
-
- [#802](https://github.com/hashicorp/react-components/pull/802) [`67020b77`](https://github.com/hashicorp/react-components/commit/67020b77bccd38298078d3b5e1fa8757a81e09d8) Thanks [@dstaley](https://github.com/dstaley)! - Throw error if form query parameter is missing
|
|
93
|
-
|
|
94
|
-
## 0.3.0
|
|
95
|
-
|
|
96
|
-
### Minor Changes
|
|
97
|
-
|
|
98
|
-
- [`1125f588`](https://github.com/hashicorp/react-components/commit/1125f588137049b7c91b018342cc199da88d1e23) Thanks [@dstaley](https://github.com/dstaley)! - Report skipped records as errors
|
|
99
|
-
|
|
100
|
-
## 0.2.0
|
|
101
|
-
|
|
102
|
-
### Minor Changes
|
|
103
|
-
|
|
104
|
-
- [#755](https://github.com/hashicorp/react-components/pull/755) [`e803cc00`](https://github.com/hashicorp/react-components/commit/e803cc00d473a6570328473dfb760c5b52a8b3b2) Thanks [@dstaley](https://github.com/dstaley)! - Update react-hook-form
|
|
105
|
-
|
|
106
|
-
## 0.1.2
|
|
107
|
-
|
|
108
|
-
### Patch Changes
|
|
109
|
-
|
|
110
|
-
- [#745](https://github.com/hashicorp/react-components/pull/745) [`e8424612`](https://github.com/hashicorp/react-components/commit/e842461209fcebc5a940128dad1f0acaf8183780) Thanks [@dstaley](https://github.com/dstaley)! - Keep dirty values when resetting form
|
|
111
|
-
|
|
112
|
-
## 0.1.1
|
|
113
|
-
|
|
114
|
-
### Patch Changes
|
|
115
|
-
|
|
116
|
-
- [#743](https://github.com/hashicorp/react-components/pull/743) [`cbbd5082`](https://github.com/hashicorp/react-components/commit/cbbd508249da7b7bf737ccafc9cfe679686b9c18) Thanks [@dstaley](https://github.com/dstaley)! - Correctly keep modified values when recalculating initial state
|
|
117
|
-
|
|
118
|
-
## 0.1.0
|
|
119
|
-
|
|
120
|
-
### Minor Changes
|
|
121
|
-
|
|
122
|
-
- [#630](https://github.com/hashicorp/react-components/pull/630) [`fdccbcc9`](https://github.com/hashicorp/react-components/commit/fdccbcc99ed85aafbdc6af4442f482d6ce5820af) Thanks [@dstaley](https://github.com/dstaley)! - Initial release
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# @hashicorp/react-marketo-form
|