@hashicorp/react-components 0.0.0-nightly.b46420c → 0.0.0-nightly.b5f9cca
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 +5 -4
- package/src/components/actions/index.tsx +5 -5
- package/src/components/call-to-action/index.tsx +7 -7
- package/src/components/card/index.test.tsx +1 -1
- package/src/components/card/newsroom-card/index.test.tsx +1 -1
- package/src/components/card/partner-card/index.tsx +3 -3
- package/src/components/card/person-card/index.tsx +1 -1
- package/src/components/card/primitives.tsx +16 -15
- package/src/components/card/resource-card/index.test.tsx +1 -1
- package/src/components/card/resource-card/index.tsx +3 -0
- package/src/components/card/types.ts +2 -2
- package/src/components/card/unified-card/index.spec.tsx +40 -0
- package/src/components/card/unified-card/index.tsx +5 -11
- package/src/components/marketo-form/contexts/FormMetadata.ts +2 -0
- package/src/components/marketo-form/form/index.tsx +4 -2
- package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/email-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +2 -0
- package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +1 -0
- package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/select-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/text-field/index.tsx +1 -1
- package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +1 -1
- package/src/components/marketo-form/types.ts +10 -11
- package/src/components/nav-panel/components/link-list/index.tsx +25 -8
- package/src/components/nav-panel/components/panel/column/index.tsx +17 -2
- package/src/components/nav-panel/components/panel/column/style.module.css +12 -2
- package/src/components/nav-panel/components/panel/root/index.tsx +13 -2
- package/src/components/nav-panel/components/panel/root/style.module.css +19 -4
- package/src/components/nav-panel/components/promo/index.tsx +15 -8
- package/src/components/nav-panel/components/promo/style.module.css +28 -6
- package/src/components/nav-panel/product-panel/index.tsx +104 -27
- package/src/components/nav-panel/product-panel/style.module.css +230 -15
- package/src/components/nav-panel/standard-panel/index.tsx +3 -0
- package/src/components/nav-panel/standard-panel/style.module.css +1 -1
- package/src/components/next-steps/index.tsx +3 -2
- package/src/components/product-badge/index.tsx +1 -1
- package/src/components/subnav/index.tsx +14 -4
- package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +8 -12
- package/src/components/subnav/partials/CtaLinks/index.tsx +9 -8
- package/src/components/subnav/partials/CtaLinks/style.module.css +4 -4
- package/src/components/subnav/partials/DropdownTrigger/index.tsx +2 -2
- package/src/components/subnav/partials/DropdownTrigger/style.module.css +7 -4
- package/src/components/subnav/partials/MenuItemsDefault/index.tsx +29 -8
- package/src/components/subnav/partials/MenuItemsDefault/style.module.css +37 -24
- package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +18 -4
- package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +22 -16
- package/src/components/subnav/partials/TitleLink/index.tsx +5 -3
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +2 -1
- package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +2 -1
- package/src/components/subnav/partials/TitleLink/style.module.css +1 -1
- package/src/components/subnav/partials/nav-item-text/style.module.css +2 -4
- package/src/components/subnav/style.module.css +4 -6
- package/src/lib/parse-url/index.test.ts +40 -1
- package/src/lib/parse-url/index.ts +78 -9
- package/src/lib/v/index.ts +4 -5
- 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/subnav/theme.module.css +0 -50
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hashicorp/react-components",
|
|
3
|
-
"version": "0.0.0-nightly.
|
|
3
|
+
"version": "0.0.0-nightly.b5f9cca",
|
|
4
4
|
"main": "src/index.ts",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"lint": "next-hashicorp lint",
|
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
"test:watch": "vitest watch"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@hashicorp/flight-icons": "^
|
|
11
|
+
"@hashicorp/flight-icons": "^3.7.0",
|
|
12
12
|
"@hashicorp/platform-product-meta": "^0.1.1",
|
|
13
13
|
"@hashicorp/platform-util": "^0.2.0",
|
|
14
|
-
"@hashicorp/react-
|
|
14
|
+
"@hashicorp/react-hds": "*",
|
|
15
|
+
"@hashicorp/react-mds": "*",
|
|
15
16
|
"@hashicorp/web-mktg-logos": "*",
|
|
16
17
|
"@radix-ui/react-navigation-menu": "^1.2.0",
|
|
17
18
|
"@radix-ui/react-visually-hidden": "^1.1.0",
|
|
@@ -24,7 +25,7 @@
|
|
|
24
25
|
"react-hook-form": "^7.43.5"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
|
-
"@hashicorp/platform-cli": "^2.
|
|
28
|
+
"@hashicorp/platform-cli": "^2.8.0",
|
|
28
29
|
"@hashicorp/platform-types": "^0.4.0",
|
|
29
30
|
"@testing-library/jest-dom": "^6.4.2",
|
|
30
31
|
"@vitejs/plugin-react": "^4.2.1",
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import classNames from 'classnames'
|
|
7
|
-
import
|
|
8
|
-
import
|
|
7
|
+
import { HDSPlusButton } from '@hashicorp/react-mds/src/hds-plus/button'
|
|
8
|
+
import { HDSPlusStandaloneLink } from '@hashicorp/react-mds/src/hds-plus/standalone-link'
|
|
9
9
|
import { IconArrowRight16 } from '@hashicorp/flight-icons/svg-react/arrow-right-16'
|
|
10
10
|
import { IconArrowRight24 } from '@hashicorp/flight-icons/svg-react/arrow-right-24'
|
|
11
11
|
import type { ActionsProps } from './types'
|
|
@@ -49,7 +49,7 @@ export default function Actions({
|
|
|
49
49
|
// have the `primary` and `secondary` variations respectively.
|
|
50
50
|
|
|
51
51
|
const standaloneLinkVariant: ComponentProps<
|
|
52
|
-
typeof
|
|
52
|
+
typeof HDSPlusStandaloneLink
|
|
53
53
|
>['color'] =
|
|
54
54
|
index === 0
|
|
55
55
|
? 'primary'
|
|
@@ -60,7 +60,7 @@ export default function Actions({
|
|
|
60
60
|
|
|
61
61
|
if (isStandaloneLink) {
|
|
62
62
|
return (
|
|
63
|
-
<
|
|
63
|
+
<HDSPlusStandaloneLink
|
|
64
64
|
// eslint-disable-next-line react/no-array-index-key
|
|
65
65
|
key={index}
|
|
66
66
|
text={cta.title}
|
|
@@ -89,7 +89,7 @@ export default function Actions({
|
|
|
89
89
|
)
|
|
90
90
|
} else {
|
|
91
91
|
return (
|
|
92
|
-
<
|
|
92
|
+
<HDSPlusButton
|
|
93
93
|
// eslint-disable-next-line react/no-array-index-key
|
|
94
94
|
key={index}
|
|
95
95
|
text={cta.title}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { ComponentProps, ReactNode } from 'react'
|
|
7
|
-
import
|
|
8
|
-
import ButtonSet from '@hashicorp/react-
|
|
9
|
-
import
|
|
7
|
+
import { HDSPlusButton } from '@hashicorp/react-mds/src/hds-plus/button'
|
|
8
|
+
import ButtonSet from '@hashicorp/react-hds/src/components/button-set'
|
|
9
|
+
import { HDSPlusStandaloneLink } from '@hashicorp/react-mds/src/hds-plus/standalone-link'
|
|
10
10
|
import { IconArrowRight24 } from '@hashicorp/flight-icons/svg-react/arrow-right-24'
|
|
11
11
|
import { IconExternalLink24 } from '@hashicorp/flight-icons/svg-react/external-link-24'
|
|
12
12
|
import { IconDownload24 } from '@hashicorp/flight-icons/svg-react/download-24'
|
|
@@ -119,7 +119,7 @@ function CallToAction({
|
|
|
119
119
|
{links && (
|
|
120
120
|
<ButtonSet className={s.links} data-testid="links">
|
|
121
121
|
{links.map((link, stableIdx) => {
|
|
122
|
-
let color: ComponentProps<typeof
|
|
122
|
+
let color: ComponentProps<typeof HDSPlusButton>['color'] =
|
|
123
123
|
variant === 'links'
|
|
124
124
|
? 'tertiary'
|
|
125
125
|
: stableIdx === 0
|
|
@@ -128,7 +128,7 @@ function CallToAction({
|
|
|
128
128
|
|
|
129
129
|
if (color === 'tertiary') {
|
|
130
130
|
return (
|
|
131
|
-
<
|
|
131
|
+
<HDSPlusStandaloneLink
|
|
132
132
|
key={stableIdx}
|
|
133
133
|
color="secondary"
|
|
134
134
|
text={link.text}
|
|
@@ -158,7 +158,7 @@ function CallToAction({
|
|
|
158
158
|
color = 'secondary'
|
|
159
159
|
} else if (theme === 'brand' && color === 'secondary') {
|
|
160
160
|
return (
|
|
161
|
-
<
|
|
161
|
+
<HDSPlusStandaloneLink
|
|
162
162
|
key={stableIdx}
|
|
163
163
|
color="secondary-inverted"
|
|
164
164
|
text={link.text}
|
|
@@ -177,7 +177,7 @@ function CallToAction({
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
return (
|
|
180
|
-
<
|
|
180
|
+
<HDSPlusButton
|
|
181
181
|
// eslint-disable-next-line react/no-array-index-key
|
|
182
182
|
key={stableIdx}
|
|
183
183
|
// className={s.button}
|
|
@@ -56,7 +56,7 @@ describe('<Card />', () => {
|
|
|
56
56
|
const metaElement = screen.getByTestId('wpl-card-meta')
|
|
57
57
|
|
|
58
58
|
cardMeta.forEach((item) => {
|
|
59
|
-
expect(metaElement).
|
|
59
|
+
expect(metaElement).toHaveTextContent(item)
|
|
60
60
|
})
|
|
61
61
|
expect(metaElement).toContainElement(screen.getByText('|'))
|
|
62
62
|
})
|
|
@@ -26,7 +26,7 @@ describe('<NewsroomCard />', () => {
|
|
|
26
26
|
const metaElement = screen.getByTestId('wpl-card-meta')
|
|
27
27
|
|
|
28
28
|
expectedMeta.forEach((item) => {
|
|
29
|
-
expect(metaElement).
|
|
29
|
+
expect(metaElement).toHaveTextContent(item)
|
|
30
30
|
})
|
|
31
31
|
|
|
32
32
|
expect(metaElement).toContainElement(screen.queryByText('|'))
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import Image, { type ImageProps } from 'next/image'
|
|
7
|
-
import Badge from '@hashicorp/react-
|
|
8
|
-
import FlightIcon from '@hashicorp/react-
|
|
9
|
-
import { TextPlus } from '@hashicorp/react-
|
|
7
|
+
import Badge from '@hashicorp/react-hds/src/components/badge'
|
|
8
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
9
|
+
import { TextPlus } from '@hashicorp/react-hds/src/components/text'
|
|
10
10
|
import * as CardPrimitives from '../primitives'
|
|
11
11
|
import type { CardProps } from '../types'
|
|
12
12
|
import s from './style.module.css'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { memo, type ReactNode } from 'react'
|
|
7
|
-
import { TextPlus } from '@hashicorp/react-
|
|
7
|
+
import { TextPlus } from '@hashicorp/react-hds/src/components/text'
|
|
8
8
|
import { IconGithub16 } from '@hashicorp/flight-icons/svg-react/github-16'
|
|
9
9
|
import { IconTwitter16 } from '@hashicorp/flight-icons/svg-react/twitter-16'
|
|
10
10
|
import { IconLinkedin16 } from '@hashicorp/flight-icons/svg-react/linkedin-16'
|
|
@@ -7,8 +7,8 @@ import * as React from 'react'
|
|
|
7
7
|
import classNames from 'classnames'
|
|
8
8
|
import Image from 'next/image'
|
|
9
9
|
import Link from 'next/link'
|
|
10
|
-
import HDSCard from '@hashicorp/react-
|
|
11
|
-
import { TextPlus } from '@hashicorp/react-
|
|
10
|
+
import HDSCard from '@hashicorp/react-hds/src/components/card'
|
|
11
|
+
import { TextPlus } from '@hashicorp/react-hds/src/components/text'
|
|
12
12
|
import { IconArrowRight24 } from '@hashicorp/flight-icons/svg-react/arrow-right-24'
|
|
13
13
|
import ProductBadge from '../product-badge'
|
|
14
14
|
import type {
|
|
@@ -33,6 +33,7 @@ const Card = React.forwardRef<HTMLAnchorElement, CardPrimitiveProps>(
|
|
|
33
33
|
hasBorder = true,
|
|
34
34
|
children,
|
|
35
35
|
className,
|
|
36
|
+
'aria-label': ariaLabel,
|
|
36
37
|
} = props
|
|
37
38
|
|
|
38
39
|
const linkProps = isExternal
|
|
@@ -58,7 +59,7 @@ const Card = React.forwardRef<HTMLAnchorElement, CardPrimitiveProps>(
|
|
|
58
59
|
href={link}
|
|
59
60
|
ref={ref}
|
|
60
61
|
className={s.link}
|
|
61
|
-
aria-label={heading}
|
|
62
|
+
aria-label={ariaLabel ?? heading}
|
|
62
63
|
onClickCapture={clickHandler}
|
|
63
64
|
{...linkProps}
|
|
64
65
|
/>
|
|
@@ -100,23 +101,23 @@ function LogoThumbnail({ src, alt }: ThumbnailProps) {
|
|
|
100
101
|
|
|
101
102
|
function Meta({ items }: MetaProps) {
|
|
102
103
|
return (
|
|
103
|
-
<
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
<div className={s.meta} data-testid="wpl-card-meta">
|
|
105
|
+
<TextPlus.Label>
|
|
106
|
+
{items.map((item, stableIdx) => {
|
|
107
|
+
const isLastItem = stableIdx === items.length - 1
|
|
108
|
+
return (
|
|
109
|
+
<>
|
|
109
110
|
{item}
|
|
110
|
-
{
|
|
111
|
+
{!isLastItem ? (
|
|
111
112
|
<span className={s.metaSeparator} aria-hidden={true}>
|
|
112
113
|
|
|
|
113
114
|
</span>
|
|
114
115
|
) : null}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
</
|
|
116
|
+
</>
|
|
117
|
+
)
|
|
118
|
+
})}
|
|
119
|
+
</TextPlus.Label>
|
|
120
|
+
</div>
|
|
120
121
|
)
|
|
121
122
|
}
|
|
122
123
|
|
|
@@ -26,7 +26,7 @@ describe('<ResourceCard />', () => {
|
|
|
26
26
|
const metaElement = screen.getByTestId('wpl-card-meta')
|
|
27
27
|
|
|
28
28
|
expectedMeta.forEach((item) => {
|
|
29
|
-
expect(metaElement).
|
|
29
|
+
expect(metaElement).toHaveTextContent(item)
|
|
30
30
|
})
|
|
31
31
|
|
|
32
32
|
expect(metaElement).toContainElement(screen.getByText('|'))
|
|
@@ -13,6 +13,7 @@ export interface ResourceCardProps {
|
|
|
13
13
|
link: string
|
|
14
14
|
productBadges?: CardProps['productBadges']
|
|
15
15
|
thumbnail: ThumbnailProps
|
|
16
|
+
isExternal?: CardProps['isExternal']
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export function ResourceCard({
|
|
@@ -22,6 +23,7 @@ export function ResourceCard({
|
|
|
22
23
|
link,
|
|
23
24
|
productBadges,
|
|
24
25
|
thumbnail,
|
|
26
|
+
isExternal,
|
|
25
27
|
}: ResourceCardProps) {
|
|
26
28
|
const meta: string[] = date ? [date, category] : [category]
|
|
27
29
|
|
|
@@ -32,6 +34,7 @@ export function ResourceCard({
|
|
|
32
34
|
meta={meta}
|
|
33
35
|
productBadges={productBadges}
|
|
34
36
|
thumbnail={thumbnail}
|
|
37
|
+
isExternal={isExternal}
|
|
35
38
|
/>
|
|
36
39
|
)
|
|
37
40
|
}
|
|
@@ -10,14 +10,14 @@ import type { PersonCardProps } from './person-card'
|
|
|
10
10
|
import type { ResourceCardProps } from './resource-card'
|
|
11
11
|
import type { UnifiedCardProps } from './unified-card'
|
|
12
12
|
|
|
13
|
-
export interface BaseCardProps
|
|
13
|
+
export interface BaseCardProps
|
|
14
|
+
extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
14
15
|
withArrow?: boolean
|
|
15
16
|
heading: string
|
|
16
17
|
link: string
|
|
17
18
|
clickHandler?: () => void
|
|
18
19
|
isExternal?: boolean
|
|
19
20
|
hasBorder?: boolean
|
|
20
|
-
className?: string
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export interface CardPrimitiveProps extends BaseCardProps {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) HashiCorp, Inc.
|
|
3
|
+
* SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { render, screen } from '@testing-library/react'
|
|
7
|
+
import { UnifiedCard, UnifiedCardProps } from '.'
|
|
8
|
+
|
|
9
|
+
const defaultProps: UnifiedCardProps = {
|
|
10
|
+
link: 'https://hashicorp.com',
|
|
11
|
+
heading: 'Example heading',
|
|
12
|
+
thumbnail: {
|
|
13
|
+
src: 'https://www.datocms-assets.com/19447/1648680074-screenshot-2022-03-31-at-00-40-47.png',
|
|
14
|
+
alt: 'HashiConf Europe 2022 Recap',
|
|
15
|
+
},
|
|
16
|
+
} as const
|
|
17
|
+
|
|
18
|
+
describe(`<UnifiedCard />`, () => {
|
|
19
|
+
it('should render the provided meta with a separator if n > 1', () => {
|
|
20
|
+
const expectedMeta = ['Category', 'Hello']
|
|
21
|
+
render(<UnifiedCard {...defaultProps} meta={expectedMeta} />)
|
|
22
|
+
|
|
23
|
+
const metaElement = screen.getByTestId('wpl-card-meta')
|
|
24
|
+
|
|
25
|
+
expectedMeta.forEach((item) => {
|
|
26
|
+
expect(metaElement).toHaveTextContent(item)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
expect(metaElement).toContainElement(screen.getByText('|'))
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('it should not render a separator if n === 1', () => {
|
|
33
|
+
render(<UnifiedCard {...defaultProps} meta={['Category']} />)
|
|
34
|
+
const metaElement = screen.getByTestId('wpl-card-meta')
|
|
35
|
+
|
|
36
|
+
expect(metaElement).toContainElement(screen.getByText('Category'))
|
|
37
|
+
|
|
38
|
+
expect(metaElement).not.toContainElement(screen.queryByText('|'))
|
|
39
|
+
})
|
|
40
|
+
})
|
|
@@ -4,20 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { ReactNode } from 'react'
|
|
7
|
-
import Badge from '@hashicorp/react-
|
|
7
|
+
import Badge from '@hashicorp/react-hds/src/components/badge'
|
|
8
8
|
import * as CardPrimitives from '../primitives'
|
|
9
|
-
import type { CardProps
|
|
9
|
+
import type { CardProps } from '../types'
|
|
10
10
|
|
|
11
|
-
export interface UnifiedCardProps {
|
|
12
|
-
heading: string
|
|
13
|
-
meta?: string[]
|
|
14
|
-
link: string
|
|
15
|
-
productBadges?: CardProps['productBadges']
|
|
11
|
+
export interface UnifiedCardProps extends CardProps {
|
|
16
12
|
badges?: (string | [ReactNode, string])[]
|
|
17
|
-
thumbnail?: ThumbnailProps
|
|
18
|
-
withArrow?: boolean
|
|
19
|
-
isExternal?: boolean
|
|
20
|
-
className?: string
|
|
21
13
|
}
|
|
22
14
|
|
|
23
15
|
export function UnifiedCard({
|
|
@@ -30,6 +22,7 @@ export function UnifiedCard({
|
|
|
30
22
|
withArrow = false,
|
|
31
23
|
isExternal = false,
|
|
32
24
|
className,
|
|
25
|
+
'aria-label': ariaLabel,
|
|
33
26
|
}: UnifiedCardProps) {
|
|
34
27
|
return (
|
|
35
28
|
<CardPrimitives.Card
|
|
@@ -38,6 +31,7 @@ export function UnifiedCard({
|
|
|
38
31
|
withArrow={withArrow}
|
|
39
32
|
isExternal={isExternal}
|
|
40
33
|
className={className}
|
|
34
|
+
aria-label={ariaLabel ?? heading}
|
|
41
35
|
>
|
|
42
36
|
{thumbnail ? <CardPrimitives.Thumbnail {...thumbnail} /> : null}
|
|
43
37
|
<CardPrimitives.Content>
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
'use client'
|
|
7
|
+
|
|
6
8
|
import { useEffect, useMemo, useRef } from 'react'
|
|
7
9
|
import { useForm, FormProvider } from 'react-hook-form'
|
|
8
|
-
import
|
|
10
|
+
import { HDSPlusButton } from '@hashicorp/react-mds/src/hds-plus/button'
|
|
9
11
|
import VisibilityRule from '../partials/visibility-rule'
|
|
10
12
|
import NameField from '../partials/fields/name-field'
|
|
11
13
|
import { FormMetadataContext } from '../contexts/FormMetadata'
|
|
@@ -345,7 +347,7 @@ const Form = ({
|
|
|
345
347
|
/>
|
|
346
348
|
)
|
|
347
349
|
})}
|
|
348
|
-
<
|
|
350
|
+
<HDSPlusButton
|
|
349
351
|
type="submit"
|
|
350
352
|
size="large"
|
|
351
353
|
disabled={
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { useFormContext } from 'react-hook-form'
|
|
7
7
|
// import CheckboxInput from '@hashicorp/react-form-fields/checkbox'
|
|
8
|
-
import Checkbox from '@hashicorp/react-
|
|
8
|
+
import Checkbox from '@hashicorp/react-hds/src/components/form/checkbox'
|
|
9
9
|
import FieldWrapper from '../../field-wrapper'
|
|
10
10
|
import { formattedLabel, useErrorMessage } from '../../../utils'
|
|
11
11
|
import type { MarketoFormCheckboxField } from '../../../types'
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { useFormContext } from 'react-hook-form'
|
|
7
7
|
// import TextInput from '@hashicorp/react-form-fields/text'
|
|
8
|
-
import TextInput from '@hashicorp/react-
|
|
8
|
+
import TextInput from '@hashicorp/react-hds/src/components/form/text-input'
|
|
9
9
|
import FieldWrapper from '../../field-wrapper'
|
|
10
10
|
import { formattedLabel, useErrorMessage } from '../../../utils'
|
|
11
11
|
import type { MarketoFormEmailField } from '../../../types'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useFormContext } from 'react-hook-form'
|
|
2
2
|
import RadioCard, {
|
|
3
3
|
RadioCardGroup,
|
|
4
|
-
} from '@hashicorp/react-
|
|
4
|
+
} from '@hashicorp/react-hds/src/components/form/radio-card'
|
|
5
5
|
import FieldWrapper from '../../field-wrapper'
|
|
6
6
|
import type { MarketoFormRadioButtonsField } from '../../../types'
|
|
7
7
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { useFormContext } from 'react-hook-form'
|
|
7
|
-
import Select from '@hashicorp/react-
|
|
7
|
+
import Select from '@hashicorp/react-hds/src/components/form/select'
|
|
8
8
|
import FieldWrapper from '../../field-wrapper'
|
|
9
9
|
import { formattedLabel, useErrorMessage } from '../../../utils'
|
|
10
10
|
import type { MarketoFormSelectField } from '../../../types'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { useFormContext } from 'react-hook-form'
|
|
7
|
-
import TextInput from '@hashicorp/react-
|
|
7
|
+
import TextInput from '@hashicorp/react-hds/src/components/form/text-input'
|
|
8
8
|
import FieldWrapper from '../../field-wrapper'
|
|
9
9
|
import { formattedLabel, useErrorMessage } from '../../../utils'
|
|
10
10
|
import type { MarketoFormTelephoneField } from '../../../types'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { useFormContext } from 'react-hook-form'
|
|
7
|
-
import TextInput from '@hashicorp/react-
|
|
7
|
+
import TextInput from '@hashicorp/react-hds/src/components/form/text-input'
|
|
8
8
|
import FieldWrapper from '../../field-wrapper'
|
|
9
9
|
import { formattedLabel, useErrorMessage } from '../../../utils'
|
|
10
10
|
import type { MarketoFormTextField } from '../../../types'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { useFormContext } from 'react-hook-form'
|
|
7
|
-
import Textarea from '@hashicorp/react-
|
|
7
|
+
import Textarea from '@hashicorp/react-hds/src/components/form/textarea'
|
|
8
8
|
import FieldWrapper from '../../field-wrapper'
|
|
9
9
|
import { formattedLabel, useErrorMessage } from '../../../utils'
|
|
10
10
|
import type { MarketoFormTextAreaField } from '../../../types'
|
|
@@ -15,6 +15,7 @@ export type MarketoFormDatatype =
|
|
|
15
15
|
| 'hidden'
|
|
16
16
|
| 'htmltext'
|
|
17
17
|
| 'radioButtons'
|
|
18
|
+
| 'fieldset'
|
|
18
19
|
|
|
19
20
|
export interface Autofill {
|
|
20
21
|
value: string
|
|
@@ -41,10 +42,15 @@ export interface MarketoBaseFormField {
|
|
|
41
42
|
columnNumber: number
|
|
42
43
|
defaultValue?: string
|
|
43
44
|
label?: string
|
|
44
|
-
required
|
|
45
|
+
required?: boolean
|
|
45
46
|
validationMessage?: string
|
|
46
47
|
autoFill?: Autofill
|
|
47
48
|
visibilityRules?: VisibilityRules
|
|
49
|
+
/**
|
|
50
|
+
* Properties that are not part of the Marketo API response but are
|
|
51
|
+
* attached to the field at runtime for additional functionality
|
|
52
|
+
*/
|
|
53
|
+
runtimeAttributes?: Record<string, unknown>
|
|
48
54
|
}
|
|
49
55
|
|
|
50
56
|
export interface MarketoFormTextField extends MarketoBaseFormField {
|
|
@@ -106,12 +112,9 @@ export interface MarketoFormHiddenField extends MarketoBaseFormField {
|
|
|
106
112
|
dataType: 'hidden'
|
|
107
113
|
}
|
|
108
114
|
|
|
109
|
-
export interface MarketoFormHtmltextField {
|
|
110
|
-
id: string
|
|
111
|
-
labelWidth: number
|
|
115
|
+
export interface MarketoFormHtmltextField extends MarketoBaseFormField {
|
|
112
116
|
dataType: 'htmltext'
|
|
113
|
-
|
|
114
|
-
columnNumber: number
|
|
117
|
+
labelWidth: number
|
|
115
118
|
visibilityRules?: VisibilityRules
|
|
116
119
|
text: string
|
|
117
120
|
}
|
|
@@ -125,12 +128,8 @@ export interface MarketoFormRadioButtonsField extends MarketoBaseFormField {
|
|
|
125
128
|
}
|
|
126
129
|
}
|
|
127
130
|
|
|
128
|
-
export interface MarketoFormFieldset {
|
|
129
|
-
id: string
|
|
130
|
-
label?: string
|
|
131
|
+
export interface MarketoFormFieldset extends MarketoBaseFormField {
|
|
131
132
|
dataType: 'fieldset'
|
|
132
|
-
rowNumber: number
|
|
133
|
-
columnNumber: number
|
|
134
133
|
visibilityRules?: VisibilityRules
|
|
135
134
|
fields: Array<string>
|
|
136
135
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import Link from 'next/link'
|
|
2
2
|
import { parseUrl } from '../../../../lib/parse-url'
|
|
3
|
-
import {
|
|
4
|
-
import FlightIcon from '@hashicorp/react-
|
|
3
|
+
import { vercelSplit } from '../../../../lib/v'
|
|
4
|
+
import FlightIcon from '@hashicorp/react-hds/src/components/flight-icon'
|
|
5
5
|
import * as NavigationMenu from '@radix-ui/react-navigation-menu'
|
|
6
6
|
import s from './style.module.css'
|
|
7
7
|
|
|
8
8
|
export interface LinkListProps {
|
|
9
|
+
locale?: string
|
|
9
10
|
links: {
|
|
10
11
|
title: string
|
|
11
12
|
url: string
|
|
@@ -37,35 +38,51 @@ const GRADIENT_VALUE_MAP = new Map([
|
|
|
37
38
|
],
|
|
38
39
|
])
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
function getLocalizedHref(url: string, locale?: string): string {
|
|
42
|
+
const parsedHref = parseUrl(url).href
|
|
43
|
+
|
|
44
|
+
if (parsedHref.startsWith('/') && locale) {
|
|
45
|
+
return `/${locale}${parsedHref}`
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return parsedHref
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default function LinkList({
|
|
52
|
+
locale,
|
|
53
|
+
links,
|
|
54
|
+
linkClickHandler,
|
|
55
|
+
}: LinkListProps) {
|
|
41
56
|
return (
|
|
42
57
|
<ul className={s.linkList}>
|
|
43
58
|
{links.map((link) => {
|
|
44
59
|
let style
|
|
45
60
|
link.iconGradient
|
|
46
61
|
? (style = {
|
|
47
|
-
'--iconGradient': GRADIENT_VALUE_MAP.get(
|
|
48
|
-
|
|
62
|
+
'--iconGradient': GRADIENT_VALUE_MAP.get(
|
|
63
|
+
vercelSplit(link.iconGradient)
|
|
64
|
+
)?.iconGradient,
|
|
49
65
|
} as React.CSSProperties)
|
|
50
66
|
: (style = null)
|
|
51
67
|
return (
|
|
52
68
|
<li key={link.title}>
|
|
53
69
|
<NavigationMenu.Link asChild>
|
|
54
70
|
<Link
|
|
71
|
+
hrefLang={locale ? locale : undefined}
|
|
55
72
|
className={s.link}
|
|
56
|
-
href={
|
|
73
|
+
href={getLocalizedHref(link.url, locale)}
|
|
57
74
|
onClickCapture={() => {
|
|
58
75
|
linkClickHandler && linkClickHandler(link.title, link.url)
|
|
59
76
|
}}
|
|
60
77
|
>
|
|
61
78
|
{link.iconGradient && link.icon ? (
|
|
62
79
|
<div className={s.iconBackground} style={style}>
|
|
63
|
-
<FlightIcon name={
|
|
80
|
+
<FlightIcon name={vercelSplit(link.icon)} />
|
|
64
81
|
</div>
|
|
65
82
|
) : (
|
|
66
83
|
link.icon && (
|
|
67
84
|
<FlightIcon
|
|
68
|
-
name={
|
|
85
|
+
name={vercelSplit(link.icon)}
|
|
69
86
|
color="var(--token-color-foreground-faint)"
|
|
70
87
|
/>
|
|
71
88
|
)
|
|
@@ -1,9 +1,24 @@
|
|
|
1
|
+
import classNames from 'classnames'
|
|
1
2
|
import s from './style.module.css'
|
|
2
3
|
|
|
3
4
|
export interface NavColumnProps {
|
|
5
|
+
className?: string
|
|
4
6
|
children: React.ReactNode
|
|
7
|
+
hasSidePanel?: boolean
|
|
5
8
|
}
|
|
6
9
|
|
|
7
|
-
export default function Column({
|
|
8
|
-
|
|
10
|
+
export default function Column({
|
|
11
|
+
className,
|
|
12
|
+
children,
|
|
13
|
+
hasSidePanel,
|
|
14
|
+
}: NavColumnProps) {
|
|
15
|
+
return (
|
|
16
|
+
<div
|
|
17
|
+
className={classNames(s.column, className, {
|
|
18
|
+
[s.hasSide]: hasSidePanel,
|
|
19
|
+
})}
|
|
20
|
+
>
|
|
21
|
+
{children}
|
|
22
|
+
</div>
|
|
23
|
+
)
|
|
9
24
|
}
|