@thecb/components 11.11.0-beta.0 → 11.11.0-beta.10

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 (36) hide show
  1. package/README.md +8 -4
  2. package/dist/index.cjs.js +221 -113
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.esm.js +221 -113
  5. package/dist/index.esm.js.map +1 -1
  6. package/package.json +1 -1
  7. package/src/components/atoms/card-type/CardType.js +10 -2
  8. package/src/components/atoms/dropdown/Dropdown.js +2 -3
  9. package/src/components/atoms/dropdown/DropdownIcon.js +1 -0
  10. package/src/components/atoms/dropdown/DropdownIconV2.js +1 -0
  11. package/src/components/atoms/form-layouts/FormInput.js +9 -16
  12. package/src/components/atoms/formatted-bank-account/FormattedBankAccount.js +2 -2
  13. package/src/components/atoms/formatted-bank-account/FormattedBankAccount.theme.js +2 -2
  14. package/src/components/atoms/formatted-credit-card/FormattedCreditCard.js +12 -9
  15. package/src/components/atoms/formatted-credit-card/FormattedCreditCard.theme.js +2 -2
  16. package/src/components/atoms/icons/AmExSmallIcon.js +2 -0
  17. package/src/components/atoms/icons/DiscoverSmallIcon.js +2 -0
  18. package/src/components/atoms/icons/GenericCardLarge.js +1 -1
  19. package/src/components/atoms/icons/GenericSmallIcon.js +2 -0
  20. package/src/components/atoms/icons/MasterCardSmallIcon.js +2 -0
  21. package/src/components/atoms/icons/VisaSmallIcon.js +2 -0
  22. package/src/components/molecules/editable-list/EditableList.js +3 -0
  23. package/src/components/molecules/email-form/EmailForm.js +2 -1
  24. package/src/components/molecules/email-form/EmailForm.stories.js +210 -0
  25. package/src/components/molecules/forgot-password-form/ForgotPasswordForm.js +2 -1
  26. package/src/components/molecules/login-form/LoginForm.js +2 -1
  27. package/src/components/molecules/radio-section/InnerRadioSection.js +3 -3
  28. package/src/components/molecules/radio-section/RadioSection.stories.js +142 -0
  29. package/src/components/molecules/registration-form/RegistrationForm.js +2 -1
  30. package/src/components/molecules/terms-and-conditions-modal/TermsAndConditionsModal.js +1 -1
  31. package/src/components/molecules/terms-and-conditions-modal/TermsAndConditionsModal.stories.js +110 -0
  32. package/src/components/molecules/tooltip/Tooltip.js +150 -66
  33. package/src/components/molecules/tooltip/Tooltip.stories.js +44 -16
  34. package/src/components/molecules/tooltip/Tooltip.theme.js +10 -9
  35. package/src/components/molecules/tooltip/index.d.ts +5 -2
  36. package/src/util/formats.js +6 -3
package/README.md CHANGED
@@ -11,8 +11,6 @@ This library contains CityBase React components for use across all current and f
11
11
  - [Storybook deployment](#storybook-deployment)
12
12
  - [Adding new components](#adding-new-components)
13
13
  - [Version bumping and publishing](#version-bumping-and-publishing)
14
- - [Version bumping](#version-bumping)
15
- - [Publishing new versions to NPM](#publishing-new-versions-to-npm)
16
14
  - [Consuming in your application](#consuming-in-your-application)
17
15
 
18
16
  - [Adding to existing application](#adding-to-existing-application)
@@ -104,9 +102,15 @@ export * from "./button-with-action";
104
102
 
105
103
  ## Version bumping and publishing
106
104
 
107
- ### Version bumping and Publishing to NPM
105
+ Publishing to NPM is automated. When a PR is merged to master, the package will automatically be built and published to NPM using the version specified in `package.json`. **Developers no longer need to manually run `yarn build && yarn publish`.**
108
106
 
109
- - Authors of PRs are responsible for bumping the version of the package prior to merging an approved PR to master. Once your pending PR has been approved, before merging to master, run `yarn build && yarn publish` in the main directory to create and publish a new build to NPM. This step should happen immediately before you merge your PR to master, to minimize conflicts between built versions.
107
+ ### How it works
108
+
109
+ 1. Before merging your PR, bump the version in `package.json` to an appropriate new version following semantic versioning (see below).
110
+ 2. Ensure the version you set has **not already been published** to NPM. If you merge a PR with a version that has already been published, the automated publish will fail and you will need to create a follow-up PR that bumps the version to an unpublished one.
111
+ 3. Merge your PR to master. The CI pipeline will automatically build and publish the new version.
112
+
113
+ ### Semantic versioning
110
114
 
111
115
  - CB Components follows semantic versioning practices, which divides version upgrades into three categories: "Patch" (e.g., `6.0.1` -> `6.0.2`), "Minor" (e.g., `6.0.2` -> `6.1.0`), and "Major" (e.g., `6.1.0` -> `7.0.0`)
112
116
 
package/dist/index.cjs.js CHANGED
@@ -15822,7 +15822,7 @@ var GenericCardLarge = function GenericCardLarge() {
15822
15822
  fill: "none",
15823
15823
  xmlns: "http://www.w3.org/2000/svg",
15824
15824
  role: "img",
15825
- "aria-label": "Card Payment"
15825
+ "aria-label": "Credit card"
15826
15826
  }, /*#__PURE__*/React__default.createElement("rect", {
15827
15827
  width: "36",
15828
15828
  height: "24",
@@ -18700,7 +18700,9 @@ var VisaSmallIcon = function VisaSmallIcon() {
18700
18700
  height: "16",
18701
18701
  viewBox: "0 0 24 16",
18702
18702
  fill: "none",
18703
- xmlns: "http://www.w3.org/2000/svg"
18703
+ xmlns: "http://www.w3.org/2000/svg",
18704
+ role: "img",
18705
+ "aria-label": "Visa"
18704
18706
  }, /*#__PURE__*/React__default.createElement("path", {
18705
18707
  fillRule: "evenodd",
18706
18708
  clipRule: "evenodd",
@@ -18727,7 +18729,9 @@ var AmExSmallIcon = function AmExSmallIcon() {
18727
18729
  height: "16",
18728
18730
  viewBox: "0 0 24 16",
18729
18731
  fill: "none",
18730
- xmlns: "http://www.w3.org/2000/svg"
18732
+ xmlns: "http://www.w3.org/2000/svg",
18733
+ role: "img",
18734
+ "aria-label": "American Express"
18731
18735
  }, /*#__PURE__*/React__default.createElement("g", {
18732
18736
  clipPath: "url(#clip0_3693_1095)"
18733
18737
  }, /*#__PURE__*/React__default.createElement("g", {
@@ -18826,7 +18830,9 @@ var DiscoverSmallIcon = function DiscoverSmallIcon() {
18826
18830
  height: "16",
18827
18831
  viewBox: "0 0 24 16",
18828
18832
  fill: "none",
18829
- xmlns: "http://www.w3.org/2000/svg"
18833
+ xmlns: "http://www.w3.org/2000/svg",
18834
+ role: "img",
18835
+ "aria-label": "Discover"
18830
18836
  }, /*#__PURE__*/React__default.createElement("g", {
18831
18837
  clipPath: "url(#clip0_3818_267)"
18832
18838
  }, /*#__PURE__*/React__default.createElement("path", {
@@ -18951,7 +18957,9 @@ var GenericSmallIcon = function GenericSmallIcon() {
18951
18957
  height: "16",
18952
18958
  viewBox: "0 0 24 16",
18953
18959
  fill: "none",
18954
- xmlns: "http://www.w3.org/2000/svg"
18960
+ xmlns: "http://www.w3.org/2000/svg",
18961
+ role: "img",
18962
+ "aria-label": "Credit card"
18955
18963
  }, /*#__PURE__*/React__default.createElement("rect", {
18956
18964
  width: "24",
18957
18965
  height: "16",
@@ -18972,7 +18980,9 @@ var MasterCardSmallIcon = function MasterCardSmallIcon() {
18972
18980
  height: "16",
18973
18981
  viewBox: "0 0 24 16",
18974
18982
  fill: "none",
18975
- xmlns: "http://www.w3.org/2000/svg"
18983
+ xmlns: "http://www.w3.org/2000/svg",
18984
+ role: "img",
18985
+ "aria-label": "Mastercard"
18976
18986
  }, /*#__PURE__*/React__default.createElement("rect", {
18977
18987
  width: "24",
18978
18988
  height: "16",
@@ -22623,6 +22633,7 @@ var SortableTableHeading$1 = themeComponent(SortableTableHeading, "SortableTable
22623
22633
 
22624
22634
  var DropdownIcon = function DropdownIcon() {
22625
22635
  return /*#__PURE__*/React__default.createElement("svg", {
22636
+ "aria-hidden": "true",
22626
22637
  version: "1.2",
22627
22638
  xmlns: "http://www.w3.org/2000/svg",
22628
22639
  overflow: "visible",
@@ -23972,7 +23983,7 @@ var IconWrapper = styled__default.div.withConfig({
23972
23983
  var DropdownContentWrapper = styled__default.div.withConfig({
23973
23984
  displayName: "Dropdown__DropdownContentWrapper",
23974
23985
  componentId: "sc-pn6m0h-1"
23975
- })(["transform-origin:0 0;border:1px solid ", ";border-radius:2px;background-color:", ";padding:8px 0 8px;position:absolute;width:", ";min-width:100%;max-height:", ";overflow-y:scroll;z-index:1;box-sizing:border-box;&:focus{outline:none;}ul{padding-left:0;}"], GREY_CHATEAU, WHITE, function (_ref2) {
23986
+ })(["transform-origin:0 0;border:1px solid ", ";border-radius:2px;background-color:", ";padding:8px 0 8px;position:absolute;width:", ";min-width:100%;max-height:", ";overflow-y:scroll;z-index:1;box-sizing:border-box;&:focus{outline:none;}ul{padding-left:0;}"], STORM_GREY, WHITE, function (_ref2) {
23976
23987
  var widthFitOptions = _ref2.widthFitOptions;
23977
23988
  return widthFitOptions ? "fit-content" : "100%";
23978
23989
  }, function (_ref3) {
@@ -24277,7 +24288,7 @@ var Dropdown = function Dropdown(_ref13) {
24277
24288
  background: isOpen ? themeValues.hoverColor : WHITE,
24278
24289
  borderRadius: "2px",
24279
24290
  borderSize: "1px",
24280
- borderColor: isError ? ERROR_COLOR : isOpen ? themeValues.selectedColor : GREY_CHATEAU,
24291
+ borderColor: isError ? ERROR_COLOR : isOpen ? themeValues.selectedColor : STORM_GREY,
24281
24292
  dataQa: placeholder,
24282
24293
  extraStyles: disabled ? "".concat(inputPlaceholderTextStyle).concat(inputDisabledStyle) : inputPlaceholderTextStyle,
24283
24294
  hoverStyles: "background-color: ".concat(themeValues.hoverColor, ";"),
@@ -25935,7 +25946,8 @@ var FormInput = function FormInput(_ref15) {
25935
25946
  minWidth: "100%"
25936
25947
  }, /*#__PURE__*/React__default.createElement(Cluster, {
25937
25948
  justify: "space-between",
25938
- align: "center"
25949
+ align: "center",
25950
+ overflow: true
25939
25951
  }, labelDisplayOverride ? labelDisplayOverride : /*#__PURE__*/React__default.createElement(Text$1, {
25940
25952
  as: "label",
25941
25953
  color: themeValues.labelColor,
@@ -25943,22 +25955,16 @@ var FormInput = function FormInput(_ref15) {
25943
25955
  fontWeight: themeValues.fontWeight,
25944
25956
  extraStyles: "word-break: break-word;\n font-family: Public Sans;\n &::first-letter {\n text-transform: uppercase;\n }",
25945
25957
  id: createIdFromString(labelTextWhenNoError)
25946
- }, labelTextWhenNoError), type === "password" && /*#__PURE__*/React__default.createElement(Text$1, {
25947
- variant: labelTextVariant,
25948
- color: themeValues.linkColor,
25949
- weight: themeValues.fontWeight,
25950
- hoverStyles: themeValues.hoverFocusStyles,
25951
- extraStyles: "text-decoration: underline; cursor: pointer; &:focus { outline-offset: -2px; }",
25952
- onClick: function onClick() {
25958
+ }, labelTextWhenNoError), type === "password" && /*#__PURE__*/React__default.createElement(ButtonWithAction, {
25959
+ variant: "smallGhost",
25960
+ text: showPassword ? "Hide" : "Show",
25961
+ action: function action() {
25953
25962
  return setShowPassword(!showPassword);
25954
25963
  },
25955
- tabIndex: "0",
25956
25964
  "aria-label": showPassword ? "Hide Password" : "Show password",
25957
- "aria-live": "polite",
25958
- onKeyPress: function onKeyPress(e) {
25959
- return e.key === "Enter" && setShowPassword(!showPassword);
25960
- }
25961
- }, showPassword ? "Hide" : "Show"), isMobile && decorator && /*#__PURE__*/React__default.createElement(Box, {
25965
+ extraStyles: "margin: 0; min-width: auto;",
25966
+ textExtraStyles: "color: ".concat(themeValues.linkColor, ";")
25967
+ }), isMobile && decorator && /*#__PURE__*/React__default.createElement(Box, {
25962
25968
  padding: "0 0 0 auto"
25963
25969
  }, decorator)))), /*#__PURE__*/React__default.createElement(Box, {
25964
25970
  padding: "0"
@@ -26298,7 +26304,7 @@ var FormattedAddress = function FormattedAddress(_ref) {
26298
26304
  var FormattedAddress$1 = themeComponent(FormattedAddress, "FormattedAddress", fallbackValues$n, "default");
26299
26305
 
26300
26306
  var textColor$1 = "".concat(CHARADE_GREY);
26301
- var autopayTextColor = "".concat(REGENT_GREY);
26307
+ var autopayTextColor = "".concat(SEA_GREEN);
26302
26308
  var fallbackValues$o = {
26303
26309
  textColor: textColor$1,
26304
26310
  autopayTextColor: autopayTextColor
@@ -26334,8 +26340,8 @@ var FormattedBankAccount = function FormattedBankAccount(_ref2) {
26334
26340
  }, "Savings Account ending in ", lastFour), autoPay && /*#__PURE__*/React__default.createElement(Text$1, {
26335
26341
  variant: "p",
26336
26342
  color: themeValues.autopayTextColor,
26337
- extraStyles: "font-style: italic;"
26338
- }, "Autopay Enabled")));
26343
+ extraStyles: "font-style: italic; font-size: .75rem;"
26344
+ }, "Autopay On")));
26339
26345
  };
26340
26346
  var FormattedBankAccount$1 = themeComponent(FormattedBankAccount, "FormattedBankAccount", fallbackValues$o);
26341
26347
 
@@ -26366,21 +26372,25 @@ var cardBrands = {
26366
26372
  large: GenericCardLarge
26367
26373
  }
26368
26374
  };
26375
+ var normalizeType = function normalizeType(type) {
26376
+ if (!type) return undefined;
26377
+ var lower = type.toLowerCase();
26378
+ if (lower === "mastercard") return "master_card";
26379
+ return lower;
26380
+ };
26369
26381
  var CardType = function CardType(_ref) {
26370
26382
  var type = _ref.type,
26371
26383
  _ref$size = _ref.size,
26372
26384
  size = _ref$size === void 0 ? "small" : _ref$size;
26373
- var _ref2 = cardBrands[type] || cardBrands["default"],
26385
+ var normalizedType = normalizeType(type);
26386
+ var _ref2 = cardBrands[normalizedType] || cardBrands["default"],
26374
26387
  label = _ref2.label,
26375
26388
  IconComponent = _ref2[size];
26376
- return /*#__PURE__*/React__default.createElement("span", {
26377
- role: "img",
26378
- "aria-label": label
26379
- }, /*#__PURE__*/React__default.createElement(IconComponent, null));
26389
+ return /*#__PURE__*/React__default.createElement("span", null, /*#__PURE__*/React__default.createElement(IconComponent, null));
26380
26390
  };
26381
26391
 
26382
26392
  var textColor$2 = "".concat(CHARADE_GREY);
26383
- var autopayTextColor$1 = "".concat(REGENT_GREY);
26393
+ var autopayTextColor$1 = "".concat(SEA_GREEN);
26384
26394
  var fallbackValues$p = {
26385
26395
  textColor: textColor$2,
26386
26396
  autopayTextColor: autopayTextColor$1
@@ -26409,13 +26419,15 @@ var renderCardStatus = function renderCardStatus(expirationStatus, expireDate) {
26409
26419
  return /*#__PURE__*/React__default.createElement(Text$1, {
26410
26420
  as: as,
26411
26421
  variant: "pXS",
26412
- color: ASH_GREY,
26422
+ fontSize: ".75rem",
26423
+ color: STORM_GREY,
26413
26424
  extraStyles: "text-align: ".concat(textAlign, "; margin: ").concat(textMargin, ";")
26414
26425
  }, "Exp Date ", expireDate);
26415
26426
  case EXPIRING_SOON:
26416
26427
  return /*#__PURE__*/React__default.createElement(Text$1, {
26417
26428
  as: as,
26418
26429
  variant: "pXS",
26430
+ fontSize: ".75rem",
26419
26431
  color: FIRE_YELLOW,
26420
26432
  extraStyles: "text-align: ".concat(textAlign, "; margin: ").concat(textMargin, ";")
26421
26433
  }, "Expiring Soon ", expireDate);
@@ -26423,7 +26435,8 @@ var renderCardStatus = function renderCardStatus(expirationStatus, expireDate) {
26423
26435
  return /*#__PURE__*/React__default.createElement(Text$1, {
26424
26436
  as: as,
26425
26437
  variant: "pXS",
26426
- color: ASH_GREY,
26438
+ fontSize: ".75rem",
26439
+ color: STORM_GREY,
26427
26440
  extraStyles: "text-align: ".concat(textAlign, "; margin: ").concat(textMargin, ";")
26428
26441
  }, "Expired");
26429
26442
  }
@@ -26450,7 +26463,7 @@ var CreditCardWrapper = styled__default.div.withConfig({
26450
26463
  var CCIconWrapper = styled__default.div.withConfig({
26451
26464
  displayName: "FormattedCreditCard__CCIconWrapper",
26452
26465
  componentId: "sc-s0ta5l-1"
26453
- })(["margin-right:16px;width:30px;height:auto;display:flex;"]);
26466
+ })(["margin-right:16px;width:36px;height:auto;display:flex;"]);
26454
26467
  var FormattedCreditCard = function FormattedCreditCard(_ref) {
26455
26468
  var lastFour = _ref.lastFour,
26456
26469
  type = _ref.type,
@@ -26458,23 +26471,26 @@ var FormattedCreditCard = function FormattedCreditCard(_ref) {
26458
26471
  expireDate = _ref.expireDate,
26459
26472
  expirationStatus = _ref.expirationStatus,
26460
26473
  themeValues = _ref.themeValues;
26474
+ var _useContext = React.useContext(styled.ThemeContext),
26475
+ isMobile = _useContext.isMobile;
26461
26476
  return /*#__PURE__*/React__default.createElement(CreditCardWrapper, null, /*#__PURE__*/React__default.createElement(CCIconWrapper, null, /*#__PURE__*/React__default.createElement(CardType, {
26462
- type: type
26477
+ type: type,
26478
+ size: isMobile ? "small" : "large"
26463
26479
  })), /*#__PURE__*/React__default.createElement(Stack, {
26464
26480
  childGap: "0"
26465
26481
  }, /*#__PURE__*/React__default.createElement(Box, {
26466
26482
  padding: "0"
26467
26483
  }, /*#__PURE__*/React__default.createElement(Text$1, {
26468
26484
  variant: "p",
26469
- padding: "0 0 0 8px",
26485
+ padding: "0",
26470
26486
  color: themeValues.textColor,
26471
26487
  textAlign: "left",
26472
26488
  extraStyles: "display: inline-block;"
26473
26489
  }, "Card ending in ".concat(lastFour)), expireDate && /*#__PURE__*/React__default.createElement(React.Fragment, null, renderCardStatus(expirationStatus, expireDate, "left", "p"))), autoPay && /*#__PURE__*/React__default.createElement(Text$1, {
26474
26490
  variant: "p",
26475
26491
  color: themeValues.autopayTextColor,
26476
- extraStyles: "font-style: italic;"
26477
- }, "Autopay Enabled")));
26492
+ extraStyles: "font-style: italic; font-size: .75rem;"
26493
+ }, "Autopay On")));
26478
26494
  };
26479
26495
  var FormattedCreditCard$1 = themeComponent(FormattedCreditCard, "FormattedCreditCard", fallbackValues$p);
26480
26496
 
@@ -40880,6 +40896,7 @@ var EditableList = function EditableList(_ref) {
40880
40896
  _ref$canAdd = _ref.canAdd,
40881
40897
  canAdd = _ref$canAdd === void 0 ? true : _ref$canAdd,
40882
40898
  addItem = _ref.addItem,
40899
+ addItemDestination = _ref.addItemDestination,
40883
40900
  removeItem = _ref.removeItem,
40884
40901
  editItem = _ref.editItem,
40885
40902
  itemName = _ref.itemName,
@@ -40987,6 +41004,8 @@ var EditableList = function EditableList(_ref) {
40987
41004
  padding: items.length === 0 ? "0" : "1rem 0 0"
40988
41005
  }, /*#__PURE__*/React__default.createElement(Placeholder$1, {
40989
41006
  text: addText,
41007
+ isLink: !!addItemDestination,
41008
+ destination: addItemDestination,
40990
41009
  action: addItem,
40991
41010
  dataQa: "Add " + qaPrefix,
40992
41011
  "aria-label": addText,
@@ -41157,7 +41176,7 @@ var EmailForm = function EmailForm(_ref) {
41157
41176
  }, []);
41158
41177
  }
41159
41178
  useConditionallyAddValidator(isRequired, required, actions.fields.email.addValidator, actions.fields.email.removeValidator);
41160
- var emailFieldErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email address is required"), isProbablyEmail.error, "Invalid email address");
41179
+ var emailFieldErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email address is required"), isProbablyEmail.error, "Please enter a valid email address in the format user@example.com");
41161
41180
  return /*#__PURE__*/React__default.createElement(FormContainer$1, {
41162
41181
  variant: variant,
41163
41182
  role: "form",
@@ -41249,7 +41268,7 @@ var ForgotPasswordForm = function ForgotPasswordForm(_ref) {
41249
41268
  };
41250
41269
  }, []);
41251
41270
  }
41252
- var EmailErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email address is required"), isProbablyEmail.error, "Email address is not valid");
41271
+ var EmailErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email address is required"), isProbablyEmail.error, "Please enter a valid email address in the format user@example.com");
41253
41272
  return /*#__PURE__*/React__default.createElement(FormInput$1, {
41254
41273
  labelTextWhenNoError: "Email address",
41255
41274
  errorMessages: EmailErrorMessages,
@@ -45948,7 +45967,7 @@ var LoginForm = function LoginForm(_ref) {
45948
45967
  };
45949
45968
  }, []);
45950
45969
  }
45951
- var emailErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email address is required"), isProbablyEmail.error, "Invalid email address");
45970
+ var emailErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email address is required"), isProbablyEmail.error, "Please enter a valid email address in the format user@example.com");
45952
45971
  var passwordErrorMessages = _defineProperty({}, required.error, "Password is required");
45953
45972
  return /*#__PURE__*/React__default.createElement(FormInputColumn, {
45954
45973
  role: "form",
@@ -48076,7 +48095,7 @@ var TermsAndConditionsModal = function TermsAndConditionsModal(_ref) {
48076
48095
  weight: themeValues.fontWeight,
48077
48096
  hoverStyles: themeValues.modalLinkHoverFocus,
48078
48097
  textDecoration: themeValues.modalLinkTextDecoration,
48079
- extraStyles: "display: inline-block; width: fit-content; cursor: pointer",
48098
+ extraStyles: "display: inline-block; width: fit-content; cursor: pointer; min-height: 24px; line-height: 24px;",
48080
48099
  role: "button" // This should always be a "button" since it opens a modal
48081
48100
  ,
48082
48101
  className: "modal-trigger"
@@ -48915,10 +48934,10 @@ var InnerRadioSection = function InnerRadioSection(_ref) {
48915
48934
  componentId: "sc-1wtp6qc-0"
48916
48935
  })(["height:", ";width:", ";", " transition:opacity 0.3s ease;"], function (_ref2) {
48917
48936
  var isMobile = _ref2.isMobile;
48918
- return isMobile ? "14px" : "18px";
48937
+ return isMobile ? "16px" : "24px";
48919
48938
  }, function (_ref3) {
48920
48939
  var isMobile = _ref3.isMobile;
48921
- return isMobile ? "22px" : "28px";
48940
+ return isMobile ? "24px" : "36px";
48922
48941
  }, function (_ref4) {
48923
48942
  var fade = _ref4.fade;
48924
48943
  return fade && "opacity: 0.4;";
@@ -48990,7 +49009,7 @@ var InnerRadioSection = function InnerRadioSection(_ref) {
48990
49009
  padding: section.titleIcon ? "0 0 0 8px" : "0"
48991
49010
  }, /*#__PURE__*/React__default.createElement(Text$1, {
48992
49011
  as: "label",
48993
- htmlFor: "radio-input-".concat(idString(section)),
49012
+ htmlFor: "radio-".concat(idString(section)),
48994
49013
  color: CHARADE_GREY
48995
49014
  }, section.title))), section.rightIcons && /*#__PURE__*/React__default.createElement(Cluster, {
48996
49015
  id: "right-icons-".concat(idString(section)),
@@ -49321,7 +49340,7 @@ var RegistrationForm = function RegistrationForm(_ref) {
49321
49340
  }
49322
49341
  var firstNameErrorMessages = _defineProperty(_defineProperty({}, required.error, "First name is required"), validName.error, "First name contains invalid characters");
49323
49342
  var lastNameErrorMessages = _defineProperty(_defineProperty({}, required.error, "Last name is required"), validName.error, "Last name contains invalid characters");
49324
- var emailErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email is required"), isProbablyEmail.error, "Invalid email address");
49343
+ var emailErrorMessages = _defineProperty(_defineProperty({}, required.error, "Email is required"), isProbablyEmail.error, "Please enter a valid email address in the format user@example.com");
49325
49344
  var passwordErrorMessages = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, required.error, "Password is required"), hasLength.error, "Password must have at least 8 characters"), hasNumber.error, "Password must contain at least one number"), hasLowercaseLetter.error, "Password must contain at least one lowercase letter"), hasUppercaseLetter.error, "Password must contain at least one uppercase letter"), hasSpecialCharacter.error, "Password must contain at least one special character (!@#$%^&*.?)");
49326
49345
  var confirmPasswordErrorMessages = _defineProperty({}, matchesField.error, "Confirm password must match password");
49327
49346
  return /*#__PURE__*/React__default.createElement(FormInputColumn, {
@@ -50270,6 +50289,7 @@ var DropdownIconV2 = function DropdownIconV2(_ref) {
50270
50289
  color = _ref$color === void 0 ? "#292A33" : _ref$color,
50271
50290
  props = _objectWithoutProperties(_ref, _excluded$Q);
50272
50291
  return /*#__PURE__*/React__default.createElement("svg", _extends({
50292
+ "aria-hidden": "true",
50273
50293
  width: width,
50274
50294
  height: height,
50275
50295
  viewBox: "0 0 ".concat(width, " ").concat(height),
@@ -51452,17 +51472,18 @@ var TurnstileWidget = /*#__PURE__*/React.forwardRef(function (_ref4, ref) {
51452
51472
  }, error)));
51453
51473
  });
51454
51474
 
51455
- var hoverColor$6 = SAPPHIRE_BLUE;
51456
- var activeColor$b = PEACOCK_BLUE;
51457
- var linkColor$6 = MATISSE_BLUE;
51458
- var borderColor$7 = "rgba(255, 255, 255, 0.85)";
51475
+ var hoverColor$6 = ROYAL_BLUE;
51476
+ var activeColor$b = CONGRESS_BLUE;
51477
+ var linkColor$6 = ROYAL_BLUE_VIVID;
51478
+ var textColor$5 = CHARADE_GREY;
51459
51479
  var fallbackValues$12 = {
51460
- borderColor: borderColor$7,
51461
51480
  linkColor: linkColor$6,
51462
51481
  hoverColor: hoverColor$6,
51463
- activeColor: activeColor$b
51482
+ activeColor: activeColor$b,
51483
+ textColor: textColor$5
51464
51484
  };
51465
51485
 
51486
+ var TOOLTIP_THEME_SOURCE = "Popover";
51466
51487
  var Tooltip = function Tooltip(_ref) {
51467
51488
  var tooltipID = _ref.tooltipID,
51468
51489
  children = _ref.children,
@@ -51484,33 +51505,39 @@ var Tooltip = function Tooltip(_ref) {
51484
51505
  maxWidth = _ref$maxWidth === void 0 ? "100%" : _ref$maxWidth,
51485
51506
  _ref$height = _ref.height,
51486
51507
  height = _ref$height === void 0 ? "auto" : _ref$height,
51487
- _ref$arrowDirection = _ref.arrowDirection,
51488
- arrowDirection = _ref$arrowDirection === void 0 ? "down" : _ref$arrowDirection,
51489
51508
  _ref$contentPosition = _ref.contentPosition,
51490
51509
  contentPosition = _ref$contentPosition === void 0 ? {
51491
- top: "auto",
51510
+ top: "-110px",
51492
51511
  right: "auto",
51493
- bottom: "calc(100% + 8px)",
51494
- // always sits above the trigger + 8px gap for arrow
51495
- left: "50%",
51496
- // anchors to horizontal center of trigger
51497
- transform: "translateX(-50%)" // shifts left by half tooltip's own width → centered
51512
+ bottom: "auto",
51513
+ left: "-225px"
51498
51514
  } : _ref$contentPosition,
51515
+ _ref$arrowDirection = _ref.arrowDirection,
51516
+ arrowDirection = _ref$arrowDirection === void 0 ? "down" : _ref$arrowDirection,
51499
51517
  _ref$arrowPosition = _ref.arrowPosition,
51500
51518
  arrowPosition = _ref$arrowPosition === void 0 ? {
51501
51519
  arrowTop: "auto",
51502
- arrowRight: "auto",
51520
+ arrowRight: "10px",
51503
51521
  arrowBottom: "-8px",
51504
- arrowLeft: "calc(50% - 8px)" // centers the 0-width arrow element (16px wide border)
51522
+ arrowLeft: "auto"
51505
51523
  } : _ref$arrowPosition,
51506
- arrowColor = _ref.arrowColor;
51524
+ customTriggerRole = _ref.customTriggerRole,
51525
+ _ref$backgroundColor = _ref.backgroundColor,
51526
+ backgroundColor = _ref$backgroundColor === void 0 ? WHITE : _ref$backgroundColor;
51527
+ /**
51528
+ * closeTimeoutRef is used internally to store a timer ID for delaying tooltip close. It will have a `.current` property (the timer ID) when the effect or event handlers set it.
51529
+ */
51507
51530
  var closeTimeoutRef = React.useRef(null);
51531
+ /**
51532
+ * containerRef is used to store a reference to the container element. It will have a `.current` property (the container element) when the effect or event handlers set it.
51533
+ */
51534
+ var containerRef = React.useRef(null);
51508
51535
  var _useState = React.useState(false),
51509
51536
  _useState2 = _slicedToArray(_useState, 2),
51510
51537
  tooltipOpen = _useState2[0],
51511
51538
  setTooltipOpen = _useState2[1];
51512
51539
  var themeContext = React.useContext(styled.ThemeContext);
51513
- var themeValues = createThemeValues(themeContext, fallbackValues$12, "Tooltip");
51540
+ var themeValues = createThemeValues(themeContext, fallbackValues$12, TOOLTIP_THEME_SOURCE);
51514
51541
  var top = contentPosition.top,
51515
51542
  right = contentPosition.right,
51516
51543
  bottom = contentPosition.bottom,
@@ -51529,6 +51556,99 @@ var Tooltip = function Tooltip(_ref) {
51529
51556
  handleToggleTooltip(false);
51530
51557
  }
51531
51558
  };
51559
+
51560
+ /**
51561
+ * @function renderTrigger
51562
+ * Renders the tooltip trigger element.
51563
+ *
51564
+ * When `hasCustomTrigger` is true, the provided child element is cloned and
51565
+ * injected with the event handlers needed to control tooltip visibility:
51566
+ * - onFocus/onBlur: open and close for keyboard users
51567
+ * - onKeyDown: allows Escape to dismiss the tooltip
51568
+ * - onTouchStart: open on tap for touch/mobile users (onFocus is unreliable on touch)
51569
+ *
51570
+ * Mouse interactions (hover) are handled at the container level via
51571
+ * onMouseEnter/onMouseLeave, so they do not need to be injected here.
51572
+ *
51573
+ * Any existing event handlers on the child are preserved and called first,
51574
+ * so the child's own behavior is not overridden.
51575
+ *
51576
+ * When no custom trigger is provided, a default ButtonWithAction is rendered
51577
+ * using `triggerText` and `triggerButtonVariant`.
51578
+ */
51579
+ var renderTrigger = function renderTrigger() {
51580
+ if (hasCustomTrigger && !children) {
51581
+ console.warn("Tooltip: children prop is required when hasCustomTrigger is true");
51582
+ }
51583
+ if (hasCustomTrigger && children) {
51584
+ var _child$props, _child$props$tabIndex, _child$props2, _child$props3, _child$props4;
51585
+ var child = React__default.Children.only(children);
51586
+ /**
51587
+ * Capture the child's existing handlers before overwriting
51588
+ */
51589
+ var _ref2 = (_child$props = child.props) !== null && _child$props !== void 0 ? _child$props : {},
51590
+ childOnFocus = _ref2.onFocus,
51591
+ childOnBlur = _ref2.onBlur,
51592
+ childOnKeyDown = _ref2.onKeyDown,
51593
+ childOnTouchStart = _ref2.onTouchStart;
51594
+
51595
+ /**
51596
+ * Clone the child element and add the necessary event handlers
51597
+ */
51598
+ return /*#__PURE__*/React__default.cloneElement(child, {
51599
+ tabIndex: (_child$props$tabIndex = (_child$props2 = child.props) === null || _child$props2 === void 0 ? void 0 : _child$props2.tabIndex) !== null && _child$props$tabIndex !== void 0 ? _child$props$tabIndex : 0,
51600
+ ariaDescribedby: tooltipID,
51601
+ style: _objectSpread2({
51602
+ cursor: "pointer"
51603
+ }, (_child$props3 = child.props) === null || _child$props3 === void 0 ? void 0 : _child$props3.style),
51604
+ onFocus: function onFocus(e) {
51605
+ childOnFocus === null || childOnFocus === void 0 || childOnFocus(e);
51606
+ handleToggleTooltip(true);
51607
+ },
51608
+ onBlur: function onBlur(e) {
51609
+ childOnBlur === null || childOnBlur === void 0 || childOnBlur(e);
51610
+ handleToggleTooltip(false);
51611
+ },
51612
+ onKeyDown: function onKeyDown(e) {
51613
+ childOnKeyDown === null || childOnKeyDown === void 0 || childOnKeyDown(e);
51614
+ handleKeyDown(e);
51615
+ },
51616
+ onTouchStart: function onTouchStart(e) {
51617
+ childOnTouchStart === null || childOnTouchStart === void 0 || childOnTouchStart(e);
51618
+ handleToggleTooltip(true);
51619
+ },
51620
+ role: customTriggerRole || ((_child$props4 = child.props) === null || _child$props4 === void 0 ? void 0 : _child$props4.role),
51621
+ "aria-describedby": tooltipID,
51622
+ "data-qa": "tooltip-trigger-".concat(tooltipID)
51623
+ });
51624
+ } else {
51625
+ return /*#__PURE__*/React__default.createElement(ButtonWithAction, {
51626
+ action: noop$1,
51627
+ onKeyDown: handleKeyDown,
51628
+ variant: triggerButtonVariant,
51629
+ text: triggerText,
51630
+ tabIndex: 0,
51631
+ ariaDescribedby: tooltipID,
51632
+ onFocus: function onFocus() {
51633
+ return handleToggleTooltip(true);
51634
+ },
51635
+ onBlur: function onBlur() {
51636
+ return handleToggleTooltip(false);
51637
+ },
51638
+ onTouchStart: function onTouchStart() {
51639
+ return handleToggleTooltip(true);
51640
+ },
51641
+ dataQa: "tooltip-trigger-".concat(tooltipID),
51642
+ extraStyles: "\n color: ".concat(themeValues.linkColor, ";\n &:hover { color: ").concat(themeValues.hoverColor, "; text-decoration: none;}\n &:active, &:focus { color: ").concat(themeValues.activeColor, ";text-decoration: none;}\n button, span, &:hover span { text-decoration: none; }\n ")
51643
+ });
51644
+ }
51645
+ };
51646
+
51647
+ /**
51648
+ * @function handleMouseEnter
51649
+ * Handles the mouse enter event for the tooltip container.
51650
+ * It clears any existing timeout and opens the tooltip.
51651
+ */
51532
51652
  var handleMouseEnter = function handleMouseEnter() {
51533
51653
  if (closeTimeoutRef.current) {
51534
51654
  clearTimeout(closeTimeoutRef.current);
@@ -51536,56 +51656,45 @@ var Tooltip = function Tooltip(_ref) {
51536
51656
  }
51537
51657
  handleToggleTooltip(true);
51538
51658
  };
51659
+
51660
+ /**
51661
+ * @function handleMouseLeave
51662
+ * Handles the mouse leave event for the tooltip container.
51663
+ * It sets a timeout to close the tooltip after 200ms.
51664
+ */
51539
51665
  var handleMouseLeave = function handleMouseLeave() {
51540
51666
  closeTimeoutRef.current = setTimeout(function () {
51541
51667
  handleToggleTooltip(false);
51542
- }, 300);
51668
+ }, 200);
51543
51669
  };
51670
+
51671
+ /**
51672
+ * Handles the touch start event for the tooltip container.
51673
+ * It closes the tooltip if the touch is outside the container.
51674
+ */
51544
51675
  React.useEffect(function () {
51545
- return function () {
51546
- if (closeTimeoutRef.current) {
51547
- clearTimeout(closeTimeoutRef.current);
51676
+ if (!tooltipOpen) return;
51677
+ var handleOutsideTouch = function handleOutsideTouch(e) {
51678
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
51679
+ setTooltipOpen(false);
51548
51680
  }
51549
51681
  };
51682
+ document.addEventListener("touchstart", handleOutsideTouch);
51683
+ return function () {
51684
+ return document.removeEventListener("touchstart", handleOutsideTouch);
51685
+ };
51686
+ }, [tooltipOpen]);
51687
+
51688
+ /**
51689
+ * Cleans up the timeout when the component unmounts.
51690
+ */
51691
+ React.useEffect(function () {
51692
+ return function () {
51693
+ if (closeTimeoutRef !== null && closeTimeoutRef !== void 0 && closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);
51694
+ };
51550
51695
  }, []);
51551
- var renderTrigger = function renderTrigger() {
51552
- if (hasCustomTrigger && children) {
51553
- return /*#__PURE__*/React__default.createElement(Box, {
51554
- padding: "0",
51555
- extraStyles: "cursor: pointer;",
51556
- tabIndex: "0",
51557
- role: "button",
51558
- "data-qa": "tooltip-trigger-".concat(tooltipID),
51559
- "aria-describedby": tooltipID,
51560
- onFocus: function onFocus() {
51561
- return handleToggleTooltip(true);
51562
- },
51563
- onBlur: function onBlur() {
51564
- return handleToggleTooltip(false);
51565
- },
51566
- onKeyDown: handleKeyDown
51567
- }, children);
51568
- }
51569
- return /*#__PURE__*/React__default.createElement(ButtonWithAction, {
51570
- action: noop$1,
51571
- "aria-describedby": tooltipID,
51572
- onKeyDown: handleKeyDown,
51573
- variant: triggerButtonVariant,
51574
- onFocus: function onFocus() {
51575
- return handleToggleTooltip(true);
51576
- },
51577
- onBlur: function onBlur() {
51578
- return handleToggleTooltip(false);
51579
- },
51580
- onTouchStart: function onTouchStart() {
51581
- return handleToggleTooltip(true);
51582
- },
51583
- "data-qa": "tooltip-trigger-".concat(tooltipID),
51584
- text: triggerText,
51585
- extraStyles: "\n color: ".concat(themeValues.linkColor, ";\n cursor: pointer;\n &:hover { color: ").concat(themeValues.hoverColor, "; text-decoration: none; }\n &:active, &:focus { color: ").concat(themeValues.activeColor, "; text-decoration: none; }\n button, span, &:hover span { text-decoration: none; } \n ")
51586
- });
51587
- };
51588
51696
  return /*#__PURE__*/React__default.createElement(Box, {
51697
+ ref: containerRef,
51589
51698
  padding: "0",
51590
51699
  extraStyles: "position: relative; ".concat(containerExtraStyles),
51591
51700
  onMouseEnter: handleMouseEnter,
@@ -51595,22 +51704,21 @@ var Tooltip = function Tooltip(_ref) {
51595
51704
  role: "tooltip",
51596
51705
  id: tooltipID,
51597
51706
  "aria-hidden": !tooltipOpen,
51598
- background: themeValues.borderColor,
51707
+ background: backgroundColor,
51599
51708
  "data-qa": "tooltip-contents",
51600
- extraStyles: "\n position: absolute;\n display: ".concat(tooltipOpen ? "block" : "none", ";\n top: ").concat(top, ";\n right: ").concat(right, ";\n bottom: ").concat(bottom, ";\n left: ").concat(left, ";\n height: ").concat(height, ";\n ").concat(contentExtraStyles, "\n "),
51709
+ extraStyles: "\n position: absolute;\n display: ".concat(tooltipOpen ? "block" : "none", ";\n top: ").concat(top, ";\n right: ").concat(right, ";\n bottom: ").concat(bottom, ";\n left: ").concat(left, ";\n height: ").concat(height, ";\n color: ").concat(themeValues.textColor, ";\n ").concat(contentExtraStyles, "\n "),
51601
51710
  boxShadow: "0px 2px 14px 0px rgb(246, 246, 249), 0px 3px 8px 0px rgb(202, 206, 216)",
51602
51711
  border: "1px solid transparent",
51603
51712
  borderRadius: "4px",
51604
51713
  minWidth: minWidth,
51605
51714
  maxWidth: maxWidth
51606
- }, typeof content === "string" ? /*#__PURE__*/React__default.createElement(Text$1, {
51607
- color: themeValues.linkColor
51608
- }, content) : content, /*#__PURE__*/React__default.createElement(Box, {
51715
+ }, typeof content === "string" && content !== "" ? /*#__PURE__*/React__default.createElement(Text$1, {
51716
+ color: themeValues.textColor
51717
+ }, content) : content !== undefined && content !== null ? content : null, /*#__PURE__*/React__default.createElement(Box, {
51609
51718
  padding: "0",
51610
- extraStyles: "\n position: absolute;\n content: \"\";\n width: 0;\n height: 0;\n ".concat(arrowBorder(arrowColor || themeValues.borderColor, arrowDirection, "8px"), ";\n filter: drop-shadow(2px 8px 14px black);\n bottom: ").concat(arrowBottom, ";\n right: ").concat(arrowRight, ";\n top: ").concat(arrowTop, ";\n left: ").concat(arrowLeft, ";\n ")
51719
+ extraStyles: "\n position: absolute;\n content: \"\";\n width: 0;\n height: 0;\n ".concat(arrowBorder(backgroundColor, arrowDirection, "8px"), ";\n filter: drop-shadow(2px 8px 14px black);\n bottom: ").concat(arrowBottom, ";\n right: ").concat(arrowRight, ";\n top: ").concat(arrowTop, ";\n left: ").concat(arrowLeft, ";\n ")
51611
51720
  })));
51612
51721
  };
51613
- var Tooltip$1 = themeComponent(Tooltip, "Tooltip", fallbackValues$12);
51614
51722
 
51615
51723
  var pageBackground = "#FBFCFD";
51616
51724
  var fallbackValues$13 = {
@@ -52171,7 +52279,7 @@ exports.TimeoutImage = TimeoutImage;
52171
52279
  exports.Title = Title$1;
52172
52280
  exports.ToastNotification = ToastNotification;
52173
52281
  exports.ToggleSwitch = ToggleSwitch$1;
52174
- exports.Tooltip = Tooltip$1;
52282
+ exports.Tooltip = Tooltip;
52175
52283
  exports.TrashIcon = TrashIcon$1;
52176
52284
  exports.TrashIconV2 = TrashIconV2$1;
52177
52285
  exports.TurnstileWidget = TurnstileWidget;