@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.
Files changed (102) hide show
  1. package/dist/__tests__/actions/ExpandableContent.test.js +1 -1
  2. package/dist/__tests__/actions/ExpandableContent.test.js.map +1 -1
  3. package/dist/__tests__/page_components/ContentAccordion.test.js +2 -2
  4. package/dist/__tests__/page_components/ContentAccordion.test.js.map +1 -1
  5. package/dist/src/actions/Button.d.ts +1 -1
  6. package/dist/src/actions/Button.js +1 -1
  7. package/dist/src/actions/Button.js.map +1 -1
  8. package/dist/src/actions/LinkButton.js +2 -2
  9. package/dist/src/actions/LinkButton.js.map +1 -1
  10. package/dist/src/blocks/DashBlock.js +1 -1
  11. package/dist/src/blocks/DashBlock.js.map +1 -1
  12. package/dist/src/blocks/ImageCard.js +1 -1
  13. package/dist/src/blocks/ImageCard.js.map +1 -1
  14. package/dist/src/blocks/ViewItem.js +2 -2
  15. package/dist/src/blocks/ViewItem.js.map +1 -1
  16. package/dist/src/forms/Dropzone.js +1 -1
  17. package/dist/src/forms/Dropzone.js.map +1 -1
  18. package/dist/src/forms/Field.js +1 -1
  19. package/dist/src/forms/Field.js.map +1 -1
  20. package/dist/src/forms/FieldGroup.js +8 -8
  21. package/dist/src/forms/FieldGroup.js.map +1 -1
  22. package/dist/src/forms/HouseholdMemberForm.js +1 -1
  23. package/dist/src/forms/HouseholdMemberForm.js.map +1 -1
  24. package/dist/src/forms/MultiSelectField.js +1 -1
  25. package/dist/src/forms/MultiSelectField.js.map +1 -1
  26. package/dist/src/forms/PhoneField.js +2 -2
  27. package/dist/src/forms/PhoneField.js.map +1 -1
  28. package/dist/src/forms/Select.js +2 -2
  29. package/dist/src/forms/Select.js.map +1 -1
  30. package/dist/src/forms/Textarea.js +1 -1
  31. package/dist/src/forms/Textarea.js.map +1 -1
  32. package/dist/src/headers/Hero.js +2 -2
  33. package/dist/src/headers/Hero.js.map +1 -1
  34. package/dist/src/headers/PageHeader.js +1 -1
  35. package/dist/src/headers/PageHeader.js.map +1 -1
  36. package/dist/src/headers/SiteHeader.js +3 -3
  37. package/dist/src/headers/SiteHeader.js.map +1 -1
  38. package/dist/src/icons/Icon.js +2 -2
  39. package/dist/src/icons/Icon.js.map +1 -1
  40. package/dist/src/notifications/AlertBox.js +1 -1
  41. package/dist/src/notifications/AlertBox.js.map +1 -1
  42. package/dist/src/notifications/ErrorMessage.js +1 -1
  43. package/dist/src/notifications/ErrorMessage.js.map +1 -1
  44. package/dist/src/overlays/LoadingOverlay.js +1 -1
  45. package/dist/src/overlays/LoadingOverlay.js.map +1 -1
  46. package/dist/src/overlays/Modal.d.ts +2 -1
  47. package/dist/src/overlays/Modal.js +2 -2
  48. package/dist/src/overlays/Modal.js.map +1 -1
  49. package/dist/src/overlays/Modal.stories.js +4 -4
  50. package/dist/src/overlays/Modal.stories.js.map +1 -1
  51. package/dist/src/page_components/listing/ContentAccordion.js +1 -1
  52. package/dist/src/page_components/listing/ContentAccordion.js.map +1 -1
  53. package/dist/src/page_components/listing/ListingCard.js +1 -1
  54. package/dist/src/page_components/listing/ListingCard.js.map +1 -1
  55. package/dist/src/page_components/listing/listing_sidebar/GetApplication.js +2 -2
  56. package/dist/src/page_components/listing/listing_sidebar/GetApplication.js.map +1 -1
  57. package/dist/src/page_components/sign-in/FormSignIn.js +1 -1
  58. package/dist/src/page_components/sign-in/FormSignIn.js.map +1 -1
  59. package/dist/src/page_components/sign-in/FormSignInAddPhone.js +1 -1
  60. package/dist/src/page_components/sign-in/FormSignInAddPhone.js.map +1 -1
  61. package/dist/src/page_components/sign-in/FormSignInMFACode.js +1 -1
  62. package/dist/src/page_components/sign-in/FormSignInMFACode.js.map +1 -1
  63. package/dist/src/page_components/sign-in/FormSignInMFAType.js +2 -2
  64. package/dist/src/page_components/sign-in/FormSignInMFAType.js.map +1 -1
  65. package/dist/src/page_components/sign-in/FormTerms.js +1 -1
  66. package/dist/src/page_components/sign-in/FormTerms.js.map +1 -1
  67. package/dist/src/tables/AgPagination.js +4 -4
  68. package/dist/src/tables/AgPagination.js.map +1 -1
  69. package/package.json +24 -25
  70. package/src/actions/Button.tsx +2 -2
  71. package/src/actions/LinkButton.tsx +2 -2
  72. package/src/blocks/DashBlock.tsx +1 -1
  73. package/src/blocks/ImageCard.tsx +1 -1
  74. package/src/blocks/ViewItem.tsx +2 -2
  75. package/src/forms/Dropzone.tsx +1 -1
  76. package/src/forms/Field.tsx +1 -1
  77. package/src/forms/FieldGroup.tsx +10 -10
  78. package/src/forms/HouseholdMemberForm.tsx +1 -1
  79. package/src/forms/MultiSelectField.tsx +1 -1
  80. package/src/forms/PhoneField.tsx +2 -2
  81. package/src/forms/Select.tsx +3 -3
  82. package/src/forms/Textarea.tsx +1 -1
  83. package/src/global/tokens/sizes.scss +1 -1
  84. package/src/headers/Hero.tsx +2 -2
  85. package/src/headers/PageHeader.tsx +1 -1
  86. package/src/headers/SiteHeader.tsx +3 -3
  87. package/src/icons/Icon.tsx +2 -2
  88. package/src/notifications/AlertBox.tsx +1 -1
  89. package/src/notifications/ErrorMessage.tsx +1 -1
  90. package/src/overlays/LoadingOverlay.tsx +1 -1
  91. package/src/overlays/Modal.scss +28 -11
  92. package/src/overlays/Modal.stories.tsx +4 -4
  93. package/src/overlays/Modal.tsx +4 -3
  94. package/src/page_components/listing/ContentAccordion.tsx +1 -1
  95. package/src/page_components/listing/ListingCard.tsx +1 -1
  96. package/src/page_components/listing/listing_sidebar/GetApplication.tsx +2 -2
  97. package/src/page_components/sign-in/FormSignIn.tsx +1 -1
  98. package/src/page_components/sign-in/FormSignInAddPhone.tsx +1 -1
  99. package/src/page_components/sign-in/FormSignInMFACode.tsx +1 -1
  100. package/src/page_components/sign-in/FormSignInMFAType.tsx +2 -2
  101. package/src/page_components/sign-in/FormTerms.tsx +1 -1
  102. 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-alpha.1",
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
- "@storybook/addon-actions": "^6.5.16",
46
- "@storybook/addon-essentials": "^6.5.16",
47
- "@storybook/addon-interactions": "^6.5.16",
48
- "@storybook/addon-links": "^6.5.16",
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-postcss": "^2.0.0",
53
- "@storybook/builder-webpack5": "^6.5.16",
54
- "@storybook/manager-webpack5": "^6.5.16",
55
- "@storybook/node-logger": "^6.5.16",
56
- "@storybook/preset-create-react-app": "^4.1.2",
57
- "@storybook/react": "^6.5.16",
58
- "@storybook/testing-library": "^0.0.13",
59
- "@testing-library/jest-dom": "5.16.5",
60
- "@testing-library/react": "14.0.0",
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": "18.14.6",
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": "5.28.0",
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.4.19",
96
- "postcss-import": "^14.1.0",
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": "5.76.0"
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": "18.2.0",
140
+ "react": "^17.0.2",
141
141
  "react-accessible-accordion": "^3.3.5",
142
142
  "react-beautiful-dnd": "^13.1.0",
143
- "react-dom": "18.2.0",
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",
@@ -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-testid"?: string
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-testid={props.dataTestId || props["data-testid"]}
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-testid={props.dataTestId}
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-testid={props.dataTestId}
44
+ data-test-id={props.dataTestId}
45
45
  >
46
46
  {buttonInner(props)}
47
47
  </LinkComponent>
@@ -41,7 +41,7 @@ const DashBlock = (props: DashBlockProps) => {
41
41
  )
42
42
  }
43
43
  return (
44
- <div className="dash-block" data-testid={props.dataTestId}>
44
+ <div className="dash-block" data-test-id={props.dataTestId}>
45
45
  {wrapper}
46
46
  </div>
47
47
  )
@@ -147,7 +147,7 @@ const ImageCard = (props: ImageCardProps) => {
147
147
  ? `${props.images.length - 2} ${props.moreImagesDescription}`
148
148
  : "More Images"
149
149
  }
150
- data-testid="open-modal-button"
150
+ data-test-id="open-modal-button"
151
151
  onClick={() => {
152
152
  setShowModal(true)
153
153
  }}
@@ -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-testid={props.dataTestId}>
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-testid={props.dataTestId}>
33
+ <span className={valueClassName} data-test-id={props.dataTestId}>
34
34
  {props.children}
35
35
  </span>
36
36
  )}
@@ -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-testid={"dropzone-input"} />
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
  ) : (
@@ -138,7 +138,7 @@ const Field = (props: FieldProps) => {
138
138
  onPaste={props.onPaste}
139
139
  onDrop={props.onDrop}
140
140
  onChange={props.onChange}
141
- data-testid={props.dataTestId}
141
+ data-test-id={props.dataTestId}
142
142
  {...inputProps}
143
143
  hidden={props.hidden}
144
144
  />
@@ -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 || ""} flex`
67
- fieldClassName = `${fieldClassName || ""} flex-initial mr-4`
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 || ""}` : name}
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-testid={item.dataTestId ?? dataTestId}
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 ? "text-gray-600 cursor-not-allowed" : ""
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 || ""}-additionalText`}
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 ? "error" : ""} ${fieldGroupClassName || ""} mb-0`}>
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 || ""}-subfields`}>
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-testid={"app-household-member-edit-button"}
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-testid={props.dataTestId}>
83
+ <div className="control" data-test-id={props.dataTestId}>
84
84
  <Icon symbol="search" size="medium" />
85
85
  <input
86
86
  id={props.id}
@@ -60,7 +60,7 @@ export const PhoneField = (props: {
60
60
  {props.label}
61
61
  </label>
62
62
  )}
63
- <div className={props.controlClassName} data-testid={props.dataTestId}>
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 || ""}-error`} error={props.error}>
71
+ <ErrorMessage id={`${props.id}-error`} error={props.error}>
72
72
  {props.errorMessage}
73
73
  </ErrorMessage>
74
74
  </div>
@@ -60,8 +60,8 @@ export const Select = ({
60
60
  className="input"
61
61
  id={id || name}
62
62
  name={name}
63
- data-testid={dataTestId}
64
- aria-describedby={describedBy ? describedBy : `${id || name}-error`}
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 || name}-error`} error={error}>
82
+ <ErrorMessage id={`${id}-error`} error={error}>
83
83
  {errorMessage}
84
84
  </ErrorMessage>
85
85
  )}
@@ -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-testid={props.dataTestId}
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>}
@@ -5,7 +5,7 @@
5
5
  --bloom-s2: 0.5rem;
6
6
  --bloom-s2_5: 0.625rem;
7
7
  --bloom-s3: 0.75rem;
8
- --bloom-s3_5: 0.875;
8
+ --bloom-s3_5: 0.875rem;
9
9
  --bloom-s4: 1rem;
10
10
  --bloom-s5: 1.25rem;
11
11
  --bloom-s6: 1.5rem;
@@ -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={`${props.className || ""} hero__button`}>
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-testid={"hero-component"}>
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>
@@ -31,7 +31,7 @@ const PageHeader = (props: PageHeaderProps) => {
31
31
  )}
32
32
 
33
33
  {props.title && (
34
- <h1 data-testid="page-header" className="page-header__title">
34
+ <h1 data-test-id="page-header" className="page-header__title">
35
35
  {props.title}
36
36
  </h1>
37
37
  )}
@@ -157,7 +157,7 @@ const SiteHeader = (props: SiteHeaderProps) => {
157
157
  }
158
158
  dropdownOptionKeyDown(event, index)
159
159
  }}
160
- data-testid={`${option.title}-${index}`}
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-testid={`${menuLink.title}-${index}`}
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-testid={`${menuLink.title}-${index}`}
370
+ data-test-id={`${menuLink.title}-${index}`}
371
371
  >
372
372
  {menuContent}
373
373
  </span>
@@ -171,7 +171,7 @@ const Icon = (props: IconProps) => {
171
171
  <span
172
172
  className={wrapperClasses.join(" ")}
173
173
  aria-hidden={props.ariaHidden}
174
- data-testid={props.dataTestId ?? null}
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-testid={props.dataTestId ?? null}
182
+ data-test-id={props.dataTestId ?? null}
183
183
  style={{ color: props.fill }}
184
184
  >
185
185
  {SpecificIcon}
@@ -83,7 +83,7 @@ const AlertBox = (props: AlertBoxProps) => {
83
83
  }
84
84
 
85
85
  return showing ? (
86
- <div className={classNames} role="alert" data-testid={"alert-box"}>
86
+ <div className={classNames} role="alert" data-test-id={"alert-box"}>
87
87
  {innerSection}
88
88
  </div>
89
89
  ) : null
@@ -17,7 +17,7 @@ const ErrorMessage = (props: {
17
17
  id={props.id}
18
18
  className={classes.join(" ")}
19
19
  aria-live="assertive"
20
- data-testid={"error-message"}
20
+ data-test-id={"error-message"}
21
21
  >
22
22
  {props.children}
23
23
  </span>
@@ -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-testid="loading-overlay">
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>
@@ -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
- overflow: auto;
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: 100vh;
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: 100vw;
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(--content-padding) 0px;
49
- padding-inline: var(--content-padding) var(--bloom-s12);
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-top: 0px;
58
- margin-top: var(--content-padding);
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: 100vh;
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(--content-padding);
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
- scrollable
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
- scrollable
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
- scrollable
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
- scrollable
244
+ scrollableModal
245
245
  >
246
246
  {text(
247
247
  "Content",
@@ -14,7 +14,8 @@ export interface ModalProps extends Omit<OverlayProps, "children"> {
14
14
  modalClassNames?: string
15
15
  headerClassNames?: string
16
16
  role?: string
17
- scrollable?: boolean
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.scrollable) innerClassNames.push("is-scrollable")
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-testid={"content-accordion-button"}
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-testid={"listing-card-component"}>
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>