@justfixnyc/component-library 0.32.2 → 0.34.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.
@@ -22,6 +22,17 @@
22
22
  font-style: normal;
23
23
  src: url("./Degular_Display-Medium-ca624b2b.woff2") format("woff2"), url("./Degular_Display-Medium-669217c9.woff") format("woff");
24
24
  }
25
+ .jfcl-sr-only {
26
+ position: absolute;
27
+ width: 1px;
28
+ height: 1px;
29
+ padding: 0;
30
+ margin: -1px;
31
+ overflow: hidden;
32
+ clip: rect(0, 0, 0, 0);
33
+ white-space: nowrap;
34
+ border: 0;
35
+ }
25
36
  @keyframes spin {
26
37
  from {
27
38
  transform: rotate(0deg);
@@ -34,7 +45,7 @@
34
45
  font-family: "Degular", Arial, Helvetica, sans-serif;
35
46
  font-style: normal;
36
47
  font-weight: 500;
37
- font-size: 1.13rem;
48
+ font-size: 1.125rem;
38
49
  line-height: 120%;
39
50
  letter-spacing: 0.54px;
40
51
  cursor: pointer;
@@ -134,26 +145,30 @@
134
145
  border-right-color: transparent;
135
146
  border-top-color: transparent;
136
147
  }
137
- .jfcl-button.jfcl-variant-text {
148
+ .jfcl-button.jfcl-variant-tertiary {
138
149
  color: #242323;
139
150
  background: none;
140
151
  border: none;
141
152
  box-shadow: none;
142
153
  }
143
- .jfcl-button.jfcl-variant-text:disabled {
154
+ .jfcl-button.jfcl-variant-tertiary:disabled {
144
155
  cursor: inherit;
145
156
  color: #676565;
146
157
  }
147
- .jfcl-button.jfcl-variant-text:disabled .jfcl-button__text {
158
+ .jfcl-button.jfcl-variant-tertiary:disabled .jfcl-button__text {
148
159
  border-bottom: none;
149
160
  }
150
- .jfcl-button.jfcl-variant-text:hover:not(:disabled) {
161
+ .jfcl-button.jfcl-variant-tertiary:hover:not(:disabled) {
151
162
  background-color: #efe9dc;
163
+ box-shadow: none;
164
+ }
165
+ .jfcl-button.jfcl-variant-tertiary:active:not(:disabled) {
166
+ box-shadow: none;
152
167
  }
153
- .jfcl-button.jfcl-variant-text.jfcl-is-loading {
168
+ .jfcl-button.jfcl-variant-tertiary.jfcl-is-loading {
154
169
  background-color: #efe9dc;
155
170
  }
156
- .jfcl-button.jfcl-variant-text.jfcl-is-loading .jfcl-button__icon {
171
+ .jfcl-button.jfcl-variant-tertiary.jfcl-is-loading .jfcl-button__icon {
157
172
  display: block;
158
173
  animation: spin 500ms infinite linear;
159
174
  position: relative;
@@ -162,7 +177,7 @@
162
177
  border-right-color: transparent;
163
178
  border-top-color: transparent;
164
179
  }
165
- .jfcl-button.jfcl-variant-text:active(:disabled) {
180
+ .jfcl-button.jfcl-variant-tertiary:active(:disabled) {
166
181
  background-color: rgba(239, 233, 220, 0.8);
167
182
  }
168
183
  @keyframes spin {
@@ -187,7 +202,7 @@
187
202
  font-family: "Degular", Arial, Helvetica, sans-serif;
188
203
  font-style: normal;
189
204
  font-weight: 500;
190
- font-size: 1.13rem;
205
+ font-size: 1.125rem;
191
206
  line-height: 120%;
192
207
  letter-spacing: 0.54px;
193
208
  }
@@ -208,7 +223,14 @@
208
223
  left: 0;
209
224
  bottom: 0;
210
225
  }
211
- .jfcl-alert .jfcl-alert__btn {
226
+ .jfcl-alert button.jfcl-alert__btn,
227
+ .jfcl-alert a.jfcl-alert__btn {
228
+ font-family: "Degular", Arial, Helvetica, sans-serif;
229
+ font-style: normal;
230
+ font-weight: 500;
231
+ font-size: 1.125rem;
232
+ line-height: 120%;
233
+ letter-spacing: 0.54px;
212
234
  display: flex;
213
235
  background: transparent;
214
236
  padding: 0;
@@ -216,11 +238,14 @@
216
238
  margin-left: 0.5rem;
217
239
  cursor: pointer;
218
240
  font-size: 1em;
241
+ text-decoration: none;
219
242
  }
220
- .jfcl-alert .jfcl-alert__btn.jfcl-alert__btn_text {
243
+ .jfcl-alert button.jfcl-alert__btn.jfcl-alert__btn_text,
244
+ .jfcl-alert a.jfcl-alert__btn.jfcl-alert__btn_text {
221
245
  border-bottom: 1px solid;
222
246
  }
223
- .jfcl-alert .jfcl-alert__btn.jfcl-alert__btn_text:hover {
247
+ .jfcl-alert button.jfcl-alert__btn.jfcl-alert__btn_text:hover,
248
+ .jfcl-alert a.jfcl-alert__btn.jfcl-alert__btn_text:hover {
224
249
  color: #676565;
225
250
  }
226
251
  .jfcl-alert.jfcl-type-info::before {
@@ -236,10 +261,12 @@
236
261
  background-color: #242323;
237
262
  color: #faf8f4;
238
263
  }
239
- .jfcl-alert.jfcl-variant-primary .jfcl-alert__btn {
264
+ .jfcl-alert.jfcl-variant-primary button.jfcl-alert__btn,
265
+ .jfcl-alert.jfcl-variant-primary a.jfcl-alert__btn {
240
266
  color: #faf8f4;
241
267
  }
242
- .jfcl-alert.jfcl-variant-primary .jfcl-alert__btn.jfcl-alert__btn_text:hover {
268
+ .jfcl-alert.jfcl-variant-primary button.jfcl-alert__btn.jfcl-alert__btn_text:hover,
269
+ .jfcl-alert.jfcl-variant-primary a.jfcl-alert__btn.jfcl-alert__btn_text:hover {
243
270
  color: #9a9898;
244
271
  }
245
272
  .jfcl-alert.jfcl-variant-secondary {
@@ -247,7 +274,8 @@
247
274
  border: 1px solid #676565;
248
275
  color: #242323;
249
276
  }
250
- .jfcl-alert.jfcl-variant-secondary .jfcl-alert__btn {
277
+ .jfcl-alert.jfcl-variant-secondary button.jfcl-alert__btn,
278
+ .jfcl-alert.jfcl-variant-secondary a.jfcl-alert__btn {
251
279
  color: #242323;
252
280
  border-color: #242323;
253
281
  }
@@ -263,7 +291,7 @@
263
291
  font-family: "Degular", Arial, Helvetica, sans-serif;
264
292
  font-style: normal;
265
293
  font-weight: 500;
266
- font-size: 1.13rem;
294
+ font-size: 1.125rem;
267
295
  line-height: 120%;
268
296
  letter-spacing: 0.54px;
269
297
  color: #242323;
@@ -273,8 +301,5 @@
273
301
  color: #676565;
274
302
  }
275
303
  .jfcl-link .jfcl-link__icon {
276
- display: inline;
277
304
  margin-left: 10px;
278
- width: 1rem;
279
- height: 1rem;
280
305
  }
@@ -22,6 +22,17 @@
22
22
  font-style: normal;
23
23
  src: url("./Degular_Display-Medium-ca624b2b.woff2") format("woff2"), url("./Degular_Display-Medium-669217c9.woff") format("woff");
24
24
  }
25
+ .jfcl-sr-only {
26
+ position: absolute;
27
+ width: 1px;
28
+ height: 1px;
29
+ padding: 0;
30
+ margin: -1px;
31
+ overflow: hidden;
32
+ clip: rect(0, 0, 0, 0);
33
+ white-space: nowrap;
34
+ border: 0;
35
+ }
25
36
  @keyframes spin {
26
37
  from {
27
38
  transform: rotate(0deg);
@@ -34,7 +45,7 @@
34
45
  font-family: "Degular", Arial, Helvetica, sans-serif;
35
46
  font-style: normal;
36
47
  font-weight: 500;
37
- font-size: 1.13rem;
48
+ font-size: 1.125rem;
38
49
  line-height: 120%;
39
50
  letter-spacing: 0.54px;
40
51
  cursor: pointer;
@@ -134,26 +145,30 @@
134
145
  border-right-color: transparent;
135
146
  border-top-color: transparent;
136
147
  }
137
- .jfcl-button.jfcl-variant-text {
148
+ .jfcl-button.jfcl-variant-tertiary {
138
149
  color: #242323;
139
150
  background: none;
140
151
  border: none;
141
152
  box-shadow: none;
142
153
  }
143
- .jfcl-button.jfcl-variant-text:disabled {
154
+ .jfcl-button.jfcl-variant-tertiary:disabled {
144
155
  cursor: inherit;
145
156
  color: #676565;
146
157
  }
147
- .jfcl-button.jfcl-variant-text:disabled .jfcl-button__text {
158
+ .jfcl-button.jfcl-variant-tertiary:disabled .jfcl-button__text {
148
159
  border-bottom: none;
149
160
  }
150
- .jfcl-button.jfcl-variant-text:hover:not(:disabled) {
161
+ .jfcl-button.jfcl-variant-tertiary:hover:not(:disabled) {
151
162
  background-color: #efe9dc;
163
+ box-shadow: none;
164
+ }
165
+ .jfcl-button.jfcl-variant-tertiary:active:not(:disabled) {
166
+ box-shadow: none;
152
167
  }
153
- .jfcl-button.jfcl-variant-text.jfcl-is-loading {
168
+ .jfcl-button.jfcl-variant-tertiary.jfcl-is-loading {
154
169
  background-color: #efe9dc;
155
170
  }
156
- .jfcl-button.jfcl-variant-text.jfcl-is-loading .jfcl-button__icon {
171
+ .jfcl-button.jfcl-variant-tertiary.jfcl-is-loading .jfcl-button__icon {
157
172
  display: block;
158
173
  animation: spin 500ms infinite linear;
159
174
  position: relative;
@@ -162,7 +177,7 @@
162
177
  border-right-color: transparent;
163
178
  border-top-color: transparent;
164
179
  }
165
- .jfcl-button.jfcl-variant-text:active(:disabled) {
180
+ .jfcl-button.jfcl-variant-tertiary:active(:disabled) {
166
181
  background-color: rgba(239, 233, 220, 0.8);
167
182
  }
168
183
  @keyframes spin {
@@ -187,7 +202,7 @@
187
202
  font-family: "Degular", Arial, Helvetica, sans-serif;
188
203
  font-style: normal;
189
204
  font-weight: 500;
190
- font-size: 1.13rem;
205
+ font-size: 1.125rem;
191
206
  line-height: 120%;
192
207
  letter-spacing: 0.54px;
193
208
  }
@@ -208,7 +223,14 @@
208
223
  left: 0;
209
224
  bottom: 0;
210
225
  }
211
- .jfcl-alert .jfcl-alert__btn {
226
+ .jfcl-alert button.jfcl-alert__btn,
227
+ .jfcl-alert a.jfcl-alert__btn {
228
+ font-family: "Degular", Arial, Helvetica, sans-serif;
229
+ font-style: normal;
230
+ font-weight: 500;
231
+ font-size: 1.125rem;
232
+ line-height: 120%;
233
+ letter-spacing: 0.54px;
212
234
  display: flex;
213
235
  background: transparent;
214
236
  padding: 0;
@@ -216,11 +238,14 @@
216
238
  margin-left: 0.5rem;
217
239
  cursor: pointer;
218
240
  font-size: 1em;
241
+ text-decoration: none;
219
242
  }
220
- .jfcl-alert .jfcl-alert__btn.jfcl-alert__btn_text {
243
+ .jfcl-alert button.jfcl-alert__btn.jfcl-alert__btn_text,
244
+ .jfcl-alert a.jfcl-alert__btn.jfcl-alert__btn_text {
221
245
  border-bottom: 1px solid;
222
246
  }
223
- .jfcl-alert .jfcl-alert__btn.jfcl-alert__btn_text:hover {
247
+ .jfcl-alert button.jfcl-alert__btn.jfcl-alert__btn_text:hover,
248
+ .jfcl-alert a.jfcl-alert__btn.jfcl-alert__btn_text:hover {
224
249
  color: #676565;
225
250
  }
226
251
  .jfcl-alert.jfcl-type-info::before {
@@ -236,10 +261,12 @@
236
261
  background-color: #242323;
237
262
  color: #faf8f4;
238
263
  }
239
- .jfcl-alert.jfcl-variant-primary .jfcl-alert__btn {
264
+ .jfcl-alert.jfcl-variant-primary button.jfcl-alert__btn,
265
+ .jfcl-alert.jfcl-variant-primary a.jfcl-alert__btn {
240
266
  color: #faf8f4;
241
267
  }
242
- .jfcl-alert.jfcl-variant-primary .jfcl-alert__btn.jfcl-alert__btn_text:hover {
268
+ .jfcl-alert.jfcl-variant-primary button.jfcl-alert__btn.jfcl-alert__btn_text:hover,
269
+ .jfcl-alert.jfcl-variant-primary a.jfcl-alert__btn.jfcl-alert__btn_text:hover {
243
270
  color: #9a9898;
244
271
  }
245
272
  .jfcl-alert.jfcl-variant-secondary {
@@ -247,7 +274,8 @@
247
274
  border: 1px solid #676565;
248
275
  color: #242323;
249
276
  }
250
- .jfcl-alert.jfcl-variant-secondary .jfcl-alert__btn {
277
+ .jfcl-alert.jfcl-variant-secondary button.jfcl-alert__btn,
278
+ .jfcl-alert.jfcl-variant-secondary a.jfcl-alert__btn {
251
279
  color: #242323;
252
280
  border-color: #242323;
253
281
  }
@@ -263,7 +291,7 @@
263
291
  font-family: "Degular", Arial, Helvetica, sans-serif;
264
292
  font-style: normal;
265
293
  font-weight: 500;
266
- font-size: 1.13rem;
294
+ font-size: 1.125rem;
267
295
  line-height: 120%;
268
296
  letter-spacing: 0.54px;
269
297
  color: #242323;
@@ -273,8 +301,5 @@
273
301
  color: #676565;
274
302
  }
275
303
  .jfcl-link .jfcl-link__icon {
276
- display: inline;
277
304
  margin-left: 10px;
278
- width: 1rem;
279
- height: 1rem;
280
305
  }
@@ -1,6 +1,8 @@
1
1
  import _extends from '@babel/runtime/helpers/extends';
2
2
  import React, { forwardRef } from 'react';
3
3
  import classNames from 'classnames';
4
+ import { faArrowRight, faSquareArrowUpRight } from '@fortawesome/free-solid-svg-icons';
5
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4
6
 
5
7
  /**
6
8
  * Accepts all `ButtonHTMLAttributes`
@@ -81,7 +83,7 @@ const IconHamburger$2 = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/Rea
81
83
  transform: "translate(1.31046 -0.00698853)"
82
84
  })))));
83
85
  IconHamburger$2.displayName = 'IconHamburger';
84
- var IconLinkExternal = IconHamburger$2;
86
+ var IconHamburger$3 = IconHamburger$2;
85
87
 
86
88
  const IconLinkInternal = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/React.createElement("svg", _extends({
87
89
  ref: ref
@@ -125,6 +127,22 @@ const IconCheck = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/React.cre
125
127
  IconCheck.displayName = 'IconCheck';
126
128
  var IconCheck$1 = IconCheck;
127
129
 
130
+ const IconCheck2 = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/React.createElement("svg", _extends({
131
+ ref: ref
132
+ }, props, {
133
+ width: "18",
134
+ height: "13",
135
+ viewBox: "0 0 18 13",
136
+ fill: "none",
137
+ xmlns: "http://www.w3.org/2000/svg"
138
+ }), /*#__PURE__*/React.createElement("path", {
139
+ d: "M1.66663 6.66671L6.33329 11.3334L16.3333 1.33337",
140
+ stroke: "#F4F8F4",
141
+ strokeWidth: "2"
142
+ })));
143
+ IconCheck2.displayName = 'IconCheck';
144
+ var IconCheck2$1 = IconCheck2;
145
+
128
146
  const IconError = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/React.createElement("svg", _extends({
129
147
  ref: ref
130
148
  }, props, {
@@ -301,17 +319,54 @@ const IconFacebook = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/React.
301
319
  IconFacebook.displayName = 'IconFacebook';
302
320
  var IconFacebook$1 = IconFacebook;
303
321
 
322
+ const Link = /*#__PURE__*/forwardRef((_ref, ref) => {
323
+ let {
324
+ icon,
325
+ children,
326
+ className,
327
+ target,
328
+ ...props
329
+ } = _ref;
330
+ const linkClassNames = classNames('jfcl-link', className);
331
+ const opensInNewTab = target === '_blank';
332
+ // When using this component within a react-router-dom <Link />, a navigate function is passed through the props us here.
333
+ // Since this navigate function is not a normal anchor element attribute we want to remove it before applying the rest of
334
+ // the props to avoid browser errors.
335
+ // Github issue talking about what's happening:
336
+ // https://github.com/remix-run/react-router/issues/6962
337
+ // Reference to react-router-dom Link component code to see what it's doing:
338
+ // https://github.com/remix-run/react-router/blob/0c058adc5b56c6d9b409af5e4d8330c645fac00c/packages/react-router-dom/modules/Link.js
339
+ delete props.navigate;
340
+ return /*#__PURE__*/React.createElement("a", _extends({}, props, {
341
+ ref: ref,
342
+ className: linkClassNames
343
+ }), children, icon === 'internal' && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
344
+ icon: faArrowRight,
345
+ className: "jfcl-link__icon"
346
+ }), icon === 'external' && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
347
+ icon: faSquareArrowUpRight,
348
+ className: "jfcl-link__icon"
349
+ }), opensInNewTab && /*#__PURE__*/React.createElement("span", {
350
+ className: "jfcl-sr-only"
351
+ }, "(Opens in a new window)"));
352
+ });
353
+ Link.displayName = 'Link';
354
+
304
355
  const Alert = /*#__PURE__*/forwardRef((_ref, ref) => {
305
356
  let {
306
357
  type = 'info',
307
358
  variant = 'primary',
308
359
  text,
309
360
  action,
361
+ actionHref,
310
362
  actionLabel,
311
363
  className,
312
364
  ...props
313
365
  } = _ref;
314
366
  const alertClassNames = classNames('jfcl-alert', "jfcl-variant-".concat(variant), "jfcl-type-".concat(type), className);
367
+ const hasAction = !!action;
368
+ const showButton = hasAction && !actionHref;
369
+ const showLink = actionLabel && actionHref;
315
370
  return /*#__PURE__*/React.createElement("div", _extends({
316
371
  ref: ref,
317
372
  "data-testid": "jfcl-alert",
@@ -324,42 +379,20 @@ const Alert = /*#__PURE__*/forwardRef((_ref, ref) => {
324
379
  }, /*#__PURE__*/React.createElement(IconError$1, null)), type === 'success' && /*#__PURE__*/React.createElement("div", {
325
380
  className: "jfcl-alert__icon",
326
381
  "data-testid": "jfcl-alert__icon"
327
- }, /*#__PURE__*/React.createElement(IconCheck$1, null)), text), !!action && /*#__PURE__*/React.createElement("button", {
382
+ }, /*#__PURE__*/React.createElement(IconCheck$1, null)), text), showButton && /*#__PURE__*/React.createElement("button", {
328
383
  className: actionLabel ? 'jfcl-alert__btn jfcl-alert__btn_text' : 'jfcl-alert__btn',
329
384
  "data-testid": "jfcl-alert__btn",
330
385
  onClick: action
331
- }, actionLabel ? actionLabel : /*#__PURE__*/React.createElement(IconClose$1, {
386
+ }, actionLabel || /*#__PURE__*/React.createElement(IconClose$1, {
332
387
  "aria-label": "Dismiss"
333
- })));
388
+ })), showLink && /*#__PURE__*/React.createElement(Link, _extends({
389
+ href: actionHref,
390
+ className: actionLabel ? 'jfcl-alert__btn jfcl-alert__btn_text' : 'jfcl-alert__btn',
391
+ "data-testid": "jfcl-alert__btn"
392
+ }, hasAction && {
393
+ onClick: action
394
+ }), actionLabel));
334
395
  });
335
396
  Alert.displayName = 'Alert';
336
397
 
337
- const Link = /*#__PURE__*/forwardRef((_ref, ref) => {
338
- let {
339
- icon,
340
- children,
341
- className,
342
- ...props
343
- } = _ref;
344
- const linkClassNames = classNames('jfcl-link', className);
345
-
346
- // When using this component within a react-router-dom <Link />, a navigate function is passed through the props us here.
347
- // Since this navigate function is not a normal anchor element attribute we want to remove it before applying the rest of
348
- // the props to avoid browser errors.
349
- // Github issue talking about what's happening:
350
- // https://github.com/remix-run/react-router/issues/6962
351
- // Reference to react-router-dom Link component code to see what it's doing:
352
- // https://github.com/remix-run/react-router/blob/0c058adc5b56c6d9b409af5e4d8330c645fac00c/packages/react-router-dom/modules/Link.js
353
- delete props.navigate;
354
- return /*#__PURE__*/React.createElement("a", _extends({}, props, {
355
- ref: ref,
356
- className: linkClassNames
357
- }), children, icon === 'internal' && /*#__PURE__*/React.createElement(IconLinkInternal$1, {
358
- className: "jfcl-link__icon"
359
- }), icon === 'external' && /*#__PURE__*/React.createElement(IconLinkExternal, {
360
- className: "jfcl-link__icon"
361
- }));
362
- });
363
- Link.displayName = 'Link';
364
-
365
- export { Alert, Button, IconCheck$1 as IconCheck, IconChevron$1 as IconChevron, IconClose$1 as IconClose, IconError$1 as IconError, IconFacebook$1 as IconFacebook, IconGlobe$1 as IconGlobe, IconHamburger$1 as IconHamburger, IconInternet$1 as IconInternet, IconLinkExternal, IconLinkInternal$1 as IconLinkInternal, IconLoading$1 as IconLoading, IconMail$1 as IconMail, IconPerson$1 as IconPerson, IconTwitter$1 as IconTwitter, Link };
398
+ export { Alert, Button, IconCheck$1 as IconCheck, IconCheck2$1 as IconCheck2, IconChevron$1 as IconChevron, IconClose$1 as IconClose, IconError$1 as IconError, IconFacebook$1 as IconFacebook, IconGlobe$1 as IconGlobe, IconHamburger$1 as IconHamburger, IconInternet$1 as IconInternet, IconHamburger$3 as IconLinkExternal, IconLinkInternal$1 as IconLinkInternal, IconLoading$1 as IconLoading, IconMail$1 as IconMail, IconPerson$1 as IconPerson, IconTwitter$1 as IconTwitter, Link };
package/dist/src/index.js CHANGED
@@ -5,6 +5,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var _extends = require('@babel/runtime/helpers/extends');
6
6
  var React = require('react');
7
7
  var classNames = require('classnames');
8
+ var freeSolidSvgIcons = require('@fortawesome/free-solid-svg-icons');
9
+ var reactFontawesome = require('@fortawesome/react-fontawesome');
8
10
 
9
11
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
12
 
@@ -91,7 +93,7 @@ const IconHamburger$2 = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE_
91
93
  transform: "translate(1.31046 -0.00698853)"
92
94
  })))));
93
95
  IconHamburger$2.displayName = 'IconHamburger';
94
- var IconLinkExternal = IconHamburger$2;
96
+ var IconHamburger$3 = IconHamburger$2;
95
97
 
96
98
  const IconLinkInternal = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement("svg", _extends__default["default"]({
97
99
  ref: ref
@@ -135,6 +137,22 @@ const IconCheck = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/Rea
135
137
  IconCheck.displayName = 'IconCheck';
136
138
  var IconCheck$1 = IconCheck;
137
139
 
140
+ const IconCheck2 = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement("svg", _extends__default["default"]({
141
+ ref: ref
142
+ }, props, {
143
+ width: "18",
144
+ height: "13",
145
+ viewBox: "0 0 18 13",
146
+ fill: "none",
147
+ xmlns: "http://www.w3.org/2000/svg"
148
+ }), /*#__PURE__*/React__default["default"].createElement("path", {
149
+ d: "M1.66663 6.66671L6.33329 11.3334L16.3333 1.33337",
150
+ stroke: "#F4F8F4",
151
+ strokeWidth: "2"
152
+ })));
153
+ IconCheck2.displayName = 'IconCheck';
154
+ var IconCheck2$1 = IconCheck2;
155
+
138
156
  const IconError = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement("svg", _extends__default["default"]({
139
157
  ref: ref
140
158
  }, props, {
@@ -311,17 +329,54 @@ const IconFacebook = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/
311
329
  IconFacebook.displayName = 'IconFacebook';
312
330
  var IconFacebook$1 = IconFacebook;
313
331
 
332
+ const Link = /*#__PURE__*/React.forwardRef((_ref, ref) => {
333
+ let {
334
+ icon,
335
+ children,
336
+ className,
337
+ target,
338
+ ...props
339
+ } = _ref;
340
+ const linkClassNames = classNames__default["default"]('jfcl-link', className);
341
+ const opensInNewTab = target === '_blank';
342
+ // When using this component within a react-router-dom <Link />, a navigate function is passed through the props us here.
343
+ // Since this navigate function is not a normal anchor element attribute we want to remove it before applying the rest of
344
+ // the props to avoid browser errors.
345
+ // Github issue talking about what's happening:
346
+ // https://github.com/remix-run/react-router/issues/6962
347
+ // Reference to react-router-dom Link component code to see what it's doing:
348
+ // https://github.com/remix-run/react-router/blob/0c058adc5b56c6d9b409af5e4d8330c645fac00c/packages/react-router-dom/modules/Link.js
349
+ delete props.navigate;
350
+ return /*#__PURE__*/React__default["default"].createElement("a", _extends__default["default"]({}, props, {
351
+ ref: ref,
352
+ className: linkClassNames
353
+ }), children, icon === 'internal' && /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
354
+ icon: freeSolidSvgIcons.faArrowRight,
355
+ className: "jfcl-link__icon"
356
+ }), icon === 'external' && /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
357
+ icon: freeSolidSvgIcons.faSquareArrowUpRight,
358
+ className: "jfcl-link__icon"
359
+ }), opensInNewTab && /*#__PURE__*/React__default["default"].createElement("span", {
360
+ className: "jfcl-sr-only"
361
+ }, "(Opens in a new window)"));
362
+ });
363
+ Link.displayName = 'Link';
364
+
314
365
  const Alert = /*#__PURE__*/React.forwardRef((_ref, ref) => {
315
366
  let {
316
367
  type = 'info',
317
368
  variant = 'primary',
318
369
  text,
319
370
  action,
371
+ actionHref,
320
372
  actionLabel,
321
373
  className,
322
374
  ...props
323
375
  } = _ref;
324
376
  const alertClassNames = classNames__default["default"]('jfcl-alert', "jfcl-variant-".concat(variant), "jfcl-type-".concat(type), className);
377
+ const hasAction = !!action;
378
+ const showButton = hasAction && !actionHref;
379
+ const showLink = actionLabel && actionHref;
325
380
  return /*#__PURE__*/React__default["default"].createElement("div", _extends__default["default"]({
326
381
  ref: ref,
327
382
  "data-testid": "jfcl-alert",
@@ -334,47 +389,26 @@ const Alert = /*#__PURE__*/React.forwardRef((_ref, ref) => {
334
389
  }, /*#__PURE__*/React__default["default"].createElement(IconError$1, null)), type === 'success' && /*#__PURE__*/React__default["default"].createElement("div", {
335
390
  className: "jfcl-alert__icon",
336
391
  "data-testid": "jfcl-alert__icon"
337
- }, /*#__PURE__*/React__default["default"].createElement(IconCheck$1, null)), text), !!action && /*#__PURE__*/React__default["default"].createElement("button", {
392
+ }, /*#__PURE__*/React__default["default"].createElement(IconCheck$1, null)), text), showButton && /*#__PURE__*/React__default["default"].createElement("button", {
338
393
  className: actionLabel ? 'jfcl-alert__btn jfcl-alert__btn_text' : 'jfcl-alert__btn',
339
394
  "data-testid": "jfcl-alert__btn",
340
395
  onClick: action
341
- }, actionLabel ? actionLabel : /*#__PURE__*/React__default["default"].createElement(IconClose$1, {
396
+ }, actionLabel || /*#__PURE__*/React__default["default"].createElement(IconClose$1, {
342
397
  "aria-label": "Dismiss"
343
- })));
398
+ })), showLink && /*#__PURE__*/React__default["default"].createElement(Link, _extends__default["default"]({
399
+ href: actionHref,
400
+ className: actionLabel ? 'jfcl-alert__btn jfcl-alert__btn_text' : 'jfcl-alert__btn',
401
+ "data-testid": "jfcl-alert__btn"
402
+ }, hasAction && {
403
+ onClick: action
404
+ }), actionLabel));
344
405
  });
345
406
  Alert.displayName = 'Alert';
346
407
 
347
- const Link = /*#__PURE__*/React.forwardRef((_ref, ref) => {
348
- let {
349
- icon,
350
- children,
351
- className,
352
- ...props
353
- } = _ref;
354
- const linkClassNames = classNames__default["default"]('jfcl-link', className);
355
-
356
- // When using this component within a react-router-dom <Link />, a navigate function is passed through the props us here.
357
- // Since this navigate function is not a normal anchor element attribute we want to remove it before applying the rest of
358
- // the props to avoid browser errors.
359
- // Github issue talking about what's happening:
360
- // https://github.com/remix-run/react-router/issues/6962
361
- // Reference to react-router-dom Link component code to see what it's doing:
362
- // https://github.com/remix-run/react-router/blob/0c058adc5b56c6d9b409af5e4d8330c645fac00c/packages/react-router-dom/modules/Link.js
363
- delete props.navigate;
364
- return /*#__PURE__*/React__default["default"].createElement("a", _extends__default["default"]({}, props, {
365
- ref: ref,
366
- className: linkClassNames
367
- }), children, icon === 'internal' && /*#__PURE__*/React__default["default"].createElement(IconLinkInternal$1, {
368
- className: "jfcl-link__icon"
369
- }), icon === 'external' && /*#__PURE__*/React__default["default"].createElement(IconLinkExternal, {
370
- className: "jfcl-link__icon"
371
- }));
372
- });
373
- Link.displayName = 'Link';
374
-
375
408
  exports.Alert = Alert;
376
409
  exports.Button = Button;
377
410
  exports.IconCheck = IconCheck$1;
411
+ exports.IconCheck2 = IconCheck2$1;
378
412
  exports.IconChevron = IconChevron$1;
379
413
  exports.IconClose = IconClose$1;
380
414
  exports.IconError = IconError$1;
@@ -382,7 +416,7 @@ exports.IconFacebook = IconFacebook$1;
382
416
  exports.IconGlobe = IconGlobe$1;
383
417
  exports.IconHamburger = IconHamburger$1;
384
418
  exports.IconInternet = IconInternet$1;
385
- exports.IconLinkExternal = IconLinkExternal;
419
+ exports.IconLinkExternal = IconHamburger$3;
386
420
  exports.IconLinkInternal = IconLinkInternal$1;
387
421
  exports.IconLoading = IconLoading$1;
388
422
  exports.IconMail = IconMail$1;
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import './styles.scss';
3
+ export interface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {
4
+ labelText: string;
5
+ headerText?: string;
6
+ helperText?: string;
7
+ invalid?: boolean;
8
+ invalidText?: string;
9
+ className?: string;
10
+ disabled?: boolean;
11
+ id: string;
12
+ }
13
+ /**
14
+ * Accepts all `InputHTMLAttributes`
15
+ */
16
+ export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import './styles.scss';
3
+ export interface FormGroupProps extends React.FieldsetHTMLAttributes<HTMLFieldSetElement> {
4
+ legendText: string;
5
+ helperText?: string;
6
+ invalid?: boolean;
7
+ invalidText?: string;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Accepts all `HTMLFieldSetElement`
12
+ */
13
+ export declare const FormGroup: React.ForwardRefExoticComponent<FormGroupProps & React.RefAttributes<HTMLFieldSetElement>>;
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import './style.scss';
3
+ export interface InputHeaderProps {
4
+ className?: string;
5
+ headerText?: string;
6
+ labelFor?: string;
7
+ isLegend?: boolean;
8
+ helperText?: string;
9
+ invalidText?: string;
10
+ invalid?: boolean;
11
+ }
12
+ export declare const InputHeader: React.FC<InputHeaderProps>;
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import './styles.scss';
3
+ export interface RadioButtonProps extends React.InputHTMLAttributes<HTMLInputElement> {
4
+ labelText: string;
5
+ headerText?: string;
6
+ helperText?: string;
7
+ invalid?: boolean;
8
+ invalidText?: string;
9
+ className?: string;
10
+ disabled?: boolean;
11
+ id: string;
12
+ }
13
+ /**
14
+ * Accepts all `InputHTMLAttributes`
15
+ */
16
+ export declare const RadioButton: React.ForwardRefExoticComponent<RadioButtonProps & React.RefAttributes<HTMLInputElement>>;
@@ -8,6 +8,7 @@ export interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
8
8
  text: string;
9
9
  className?: string;
10
10
  action?: () => void;
11
+ actionHref?: string;
11
12
  actionLabel?: string;
12
13
  }
13
14
  export declare const Alert: React.ForwardRefExoticComponent<AlertProps & React.RefAttributes<HTMLDivElement>>;
@@ -3,7 +3,7 @@ import './styles.scss';
3
3
  export interface ButtonProps extends React.ComponentPropsWithoutRef<'button'> {
4
4
  labelText: string;
5
5
  labelIcon?: React.ElementType;
6
- variant?: 'primary' | 'secondary' | 'text';
6
+ variant?: 'primary' | 'secondary' | 'tertiary';
7
7
  size?: 'small' | 'large';
8
8
  loading?: boolean;
9
9
  iconOnRight?: boolean;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const IconCheck2: React.ForwardRefExoticComponent<React.SVGAttributes<SVGSVGElement> & React.RefAttributes<SVGSVGElement>>;
3
+ export default IconCheck2;
@@ -2,6 +2,7 @@ import IconLoading from './Loading';
2
2
  import IconLinkExternal from './LinkExternal';
3
3
  import IconLinkInternal from './LinkInternal';
4
4
  import IconCheck from './Check';
5
+ import IconCheck2 from './Check2';
5
6
  import IconError from './Error';
6
7
  import IconChevron from './Chevron';
7
8
  import IconClose from './Close';
@@ -12,4 +13,4 @@ import IconPerson from './Person';
12
13
  import IconTwitter from './Twitter';
13
14
  import IconMail from './Mail';
14
15
  import IconFacebook from './Facebook';
15
- export { IconLoading, IconLinkExternal, IconLinkInternal, IconCheck, IconError, IconTwitter, IconChevron, IconClose, IconGlobe, IconHamburger, IconInternet, IconPerson, IconMail, IconFacebook, };
16
+ export { IconLoading, IconLinkExternal, IconLinkInternal, IconCheck, IconCheck2, IconError, IconTwitter, IconChevron, IconClose, IconGlobe, IconHamburger, IconInternet, IconPerson, IconMail, IconFacebook, };
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { HTMLAttributeAnchorTarget } from 'react';
2
2
  import './styles.scss';
3
3
  export type LinkIcon = 'internal' | 'external';
4
4
  export interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
@@ -6,5 +6,6 @@ export interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>
6
6
  className?: string;
7
7
  children: React.ReactNode;
8
8
  navigate?: () => void;
9
+ target?: HTMLAttributeAnchorTarget;
9
10
  }
10
11
  export declare const Link: React.ForwardRefExoticComponent<LinkProps & React.RefAttributes<HTMLAnchorElement>>;
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import './styles.scss';
3
+ export interface TextInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
4
+ labelText: string;
5
+ id: string;
6
+ size?: 'small' | 'medium' | 'large';
7
+ helperText?: string;
8
+ invalid?: boolean;
9
+ invalidText?: string;
10
+ className?: string;
11
+ type?: string;
12
+ }
13
+ /**
14
+ * Accepts all `InputHTMLAttributes`
15
+ */
16
+ export declare const TextInput: React.ForwardRefExoticComponent<TextInputProps & React.RefAttributes<HTMLInputElement>>;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@justfixnyc/component-library",
3
3
  "description": "JustFix Component Library",
4
4
  "license": "MIT",
5
- "version": "0.32.2",
5
+ "version": "0.34.0",
6
6
  "main": "dist/src/index.js",
7
7
  "module": "dist/src/index.es.js",
8
8
  "files": [
@@ -28,7 +28,10 @@
28
28
  "jackspeak": "2.1.1"
29
29
  },
30
30
  "dependencies": {
31
- "@babel/runtime": "^7.12.5"
31
+ "@babel/runtime": "^7.12.5",
32
+ "@fortawesome/fontawesome-svg-core": "^6.5.1",
33
+ "@fortawesome/free-solid-svg-icons": "^6.5.1",
34
+ "@fortawesome/react-fontawesome": "^0.2.0"
32
35
  },
33
36
  "peerDependencies": {
34
37
  "@lingui/cli": ">=2.9.1",