@bloom-housing/ui-components 9.0.0-alpha.1 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/actions/ExpandableContent.test.js +1 -1
- package/dist/__tests__/actions/ExpandableContent.test.js.map +1 -1
- package/dist/__tests__/page_components/ContentAccordion.test.js +2 -2
- package/dist/__tests__/page_components/ContentAccordion.test.js.map +1 -1
- package/dist/src/actions/Button.d.ts +1 -1
- package/dist/src/actions/Button.js +1 -1
- package/dist/src/actions/Button.js.map +1 -1
- package/dist/src/actions/LinkButton.js +2 -2
- package/dist/src/actions/LinkButton.js.map +1 -1
- package/dist/src/blocks/DashBlock.js +1 -1
- package/dist/src/blocks/DashBlock.js.map +1 -1
- package/dist/src/blocks/ImageCard.js +1 -1
- package/dist/src/blocks/ImageCard.js.map +1 -1
- package/dist/src/blocks/ViewItem.js +2 -2
- package/dist/src/blocks/ViewItem.js.map +1 -1
- package/dist/src/forms/Dropzone.js +1 -1
- package/dist/src/forms/Dropzone.js.map +1 -1
- package/dist/src/forms/Field.js +1 -1
- package/dist/src/forms/Field.js.map +1 -1
- package/dist/src/forms/FieldGroup.js +8 -8
- package/dist/src/forms/FieldGroup.js.map +1 -1
- package/dist/src/forms/HouseholdMemberForm.js +1 -1
- package/dist/src/forms/HouseholdMemberForm.js.map +1 -1
- package/dist/src/forms/MultiSelectField.js +1 -1
- package/dist/src/forms/MultiSelectField.js.map +1 -1
- package/dist/src/forms/PhoneField.js +2 -2
- package/dist/src/forms/PhoneField.js.map +1 -1
- package/dist/src/forms/Select.js +2 -2
- package/dist/src/forms/Select.js.map +1 -1
- package/dist/src/forms/Textarea.js +1 -1
- package/dist/src/forms/Textarea.js.map +1 -1
- package/dist/src/headers/Hero.js +2 -2
- package/dist/src/headers/Hero.js.map +1 -1
- package/dist/src/headers/PageHeader.js +1 -1
- package/dist/src/headers/PageHeader.js.map +1 -1
- package/dist/src/headers/SiteHeader.js +3 -3
- package/dist/src/headers/SiteHeader.js.map +1 -1
- package/dist/src/icons/Icon.js +2 -2
- package/dist/src/icons/Icon.js.map +1 -1
- package/dist/src/notifications/AlertBox.js +1 -1
- package/dist/src/notifications/AlertBox.js.map +1 -1
- package/dist/src/notifications/ErrorMessage.js +1 -1
- package/dist/src/notifications/ErrorMessage.js.map +1 -1
- package/dist/src/overlays/LoadingOverlay.js +1 -1
- package/dist/src/overlays/LoadingOverlay.js.map +1 -1
- package/dist/src/overlays/Modal.d.ts +2 -1
- package/dist/src/overlays/Modal.js +2 -2
- package/dist/src/overlays/Modal.js.map +1 -1
- package/dist/src/overlays/Modal.stories.js +4 -4
- package/dist/src/overlays/Modal.stories.js.map +1 -1
- package/dist/src/page_components/listing/ContentAccordion.js +1 -1
- package/dist/src/page_components/listing/ContentAccordion.js.map +1 -1
- package/dist/src/page_components/listing/ListingCard.js +1 -1
- package/dist/src/page_components/listing/ListingCard.js.map +1 -1
- package/dist/src/page_components/listing/listing_sidebar/GetApplication.js +2 -2
- package/dist/src/page_components/listing/listing_sidebar/GetApplication.js.map +1 -1
- package/dist/src/page_components/sign-in/FormSignIn.js +1 -1
- package/dist/src/page_components/sign-in/FormSignIn.js.map +1 -1
- package/dist/src/page_components/sign-in/FormSignInAddPhone.js +1 -1
- package/dist/src/page_components/sign-in/FormSignInAddPhone.js.map +1 -1
- package/dist/src/page_components/sign-in/FormSignInMFACode.js +1 -1
- package/dist/src/page_components/sign-in/FormSignInMFACode.js.map +1 -1
- package/dist/src/page_components/sign-in/FormSignInMFAType.js +2 -2
- package/dist/src/page_components/sign-in/FormSignInMFAType.js.map +1 -1
- package/dist/src/page_components/sign-in/FormTerms.js +1 -1
- package/dist/src/page_components/sign-in/FormTerms.js.map +1 -1
- package/dist/src/tables/AgPagination.js +4 -4
- package/dist/src/tables/AgPagination.js.map +1 -1
- package/package.json +24 -25
- package/src/actions/Button.tsx +2 -2
- package/src/actions/LinkButton.tsx +2 -2
- package/src/blocks/DashBlock.tsx +1 -1
- package/src/blocks/ImageCard.tsx +1 -1
- package/src/blocks/ViewItem.tsx +2 -2
- package/src/forms/Dropzone.tsx +1 -1
- package/src/forms/Field.tsx +1 -1
- package/src/forms/FieldGroup.tsx +10 -10
- package/src/forms/HouseholdMemberForm.tsx +1 -1
- package/src/forms/MultiSelectField.tsx +1 -1
- package/src/forms/PhoneField.tsx +2 -2
- package/src/forms/Select.tsx +3 -3
- package/src/forms/Textarea.tsx +1 -1
- package/src/global/tokens/sizes.scss +1 -1
- package/src/headers/Hero.tsx +2 -2
- package/src/headers/PageHeader.tsx +1 -1
- package/src/headers/SiteHeader.tsx +3 -3
- package/src/icons/Icon.tsx +2 -2
- package/src/notifications/AlertBox.tsx +1 -1
- package/src/notifications/ErrorMessage.tsx +1 -1
- package/src/overlays/LoadingOverlay.tsx +1 -1
- package/src/overlays/Modal.scss +28 -11
- package/src/overlays/Modal.stories.tsx +4 -4
- package/src/overlays/Modal.tsx +4 -3
- package/src/page_components/listing/ContentAccordion.tsx +1 -1
- package/src/page_components/listing/ListingCard.tsx +1 -1
- package/src/page_components/listing/listing_sidebar/GetApplication.tsx +2 -2
- package/src/page_components/sign-in/FormSignIn.tsx +1 -1
- package/src/page_components/sign-in/FormSignInAddPhone.tsx +1 -1
- package/src/page_components/sign-in/FormSignInMFACode.tsx +1 -1
- package/src/page_components/sign-in/FormSignInMFAType.tsx +2 -2
- package/src/page_components/sign-in/FormTerms.tsx +1 -1
- package/src/tables/AgPagination.tsx +4 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bloom-housing/ui-components",
|
|
3
|
-
"version": "9.0.0
|
|
3
|
+
"version": "9.0.0",
|
|
4
4
|
"author": "Sean Albert <sean.albert@exygy.com>",
|
|
5
5
|
"description": "Shared user interface components for Bloom affordable housing system",
|
|
6
6
|
"homepage": "https://github.com/bloom-housing/ui-components",
|
|
@@ -42,27 +42,29 @@
|
|
|
42
42
|
"@babel/preset-env": "^7.15.4",
|
|
43
43
|
"@commitlint/cli": "^13.1.0",
|
|
44
44
|
"@commitlint/config-conventional": "^13.1.0",
|
|
45
|
-
"@
|
|
46
|
-
"@
|
|
47
|
-
"@storybook
|
|
48
|
-
"@storybook/addon-
|
|
45
|
+
"@emotion/core": "^10.0.35",
|
|
46
|
+
"@emotion/styled": "^10.0.27",
|
|
47
|
+
"@geometricpanda/storybook-addon-badges": "^0.2.1",
|
|
48
|
+
"@storybook/addon-a11y": "^6.3.8",
|
|
49
|
+
"@storybook/addon-actions": "^6.3.8",
|
|
50
|
+
"@storybook/addon-docs": "^6.3.8",
|
|
49
51
|
"@storybook/addon-knobs": "^6.3.1",
|
|
50
52
|
"@storybook/addon-storyshots": "^6.3.8",
|
|
51
53
|
"@storybook/addon-storyshots-puppeteer": "^6.3.8",
|
|
52
|
-
"@storybook/addon-
|
|
53
|
-
"@storybook/
|
|
54
|
-
"@storybook/
|
|
55
|
-
"@storybook/
|
|
56
|
-
"@storybook/
|
|
57
|
-
"@storybook/react": "^6.
|
|
58
|
-
"@storybook/
|
|
59
|
-
"@testing-library/jest-dom": "5.
|
|
60
|
-
"@testing-library/react": "
|
|
54
|
+
"@storybook/addon-viewport": "^6.3.8",
|
|
55
|
+
"@storybook/addons": "^6.3.8",
|
|
56
|
+
"@storybook/api": "^6.3.8",
|
|
57
|
+
"@storybook/components": "^6.3.8",
|
|
58
|
+
"@storybook/core-events": "^6.3.8",
|
|
59
|
+
"@storybook/react": "^6.3.8",
|
|
60
|
+
"@storybook/theming": "^6.3.8",
|
|
61
|
+
"@testing-library/jest-dom": "^5.11.9",
|
|
62
|
+
"@testing-library/react": "^11.2.5",
|
|
61
63
|
"@types/dompurify": "^2.3.3",
|
|
62
64
|
"@types/jest": "^26.0.14",
|
|
63
65
|
"@types/jwt-decode": "^2.2.1",
|
|
64
66
|
"@types/mdx": "^2.0.1",
|
|
65
|
-
"@types/node": "
|
|
67
|
+
"@types/node": "^12.12.67",
|
|
66
68
|
"@types/node-polyglot": "^2.4.1",
|
|
67
69
|
"@types/pretty": "2.0.1",
|
|
68
70
|
"@types/react-beautiful-dnd": "^13.1.1",
|
|
@@ -72,7 +74,7 @@
|
|
|
72
74
|
"@types/react-test-renderer": "^16.9.3",
|
|
73
75
|
"@types/react-text-mask": "^5.4.6",
|
|
74
76
|
"@types/react-transition-group": "^4.4.0",
|
|
75
|
-
"@types/webpack": "
|
|
77
|
+
"@types/webpack": "^4.41.22",
|
|
76
78
|
"@typescript-eslint/parser": "^5.12.1",
|
|
77
79
|
"@typescript-eslint/eslint-plugin": "^5.12.1",
|
|
78
80
|
"autoprefixer": "^10.3.4",
|
|
@@ -92,11 +94,8 @@
|
|
|
92
94
|
"jest-environment-jsdom": "^26.5.3",
|
|
93
95
|
"lint-staged": "^10.4.0",
|
|
94
96
|
"mockdate": "^3.0.2",
|
|
95
|
-
"postcss": "8.
|
|
96
|
-
"postcss-
|
|
97
|
-
"postcss-load-config": "^3.1.4",
|
|
98
|
-
"postcss-loader": "7.0.1",
|
|
99
|
-
"postcss-nested": "6.0.0",
|
|
97
|
+
"postcss": "^8.3.6",
|
|
98
|
+
"postcss-loader": "^4.3",
|
|
100
99
|
"preact": "^10.5.14",
|
|
101
100
|
"prettier": "^2.1.0",
|
|
102
101
|
"pretty": "2.0.0",
|
|
@@ -113,7 +112,7 @@
|
|
|
113
112
|
"ts-jest": "^26.4.1",
|
|
114
113
|
"ts-loader": "^8.0.4",
|
|
115
114
|
"typescript": "^4.9.4",
|
|
116
|
-
"webpack": "
|
|
115
|
+
"webpack": "^4.44.2"
|
|
117
116
|
},
|
|
118
117
|
"dependencies": {
|
|
119
118
|
"@fortawesome/fontawesome-svg-core": "^6.1.1",
|
|
@@ -123,6 +122,7 @@
|
|
|
123
122
|
"@mapbox/mapbox-sdk": "^0.13.0",
|
|
124
123
|
"@types/jwt-decode": "^2.2.1",
|
|
125
124
|
"@types/mdx": "^2.0.1",
|
|
125
|
+
"@types/node": "^12.12.67",
|
|
126
126
|
"@types/node-polyglot": "^2.4.1",
|
|
127
127
|
"@types/react-beautiful-dnd": "^13.1.1",
|
|
128
128
|
"@types/react-dom": "^16.9.5",
|
|
@@ -137,17 +137,16 @@
|
|
|
137
137
|
"markdown-to-jsx": "7.1.8",
|
|
138
138
|
"nanoid": "^3.1.12",
|
|
139
139
|
"node-polyglot": "^2.4.0",
|
|
140
|
-
"react": "
|
|
140
|
+
"react": "^17.0.2",
|
|
141
141
|
"react-accessible-accordion": "^3.3.5",
|
|
142
142
|
"react-beautiful-dnd": "^13.1.0",
|
|
143
|
-
"react-dom": "
|
|
143
|
+
"react-dom": "^17.0.2",
|
|
144
144
|
"react-dropzone": "^11.3.2",
|
|
145
145
|
"react-focus-lock": "^2.5.2",
|
|
146
146
|
"react-hook-form": "^6.15.5",
|
|
147
147
|
"react-map-gl": "^6.1.16",
|
|
148
148
|
"react-media": "^1.10.0",
|
|
149
149
|
"react-remove-scroll": "2.5.4",
|
|
150
|
-
"react-scripts": "5.0.1",
|
|
151
150
|
"react-tabs": "^3.2.2",
|
|
152
151
|
"react-text-mask": "^5.4.3",
|
|
153
152
|
"react-transition-group": "^4.4.1",
|
package/src/actions/Button.tsx
CHANGED
|
@@ -4,7 +4,7 @@ import { AppearanceProps, classNamesForAppearanceTypes } from "../global/Appeara
|
|
|
4
4
|
import { Icon, IconSize, UniversalIconType } from "../icons/Icon"
|
|
5
5
|
|
|
6
6
|
export interface ButtonProps extends AppearanceProps {
|
|
7
|
-
"data-
|
|
7
|
+
"data-test-id"?: string
|
|
8
8
|
ariaHidden?: boolean
|
|
9
9
|
ariaLabel?: string
|
|
10
10
|
children: React.ReactNode
|
|
@@ -81,7 +81,7 @@ const Button = (props: ButtonProps) => {
|
|
|
81
81
|
aria-hidden={props.ariaHidden}
|
|
82
82
|
tabIndex={props.ariaHidden ? -1 : 0}
|
|
83
83
|
aria-label={props.ariaLabel}
|
|
84
|
-
data-
|
|
84
|
+
data-test-id={props.dataTestId || props["data-test-id"]}
|
|
85
85
|
>
|
|
86
86
|
{buttonInner(props)}
|
|
87
87
|
</button>
|
|
@@ -22,7 +22,7 @@ const LinkButton = (props: LinkButtonProps) => {
|
|
|
22
22
|
<a
|
|
23
23
|
href={props.href}
|
|
24
24
|
className={buttonClasses.join(" ")}
|
|
25
|
-
data-
|
|
25
|
+
data-test-id={props.dataTestId}
|
|
26
26
|
target={props.newTab ? "_blank" : "_self"}
|
|
27
27
|
>
|
|
28
28
|
{buttonInner(props)}
|
|
@@ -41,7 +41,7 @@ const LinkButton = (props: LinkButtonProps) => {
|
|
|
41
41
|
aria-hidden={props.ariaHidden}
|
|
42
42
|
tabIndex={props.ariaHidden ? -1 : 0}
|
|
43
43
|
className={buttonClasses.join(" ")}
|
|
44
|
-
data-
|
|
44
|
+
data-test-id={props.dataTestId}
|
|
45
45
|
>
|
|
46
46
|
{buttonInner(props)}
|
|
47
47
|
</LinkComponent>
|
package/src/blocks/DashBlock.tsx
CHANGED
package/src/blocks/ImageCard.tsx
CHANGED
|
@@ -147,7 +147,7 @@ const ImageCard = (props: ImageCardProps) => {
|
|
|
147
147
|
? `${props.images.length - 2} ${props.moreImagesDescription}`
|
|
148
148
|
: "More Images"
|
|
149
149
|
}
|
|
150
|
-
data-
|
|
150
|
+
data-test-id="open-modal-button"
|
|
151
151
|
onClick={() => {
|
|
152
152
|
setShowModal(true)
|
|
153
153
|
}}
|
package/src/blocks/ViewItem.tsx
CHANGED
|
@@ -23,14 +23,14 @@ const ViewItem = (props: ViewItemProps) => {
|
|
|
23
23
|
if (props.truncated) valueClassName += " is-truncated"
|
|
24
24
|
|
|
25
25
|
return (
|
|
26
|
-
<div id={props.id} className={viewItemClasses.join(" ")} data-
|
|
26
|
+
<div id={props.id} className={viewItemClasses.join(" ")} data-test-id={props.dataTestId}>
|
|
27
27
|
{props.label && (
|
|
28
28
|
<span className={`view-item__label ${props.error ? "text-alert text-sm" : ""}`}>
|
|
29
29
|
{props.label}
|
|
30
30
|
</span>
|
|
31
31
|
)}
|
|
32
32
|
{props.children && (
|
|
33
|
-
<span className={valueClassName} data-
|
|
33
|
+
<span className={valueClassName} data-test-id={props.dataTestId}>
|
|
34
34
|
{props.children}
|
|
35
35
|
</span>
|
|
36
36
|
)}
|
package/src/forms/Dropzone.tsx
CHANGED
|
@@ -59,7 +59,7 @@ const Dropzone = (props: DropzoneProps) => {
|
|
|
59
59
|
<progress className="dropzone__progress" max="100" value={props.progress}></progress>
|
|
60
60
|
) : (
|
|
61
61
|
<div className={dropzoneClasses.join(" ")} {...getRootProps()}>
|
|
62
|
-
<input id={props.id} {...getInputProps()} data-
|
|
62
|
+
<input id={props.id} {...getInputProps()} data-test-id={"dropzone-input"} />
|
|
63
63
|
{isDragActive ? (
|
|
64
64
|
<p>{props.strings?.dropHere ?? t("t.dropFilesHere")}</p>
|
|
65
65
|
) : (
|
package/src/forms/Field.tsx
CHANGED
package/src/forms/FieldGroup.tsx
CHANGED
|
@@ -63,8 +63,8 @@ const FieldGroup = ({
|
|
|
63
63
|
}: FieldGroupProps) => {
|
|
64
64
|
// Always default align two-option radio groups side by side
|
|
65
65
|
if (fields?.length === 2) {
|
|
66
|
-
fieldGroupClassName = `${fieldGroupClassName
|
|
67
|
-
fieldClassName = `${fieldClassName
|
|
66
|
+
fieldGroupClassName = `${fieldGroupClassName} flex`
|
|
67
|
+
fieldClassName = `${fieldClassName} flex-initial mr-4`
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
const [checkedInputs, setCheckedInputs] = useState<string[]>([])
|
|
@@ -82,7 +82,7 @@ const FieldGroup = ({
|
|
|
82
82
|
type={type}
|
|
83
83
|
id={item.id}
|
|
84
84
|
defaultValue={item.value || item.id}
|
|
85
|
-
name={subfieldsExist() || item.uniqueName ? `${name}-${item.value
|
|
85
|
+
name={subfieldsExist() || item.uniqueName ? `${name}-${item.value}` : name}
|
|
86
86
|
onClick={(e) => {
|
|
87
87
|
// We cannot reliably target an individual checkbox in a field group since they have the same name, so we keep track on our own
|
|
88
88
|
if (e.currentTarget.checked) {
|
|
@@ -95,12 +95,12 @@ const FieldGroup = ({
|
|
|
95
95
|
disabled={item.disabled}
|
|
96
96
|
ref={register(validation)}
|
|
97
97
|
{...item.inputProps}
|
|
98
|
-
data-
|
|
98
|
+
data-test-id={item.dataTestId ?? dataTestId}
|
|
99
99
|
/>
|
|
100
100
|
<label
|
|
101
101
|
htmlFor={item.id}
|
|
102
|
-
className={`font-semibold ${fieldLabelClassName
|
|
103
|
-
item.disabled
|
|
102
|
+
className={`font-semibold ${fieldLabelClassName} ${
|
|
103
|
+
item.disabled && "text-gray-600 cursor-not-allowed"
|
|
104
104
|
}`}
|
|
105
105
|
>
|
|
106
106
|
{item.label}
|
|
@@ -150,8 +150,8 @@ const FieldGroup = ({
|
|
|
150
150
|
{item.additionalText && checkedInputs.indexOf(item.label) >= 0 && (
|
|
151
151
|
<Field
|
|
152
152
|
id={item.id}
|
|
153
|
-
key={`${item.value
|
|
154
|
-
name={`${name}-${item.value
|
|
153
|
+
key={`${item.value}-additionalText`}
|
|
154
|
+
name={`${name}-${item.value}`}
|
|
155
155
|
register={register}
|
|
156
156
|
defaultValue={item.defaultText}
|
|
157
157
|
placeholder={strings?.description ?? t("t.description")}
|
|
@@ -168,12 +168,12 @@ const FieldGroup = ({
|
|
|
168
168
|
{groupLabel && <label className="text__caps-spaced">{groupLabel}</label>}
|
|
169
169
|
{groupNote && <p className="field-note mb-4">{groupNote}</p>}
|
|
170
170
|
|
|
171
|
-
<div className={`field ${error
|
|
171
|
+
<div className={`field ${error && "error"} ${fieldGroupClassName || ""} mb-0`}>
|
|
172
172
|
{fields?.map((item) => (
|
|
173
173
|
<div className={`field ${fieldClassName || ""} mb-1`} key={item.id}>
|
|
174
174
|
{getInputSet(item)}
|
|
175
175
|
{item.subFields && checkedInputs.indexOf(item.label) >= 0 && (
|
|
176
|
-
<div className={"ml-8"} key={`${item.value
|
|
176
|
+
<div className={"ml-8"} key={`${item.value}-subfields`}>
|
|
177
177
|
{item.subFields?.map((subItem) => {
|
|
178
178
|
return getInputSet(subItem)
|
|
179
179
|
})}
|
|
@@ -27,7 +27,7 @@ const HouseholdMemberForm = (props: HouseholdMemberFormProps) => {
|
|
|
27
27
|
className="edit-link"
|
|
28
28
|
onClick={() => props.editMember && props.editMember(props.memberId)}
|
|
29
29
|
type={"button"}
|
|
30
|
-
data-
|
|
30
|
+
data-test-id={"app-household-member-edit-button"}
|
|
31
31
|
>
|
|
32
32
|
{props.strings?.edit ?? t("t.edit")}
|
|
33
33
|
</button>
|
|
@@ -80,7 +80,7 @@ const MultiSelectField = (props: MultiSelectFieldProps) => {
|
|
|
80
80
|
return (
|
|
81
81
|
<div className="field multi-select-field">
|
|
82
82
|
{props.label && label}
|
|
83
|
-
<div className="control" data-
|
|
83
|
+
<div className="control" data-test-id={props.dataTestId}>
|
|
84
84
|
<Icon symbol="search" size="medium" />
|
|
85
85
|
<input
|
|
86
86
|
id={props.id}
|
package/src/forms/PhoneField.tsx
CHANGED
|
@@ -60,7 +60,7 @@ export const PhoneField = (props: {
|
|
|
60
60
|
{props.label}
|
|
61
61
|
</label>
|
|
62
62
|
)}
|
|
63
|
-
<div className={props.controlClassName} data-
|
|
63
|
+
<div className={props.controlClassName} data-test-id={props.dataTestId}>
|
|
64
64
|
{props.mask ? (
|
|
65
65
|
<Controller {...controllerProps} render={props.mask} />
|
|
66
66
|
) : (
|
|
@@ -68,7 +68,7 @@ export const PhoneField = (props: {
|
|
|
68
68
|
)}
|
|
69
69
|
</div>
|
|
70
70
|
{props.subNote && <p className="field-sub-note">{props.subNote}</p>}
|
|
71
|
-
<ErrorMessage id={`${props.id
|
|
71
|
+
<ErrorMessage id={`${props.id}-error`} error={props.error}>
|
|
72
72
|
{props.errorMessage}
|
|
73
73
|
</ErrorMessage>
|
|
74
74
|
</div>
|
package/src/forms/Select.tsx
CHANGED
|
@@ -60,8 +60,8 @@ export const Select = ({
|
|
|
60
60
|
className="input"
|
|
61
61
|
id={id || name}
|
|
62
62
|
name={name}
|
|
63
|
-
data-
|
|
64
|
-
aria-describedby={describedBy ? describedBy : `${id
|
|
63
|
+
data-test-id={dataTestId}
|
|
64
|
+
aria-describedby={describedBy ? describedBy : `${id}-error`}
|
|
65
65
|
aria-invalid={!!error || false}
|
|
66
66
|
aria-label={label}
|
|
67
67
|
ref={register && register(validation)}
|
|
@@ -79,7 +79,7 @@ export const Select = ({
|
|
|
79
79
|
</div>
|
|
80
80
|
{subNote && <p className="field-sub-note">{subNote}</p>}
|
|
81
81
|
{error && errorMessage && (
|
|
82
|
-
<ErrorMessage id={`${id
|
|
82
|
+
<ErrorMessage id={`${id}-error`} error={error}>
|
|
83
83
|
{errorMessage}
|
|
84
84
|
</ErrorMessage>
|
|
85
85
|
)}
|
package/src/forms/Textarea.tsx
CHANGED
|
@@ -57,7 +57,7 @@ export const Textarea = (props: TextareaProps) => {
|
|
|
57
57
|
wrap={props.wrap ?? "soft"}
|
|
58
58
|
title={props.label}
|
|
59
59
|
{...inputProps}
|
|
60
|
-
data-
|
|
60
|
+
data-test-id={props.dataTestId}
|
|
61
61
|
/>
|
|
62
62
|
{props.note && <p className="field-note font-normal mb-2">{props.note}</p>}
|
|
63
63
|
{props.errorMessage && <span className="textarea-error-message">{props.errorMessage}</span>}
|
package/src/headers/Hero.tsx
CHANGED
|
@@ -20,7 +20,7 @@ export interface HeroProps {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
const HeroButton = (props: { title: string; href: string; className?: string }) => (
|
|
23
|
-
<span className={
|
|
23
|
+
<span className={props.className + " hero__button"}>
|
|
24
24
|
<LinkButton href={props.href}>{props.title}</LinkButton>
|
|
25
25
|
</span>
|
|
26
26
|
)
|
|
@@ -44,7 +44,7 @@ const Hero = (props: HeroProps) => {
|
|
|
44
44
|
classNames = "centered"
|
|
45
45
|
}
|
|
46
46
|
return (
|
|
47
|
-
<div className={`hero ${classNames}`} style={styles} data-
|
|
47
|
+
<div className={`hero ${classNames}`} style={styles} data-test-id={"hero-component"}>
|
|
48
48
|
<h1 className={`hero__title ${props.extraLargeTitle ? "lg:text-6.5xl" : ""}`}>
|
|
49
49
|
{props.title}
|
|
50
50
|
</h1>
|
|
@@ -157,7 +157,7 @@ const SiteHeader = (props: SiteHeaderProps) => {
|
|
|
157
157
|
}
|
|
158
158
|
dropdownOptionKeyDown(event, index)
|
|
159
159
|
}}
|
|
160
|
-
data-
|
|
160
|
+
data-test-id={`${option.title}-${index}`}
|
|
161
161
|
>
|
|
162
162
|
{dropdownOptionContent(option)}
|
|
163
163
|
</button>
|
|
@@ -327,7 +327,7 @@ const SiteHeader = (props: SiteHeaderProps) => {
|
|
|
327
327
|
}`}
|
|
328
328
|
href={menuLink.href}
|
|
329
329
|
key={`${menuLink.title}-${index}`}
|
|
330
|
-
data-
|
|
330
|
+
data-test-id={`${menuLink.title}-${index}`}
|
|
331
331
|
>
|
|
332
332
|
{menuContent}
|
|
333
333
|
</LinkComponent>
|
|
@@ -367,7 +367,7 @@ const SiteHeader = (props: SiteHeaderProps) => {
|
|
|
367
367
|
onMouseEnter={() => changeMenuShow(menuLink.title, activeMenus, setActiveMenus)}
|
|
368
368
|
onMouseLeave={() => changeMenuShow(menuLink.title, activeMenus, setActiveMenus)}
|
|
369
369
|
role={"button"}
|
|
370
|
-
data-
|
|
370
|
+
data-test-id={`${menuLink.title}-${index}`}
|
|
371
371
|
>
|
|
372
372
|
{menuContent}
|
|
373
373
|
</span>
|
package/src/icons/Icon.tsx
CHANGED
|
@@ -171,7 +171,7 @@ const Icon = (props: IconProps) => {
|
|
|
171
171
|
<span
|
|
172
172
|
className={wrapperClasses.join(" ")}
|
|
173
173
|
aria-hidden={props.ariaHidden}
|
|
174
|
-
data-
|
|
174
|
+
data-test-id={props.dataTestId ?? null}
|
|
175
175
|
>
|
|
176
176
|
<SpecificIcon fill={props.fill ? props.fill : undefined} />
|
|
177
177
|
</span>
|
|
@@ -179,7 +179,7 @@ const Icon = (props: IconProps) => {
|
|
|
179
179
|
<span
|
|
180
180
|
className={wrapperClasses.join(" ")}
|
|
181
181
|
aria-hidden={props.ariaHidden}
|
|
182
|
-
data-
|
|
182
|
+
data-test-id={props.dataTestId ?? null}
|
|
183
183
|
style={{ color: props.fill }}
|
|
184
184
|
>
|
|
185
185
|
{SpecificIcon}
|
|
@@ -12,7 +12,7 @@ const LoadingOverlay = ({ isLoading, children }: LoadingOverlayProps) => {
|
|
|
12
12
|
if (!isLoading) return children
|
|
13
13
|
|
|
14
14
|
return (
|
|
15
|
-
<div className="loading-overlay" data-
|
|
15
|
+
<div className="loading-overlay" data-test-id="loading-overlay">
|
|
16
16
|
<Icon size="3xl" symbol="spinner" className="loading-overlay__spinner" />
|
|
17
17
|
{children}
|
|
18
18
|
</div>
|
package/src/overlays/Modal.scss
CHANGED
|
@@ -4,9 +4,16 @@
|
|
|
4
4
|
--title-font-size: var(--bloom-font-size-lg);
|
|
5
5
|
--title-font-family: var(--bloom-font-sans);
|
|
6
6
|
--content-font-color: var(--bloom-color-gray-700);
|
|
7
|
-
--content-padding: var(--bloom-s6);
|
|
7
|
+
--content-padding-block: 0 var(--bloom-s6);
|
|
8
|
+
--content-padding-inline: var(--bloom-s6);
|
|
9
|
+
--content-margin-top: var(--bloom-s6);
|
|
10
|
+
--title-padding-block: var(--bloom-s6) 0px;
|
|
11
|
+
--title-padding-inline: var(--bloom-s6) var(--bloom-s12);
|
|
12
|
+
--footer-padding-block: var(--bloom-s6);
|
|
13
|
+
--footer-padding-inline: var(--bloom-s6);
|
|
8
14
|
--max-width: var(--bloom-width-5xl);
|
|
9
15
|
--desktop-min-width: var(--bloom-width-xl);
|
|
16
|
+
--scroll-max-height: 100vh;
|
|
10
17
|
--footer-background-color: var(--bloom-color-primary-lighter);
|
|
11
18
|
--border-radius: var(--bloom-rounded);
|
|
12
19
|
--mobile-border-radius: 0;
|
|
@@ -14,7 +21,12 @@
|
|
|
14
21
|
--modal-shadow: var(--bloom-shadow-md);
|
|
15
22
|
--modal-border: var(--bloom-border-1) solid var(--bloom-color-gray-400);
|
|
16
23
|
--footer-justify: normal;
|
|
17
|
-
|
|
24
|
+
--max-height: 100vh;
|
|
25
|
+
--overflow: auto;
|
|
26
|
+
--width: 100vw;
|
|
27
|
+
--modal-header-min-height: auto;
|
|
28
|
+
|
|
29
|
+
overflow: var(--overflow);
|
|
18
30
|
-webkit-overflow-scrolling: touch;
|
|
19
31
|
|
|
20
32
|
display: flex;
|
|
@@ -22,12 +34,12 @@
|
|
|
22
34
|
|
|
23
35
|
position: relative;
|
|
24
36
|
max-width: var(--max-width);
|
|
25
|
-
max-height:
|
|
37
|
+
max-height: var(--max-height);
|
|
26
38
|
margin: auto;
|
|
27
39
|
border: var(--modal-border);
|
|
28
40
|
background-color: var(--background-color);
|
|
29
41
|
box-shadow: var(--modal-shadow);
|
|
30
|
-
width:
|
|
42
|
+
width: var(--width);
|
|
31
43
|
border-radius: var(--mobile-border-radius);
|
|
32
44
|
|
|
33
45
|
@media (min-width: $screen-sm) {
|
|
@@ -44,18 +56,22 @@
|
|
|
44
56
|
}
|
|
45
57
|
}
|
|
46
58
|
|
|
59
|
+
.modal__header {
|
|
60
|
+
min-height: var(--modal-header-min-height);
|
|
61
|
+
}
|
|
62
|
+
|
|
47
63
|
.modal__title {
|
|
48
|
-
padding-block: var(--
|
|
49
|
-
padding-inline: var(--
|
|
64
|
+
padding-block: var(--title-padding-block);
|
|
65
|
+
padding-inline: var(--title-padding-inline);
|
|
50
66
|
color: var(--title-color);
|
|
51
67
|
font-size: var(--title-font-size);
|
|
52
68
|
font-family: var(--title-font-family);
|
|
53
69
|
}
|
|
54
70
|
|
|
55
71
|
.modal__inner {
|
|
56
|
-
padding: var(--content-padding);
|
|
57
|
-
padding-
|
|
58
|
-
margin-top: var(--content-
|
|
72
|
+
padding-block: var(--content-padding-block);
|
|
73
|
+
padding-inline: var(--content-padding-inline);
|
|
74
|
+
margin-top: var(--content-margin-top);
|
|
59
75
|
|
|
60
76
|
&:last-of-type {
|
|
61
77
|
border-bottom-right-radius: var(--border-radius);
|
|
@@ -63,7 +79,7 @@
|
|
|
63
79
|
}
|
|
64
80
|
|
|
65
81
|
&.is-scrollable {
|
|
66
|
-
max-height:
|
|
82
|
+
max-height: var(--scroll-max-height);
|
|
67
83
|
max-width: 100vw;
|
|
68
84
|
@media (min-width: $screen-md) {
|
|
69
85
|
max-height: calc(100vh - var(--bloom-s6));
|
|
@@ -79,7 +95,8 @@
|
|
|
79
95
|
}
|
|
80
96
|
|
|
81
97
|
.modal__footer {
|
|
82
|
-
padding: var(--
|
|
98
|
+
padding-block: var(--footer-padding-block);
|
|
99
|
+
padding-inline: var(--footer-padding-inline);
|
|
83
100
|
border-bottom-right-radius: var(--border-radius);
|
|
84
101
|
border-bottom-left-radius: var(--border-radius);
|
|
85
102
|
background-color: var(--footer-background-color);
|
|
@@ -134,7 +134,7 @@ export const ScrollableModal = () => {
|
|
|
134
134
|
{text("Action 1 Label", "Cancel")}
|
|
135
135
|
</Button>,
|
|
136
136
|
]}
|
|
137
|
-
|
|
137
|
+
scrollableModal
|
|
138
138
|
>
|
|
139
139
|
{text(
|
|
140
140
|
"Content",
|
|
@@ -156,7 +156,7 @@ export const ScrollableModalNoFooter = () => {
|
|
|
156
156
|
title={text("Title", "Modal Title")}
|
|
157
157
|
ariaDescription="Modal description"
|
|
158
158
|
onClose={() => setOpenModal(!openModal)}
|
|
159
|
-
|
|
159
|
+
scrollableModal
|
|
160
160
|
>
|
|
161
161
|
{text(
|
|
162
162
|
"Content",
|
|
@@ -175,7 +175,7 @@ export const ScrollableModalManyButtons = () => {
|
|
|
175
175
|
title={text("Title", "Modal Title")}
|
|
176
176
|
ariaDescription="Modal description"
|
|
177
177
|
onClose={() => setOpenModal(!openModal)}
|
|
178
|
-
|
|
178
|
+
scrollableModal
|
|
179
179
|
actions={[
|
|
180
180
|
<Button
|
|
181
181
|
onClick={() => setOpenModal(!openModal)}
|
|
@@ -241,7 +241,7 @@ export const ScrollableModalMinimalContent = () => {
|
|
|
241
241
|
{text("Action 1 Label", "Cancel")}
|
|
242
242
|
</Button>,
|
|
243
243
|
]}
|
|
244
|
-
|
|
244
|
+
scrollableModal
|
|
245
245
|
>
|
|
246
246
|
{text(
|
|
247
247
|
"Content",
|
package/src/overlays/Modal.tsx
CHANGED
|
@@ -14,7 +14,8 @@ export interface ModalProps extends Omit<OverlayProps, "children"> {
|
|
|
14
14
|
modalClassNames?: string
|
|
15
15
|
headerClassNames?: string
|
|
16
16
|
role?: string
|
|
17
|
-
|
|
17
|
+
scrollableModal?: boolean
|
|
18
|
+
scrollableOverlay?: boolean
|
|
18
19
|
slim?: boolean
|
|
19
20
|
title: string
|
|
20
21
|
}
|
|
@@ -46,7 +47,7 @@ export const Modal = (props: ModalProps) => {
|
|
|
46
47
|
const modalClassNames = ["modal"]
|
|
47
48
|
const innerClassNames = ["modal__inner"]
|
|
48
49
|
const closeClassNames = ["modal__close"]
|
|
49
|
-
if (props.
|
|
50
|
+
if (props.scrollableModal) innerClassNames.push("is-scrollable")
|
|
50
51
|
if (props.modalClassNames) modalClassNames.push(...props.modalClassNames.split(" "))
|
|
51
52
|
if (props.innerClassNames) innerClassNames.push(...props.innerClassNames.split(" "))
|
|
52
53
|
if (props.closeClassNames) closeClassNames.push(...props.closeClassNames.split(" "))
|
|
@@ -59,9 +60,9 @@ export const Modal = (props: ModalProps) => {
|
|
|
59
60
|
onClose={props.onClose}
|
|
60
61
|
className={props.className}
|
|
61
62
|
backdrop={props.backdrop}
|
|
62
|
-
scrollable={props.scrollable}
|
|
63
63
|
slim={props.slim}
|
|
64
64
|
role={props.role ? props.role : "dialog"}
|
|
65
|
+
scrollable={props.scrollableOverlay}
|
|
65
66
|
>
|
|
66
67
|
<div className={modalClassNames.join(" ")}>
|
|
67
68
|
{!props.hideCloseIcon && (
|
|
@@ -35,7 +35,7 @@ const ContentAccordion = (props: ContentAccordionProps) => {
|
|
|
35
35
|
className={`w-full text-left ${props.disableAccordion ? "cursor-default" : ""}`}
|
|
36
36
|
ref={buttonRef}
|
|
37
37
|
aria-expanded={accordionOpen}
|
|
38
|
-
data-
|
|
38
|
+
data-test-id={"content-accordion-button"}
|
|
39
39
|
>
|
|
40
40
|
<div
|
|
41
41
|
className={`flex justify-between ${props.barClass ? props.barClass : ""} ${
|
|
@@ -182,7 +182,7 @@ const ListingCard = (props: ListingCardProps) => {
|
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
return (
|
|
185
|
-
<article className="listings-row" data-
|
|
185
|
+
<article className="listings-row" data-test-id={"listing-card-component"}>
|
|
186
186
|
<div className="listings-row_figure">
|
|
187
187
|
<ImageCard {...imageCardProps} />
|
|
188
188
|
</div>
|