@saasquatch/mint-components 1.13.2 → 1.13.3

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 (99) hide show
  1. package/dist/cjs/{ShadowViewAddon-cf0ee0a0.js → ShadowViewAddon-14a02da4.js} +133 -98
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/mint-components.cjs.js +1 -1
  4. package/dist/cjs/{sqm-big-stat_39.cjs.entry.js → sqm-big-stat_41.cjs.entry.js} +220 -2
  5. package/dist/cjs/sqm-portal-email-verification.cjs.entry.js +1 -1
  6. package/dist/cjs/sqm-portal-forgot-password.cjs.entry.js +1 -1
  7. package/dist/cjs/sqm-portal-google-registration-form.cjs.entry.js +1 -1
  8. package/dist/cjs/{sqm-portal-registration-form-view-ebf355a6.js → sqm-portal-registration-form-view-637a4bf4.js} +1 -0
  9. package/dist/cjs/sqm-portal-registration-form.cjs.entry.js +2 -1
  10. package/dist/cjs/sqm-portal-reset-password.cjs.entry.js +1 -1
  11. package/dist/cjs/sqm-portal-verify-email.cjs.entry.js +1 -1
  12. package/dist/cjs/sqm-stencilbook.cjs.entry.js +469 -381
  13. package/dist/collection/collection-manifest.json +2 -0
  14. package/dist/collection/components/sqm-checkbox-field/CheckboxField.stories.js +1 -1
  15. package/dist/collection/components/sqm-checkbox-field/sqm-checkbox-field-view.js +6 -15
  16. package/dist/collection/components/sqm-checkbox-field/sqm-checkbox-field.js +5 -5
  17. package/dist/collection/components/sqm-marketing-emails-checkbox/MarketingEmailsCheckbox.stories.js +11 -0
  18. package/dist/collection/components/sqm-marketing-emails-checkbox/sqm-marketing-emails-checkbox.js +129 -0
  19. package/dist/collection/components/sqm-portal-change-marketing/ChangeMarketing.stories.js +54 -0
  20. package/dist/collection/components/sqm-portal-change-marketing/sqm-portal-change-marketing-view.js +47 -0
  21. package/dist/collection/components/sqm-portal-change-marketing/sqm-portal-change-marketing.js +217 -0
  22. package/dist/collection/components/sqm-portal-change-marketing/usePortalChangeMarketing.js +115 -0
  23. package/dist/collection/components/sqm-portal-email-verification/sqm-portal-email-verification.js +3 -3
  24. package/dist/collection/components/sqm-portal-forgot-password/sqm-portal-forgot-password.js +3 -3
  25. package/dist/collection/components/sqm-portal-google-registration-form/sqm-portal-google-registration-form.js +2 -2
  26. package/dist/collection/components/sqm-portal-login/sqm-portal-login.js +3 -3
  27. package/dist/collection/components/sqm-portal-registration-form/PortalRegistrationForm.stories.js +4 -0
  28. package/dist/collection/components/sqm-portal-registration-form/sqm-portal-registration-form-view.js +1 -0
  29. package/dist/collection/components/sqm-portal-registration-form/sqm-portal-registration-form.js +3 -2
  30. package/dist/collection/components/sqm-portal-reset-password/sqm-portal-reset-password.js +3 -3
  31. package/dist/collection/components/sqm-portal-verify-email/sqm-portal-verify-email.js +3 -3
  32. package/dist/collection/components/sqm-stencilbook/sqm-stencilbook.js +6 -0
  33. package/dist/esm/{ShadowViewAddon-fd07e6e1.js → ShadowViewAddon-23a6afab.js} +133 -99
  34. package/dist/esm/loader.js +1 -1
  35. package/dist/esm/mint-components.js +1 -1
  36. package/dist/esm/{sqm-big-stat_39.entry.js → sqm-big-stat_41.entry.js} +219 -3
  37. package/dist/esm/sqm-portal-email-verification.entry.js +1 -1
  38. package/dist/esm/sqm-portal-forgot-password.entry.js +1 -1
  39. package/dist/esm/sqm-portal-google-registration-form.entry.js +1 -1
  40. package/dist/esm/{sqm-portal-registration-form-view-32c4b488.js → sqm-portal-registration-form-view-3c1f6000.js} +1 -0
  41. package/dist/esm/sqm-portal-registration-form.entry.js +2 -1
  42. package/dist/esm/sqm-portal-reset-password.entry.js +1 -1
  43. package/dist/esm/sqm-portal-verify-email.entry.js +1 -1
  44. package/dist/esm/sqm-stencilbook.entry.js +469 -381
  45. package/dist/esm-es5/ShadowViewAddon-23a6afab.js +1 -0
  46. package/dist/esm-es5/loader.js +1 -1
  47. package/dist/esm-es5/mint-components.js +1 -1
  48. package/dist/esm-es5/sqm-big-stat_41.entry.js +1 -0
  49. package/dist/esm-es5/sqm-portal-google-registration-form.entry.js +1 -1
  50. package/dist/esm-es5/{sqm-portal-registration-form-view-32c4b488.js → sqm-portal-registration-form-view-3c1f6000.js} +1 -1
  51. package/dist/esm-es5/sqm-portal-registration-form.entry.js +1 -1
  52. package/dist/esm-es5/sqm-stencilbook.entry.js +1 -1
  53. package/dist/mint-components/mint-components.esm.js +1 -1
  54. package/dist/mint-components/p-01010af0.entry.js +258 -0
  55. package/dist/mint-components/{p-079405ff.entry.js → p-0d2d0b6d.entry.js} +1 -1
  56. package/dist/mint-components/p-33ed6f1c.system.entry.js +1 -0
  57. package/dist/mint-components/p-37996351.system.js +1 -1
  58. package/dist/mint-components/p-38b5f028.system.entry.js +1 -0
  59. package/dist/mint-components/p-7e7cbccf.system.js +1 -0
  60. package/dist/mint-components/{p-e6045498.entry.js → p-7f80a9d7.entry.js} +1 -1
  61. package/dist/mint-components/{p-793d2130.js → p-91ab3da1.js} +1 -1
  62. package/dist/mint-components/{p-51d3cde7.system.entry.js → p-9386ad84.system.entry.js} +1 -1
  63. package/dist/mint-components/{p-54adee71.system.entry.js → p-9bfd9bed.system.entry.js} +1 -1
  64. package/dist/mint-components/p-d3d74266.js +394 -0
  65. package/dist/mint-components/{p-bb0f585c.system.js → p-e5d0375e.system.js} +1 -1
  66. package/dist/mint-components/p-f2cc6a6f.entry.js +9 -0
  67. package/dist/types/components/sqm-checkbox-field/sqm-checkbox-field-view.d.ts +1 -1
  68. package/dist/types/components/sqm-checkbox-field/sqm-checkbox-field.d.ts +4 -4
  69. package/dist/types/components/sqm-marketing-emails-checkbox/MarketingEmailsCheckbox.stories.d.ts +8 -0
  70. package/dist/types/components/sqm-marketing-emails-checkbox/sqm-marketing-emails-checkbox.d.ts +27 -0
  71. package/dist/types/components/sqm-portal-change-marketing/ChangeMarketing.stories.d.ts +8 -0
  72. package/dist/types/components/sqm-portal-change-marketing/sqm-portal-change-marketing-view.d.ts +28 -0
  73. package/dist/types/components/sqm-portal-change-marketing/sqm-portal-change-marketing.d.ts +39 -0
  74. package/dist/types/components/sqm-portal-change-marketing/usePortalChangeMarketing.d.ts +3 -0
  75. package/dist/types/components/sqm-portal-email-verification/sqm-portal-email-verification.d.ts +1 -1
  76. package/dist/types/components/sqm-portal-forgot-password/sqm-portal-forgot-password.d.ts +1 -1
  77. package/dist/types/components/sqm-portal-login/sqm-portal-login.d.ts +1 -1
  78. package/dist/types/components/sqm-portal-registration-form/PortalRegistrationForm.stories.d.ts +1 -0
  79. package/dist/types/components/sqm-portal-registration-form/sqm-portal-registration-form-view.d.ts +1 -0
  80. package/dist/types/components/sqm-portal-registration-form/sqm-portal-registration-form.d.ts +1 -1
  81. package/dist/types/components/sqm-portal-reset-password/sqm-portal-reset-password.d.ts +1 -1
  82. package/dist/types/components/sqm-portal-verify-email/sqm-portal-verify-email.d.ts +1 -1
  83. package/dist/types/components.d.ts +130 -13
  84. package/docs/docs.docx +0 -0
  85. package/docs/raisins.json +1 -1
  86. package/grapesjs/grapesjs.js +1 -1
  87. package/package.json +1 -1
  88. package/dist/esm-es5/ShadowViewAddon-fd07e6e1.js +0 -1
  89. package/dist/esm-es5/sqm-big-stat_39.entry.js +0 -1
  90. package/dist/mint-components/p-57e2c2fa.system.js +0 -1
  91. package/dist/mint-components/p-87d385d8.entry.js +0 -241
  92. package/dist/mint-components/p-abedbbf3.system.entry.js +0 -1
  93. package/dist/mint-components/p-bc83460e.system.entry.js +0 -1
  94. package/dist/mint-components/p-d12fc50f.js +0 -394
  95. package/dist/mint-components/p-da932ca2.entry.js +0 -9
  96. package/dist/types/global/android.d.ts +0 -7
  97. package/dist/types/global/demo.d.ts +0 -2
  98. package/dist/types/stories/features.d.ts +0 -4
  99. package/dist/types/stories/templates.d.ts +0 -4
@@ -23,12 +23,12 @@ import { P as PortalEmailVerificationView } from './sqm-portal-email-verificatio
23
23
  import { P as PortalForgotPasswordView } from './sqm-portal-forgot-password-view-3d3182f1.js';
24
24
  import { P as PortalLoginView } from './sqm-portal-login-view-7e49609a.js';
25
25
  import { B as BaseRegistrationFormView } from './sqm-base-registration-form-view-593d4ac3.js';
26
- import { P as PortalRegistrationFormView } from './sqm-portal-registration-form-view-32c4b488.js';
26
+ import { P as PortalRegistrationFormView } from './sqm-portal-registration-form-view-3c1f6000.js';
27
27
  import { P as PortalProfileView } from './sqm-portal-profile-view-93003974.js';
28
28
  import './utilities-5b0ca040.js';
29
29
  import { P as PortalResetPasswordView } from './sqm-portal-reset-password-view-54a8651f.js';
30
30
  import { P as PortalVerifyEmailView } from './sqm-portal-verify-email-view-b12cb894.js';
31
- import { S as ShareButtonView, L as LeaderboardView, B as BigStatView, P as PortalFrameView, E as EditProfileView, u as useShareLink, a as useShareButton, b as useDemoBigStat, c as StatContainerView, d as PortalChangePasswordView, e as PortalRegisterView, T as TaskCardView, f as ProgressBarView, g as PoweredByImg$1, h as PortalFooterView, H as HeroView, R as ReferralIframeView, N as NameFieldsView, C as CheckboxFieldView, D as DropdownFieldView, I as InputFieldView, i as RewardExchangeView, r as rewardExchangeCustomErrorMsg, j as rewardExchangeLongText, k as rewardExchangeSelected, l as chooseAmountFixed, m as chooseAmountFixedNoDescription, n as chooseAmountVariable, o as chooseAmountVariableNoDescription, p as chooseAmountVariableDisabled, q as chooseAmountVariableUnavailable, s as confirmFixed, t as confirmVariable, v as redemptionError, w as queryError, x as success, y as successVariable, z as loading, A as empty$1, F as rewardExchange, G as CardFeedView, J as CouponCodeView, K as ProgressBar$2, M as autoColorScaleCss, O as ShadowViewAddon } from './ShadowViewAddon-fd07e6e1.js';
31
+ import { S as ShareButtonView, L as LeaderboardView, B as BigStatView, P as PortalFrameView, E as EditProfileView, u as useShareLink, a as useShareButton, b as useDemoBigStat, c as StatContainerView, d as PortalChangePasswordView, e as PortalRegisterView, C as ChangeMarktingView, T as TaskCardView, f as ProgressBarView, g as PoweredByImg$1, h as PortalFooterView, H as HeroView, R as ReferralIframeView, N as NameFieldsView, i as CheckboxFieldView, D as DropdownFieldView, I as InputFieldView, j as RewardExchangeView, r as rewardExchangeCustomErrorMsg, k as rewardExchangeLongText, l as rewardExchangeSelected, m as chooseAmountFixed, n as chooseAmountFixedNoDescription, o as chooseAmountVariable, p as chooseAmountVariableNoDescription, q as chooseAmountVariableDisabled, s as chooseAmountVariableUnavailable, t as confirmFixed, v as confirmVariable, w as redemptionError, x as queryError, y as success, z as successVariable, A as loading, F as empty$1, G as rewardExchange, J as CardFeedView, K as CouponCodeView, M as ProgressBar$2, O as autoColorScaleCss, Q as ShadowViewAddon } from './ShadowViewAddon-23a6afab.js';
32
32
  import { P as PortalContainerView, a as PortalSectionView } from './sqm-portal-container-view-1683ae32.js';
33
33
  import { O as OtherRegionSlotView, I as InvoiceTableView, T as TaxForm } from './sqm-invoice-table-view-af69cd33.js';
34
34
 
@@ -4100,7 +4100,7 @@ const promoCodeReferralWidget = "<sqm-brand brand-color=\"#4225c4\" brand-font=\
4100
4100
 
4101
4101
  const loyaltyWidget = "<sqm-brand brand-color=\"#4225c4\" brand-font=\"Nunito Sans\">\n <sqm-portal-container\n direction=\"column\"\n padding=\"small\"\n gap=\"xxxx-large\"\n display=\"grid\"\n max-width=\"100%\"\n background-color=\"#ffffff\"\n >\n <sqm-portal-container\n direction=\"column\"\n padding=\"none\"\n gap=\"xxx-large\"\n display=\"grid\"\n max-width=\"100%\"\n >\n <sqm-hero-image\n image-url=\"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\"\n header=\"MyCompany Rewards\"\n description=\"Complete tasks to earn rewards\"\n layout=\"overlay\"\n padding-image=\"xxxx-large\"\n padding-text=\"xxx-large\"\n image-pos=\"center\"\n overlay-color=\"#5e5669\"\n overlay-opacity=\"0.9\"\n >\n </sqm-hero-image>\n <sqm-portal-container\n direction=\"column\"\n padding=\"none\"\n gap=\"xxx-large\"\n max-width=\"770px\"\n center\n display=\"grid\"\n >\n <sqm-program-explainer header=\"How it works\">\n <sqm-program-explainer-step\n description=\"Complete tasks like uploading your first video or sharing videos with friends\"\n header=\"Earn points for using our product\"\n icon=\"cash-stack\"\n text-color=\"#000000\"\n >\n </sqm-program-explainer-step>\n <sqm-program-explainer-step\n description=\"Redeem rewards like one free month of Enterprise or two plane tickets to anywhere in North America\"\n header=\"Redeem rewards with your points\"\n icon=\"people\"\n text-color=\"#000000\"\n >\n </sqm-program-explainer-step>\n </sqm-program-explainer>\n <sqm-portal-container\n center\n direction=\"row\"\n display=\"flex\"\n justify-content=\"space-between\"\n gap=\"xxx-large\"\n max-width=\"100%\"\n padding=\"none\"\n >\n <sqm-stat-container space=\"xxx-large\" display=\"flex\">\n <sqm-big-stat\n flex-reverse=\"true\"\n alignment=\"left\"\n stat-type=\"/rewardsRedeemed/CREDIT/POINTS\"\n >\n <p>Points Redeemed</p>\n </sqm-big-stat>\n <sqm-big-stat\n flex-reverse=\"true\"\n alignment=\"left\"\n stat-type=\"/rewardBalance/CREDIT/POINT/value/global\"\n >\n <p>Points Balance</p>\n </sqm-big-stat>\n </sqm-stat-container>\n </sqm-portal-container>\n <sqm-portal-container\n direction=\"column\"\n padding=\"none\"\n gap=\"xx-large\"\n display=\"grid\"\n max-width=\"100%\"\n >\n <sqm-titled-section\n label-margin=\"small\"\n padding=\"none\"\n text-align=\"center\"\n >\n <h3 slot=\"label\">Earn points</h3>\n </sqm-titled-section>\n <sqm-card-feed gap=\"24\" width=\"347\">\n <sqm-task-card\n reward-amount=\"20\"\n goal=\"1\"\n card-title=\"Complete a Survey\"\n description=\"Fill out our NPS survey and get 20 points for giving us honest feedback.\"\n button-text=\"Take survey\"\n reward-unit=\"Points\"\n completed-text=\"Completed {finite, select, 0 {{count, plural, =1 {{count} time} other {{count} times}}} other {{count}/{finite} times}}\"\n ended-message=\"Ended {endDate}\"\n expiry-message=\"Ends {endDate}\"\n finite=\"0\"\n starts-on-message=\"Starts {startDate}\"\n >\n </sqm-task-card>\n <sqm-task-card\n reward-amount=\"250\"\n goal=\"500\"\n show-progress-bar\n card-title=\"Spend $500\"\n description=\"Earn 250 points when you spend $500 or more.\"\n button-text=\"See plans\"\n completed-text=\"Completed {finite, select, 0 {{count, plural, =1 {{count} time} other {{count} times}}} other {{count}/{finite} times}}\"\n ended-message=\"Ended {endDate}\"\n expiry-message=\"Ends {endDate}\"\n progress-bar-unit=\"$\"\n finite=\"0\"\n reward-unit=\"Points\"\n starts-on-message=\"Starts {startDate}\"\n >\n </sqm-task-card>\n <sqm-task-card\n goal=\"1\"\n reward-amount=\"50\"\n card-title=\"Follow Us on X\"\n description=\"Earn 50 points when you Follow Us on X!\"\n button-text=\"Follow\"\n button-link=\"https://twitter.com/\"\n open-new-tab=\"true\"\n event-key=\"socialFollow\"\n completed-text=\"Completed {finite, select, 0 {{count, plural, =1 {{count} time} other {{count} times}}} other {{count}/{finite} times}}\"\n ended-message=\"Ended {endDate}\"\n expiry-message=\"Ends {endDate}\"\n finite=\"0\"\n reward-unit=\"Points\"\n starts-on-message=\"Starts {startDate}\"\n >\n </sqm-task-card>\n <sqm-task-card\n reward-amount=\"1\"\n reward-unit=\"Free Month\"\n goal=\"1\"\n card-title=\"Upgrade Your Plan\"\n description=\"Receive one free month for being a committed customer when you upgrade your plan.\"\n button-text=\"Upgrade\"\n completed-text=\"Completed {finite, select, 0 {{count, plural, =1 {{count} time} other {{count} times}}} other {{count}/{finite} times}}\"\n ended-message=\"Ended {endDate}\"\n expiry-message=\"Ends {endDate}\"\n open-new-tab=\"false\"\n finite=\"0\"\n starts-on-message=\"Starts {startDate}\"\n >\n </sqm-task-card>\n </sqm-card-feed>\n <sqm-portal-container\n gap=\"large\"\n direction=\"column\"\n display=\"grid\"\n max-width=\"100%\"\n padding=\"none\"\n >\n <sqm-titled-section\n padding=\"none\"\n text-align=\"center\"\n label-margin=\"xx-small\"\n >\n <h3 slot=\"label\">Reward History</h3>\n </sqm-titled-section>\n <sqm-rewards-table\n per-page=\"4\"\n hidden-columns=\"0\"\n more-label=\"Next\"\n prev-label=\"Prev\"\n sm-breakpoint=\"599\"\n md-breakpoint=\"799\"\n >\n <sqm-rewards-table-reward-column\n available-text=\"{availableAmount} remaining\"\n column-title=\"Reward\"\n copy-text=\"Copied!\"\n redeemed-text=\"{redeemedAmount} redeemed\"\n >\n </sqm-rewards-table-reward-column>\n <sqm-rewards-table-source-column\n anonymous-user=\"Anonymous User\"\n column-title=\"Source\"\n deleted-user=\"Deleted User\"\n referral-text=\"{rewardSource, select, FRIEND_SIGNUP {Referral to} REFERRED {Referred by} other {}}\"\n reward-exchange-text=\"Reward Exchange\"\n reward-source-text=\"{rewardSource, select, MANUAL {Manual} AUTOMATED {{programName}} other {}}\"\n >\n </sqm-rewards-table-source-column>\n <sqm-rewards-table-status-column\n column-title=\"Status\"\n expiry-text=\"Expires on \"\n status-text=\"{status, select, AVAILABLE {Available} CANCELLED {Cancelled} PENDING {Pending} EXPIRED {Expired} REDEEMED {Redeemed} other {Not available} }\"\n >\n </sqm-rewards-table-status-column>\n <sqm-rewards-table-date-column\n column-title=\"Date received\"\n date-shown=\"dateGiven\"\n >\n </sqm-rewards-table-date-column>\n <sqm-empty\n slot=\"empty\"\n empty-state-image=\"https://res.cloudinary.com/saasquatch/image/upload/v1644360953/squatch-assets/empty_reward2.png\"\n empty-state-header=\"View your rewards\"\n empty-state-text=\"Refer friends and complete tasks to view the details of your rewards\"\n >\n </sqm-empty>\n </sqm-rewards-table>\n </sqm-portal-container>\n </sqm-portal-container>\n <sqm-portal-footer\n support-email=\"support@example.com\"\n terms-link=\"https:\\/\\/example.com\"\n faq-link=\"https:\\/\\/example.com\"\n terms-text=\"Terms And Conditions\"\n faq-text=\"FAQ\"\n show-powered-by=\"true\"\n padding-bottom=\"none\"\n padding-left=\"none\"\n padding-right=\"none\"\n padding-top=\"none\"\n ></sqm-portal-footer>\n </sqm-portal-container>\n </sqm-portal-container>\n </sqm-portal-container>\n</sqm-brand>\n";
4102
4102
 
4103
- const instantAccessReferrerShareWidget = "<sqm-hero\n background=\"https://res.cloudinary.com/saasquatch/image/upload/v1683589933/Portal%20Assets/Screen-Shot-2022-01-06-at-3.23.58-AM.png\"\n columns=\"2\"\n padding-size=\"medium\"\n wrap-direction=\"wrap\"\n secondary-background=\"#FFFFFF\"\n min-height=\"200\"\n ><sqm-referral-card\n vertical-alignment=\"start\"\n slot=\"secondary-column\"\n padding-bottom=\"small\"\n padding-left=\"x-large\"\n padding-right=\"x-large\"\n padding-top=\"small\"\n >\n <sqm-titled-section\n text-align=\"center\"\n label-margin=\"none\"\n padding=\"none\"\n slot=\"header\"\n ><h1 slot=\"label\">Invite your friends to unlock rewards!</h1>\n <p slot=\"content\">\n They&#x2019;ll get a &#x24;50 credit towards a new account and\n you&#x2019;ll get a &#x24;50 in credit for each friend you refer.\n </p></sqm-titled-section\n >\n <sqm-portal-container\n gap=\"small\"\n direction=\"column\"\n display=\"grid\"\n max-width=\"100%\"\n padding=\"none\"\n slot=\"left\"\n >\n <p style=\"margin: 0\">Choose how you want to share:</p>\n <sqm-share-link\n tooltip-text=\"Copied to Clipboard\"\n tooltip-lifespan=\"1000\"\n >\n </sqm-share-link>\n <sqm-share-button\n medium=\"email\"\n icon-slot=\"prefix\"\n size=\"medium\"\n type=\"default\"\n >\n Share via email\n </sqm-share-button>\n <sqm-share-button\n medium=\"linkedin\"\n icon-slot=\"prefix\"\n size=\"medium\"\n type=\"default\"\n >\n Share on LinkedIn\n </sqm-share-button>\n <sqm-share-button\n medium=\"twitter\"\n icon-slot=\"prefix\"\n size=\"medium\"\n type=\"default\"\n >\n Post about us on X\n </sqm-share-button> </sqm-portal-container\n ><sqm-portal-container\n display=\"flex\"\n slot=\"footer\"\n gap=\"small\"\n justify-content=\"center\"\n >\n <sqm-logout-current-user\n user-identification-text=\"{email}\"\n switch-user-link=\"#\"\n switch-user-text=\"not you?\"\n ></sqm-logout-current-user>\n <sqm-portal-footer\n support-email=\"support@example.com\"\n show-powered-by=\"true\"\n padding-bottom=\"x-small\"\n padding-left=\"none\"\n padding-right=\"none\"\n padding-top=\"none\"\n hide-support-text\n terms-text=\"Terms And Conditions\"\n terms-link=\"https://example.com\"\n ></sqm-portal-footer></sqm-portal-container\n ></sqm-referral-card>\n</sqm-hero>\n";
4103
+ const instantAccessReferrerShareWidget = "<sqm-hero\n background=\"https://res.cloudinary.com/saasquatch/image/upload/v1683589933/Portal%20Assets/Screen-Shot-2022-01-06-at-3.23.58-AM.png\"\n columns=\"2\"\n padding-size=\"medium\"\n wrap-direction=\"wrap\"\n secondary-background=\"#FFFFFF\"\n min-height=\"200\"\n ><sqm-referral-card\n vertical-alignment=\"start\"\n slot=\"secondary-column\"\n padding-bottom=\"small\"\n padding-left=\"x-large\"\n padding-right=\"x-large\"\n padding-top=\"small\"\n >\n <sqm-titled-section\n text-align=\"center\"\n label-margin=\"none\"\n padding=\"none\"\n slot=\"header\"\n ><h1 slot=\"label\">Invite your friends to unlock rewards!</h1>\n <p slot=\"content\">\n They&#x2019;ll get a &#x24;50 credit towards a new account and\n you&#x2019;ll get a &#x24;50 in credit for each friend you refer.\n </p></sqm-titled-section\n >\n <sqm-portal-container\n gap=\"small\"\n direction=\"column\"\n display=\"grid\"\n max-width=\"100%\"\n padding=\"none\"\n slot=\"left\"\n >\n <p style=\"margin: 0\">Choose how you want to share:</p>\n <sqm-share-link\n tooltip-text=\"Copied to Clipboard\"\n tooltip-lifespan=\"1000\"\n >\n </sqm-share-link>\n <sqm-share-button\n medium=\"email\"\n icon-slot=\"prefix\"\n size=\"medium\"\n type=\"default\"\n >\n Share via email\n </sqm-share-button>\n <sqm-share-button\n medium=\"linkedin\"\n icon-slot=\"prefix\"\n size=\"medium\"\n type=\"default\"\n >\n Share on LinkedIn\n </sqm-share-button>\n <sqm-share-button\n medium=\"twitter\"\n icon-slot=\"prefix\"\n size=\"medium\"\n type=\"default\"\n >\n Post about us on X\n </sqm-share-button> </sqm-portal-container\n ><sqm-portal-container\n display=\"flex\"\n slot=\"footer\"\n gap=\"small\"\n justify-content=\"center\"\n >\n <sqm-logout-current-user\n user-identification-text=\"{email}\"\n switch-user-link=\"#\"\n switch-user-text=\"not you?\"\n email-error-text=\"Error fetching email\"\n ></sqm-logout-current-user>\n <sqm-portal-footer\n support-email=\"support@example.com\"\n show-powered-by=\"true\"\n padding-bottom=\"x-small\"\n padding-left=\"none\"\n padding-right=\"none\"\n padding-top=\"none\"\n hide-support-text\n terms-text=\"Terms And Conditions\"\n terms-link=\"https://example.com\"\n ></sqm-portal-footer></sqm-portal-container\n ></sqm-referral-card>\n</sqm-hero>\n";
4104
4104
 
4105
4105
  const instantAccessFriendCouponWidget = "<sqm-hero\n background=\"https://res.cloudinary.com/saasquatch/image/upload/v1683589933/Portal%20Assets/Screen-Shot-2022-01-06-at-3.23.58-AM.png\"\n columns=\"2\"\n padding-size=\"medium\"\n wrap-direction=\"wrap\"\n secondary-background=\"#FFFFFF\"\n>\n <sqm-referral-card\n vertical-alignment=\"start\"\n padding-bottom=\"small\"\n padding-left=\"x-large\"\n padding-right=\"x-large\"\n padding-top=\"small\"\n slot=\"secondary-column\"\n >\n <sqm-portal-container\n gap=\"large\"\n direction=\"column\"\n display=\"flex\"\n justify-content=\"center\"\n max-width=\"100%\"\n padding=\"none\"\n slot=\"header\"\n >\n <sqm-titled-section\n text-align=\"center\"\n label-margin=\"xxx-small\"\n padding=\"none\"\n >\n <h1 slot=\"label\">You got &#x24;50 off thanks to a friend!</h1>\n <p slot=\"content\">\n <span> Use this reward to get &#x24;50 off your next purchase. </span>\n </p>\n </sqm-titled-section>\n\n <sqm-coupon-code copy-button-style=\"button-outside\"></sqm-coupon-code>\n </sqm-portal-container>\n\n <sqm-portal-footer\n slot=\"footer\"\n show-powered-by=\"true\"\n padding-bottom=\"none\"\n padding-left=\"none\"\n padding-right=\"none\"\n padding-top=\"none\"\n hide-support-text\n terms-text=\"Terms And Conditions\"\n terms-link=\"https://example.com\"\n ></sqm-portal-footer>\n </sqm-referral-card>\n</sqm-hero>\n";
4106
4106
 
@@ -7471,6 +7471,126 @@ const PortalRegister = /*#__PURE__*/Object.freeze({
7471
7471
  TermsAndConditions: TermsAndConditions
7472
7472
  });
7473
7473
 
7474
+ const PortalRegistrationForm_stories = {
7475
+ title: "Components/Microsite Portal Register",
7476
+ };
7477
+ const defaultProps$4 = {
7478
+ states: {
7479
+ error: "",
7480
+ loading: false,
7481
+ confirmPassword: true,
7482
+ hideInputs: false,
7483
+ loginPath: "/login",
7484
+ },
7485
+ callbacks: {
7486
+ submit: () => console.log("Submit!"),
7487
+ inputFunction: () => { },
7488
+ },
7489
+ refs: {
7490
+ formRef: {},
7491
+ },
7492
+ content: { pageLabel: "Register", confirmPasswordLabel: "Confirm Password" },
7493
+ };
7494
+ const errorProps$2 = {
7495
+ states: {
7496
+ error: "Something went wrong. Please try again.",
7497
+ loading: false,
7498
+ confirmPassword: true,
7499
+ hideInputs: false,
7500
+ loginPath: "/login",
7501
+ },
7502
+ callbacks: {
7503
+ submit: () => console.log("Submit!"),
7504
+ inputFunction: () => { },
7505
+ },
7506
+ refs: {
7507
+ formRef: {},
7508
+ },
7509
+ content: {
7510
+ pageLabel: "Register",
7511
+ confirmPasswordLabel: "Confirm Password",
7512
+ },
7513
+ };
7514
+ const loadingProps$2 = {
7515
+ states: {
7516
+ error: "",
7517
+ loading: true,
7518
+ confirmPassword: true,
7519
+ hideInputs: false,
7520
+ loginPath: "/login",
7521
+ },
7522
+ callbacks: {
7523
+ submit: () => console.log("Submit!"),
7524
+ inputFunction: () => { },
7525
+ },
7526
+ refs: {
7527
+ formRef: {},
7528
+ },
7529
+ content: { pageLabel: "Register", confirmPasswordLabel: "Confirm Password" },
7530
+ };
7531
+ const slottedProps$1 = {
7532
+ states: {
7533
+ error: "",
7534
+ loading: false,
7535
+ confirmPassword: true,
7536
+ hideInputs: false,
7537
+ loginPath: "/login",
7538
+ },
7539
+ callbacks: {
7540
+ submit: () => console.log("Submit!"),
7541
+ inputFunction: () => { },
7542
+ },
7543
+ refs: {
7544
+ formRef: {},
7545
+ },
7546
+ content: {
7547
+ pageLabel: "Register",
7548
+ confirmPasswordLabel: "Confirm Password",
7549
+ formData: (h("div", null,
7550
+ h("sl-input", { style: { marginBottom: "var(--sl-spacing-x-large)" }, exportparts: "label: input-label, base: input-base", label: "Slotted Input", required: true }),
7551
+ h("sl-input", { exportparts: "label: input-label, base: input-base", label: "Slotted Input 2", required: true }))),
7552
+ },
7553
+ };
7554
+ const Default$5 = () => h(PortalRegistrationFormView, Object.assign({}, defaultProps$4));
7555
+ const RegisterWithError$1 = () => (h(PortalRegistrationFormView, Object.assign({}, errorProps$2)));
7556
+ const RegisterLoading$1 = () => (h(PortalRegistrationFormView, Object.assign({}, loadingProps$2)));
7557
+ const FieldsHidden$1 = () => {
7558
+ return (h("sqm-portal-register", { demoData: {
7559
+ states: {
7560
+ error: "",
7561
+ loading: true,
7562
+ registrationFormState: {},
7563
+ confirmPassword: true,
7564
+ hideInputs: true,
7565
+ loginPath: "/login",
7566
+ },
7567
+ } }));
7568
+ };
7569
+ const SlottedInputs$1 = () => (h(PortalRegistrationFormView, Object.assign({}, slottedProps$1)));
7570
+ const RegisterWithMarketingEmailsCheckbox = () => (h(PortalRegistrationFormView, Object.assign({}, defaultProps$4, { content: {
7571
+ ...defaultProps$4.content,
7572
+ emailOptIn: (h("sqm-checkbox-field", { checkboxLabel: "I would like to receive marketing and promotional emails for this referral program" })),
7573
+ } })));
7574
+ const TermsAndConditions$1 = () => (h(PortalRegistrationFormView, Object.assign({}, defaultProps$4, { content: {
7575
+ ...defaultProps$4.content,
7576
+ terms: (h("p", null,
7577
+ "By signing up you agree to the",
7578
+ " ",
7579
+ h("a", { href: "https://example.com", target: "_blank" }, "Terms and Conditions"))),
7580
+ } })));
7581
+
7582
+ const PortalRegistrationForm = /*#__PURE__*/Object.freeze({
7583
+ __proto__: null,
7584
+ 'default': PortalRegistrationForm_stories,
7585
+ Default: Default$5,
7586
+ RegisterWithError: RegisterWithError$1,
7587
+ RegisterLoading: RegisterLoading$1,
7588
+ FieldsHidden: FieldsHidden$1,
7589
+ SlottedInputs: SlottedInputs$1,
7590
+ RegisterWithMarketingEmailsCheckbox: RegisterWithMarketingEmailsCheckbox,
7591
+ TermsAndConditions: TermsAndConditions$1
7592
+ });
7593
+
7474
7594
  const scenario$6 = "@author:derek\n@owner:ian\nFeature: Forgot Password\n\n @motivating\n Scenario: Users can request to reset their password\n Given a user enters their email address\n And that email address is linked to a previously created account\n When they click \"Reset Password\"\n Then the button enters a loading state\n When the password reset email is sent\n Then a confirmation banner is shown stating a password reset email was sent\n\n @motivating\n Scenario: Users are notified if sending their password reset email fails\n Given a user enters their email address\n And that email address is linked to a previously created account\n When they click \"Reset Password\"\n Then the button enters a loading state\n When the password reset email fails to send\n Then the user does not receive a password reset email\n And an error banner is shown stating that they should try again\n\n @motivating\n @landmine\n Scenario: If the input email is not associated to an account a success banner is shown but an email is not be sent\n Given the user entered an email address that is not associated to an accoun\n When they click \"Reset Password\"\n Then the button enters a loading state\n But no email is sent\n And a success banner is shown stating a password reset email was sent if the given email was associated to an account\n\n @motivating\n Scenario: Users can resend password reset email\n Given a user had previously requested to reset their password\n When they enter their email address\n And that email address is linked to a previously created account\n And they click \"Reset Password\"\n Then the user receives a second password reset email\n And a success banner is shown stating that their email was sent\n\n @motivating\n Scenario Outline: The email link can be configured to redirect users to a specific base path but defaults to \"/resetPassword\"\n Given a user viewing the password reset component\n And the component <mayHave> \"redirect-path\" with <value>\n When they request a password reset email\n And they click the link in the email\n Then they are redirected to <redirectPath>\n Examples:\n | mayHave | value | redirectPath |\n | doesn't have | N/A | /resetPassword |\n | has | /resetMyPassword | /resetMyPassword |\n\n @minutia\n Scenario Outline: Navigation back to the login page can be customized but defaults to \"/login\"\n Given a user viewing the password reset component\n And the component <mayHave> \"login-path\" with <value>\n Then they see a \"Sign In\" text button\n When they click \"Sign In\"\n Then they are redirected to <redirectPath>\n Examples:\n | mayHave | value | redirectPath |\n | doesn't have | N/A | /login |\n | has | /signin | /signin |";
7475
7595
 
7476
7596
  const PortalForgotPassword_stories = {
@@ -7479,7 +7599,7 @@ const PortalForgotPassword_stories = {
7479
7599
  scenario: scenario$6,
7480
7600
  },
7481
7601
  };
7482
- const defaultProps$4 = {
7602
+ const defaultProps$5 = {
7483
7603
  states: {
7484
7604
  error: "",
7485
7605
  loading: false,
@@ -7494,7 +7614,7 @@ const defaultProps$4 = {
7494
7614
  messageSlot: "Enter your email below to receive a password reset link.",
7495
7615
  },
7496
7616
  };
7497
- const errorProps$2 = {
7617
+ const errorProps$3 = {
7498
7618
  states: {
7499
7619
  error: "Something went wrong. Please try again.",
7500
7620
  loading: false,
@@ -7509,7 +7629,7 @@ const errorProps$2 = {
7509
7629
  messageSlot: "Enter your email below to receive a password reset link.",
7510
7630
  },
7511
7631
  };
7512
- const loadingProps$2 = {
7632
+ const loadingProps$3 = {
7513
7633
  states: {
7514
7634
  error: "",
7515
7635
  loading: true,
@@ -7539,15 +7659,15 @@ const successProps = {
7539
7659
  messageSlot: "Enter your email below to receive a password reset link.",
7540
7660
  },
7541
7661
  };
7542
- const Default$5 = () => h(PortalForgotPasswordView, Object.assign({}, defaultProps$4));
7543
- const ForgotPasswordWithError = () => (h(PortalForgotPasswordView, Object.assign({}, errorProps$2)));
7544
- const ForgotPasswordLoading = () => (h(PortalForgotPasswordView, Object.assign({}, loadingProps$2)));
7662
+ const Default$6 = () => h(PortalForgotPasswordView, Object.assign({}, defaultProps$5));
7663
+ const ForgotPasswordWithError = () => (h(PortalForgotPasswordView, Object.assign({}, errorProps$3)));
7664
+ const ForgotPasswordLoading = () => (h(PortalForgotPasswordView, Object.assign({}, loadingProps$3)));
7545
7665
  const ForgotPasswordSuccess = () => (h(PortalForgotPasswordView, Object.assign({}, successProps)));
7546
7666
 
7547
7667
  const PortalForgotPassword = /*#__PURE__*/Object.freeze({
7548
7668
  __proto__: null,
7549
7669
  'default': PortalForgotPassword_stories,
7550
- Default: Default$5,
7670
+ Default: Default$6,
7551
7671
  ForgotPasswordWithError: ForgotPasswordWithError,
7552
7672
  ForgotPasswordLoading: ForgotPasswordLoading,
7553
7673
  ForgotPasswordSuccess: ForgotPasswordSuccess
@@ -7580,12 +7700,12 @@ const defaultStates = {
7580
7700
  loadingVerification: false,
7581
7701
  countdown: 10,
7582
7702
  };
7583
- const defaultProps$5 = {
7703
+ const defaultProps$6 = {
7584
7704
  states: defaultStates,
7585
7705
  callbacks: defaultCallbacks,
7586
7706
  content: defaultContent,
7587
7707
  };
7588
- const errorProps$3 = {
7708
+ const errorProps$4 = {
7589
7709
  states: {
7590
7710
  ...defaultStates,
7591
7711
  error: "Something went wrong. Please try again.",
@@ -7593,7 +7713,7 @@ const errorProps$3 = {
7593
7713
  callbacks: defaultCallbacks,
7594
7714
  content: defaultContent,
7595
7715
  };
7596
- const loadingProps$3 = {
7716
+ const loadingProps$4 = {
7597
7717
  states: {
7598
7718
  ...defaultStates,
7599
7719
  loading: true,
@@ -7618,16 +7738,16 @@ const loadingVerificationProps = {
7618
7738
  callbacks: defaultCallbacks,
7619
7739
  content: defaultContent,
7620
7740
  };
7621
- const Default$6 = () => h(PortalEmailVerificationView, Object.assign({}, defaultProps$5));
7622
- const EmailVerificationWithError = () => (h(PortalEmailVerificationView, Object.assign({}, errorProps$3)));
7623
- const EmailVerificationLoading = () => (h(PortalEmailVerificationView, Object.assign({}, loadingProps$3)));
7741
+ const Default$7 = () => h(PortalEmailVerificationView, Object.assign({}, defaultProps$6));
7742
+ const EmailVerificationWithError = () => (h(PortalEmailVerificationView, Object.assign({}, errorProps$4)));
7743
+ const EmailVerificationLoading = () => (h(PortalEmailVerificationView, Object.assign({}, loadingProps$4)));
7624
7744
  const EmailVerificationCheckingVerification = () => (h(PortalEmailVerificationView, Object.assign({}, loadingVerificationProps)));
7625
7745
  const EmailVerificationSuccess = () => (h(PortalEmailVerificationView, Object.assign({}, successProps$1)));
7626
7746
 
7627
7747
  const PortalEmailVerification = /*#__PURE__*/Object.freeze({
7628
7748
  __proto__: null,
7629
7749
  'default': PortalEmailVerification_stories,
7630
- Default: Default$6,
7750
+ Default: Default$7,
7631
7751
  EmailVerificationWithError: EmailVerificationWithError,
7632
7752
  EmailVerificationLoading: EmailVerificationLoading,
7633
7753
  EmailVerificationCheckingVerification: EmailVerificationCheckingVerification,
@@ -7642,7 +7762,7 @@ const PortalResetPassword_stories = {
7642
7762
  scenario: scenario$8,
7643
7763
  },
7644
7764
  };
7645
- const defaultProps$6 = {
7765
+ const defaultProps$7 = {
7646
7766
  states: {
7647
7767
  error: "",
7648
7768
  loading: false,
@@ -7688,7 +7808,7 @@ const defaultPropsNoConfirm = {
7688
7808
  failed: () => console.log("failed"),
7689
7809
  },
7690
7810
  };
7691
- const errorProps$4 = {
7811
+ const errorProps$5 = {
7692
7812
  states: {
7693
7813
  error: "Something went wrong. Please try again.",
7694
7814
  loading: false,
@@ -7711,7 +7831,7 @@ const errorProps$4 = {
7711
7831
  failed: () => console.log("failed"),
7712
7832
  },
7713
7833
  };
7714
- const loadingProps$4 = {
7834
+ const loadingProps$5 = {
7715
7835
  states: {
7716
7836
  error: "",
7717
7837
  loading: true,
@@ -7780,17 +7900,17 @@ const validatingCodeProps = {
7780
7900
  failed: () => console.log("failed"),
7781
7901
  },
7782
7902
  };
7783
- const Default$7 = () => h(PortalResetPasswordView, Object.assign({}, defaultProps$6));
7903
+ const Default$8 = () => h(PortalResetPasswordView, Object.assign({}, defaultProps$7));
7784
7904
  const DefaultWithoutConfirmField = () => (h(PortalResetPasswordView, Object.assign({}, defaultPropsNoConfirm)));
7785
- const ResetPasswordWithError = () => (h(PortalResetPasswordView, Object.assign({}, errorProps$4)));
7786
- const ResetPasswordLoading = () => (h(PortalResetPasswordView, Object.assign({}, loadingProps$4)));
7905
+ const ResetPasswordWithError = () => (h(PortalResetPasswordView, Object.assign({}, errorProps$5)));
7906
+ const ResetPasswordLoading = () => (h(PortalResetPasswordView, Object.assign({}, loadingProps$5)));
7787
7907
  const ResetPasswordSuccess = () => (h(PortalResetPasswordView, Object.assign({}, successProps$2)));
7788
7908
  const CodeValidating = () => (h(PortalResetPasswordView, Object.assign({}, validatingCodeProps)));
7789
7909
 
7790
7910
  const PortalResetPassword = /*#__PURE__*/Object.freeze({
7791
7911
  __proto__: null,
7792
7912
  'default': PortalResetPassword_stories,
7793
- Default: Default$7,
7913
+ Default: Default$8,
7794
7914
  DefaultWithoutConfirmField: DefaultWithoutConfirmField,
7795
7915
  ResetPasswordWithError: ResetPasswordWithError,
7796
7916
  ResetPasswordLoading: ResetPasswordLoading,
@@ -7806,7 +7926,7 @@ const PortalVerifyEmail_stories = {
7806
7926
  scenario: scenario$9,
7807
7927
  },
7808
7928
  };
7809
- const errorProps$5 = {
7929
+ const errorProps$6 = {
7810
7930
  states: {
7811
7931
  error: "Something went wrong. Please try again.",
7812
7932
  loading: false,
@@ -7840,7 +7960,7 @@ const verifiedProps = {
7840
7960
  },
7841
7961
  content: {},
7842
7962
  };
7843
- const EmailVerificationWithError$1 = () => (h(PortalVerifyEmailView, Object.assign({}, errorProps$5)));
7963
+ const EmailVerificationWithError$1 = () => (h(PortalVerifyEmailView, Object.assign({}, errorProps$6)));
7844
7964
  const EmailVerificationSuccess$1 = () => (h(PortalVerifyEmailView, Object.assign({}, verifiedProps)));
7845
7965
 
7846
7966
  const PortalVerifyEmail = /*#__PURE__*/Object.freeze({
@@ -7853,7 +7973,7 @@ const PortalVerifyEmail = /*#__PURE__*/Object.freeze({
7853
7973
  const AssetCard_stories = {
7854
7974
  title: "Components/Asset Card",
7855
7975
  };
7856
- const Default$8 = () => {
7976
+ const Default$9 = () => {
7857
7977
  const props = {
7858
7978
  text: { titleText: "Marketing Banner" },
7859
7979
  imgUrl: "https://res.cloudinary.com/saasquatch/image/upload/v1634255445/squatch-assets/Copy_of_saasquatch-logo-tree-large-horizontal.png",
@@ -7881,7 +8001,7 @@ const CardWithNoImg = () => {
7881
8001
  const AssetCard = /*#__PURE__*/Object.freeze({
7882
8002
  __proto__: null,
7883
8003
  'default': AssetCard_stories,
7884
- Default: Default$8,
8004
+ Default: Default$9,
7885
8005
  CardWithLongText: CardWithLongText,
7886
8006
  CardWithNoImg: CardWithNoImg
7887
8007
  });
@@ -7970,7 +8090,7 @@ const ChangePassword_stories = {
7970
8090
  scenario: scenario$a,
7971
8091
  },
7972
8092
  };
7973
- const defaultProps$7 = {
8093
+ const defaultProps$8 = {
7974
8094
  states: {
7975
8095
  open: false,
7976
8096
  loading: false,
@@ -8014,7 +8134,7 @@ const openProps = {
8014
8134
  submit: (e) => console.log("Submit", e),
8015
8135
  },
8016
8136
  };
8017
- const errorProps$6 = {
8137
+ const errorProps$7 = {
8018
8138
  states: {
8019
8139
  open: true,
8020
8140
  loading: false,
@@ -8058,7 +8178,7 @@ const passwordErrorProps = {
8058
8178
  submit: (e) => console.log("Submit", e),
8059
8179
  },
8060
8180
  };
8061
- const loadingProps$5 = {
8181
+ const loadingProps$6 = {
8062
8182
  states: {
8063
8183
  open: true,
8064
8184
  loading: true,
@@ -8102,17 +8222,17 @@ const successProps$3 = {
8102
8222
  submit: (e) => console.log("Submit", e),
8103
8223
  },
8104
8224
  };
8105
- const Default$9 = () => h(PortalChangePasswordView, Object.assign({}, defaultProps$7));
8225
+ const Default$a = () => h(PortalChangePasswordView, Object.assign({}, defaultProps$8));
8106
8226
  const Open = () => h(PortalChangePasswordView, Object.assign({}, openProps));
8107
- const Error$2 = () => h(PortalChangePasswordView, Object.assign({}, errorProps$6));
8227
+ const Error$2 = () => h(PortalChangePasswordView, Object.assign({}, errorProps$7));
8108
8228
  const PaswordError = () => (h(PortalChangePasswordView, Object.assign({}, passwordErrorProps)));
8109
- const Loading$1 = () => h(PortalChangePasswordView, Object.assign({}, loadingProps$5));
8229
+ const Loading$1 = () => h(PortalChangePasswordView, Object.assign({}, loadingProps$6));
8110
8230
  const Success = () => h(PortalChangePasswordView, Object.assign({}, successProps$3));
8111
8231
 
8112
8232
  const ChangePassword = /*#__PURE__*/Object.freeze({
8113
8233
  __proto__: null,
8114
8234
  'default': ChangePassword_stories,
8115
- Default: Default$9,
8235
+ Default: Default$a,
8116
8236
  Open: Open,
8117
8237
  Error: Error$2,
8118
8238
  PaswordError: PaswordError,
@@ -8120,10 +8240,72 @@ const ChangePassword = /*#__PURE__*/Object.freeze({
8120
8240
  Success: Success
8121
8241
  });
8122
8242
 
8243
+ const ChangeMarketing_stories = {
8244
+ title: "Components/Change Marketing Emails Status",
8245
+ };
8246
+ const defaultProps$9 = {
8247
+ states: {
8248
+ success: false,
8249
+ loading: false,
8250
+ submitDisabled: false,
8251
+ formState: {
8252
+ marketingEmailOptIn: false,
8253
+ errors: null,
8254
+ error: "",
8255
+ },
8256
+ user: {
8257
+ id: "zach",
8258
+ accountId: "zach",
8259
+ marketingEmailOptIn: false,
8260
+ },
8261
+ text: {
8262
+ emailPreferencesHeader: "Email preferences",
8263
+ marketingCheckboxLabel: "I want to receive marketing emails and promotions for this referral program from impact.com",
8264
+ submitChangeButtonText: "Save",
8265
+ successMessage: "Opt-in preference has been changed.",
8266
+ },
8267
+ },
8268
+ callbacks: {
8269
+ onSubmit: (props) => console.log(props),
8270
+ setChecked: (value) => console.log(value),
8271
+ },
8272
+ };
8273
+ const Default$b = () => {
8274
+ return h("sqm-portal-change-marketing", null);
8275
+ };
8276
+ const Loading$2 = () => {
8277
+ return (h(ChangeMarktingView, Object.assign({}, defaultProps$9, { states: { ...defaultProps$9.states, loading: true } })));
8278
+ };
8279
+ const Error$3 = () => {
8280
+ return (h(ChangeMarktingView, Object.assign({}, defaultProps$9, { states: {
8281
+ ...defaultProps$9.states,
8282
+ formState: {
8283
+ ...defaultProps$9.states.formState,
8284
+ errors: { error: true },
8285
+ error: "An error string",
8286
+ },
8287
+ } })));
8288
+ };
8289
+ const Success$1 = () => {
8290
+ return (h(ChangeMarktingView, Object.assign({}, defaultProps$9, { states: {
8291
+ ...defaultProps$9.states,
8292
+ success: true,
8293
+ } })));
8294
+ };
8295
+
8296
+ const ChangeMarketing = /*#__PURE__*/Object.freeze({
8297
+ __proto__: null,
8298
+ 'default': ChangeMarketing_stories,
8299
+ Default: Default$b,
8300
+ Loading: Loading$2,
8301
+ Error: Error$3,
8302
+ Success: Success$1
8303
+ });
8304
+
8123
8305
  const PortalProfile_stories = {
8124
8306
  title: "Components/Microsite Profile",
8125
8307
  };
8126
- const defaultProps$8 = {
8308
+ const defaultProps$a = {
8127
8309
  states: {
8128
8310
  success: false,
8129
8311
  loading: false,
@@ -8195,7 +8377,7 @@ const noCountry = {
8195
8377
  onChange: (e) => console.log(e),
8196
8378
  },
8197
8379
  };
8198
- const loadingProps$6 = {
8380
+ const loadingProps$7 = {
8199
8381
  states: {
8200
8382
  success: false,
8201
8383
  loading: true,
@@ -8267,7 +8449,7 @@ const disabledProps = {
8267
8449
  onChange: (e) => console.log(e),
8268
8450
  },
8269
8451
  };
8270
- const errorProps$7 = {
8452
+ const errorProps$8 = {
8271
8453
  states: {
8272
8454
  success: false,
8273
8455
  loading: false,
@@ -8339,22 +8521,22 @@ const successProps$4 = {
8339
8521
  onChange: (e) => console.log(e),
8340
8522
  },
8341
8523
  };
8342
- const Default$a = () => h(PortalProfileView, Object.assign({}, defaultProps$8));
8524
+ const Default$c = () => h(PortalProfileView, Object.assign({}, defaultProps$a));
8343
8525
  const DefaultNoCountry = () => h(PortalProfileView, Object.assign({}, noCountry));
8344
- const Loading$2 = () => h(PortalProfileView, Object.assign({}, loadingProps$6));
8526
+ const Loading$3 = () => h(PortalProfileView, Object.assign({}, loadingProps$7));
8345
8527
  const Disabled$1 = () => h(PortalProfileView, Object.assign({}, disabledProps));
8346
- const Error$3 = () => h(PortalProfileView, Object.assign({}, errorProps$7));
8347
- const Success$1 = () => h(PortalProfileView, Object.assign({}, successProps$4));
8528
+ const Error$4 = () => h(PortalProfileView, Object.assign({}, errorProps$8));
8529
+ const Success$2 = () => h(PortalProfileView, Object.assign({}, successProps$4));
8348
8530
 
8349
8531
  const PortalProfile = /*#__PURE__*/Object.freeze({
8350
8532
  __proto__: null,
8351
8533
  'default': PortalProfile_stories,
8352
- Default: Default$a,
8534
+ Default: Default$c,
8353
8535
  DefaultNoCountry: DefaultNoCountry,
8354
- Loading: Loading$2,
8536
+ Loading: Loading$3,
8355
8537
  Disabled: Disabled$1,
8356
- Error: Error$3,
8357
- Success: Success$1
8538
+ Error: Error$4,
8539
+ Success: Success$2
8358
8540
  });
8359
8541
 
8360
8542
  const column = "@author:noah\n@owner:noah\nFeature: Referral Table User Column\n\n Shows the same custom content for each referral\n\n Background:\n Given the column in included in the referral table\n\n @motivating\n Scenario: The title of the date column is configurable\n Given the \"column-title\" prop is set to \"My column title\"\n Then the date column is shown with \"My column title\"\n\n @motivating\n Scenario: The same custom content is shown for each referral\n Given there is at least one referral\n Then for each referral custom content is shown\n And the custom content is provided as slot content";
@@ -10131,7 +10313,7 @@ const dashboardTemplate = "<sqm-portal-container direction=\"column\" padding=\"
10131
10313
 
10132
10314
  const leadSubmitTemplate = "<sqm-referral-iframe></sqm-referral-iframe>\n";
10133
10315
 
10134
- const editProfileTemplate = "<sqm-portal-protected-route\n require-email-verification=\"true\"\n redirect-to=\"/login\"\n redirect-to-unverified=\"/emailVerification\"\n></sqm-portal-protected-route>\n<sqm-portal-container direction=\"column\" gap=\"xxx-large\">\n <sqm-portal-profile></sqm-portal-profile> </sqm-portal-container\n><sqm-portal-container direction=\"column\" gap=\"xxx-large\">\n <sqm-portal-change-password></sqm-portal-change-password>\n</sqm-portal-container>\n";
10316
+ const editProfileTemplate = "<sqm-portal-protected-route\n require-email-verification=\"true\"\n redirect-to=\"/login\"\n redirect-to-unverified=\"/emailVerification\"\n></sqm-portal-protected-route>\n<sqm-portal-container direction=\"column\" gap=\"xxx-large\">\n <sqm-portal-profile></sqm-portal-profile> </sqm-portal-container\n><sqm-portal-container direction=\"column\" gap=\"xxx-large\">\n <sqm-portal-change-password></sqm-portal-change-password>\n</sqm-portal-container>\n<sqm-portal-container direction=\"column\" gap=\"xxx-large\">\n <sqm-portal-change-marketing></sqm-portal-change-marketing>\n</sqm-portal-container>\n";
10135
10317
 
10136
10318
  const activityTemplate = "<sqm-portal-protected-route\n require-email-verification=\"true\"\n redirect-to=\"/login\"\n redirect-to-unverified=\"/emailVerification\"\n></sqm-portal-protected-route>\n<sqm-portal-container direction=\"column\" padding=\"xxx-large\" gap=\"xxx-large\">\n <sqm-text> <h1>Activity</h1></sqm-text>\n <sqm-stat-container space=\"xxxx-large\"\n ><sqm-big-stat\n flex-reverse=\"true\"\n alignment=\"left\"\n stat-type=\"/referralsCount\"\n ><sqm-text><p>Referrals</p></sqm-text></sqm-big-stat\n >\n <sqm-big-stat\n flex-reverse=\"true\"\n alignment=\"left\"\n stat-type=\"/rewardsCountFiltered/AVAILABLE\"\n ><sqm-text><p>Rewards Earned</p></sqm-text></sqm-big-stat\n >\n <sqm-big-stat\n flex-reverse=\"true\"\n alignment=\"left\"\n stat-type=\"/rewardBalance/CREDIT/CENTS\"\n ><sqm-text><p>Reward Balance</p></sqm-text></sqm-big-stat\n >\n </sqm-stat-container>\n <sqm-referral-table>\n <sqm-referral-table-user-column></sqm-referral-table-user-column>\n <sqm-referral-table-rewards-column></sqm-referral-table-rewards-column>\n <sqm-referral-table-status-column></sqm-referral-table-status-column>\n <sqm-referral-table-date-column\n column-title=\"Referred\"\n date-shown=\"dateReferralStarted\"\n ></sqm-referral-table-date-column> </sqm-referral-table\n></sqm-portal-container>\n";
10137
10319
 
@@ -10157,17 +10339,17 @@ const LoginReadme = "# sqm-portal-login\n\n\n\n<!-- Auto Generated Below -->\n\n
10157
10339
 
10158
10340
  const ReferralIframeReadme = "# sqm-referral-iframe\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| -------------- | --------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ----------- |\n| `demoData` | -- | | `{ states?: { content: { iframeSrc: string; iframeHeight: string; iframeWidth: string; }; }; data?: { shareCode: string; }; }` | `undefined` |\n| `iframeHeight` | `iframe-height` | Define the height of the iframe with any valid CSS height value. Example: 100px, 5rem, or auto. | `string` | `\"100%\"` |\n| `iframeSrc` | `iframe-src` | URL of iframe to display | `string` | `undefined` |\n| `iframeWidth` | `iframe-width` | Define the width of the iframe with any valid CSS width value. Example: 100px, 5rem, or auto. | `string` | `\"100%\"` |\n\n\n## Dependencies\n\n### Used by\n\n - [sqm-stencilbook](../sqm-stencilbook)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-stencilbook --> sqm-referral-iframe\n style sqm-referral-iframe fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10159
10341
 
10160
- const ForgotPasswordReadme = "# sqm-portal-forgot-password\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| --------------------- | ----------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; success: boolean; loginPath: string; }; content?: { secondaryButton: any; messageSlot: any; emailLabel?: string; submitLabel?: string; successAlertText?: string; }; }` | `undefined` |\n| `emailLabel` | `email-label` | | `string` | `\"Email\"` |\n| `headerText` | `header-text` | | `string` | `\"Enter your email below to receive a password reset link.\"` |\n| `loginPath` | `login-path` | | `string` | `\"/login\"` |\n| `loginText` | `login-text` | | `string` | `\"Sign In\"` |\n| `networkErrorMessage` | `network-error-message` | | `string` | `\"An error occurred while loading this page. Please refresh the page.\"` |\n| `redirectPath` | `redirect-path` | Redirect participants to this page after they verify their email. | `string` | `\"/resetPassword\"` |\n| `submitLabel` | `submit-label` | | `string` | `\"Request Password Reset\"` |\n| `successAlertText` | `success-alert-text` | | `string` | `\"If an account with that email exists, a password reset email will be sent.\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-forgot-password --> sqm-form-message\n style sqm-portal-forgot-password fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10342
+ const ForgotPasswordReadme = "# sqm-portal-forgot-password\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| --------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; success: boolean; loginPath: string; }; content?: { secondaryButton: any; messageSlot: any; emailLabel?: string; submitLabel?: string; successAlertText?: string; }; }` | `undefined` |\n| `emailLabel` | `email-label` | | `string` | `\"Email\"` |\n| `headerText` | `header-text` | | `string` | `\"Enter your email below to receive a password reset link.\"` |\n| `loginPath` | `login-path` | | `string` | `\"/login\"` |\n| `loginText` | `login-text` | | `string` | `\"Sign In\"` |\n| `networkErrorMessage` | `network-error-message` | Displayed when the forgot password action fails due to a network error. The participant can try refreshing the page. | `string` | `\"An error occurred while loading this page. Please refresh the page.\"` |\n| `redirectPath` | `redirect-path` | Redirect participants to this page after they verify their email. | `string` | `\"/resetPassword\"` |\n| `submitLabel` | `submit-label` | | `string` | `\"Request Password Reset\"` |\n| `successAlertText` | `success-alert-text` | | `string` | `\"If an account with that email exists, a password reset email will be sent.\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-forgot-password --> sqm-form-message\n style sqm-portal-forgot-password fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10161
10343
 
10162
10344
  const RegisterReadme = "# sqm-portal-register\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| ------------------------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |\n| `confirmPassword` | `confirm-password` | | `boolean` | `false` |\n| `confirmPasswordLabel` | `confirm-password-label` | | `string` | `\"Confirm Password\"` |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; confirmPassword: boolean; hideInputs: boolean; registrationFormState: RegistrationFormState; disablePasswordValidation?: boolean; loginPath: string; }; refs?: { formRef: any; }; content?: { formData?: VNode; terms?: VNode; passwordField?: VNode; secondaryButton?: VNode; emailLabel?: string; passwordLabel?: string; submitLabel?: string; pageLabel?: string; confirmPasswordLabel: string; requiredFieldErrorMessage: string; invalidEmailErrorMessage: string; meetsRequirementsText?: string; doesNotMeetRequirementsText?: string; minErrorText?: string; uppercaseErrorText?: string; lowercaseErrorText?: string; hasErrorText?: string; }; }` | `undefined` |\n| `disablePasswordValidation` | `disable-password-validation` | | `boolean` | `false` |\n| `doesNotMeetRequirementsText` | `does-not-meet-requirements-text` | | `string` | `\"Password must meet the following requirements:\"` |\n| `emailLabel` | `email-label` | | `string` | `\"Email\"` |\n| `hasErrorText` | `has-error-text` | | `string` | `\"contain at least 1 number or symbol\"` |\n| `hideInputs` | `hide-inputs` | Hides the email and password fields. Note: If you hide default inputs, you must add additional input fields. They must have the input name attributes \"email\" and \"password\" for this form to succeed. | `boolean` | `false` |\n| `invalidEmailErrorMessage` | `invalid-email-error-message` | The message to be displayed when the email used is invalid or blocked. | `string` | `\"Must be a valid email address\"` |\n| `loginLabel` | `login-label` | | `string` | `\"Sign in\"` |\n| `loginPath` | `login-path` | Redirect participants to this page after clicking the login button. | `string` | `\"/login\"` |\n| `lowercaseErrorText` | `lowercase-error-text` | | `string` | `\"contain at least 1 lowercase character\"` |\n| `meetsRequirementsText` | `meets-requirements-text` | | `string` | `\"Password has met all requirements\"` |\n| `minErrorText` | `min-error-text` | | `string` | `\"be a minimum of 8 characters\"` |\n| `networkErrorMessage` | `network-error-message` | The message to be displayed when a the form submission fails unexpectedly. | `string` | `\"Network request failed.\"` |\n| `nextPage` | `next-page` | Redirect participants to this page from their verification email | `string` | `\"/\"` |\n| `pageLabel` | `page-label` | | `string` | `\"Register\"` |\n| `passwordLabel` | `password-label` | | `string` | `\"Password\"` |\n| `passwordMismatchErrorMessage` | `password-mismatch-error-message` | The message to be displayed when password inputs do not match. | `string` | `\"Passwords do not match.\"` |\n| `redirectPath` | `redirect-path` | The page that participants are redirected to from the verification email. | `string` | `\"/verifyEmail\"` |\n| `requiredFieldErrorMessage` | `required-field-error-message` | The message to be displayed when a required field is not filled. | `string` | `\"Cannot be empty\"` |\n| `submitLabel` | `submit-label` | | `string` | `\"Register\"` |\n| `uppercaseErrorText` | `uppercase-error-text` | | `string` | `\"contain at least 1 uppercase character\"` |\n\n\n## Dependencies\n\n### Used by\n\n - [sqm-stencilbook](../sqm-stencilbook)\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n- [sqm-password-field](../sqm-password-field)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-register --> sqm-form-message\n sqm-portal-register --> sqm-password-field\n sqm-stencilbook --> sqm-portal-register\n style sqm-portal-register fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10163
10345
 
10164
10346
  const EditProfileReadme = "# sqm-portal-profile\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| ------------------------ | --------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |\n| `countrytext` | `countrytext` | | `string` | `\"Country\"` |\n| `demoData` | -- | | `{ states?: { success: boolean; loading: boolean; submitDisabled: boolean; showCountry: boolean; formState: { country: string; firstName: string; lastName: string; errors: any; error: string; }; user: { id: string; accountId: string; firstName: string; lastName: string; email: string; countryCode: string; }; text: { firstnametext: string; lastnametext: string; emailtext: string; countrytext: string; editProfileHeader: string; editProfileSubHeader: string; submitChangeButtonText: string; submissionSuccessText?: string; fieldEmptyText?: string; }; }; }` | `undefined` |\n| `editProfileHeader` | `edit-profile-header` | | `string` | `\"Edit your profile\"` |\n| `editProfileSubHeader` | `edit-profile-sub-header` | | `string` | `\"Personal Information\"` |\n| `emailtext` | `emailtext` | | `string` | `\"Email\"` |\n| `fieldEmptyText` | `field-empty-text` | | `string` | `\"Field is required\"` |\n| `firstnametext` | `firstnametext` | | `string` | `\"First Name\"` |\n| `formErrorText` | `form-error-text` | | `string` | `\"Please correct the errors below to update your profile.\"` |\n| `hideCountry` | `hide-country` | | `boolean` | `false` |\n| `lastnametext` | `lastnametext` | | `string` | `\"Last Name\"` |\n| `networkRequestMessage` | `network-request-message` | | `string` | `\"An error occurred while loading this page. Please refresh the page.\"` |\n| `submissionSuccessText` | `submission-success-text` | | `string` | `\"Your profile has been successfully updated.\"` |\n| `submitChangeButtonText` | `submit-change-button-text` | | `string` | `\"Submit Changes\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-profile --> sqm-form-message\n style sqm-portal-profile fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10165
10347
 
10166
- const ResetPasswordReadme = "# sqm-portal-reset-password\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| ----------------------------- | --------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| `codeInvalidText` | `code-invalid-text` | | `string` | `\"The password reset code is invalid or has expired, please try again.\"` |\n| `confirmPassword` | `confirm-password` | | `boolean` | `false` |\n| `confirmPasswordFieldLabel` | `confirm-password-field-label` | | `string` | `\"Confirm Password\"` |\n| `continueButtonText` | `continue-button-text` | Button text displayed after a successful password reset. | `string` | `\"Continue\"` |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; reset: boolean; confirmPassword: boolean; oobCodeValidating: boolean; oobCodeValid: boolean; passwordDemoData?: PasswordFieldViewDemoProps; content: { passwordResetHeader: string; resetPasswordHeader: string; continueButtonText: string; resetPasswordButtonText: string; confirmPasswordFieldLabel: string; passwordFieldLabel: string; meetsRequirementsText?: string; doesNotMeetRequirementsText?: string; minErrorText?: string; uppercaseErrorText?: string; lowercaseErrorText?: string; hasErrorText?: string; resetSuccessText?: string; passwordMismatchText?: string; codeInvalidText?: string; }; }; }` | `undefined` |\n| `doesNotMeetRequirementsText` | `does-not-meet-requirements-text` | | `string` | `\"Password must meet the following requirements:\"` |\n| `failedPage` | `failed-page` | Redirect participants to this page if password reset fails due to an outdated reset attempt. | `string` | `\"/\"` |\n| `hasErrorText` | `has-error-text` | | `string` | `\"contain at least 1 number or symbol\"` |\n| `lowercaseErrorText` | `lowercase-error-text` | | `string` | `\"contain at least 1 lowercase character\"` |\n| `meetsRequirementsText` | `meets-requirements-text` | | `string` | `\"Password has met all requirements\"` |\n| `minErrorText` | `min-error-text` | | `string` | `\"be a minimum of 8 characters\"` |\n| `networkErrorMessage` | `network-error-message` | | `string` | `\"An error occurred while resetting your password. Please refresh the page and try again.\"` |\n| `nextPage` | `next-page` | Redirect participants to this page when they successfully reset their password. | `string` | `\"/\"` |\n| `passwordFieldLabel` | `password-field-label` | | `string` | `\"New Password\"` |\n| `passwordMismatchText` | `password-mismatch-text` | | `string` | `\"Passwords do not match.\"` |\n| `passwordResetHeader` | `password-reset-header` | Displayed after a successful password reset. | `string` | `\"Password reset\"` |\n| `resetPasswordButtonText` | `reset-password-button-text` | | `string` | `\"Reset Password\"` |\n| `resetPasswordHeader` | `reset-password-header` | | `string` | `\"Reset your password\"` |\n| `resetSuccessText` | `reset-success-text` | | `string` | `\"Your password has been reset and you are being redirected. If you are not redirected, please click Continue.\"` |\n| `uppercaseErrorText` | `uppercase-error-text` | | `string` | `\"contain at least 1 uppercase character\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n- [sqm-password-field](../sqm-password-field)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-reset-password --> sqm-form-message\n sqm-portal-reset-password --> sqm-password-field\n style sqm-portal-reset-password fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10348
+ const ResetPasswordReadme = "# sqm-portal-reset-password\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| ----------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| `codeInvalidText` | `code-invalid-text` | | `string` | `\"The password reset code is invalid or has expired, please try again.\"` |\n| `confirmPassword` | `confirm-password` | | `boolean` | `false` |\n| `confirmPasswordFieldLabel` | `confirm-password-field-label` | | `string` | `\"Confirm Password\"` |\n| `continueButtonText` | `continue-button-text` | Button text displayed after a successful password reset. | `string` | `\"Continue\"` |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; reset: boolean; confirmPassword: boolean; oobCodeValidating: boolean; oobCodeValid: boolean; passwordDemoData?: PasswordFieldViewDemoProps; content: { passwordResetHeader: string; resetPasswordHeader: string; continueButtonText: string; resetPasswordButtonText: string; confirmPasswordFieldLabel: string; passwordFieldLabel: string; meetsRequirementsText?: string; doesNotMeetRequirementsText?: string; minErrorText?: string; uppercaseErrorText?: string; lowercaseErrorText?: string; hasErrorText?: string; resetSuccessText?: string; passwordMismatchText?: string; codeInvalidText?: string; }; }; }` | `undefined` |\n| `doesNotMeetRequirementsText` | `does-not-meet-requirements-text` | | `string` | `\"Password must meet the following requirements:\"` |\n| `failedPage` | `failed-page` | Redirect participants to this page if password reset fails due to an outdated reset attempt. | `string` | `\"/\"` |\n| `hasErrorText` | `has-error-text` | | `string` | `\"contain at least 1 number or symbol\"` |\n| `lowercaseErrorText` | `lowercase-error-text` | | `string` | `\"contain at least 1 lowercase character\"` |\n| `meetsRequirementsText` | `meets-requirements-text` | | `string` | `\"Password has met all requirements\"` |\n| `minErrorText` | `min-error-text` | | `string` | `\"be a minimum of 8 characters\"` |\n| `networkErrorMessage` | `network-error-message` | Displayed when the password reset fails due to a network error. The participant can try refreshing the page. | `string` | `\"An error occurred while resetting your password. Please refresh the page and try again.\"` |\n| `nextPage` | `next-page` | Redirect participants to this page when they successfully reset their password. | `string` | `\"/\"` |\n| `passwordFieldLabel` | `password-field-label` | | `string` | `\"New Password\"` |\n| `passwordMismatchText` | `password-mismatch-text` | | `string` | `\"Passwords do not match.\"` |\n| `passwordResetHeader` | `password-reset-header` | Displayed after a successful password reset. | `string` | `\"Password reset\"` |\n| `resetPasswordButtonText` | `reset-password-button-text` | | `string` | `\"Reset Password\"` |\n| `resetPasswordHeader` | `reset-password-header` | | `string` | `\"Reset your password\"` |\n| `resetSuccessText` | `reset-success-text` | | `string` | `\"Your password has been reset and you are being redirected. If you are not redirected, please click Continue.\"` |\n| `uppercaseErrorText` | `uppercase-error-text` | | `string` | `\"contain at least 1 uppercase character\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n- [sqm-password-field](../sqm-password-field)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-reset-password --> sqm-form-message\n sqm-portal-reset-password --> sqm-password-field\n style sqm-portal-reset-password fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10167
10349
 
10168
- const EmailVerificationReadme = "# sqm-portal-email-verification\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| ---------------------------- | ------------------------------ | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; success: boolean; isVerified?: boolean; loadingVerification?: boolean; countdown?: number; }; content?: { email: string; verifyMessage: string; emailVerificationHeader: string; resendEmailButtonText: string; verificationStatusMessage?: string; verificationLoadingMessage?: string; verificationResentMessage?: string; }; }` | `undefined` |\n| `emailVerificationHeader` | `email-verification-header` | | `string` | `\"Verify your email\"` |\n| `networkErrorMessage` | `network-error-message` | | `string` | `\"An error occurred while verifying your password. Please refresh the page.\"` |\n| `redirectPath` | `redirect-path` | Redirect participants to this page from their verification email. | `string` | `\"/verifyEmail\"` |\n| `resendEmailButtonText` | `resend-email-button-text` | | `string` | `\"Re-send Email\"` |\n| `verificationLoadingMessage` | `verification-loading-message` | | `string` | `\"Checking verification status\"` |\n| `verificationResentMessage` | `verification-resent-message` | | `string` | `\"Your verification email has been resent successfully\"` |\n| `verificationStatusMessage` | `verification-status-message` | | `string` | `\"Checking verification status in {countdown}\"` |\n| `verifyMessage` | `verify-message` | | `string` | `\"A verification email was sent to {email}. Please verify your email to continue to the portal. Resending an email will invalidate the previous email.\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-email-verification --> sqm-form-message\n style sqm-portal-email-verification fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10350
+ const EmailVerificationReadme = "# sqm-portal-email-verification\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| ---------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; success: boolean; isVerified?: boolean; loadingVerification?: boolean; countdown?: number; }; content?: { email: string; verifyMessage: string; emailVerificationHeader: string; resendEmailButtonText: string; verificationStatusMessage?: string; verificationLoadingMessage?: string; verificationResentMessage?: string; }; }` | `undefined` |\n| `emailVerificationHeader` | `email-verification-header` | | `string` | `\"Verify your email\"` |\n| `networkErrorMessage` | `network-error-message` | Displayed when your verification email fails to send due to a network error. The participant can try refreshing the page. | `string` | `\"An error occurred while verifying your password. Please refresh the page.\"` |\n| `redirectPath` | `redirect-path` | Redirect participants to this page from their verification email. | `string` | `\"/verifyEmail\"` |\n| `resendEmailButtonText` | `resend-email-button-text` | | `string` | `\"Re-send Email\"` |\n| `verificationLoadingMessage` | `verification-loading-message` | | `string` | `\"Checking verification status\"` |\n| `verificationResentMessage` | `verification-resent-message` | | `string` | `\"Your verification email has been resent successfully\"` |\n| `verificationStatusMessage` | `verification-status-message` | | `string` | `\"Checking verification status in {countdown}\"` |\n| `verifyMessage` | `verify-message` | | `string` | `\"A verification email was sent to {email}. Please verify your email to continue to the portal. Resending an email will invalidate the previous email.\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-email-verification --> sqm-form-message\n style sqm-portal-email-verification fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10169
10351
 
10170
- const EmailVerifiedReadme = "# sqm-portal-verify-email\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| --------------------- | ----------------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| `continueText` | `continue-text` | | `string` | `\"Continue\"` |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; success: boolean; }; data?: { oobCode: string; }; content?: { verifySuccessText?: string; verifyEmailText?: string; verifyInvalidText?: string; continueText?: string; }; }` | `undefined` |\n| `failedPage` | `failed-page` | Redirect participants to this page if verification fails due to an outdated verification attempt. | `string` | `\"/\"` |\n| `networkErrorMessage` | `network-error-message` | | `string` | `\"An error occurred while verifying your email. Please refresh the page and try again.\"` |\n| `nextPage` | `next-page` | Redirect participants to this page when they successfully verify their email. | `string` | `\"/\"` |\n| `verifyEmailText` | `verify-email-text` | | `string` | `\"Verify your email\"` |\n| `verifyInvalidText` | `verify-invalid-text` | | `string` | `\"The email verification code is invalid or has expired, please try again.\"` |\n| `verifySuccessText` | `verify-success-text` | | `string` | `\"Your email has been verified and you are being redirected. If you are not redirected, please click Continue.\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-verify-email --> sqm-form-message\n style sqm-portal-verify-email fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10352
+ const EmailVerifiedReadme = "# sqm-portal-verify-email\n\n\n\n<!-- Auto Generated Below -->\n\n\n## Properties\n\n| Property | Attribute | Description | Type | Default |\n| --------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| `continueText` | `continue-text` | | `string` | `\"Continue\"` |\n| `demoData` | -- | | `{ states?: { error: string; loading: boolean; success: boolean; }; data?: { oobCode: string; }; content?: { verifySuccessText?: string; verifyEmailText?: string; verifyInvalidText?: string; continueText?: string; }; }` | `undefined` |\n| `failedPage` | `failed-page` | Redirect participants to this page if verification fails due to an outdated verification attempt. | `string` | `\"/\"` |\n| `networkErrorMessage` | `network-error-message` | Displayed when the email verification fails due to a network error. The participant can try refreshing the page. | `string` | `\"An error occurred while verifying your email. Please refresh the page and try again.\"` |\n| `nextPage` | `next-page` | Redirect participants to this page when they successfully verify their email. | `string` | `\"/\"` |\n| `verifyEmailText` | `verify-email-text` | | `string` | `\"Verify your email\"` |\n| `verifyInvalidText` | `verify-invalid-text` | | `string` | `\"The email verification code is invalid or has expired, please try again.\"` |\n| `verifySuccessText` | `verify-success-text` | | `string` | `\"Your email has been verified and you are being redirected. If you are not redirected, please click Continue.\"` |\n\n\n## Dependencies\n\n### Depends on\n\n- [sqm-form-message](../sqm-form-message)\n\n### Graph\n```mermaid\ngraph TD;\n sqm-portal-verify-email --> sqm-form-message\n style sqm-portal-verify-email fill:#f9f,stroke:#333,stroke-width:4px\n```\n\n----------------------------------------------\n\n*Built with [StencilJS](https://stenciljs.com/)*\n";
10171
10353
 
10172
10354
  const PortalTemplates_stories = {
10173
10355
  title: "Templates / Microsite",
@@ -10328,7 +10510,7 @@ const ProgramMenu = /*#__PURE__*/Object.freeze({
10328
10510
  const PoweredByImg_stories = {
10329
10511
  title: "Powered By",
10330
10512
  };
10331
- const Default$b = () => {
10513
+ const Default$d = () => {
10332
10514
  return h(PoweredByImg$1, null);
10333
10515
  };
10334
10516
  const CustomColor = () => {
@@ -10341,7 +10523,7 @@ const CustomWidthAndHeight = () => {
10341
10523
  const PoweredByImg = /*#__PURE__*/Object.freeze({
10342
10524
  __proto__: null,
10343
10525
  'default': PoweredByImg_stories,
10344
- Default: Default$b,
10526
+ Default: Default$d,
10345
10527
  CustomColor: CustomColor,
10346
10528
  CustomWidthAndHeight: CustomWidthAndHeight
10347
10529
  });
@@ -10354,7 +10536,7 @@ const PortalFooter_stories = {
10354
10536
  scenario: scenario$f,
10355
10537
  },
10356
10538
  };
10357
- const defaultProps$9 = {
10539
+ const defaultProps$b = {
10358
10540
  supportEmail: "support@example.com",
10359
10541
  supportText: "For program support, contact {email}",
10360
10542
  hidePoweredBy: false,
@@ -10364,12 +10546,12 @@ const defaultProps$9 = {
10364
10546
  paddingBottom: "large",
10365
10547
  paddingLeft: "large",
10366
10548
  };
10367
- const DefaultFooter = () => h(PortalFooterView, Object.assign({}, defaultProps$9));
10368
- const FooterWithTerms = () => (h(PortalFooterView, Object.assign({}, defaultProps$9, { termsLink: "https://example.com", termsText: "Terms and Conditions" })));
10369
- const FooterWithFAQ = () => (h(PortalFooterView, Object.assign({}, defaultProps$9, { faqLink: "https://example.com", faqText: "FAQ" })));
10370
- const FooterWithTermsAndFAQ = () => (h(PortalFooterView, Object.assign({}, defaultProps$9, { termsLink: "https://example.com", termsText: "Terms and Conditions", faqLink: "https://example.com", faqText: "FAQ" })));
10371
- const FooterNoPoweredBy = () => (h(PortalFooterView, Object.assign({}, defaultProps$9, { termsLink: "https://example.com", termsText: "Terms and Conditions", faqLink: "https://example.com", faqText: "FAQ", hidePoweredBy: true })));
10372
- const FooterNoSupportText = () => (h(PortalFooterView, Object.assign({}, defaultProps$9, { termsLink: "https://example.com", termsText: "Terms and Conditions", faqLink: "https://example.com", faqText: "FAQ", hideSupportText: true })));
10549
+ const DefaultFooter = () => h(PortalFooterView, Object.assign({}, defaultProps$b));
10550
+ const FooterWithTerms = () => (h(PortalFooterView, Object.assign({}, defaultProps$b, { termsLink: "https://example.com", termsText: "Terms and Conditions" })));
10551
+ const FooterWithFAQ = () => (h(PortalFooterView, Object.assign({}, defaultProps$b, { faqLink: "https://example.com", faqText: "FAQ" })));
10552
+ const FooterWithTermsAndFAQ = () => (h(PortalFooterView, Object.assign({}, defaultProps$b, { termsLink: "https://example.com", termsText: "Terms and Conditions", faqLink: "https://example.com", faqText: "FAQ" })));
10553
+ const FooterNoPoweredBy = () => (h(PortalFooterView, Object.assign({}, defaultProps$b, { termsLink: "https://example.com", termsText: "Terms and Conditions", faqLink: "https://example.com", faqText: "FAQ", hidePoweredBy: true })));
10554
+ const FooterNoSupportText = () => (h(PortalFooterView, Object.assign({}, defaultProps$b, { termsLink: "https://example.com", termsText: "Terms and Conditions", faqLink: "https://example.com", faqText: "FAQ", hideSupportText: true })));
10373
10555
 
10374
10556
  const PortalFooter = /*#__PURE__*/Object.freeze({
10375
10557
  __proto__: null,
@@ -10651,7 +10833,7 @@ const props$1 = {
10651
10833
  },
10652
10834
  },
10653
10835
  };
10654
- const errorProps$8 = {
10836
+ const errorProps$9 = {
10655
10837
  states: {
10656
10838
  registrationFormState: {
10657
10839
  validationErrors: {
@@ -10669,7 +10851,7 @@ const NameFields = () => {
10669
10851
  return h(NameFieldsView, Object.assign({}, props$1));
10670
10852
  };
10671
10853
  const NameFieldsWithErrors = () => {
10672
- return h(NameFieldsView, Object.assign({}, errorProps$8));
10854
+ return h(NameFieldsView, Object.assign({}, errorProps$9));
10673
10855
  };
10674
10856
 
10675
10857
  const NameFields$1 = /*#__PURE__*/Object.freeze({
@@ -10687,7 +10869,7 @@ const CheckboxField_stories = {
10687
10869
  scenario: scenario$j,
10688
10870
  },
10689
10871
  };
10690
- const defaultProps$a = {
10872
+ const defaultProps$c = {
10691
10873
  states: {
10692
10874
  registrationFormState: {
10693
10875
  validationErrors: {},
@@ -10695,7 +10877,7 @@ const defaultProps$a = {
10695
10877
  checked: false,
10696
10878
  },
10697
10879
  content: {
10698
- checkboxName: "agree",
10880
+ checkboxName: "terms",
10699
10881
  checkboxLabel: "By signing up you agree to the {labelLink}",
10700
10882
  checkboxLabelLink: "https://example.com",
10701
10883
  checkboxLabelLinkText: "Terms and Conditions",
@@ -10728,35 +10910,35 @@ const defaultRegisterProps = {
10728
10910
  invalidEmailErrorMessage: "Must be a valid email address",
10729
10911
  },
10730
10912
  };
10731
- const Default$c = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$a))));
10732
- const DefaultChecked = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$a, { states: {
10733
- ...defaultProps$a.states,
10913
+ const Default$e = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$c))));
10914
+ const DefaultChecked = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$c, { states: {
10915
+ ...defaultProps$c.states,
10734
10916
  checked: true,
10735
10917
  } }))));
10736
- const CustomLabel = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$a, { content: {
10737
- ...defaultProps$a.content,
10918
+ const CustomLabel = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$c, { content: {
10919
+ ...defaultProps$c.content,
10738
10920
  checkboxLabel: "I Agree",
10739
10921
  } }))));
10740
- const Error$4 = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$a, { states: {
10741
- ...defaultProps$a.states,
10922
+ const Error$5 = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$c, { states: {
10923
+ ...defaultProps$c.states,
10742
10924
  registrationFormState: {
10743
10925
  validationErrors: {
10744
10926
  agree: "Must be checked",
10745
10927
  },
10746
10928
  },
10747
10929
  } }))));
10748
- const CustomError = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$a, { states: {
10749
- ...defaultProps$a.states,
10930
+ const CustomError = createHookStory(() => (h(CheckboxFieldView, Object.assign({}, defaultProps$c, { states: {
10931
+ ...defaultProps$c.states,
10750
10932
  registrationFormState: {
10751
10933
  validationErrors: {
10752
10934
  agree: "Must be checked",
10753
10935
  },
10754
10936
  },
10755
10937
  }, content: {
10756
- ...defaultProps$a.content,
10938
+ ...defaultProps$c.content,
10757
10939
  errorMessage: "This checkbox must be checked to continue",
10758
10940
  } }))));
10759
- const TermsAndConditions$1 = createHookStory(() => (h(PortalRegisterView, Object.assign({}, defaultRegisterProps, {
10941
+ const TermsAndConditions$2 = createHookStory(() => (h(PortalRegisterView, Object.assign({}, defaultRegisterProps, {
10760
10942
  //@ts-ignore
10761
10943
  content: {
10762
10944
  ...defaultRegisterProps.content,
@@ -10783,16 +10965,34 @@ const TermsAndConditionsLongCustomLabel = createHookStory(() => (h(PortalRegiste
10783
10965
  const CheckboxField = /*#__PURE__*/Object.freeze({
10784
10966
  __proto__: null,
10785
10967
  'default': CheckboxField_stories,
10786
- Default: Default$c,
10968
+ Default: Default$e,
10787
10969
  DefaultChecked: DefaultChecked,
10788
10970
  CustomLabel: CustomLabel,
10789
- Error: Error$4,
10971
+ Error: Error$5,
10790
10972
  CustomError: CustomError,
10791
- TermsAndConditions: TermsAndConditions$1,
10973
+ TermsAndConditions: TermsAndConditions$2,
10792
10974
  TermsAndConditionsCustomLabel: TermsAndConditionsCustomLabel,
10793
10975
  TermsAndConditionsLongCustomLabel: TermsAndConditionsLongCustomLabel
10794
10976
  });
10795
10977
 
10978
+ const scenario$k = "@owner:zach\n@author:zach\nFeature: Marketing Emails Checkbox\n\n A checkbox that is used to opt in for marketing emails.\n\n Background: The microsite registration form contains a marketing emails checkbox\n\n Scenario: The registration form can be configured to include a marketing emails checkbox\n Given a user is viewing the \"/register\"\n And \"/register\" contains the registration form\n And they have added a marketing emails checkbox to the form in the content editor\n Then the registration form has the following fields\n | fields |\n | first name |\n | last name |\n | email |\n | password |\n | Marketing Emails Checkbox |\n\n\n Scenario: The user can opt in to marketing emails\n Given the user is filling out the registration form\n And the fields have valid input\n And the marketing emails checkbox is checked\n When they try to register\n Then the form is submitted\n And there are no errors\n And the \"marketingEmailOptIn\" value is set to true\n And the user is opted in to marketing emails\n\n\n @motivating\n Scenario: Checkbox is optional by default\n Given the user is filling out the registration form\n And the name fields have valid input\n And the email field has valid input\n And the password field has valid input\n And the checkbox is not checked\n When they try to register\n Then the form is submitted\n And there is no error for the checkbox\n\n Scenario: The form field name is provided by default\n Given the customer has added a marketing emails checkbox to their registration form\n Then the field name is automatically set to \"marketingEmailOptIn\"\n And the name is not configurable";
10979
+
10980
+ const MarketingEmailsCheckbox_stories = {
10981
+ title: "Components/Marketing Emails Checkbox",
10982
+ parameters: {
10983
+ scenario: scenario$k,
10984
+ },
10985
+ };
10986
+ const Default$f = () => {
10987
+ return h("sqm-marketing-emails-checkbox", null);
10988
+ };
10989
+
10990
+ const MarketingEmailsCheckbox = /*#__PURE__*/Object.freeze({
10991
+ __proto__: null,
10992
+ 'default': MarketingEmailsCheckbox_stories,
10993
+ Default: Default$f
10994
+ });
10995
+
10796
10996
  const UseCheckboxField_stories = {
10797
10997
  title: "Hooks / useCheckboxField",
10798
10998
  parameters: {
@@ -10822,7 +11022,7 @@ function setupGraphQL$9() {
10822
11022
  }, []);
10823
11023
  return { id, accountId };
10824
11024
  }
10825
- const TermsAndConditions$2 = createHookStory(() => {
11025
+ const TermsAndConditions$3 = createHookStory(() => {
10826
11026
  setupGraphQL$9();
10827
11027
  return (h("sqm-portal-register", null,
10828
11028
  h("div", { slot: "terms" },
@@ -10860,7 +11060,7 @@ const MissingName = createHookStory(() => {
10860
11060
  const UseCheckboxField = /*#__PURE__*/Object.freeze({
10861
11061
  __proto__: null,
10862
11062
  'default': UseCheckboxField_stories,
10863
- TermsAndConditions: TermsAndConditions$2,
11063
+ TermsAndConditions: TermsAndConditions$3,
10864
11064
  TermsAndConditionsWithLabel: TermsAndConditionsWithLabel,
10865
11065
  MultipleCheckboxes: MultipleCheckboxes,
10866
11066
  OptionalCheckboxes: OptionalCheckboxes,
@@ -10870,7 +11070,7 @@ const UseCheckboxField = /*#__PURE__*/Object.freeze({
10870
11070
  const DropdownField_stories = {
10871
11071
  title: "Components/Dropdown Field",
10872
11072
  };
10873
- const defaultProps$b = {
11073
+ const defaultProps$d = {
10874
11074
  states: {
10875
11075
  registrationFormState: {},
10876
11076
  },
@@ -10885,24 +11085,24 @@ const defaultProps$b = {
10885
11085
  ],
10886
11086
  },
10887
11087
  };
10888
- const Default$d = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$b))));
10889
- const CustomLabel$1 = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$b, { content: {
10890
- ...defaultProps$b.content,
11088
+ const Default$g = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$d))));
11089
+ const CustomLabel$1 = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$d, { content: {
11090
+ ...defaultProps$d.content,
10891
11091
  dropdownLabel: "Pick your favorite",
10892
11092
  } }))));
10893
- const Error$5 = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$b, { states: {
10894
- ...defaultProps$b.states,
11093
+ const Error$6 = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$d, { states: {
11094
+ ...defaultProps$d.states,
10895
11095
  registrationFormState: {
10896
11096
  validationErrors: {
10897
11097
  options: "Must select an option",
10898
11098
  },
10899
11099
  },
10900
11100
  } }))));
10901
- const CustomError$1 = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$b, { content: {
10902
- ...defaultProps$b.content,
11101
+ const CustomError$1 = createHookStory(() => (h(DropdownFieldView, Object.assign({}, defaultProps$d, { content: {
11102
+ ...defaultProps$d.content,
10903
11103
  errorMessage: "An option must be selected to continue",
10904
11104
  }, states: {
10905
- ...defaultProps$b.states,
11105
+ ...defaultProps$d.states,
10906
11106
  registrationFormState: {
10907
11107
  validationErrors: {
10908
11108
  options: "Must select an option",
@@ -10913,9 +11113,9 @@ const CustomError$1 = createHookStory(() => (h(DropdownFieldView, Object.assign(
10913
11113
  const DropdownField = /*#__PURE__*/Object.freeze({
10914
11114
  __proto__: null,
10915
11115
  'default': DropdownField_stories,
10916
- Default: Default$d,
11116
+ Default: Default$g,
10917
11117
  CustomLabel: CustomLabel$1,
10918
- Error: Error$5,
11118
+ Error: Error$6,
10919
11119
  CustomError: CustomError$1
10920
11120
  });
10921
11121
 
@@ -10978,15 +11178,15 @@ const UseDropdownField = /*#__PURE__*/Object.freeze({
10978
11178
  MissingName: MissingName$1
10979
11179
  });
10980
11180
 
10981
- const scenario$k = "@author:derek\n@owner:derek\nFeature: Form Input Field\n\n This component is used as a custom registration field during registration. The field can be text,\n a date or phone number. A motivating use case is to ask for a users company name, this value would then be mapped\n through the Managed Identity Service and upserted on the user after registration.\n\n Background: A user exists and is viewing the hosted portal registration\n Given a user is viewing \"/register\"\n And \"/register\" contains the registration form\n And the registration form has a custom input field\n\n @motivating\n Scenario Outline: Input fields are required by default but can be optional\n Given the input has prop \"field-optional\" with <value>\n And the input is empty\n When the user tries to register\n Then the input <mayBe> highlighted in red\n And an error message <mayAppear> in red below\n And form submission <mayBe> blocked\n Examples:\n | value | mayBe | mayAppear |\n | false | is | appears |\n | | is | appears |\n | true | isn't | doesn't appear |\n\n @motivating\n Scenario: Input field labels are configurable\n Given the input has prop \"field-label\" with value \"My Custom Input\"\n When the user views the registration form\n Then they see the input field\n And it has label \"My Custom Input\" above the input\n\n @minutia\n Scenario Outline: The validation error message is configurable\n The error message string is evaluated as an ICU string, but currently is provided no context\n Given the input is required\n And it has prop \"error-message\" with <value>\n When the user tries to register\n But they haven't filled in the input\n Then they see <errorMessage> below\n Examples:\n | value | errorMessage |\n | | Cannot be empty |\n | My Custom Message | My Custom Message |\n\n @motivating\n Scenario: Form data attribute name is configurable\n Given the input has prop \"field-name\" with value \"myCustomField\"\n When the user types \"testing testing\" into the input\n And they register\n Then \"testing testing\" is submitted under \"myCustomField\" in the form data\n\n @motivating\n Scenario Outline: The input field is a text input by default\n Given the input <mayHave> prop \"field-type\" with <value>\n When the user views the input field\n Then it is a text input\n Examples:\n | mayHave | value |\n | has | text |\n | doesn't have | |\n\n @motivating\n Scenario: Date type inputs are supported\n Given the input has prop \"field-type\" \"date\"\n When the user views the input field\n Then they see \"mm/dd/yyyy\" as a placeholder\n And they see a calendar icon on the right\n When they start typing a date\n Then it maintains the \"mm/dd/yyyy\" format\n When they click the calendar icon\n Then a dropdown appears\n And they see a calendar\n When they select a date\n Then it is applied to the input\n\n @landmine\n Scenario: The clear text button in the date picker does not clear the date\n Due to an incompatibility between our shoelace version and the browser, the clear funtionality is not supported currently\n Given the input has prop \"field-type\" \"date\"\n And the user has entered a date\n When they click the calendar icon\n And click the 'clear' text button\n Then their selected date is not cleared\n\n @motivating\n Scenario: Phone number type inputs are supported\n Given the input has prop \"field-type\" with value \"tel\"\n When the user starts typing a phone number in the input\n Then it is formatted into the following form \"(XXX) XXX-XXXX\"\n When they pre-fix their phone number with a \"1\"\n Then it is formatted into the following form \"1 (XXX) XXX-XXXX\"\n\n @landmine\n Scenario: Telephone formatting is removed after 10 numbers\n Given a user using a phone number input field\n And they entered their 10 character phone number\n And it was not prefixed with a 1\n When they add another character\n Then the formatting is removed\n\n @landmine\n Scenario Outline: Input values are always recorded as strings in the form data\n Given the input has prop \"field-type\" with <value>\n And it has a \"field-name\"\n When the user inputs <formInput>\n And they register\n Then <formData> is recorded in the form data as a string\n Examples:\n | value | formInput | formData |\n | text | Hello there | Hello there |\n | date | 05/07/2021 | 2021-05-07 |\n | tel | (250) 234-9877 | (250) 234-9877 |\n\n @minutia\n Scenario Outline: The input field component fails fast if a field name isn't provided\n Given the input <mayHave> prop \"field-name\"\n And it <mayHavePropValue>\n When a user views the input\n Then an alert with an error message is displayed in place of the input\n And it has a details section\n When \"More details\" is clicked\n Then the following information is displayed\n | information |\n | component being used |\n | missing attribute(s) |\n Examples:\n | mayBeAnAttribute | mayHavePropValue |\n | doesn't have | N/A |\n | has | \"\" |\n | has | |";
11181
+ const scenario$l = "@author:derek\n@owner:derek\nFeature: Form Input Field\n\n This component is used as a custom registration field during registration. The field can be text,\n a date or phone number. A motivating use case is to ask for a users company name, this value would then be mapped\n through the Managed Identity Service and upserted on the user after registration.\n\n Background: A user exists and is viewing the hosted portal registration\n Given a user is viewing \"/register\"\n And \"/register\" contains the registration form\n And the registration form has a custom input field\n\n @motivating\n Scenario Outline: Input fields are required by default but can be optional\n Given the input has prop \"field-optional\" with <value>\n And the input is empty\n When the user tries to register\n Then the input <mayBe> highlighted in red\n And an error message <mayAppear> in red below\n And form submission <mayBe> blocked\n Examples:\n | value | mayBe | mayAppear |\n | false | is | appears |\n | | is | appears |\n | true | isn't | doesn't appear |\n\n @motivating\n Scenario: Input field labels are configurable\n Given the input has prop \"field-label\" with value \"My Custom Input\"\n When the user views the registration form\n Then they see the input field\n And it has label \"My Custom Input\" above the input\n\n @minutia\n Scenario Outline: The validation error message is configurable\n The error message string is evaluated as an ICU string, but currently is provided no context\n Given the input is required\n And it has prop \"error-message\" with <value>\n When the user tries to register\n But they haven't filled in the input\n Then they see <errorMessage> below\n Examples:\n | value | errorMessage |\n | | Cannot be empty |\n | My Custom Message | My Custom Message |\n\n @motivating\n Scenario: Form data attribute name is configurable\n Given the input has prop \"field-name\" with value \"myCustomField\"\n When the user types \"testing testing\" into the input\n And they register\n Then \"testing testing\" is submitted under \"myCustomField\" in the form data\n\n @motivating\n Scenario Outline: The input field is a text input by default\n Given the input <mayHave> prop \"field-type\" with <value>\n When the user views the input field\n Then it is a text input\n Examples:\n | mayHave | value |\n | has | text |\n | doesn't have | |\n\n @motivating\n Scenario: Date type inputs are supported\n Given the input has prop \"field-type\" \"date\"\n When the user views the input field\n Then they see \"mm/dd/yyyy\" as a placeholder\n And they see a calendar icon on the right\n When they start typing a date\n Then it maintains the \"mm/dd/yyyy\" format\n When they click the calendar icon\n Then a dropdown appears\n And they see a calendar\n When they select a date\n Then it is applied to the input\n\n @landmine\n Scenario: The clear text button in the date picker does not clear the date\n Due to an incompatibility between our shoelace version and the browser, the clear funtionality is not supported currently\n Given the input has prop \"field-type\" \"date\"\n And the user has entered a date\n When they click the calendar icon\n And click the 'clear' text button\n Then their selected date is not cleared\n\n @motivating\n Scenario: Phone number type inputs are supported\n Given the input has prop \"field-type\" with value \"tel\"\n When the user starts typing a phone number in the input\n Then it is formatted into the following form \"(XXX) XXX-XXXX\"\n When they pre-fix their phone number with a \"1\"\n Then it is formatted into the following form \"1 (XXX) XXX-XXXX\"\n\n @landmine\n Scenario: Telephone formatting is removed after 10 numbers\n Given a user using a phone number input field\n And they entered their 10 character phone number\n And it was not prefixed with a 1\n When they add another character\n Then the formatting is removed\n\n @landmine\n Scenario Outline: Input values are always recorded as strings in the form data\n Given the input has prop \"field-type\" with <value>\n And it has a \"field-name\"\n When the user inputs <formInput>\n And they register\n Then <formData> is recorded in the form data as a string\n Examples:\n | value | formInput | formData |\n | text | Hello there | Hello there |\n | date | 05/07/2021 | 2021-05-07 |\n | tel | (250) 234-9877 | (250) 234-9877 |\n\n @minutia\n Scenario Outline: The input field component fails fast if a field name isn't provided\n Given the input <mayHave> prop \"field-name\"\n And it <mayHavePropValue>\n When a user views the input\n Then an alert with an error message is displayed in place of the input\n And it has a details section\n When \"More details\" is clicked\n Then the following information is displayed\n | information |\n | component being used |\n | missing attribute(s) |\n Examples:\n | mayBeAnAttribute | mayHavePropValue |\n | doesn't have | N/A |\n | has | \"\" |\n | has | |";
10982
11182
 
10983
11183
  const InputField_stories = {
10984
11184
  title: "Components/Input Field",
10985
11185
  parameters: {
10986
- scenario: scenario$k,
11186
+ scenario: scenario$l,
10987
11187
  },
10988
11188
  };
10989
- const defaultProps$c = {
11189
+ const defaultProps$e = {
10990
11190
  states: {
10991
11191
  registrationFormState: {
10992
11192
  validationErrors: {},
@@ -11023,21 +11223,21 @@ const defaultRegisterProps$1 = {
11023
11223
  invalidEmailErrorMessage: "Must be a valid email address",
11024
11224
  },
11025
11225
  };
11026
- const Default$e = () => h(InputFieldView, Object.assign({}, defaultProps$c));
11027
- const CustomLabel$2 = () => (h(InputFieldView, Object.assign({}, defaultProps$c, { content: { ...defaultProps$c.content, fieldLabel: "My Label" } })));
11028
- const Error$6 = () => (h(InputFieldView, Object.assign({}, defaultProps$c, { states: {
11029
- ...defaultProps$c.states,
11226
+ const Default$h = () => h(InputFieldView, Object.assign({}, defaultProps$e));
11227
+ const CustomLabel$2 = () => (h(InputFieldView, Object.assign({}, defaultProps$e, { content: { ...defaultProps$e.content, fieldLabel: "My Label" } })));
11228
+ const Error$7 = () => (h(InputFieldView, Object.assign({}, defaultProps$e, { states: {
11229
+ ...defaultProps$e.states,
11030
11230
  registrationFormState: {
11031
11231
  validationErrors: {
11032
11232
  field: "Cannot be empty",
11033
11233
  },
11034
11234
  },
11035
11235
  } })));
11036
- const CustomError$2 = () => (h(InputFieldView, Object.assign({}, defaultProps$c, { content: {
11037
- ...defaultProps$c.content,
11236
+ const CustomError$2 = () => (h(InputFieldView, Object.assign({}, defaultProps$e, { content: {
11237
+ ...defaultProps$e.content,
11038
11238
  errorMessage: "A value must be entered to continue",
11039
11239
  }, states: {
11040
- ...defaultProps$c.states,
11240
+ ...defaultProps$e.states,
11041
11241
  registrationFormState: {
11042
11242
  validationErrors: {
11043
11243
  field: "Cannot be empty",
@@ -11045,27 +11245,27 @@ const CustomError$2 = () => (h(InputFieldView, Object.assign({}, defaultProps$c,
11045
11245
  },
11046
11246
  } })));
11047
11247
  const DateType = () => {
11048
- return (h(InputFieldView, Object.assign({}, defaultProps$c, { content: {
11049
- ...defaultProps$c.content,
11248
+ return (h(InputFieldView, Object.assign({}, defaultProps$e, { content: {
11249
+ ...defaultProps$e.content,
11050
11250
  fieldLabel: "Date",
11051
11251
  fieldType: "date",
11052
11252
  } })));
11053
11253
  };
11054
11254
  const TelType = () => {
11055
- return (h(InputFieldView, Object.assign({}, defaultProps$c, { content: {
11056
- ...defaultProps$c.content,
11255
+ return (h(InputFieldView, Object.assign({}, defaultProps$e, { content: {
11256
+ ...defaultProps$e.content,
11057
11257
  fieldLabel: "Phone Number",
11058
11258
  fieldType: "tel",
11059
11259
  } })));
11060
11260
  };
11061
11261
  const RegistrationField = () => (h(PortalRegisterView, Object.assign({}, defaultRegisterProps$1, { content: {
11062
11262
  ...defaultRegisterProps$1.content,
11063
- formData: h(InputFieldView, Object.assign({}, defaultProps$c)),
11263
+ formData: h(InputFieldView, Object.assign({}, defaultProps$e)),
11064
11264
  } })));
11065
11265
  const RegistrationFieldCustomLabel = () => (h(PortalRegisterView, Object.assign({}, defaultRegisterProps$1, { content: {
11066
11266
  ...defaultRegisterProps$1.content,
11067
- formData: (h(InputFieldView, Object.assign({}, defaultProps$c, { content: {
11068
- ...defaultProps$c.content,
11267
+ formData: (h(InputFieldView, Object.assign({}, defaultProps$e, { content: {
11268
+ ...defaultProps$e.content,
11069
11269
  fieldLabel: "Data",
11070
11270
  } }))),
11071
11271
  } })));
@@ -11073,9 +11273,9 @@ const RegistrationFieldCustomLabel = () => (h(PortalRegisterView, Object.assign(
11073
11273
  const InputField = /*#__PURE__*/Object.freeze({
11074
11274
  __proto__: null,
11075
11275
  'default': InputField_stories,
11076
- Default: Default$e,
11276
+ Default: Default$h,
11077
11277
  CustomLabel: CustomLabel$2,
11078
- Error: Error$6,
11278
+ Error: Error$7,
11079
11279
  CustomError: CustomError$2,
11080
11280
  DateType: DateType,
11081
11281
  TelType: TelType,
@@ -11086,7 +11286,7 @@ const InputField = /*#__PURE__*/Object.freeze({
11086
11286
  const UseInputField_stories = {
11087
11287
  title: "Hooks / useInputField",
11088
11288
  parameters: {
11089
- scenario: scenario$k,
11289
+ scenario: scenario$l,
11090
11290
  },
11091
11291
  };
11092
11292
  function setupGraphQL$b() {
@@ -11168,12 +11368,12 @@ const UseInputField = /*#__PURE__*/Object.freeze({
11168
11368
  MissingName: MissingName$2
11169
11369
  });
11170
11370
 
11171
- const scenario$l = "@author:derek\n@owner:derek\nFeature: Reward Exchange List\n\n The Reward Exchange List gives end users the power to exchange their rewards for other rewards.\n It populates a list from the reward exchange rules set up on a given tenant.\n\n Background:\n Given a tenant with reward exchange rules\n\n @motivating\n @ui\n Scenario: The empty state is shown if there are no visible exchanges\n Given a user with no visible exchanges\n When they view the reward exchange\n Then no exchange options are displayed\n And they see an image of a present\n And \"Redeem Rewards\" in bold\n And \"Use your points to redeem rewards once they become available\" below the bolded text\n And the pagination buttons are disabled\n\n @minutia\n @ui\n Scenario: A custom empty state can be provided\n Given a user with no visible exchanges\n And a custom empty state has been supplied in the \"empty\" slot\n When they view the reward exchange\n Then they see the custom empty state\n\n @motivating\n @ui\n Scenario: A Loading Skeleton is displayed when the reward exchange rules are loading\n Given a user\n When they load the reward exchange list\n Then they see a loading Skeleton\n And it has 8 skeleton cards\n When the reward exchange rules have loaded\n Then the skeleton is replaced with reward exchange options\n\n @motivating\n Scenario: An error banner appears when the reward exchange list fails to load\n Given a user trying to view the reward exchange list\n But it fails to load\n Then an error banner is displayed\n And it displays \"Unable to load reward exchange list. Please try again\"\n\n @motivating\n @ui\n Scenario: The exchange progress bar progresses through the exchange process\n Given a user who is eligible for the tenants reward exchange rules\n When they view the reward exchange list\n Then the process bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with green outline, white fill and number 1 in green |\n | Step 2 `Select` title in grey |\n | Step 2 circle with grey fill and number 2 in white |\n | Step 3 `Confirm` title in grey |\n | Step 3 circle with grey fill and number 3 in white |\n | lines between all steps are greyed out |\n When they continue to the selection page\n Then the progress bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with white checkmark and green fill |\n | Step 2 `Select` title in black |\n | Step 2 circle with green outline, white fill and number 2 in green |\n | Step 3 `Confirm` title in grey |\n | Step 3 circle with grey fill and number 3 in white |\n | Green line between step 1 and 2 |\n | Grey line between step 2 and 3 |\n When they continue to the confirmation page\n Then the progress bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with white checkmark and green fill |\n | Step 2 `Select` title in black |\n | Step 2 circle with white checkmark and green fill |\n | Step 3 `Confirm` title in black |\n | Step 3 circle with green outline, white fill and number 3 in green |\n | Green line between all steps |\n When they continue to the redemption page\n Then the progress bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with white checkmark and green fill |\n | Step 2 `Select` title in black |\n | Step 2 circle with white checkmark and green fill |\n | Step 3 `Confirm` title in black |\n | Step 3 circle with white checkmark and green fill |\n | Green line between all steps |\n\n @motivating\n Scenario: Users must choose a reward exchange option to continue to the selection page\n Given a user who is eligible for the tenants reward exchange rules\n When they view the reward exchange list\n Then the 'Continue' button is disabled\n When they select a reward exchange card\n Then the card is outlined in brand colour with a brand colour cirlcular check box icon in the top right\n And the continue button is no longer disabled\n When they click \"Continue\"\n Then they are brought to the selection page\n\n @motivating\n @ui\n Scenario: Reward exchange rule names and images are used in the reward exchange cards\n Given a tenant reward exchange rule\n And it has name \"My Visa Exchange Rule\"\n And it has an image\n When a user views the reward exchange list\n Then they see a exchange card with title \"My Visa Exchange Rule\"\n And the exchange image on the left hand side of the card\n\n @motivating\n Scenario Outline: Reward exchange source values are displayed on reward exchange cards\n Given a <type> reward exchange rule\n When a user views the reward exchange list\n Then they see <text> under the name on the exchange option cards\n And the pretty values are localized to a user locale\n Examples:\n | type | text |\n | FIXED_GLOBAL_REWARD | the exchange source pretty value |\n | STEPPED_FIXED_GLOBAL_REWARD | the exchange source min pretty value to the source max pretty value |\n | VARIABLE_GLOBAL_REWARD | the exchange source min pretty value to the source max pretty value |\n | VARIABLE_CREDIT_REWARD | the exchange source min pretty value to the source max pretty value |\n\n @motivating\n Scenario Outline: Reward exchange cards can display customized error messages\n Given a reward exchange rule\n And it has <availabilityPredicate>\n And the reward exchange list has prop \"not-available-error\" with <value>\n When the user views the reward exchange list\n Then the card for the reward exchange rule is disabled\n And <message> is displayed\n Examples:\n | availabilityPredicate | value | message |\n | 'champion' in user.segments ? \"NOT_CHAMPION\" : true | {unavailableReasonCode, select, NOT_CHAMPION {Sorry must be a champion!} other {unavailableReasonCode} } | Sorry must be a champion! |\n | user.customFields.purchaseCount < 10 ? \"MORE_PURCHASE\" : true | {unavailableReasonCode, select, MORE_PURCHASE {Complete 10 purchases to unlock} other {unavailableReasonCode} } | Complete 10 purchases to unlock |\n\n @motivating\n Scenario: Exchange options are disabled if they put a user over the W9 limit\n Given a user who is approaching their W9 limit\n And a reward exchange rule\n And its destination reward has a US taxable value that would put the user over their limit\n When they view the reward exchange list\n Then the reward exchange card is disabled\n And a \"US Tax Limit\" error message is displayed on to the right of a exclamation triangle icon\n And the text is orange\n And the icon is orange\n\n @motivating\n Scenario Outline: Exchange options are disabled if a users lacks enough credit to redeem\n Given a <type> reward exchange rule\n But the user lacks enough credit to exchange for it\n When they view the reward exchange list\n Then the reward exchange card is disabled\n And a <text> error message is displayed on to the right of a exclamation triangle icon\n And the text is orange\n And the icon is orange\n Examples:\n | type | text |\n | FIXED_GLOBAL_REWARD | {prettySourceValue} required |\n | STEPPED_FIXED_GLOBAL_REWARD | {prettySourceMinValue} required |\n | VARIABLE_GLOBAL_REWARD | {prettySourceMinValue} required |\n | VARIABLE_CREDIT_REWARD | {prettySourceMinValue} required |\n\n @motivating\n Scenario: Users can go back to the Rewards page from the Select page\n Given a user viewing the Select page\n Then they see a \"Cancel\" text button\n And a \"Continue to confirmation\" brand colour button in the bottom right corner\n When they click \"Cancel\"\n Then they return to the Rewards page\n\n @motivating\n Scenario: Users can go back to the Select Page from the Confirm page\n Given a user viewing the Confirm page\n Then they see a \"Back\" text button\n And a \"Redeem\" brand colour button in the bottom right corner\n When they click \"Back\"\n Then they return to the Select Page\n\n @motivating\n Scenario: Reward rules with visibility predicates that evaluates to false are not shown\n Given a tenant reward exchange rule with visibility predicates that evaluates to false\n When a user views the reward exchange list\n Then they do not see the card for that reward exchange rule\n\n @motivating\n Scenario Outline: Users can choose their reward option for variable rewards on the Select page\n Given a <type> exchange rule\n And it has the following fields\n | fields |\n | name |\n | description |\n | image |\n When a user views the reward exchange list\n And they progress to the Select page for this exchange\n Then they see the exchange rule image on the left hand side\n And on the right hand side they see the following in this order from top to bottom\n | elements |\n | exchange name |\n | exchange description |\n | select list with all exchange options using pretty values, destination reward above source reward |\n Examples:\n | type |\n | STEPPED_FIXED_GLOBAL_REWARD |\n | VARIABLE_GLOBAL_REWARD |\n | VARIABLE_CREDIT_REWARD |\n\n @motivating\n Scenario: Users who selected a fixed exchange rule see exchange information on the Select page\n Given a \"FIXED_GLOBAL_REWARD\" exchange rule\n And it has the following fields\n | fields |\n | name |\n | description |\n | image |\n When a user views the reward exchange list\n And they progress to the Select page for this exchange\n Then they see the exchange rule image on the left hand side\n And on the right hand side they see the following in this order from top to bottom\n | elements |\n | exchange name |\n | exchange source pretty value displayed in brand colour |\n | exchange description |\n\n @motivating\n Scenario Outline: Users selection variable rewards can only select rewards they are eligible to exchange for\n Given a <type> exchange rule\n When a user views the reward exchange list\n And they progress to the Select page for this exchange\n Then they see a drop down with all the reward exchange selections\n When they click on the drop down\n But they are not eligible for all of the exchanges options <dueToReason>\n Then the ineligble options are disabled\n And under the source value is <text>\n Examples:\n | type | dueToReason | text |\n | STEPPED_FIXED_GLOBAL_REWARD | due to insufficent source value | {prettySourceValue} required |\n | VARIABLE_GLOBAL_REWARD | due to insufficent source value | {prettySourceValue} required |\n | VARIABLE_CREDIT_REWARD | due to insufficent source value | {prettySourceValue} required |\n | STEPPED_FIXED_GLOBAL_REWARD | W9 | US Tax Limit |\n | VARIABLE_GLOBAL_REWARD | W9 | US Tax Limit |\n | VARIABLE_CREDIT_REWARD | W9 | US Tax Limit |\n\n @motivating\n Scenario Outline: The Confirm page allows users to view their exchange before committing\n Given a <type> exchange rule\n When a user views the reward exchange list\n And they select the exchange\n And they progress to Confirm page\n Then they see a row with title \"Reward\"\n And it contains the exchange name\n And it contains the exchange image\n And they <maySee> a row with title \"Reward Amount\"\n And it <mayContain> <amountTitle>\n And they see a row with title \"Cost to Redeem\"\n And it contains the source reward pretty value in bolded text\n Examples:\n | type | maySee | mayContain | amountTitle |\n | FIXED_GLOBAL_REWARD | don't | doesn't contain | N/A |\n | VARIABLE_GLOBAL_REWARD | see | contains | the pretty destination value |\n | STEPPED_FIXED_GLOBAL_REWARD | see | contains | the pretty destination value |\n | VARIABLE_CREDIT_REWARD | see | contains | the pretty destination value |\n\n @motivating\n Scenario: An error banner is displayed if an error occurs during redemeption\n Given a user has selected a reward to exchange\n And is on the confirmation page\n When they click \"Redeem\"\n But an error occurs\n Then an error banner appears\n And it contains details about the error\n And the reward exchange is not completed\n\n @motivating\n Scenario: Confetti is displayed when a reward exchange succeeds\n Given a user has selected a reward to exchange\n And they are on the confirmation page\n When they click \"Redeem\"\n And the exchange is successful\n Then they see confetti centered on the success page\n And they see text describing what they exchanged for their new reward\n And they see a \"Done\" brand colour button\n When they click \"Done\"\n Then they see the Rewards page\n\n @motivating\n Scenario: Fuel tank codes are shown when a reward exchange succeeds\n Given a user has selected to exchange for a fuel tank reward\n When they complete the reward exchange\n And are on the success page\n Then they see a textbox with their fuel tank code\n And a clipboard icon\n When they click the clipboard icon\n Then their fuel tank code is copied to their clipboard\n\n @motivating\n Scenario Outline: Users can exchange for any type of reward\n Given a <type> reward exchange rule for a <reward>\n And a user who has enough source credit to exchange for the reward\n When they go through the exchange flow\n And exchange for their reward\n Then their credit is exchanged for the <reward>\n Examples:\n | type | reward |\n | FIXED_GLOBAL_REWARD | gift card |\n | FIXED_GLOBAL_REWARD | fuel tank code |\n | FIXED_GLOBAL_REWARD | discount |\n | FIXED_GLOBAL_REWARD | credit reward |\n | STEPPED_FIXED_GLOBAL_REWARD | gift card |\n | STEPPED_FIXED_GLOBAL_REWARD | discount |\n | STEPPED_FIXED_GLOBAL_REWARD | credit reward |\n | VARIABLE_GLOBAL_REWARD | gift card |\n | VARIABLE_GLOBAL_REWARD | discount |\n | VARIABLE_GLOBAL_REWARD | credit reward |\n | VARIABLE_CREDIT_REWARD | credit reward |";
11371
+ const scenario$m = "@author:derek\n@owner:derek\nFeature: Reward Exchange List\n\n The Reward Exchange List gives end users the power to exchange their rewards for other rewards.\n It populates a list from the reward exchange rules set up on a given tenant.\n\n Background:\n Given a tenant with reward exchange rules\n\n @motivating\n @ui\n Scenario: The empty state is shown if there are no visible exchanges\n Given a user with no visible exchanges\n When they view the reward exchange\n Then no exchange options are displayed\n And they see an image of a present\n And \"Redeem Rewards\" in bold\n And \"Use your points to redeem rewards once they become available\" below the bolded text\n And the pagination buttons are disabled\n\n @minutia\n @ui\n Scenario: A custom empty state can be provided\n Given a user with no visible exchanges\n And a custom empty state has been supplied in the \"empty\" slot\n When they view the reward exchange\n Then they see the custom empty state\n\n @motivating\n @ui\n Scenario: A Loading Skeleton is displayed when the reward exchange rules are loading\n Given a user\n When they load the reward exchange list\n Then they see a loading Skeleton\n And it has 8 skeleton cards\n When the reward exchange rules have loaded\n Then the skeleton is replaced with reward exchange options\n\n @motivating\n Scenario: An error banner appears when the reward exchange list fails to load\n Given a user trying to view the reward exchange list\n But it fails to load\n Then an error banner is displayed\n And it displays \"Unable to load reward exchange list. Please try again\"\n\n @motivating\n @ui\n Scenario: The exchange progress bar progresses through the exchange process\n Given a user who is eligible for the tenants reward exchange rules\n When they view the reward exchange list\n Then the process bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with green outline, white fill and number 1 in green |\n | Step 2 `Select` title in grey |\n | Step 2 circle with grey fill and number 2 in white |\n | Step 3 `Confirm` title in grey |\n | Step 3 circle with grey fill and number 3 in white |\n | lines between all steps are greyed out |\n When they continue to the selection page\n Then the progress bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with white checkmark and green fill |\n | Step 2 `Select` title in black |\n | Step 2 circle with green outline, white fill and number 2 in green |\n | Step 3 `Confirm` title in grey |\n | Step 3 circle with grey fill and number 3 in white |\n | Green line between step 1 and 2 |\n | Grey line between step 2 and 3 |\n When they continue to the confirmation page\n Then the progress bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with white checkmark and green fill |\n | Step 2 `Select` title in black |\n | Step 2 circle with white checkmark and green fill |\n | Step 3 `Confirm` title in black |\n | Step 3 circle with green outline, white fill and number 3 in green |\n | Green line between all steps |\n When they continue to the redemption page\n Then the progress bar displays the following elements\n | elements |\n | Step 1 `Rewards` title in black |\n | Step 1 circle with white checkmark and green fill |\n | Step 2 `Select` title in black |\n | Step 2 circle with white checkmark and green fill |\n | Step 3 `Confirm` title in black |\n | Step 3 circle with white checkmark and green fill |\n | Green line between all steps |\n\n @motivating\n Scenario: Users must choose a reward exchange option to continue to the selection page\n Given a user who is eligible for the tenants reward exchange rules\n When they view the reward exchange list\n Then the 'Continue' button is disabled\n When they select a reward exchange card\n Then the card is outlined in brand colour with a brand colour cirlcular check box icon in the top right\n And the continue button is no longer disabled\n When they click \"Continue\"\n Then they are brought to the selection page\n\n @motivating\n @ui\n Scenario: Reward exchange rule names and images are used in the reward exchange cards\n Given a tenant reward exchange rule\n And it has name \"My Visa Exchange Rule\"\n And it has an image\n When a user views the reward exchange list\n Then they see a exchange card with title \"My Visa Exchange Rule\"\n And the exchange image on the left hand side of the card\n\n @motivating\n Scenario Outline: Reward exchange source values are displayed on reward exchange cards\n Given a <type> reward exchange rule\n When a user views the reward exchange list\n Then they see <text> under the name on the exchange option cards\n And the pretty values are localized to a user locale\n Examples:\n | type | text |\n | FIXED_GLOBAL_REWARD | the exchange source pretty value |\n | STEPPED_FIXED_GLOBAL_REWARD | the exchange source min pretty value to the source max pretty value |\n | VARIABLE_GLOBAL_REWARD | the exchange source min pretty value to the source max pretty value |\n | VARIABLE_CREDIT_REWARD | the exchange source min pretty value to the source max pretty value |\n\n @motivating\n Scenario Outline: Reward exchange cards can display customized error messages\n Given a reward exchange rule\n And it has <availabilityPredicate>\n And the reward exchange list has prop \"not-available-error\" with <value>\n When the user views the reward exchange list\n Then the card for the reward exchange rule is disabled\n And <message> is displayed\n Examples:\n | availabilityPredicate | value | message |\n | 'champion' in user.segments ? \"NOT_CHAMPION\" : true | {unavailableReasonCode, select, NOT_CHAMPION {Sorry must be a champion!} other {unavailableReasonCode} } | Sorry must be a champion! |\n | user.customFields.purchaseCount < 10 ? \"MORE_PURCHASE\" : true | {unavailableReasonCode, select, MORE_PURCHASE {Complete 10 purchases to unlock} other {unavailableReasonCode} } | Complete 10 purchases to unlock |\n\n @motivating\n Scenario: Exchange options are disabled if they put a user over the W9 limit\n Given a user who is approaching their W9 limit\n And a reward exchange rule\n And its destination reward has a US taxable value that would put the user over their limit\n When they view the reward exchange list\n Then the reward exchange card is disabled\n And a \"US Tax Limit\" error message is displayed on to the right of a exclamation triangle icon\n And the text is orange\n And the icon is orange\n\n @motivating\n Scenario Outline: Exchange options are disabled if a users lacks enough credit to redeem\n Given a <type> reward exchange rule\n But the user lacks enough credit to exchange for it\n When they view the reward exchange list\n Then the reward exchange card is disabled\n And a <text> error message is displayed on to the right of a exclamation triangle icon\n And the text is orange\n And the icon is orange\n Examples:\n | type | text |\n | FIXED_GLOBAL_REWARD | {prettySourceValue} required |\n | STEPPED_FIXED_GLOBAL_REWARD | {prettySourceMinValue} required |\n | VARIABLE_GLOBAL_REWARD | {prettySourceMinValue} required |\n | VARIABLE_CREDIT_REWARD | {prettySourceMinValue} required |\n\n @motivating\n Scenario: Users can go back to the Rewards page from the Select page\n Given a user viewing the Select page\n Then they see a \"Cancel\" text button\n And a \"Continue to confirmation\" brand colour button in the bottom right corner\n When they click \"Cancel\"\n Then they return to the Rewards page\n\n @motivating\n Scenario: Users can go back to the Select Page from the Confirm page\n Given a user viewing the Confirm page\n Then they see a \"Back\" text button\n And a \"Redeem\" brand colour button in the bottom right corner\n When they click \"Back\"\n Then they return to the Select Page\n\n @motivating\n Scenario: Reward rules with visibility predicates that evaluates to false are not shown\n Given a tenant reward exchange rule with visibility predicates that evaluates to false\n When a user views the reward exchange list\n Then they do not see the card for that reward exchange rule\n\n @motivating\n Scenario Outline: Users can choose their reward option for variable rewards on the Select page\n Given a <type> exchange rule\n And it has the following fields\n | fields |\n | name |\n | description |\n | image |\n When a user views the reward exchange list\n And they progress to the Select page for this exchange\n Then they see the exchange rule image on the left hand side\n And on the right hand side they see the following in this order from top to bottom\n | elements |\n | exchange name |\n | exchange description |\n | select list with all exchange options using pretty values, destination reward above source reward |\n Examples:\n | type |\n | STEPPED_FIXED_GLOBAL_REWARD |\n | VARIABLE_GLOBAL_REWARD |\n | VARIABLE_CREDIT_REWARD |\n\n @motivating\n Scenario: Users who selected a fixed exchange rule see exchange information on the Select page\n Given a \"FIXED_GLOBAL_REWARD\" exchange rule\n And it has the following fields\n | fields |\n | name |\n | description |\n | image |\n When a user views the reward exchange list\n And they progress to the Select page for this exchange\n Then they see the exchange rule image on the left hand side\n And on the right hand side they see the following in this order from top to bottom\n | elements |\n | exchange name |\n | exchange source pretty value displayed in brand colour |\n | exchange description |\n\n @motivating\n Scenario Outline: Users selection variable rewards can only select rewards they are eligible to exchange for\n Given a <type> exchange rule\n When a user views the reward exchange list\n And they progress to the Select page for this exchange\n Then they see a drop down with all the reward exchange selections\n When they click on the drop down\n But they are not eligible for all of the exchanges options <dueToReason>\n Then the ineligble options are disabled\n And under the source value is <text>\n Examples:\n | type | dueToReason | text |\n | STEPPED_FIXED_GLOBAL_REWARD | due to insufficent source value | {prettySourceValue} required |\n | VARIABLE_GLOBAL_REWARD | due to insufficent source value | {prettySourceValue} required |\n | VARIABLE_CREDIT_REWARD | due to insufficent source value | {prettySourceValue} required |\n | STEPPED_FIXED_GLOBAL_REWARD | W9 | US Tax Limit |\n | VARIABLE_GLOBAL_REWARD | W9 | US Tax Limit |\n | VARIABLE_CREDIT_REWARD | W9 | US Tax Limit |\n\n @motivating\n Scenario Outline: The Confirm page allows users to view their exchange before committing\n Given a <type> exchange rule\n When a user views the reward exchange list\n And they select the exchange\n And they progress to Confirm page\n Then they see a row with title \"Reward\"\n And it contains the exchange name\n And it contains the exchange image\n And they <maySee> a row with title \"Reward Amount\"\n And it <mayContain> <amountTitle>\n And they see a row with title \"Cost to Redeem\"\n And it contains the source reward pretty value in bolded text\n Examples:\n | type | maySee | mayContain | amountTitle |\n | FIXED_GLOBAL_REWARD | don't | doesn't contain | N/A |\n | VARIABLE_GLOBAL_REWARD | see | contains | the pretty destination value |\n | STEPPED_FIXED_GLOBAL_REWARD | see | contains | the pretty destination value |\n | VARIABLE_CREDIT_REWARD | see | contains | the pretty destination value |\n\n @motivating\n Scenario: An error banner is displayed if an error occurs during redemeption\n Given a user has selected a reward to exchange\n And is on the confirmation page\n When they click \"Redeem\"\n But an error occurs\n Then an error banner appears\n And it contains details about the error\n And the reward exchange is not completed\n\n @motivating\n Scenario: Confetti is displayed when a reward exchange succeeds\n Given a user has selected a reward to exchange\n And they are on the confirmation page\n When they click \"Redeem\"\n And the exchange is successful\n Then they see confetti centered on the success page\n And they see text describing what they exchanged for their new reward\n And they see a \"Done\" brand colour button\n When they click \"Done\"\n Then they see the Rewards page\n\n @motivating\n Scenario: Fuel tank codes are shown when a reward exchange succeeds\n Given a user has selected to exchange for a fuel tank reward\n When they complete the reward exchange\n And are on the success page\n Then they see a textbox with their fuel tank code\n And a clipboard icon\n When they click the clipboard icon\n Then their fuel tank code is copied to their clipboard\n\n @motivating\n Scenario Outline: Users can exchange for any type of reward\n Given a <type> reward exchange rule for a <reward>\n And a user who has enough source credit to exchange for the reward\n When they go through the exchange flow\n And exchange for their reward\n Then their credit is exchanged for the <reward>\n Examples:\n | type | reward |\n | FIXED_GLOBAL_REWARD | gift card |\n | FIXED_GLOBAL_REWARD | fuel tank code |\n | FIXED_GLOBAL_REWARD | discount |\n | FIXED_GLOBAL_REWARD | credit reward |\n | STEPPED_FIXED_GLOBAL_REWARD | gift card |\n | STEPPED_FIXED_GLOBAL_REWARD | discount |\n | STEPPED_FIXED_GLOBAL_REWARD | credit reward |\n | VARIABLE_GLOBAL_REWARD | gift card |\n | VARIABLE_GLOBAL_REWARD | discount |\n | VARIABLE_GLOBAL_REWARD | credit reward |\n | VARIABLE_CREDIT_REWARD | credit reward |";
11172
11372
 
11173
11373
  const RewardExchangeList_stories = {
11174
11374
  title: "Components/Reward Exchange List",
11175
11375
  parameters: {
11176
- scenario: scenario$l,
11376
+ scenario: scenario$m,
11177
11377
  },
11178
11378
  };
11179
11379
  const StoryBase = (props) => () => {
@@ -11195,7 +11395,7 @@ const RedemptionError = StoryBase(redemptionError);
11195
11395
  const QueryError = StoryBase(queryError);
11196
11396
  const SuccessPromo = StoryBase(success);
11197
11397
  const SuccessVariableAndStepped = StoryBase(successVariable);
11198
- const Loading$3 = StoryBase(loading);
11398
+ const Loading$4 = StoryBase(loading);
11199
11399
  const Empty$2 = StoryBase(empty$1);
11200
11400
 
11201
11401
  const RewardExchangeList = /*#__PURE__*/Object.freeze({
@@ -11217,16 +11417,16 @@ const RewardExchangeList = /*#__PURE__*/Object.freeze({
11217
11417
  QueryError: QueryError,
11218
11418
  SuccessPromo: SuccessPromo,
11219
11419
  SuccessVariableAndStepped: SuccessVariableAndStepped,
11220
- Loading: Loading$3,
11420
+ Loading: Loading$4,
11221
11421
  Empty: Empty$2
11222
11422
  });
11223
11423
 
11224
- const scenario$m = "@author:derek\n@owner:derek\nFeature: Program Explainer\n\n @motivating\n @ui\n Scenario Outline: The program explainer wraps program explainer steps and aligns them\n Given a program explainer component\n And it has <number> program explainer steps as components\n When a user views the program explainer\n Then they see <number> steps aligned horizontally\n And they have equal height/width\n And equal padding in between\n When they are viewed on a screen smaller than 500px\n Then the steps stack vertically with equal padding in between\n And they have equal width\n But height may vary\n Examples:\n | number |\n | 2 |\n | 3 |\n | 4 |\n\n @motivating\n @ui\n Scenario: The program explainer displays a section header\n Given a program explainer step with props\n | prop | value |\n | header | My Header |\n And it has program explainer steps as children\n When a user views the program explainer\n Then they see \"My Header\" centered above the explainer steps\n\n @motivating\n @ui\n Scenario: Colours are customizable\n Given a program explainer with props\n | prop | value |\n | text-color | purple |\n | background-color | grey |\n When a user views the program explainer\n Then the header is purple\n And the background between steos is grey\n";
11424
+ const scenario$n = "@author:derek\n@owner:derek\nFeature: Program Explainer\n\n @motivating\n @ui\n Scenario Outline: The program explainer wraps program explainer steps and aligns them\n Given a program explainer component\n And it has <number> program explainer steps as components\n When a user views the program explainer\n Then they see <number> steps aligned horizontally\n And they have equal height/width\n And equal padding in between\n When they are viewed on a screen smaller than 500px\n Then the steps stack vertically with equal padding in between\n And they have equal width\n But height may vary\n Examples:\n | number |\n | 2 |\n | 3 |\n | 4 |\n\n @motivating\n @ui\n Scenario: The program explainer displays a section header\n Given a program explainer step with props\n | prop | value |\n | header | My Header |\n And it has program explainer steps as children\n When a user views the program explainer\n Then they see \"My Header\" centered above the explainer steps\n\n @motivating\n @ui\n Scenario: Colours are customizable\n Given a program explainer with props\n | prop | value |\n | text-color | purple |\n | background-color | grey |\n When a user views the program explainer\n Then the header is purple\n And the background between steos is grey\n";
11225
11425
 
11226
11426
  const ProgramExplainer_stories = {
11227
11427
  title: "Components/Program Explainer",
11228
11428
  parameters: {
11229
- scenario: scenario$m,
11429
+ scenario: scenario$n,
11230
11430
  },
11231
11431
  };
11232
11432
  const OneStep = () => {
@@ -11282,12 +11482,12 @@ const ProgramExplainer = /*#__PURE__*/Object.freeze({
11282
11482
  ProgramExplainerGeneric: ProgramExplainerGeneric
11283
11483
  });
11284
11484
 
11285
- const scenario$n = "@author:derek\n@owner:derek\nFeature: Program Explainer Step\n\n @motivating\n @ui\n Scenario: The program explainer step displays a icon, header and description\n Given a program explainer step with props\n | prop | value |\n | header | My Header |\n | description | My program explainer description |\n | icon | person-plus-fill |\n When a user views the explainer step\n Then they see an person icon with a + in the top left hand corner\n And the icon is weight 300 brand colour\n And below they see \"My Header\" in large bold font\n And below they see \"My program explainer description\" in medium font\n And the step background colour is weight 50 brand colour\n\n @motivating\n @ui\n Scenario: The program explainer can display an image in place of an icon\n Given a program explainer\n And it has an \"image-url\" prop with a value of a valid url to an image\n When a user views the explainer step\n Then the image is displayed in place of an incon in the top left hand corner\n\n @motivating\n @ui\n Scenario: Colours are customizable\n Given a program explainer step with props\n | prop | value |\n | text-color | purple |\n | background-color | grey |\n When a user views the explainer step\n Then they see the step background is grey\n And the header text is purple\n And the description text is purple\n";
11485
+ const scenario$o = "@author:derek\n@owner:derek\nFeature: Program Explainer Step\n\n @motivating\n @ui\n Scenario: The program explainer step displays a icon, header and description\n Given a program explainer step with props\n | prop | value |\n | header | My Header |\n | description | My program explainer description |\n | icon | person-plus-fill |\n When a user views the explainer step\n Then they see an person icon with a + in the top left hand corner\n And the icon is weight 300 brand colour\n And below they see \"My Header\" in large bold font\n And below they see \"My program explainer description\" in medium font\n And the step background colour is weight 50 brand colour\n\n @motivating\n @ui\n Scenario: The program explainer can display an image in place of an icon\n Given a program explainer\n And it has an \"image-url\" prop with a value of a valid url to an image\n When a user views the explainer step\n Then the image is displayed in place of an incon in the top left hand corner\n\n @motivating\n @ui\n Scenario: Colours are customizable\n Given a program explainer step with props\n | prop | value |\n | text-color | purple |\n | background-color | grey |\n When a user views the explainer step\n Then they see the step background is grey\n And the header text is purple\n And the description text is purple\n";
11286
11486
 
11287
11487
  const ProgramExplainerStep_stories = {
11288
11488
  title: "Components/Program Explainer Step",
11289
11489
  parameters: {
11290
- scenario: scenario$n,
11490
+ scenario: scenario$o,
11291
11491
  },
11292
11492
  };
11293
11493
  const ProgramExplainerStep = () => {
@@ -11304,12 +11504,12 @@ const ProgramExplainerStep$1 = /*#__PURE__*/Object.freeze({
11304
11504
  ProgramExplainerStepCustom: ProgramExplainerStepCustom
11305
11505
  });
11306
11506
 
11307
- const scenario$o = "@author:derek\n@owner:logan\nFeature: Brand Configuration\n\n\t@motivating\n\tScenario: The brand components creates a colour pallet from a brand colour and applies it to children\n\t\tGiven a brand component with \"brand-color\" \"#4225c4\"\n\t\tAnd it is wrapping several mint components\n\t\tWhen a user views the children components\n\t\tThen the following css variables are set\n\t\t\t| variable | value |\n\t\t\t| --sl-color-primary-50 | hsla(251, 68%, 95%, 1) |\n\t\t\t| --sl-color-primary-100 | hsla(251, 68%, 86%, 1) |\n\t\t\t| --sl-color-primary-200 | hsla(251, 68%, 76%, 1) |\n\t\t\t| --sl-color-primary-300 | hsla(251, 68%, 66%, 1) |\n\t\t\t| --sl-color-primary-400 | hsla(251, 68%, 56%, 1) |\n\t\t\t| --sl-color-primary-500 | hsla(251, 68%, 46%, 1) |\n\t\t\t| --sl-color-primary-600 | hsla(251, 68%, 39%, 1) |\n\t\t\t| --sl-color-primary-700 | hsla(251, 68%, 32%, 1) |\n\t\t\t| --sl-color-primary-800 | hsla(251, 68%, 25%, 1) |\n\t\t\t| --sl-color-primary-900 | hsla(251, 68%, 18%, 1) |\n\t\t\t| --sl-color-primary-950 | hsla(251, 68%, 15%, 1) |\n\t\t\t| --sl-focus-ring-color-primary | var(--sl-color-primary-100) |\n\t\t\t| --sl-input-border-color-focus | var(--sl-color-primary-500) |\n\t\t\t| --sl-color-primary-hue | var(--sl-color-primary-500) |\n\t\tAnd they are applied to the children components\n\t\tBut they are not applied to any components outside of the brand component\n\t\tAnd they are not applied to any vanilla components\n\n\t@minutia\n\tScenario Outline: The brand colour can be hex, HSL or rgb\n\t\tGiven a brand component with \"brand-color\" <colour>\n\t\tAnd it is wrapping several mint components\n\t\tWhen a user views the children components\n\t\tThen the colour is used to create a brand palete\n\t\tAnd it is applied to the children components\n\t\tExamples:\n\t\t\t| colour |\n\t\t\t| #4225c4 |\n\t\t\t| rgb(66, 37, 196) |\n\t\t\t| hsl(251, 68%, 46%) |\n\t\t\t| hsla(251, 68%, 46%, 1) |\n\n\t@motivating\n\tScenario: The brand component can apply a brand font to children components\n\t\tGiven a brand component with \"brand-font\" \"Nunito Sans\"\n\t\tAnd it is wrapping several mint components\n\t\tWhen a user views the children components\n\t\tThen the following css variables are set\n\t\t\t| variable | value |\n\t\t\t| --sl-font-sans | \"Nunito Sans\", arial |\n\t\t\t| --sl-input-font-family | \"Nunito Sans\", arial |\n\t\t\t| --sl-tooltip-font-family | \"Nunito Sans\", arial |\n\t\t\t| font-family | \"Nunito Sans\", arial |\n\t\tAnd they are applied to the children components\n\t\tAnd the children component's text is \"Nunito Sans\"";
11507
+ const scenario$p = "@author:derek\n@owner:logan\nFeature: Brand Configuration\n\n\t@motivating\n\tScenario: The brand components creates a colour pallet from a brand colour and applies it to children\n\t\tGiven a brand component with \"brand-color\" \"#4225c4\"\n\t\tAnd it is wrapping several mint components\n\t\tWhen a user views the children components\n\t\tThen the following css variables are set\n\t\t\t| variable | value |\n\t\t\t| --sl-color-primary-50 | hsla(251, 68%, 95%, 1) |\n\t\t\t| --sl-color-primary-100 | hsla(251, 68%, 86%, 1) |\n\t\t\t| --sl-color-primary-200 | hsla(251, 68%, 76%, 1) |\n\t\t\t| --sl-color-primary-300 | hsla(251, 68%, 66%, 1) |\n\t\t\t| --sl-color-primary-400 | hsla(251, 68%, 56%, 1) |\n\t\t\t| --sl-color-primary-500 | hsla(251, 68%, 46%, 1) |\n\t\t\t| --sl-color-primary-600 | hsla(251, 68%, 39%, 1) |\n\t\t\t| --sl-color-primary-700 | hsla(251, 68%, 32%, 1) |\n\t\t\t| --sl-color-primary-800 | hsla(251, 68%, 25%, 1) |\n\t\t\t| --sl-color-primary-900 | hsla(251, 68%, 18%, 1) |\n\t\t\t| --sl-color-primary-950 | hsla(251, 68%, 15%, 1) |\n\t\t\t| --sl-focus-ring-color-primary | var(--sl-color-primary-100) |\n\t\t\t| --sl-input-border-color-focus | var(--sl-color-primary-500) |\n\t\t\t| --sl-color-primary-hue | var(--sl-color-primary-500) |\n\t\tAnd they are applied to the children components\n\t\tBut they are not applied to any components outside of the brand component\n\t\tAnd they are not applied to any vanilla components\n\n\t@minutia\n\tScenario Outline: The brand colour can be hex, HSL or rgb\n\t\tGiven a brand component with \"brand-color\" <colour>\n\t\tAnd it is wrapping several mint components\n\t\tWhen a user views the children components\n\t\tThen the colour is used to create a brand palete\n\t\tAnd it is applied to the children components\n\t\tExamples:\n\t\t\t| colour |\n\t\t\t| #4225c4 |\n\t\t\t| rgb(66, 37, 196) |\n\t\t\t| hsl(251, 68%, 46%) |\n\t\t\t| hsla(251, 68%, 46%, 1) |\n\n\t@motivating\n\tScenario: The brand component can apply a brand font to children components\n\t\tGiven a brand component with \"brand-font\" \"Nunito Sans\"\n\t\tAnd it is wrapping several mint components\n\t\tWhen a user views the children components\n\t\tThen the following css variables are set\n\t\t\t| variable | value |\n\t\t\t| --sl-font-sans | \"Nunito Sans\", arial |\n\t\t\t| --sl-input-font-family | \"Nunito Sans\", arial |\n\t\t\t| --sl-tooltip-font-family | \"Nunito Sans\", arial |\n\t\t\t| font-family | \"Nunito Sans\", arial |\n\t\tAnd they are applied to the children components\n\t\tAnd the children component's text is \"Nunito Sans\"";
11308
11508
 
11309
11509
  const SqmBrand_stories = {
11310
11510
  title: "Components/Brand",
11311
11511
  parameters: {
11312
- scenario: scenario$o,
11512
+ scenario: scenario$p,
11313
11513
  },
11314
11514
  };
11315
11515
  const SampleComponents = () => (h("div", { style: { padding: "10px", border: "5px solid #EEE" } },
@@ -11410,12 +11610,12 @@ const BrandStories = /*#__PURE__*/Object.freeze({
11410
11610
  Fonts: Fonts
11411
11611
  });
11412
11612
 
11413
- const scenario$p = "@author:kutay\n@owner:kutay\nFeature: Card Feed\n\n\tThe Card Feed component displays Task Card components in a grid layout.\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the Card Feed component\n\n\t@motivating\n\tScenario: The Card Feed component displays Task Cards given as children slots\n\t\tGiven a Card Feed component\n\t\tAnd it is wrapping a number of task cards as children\n\t\tWhen the user views the Card Feed\n\t\tThen the task cards are displayed in a masonry layout\n\t\tWhen the card feed with grows or shrinks in width\n\t\tThen the number of columns adjust to the given width\n\n\t@motivating\n\t@ui\n\tScenario Outline: The Card Feed component can have a maximum width\n\t\tGiven a Card Feed component\n\t\tAnd it is wrapping a number of task cards as children\n\t\tAnd has prop \"width\" has a provided <value>\n\t\tThen the task cards are displayed in a masonry layout\n\t\tWhen the card feed with grows or shrinks in width\n\t\tThen the number of columns adjust to the given width\n\t\tAnd the task cards do not exceed <width>\n\t\tExamples:\n\t\t\t| value | width |\n\t\t\t| | 347px |\n\t\t\t| 200 | 200px |\n\t\t\t| 400 | 400px |\n\n\t@motivating\n\t@ui\n\tScenario Outline: The Card Feed component gap between task cards can be customized\n\t\tGiven a Card Feed component\n\t\tAnd it is wrapping a number of task cards as children\n\t\tAnd has prop \"gap\" has a provided <value>\n\t\tThen the task cards are displayed in a masonry layout\n\t\tAnd the gap between the columns is the <gap>\n\t\tExamples:\n\t\t\t| value | gap |\n\t\t\t| | 24px |\n\t\t\t| 20 | 20px |\n\t\t\t| 50 | 50px |";
11613
+ const scenario$q = "@author:kutay\n@owner:kutay\nFeature: Card Feed\n\n\tThe Card Feed component displays Task Card components in a grid layout.\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the Card Feed component\n\n\t@motivating\n\tScenario: The Card Feed component displays Task Cards given as children slots\n\t\tGiven a Card Feed component\n\t\tAnd it is wrapping a number of task cards as children\n\t\tWhen the user views the Card Feed\n\t\tThen the task cards are displayed in a masonry layout\n\t\tWhen the card feed with grows or shrinks in width\n\t\tThen the number of columns adjust to the given width\n\n\t@motivating\n\t@ui\n\tScenario Outline: The Card Feed component can have a maximum width\n\t\tGiven a Card Feed component\n\t\tAnd it is wrapping a number of task cards as children\n\t\tAnd has prop \"width\" has a provided <value>\n\t\tThen the task cards are displayed in a masonry layout\n\t\tWhen the card feed with grows or shrinks in width\n\t\tThen the number of columns adjust to the given width\n\t\tAnd the task cards do not exceed <width>\n\t\tExamples:\n\t\t\t| value | width |\n\t\t\t| | 347px |\n\t\t\t| 200 | 200px |\n\t\t\t| 400 | 400px |\n\n\t@motivating\n\t@ui\n\tScenario Outline: The Card Feed component gap between task cards can be customized\n\t\tGiven a Card Feed component\n\t\tAnd it is wrapping a number of task cards as children\n\t\tAnd has prop \"gap\" has a provided <value>\n\t\tThen the task cards are displayed in a masonry layout\n\t\tAnd the gap between the columns is the <gap>\n\t\tExamples:\n\t\t\t| value | gap |\n\t\t\t| | 24px |\n\t\t\t| 20 | 20px |\n\t\t\t| 50 | 50px |";
11414
11614
 
11415
11615
  const CardFeed_stories = {
11416
11616
  title: "Components/Card Feed",
11417
11617
  parameters: {
11418
- scenario: scenario$p,
11618
+ scenario: scenario$q,
11419
11619
  },
11420
11620
  };
11421
11621
  const oneAction$1 = {
@@ -11652,12 +11852,12 @@ const CardFeed = /*#__PURE__*/Object.freeze({
11652
11852
  CardFeedGeneric: CardFeedGeneric
11653
11853
  });
11654
11854
 
11655
- const scenario$q = "@author:kutay\n@owner:noah\nFeature: Portal Container\n\n\t@motivating\n\t@ui\n\tScenario: Horizontal content overflows, but does not stretch\n\t\tGiven there are two element in the container\n\t\tAnd the first is small\n\t\tAnd the second would stretch the container wider than it's parent\n\t\tThen the second one is clipped\n\t\tAnd the first one doesn't stretch\n\n\t@landmine\n\t@ui\n\tScenario: `max-width` is required for displaying as a row\n\t\tGiven I have `direction` to \"row\"\n\t\tAnd I have not set a `max-width`\n\t\tThen it displays as a column\n\n\t@motivating\n\t@ui\n\tScenario Outline: Content padding can be customized\n\t\tGiven prop \"padding\" has <value>\n\t\tThen <padding> is applied to content\n\n\t\tExamples:\n\t\t\t| value | padding |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |\n\n\n\t@motivating\n\t@ui\n\tScenario Outline: Gap between content elements can be customized\n\t\tGiven prop \"gap\" has <value>\n\t\tThen <gap> is applied to elements between content\n\n\t\tExamples:\n\t\t\t| value | gap |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |\n\n\t@minutia\n\t@ui\n\tScenario: Content can be center aligned in horizontal view\n\t\tGiven I have supplied the prop \"center\"\n\t\tThen the content is center aligned\n\n\t@minutia\n\t@ui\n\tScenario: Content in the last row can span full width with display in horizontal view\n\t\tGiven I have `display` to \"flex\"\n\t\tThen the content is full width on the last row\n\n\t@motivating\n\t@ui\n\tScenario Outline: Content can be aligned along the x-axis\n\t\tGiven prop \"justify-content\" has <value>\n\t\tThen content within the container is aligned <alignment>\n\n\t\tExamples:\n\t\t\t| value | alignment |\n\t\t\t| none | no alignment |\n\t\t\t| start | to the start |\n\t\t\t| center | to the center |\n\t\t\t| end | to the end |\n\t\t\t| space-between | with space between |\n\t\t\t| space-around | with space around |\n\t\t\t| space-evenly | with space evenly |\n\n\n\t@motivating\n\t@ui\n\tScenario Outline: Component background color can be customized\n\t\tGiven a user is viewing the Portal Container component\n\t\tThen the default value is \"#ffffff00\"\n\t\tWhen the prop \"background-color\" has <value>\n\t\tThen the background has color <backgroundColor>\n\t\tExamples:\n\t\t\t| value | backgroundColor |\n\t\t\t| empty (default value) | var(--sl-color-neutral-0) (#ffffff) |\n\t\t\t| aquamarine | #7fffd4 |\n";
11855
+ const scenario$r = "@author:kutay\n@owner:noah\nFeature: Portal Container\n\n\t@motivating\n\t@ui\n\tScenario: Horizontal content overflows, but does not stretch\n\t\tGiven there are two element in the container\n\t\tAnd the first is small\n\t\tAnd the second would stretch the container wider than it's parent\n\t\tThen the second one is clipped\n\t\tAnd the first one doesn't stretch\n\n\t@landmine\n\t@ui\n\tScenario: `max-width` is required for displaying as a row\n\t\tGiven I have `direction` to \"row\"\n\t\tAnd I have not set a `max-width`\n\t\tThen it displays as a column\n\n\t@motivating\n\t@ui\n\tScenario Outline: Content padding can be customized\n\t\tGiven prop \"padding\" has <value>\n\t\tThen <padding> is applied to content\n\n\t\tExamples:\n\t\t\t| value | padding |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |\n\n\n\t@motivating\n\t@ui\n\tScenario Outline: Gap between content elements can be customized\n\t\tGiven prop \"gap\" has <value>\n\t\tThen <gap> is applied to elements between content\n\n\t\tExamples:\n\t\t\t| value | gap |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |\n\n\t@minutia\n\t@ui\n\tScenario: Content can be center aligned in horizontal view\n\t\tGiven I have supplied the prop \"center\"\n\t\tThen the content is center aligned\n\n\t@minutia\n\t@ui\n\tScenario: Content in the last row can span full width with display in horizontal view\n\t\tGiven I have `display` to \"flex\"\n\t\tThen the content is full width on the last row\n\n\t@motivating\n\t@ui\n\tScenario Outline: Content can be aligned along the x-axis\n\t\tGiven prop \"justify-content\" has <value>\n\t\tThen content within the container is aligned <alignment>\n\n\t\tExamples:\n\t\t\t| value | alignment |\n\t\t\t| none | no alignment |\n\t\t\t| start | to the start |\n\t\t\t| center | to the center |\n\t\t\t| end | to the end |\n\t\t\t| space-between | with space between |\n\t\t\t| space-around | with space around |\n\t\t\t| space-evenly | with space evenly |\n\n\n\t@motivating\n\t@ui\n\tScenario Outline: Component background color can be customized\n\t\tGiven a user is viewing the Portal Container component\n\t\tThen the default value is \"#ffffff00\"\n\t\tWhen the prop \"background-color\" has <value>\n\t\tThen the background has color <backgroundColor>\n\t\tExamples:\n\t\t\t| value | backgroundColor |\n\t\t\t| empty (default value) | var(--sl-color-neutral-0) (#ffffff) |\n\t\t\t| aquamarine | #7fffd4 |\n";
11656
11856
 
11657
11857
  const PortalContainer_stories = {
11658
11858
  title: "Components/Microsite Container",
11659
11859
  parameters: {
11660
- scenario: scenario$q,
11860
+ scenario: scenario$r,
11661
11861
  },
11662
11862
  };
11663
11863
  const TooWideColumn = () => (h("div", { style: { width: "200px", border: "1px dashed grey" } },
@@ -11825,11 +12025,11 @@ const scenario3 = "@author:derek @owner:derek\nFeature: Reward Table Status Colu
11825
12025
 
11826
12026
  const scenario4 = "@author:derek @owner:derek\nFeature: Reward Table Source Column\n Shows the source of each reward\n\n @motivating @ui\n Scenario Outline: The title of the source column is configurable\n Given the \"column-title\" prop is set to <value>\n Then the source column is shown with <columnTitle>\n\n Examples:\n | value | columnTitle |\n | Source | |\n | My column title | My column title |\n\n @motivating @ui\n Scenario: The source column displays manual if the reward is caused by a manual action\n Given a user with a \"MANUAL\" reward\n When they view the rewards table\n Then the source of their reward is displayed as \"Manual\"\n\n @motivating @ui\n Scenario: The source column displays the program name if the reward is caused automatically by a program\n Given a user with a \"AUTOMATED\" program reward\n And the program has name \"Loyalty Program\"\n When they view the rewards table\n Then the source of their reward is displayed as \"Loyalty Program\"\n\n @motivating @ui\n Scenario Outline: The source column displays customizable reward exchange text with amount if the reward is caused by reward exchange\n Given the \"reward-exchange-text\" prop is <propValue>\n And a user with a \"MANUAL\" reward\n But it was created by a reward exchange\n Then they view the rewards table\n Then the source displays <exchangeText>\n And under it displays the following\n | prettyRedeemedCredit → prettyValue |\n\n Examples:\n | propValue | exchangeText |\n | | Reward Exchange |\n | Exchanged | Exchanged |\n\n @motivating @ui\n Scenario Outline: The source column displays customizable referral information if the reward is from a referral\n Given the \"reward-source-text\" prop is <propValue>\n And a user with a referral reward\n And that reward has <rewardSource>\n When they view the rewards table\n Then then source displays <referralText>\n And under it displays the full name of the <referralUser>\n\n Examples:\n | propValue | rewardSource | referralText | referralUser |\n | | REFERRED | Referred by | referrer user |\n | | FRIEND_SIGNUP | Referral to | referred user |\n | {rewardSource, select, FRIEND_SIGNUP {You Referred} REFERRED {Referred you} other {}} | REFERRED | Referred you | referrer user |\n | {rewardSource, select, FRIEND_SIGNUP {You Referred} REFERRED {Referred you} other {}} | FRIEND_SIGNUP | You Referred | referred user |\n\n @motivating @ui\n Scenario Outline: The source column displays the existing name for a referral if either the first name or last name does not exist\n Given a user with a referral reward\n And referral user exists\n And referral user has <name>\n But referral user has no <otherName>\n When they view the rewards table\n Then referral user's name is displayed as <name>\n\n Examples:\n | name | otherName |\n | first.name | last.name |\n | last.name | first.name |\n\n @motivating @ui\n Scenario Outline: The source column displays referral as \"Anonymous User\" if the referral user has no names\n Given a user with a referral reward\n And that reward has <rewardSource>\n And the <referralUser> has no first name\n And the <referralUser> has no last name\n When they view the rewards table\n Then then source displays <sourceText>\n And under it displays \"Anonymous User\"\n\n Examples:\n | rewardSource | referralUser | sourceText |\n | FRIEND_SIGNUP | referrer | Referral to |\n | REFERRED | referred user | Referred by |\n\n @motivating @ui\n Scenario Outline: The source column displays referral as \"Deleted User\" if the referral user is deleted in the system\n Given a user with a referral reward\n And that reward has <rewardSource>\n But <referral> user was deleted\n When they view the rewards table\n Then the source displays <sourceText>\n And under it displays \"Deleted User\"\n\n Examples:\n | rewardSource | referral | sourceText |\n | \"FRIEND_SIGNUP\" | referrer | Referral to |\n | \"REFERRED\" | referred | Referred by |\n\n @motivating @ui\n Scenario Outline: The source column displays referral as \"Deleted referral\" if the referral user is deleted in the system\n Given a user with a referral reward\n And that reward has <rewardSource>\n But <referral> user was deleted\n When they view the rewards table\n Then the source displays <sourceText>\n And under it displays \"Deleted referral\"\n\n Examples:\n | rewardSource | referral | sourceText |\n | \"FRIEND_SIGNUP\" | referrer | Referral to |\n | \"REFERRED\" | referred | Referred by |\n\n @minutia @ui\n Scenario Outline: Name fallbacks for referral users without names are customizable\n Given <prop> with <value>\n And a user with a referral reward\n But the referral user <hadAction>\n When they view the rewards table\n Then the source displays <value> as the referral user\n\n Examples:\n | prop | value | hadAction |\n | deleted-user | Former Customer | was deleted |\n | anonymous-user | Nameless User | had first and last name deleted |\n\n @motivating\n Scenario Outline: Source text can be customized\n Given the \"reward-source-text\" prop is \"{rewardSource, select, MANUAL {Support} AUTOMATED {Loyalty Program} other {}}\"\n And a user with a <rewardSource> reward\n When they view the rewards table\n Then the source is <sourceText>\n\n Examples:\n | rewardSource | sourceText |\n | MANUAL | Support |\n | AUTOMATED | Loyalty Program |\n";
11827
12027
 
11828
- const scenario$r = scenario1 + scenario2 + scenario3 + scenario4;
12028
+ const scenario$s = scenario1 + scenario2 + scenario3 + scenario4;
11829
12029
  const RewardsTableCell_stories = {
11830
12030
  title: "Components/Rewards Table Cell",
11831
12031
  parameters: {
11832
- scenario: scenario$r,
12032
+ scenario: scenario$s,
11833
12033
  },
11834
12034
  };
11835
12035
  const rewardsData$1 = {
@@ -12272,12 +12472,12 @@ const RewardsTableCell = /*#__PURE__*/Object.freeze({
12272
12472
  EmptyCell: EmptyCell$2
12273
12473
  });
12274
12474
 
12275
- const scenario$s = "@owner:sam\n@author:sam\nFeature: Rewards Table\n\n Shows a list of rewards as a table\n\n @motivating\n @ui\n Scenario: The empty state is shown if there are no rewards\n Given a user with rewards\n When they view the reward table\n Then no rewards are displayed\n And they see an image with a user icon\n And \"View your rewards\" in bold\n And \"See all the rewards you have earned from referring friends and completing tasks\" below the bolded text\n And the pagination buttons are disabled\n\n @minutia\n @ui\n Scenario: A custom empty state can be provided\n Given a user with no rewards\n And a custom empty state has been supplied in the \"empty\" slot\n When they view the reward table\n Then they see the custom empty state\n\n @minutia\n @ui\n Scenario: The loading state is shown while rewards are loading\n Given the table is loading\n Then the loading state is shown in the table\n And a custom loading state can be supplied in the \"loading\" slot\n And the pagination buttons are disabled\n\n @motivating\n @ui\n Scenario Outline: The table becomes paginated when the number of rewards exceeds the per page limit\n Given the user has <number of rewards>\n And the table is configured to show <page limit> rewards per page\n Then the table will have <number of pages> page(s)\n And pagination buttons will allow users to navigate between pages\n And the pagination button to go to the next page is disabled on the last page of rewards\n And the pagination button to go to the previous page is disabled on the first page of rewards\n Examples:\n | number of rewards | page limit | number of pages |\n | 0 | 4 | 1 |\n | 1 | 4 | 1 |\n | 3 | 4 | 1 |\n | 5 | 4 | 2 |\n | 42 | 4 | 11 |\n\n @motivating\n @ui\n Scenario: The table converts to a card view on tablet and mobile window sizes\n Given a user with rewards\n When they view the table\n And their window size is smaller than \"799px\"\n Then rewards are displayed as cards\n And they are in two columns\n When their window size is smaller than \"599px\"\n Then the rewards are displayed as cards in a singular column\n\n @motivating\n @ui\n Scenario: Table and Mobile beakpoints can be configured\n Given the reward table has been configured with the following props\n | prop | value |\n | smBreakpoint | 599 |\n | mdBreakpoint | 799 |\n And a user with rewards\n When they view the table\n And their window size is smaller than \"799px\"\n Then rewards are displayed as cards\n And they are in two columns\n When their window size is smaller than \"599px\"\n Then the rewards are displayed as cards in a singular column\n\n @motivating\n @ui\n Scenario Outline: By default the first column heading is hidden in mobile\n Given a reward table with 4 columns\n And prop \"hidden-columns\" with <hideColumnValue>\n And a user with rewards\n When they view the reward table\n And their window size is below the tablet breakpoint\n Then reward cards are displayed\n And the titles of <columnsArehidden> within the card\n Examples:\n | hideColumnValue | columnsArehidden |\n | | the first column |\n | 0,1,2 | the first, second and third columns |\n | 3 | the fourth column |\n\n @motivating\n Scenario: Only rewards which occured in the program specific by \"program-id\" are shown\n Given the table is configured with \"program-id\"\n Then only rewards from the program with \"program-id\" are shown\n\n @landmine\n Scenario: When a `classic` program Id is set then any reward without a programId is shown\n There is no easy way for the backend to filter for \"classic\" programs,\n thus we are filtering for rewards without programId's.\n\n Given the \"program-id\" of the table is set to \"classic\"\n Then rewards from classic programs are shown\n And manual rewards are shown\n\n @minutia\n @ui\n Scenario: Column heading can be hidden\n Given the table is configured with \"hide-labels\" set to \"true\"\n Then the table is displayed without column headings";
12475
+ const scenario$t = "@owner:sam\n@author:sam\nFeature: Rewards Table\n\n Shows a list of rewards as a table\n\n @motivating\n @ui\n Scenario: The empty state is shown if there are no rewards\n Given a user with rewards\n When they view the reward table\n Then no rewards are displayed\n And they see an image with a user icon\n And \"View your rewards\" in bold\n And \"See all the rewards you have earned from referring friends and completing tasks\" below the bolded text\n And the pagination buttons are disabled\n\n @minutia\n @ui\n Scenario: A custom empty state can be provided\n Given a user with no rewards\n And a custom empty state has been supplied in the \"empty\" slot\n When they view the reward table\n Then they see the custom empty state\n\n @minutia\n @ui\n Scenario: The loading state is shown while rewards are loading\n Given the table is loading\n Then the loading state is shown in the table\n And a custom loading state can be supplied in the \"loading\" slot\n And the pagination buttons are disabled\n\n @motivating\n @ui\n Scenario Outline: The table becomes paginated when the number of rewards exceeds the per page limit\n Given the user has <number of rewards>\n And the table is configured to show <page limit> rewards per page\n Then the table will have <number of pages> page(s)\n And pagination buttons will allow users to navigate between pages\n And the pagination button to go to the next page is disabled on the last page of rewards\n And the pagination button to go to the previous page is disabled on the first page of rewards\n Examples:\n | number of rewards | page limit | number of pages |\n | 0 | 4 | 1 |\n | 1 | 4 | 1 |\n | 3 | 4 | 1 |\n | 5 | 4 | 2 |\n | 42 | 4 | 11 |\n\n @motivating\n @ui\n Scenario: The table converts to a card view on tablet and mobile window sizes\n Given a user with rewards\n When they view the table\n And their window size is smaller than \"799px\"\n Then rewards are displayed as cards\n And they are in two columns\n When their window size is smaller than \"599px\"\n Then the rewards are displayed as cards in a singular column\n\n @motivating\n @ui\n Scenario: Table and Mobile beakpoints can be configured\n Given the reward table has been configured with the following props\n | prop | value |\n | smBreakpoint | 599 |\n | mdBreakpoint | 799 |\n And a user with rewards\n When they view the table\n And their window size is smaller than \"799px\"\n Then rewards are displayed as cards\n And they are in two columns\n When their window size is smaller than \"599px\"\n Then the rewards are displayed as cards in a singular column\n\n @motivating\n @ui\n Scenario Outline: By default the first column heading is hidden in mobile\n Given a reward table with 4 columns\n And prop \"hidden-columns\" with <hideColumnValue>\n And a user with rewards\n When they view the reward table\n And their window size is below the tablet breakpoint\n Then reward cards are displayed\n And the titles of <columnsArehidden> within the card\n Examples:\n | hideColumnValue | columnsArehidden |\n | | the first column |\n | 0,1,2 | the first, second and third columns |\n | 3 | the fourth column |\n\n @motivating\n Scenario: Only rewards which occured in the program specific by \"program-id\" are shown\n Given the table is configured with \"program-id\"\n Then only rewards from the program with \"program-id\" are shown\n\n @landmine\n Scenario: When a `classic` program Id is set then any reward without a programId is shown\n There is no easy way for the backend to filter for \"classic\" programs,\n thus we are filtering for rewards without programId's.\n\n Given the \"program-id\" of the table is set to \"classic\"\n Then rewards from classic programs are shown\n And manual rewards are shown\n\n @minutia\n @ui\n Scenario: Column heading can be hidden\n Given the table is configured with \"hide-labels\" set to \"true\"\n Then the table is displayed without column headings";
12276
12476
 
12277
12477
  const RewardsTable_stories = {
12278
12478
  title: "Components/Rewards Table",
12279
12479
  parameters: {
12280
- scenario: scenario$s,
12480
+ scenario: scenario$t,
12281
12481
  },
12282
12482
  };
12283
12483
  const loadingElement$1 = (h("div", { slot: "loading", style: { display: "contents" } },
@@ -12589,12 +12789,12 @@ const UseReferralTable = /*#__PURE__*/Object.freeze({
12589
12789
  ReferralTableFr: ReferralTableFr
12590
12790
  });
12591
12791
 
12592
- const scenario$t = "@author:kutay\n@owner:kutay\nFeature: Hero Image\n\n\tThe Hero Image component displays media images with a header, description and button using an overlay or a double column layout to offer an attrative widget page.\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the Hero Image component\n\n\t@motivating\n\t@ui\n\tScenario: Overlay image displays header, description, and button with brand color\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\tThen they see their image\n\t\tAnd the image has no padding\n\t\tAnd it has a brand colour overlay\n\t\tAnd \"Klip Rewards\" is displayed over top of the image in xxx-large font\n\t\tAnd below \"Refer friends or complete tasks while using Klip to earn rewards\" is displayed over top of the image in x-large font\n\t\tAnd below they see a brand coloured button with text \"Start earning\"\n\t\tAnd the text section has xxx-large padding\n\t\tWhen the component is scaled down to 599px\n\t\tThen the image is scaled to fit content\n\n\t@motivating\n\t@ui\n\tScenario Outline: Overlay image crop can be aligned left, center or right\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\t\t| image-pos | <value> |\n\t\tThen the image with overlay is displayed\n\t\tWhen the component is scaled down to 599px\n\t\tThen the image is <alignment> to fit content\n\t\tExamples:\n\t\t\t| value | alignment |\n\t\t\t| left | left aligned |\n\t\t\t| center | centered |\n\t\t\t| right | right aligned |\n\t\t\t| N/A | centered |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Overlay padding is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\t\t| padding-text | <value> |\n\t\tThen the image with overlay is displayed\n\t\tAnd <padding> is applied around header, description and button\n\t\tExamples:\n\t\t\t| value | padding |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Overlay color and background is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\t\t| text-color | <textColor> |\n\t\t\t| overlay-color | <overlayColor> |\n\t\t\t| overlay-opacity | <overlayOpacity> |\n\t\tThen the image with overlay is displayed\n\t\tAnd the overlay is <overlayColor>\n\t\tAnd the overlay has <overlayOpacity>\n\t\tAnd the text is <textColor>\n\t\tExamples:\n\t\t\t| textColor | overlayColor | overlayOpacity |\n\t\t\t| #fffc4b | #ff7f7f | 0.9 |\n\t\t\t| #1d0314 | #4baa1a | 0 |\n\t\t\t| #211a27 | #aa481a | 1 |\n\n\t@motivating\n\t@ui\n\tScenario: Two-column layout displays an image on one side and on the other side a header, description, and button\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\tThen the image is displayed on the left\n\t\tAnd the following elements are displayed on the right\n\t\t\t| elements |\n\t\t\t| header |\n\t\t\t| description |\n\t\t\t| button |\n\t\tWhen the component is scaled down to 599px\n\t\tThen the two-column layout switches to a row layout\n\t\tAnd the image is displayed on top\n\t\tAnd the content is displayed below\n\n\t@motivating\n\t@ui\n\tScenario Outline: Image position is configurable for desktop and mobile\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| image-pos | <imagePos> |\n\t\t\t| image-mobile-pos | <imageMobilePos> |\n\t\tThen the image is displayed on the <imagePos>\n\t\tWhen the component is scaled down to 599px\n\t\tThen two-column layout switches to a row layout\n\t\tAnd image is displayed on the <imageMobilePos>\n\t\tExamples:\n\t\t\t| imagePos | imageMobilePos |\n\t\t\t| left | top |\n\t\t\t| right | bottom |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Padding is configurable for the image and text of two column layouts\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| padding-text | <paddingText> |\n\t\t\t| padding-image | <paddingImage> |\n\t\tThen the two column layout is displayed\n\t\tAnd the image has padding <paddingImage>\n\t\tAnd the text has padding <paddingText>\n\t\tExamples:\n\t\t\t| paddingText | paddingImage |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| none | none |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Two-column layout image division percentage is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000248/squatch-assets/MVgOJn7.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| image-percentage | <percent> |\n\t\tThen the two column layout is displayed\n\t\tAnd the image takes up <percent> of the two-column layout\n\t\tAnd the text elements take up the remainder of the space\n\t\tExamples:\n\t\t\t| percent |\n\t\t\t| 25% |\n\t\t\t| 42% |\n\t\t\t| 66% |\n\n\t@motivating\n\t@ui\n\tScenario: Two-column layout text and background color is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| text-color | <textColor> |\n\t\t\t| background-color | <backgroundColor> |\n\t\tThen the two column layout is displayed\n\t\tAnd the text has color <textColor>\n\t\tAnd the background has color <backgroundColor>\n\t\tExamples:\n\t\t\t| textColor | backgroundColor |\n\t\t\t| #fffc4b | #ff7f7f |\n\t\t\t| #1d0314 | #4baa1a |\n\t\t\t| #211a27 | #aa481a |";
12792
+ const scenario$u = "@author:kutay\n@owner:kutay\nFeature: Hero Image\n\n\tThe Hero Image component displays media images with a header, description and button using an overlay or a double column layout to offer an attrative widget page.\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the Hero Image component\n\n\t@motivating\n\t@ui\n\tScenario: Overlay image displays header, description, and button with brand color\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\tThen they see their image\n\t\tAnd the image has no padding\n\t\tAnd it has a brand colour overlay\n\t\tAnd \"Klip Rewards\" is displayed over top of the image in xxx-large font\n\t\tAnd below \"Refer friends or complete tasks while using Klip to earn rewards\" is displayed over top of the image in x-large font\n\t\tAnd below they see a brand coloured button with text \"Start earning\"\n\t\tAnd the text section has xxx-large padding\n\t\tWhen the component is scaled down to 599px\n\t\tThen the image is scaled to fit content\n\n\t@motivating\n\t@ui\n\tScenario Outline: Overlay image crop can be aligned left, center or right\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\t\t| image-pos | <value> |\n\t\tThen the image with overlay is displayed\n\t\tWhen the component is scaled down to 599px\n\t\tThen the image is <alignment> to fit content\n\t\tExamples:\n\t\t\t| value | alignment |\n\t\t\t| left | left aligned |\n\t\t\t| center | centered |\n\t\t\t| right | right aligned |\n\t\t\t| N/A | centered |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Overlay padding is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\t\t| padding-text | <value> |\n\t\tThen the image with overlay is displayed\n\t\tAnd <padding> is applied around header, description and button\n\t\tExamples:\n\t\t\t| value | padding |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Overlay color and background is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000278/squatch-assets/bTwu1Um.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"overlay\" |\n\t\t\t| text-color | <textColor> |\n\t\t\t| overlay-color | <overlayColor> |\n\t\t\t| overlay-opacity | <overlayOpacity> |\n\t\tThen the image with overlay is displayed\n\t\tAnd the overlay is <overlayColor>\n\t\tAnd the overlay has <overlayOpacity>\n\t\tAnd the text is <textColor>\n\t\tExamples:\n\t\t\t| textColor | overlayColor | overlayOpacity |\n\t\t\t| #fffc4b | #ff7f7f | 0.9 |\n\t\t\t| #1d0314 | #4baa1a | 0 |\n\t\t\t| #211a27 | #aa481a | 1 |\n\n\t@motivating\n\t@ui\n\tScenario: Two-column layout displays an image on one side and on the other side a header, description, and button\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\tThen the image is displayed on the left\n\t\tAnd the following elements are displayed on the right\n\t\t\t| elements |\n\t\t\t| header |\n\t\t\t| description |\n\t\t\t| button |\n\t\tWhen the component is scaled down to 599px\n\t\tThen the two-column layout switches to a row layout\n\t\tAnd the image is displayed on top\n\t\tAnd the content is displayed below\n\n\t@motivating\n\t@ui\n\tScenario Outline: Image position is configurable for desktop and mobile\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| image-pos | <imagePos> |\n\t\t\t| image-mobile-pos | <imageMobilePos> |\n\t\tThen the image is displayed on the <imagePos>\n\t\tWhen the component is scaled down to 599px\n\t\tThen two-column layout switches to a row layout\n\t\tAnd image is displayed on the <imageMobilePos>\n\t\tExamples:\n\t\t\t| imagePos | imageMobilePos |\n\t\t\t| left | top |\n\t\t\t| right | bottom |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Padding is configurable for the image and text of two column layouts\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| padding-text | <paddingText> |\n\t\t\t| padding-image | <paddingImage> |\n\t\tThen the two column layout is displayed\n\t\tAnd the image has padding <paddingImage>\n\t\tAnd the text has padding <paddingText>\n\t\tExamples:\n\t\t\t| paddingText | paddingImage |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| none | none |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Two-column layout image division percentage is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000248/squatch-assets/MVgOJn7.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| image-percentage | <percent> |\n\t\tThen the two column layout is displayed\n\t\tAnd the image takes up <percent> of the two-column layout\n\t\tAnd the text elements take up the remainder of the space\n\t\tExamples:\n\t\t\t| percent |\n\t\t\t| 25% |\n\t\t\t| 42% |\n\t\t\t| 66% |\n\n\t@motivating\n\t@ui\n\tScenario: Two-column layout text and background color is configurable\n\t\tGiven a Hero Image component configured with the following props\n\t\t\t| prop | value |\n\t\t\t| image-url | \"https://res.cloudinary.com/saasquatch/image/upload/v1644000275/squatch-assets/yr6ER3R.png\" |\n\t\t\t| header | \"Klip Rewards\" |\n\t\t\t| description | \"Refer friends or complete tasks while using Klip to earn rewards\" |\n\t\t\t| button-text | \"Start earning\" |\n\t\t\t| layout | \"columns\" |\n\t\t\t| text-color | <textColor> |\n\t\t\t| background-color | <backgroundColor> |\n\t\tThen the two column layout is displayed\n\t\tAnd the text has color <textColor>\n\t\tAnd the background has color <backgroundColor>\n\t\tExamples:\n\t\t\t| textColor | backgroundColor |\n\t\t\t| #fffc4b | #ff7f7f |\n\t\t\t| #1d0314 | #4baa1a |\n\t\t\t| #211a27 | #aa481a |";
12593
12793
 
12594
12794
  const HeroImage_stories = {
12595
12795
  title: "Components/Hero Image",
12596
12796
  parameters: {
12597
- scenario: scenario$t,
12797
+ scenario: scenario$u,
12598
12798
  },
12599
12799
  };
12600
12800
  const OverlayHeader = () => {
@@ -12667,12 +12867,12 @@ const HeroImage = /*#__PURE__*/Object.freeze({
12667
12867
  ColumnsCustomColors: ColumnsCustomColors
12668
12868
  });
12669
12869
 
12670
- const scenario$u = "@author:kutay\n@owner:kutay\nFeature: Referral Card\n\n\tThe Referral Card component takes in two slots and displays them side by side.\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the Referral Card component\n\n\t@motivating\n\t@ui\n\tScenario: Referral Card component displays provided content in left and right slots side by side\n\t\tGiven a Referral Card component\n\t\tAnd a slot with the name \"left\"\n\t\tAnd a slot with the name \"right\"\n\t\tWhen the user views the referral card\n\t\tThen the slot contents are displayed the card with equal width\n\t\tWhen the component is scaled down to 499px\n\t\tThen the column layout switches to row layout\n\t\tAnd the \"left\" slot content is displayed above the \"right\" slot content\n\n\t@minutia\n\t@ui\n\tScenario: Left or right column content spans the whole card if there is no content in the other column\n\t\tGiven a Referral Card component\n\t\tAnd there content in one column\n\t\tAnd there is no content in the other column\n\t\tThen the column with content spans 100% of the card width\n\t\tAnd the column with content respects the container's padding\n\t\tAnd the column without content has zero width\n\n\t@motivating\n\t@ui\n\tScenario Outline: Referral Card component content can be vertically aligned start, center, end\n\t\tGiven a Referral Card component\n\t\tAnd a slot with the name \"left\"\n\t\tAnd a slot with the name \"right\"\n\t\tAnd the prop \"vertical-alignment\" has <value>\n\t\tThen slots contents are displayed inside the card\n\t\tAnd slots are vertically aligned to <alignment> of the card\n\t\tExamples:\n\t\t\t| value | alignment |\n\t\t\t| start | the top |\n\t\t\t| center | the center |\n\t\t\t| end | the bottom |\n\t\t\t| N/A | the top |\n\n\t@ui\n\tScenario Outline: Container border can be toggled\n\t\tGiven a user is viewing the referral card component\n\t\tThen the default value for the prop \"include-border\" is \"true\"\n\t\tWhen \"include-border\" has <value>\n\t\tThen the referral card component's border <maybe> included\n\t\tExamples:\n\t\t\t| value | maybe |\n\t\t\t| true | is |\n\t\t\t| false | isn't |\n\t\t\t| empty (no value) | is |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Component background color can be customized\n\t\tGiven a user is viewing the Referral Card component\n\t\tThen the default value is \"#ffffff\"\n\t\tWhen the prop \"background-color\" has <value>\n\t\tThen the background has color <backgroundColor>\n\t\tExamples:\n\t\t\t| value | backgroundColor |\n\t\t\t| empty (default value) | var(--sl-color-neutral-0) (#ffffff) |\n\t\t\t| aquamarine | #7fffd4 |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Container padding can be customized\n\t\tGiven a user is looking at the component\n\t\tThen the default values for \"padding-top\", \"padding-bottom\", \"padding-left\", \"padding-right\" is \"large\"\n\t\tWhen prop \"padding-top\" has <value>\n\t\tThen <padding> is applied to content\n\t\tAnd the same applies to \"padding-bottom\", \"padding-left\", \"padding-right\"\n\n\t\tExamples:\n\t\t\t| value | padding |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |";
12870
+ const scenario$v = "@author:kutay\n@owner:kutay\nFeature: Referral Card\n\n\tThe Referral Card component takes in two slots and displays them side by side.\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the Referral Card component\n\n\t@motivating\n\t@ui\n\tScenario: Referral Card component displays provided content in left and right slots side by side\n\t\tGiven a Referral Card component\n\t\tAnd a slot with the name \"left\"\n\t\tAnd a slot with the name \"right\"\n\t\tWhen the user views the referral card\n\t\tThen the slot contents are displayed the card with equal width\n\t\tWhen the component is scaled down to 499px\n\t\tThen the column layout switches to row layout\n\t\tAnd the \"left\" slot content is displayed above the \"right\" slot content\n\n\t@minutia\n\t@ui\n\tScenario: Left or right column content spans the whole card if there is no content in the other column\n\t\tGiven a Referral Card component\n\t\tAnd there content in one column\n\t\tAnd there is no content in the other column\n\t\tThen the column with content spans 100% of the card width\n\t\tAnd the column with content respects the container's padding\n\t\tAnd the column without content has zero width\n\n\t@motivating\n\t@ui\n\tScenario Outline: Referral Card component content can be vertically aligned start, center, end\n\t\tGiven a Referral Card component\n\t\tAnd a slot with the name \"left\"\n\t\tAnd a slot with the name \"right\"\n\t\tAnd the prop \"vertical-alignment\" has <value>\n\t\tThen slots contents are displayed inside the card\n\t\tAnd slots are vertically aligned to <alignment> of the card\n\t\tExamples:\n\t\t\t| value | alignment |\n\t\t\t| start | the top |\n\t\t\t| center | the center |\n\t\t\t| end | the bottom |\n\t\t\t| N/A | the top |\n\n\t@ui\n\tScenario Outline: Container border can be toggled\n\t\tGiven a user is viewing the referral card component\n\t\tThen the default value for the prop \"include-border\" is \"true\"\n\t\tWhen \"include-border\" has <value>\n\t\tThen the referral card component's border <maybe> included\n\t\tExamples:\n\t\t\t| value | maybe |\n\t\t\t| true | is |\n\t\t\t| false | isn't |\n\t\t\t| empty (no value) | is |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Component background color can be customized\n\t\tGiven a user is viewing the Referral Card component\n\t\tThen the default value is \"#ffffff\"\n\t\tWhen the prop \"background-color\" has <value>\n\t\tThen the background has color <backgroundColor>\n\t\tExamples:\n\t\t\t| value | backgroundColor |\n\t\t\t| empty (default value) | var(--sl-color-neutral-0) (#ffffff) |\n\t\t\t| aquamarine | #7fffd4 |\n\n\t@motivating\n\t@ui\n\tScenario Outline: Container padding can be customized\n\t\tGiven a user is looking at the component\n\t\tThen the default values for \"padding-top\", \"padding-bottom\", \"padding-left\", \"padding-right\" is \"large\"\n\t\tWhen prop \"padding-top\" has <value>\n\t\tThen <padding> is applied to content\n\t\tAnd the same applies to \"padding-bottom\", \"padding-left\", \"padding-right\"\n\n\t\tExamples:\n\t\t\t| value | padding |\n\t\t\t| none | no padding |\n\t\t\t| xxx-small | xxx-small |\n\t\t\t| xx-small | xx-small |\n\t\t\t| x-small | x-small |\n\t\t\t| small | small |\n\t\t\t| medium | medium |\n\t\t\t| large | large |\n\t\t\t| x-large | x-large |\n\t\t\t| xx-large | xx-large |\n\t\t\t| xxx-large | xxx-large |\n\t\t\t| xxxx-large | xxxx-large |\n\t\t\t| N/A | no padding |";
12671
12871
 
12672
12872
  const ReferralCard_stories = {
12673
12873
  title: "Components/Referral Card",
12674
12874
  parameters: {
12675
- scenario: scenario$u,
12875
+ scenario: scenario$v,
12676
12876
  },
12677
12877
  };
12678
12878
  const media = (slot) => {
@@ -12826,11 +13026,11 @@ const scenarioTimeline = "@author:derek\n@owner:kutay\nFeature: Timeline\n\n
12826
13026
 
12827
13027
  const scenarioTimelineEntry = "@author:derek\n@owner:kutay\nFeature: Timeline Entry\n\n @motivating\n @ui\n Scenario: Timeline entries have an icon, a reward and an entry desciption\n Given an timeline entry with the following props\n | prop | value |\n | unit | Visa Giftcard |\n | reward | 50$ |\n | desc | Earn a 50$ Visa Giftcard for each referral you make |\n When a user views the entry\n Then they see a gift icon\n And see \"$50 VISA GIFTCARRD\" to the right\n And \"$50\" is bolded with x-large font size\n And below they see \"Earn a 50$ Visa Giftcard for each referral you make\"\n\n @motivating\n @ui\n Scenario Outline: Icon can either be a gift or a brand colour cirle\n Given a timeline entry with \"icon\" <iconPropValue>\n When a user views the entry\n Then they see an <icon>\n Examples:\n | iconPropValue 1 | icon |\n | gift | gift |\n | circle | brand colour circle |\n | | gift |\n\n @motivating\n @ui\n Scenario: A timeline entry can display a line to connect it to another entry\n Given a timeline entry with \"line\" \"true\"\n When a user views the entry\n Then they see the entry\n But it has a brand colour line connecting it to the next timeline entry\n";
12828
13028
 
12829
- const scenario$v = scenarioTimeline + scenarioTimelineEntry;
13029
+ const scenario$w = scenarioTimeline + scenarioTimelineEntry;
12830
13030
  const Timeline_stories = {
12831
13031
  title: "Components/Timeline",
12832
13032
  parameters: {
12833
- scenario: scenario$v,
13033
+ scenario: scenario$w,
12834
13034
  },
12835
13035
  };
12836
13036
  const TimelineWith1Reward = () => {
@@ -12903,12 +13103,12 @@ const Timeline = /*#__PURE__*/Object.freeze({
12903
13103
  TimelineWith4Rewards: TimelineWith4Rewards
12904
13104
  });
12905
13105
 
12906
- const scenario$w = "@author:kutay\n@owner:kutay\nFeature: Image\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the image component\n\n\t@motivating\n\t@ui\n\tScenario: Image is displayed from URL\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided with a valid image url\n\t\tThen the image is displayed\n\t\tAnd it is centered\n\n\t@motivating\n\t@ui\n\tScenario Outline: Images can be aligned left, center or right\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided with a valid image url\n\t\tAnd prop \"align\" has <value>\n\t\tThen the image is displayed\n\t\tAnd it is aligned to the <value>\n\t\tExamples:\n\t\t\t| value |\n\t\t\t| left |\n\t\t\t| center |\n\t\t\t| right |\n\n\t@motivating\n\t@ui\n\tScenario: Image background can be assigned a color\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided with a valid image url\n\t\tAnd prop \"background-color\" is provided a color\n\t\tThen the image is displayed\n\t\tAnd the background is the provided color\n\n\t@motivating\n\t@ui\n\tScenario: Image minimum height can be constrained\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided\n\t\tAnd prop \"min-height\" is given a minimum value\n\t\tThen the image is displayed\n\t\tAnd the container size changes\n\t\tThen the image does not shrink below its minimum height";
13106
+ const scenario$x = "@author:kutay\n@owner:kutay\nFeature: Image\n\n\tBackground: A user on the portal is viewing the widget\n\t\tGiven a user viewing the image component\n\n\t@motivating\n\t@ui\n\tScenario: Image is displayed from URL\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided with a valid image url\n\t\tThen the image is displayed\n\t\tAnd it is centered\n\n\t@motivating\n\t@ui\n\tScenario Outline: Images can be aligned left, center or right\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided with a valid image url\n\t\tAnd prop \"align\" has <value>\n\t\tThen the image is displayed\n\t\tAnd it is aligned to the <value>\n\t\tExamples:\n\t\t\t| value |\n\t\t\t| left |\n\t\t\t| center |\n\t\t\t| right |\n\n\t@motivating\n\t@ui\n\tScenario: Image background can be assigned a color\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided with a valid image url\n\t\tAnd prop \"background-color\" is provided a color\n\t\tThen the image is displayed\n\t\tAnd the background is the provided color\n\n\t@motivating\n\t@ui\n\tScenario: Image minimum height can be constrained\n\t\tGiven an Image component\n\t\tAnd prop \"image-url\" is provided\n\t\tAnd prop \"min-height\" is given a minimum value\n\t\tThen the image is displayed\n\t\tAnd the container size changes\n\t\tThen the image does not shrink below its minimum height";
12907
13107
 
12908
13108
  const Image_stories = {
12909
13109
  title: "Components/Image",
12910
13110
  parameters: {
12911
- scenario: scenario$w,
13111
+ scenario: scenario$x,
12912
13112
  },
12913
13113
  };
12914
13114
  const Image = () => {
@@ -12941,12 +13141,12 @@ const Image$1 = /*#__PURE__*/Object.freeze({
12941
13141
  MinimumHeight: MinimumHeight
12942
13142
  });
12943
13143
 
12944
- const scenario$x = "@author:derek\n@owner:noah\nFeature: Titled Section\n\n Background: The titled section has a label and content\n Given a titled section\n And it has a label\n And it has content in the content slot\n\n @motivating\n @ui\n Scenario: Text alignment defaults to left align but can be configured\n Given the titled section has \"text-align\" <textAlignPropValue>\n When a user views the titled section\n Then the text in the label is <aligned>\n And the text in the content is <aligned>\n Examples:\n | textAlignPropValue | aligned |\n | center | center |\n | left | left |\n | right | right |\n | | left |\n\n @minutia\n @ui\n Scenario: Label margin is configurable\n Given the titled section has \"label-margin\" <marginPropValue>\n When a user views the titled section\n Then <marginPropValue> margin is between the label and content\n Examples:\n | marginPropValue | margin |\n | none | no |\n | xxx-small | xxx-small |\n | xx-small | xx-small |\n | x-small | x-small |\n | small | small |\n | medium | medium |\n | large | large |\n | x-large | x-large |\n | xx-large | xx-large |\n | xxx-large | xxx-large |\n | xxxx-large | xxxx-large |\n | | no |\n\n @minutia\n @ui\n Scenario Outline: Titled section padding is configurable\n Given the titled section has \"padding\" <paddingPropValue>\n When a user views the titled section\n Then <paddingPropValue> padding is applied around the titled section\n Examples:\n | paddingPropValue | padding |\n | none | no |\n | xxx-small | xxx-small |\n | xx-small | xx-small |\n | x-small | x-small |\n | small | small |\n | medium | medium |\n | large | large |\n | x-large | x-large |\n | xx-large | xx-large |\n | xxx-large | xxx-large |\n | xxxx-large | xxxx-large |\n | | no |";
13144
+ const scenario$y = "@author:derek\n@owner:noah\nFeature: Titled Section\n\n Background: The titled section has a label and content\n Given a titled section\n And it has a label\n And it has content in the content slot\n\n @motivating\n @ui\n Scenario: Text alignment defaults to left align but can be configured\n Given the titled section has \"text-align\" <textAlignPropValue>\n When a user views the titled section\n Then the text in the label is <aligned>\n And the text in the content is <aligned>\n Examples:\n | textAlignPropValue | aligned |\n | center | center |\n | left | left |\n | right | right |\n | | left |\n\n @minutia\n @ui\n Scenario: Label margin is configurable\n Given the titled section has \"label-margin\" <marginPropValue>\n When a user views the titled section\n Then <marginPropValue> margin is between the label and content\n Examples:\n | marginPropValue | margin |\n | none | no |\n | xxx-small | xxx-small |\n | xx-small | xx-small |\n | x-small | x-small |\n | small | small |\n | medium | medium |\n | large | large |\n | x-large | x-large |\n | xx-large | xx-large |\n | xxx-large | xxx-large |\n | xxxx-large | xxxx-large |\n | | no |\n\n @minutia\n @ui\n Scenario Outline: Titled section padding is configurable\n Given the titled section has \"padding\" <paddingPropValue>\n When a user views the titled section\n Then <paddingPropValue> padding is applied around the titled section\n Examples:\n | paddingPropValue | padding |\n | none | no |\n | xxx-small | xxx-small |\n | xx-small | xx-small |\n | x-small | x-small |\n | small | small |\n | medium | medium |\n | large | large |\n | x-large | x-large |\n | xx-large | xx-large |\n | xxx-large | xxx-large |\n | xxxx-large | xxxx-large |\n | | no |";
12945
13145
 
12946
13146
  const TitledSection_stories = {
12947
13147
  title: "Components/Titled Section",
12948
13148
  parameters: {
12949
- scenario: scenario$x,
13149
+ scenario: scenario$y,
12950
13150
  },
12951
13151
  };
12952
13152
  const AlignLeft = () => {
@@ -13342,12 +13542,12 @@ const Scroll = /*#__PURE__*/Object.freeze({
13342
13542
  ShoelaceProps: ShoelaceProps
13343
13543
  });
13344
13544
 
13345
- const scenario$y = "@author:Zach\n@owner:Zach\nFeature: Tabs\n\n The Tabs takes in the Tab component as children and maps through to display their header and content.\n\n Background: A user on the portal is viewing the widget\n Given a user viewing the Tabs component\n\n @motivating\n Scenario: Content inside the active tab is shown\n Given the header is set to <tabHeader>\n And the content inside is <tabContent>\n And the user has clicked <tabHeader>\n Then the <tabContent> is shown\n Examples:\n | tabHeader | tabContent |\n | Settings | This is the settings tab |\n | General | This is the general tab |\n | History | This is the history tab |\n\n @motivating\n @ui\n Scenario: The placement of the tabs is configurable\n Given The placement prop has been passed a valid <placement>\n Then tabs are placed on the <placementResult>\n Examples:\n | placement | placementResult |\n | | top of the content |\n | left | left hand side of the content |\n | right | right hand side of the content |\n | bottom | bottom of the content |\n\n\n @minutia\n @ui\n Scenario Outline: Tabs are setup to use the brand color\n Given the brand color is set to darkblue\n Then the text inside the active tab is darkblue\n And the underline of the active tab is darkblue\n\n @ui\n Scenario: Tabs are responsive\n Given the user is on a mobile device\n When there are more tabs than the horizontal space allows for\n Then clickable arrows appear on the left and right of the tabs\n And the tabs are scrollable\n\n @landmine\n Scenario: Program section cannot be used inside of tabs\n Given a tabs component\n And tab containing a program section with program-id \"test123\"\n And the program section wraps a component using program context\n When the tabs component is rendered\n Then the \"sq:program-id\" event listener for the program section is removed\n And the component does not use program-id \"test123\" to source its data\n And falls back to the global program id";
13545
+ const scenario$z = "@author:Zach\n@owner:Zach\nFeature: Tabs\n\n The Tabs takes in the Tab component as children and maps through to display their header and content.\n\n Background: A user on the portal is viewing the widget\n Given a user viewing the Tabs component\n\n @motivating\n Scenario: Content inside the active tab is shown\n Given the header is set to <tabHeader>\n And the content inside is <tabContent>\n And the user has clicked <tabHeader>\n Then the <tabContent> is shown\n Examples:\n | tabHeader | tabContent |\n | Settings | This is the settings tab |\n | General | This is the general tab |\n | History | This is the history tab |\n\n @motivating\n @ui\n Scenario: The placement of the tabs is configurable\n Given The placement prop has been passed a valid <placement>\n Then tabs are placed on the <placementResult>\n Examples:\n | placement | placementResult |\n | | top of the content |\n | left | left hand side of the content |\n | right | right hand side of the content |\n | bottom | bottom of the content |\n\n\n @minutia\n @ui\n Scenario Outline: Tabs are setup to use the brand color\n Given the brand color is set to darkblue\n Then the text inside the active tab is darkblue\n And the underline of the active tab is darkblue\n\n @ui\n Scenario: Tabs are responsive\n Given the user is on a mobile device\n When there are more tabs than the horizontal space allows for\n Then clickable arrows appear on the left and right of the tabs\n And the tabs are scrollable\n\n @landmine\n Scenario: Program section cannot be used inside of tabs\n Given a tabs component\n And tab containing a program section with program-id \"test123\"\n And the program section wraps a component using program context\n When the tabs component is rendered\n Then the \"sq:program-id\" event listener for the program section is removed\n And the component does not use program-id \"test123\" to source its data\n And falls back to the global program id";
13346
13546
 
13347
13547
  const Tabs_stories = {
13348
13548
  title: "Components/Tabs",
13349
13549
  parameters: {
13350
- scenario: scenario$y,
13550
+ scenario: scenario$z,
13351
13551
  },
13352
13552
  };
13353
13553
  const SimpleTabs = () => (h("div", { style: { maxWidth: "700px", margin: "auto" }, innerHTML: `
@@ -13847,12 +14047,12 @@ const Tabs = /*#__PURE__*/Object.freeze({
13847
14047
  RightTabs: RightTabs
13848
14048
  });
13849
14049
 
13850
- const scenario$z = "@author:johan\n@owner:johan\nFeature: Share Code\n\n The share code component is a box that allows users to see and copy their referral code for a given program\n\n Background: Environment\n Given there is a valid program ID in the environment\n And there is a valid user ID and account ID in the environment\n\n @motivating\n Scenario: A Users referral code can be copied to their clipboard\n Given tooltiptext is \"hello tooltip\"\n When the component renders\n Then there is a textbox with the user's share code\n When the clipboard icon is clicked\n Then the code is copied to clipboard\n And a tooltip will appear for ~1 second\n\n @minutia\n Scenario: Tooltip lifespan defaults to 2000\n Given the tooltip's lifespan is set to 2000\n And there is tooltip text\n When the component renders\n And the clipboard icon is clicked\n Then a tooltip will appear for ~2 seconds\n\n @minutia\n Scenario: Demo\n Given isDemo() returns true\n Then the share code is \"SHARECODE001\"\n And the component won't be interactive\n And the tooltip is hidden\n\n @minutia\n Scenario: Program ID can be sourced from prop\n Given the programId prop is set to \"program-a\"\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-a\"\n\n @minutia\n Scenario: Program ID can be sourced from window\n Given the programId prop is unset\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-b\"\n\n @minutia\n Scenario: An analytic event is fired when a user copies their code\n Given a user viewing the share code component\n And the component is rendered for \"program-a\"\n When they click to copy their code\n Then an \"USER_REFERRAL_PROGRAM_ENGAGEMENT_EVENT\" analytic event is fired\n And it is for \"program-a\"\n And it has share medium \"DIRECT\"\n\n\n @ui\n Scenario Outline: user can edit the alignment of the share code text\n Given a user is editing the share code component\n Then they see \"Align text\" props\n And the default value is \"left\"\n When they change the option to <option>\n Then they see the text in <position>\n Examples:\n | option | position |\n | left | left |\n | center | center |\n | right | right |\n\n @ui\n Scenario Outline: The position of the copy button can be changed\n Given a user is editing the share code component\n Then they see \"Style\" props\n And the default value is \"icon\"\n When they change the option to <option>\n Then they see the copy button in <position>\n Examples:\n | option | position |\n | button outside | outside the input, on the right |\n | button below | outside the input, below |\n | icon | inside the input as an icon |\n";
14050
+ const scenario$A = "@author:johan\n@owner:johan\nFeature: Share Code\n\n The share code component is a box that allows users to see and copy their referral code for a given program\n\n Background: Environment\n Given there is a valid program ID in the environment\n And there is a valid user ID and account ID in the environment\n\n @motivating\n Scenario: A Users referral code can be copied to their clipboard\n Given tooltiptext is \"hello tooltip\"\n When the component renders\n Then there is a textbox with the user's share code\n When the clipboard icon is clicked\n Then the code is copied to clipboard\n And a tooltip will appear for ~1 second\n\n @minutia\n Scenario: Tooltip lifespan defaults to 2000\n Given the tooltip's lifespan is set to 2000\n And there is tooltip text\n When the component renders\n And the clipboard icon is clicked\n Then a tooltip will appear for ~2 seconds\n\n @minutia\n Scenario: Demo\n Given isDemo() returns true\n Then the share code is \"SHARECODE001\"\n And the component won't be interactive\n And the tooltip is hidden\n\n @minutia\n Scenario: Program ID can be sourced from prop\n Given the programId prop is set to \"program-a\"\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-a\"\n\n @minutia\n Scenario: Program ID can be sourced from window\n Given the programId prop is unset\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-b\"\n\n @minutia\n Scenario: An analytic event is fired when a user copies their code\n Given a user viewing the share code component\n And the component is rendered for \"program-a\"\n When they click to copy their code\n Then an \"USER_REFERRAL_PROGRAM_ENGAGEMENT_EVENT\" analytic event is fired\n And it is for \"program-a\"\n And it has share medium \"DIRECT\"\n\n\n @ui\n Scenario Outline: user can edit the alignment of the share code text\n Given a user is editing the share code component\n Then they see \"Align text\" props\n And the default value is \"left\"\n When they change the option to <option>\n Then they see the text in <position>\n Examples:\n | option | position |\n | left | left |\n | center | center |\n | right | right |\n\n @ui\n Scenario Outline: The position of the copy button can be changed\n Given a user is editing the share code component\n Then they see \"Style\" props\n And the default value is \"icon\"\n When they change the option to <option>\n Then they see the copy button in <position>\n Examples:\n | option | position |\n | button outside | outside the input, on the right |\n | button below | outside the input, below |\n | icon | inside the input as an icon |\n";
13851
14051
 
13852
14052
  const ShareCode_stories = {
13853
14053
  title: "Components/Share Code",
13854
14054
  parameters: {
13855
- scenario: scenario$z,
14055
+ scenario: scenario$A,
13856
14056
  },
13857
14057
  };
13858
14058
  const ShareCode = () => {
@@ -13886,7 +14086,7 @@ const CopyButtonBelow$1 = () => {
13886
14086
  buttonStyle: "button-below",
13887
14087
  })));
13888
14088
  };
13889
- const Error$7 = () => {
14089
+ const Error$8 = () => {
13890
14090
  const props = {
13891
14091
  copyString: "https://noah.example.com",
13892
14092
  disabled: true,
@@ -13907,15 +14107,15 @@ const ShareCode$1 = /*#__PURE__*/Object.freeze({
13907
14107
  CustomTooltipDuration: CustomTooltipDuration,
13908
14108
  CopyButton: CopyButton$1,
13909
14109
  CopyButtonBelow: CopyButtonBelow$1,
13910
- Error: Error$7
14110
+ Error: Error$8
13911
14111
  });
13912
14112
 
13913
- const scenario$A = "@author:sam\n@owner:sam\nFeature: Referral Code\n\n The referral code component is a box that allows users to see and copy their referral promo code for a given program\n\n Background: Environment\n Given there is a valid program ID in the environment\n And there is a valid user ID and account ID in the environment\n\n @motivating\n Scenario: A Users referral code can be copied to their clipboard\n Given tooltiptext is \"hello tooltip\"\n When the component renders\n Then there is a textbox with the user's referral code\n When the clipboard icon is clicked\n Then the code is copied to clipboard\n And a tooltip will appear for ~1 second\n\n @minutia\n Scenario: Tooltip lifespan can be customized\n Given the tooltip's lifespan is set to 2000\n And there is tooltip text\n When the component renders\n And the clipboard icon is clicked\n Then a tooltip will appear for ~2 seconds\n\n @minutia\n Scenario: Demo\n Given isDemo() returns true\n Then the share code is \"SHARECODE001\"\n And the component won't be interactive\n And the tooltip is hidden\n\n @minutia\n Scenario: Program ID can be sourced from prop\n Given the programId prop is set to \"program-a\"\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-a\"\n\n @minutia\n Scenario: Program ID can be sourced from window\n Given the programId prop is unset\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-b\"\n\n @minutia\n Scenario: An analytic event is fired when a user copies their code\n Given a user viewing the referral code component\n And the component is rendered for \"program-a\"\n When they click to copy their code\n Then an \"USER_REFERRAL_PROGRAM_ENGAGEMENT_EVENT\" analytic event is fired\n And it is for \"program-a\"\n And it has share medium \"DIRECT\"\n\n @ui\n Scenario Outline: user can edit the alignment of the share code text\n Given a user is editing the referral code component\n Then they see \"Align text\" props\n And the default value is \"left\"\n When they change the option to <option>\n Then they see the text in <position>\n Examples:\n | option | position |\n | left | left |\n | center | center |\n | right | right |\n\n @ui\n Scenario Outline: The position of the copy button can be changed\n Given a user is editing the referral code component\n Then they see \"Style\" props\n And the default value is \"icon\"\n When they change the option to <option>\n Then they see the copy button in <position>\n Examples:\n | option | position |\n | button outside | outside the input, on the right |\n | button below | outside the input, below |\n | icon | inside the input as an icon |\n";
14113
+ const scenario$B = "@author:sam\n@owner:sam\nFeature: Referral Code\n\n The referral code component is a box that allows users to see and copy their referral promo code for a given program\n\n Background: Environment\n Given there is a valid program ID in the environment\n And there is a valid user ID and account ID in the environment\n\n @motivating\n Scenario: A Users referral code can be copied to their clipboard\n Given tooltiptext is \"hello tooltip\"\n When the component renders\n Then there is a textbox with the user's referral code\n When the clipboard icon is clicked\n Then the code is copied to clipboard\n And a tooltip will appear for ~1 second\n\n @minutia\n Scenario: Tooltip lifespan can be customized\n Given the tooltip's lifespan is set to 2000\n And there is tooltip text\n When the component renders\n And the clipboard icon is clicked\n Then a tooltip will appear for ~2 seconds\n\n @minutia\n Scenario: Demo\n Given isDemo() returns true\n Then the share code is \"SHARECODE001\"\n And the component won't be interactive\n And the tooltip is hidden\n\n @minutia\n Scenario: Program ID can be sourced from prop\n Given the programId prop is set to \"program-a\"\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-a\"\n\n @minutia\n Scenario: Program ID can be sourced from window\n Given the programId prop is unset\n And window.widgetIdent.programId is set to \"program-b\"\n When the component renders\n Then the share code is for \"program-b\"\n\n @minutia\n Scenario: An analytic event is fired when a user copies their code\n Given a user viewing the referral code component\n And the component is rendered for \"program-a\"\n When they click to copy their code\n Then an \"USER_REFERRAL_PROGRAM_ENGAGEMENT_EVENT\" analytic event is fired\n And it is for \"program-a\"\n And it has share medium \"DIRECT\"\n\n @ui\n Scenario Outline: user can edit the alignment of the share code text\n Given a user is editing the referral code component\n Then they see \"Align text\" props\n And the default value is \"left\"\n When they change the option to <option>\n Then they see the text in <position>\n Examples:\n | option | position |\n | left | left |\n | center | center |\n | right | right |\n\n @ui\n Scenario Outline: The position of the copy button can be changed\n Given a user is editing the referral code component\n Then they see \"Style\" props\n And the default value is \"icon\"\n When they change the option to <option>\n Then they see the copy button in <position>\n Examples:\n | option | position |\n | button outside | outside the input, on the right |\n | button below | outside the input, below |\n | icon | inside the input as an icon |\n";
13914
14114
 
13915
14115
  const ReferralCode_stories = {
13916
14116
  title: "Components/Referral Code",
13917
14117
  parameters: {
13918
- scenario: scenario$A,
14118
+ scenario: scenario$B,
13919
14119
  },
13920
14120
  };
13921
14121
  const ReferralCode = () => {
@@ -13959,7 +14159,7 @@ const CopyButtonBelow$2 = () => {
13959
14159
  buttonStyle: "button-below",
13960
14160
  })));
13961
14161
  };
13962
- const Error$8 = () => {
14162
+ const Error$9 = () => {
13963
14163
  const props = {
13964
14164
  copyString: "https://noah.example.com",
13965
14165
  disabled: true,
@@ -13983,7 +14183,7 @@ const ReferralCode$1 = /*#__PURE__*/Object.freeze({
13983
14183
  CustomTooltipDuration: CustomTooltipDuration$1,
13984
14184
  CopyButton: CopyButton$2,
13985
14185
  CopyButtonBelow: CopyButtonBelow$2,
13986
- Error: Error$8
14186
+ Error: Error$9
13987
14187
  });
13988
14188
 
13989
14189
  // import scenario from "./ShareCode.feature";
@@ -13993,7 +14193,7 @@ const EmailRegistration_stories = {
13993
14193
  // scenario,
13994
14194
  },
13995
14195
  };
13996
- const defaultProps$d = {
14196
+ const defaultProps$f = {
13997
14197
  states: {
13998
14198
  error: "",
13999
14199
  loading: false,
@@ -14012,59 +14212,59 @@ const defaultProps$d = {
14012
14212
  fraudErrorMessageTitle: "Looks like you tried referring yourself",
14013
14213
  },
14014
14214
  };
14015
- const Default$f = () => h(EmailRegistrationView, Object.assign({}, defaultProps$d));
14215
+ const Default$i = () => h(EmailRegistrationView, Object.assign({}, defaultProps$f));
14016
14216
  const HasFirstNameLastName = () => (h(EmailRegistrationView, Object.assign({}, {
14017
- ...defaultProps$d,
14217
+ ...defaultProps$f,
14018
14218
  content: {
14019
- ...defaultProps$d.content,
14219
+ ...defaultProps$f.content,
14020
14220
  includeName: true,
14021
14221
  },
14022
14222
  })));
14023
14223
  const WithSlots = () => (h(EmailRegistrationView, Object.assign({}, {
14024
- ...defaultProps$d,
14224
+ ...defaultProps$f,
14025
14225
  content: {
14026
- ...defaultProps$d.content,
14226
+ ...defaultProps$f.content,
14027
14227
  topSlot: h("div", null, "Hello this is the top slot"),
14028
14228
  bottomSlot: h("div", null, "Hello this is the bottom slot"),
14029
14229
  },
14030
14230
  })));
14031
14231
  const NoBorder$1 = () => (h(EmailRegistrationView, Object.assign({}, {
14032
- ...defaultProps$d,
14232
+ ...defaultProps$f,
14033
14233
  content: {
14034
- ...defaultProps$d.content,
14234
+ ...defaultProps$f.content,
14035
14235
  hideBorder: true,
14036
14236
  },
14037
14237
  })));
14038
14238
  const BackgroundColor$2 = () => (h(EmailRegistrationView, Object.assign({}, {
14039
- ...defaultProps$d,
14239
+ ...defaultProps$f,
14040
14240
  content: {
14041
- ...defaultProps$d.content,
14241
+ ...defaultProps$f.content,
14042
14242
  backgroundColor: "aquamarine",
14043
14243
  },
14044
14244
  })));
14045
- const Loading$4 = () => (h(EmailRegistrationView, Object.assign({}, {
14046
- ...defaultProps$d,
14245
+ const Loading$5 = () => (h(EmailRegistrationView, Object.assign({}, {
14246
+ ...defaultProps$f,
14047
14247
  states: {
14048
14248
  error: "",
14049
14249
  loading: true,
14050
14250
  },
14051
14251
  })));
14052
- const Error$9 = () => (h(EmailRegistrationView, Object.assign({}, {
14053
- ...defaultProps$d,
14252
+ const Error$a = () => (h(EmailRegistrationView, Object.assign({}, {
14253
+ ...defaultProps$f,
14054
14254
  states: {
14055
14255
  error: "Something went wrong. Please try again.",
14056
14256
  loading: false,
14057
14257
  },
14058
14258
  })));
14059
14259
  const FraudError = () => (h(EmailRegistrationView, Object.assign({}, {
14060
- ...defaultProps$d,
14260
+ ...defaultProps$f,
14061
14261
  states: {
14062
14262
  error: "FRAUD",
14063
14263
  loading: false,
14064
14264
  },
14065
14265
  })));
14066
14266
  const EmptyEmailError = () => (h(EmailRegistrationView, Object.assign({}, {
14067
- ...defaultProps$d,
14267
+ ...defaultProps$f,
14068
14268
  states: {
14069
14269
  error: "Something went wrong. Please try again.",
14070
14270
  loading: false,
@@ -14077,26 +14277,26 @@ const EmptyEmailError = () => (h(EmailRegistrationView, Object.assign({}, {
14077
14277
  const EmailRegistration = /*#__PURE__*/Object.freeze({
14078
14278
  __proto__: null,
14079
14279
  'default': EmailRegistration_stories,
14080
- Default: Default$f,
14280
+ Default: Default$i,
14081
14281
  HasFirstNameLastName: HasFirstNameLastName,
14082
14282
  WithSlots: WithSlots,
14083
14283
  NoBorder: NoBorder$1,
14084
14284
  BackgroundColor: BackgroundColor$2,
14085
- Loading: Loading$4,
14086
- Error: Error$9,
14285
+ Loading: Loading$5,
14286
+ Error: Error$a,
14087
14287
  FraudError: FraudError,
14088
14288
  EmptyEmailError: EmptyEmailError
14089
14289
  });
14090
14290
 
14091
- const scenario$B = "@author:truman\n@owner:truman\nFeature: Coupon Code\n\n The coupon code component is a box that allows users to see and copy their coupon code for a given program\n\n @motivating\n Scenario: Component only fetches codes from current program\n Given a user has multiple rewards from various programs\n When the component is loaded\n Then it fetches the user's rewards from only the program associated with the widget\n\n @motivating\n Scenario: Component only looks at fueltank rewards\n Given a user has multiple rewards of different types\n When the component is loaded\n Then it filters the user's reward to only return FUELTANK rewards\n\n\n @motivating\n Scenario: The first (i.e. most recently received) reward is the reward that is displayed\n Given a user has at least one fueltank reward\n And the fueltank reward is available\n Then the coupon code component shows the first reward returned\n And this reward is the most recently received reward by the user\n\n @motivating\n Scenario Outline: Coupon code has multiple states depending on reward status\n Given a user has at least one fueltank reward\n And the reward has most recent status <status>\n And the dateScheduledFor field is <dateScheduledFor>\n Then the component's status is set to <componentStatus>\n And the <errorMessageTextProp> is displayed under the input field\n\n Examples:\n | status | dateScheduledFor | componentStatus | errorMessageTextProp |\n | AVAILABLE | null | AVAILABLE | N/A |\n | EXPIRED | null | EXPIRED | expiredErrorMessage |\n | REDEEMED | null | REDEEMED | redeemedMessage |\n | CANCELLED | null | CANCELLED | cancelledErrorMessage |\n | PENDING | null | EMPTY_TANK | fullfillmentErrorMessage |\n | PENDING | 123412341234 | PENDING | pendingErrorMessage |\n | null | null | ERROR | genericErrorMessage |\n\n Scenario Outline: Coupon code's error message text props are grouped\n Given an end user is viewing the coupon code component in the widget editor\n And they are looking at the component's properties\n Then they see <prop>\n And <prop> is grouped under \"Coupon code error\"\n Examples:\n | prop |\n | N/A |\n | expiredErrorMessage |\n | redeemedMessage |\n | cancelledErrorMessage |\n | fullfillmentErrorMessage |\n | pendingErrorMessage |\n | genericErrorMessage |\n\n @minutia\n Scenario: Tooltip lifespan defaults to 2000\n Given the tooltip's lifespan is set to 2000\n And there is tooltip text\n When the component renders\n And the clipboard icon is clicked\n Then a tooltip appears for ~2 seconds\n\n @ui\n Scenario: Component shows an error state when there is an error\n Given a user is viewing the coupon code component\n When there is an error in the coupon code\n Then in place of the coupon code is an alert banner\n And the alert banner gives information about the error to the user\n\n @ui\n Scenario: Component shows an loading state\n Given a user is viewing the coupon code component\n When the coupon code is loading in\n Then the text inside the input is \"Loading...\"\n And the coupon code input box has a gray background\n And the cursor is set to \"default\"\n And the user cannot copy the text\n\n @ui\n Scenario Outline: User can edit the alignment of the coupon code text\n Given a user is editing the coupon code component\n Then they see \"Align text\" props\n And the default value is \"left\"\n When they change the option to <option>\n Then they see the text in <position>\n Examples:\n | option | position |\n | left | left |\n | center | center |\n | right | right |\n\n @ui\n Scenario Outline: The position of the copy button can be changed\n Given a user is editing the coupon code component\n Then they see \"Style\" props\n And the default value is \"icon\"\n When they change the option to <option>\n Then they see the copy button in <position>\n Examples:\n | option | position |\n | button outside | outside the input, on the right |\n | button below | outside the input, below |\n | icon | inside the input as an icon |\n\n @minutia\n Scenario: ICU string converts to a date\n Given a user is viewing a live coupon code code component\n And the \"pendingErrorText\" has the \"{unpendDate}\" ICU string\n And the program is configured for rewards to be pending\n Then the user will see an info alert banner\n And the ICU string is converted to the unpend date\n";
14291
+ const scenario$C = "@author:truman\n@owner:truman\nFeature: Coupon Code\n\n The coupon code component is a box that allows users to see and copy their coupon code for a given program\n\n @motivating\n Scenario: Component only fetches codes from current program\n Given a user has multiple rewards from various programs\n When the component is loaded\n Then it fetches the user's rewards from only the program associated with the widget\n\n @motivating\n Scenario: Component only looks at fueltank rewards\n Given a user has multiple rewards of different types\n When the component is loaded\n Then it filters the user's reward to only return FUELTANK rewards\n\n\n @motivating\n Scenario: The first (i.e. most recently received) reward is the reward that is displayed\n Given a user has at least one fueltank reward\n And the fueltank reward is available\n Then the coupon code component shows the first reward returned\n And this reward is the most recently received reward by the user\n\n @motivating\n Scenario Outline: Coupon code has multiple states depending on reward status\n Given a user has at least one fueltank reward\n And the reward has most recent status <status>\n And the dateScheduledFor field is <dateScheduledFor>\n Then the component's status is set to <componentStatus>\n And the <errorMessageTextProp> is displayed under the input field\n\n Examples:\n | status | dateScheduledFor | componentStatus | errorMessageTextProp |\n | AVAILABLE | null | AVAILABLE | N/A |\n | EXPIRED | null | EXPIRED | expiredErrorMessage |\n | REDEEMED | null | REDEEMED | redeemedMessage |\n | CANCELLED | null | CANCELLED | cancelledErrorMessage |\n | PENDING | null | EMPTY_TANK | fullfillmentErrorMessage |\n | PENDING | 123412341234 | PENDING | pendingErrorMessage |\n | null | null | ERROR | genericErrorMessage |\n\n Scenario Outline: Coupon code's error message text props are grouped\n Given an end user is viewing the coupon code component in the widget editor\n And they are looking at the component's properties\n Then they see <prop>\n And <prop> is grouped under \"Coupon code error\"\n Examples:\n | prop |\n | N/A |\n | expiredErrorMessage |\n | redeemedMessage |\n | cancelledErrorMessage |\n | fullfillmentErrorMessage |\n | pendingErrorMessage |\n | genericErrorMessage |\n\n @minutia\n Scenario: Tooltip lifespan defaults to 2000\n Given the tooltip's lifespan is set to 2000\n And there is tooltip text\n When the component renders\n And the clipboard icon is clicked\n Then a tooltip appears for ~2 seconds\n\n @ui\n Scenario: Component shows an error state when there is an error\n Given a user is viewing the coupon code component\n When there is an error in the coupon code\n Then in place of the coupon code is an alert banner\n And the alert banner gives information about the error to the user\n\n @ui\n Scenario: Component shows an loading state\n Given a user is viewing the coupon code component\n When the coupon code is loading in\n Then the text inside the input is \"Loading...\"\n And the coupon code input box has a gray background\n And the cursor is set to \"default\"\n And the user cannot copy the text\n\n @ui\n Scenario Outline: User can edit the alignment of the coupon code text\n Given a user is editing the coupon code component\n Then they see \"Align text\" props\n And the default value is \"left\"\n When they change the option to <option>\n Then they see the text in <position>\n Examples:\n | option | position |\n | left | left |\n | center | center |\n | right | right |\n\n @ui\n Scenario Outline: The position of the copy button can be changed\n Given a user is editing the coupon code component\n Then they see \"Style\" props\n And the default value is \"icon\"\n When they change the option to <option>\n Then they see the copy button in <position>\n Examples:\n | option | position |\n | button outside | outside the input, on the right |\n | button below | outside the input, below |\n | icon | inside the input as an icon |\n\n @minutia\n Scenario: ICU string converts to a date\n Given a user is viewing a live coupon code code component\n And the \"pendingErrorText\" has the \"{unpendDate}\" ICU string\n And the program is configured for rewards to be pending\n Then the user will see an info alert banner\n And the ICU string is converted to the unpend date\n";
14092
14292
 
14093
14293
  const CouponCode_stories = {
14094
14294
  title: "Components/Coupon Code",
14095
14295
  parameters: {
14096
- scenario: scenario$B,
14296
+ scenario: scenario$C,
14097
14297
  },
14098
14298
  };
14099
- const defaultProps$e = {
14299
+ const defaultProps$g = {
14100
14300
  tooltiptext: "Copied to Clipboard",
14101
14301
  copyString: "THANKSJANE125uv125",
14102
14302
  open: false,
@@ -14121,43 +14321,43 @@ const TextAlignRight$3 = () => {
14121
14321
  return h("sqm-coupon-code", { textAlign: "right" });
14122
14322
  };
14123
14323
  const CopyButton$3 = () => {
14124
- return (h("sqm-coupon-code", Object.assign({}, defaultProps$e, { buttonStyle: "button-outside" })));
14324
+ return (h("sqm-coupon-code", Object.assign({}, defaultProps$g, { buttonStyle: "button-outside" })));
14125
14325
  };
14126
14326
  const CopyButtonCustomLabel = () => {
14127
- return (h("sqm-coupon-code", Object.assign({}, defaultProps$e, { buttonStyle: "button-outside", "copy-button-label": "test long custom label" })));
14327
+ return (h("sqm-coupon-code", Object.assign({}, defaultProps$g, { buttonStyle: "button-outside", "copy-button-label": "test long custom label" })));
14128
14328
  };
14129
14329
  const CopyButtonBelow$3 = () => {
14130
- return (h("sqm-coupon-code", Object.assign({}, defaultProps$e, { buttonStyle: "button-below" })));
14330
+ return (h("sqm-coupon-code", Object.assign({}, defaultProps$g, { buttonStyle: "button-below" })));
14131
14331
  };
14132
14332
  const CopyButtonBelowCustomLabel = () => {
14133
- return (h("sqm-coupon-code", Object.assign({}, defaultProps$e, { buttonStyle: "button-below", "copy-button-label": "test long custom label" })));
14333
+ return (h("sqm-coupon-code", Object.assign({}, defaultProps$g, { buttonStyle: "button-below", "copy-button-label": "test long custom label" })));
14134
14334
  };
14135
- const Loading$5 = () => {
14136
- return h(CouponCodeView, Object.assign({}, defaultProps$e, { loading: true }));
14335
+ const Loading$6 = () => {
14336
+ return h(CouponCodeView, Object.assign({}, defaultProps$g, { loading: true }));
14137
14337
  };
14138
14338
  const CopyButtonLoading = () => {
14139
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { buttonStyle: "button-outside", loading: true })));
14339
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { buttonStyle: "button-outside", loading: true })));
14140
14340
  };
14141
14341
  const CopyButtonBelowLoading = () => {
14142
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { buttonStyle: "button-below", loading: true })));
14342
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { buttonStyle: "button-below", loading: true })));
14143
14343
  };
14144
14344
  const ErrorGeneric = () => {
14145
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { errorType: "warning", error: true, errorText: "We couldn't fetch your code. Please try again later or reach out to the Support team for help resolving this issue." })));
14345
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { errorType: "warning", error: true, errorText: "We couldn't fetch your code. Please try again later or reach out to the Support team for help resolving this issue." })));
14146
14346
  };
14147
14347
  const ErrorPending = () => {
14148
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { errorType: "info", error: true, errorText: "Your code will be available on April 24, 2023. Mark your calendar and come back then to redeem your reward!" })));
14348
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { errorType: "info", error: true, errorText: "Your code will be available on April 24, 2023. Mark your calendar and come back then to redeem your reward!" })));
14149
14349
  };
14150
14350
  const ErrorFullfillment = () => {
14151
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { errorType: "warning", error: true, errorText: "We couldn't fetch your code. Please try again later or reach out to the Support team for help resolving this issue." })));
14351
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { errorType: "warning", error: true, errorText: "We couldn't fetch your code. Please try again later or reach out to the Support team for help resolving this issue." })));
14152
14352
  };
14153
14353
  const ErrorCancelled = () => {
14154
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { errorType: "warning", error: true, errorText: "This code has been cancelled. Please reach out to the Support team for help resolving this issue." })));
14354
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { errorType: "warning", error: true, errorText: "This code has been cancelled. Please reach out to the Support team for help resolving this issue." })));
14155
14355
  };
14156
14356
  const ErrorExpired = () => {
14157
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { errorType: "warning", error: true, errorText: "Looks like this code has expired. Please reach out to the Support team for help resolving this issue." })));
14357
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { errorType: "warning", error: true, errorText: "Looks like this code has expired. Please reach out to the Support team for help resolving this issue." })));
14158
14358
  };
14159
14359
  const ErrorRedeemed = () => {
14160
- return (h(CouponCodeView, Object.assign({}, defaultProps$e, { errorType: "success", error: true, errorText: "Looks like you\u2019ve already redeemed this code." })));
14360
+ return (h(CouponCodeView, Object.assign({}, defaultProps$g, { errorType: "success", error: true, errorText: "Looks like you\u2019ve already redeemed this code." })));
14161
14361
  };
14162
14362
 
14163
14363
  const CouponCode$1 = /*#__PURE__*/Object.freeze({
@@ -14172,7 +14372,7 @@ const CouponCode$1 = /*#__PURE__*/Object.freeze({
14172
14372
  CopyButtonCustomLabel: CopyButtonCustomLabel,
14173
14373
  CopyButtonBelow: CopyButtonBelow$3,
14174
14374
  CopyButtonBelowCustomLabel: CopyButtonBelowCustomLabel,
14175
- Loading: Loading$5,
14375
+ Loading: Loading$6,
14176
14376
  CopyButtonLoading: CopyButtonLoading,
14177
14377
  CopyButtonBelowLoading: CopyButtonBelowLoading,
14178
14378
  ErrorGeneric: ErrorGeneric,
@@ -14183,55 +14383,55 @@ const CouponCode$1 = /*#__PURE__*/Object.freeze({
14183
14383
  ErrorRedeemed: ErrorRedeemed
14184
14384
  });
14185
14385
 
14186
- const scenario$C = "@author:noah\n@owner:noah\n\nFeature: Logout Current User\n\n Background:\n Given a user viewing an instant access widget\n\n @motivating\n @ui\n Scenario: A user on an instant access widget\n Given the user is identified\n And the user is logged in\n Then the component identifies the user by displaying their email in an ICU string\n And the users email displayed in the ICU string using hte \"{email}\" variable\n\n @motivating\n @ui\n Scenario: Users can switch who they are identified as through a link\n Given the user is identified\n And the user is logged in\n When the user clicks the link in the component\n Then the saved user identity is emptied\n And they are sent back to the registration form to re-identify themselves\n\n @minutia\n Scenario: Logout link empties the saved User Identity\n Given a valid user identity\n And the user is viewing the \"logged-in\" template\n When they click the logout link\n Then the user identity is set to \"undefined\"\n And the user is returned to the \"logged-out\" template";
14386
+ const scenario$D = "@author:noah\n@owner:noah\n\nFeature: Logout Current User\n\n Background:\n Given a user viewing an instant access widget\n\n @motivating\n @ui\n Scenario: A user on an instant access widget\n Given the user is identified\n And the user is logged in\n Then the component identifies the user by displaying their email in an ICU string\n And the users email displayed in the ICU string using hte \"{email}\" variable\n\n @motivating\n @ui\n Scenario: Users can switch who they are identified as through a link\n Given the user is identified\n And the user is logged in\n When the user clicks the link in the component\n Then the saved user identity is emptied\n And they are sent back to the registration form to re-identify themselves\n\n @minutia\n Scenario: Logout link empties the saved User Identity\n Given a valid user identity\n And the user is viewing the \"logged-in\" template\n When they click the logout link\n Then the user identity is set to \"undefined\"\n And the user is returned to the \"logged-out\" template";
14187
14387
 
14188
14388
  const LogoutCurrentUser_stories = {
14189
14389
  title: "Components/Logout Current User",
14190
14390
  parameters: {
14191
- scenario: scenario$C,
14391
+ scenario: scenario$D,
14192
14392
  },
14193
14393
  };
14194
- const defaultProps$f = {
14394
+ const defaultProps$h = {
14195
14395
  filledInEmailText: "Currently showing referral data for noah.clarke@saasquatch.com",
14196
14396
  onSwitchClick: () => console.log("clicked"),
14197
14397
  switchUserText: "not you?",
14198
14398
  loading: false,
14199
14399
  emailErrorText: "Error fetching email",
14200
14400
  };
14201
- const Default$g = () => {
14202
- return h(LogoutCurrentUserView, Object.assign({}, defaultProps$f));
14401
+ const Default$j = () => {
14402
+ return h(LogoutCurrentUserView, Object.assign({}, defaultProps$h));
14203
14403
  };
14204
14404
 
14205
14405
  const LogoutCurrentUser = /*#__PURE__*/Object.freeze({
14206
14406
  __proto__: null,
14207
14407
  'default': LogoutCurrentUser_stories,
14208
- Default: Default$g
14408
+ Default: Default$j
14209
14409
  });
14210
14410
 
14211
- const scenario$D = "@author:noah\n@owner:noah\n\nFeature: Link Button\n\n\t@ui\n\tScenario: Links can be opened in the same tab\n\t\tWhen a user clicks the button\n\t\tThen a link opens in the same tab\n\t\tAnd if the component is in an iFrame then the link is opened in the parent window not the iFrame\n\n\t@ui\n\tScenario: Links can be opened in a new tab\n\t\tWhen a user clicks the button\n\t\tThen a link opens in a new tab\n\t\tAnd if the component is in an iFrame then the link is still opened in a new tab\n\n\n\t@ui\n\tScenario: Props control the link and button text\n\t\tGiven the \"link\" prop is set to \"https://www.example.com\"\n\t\tAnd the \"buttonText\" prop is set to \"Click me!\"\n\t\tThen a button is shown with the text \"Click me!\"\n\t\tAnd when clicked the button opens https://www.example.com\n\n\t@ui\n\tScenario Outline: The button type can be set\n\t\tGiven the button type is set to <value>\n\t\tThen a <buttonType> is shown\n\t\tExamples:\n\t\t\t| value | buttonType |\n\t\t\t| <null> | primary |\n\t\t\t| default | default |\n\t\t\t| primary | primary |\n\t\t\t| success | success |\n\t\t\t| neutral | neutral |\n\t\t\t| warning | warning |\n\t\t\t| danger | danger |";
14411
+ const scenario$E = "@author:noah\n@owner:noah\n\nFeature: Link Button\n\n\t@ui\n\tScenario: Links can be opened in the same tab\n\t\tWhen a user clicks the button\n\t\tThen a link opens in the same tab\n\t\tAnd if the component is in an iFrame then the link is opened in the parent window not the iFrame\n\n\t@ui\n\tScenario: Links can be opened in a new tab\n\t\tWhen a user clicks the button\n\t\tThen a link opens in a new tab\n\t\tAnd if the component is in an iFrame then the link is still opened in a new tab\n\n\n\t@ui\n\tScenario: Props control the link and button text\n\t\tGiven the \"link\" prop is set to \"https://www.example.com\"\n\t\tAnd the \"buttonText\" prop is set to \"Click me!\"\n\t\tThen a button is shown with the text \"Click me!\"\n\t\tAnd when clicked the button opens https://www.example.com\n\n\t@ui\n\tScenario Outline: The button type can be set\n\t\tGiven the button type is set to <value>\n\t\tThen a <buttonType> is shown\n\t\tExamples:\n\t\t\t| value | buttonType |\n\t\t\t| <null> | primary |\n\t\t\t| default | default |\n\t\t\t| primary | primary |\n\t\t\t| success | success |\n\t\t\t| neutral | neutral |\n\t\t\t| warning | warning |\n\t\t\t| danger | danger |";
14212
14412
 
14213
14413
  const LinkButton_stories = {
14214
14414
  title: "Components/Link Button",
14215
14415
  parameters: {
14216
- scenario: scenario$D,
14416
+ scenario: scenario$E,
14217
14417
  },
14218
14418
  };
14219
- const defaultProps$g = {
14419
+ const defaultProps$i = {
14220
14420
  link: "https://example.com",
14221
14421
  openInNewTab: false,
14222
14422
  buttonText: "Button Text",
14223
14423
  };
14224
- const Default$h = () => {
14225
- return h("sqm-link-button", Object.assign({}, defaultProps$g));
14424
+ const Default$k = () => {
14425
+ return h("sqm-link-button", Object.assign({}, defaultProps$i));
14226
14426
  };
14227
14427
  const OpenInNewTab = () => {
14228
- return (h("sqm-link-button", Object.assign({}, { ...defaultProps$g, openInNewTab: true })));
14428
+ return (h("sqm-link-button", Object.assign({}, { ...defaultProps$i, openInNewTab: true })));
14229
14429
  };
14230
14430
 
14231
14431
  const LinkButton = /*#__PURE__*/Object.freeze({
14232
14432
  __proto__: null,
14233
14433
  'default': LinkButton_stories,
14234
- Default: Default$h,
14434
+ Default: Default$k,
14235
14435
  OpenInNewTab: OpenInNewTab
14236
14436
  });
14237
14437
 
@@ -14241,7 +14441,7 @@ const CloseButton_stories = {
14241
14441
  // scenario,
14242
14442
  },
14243
14443
  };
14244
- const defaultProps$h = {};
14444
+ const defaultProps$j = {};
14245
14445
  const containerStyles = {
14246
14446
  position: "relative",
14247
14447
  width: "500px",
@@ -14249,22 +14449,22 @@ const containerStyles = {
14249
14449
  border: "1px solid black",
14250
14450
  padding: "25px",
14251
14451
  };
14252
- const Default$i = () => {
14253
- return h(CloseButtonView, Object.assign({}, defaultProps$h));
14452
+ const Default$l = () => {
14453
+ return h(CloseButtonView, Object.assign({}, defaultProps$j));
14254
14454
  };
14255
14455
  const InAContainer = () => {
14256
14456
  return (h("div", { style: containerStyles },
14257
- h(CloseButtonView, Object.assign({}, defaultProps$h))));
14457
+ h(CloseButtonView, Object.assign({}, defaultProps$j))));
14258
14458
  };
14259
14459
  const CustomColor$1 = () => {
14260
14460
  return (h("div", { style: containerStyles },
14261
- h(CloseButtonView, Object.assign({}, { ...defaultProps$h, color: "blue" }))));
14461
+ h(CloseButtonView, Object.assign({}, { ...defaultProps$j, color: "blue" }))));
14262
14462
  };
14263
14463
 
14264
14464
  const CloseButton = /*#__PURE__*/Object.freeze({
14265
14465
  __proto__: null,
14266
14466
  'default': CloseButton_stories,
14267
- Default: Default$i,
14467
+ Default: Default$l,
14268
14468
  InAContainer: InAContainer,
14269
14469
  CustomColor: CustomColor$1
14270
14470
  });
@@ -14454,17 +14654,17 @@ const RadioCardView = ({ title, icon, description, selected, }) => {
14454
14654
  const RadioCard_stories = {
14455
14655
  title: "Components/Radio Card",
14456
14656
  };
14457
- const defaultProps$i = {
14657
+ const defaultProps$k = {
14458
14658
  selected: false,
14459
14659
  title: "Card Title",
14460
14660
  description: "Description text goes here",
14461
14661
  icon: "apple",
14462
14662
  };
14463
14663
  const DefaultView$1 = () => {
14464
- return h(RadioCardView, Object.assign({}, defaultProps$i));
14664
+ return h(RadioCardView, Object.assign({}, defaultProps$k));
14465
14665
  };
14466
14666
  const Selected = () => {
14467
- return h(RadioCardView, Object.assign({}, defaultProps$i, { selected: true }));
14667
+ return h(RadioCardView, Object.assign({}, defaultProps$k, { selected: true }));
14468
14668
  };
14469
14669
 
14470
14670
  const RadioCard = /*#__PURE__*/Object.freeze({
@@ -14477,13 +14677,13 @@ const RadioCard = /*#__PURE__*/Object.freeze({
14477
14677
  const ProgressBar_stories = {
14478
14678
  title: "Components/Progress Bar",
14479
14679
  };
14480
- const defaultProps$j = {
14680
+ const defaultProps$l = {
14481
14681
  progress: 2,
14482
14682
  goal: 4,
14483
14683
  steps: true,
14484
14684
  };
14485
14685
  const TaxAndPayoutsProgressBar = () => {
14486
- return h(ProgressBar$2, Object.assign({}, defaultProps$j, { stageCount: 4, currentStage: 2 }));
14686
+ return h(ProgressBar$2, Object.assign({}, defaultProps$l, { stageCount: 4, currentStage: 2 }));
14487
14687
  };
14488
14688
 
14489
14689
  const ProgressBar$1 = /*#__PURE__*/Object.freeze({
@@ -14495,7 +14695,7 @@ const ProgressBar$1 = /*#__PURE__*/Object.freeze({
14495
14695
  const PayoutDetailsCard_stories = {
14496
14696
  title: "Components/Payout Details Card",
14497
14697
  };
14498
- const Loading$6 = () => {
14698
+ const Loading$7 = () => {
14499
14699
  return (h("sqm-payout-details-card", { demoData: {
14500
14700
  states: {
14501
14701
  loading: true,
@@ -14535,7 +14735,7 @@ const PaypalPayout = () => {
14535
14735
  const PayoutDetailsCard = /*#__PURE__*/Object.freeze({
14536
14736
  __proto__: null,
14537
14737
  'default': PayoutDetailsCard_stories,
14538
- Loading: Loading$6,
14738
+ Loading: Loading$7,
14539
14739
  NextPayout: NextPayout,
14540
14740
  PayoutToday: PayoutToday,
14541
14741
  ThresholdPayout: ThresholdPayout,
@@ -15169,14 +15369,14 @@ const UseInvoiceTableCells = /*#__PURE__*/Object.freeze({
15169
15369
  const WidgetEmailVerification_stories = {
15170
15370
  title: "Components/Widget Email Verification",
15171
15371
  };
15172
- const defaultProps$k = {
15372
+ const defaultProps$m = {
15173
15373
  email: "",
15174
15374
  error: false,
15175
15375
  loading: false,
15176
15376
  initialLoading: false,
15177
15377
  sendCodeError: false,
15178
15378
  };
15179
- const Default$j = () => (h("sqm-email-verification", { demoData: {} }));
15379
+ const Default$m = () => (h("sqm-email-verification", { demoData: {} }));
15180
15380
  const EmailIsPrefilled = () => (h("div", null,
15181
15381
  h("sqm-text", null,
15182
15382
  h("h4", null, "Verify your email")),
@@ -15184,19 +15384,19 @@ const EmailIsPrefilled = () => (h("div", null,
15184
15384
  h("sub", null, "To get your cash paid out directly to your bank account, please complete your account setup")),
15185
15385
  h("sqm-email-verification", { demoData: {
15186
15386
  states: {
15187
- ...defaultProps$k,
15387
+ ...defaultProps$m,
15188
15388
  email: "test@example.com",
15189
15389
  },
15190
15390
  } })));
15191
- const Loading$7 = () => (h("sqm-email-verification", { demoData: {
15391
+ const Loading$8 = () => (h("sqm-email-verification", { demoData: {
15192
15392
  states: {
15193
- ...defaultProps$k,
15393
+ ...defaultProps$m,
15194
15394
  initialLoading: true,
15195
15395
  },
15196
15396
  } }));
15197
15397
  const SaveLoading = () => (h("sqm-email-verification", { demoData: {
15198
15398
  states: {
15199
- ...defaultProps$k,
15399
+ ...defaultProps$m,
15200
15400
  loading: true,
15201
15401
  },
15202
15402
  } }));
@@ -15207,19 +15407,19 @@ const WithHeader$1 = () => (h("div", null,
15207
15407
  h("sub", null, "To get your cash paid out directly to your bank account, please complete your account setup")),
15208
15408
  h("sqm-email-verification", { demoData: {
15209
15409
  states: {
15210
- ...defaultProps$k,
15410
+ ...defaultProps$m,
15211
15411
  email: "test@example.com",
15212
15412
  },
15213
15413
  } })));
15214
15414
  const InvalidEmail = () => (h("sqm-email-verification", { demoData: {
15215
15415
  states: {
15216
- ...defaultProps$k,
15416
+ ...defaultProps$m,
15217
15417
  error: true,
15218
15418
  },
15219
15419
  } }));
15220
15420
  const SendCodeError = () => (h("sqm-email-verification", { demoData: {
15221
15421
  states: {
15222
- ...defaultProps$k,
15422
+ ...defaultProps$m,
15223
15423
  sendCodeError: true,
15224
15424
  },
15225
15425
  } }));
@@ -15227,9 +15427,9 @@ const SendCodeError = () => (h("sqm-email-verification", { demoData: {
15227
15427
  const WidgetEmailVerification = /*#__PURE__*/Object.freeze({
15228
15428
  __proto__: null,
15229
15429
  'default': WidgetEmailVerification_stories,
15230
- Default: Default$j,
15430
+ Default: Default$m,
15231
15431
  EmailIsPrefilled: EmailIsPrefilled,
15232
- Loading: Loading$7,
15432
+ Loading: Loading$8,
15233
15433
  SaveLoading: SaveLoading,
15234
15434
  WithHeader: WithHeader$1,
15235
15435
  InvalidEmail: InvalidEmail,
@@ -15239,35 +15439,35 @@ const WidgetEmailVerification = /*#__PURE__*/Object.freeze({
15239
15439
  const WidgetCodeVerification_stories = {
15240
15440
  title: "Components/Widget Code Verification",
15241
15441
  };
15242
- const defaultProps$l = {
15442
+ const defaultProps$n = {
15243
15443
  initialiseLoading: false,
15244
15444
  email: "testemail@example.com",
15245
15445
  loading: false,
15246
15446
  verifyFailed: false,
15247
15447
  emailResent: false,
15248
15448
  };
15249
- const Default$k = () => (h("sqm-code-verification", { demoData: { states: defaultProps$l } }));
15449
+ const Default$n = () => (h("sqm-code-verification", { demoData: { states: defaultProps$n } }));
15250
15450
  const InitialLoading = () => (h("sqm-code-verification", { demoData: {
15251
15451
  states: {
15252
- ...defaultProps$l,
15452
+ ...defaultProps$n,
15253
15453
  initialiseLoading: true,
15254
15454
  },
15255
15455
  } }));
15256
- const Loading$8 = () => (h("sqm-code-verification", { demoData: {
15456
+ const Loading$9 = () => (h("sqm-code-verification", { demoData: {
15257
15457
  states: {
15258
- ...defaultProps$l,
15458
+ ...defaultProps$n,
15259
15459
  loading: true,
15260
15460
  },
15261
15461
  } }));
15262
15462
  const CodeResent = () => (h("sqm-code-verification", { demoData: {
15263
15463
  states: {
15264
- ...defaultProps$l,
15464
+ ...defaultProps$n,
15265
15465
  emailResent: true,
15266
15466
  },
15267
15467
  } }));
15268
15468
  const VerificationFailed = () => (h("sqm-code-verification", { demoData: {
15269
15469
  states: {
15270
- ...defaultProps$l,
15470
+ ...defaultProps$n,
15271
15471
  verifyFailed: true,
15272
15472
  },
15273
15473
  } }));
@@ -15275,9 +15475,9 @@ const VerificationFailed = () => (h("sqm-code-verification", { demoData: {
15275
15475
  const WidgetCodeVerification = /*#__PURE__*/Object.freeze({
15276
15476
  __proto__: null,
15277
15477
  'default': WidgetCodeVerification_stories,
15278
- Default: Default$k,
15478
+ Default: Default$n,
15279
15479
  InitialLoading: InitialLoading,
15280
- Loading: Loading$8,
15480
+ Loading: Loading$9,
15281
15481
  CodeResent: CodeResent,
15282
15482
  VerificationFailed: VerificationFailed
15283
15483
  });
@@ -15285,17 +15485,17 @@ const WidgetCodeVerification = /*#__PURE__*/Object.freeze({
15285
15485
  const PayoutButtonScroll_stories = {
15286
15486
  title: "Components/Payout Scroll Button",
15287
15487
  };
15288
- const defaultProps$m = {
15488
+ const defaultProps$o = {
15289
15489
  payoutSettingsComplete: true,
15290
15490
  };
15291
- const CompletedTaxForm = () => (h("sqm-payout-button-scroll", { demoData: { states: { ...defaultProps$m, payoutSettingsComplete: true } } }));
15491
+ const CompletedTaxForm = () => (h("sqm-payout-button-scroll", { demoData: { states: { ...defaultProps$o, payoutSettingsComplete: true } } }));
15292
15492
  const CompletedTaxFormWithStatsContainer = () => (h("sqm-portal-container", { display: "flex", maxWidth: "100%", minWidth: "100%", "justify-content": "space-between", flexWrap: "nowrap" },
15293
15493
  h("sqm-portal-container", { display: "flex", "max-width": "fit-content" },
15294
15494
  h("sqm-big-stat", { "flex-reverse": "true", alignment: "left", "stat-type": "/referralsCount" },
15295
15495
  h("p", null, "Referrals")),
15296
15496
  h("sqm-big-stat", { "flex-reverse": "true", alignment: "left", "stat-type": "/payoutBalance" },
15297
15497
  h("p", null, "Cash Balance"))),
15298
- h("sqm-payout-button-scroll", { demoData: { states: { ...defaultProps$m, payoutSettingsComplete: true } } })));
15498
+ h("sqm-payout-button-scroll", { demoData: { states: { ...defaultProps$o, payoutSettingsComplete: true } } })));
15299
15499
 
15300
15500
  const PayoutButtonScroll = /*#__PURE__*/Object.freeze({
15301
15501
  __proto__: null,
@@ -15307,20 +15507,20 @@ const PayoutButtonScroll = /*#__PURE__*/Object.freeze({
15307
15507
  const PayoutStatusAlert_stories = {
15308
15508
  title: "Components/Payout Status Alert",
15309
15509
  };
15310
- const defaultProps$n = {
15510
+ const defaultProps$p = {
15311
15511
  error: false,
15312
15512
  status: "INFORMATION_REQUIRED",
15313
15513
  loading: false,
15314
15514
  veriffLoading: false,
15315
15515
  };
15316
- const InformationRequired = () => (h("sqm-payout-status-alert", { demoData: { states: defaultProps$n } }));
15317
- const VerifyIdentity = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$n, status: "VERIFICATION:REQUIRED" } } }));
15318
- const VerifyIdentityRequiredInternal = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$n, status: "VERIFICATION:INTERNAL" } } }));
15319
- const VerifyIdentityReviewInternal = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$n, status: "VERIFICATION:REVIEW" } } }));
15320
- const VerifyIdentityFailedInternal = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$n, status: "VERIFICATION:FAILED" } } }));
15321
- const Hold = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$n, status: "HOLD" } } }));
15322
- const Loading$9 = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$n, loading: true } } }));
15323
- const Error$a = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$n, error: true } } }));
15516
+ const InformationRequired = () => (h("sqm-payout-status-alert", { demoData: { states: defaultProps$p } }));
15517
+ const VerifyIdentity = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$p, status: "VERIFICATION:REQUIRED" } } }));
15518
+ const VerifyIdentityRequiredInternal = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$p, status: "VERIFICATION:INTERNAL" } } }));
15519
+ const VerifyIdentityReviewInternal = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$p, status: "VERIFICATION:REVIEW" } } }));
15520
+ const VerifyIdentityFailedInternal = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$p, status: "VERIFICATION:FAILED" } } }));
15521
+ const Hold = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$p, status: "HOLD" } } }));
15522
+ const Loading$a = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$p, loading: true } } }));
15523
+ const Error$b = () => (h("sqm-payout-status-alert", { demoData: { states: { ...defaultProps$p, error: true } } }));
15324
15524
 
15325
15525
  const PayoutStatusAlert = /*#__PURE__*/Object.freeze({
15326
15526
  __proto__: null,
@@ -15331,16 +15531,16 @@ const PayoutStatusAlert = /*#__PURE__*/Object.freeze({
15331
15531
  VerifyIdentityReviewInternal: VerifyIdentityReviewInternal,
15332
15532
  VerifyIdentityFailedInternal: VerifyIdentityFailedInternal,
15333
15533
  Hold: Hold,
15334
- Loading: Loading$9,
15335
- Error: Error$a
15534
+ Loading: Loading$a,
15535
+ Error: Error$b
15336
15536
  });
15337
15537
 
15338
- const scenario$E = "@author:sam\n@owner:sam\n\nFeature: Referral Codes Component\n\n A paginated display of available and used promo codes for the user to share with others\n\n @motivating\n Scenario: Promo code can be shared using various share mediums\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n Then the promo code can be copied directly\n And the promo code can be shared using <shareMedium>\n Examples:\n | shareMedium |\n | DIRECT |\n | EMAIL |\n | FBMESSENGER |\n | WHATSAPP |\n\n @minutia\n Scenario: Clicking any of the share mediums sets the code as copied\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n When clicking <shareMedium> button\n Then the code is marked as copied\n And the copied notification text is shown\n Examples:\n | shareMedium |\n | DIRECT |\n | EMAIL |\n | FBMESSENGER |\n | WHATSAPP |\n\n @minutia\n Scenario Outline: User is notified if the currently viewed promo code has been copied already\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n And the code has not been copied already\n Then no notification text is displayed\n When the code is changed to one that has been copied\n Then the <notificationText> is displayed\n Examples:\n | notificationText |\n | You've copied this code before |\n | Previously Copied |\n | foo |\n\n @minutia\n Scenario Outline: Share buttons slots use the link from referral codes instead of the default query\n Given an authenticated user\n And the program has promo codes configured\n And a <shareMedium> button is a child of `<sqm-referral-codes>`\n Then the <shareMedium> button is shown\n And the link uses <promoCode>\n Examples:\n | propName | shareMedium | promoCode |\n | hideSharelink | DIRECT | PROMOCODE1 |\n | hideEmail | EMAIL | PROMOCODE1 |\n | hideFbMessenger | FBMESSENGER | PROMOCODE1 |\n | hideWhatsApp | WHATSAPP | PROMOCODE1 |\n\n @minutia\n Scenario Outline: Number of codes is displayed in the pagination component\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n And the user has <numCodes> available\n And the user is on <currentPage>\n Then the pagination text is <paginationText>\n Examples:\n | numCodes | currentPage | paginationText |\n | 5 | 1 | 1 of 5 |\n | 5 | 2 | 2 of 5 |\n | 5 | 3 | 3 of 5 |\n | 5 | 4 | 4 of 5 |\n | 5 | 5 | 5 of 5 |\n | 1 | 1 | 1 of 1 |\n | 0 | 0 | 0 of 0 |\n\n @minutia\n Scenario: Loading state is shown when changing code page\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n And the user has more than 1 available\n When the next button is clicked\n Then a loading state is shown\n\n\n";
15538
+ const scenario$F = "@author:sam\n@owner:sam\n\nFeature: Referral Codes Component\n\n A paginated display of available and used promo codes for the user to share with others\n\n @motivating\n Scenario: Promo code can be shared using various share mediums\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n Then the promo code can be copied directly\n And the promo code can be shared using <shareMedium>\n Examples:\n | shareMedium |\n | DIRECT |\n | EMAIL |\n | FBMESSENGER |\n | WHATSAPP |\n\n @minutia\n Scenario: Clicking any of the share mediums sets the code as copied\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n When clicking <shareMedium> button\n Then the code is marked as copied\n And the copied notification text is shown\n Examples:\n | shareMedium |\n | DIRECT |\n | EMAIL |\n | FBMESSENGER |\n | WHATSAPP |\n\n @minutia\n Scenario Outline: User is notified if the currently viewed promo code has been copied already\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n And the code has not been copied already\n Then no notification text is displayed\n When the code is changed to one that has been copied\n Then the <notificationText> is displayed\n Examples:\n | notificationText |\n | You've copied this code before |\n | Previously Copied |\n | foo |\n\n @minutia\n Scenario Outline: Share buttons slots use the link from referral codes instead of the default query\n Given an authenticated user\n And the program has promo codes configured\n And a <shareMedium> button is a child of `<sqm-referral-codes>`\n Then the <shareMedium> button is shown\n And the link uses <promoCode>\n Examples:\n | propName | shareMedium | promoCode |\n | hideSharelink | DIRECT | PROMOCODE1 |\n | hideEmail | EMAIL | PROMOCODE1 |\n | hideFbMessenger | FBMESSENGER | PROMOCODE1 |\n | hideWhatsApp | WHATSAPP | PROMOCODE1 |\n\n @minutia\n Scenario Outline: Number of codes is displayed in the pagination component\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n And the user has <numCodes> available\n And the user is on <currentPage>\n Then the pagination text is <paginationText>\n Examples:\n | numCodes | currentPage | paginationText |\n | 5 | 1 | 1 of 5 |\n | 5 | 2 | 2 of 5 |\n | 5 | 3 | 3 of 5 |\n | 5 | 4 | 4 of 5 |\n | 5 | 5 | 5 of 5 |\n | 1 | 1 | 1 of 1 |\n | 0 | 0 | 0 of 0 |\n\n @minutia\n Scenario: Loading state is shown when changing code page\n Given an authenticated user\n And the program has promo codes configured\n When the promo code section is loaded\n And the user has more than 1 available\n When the next button is clicked\n Then a loading state is shown\n\n\n";
15339
15539
 
15340
15540
  const ReferralCodes_stories = {
15341
15541
  title: "Components/Referral Codes",
15342
15542
  parameters: {
15343
- scenario: scenario$E,
15543
+ scenario: scenario$F,
15344
15544
  },
15345
15545
  };
15346
15546
  const demoData = {
@@ -15394,7 +15594,7 @@ const EmptyWithCustomTextAndImage = () => {
15394
15594
  shareCodes("shareCodes"),
15395
15595
  shareButtons("shareButtons")));
15396
15596
  };
15397
- const Loading$a = () => {
15597
+ const Loading$b = () => {
15398
15598
  return (h("sqm-referral-codes", { demoData: { states: { ...demoData.states, loading: true } } },
15399
15599
  pagination("pagination"),
15400
15600
  shareCodes("shareCodes"),
@@ -15408,13 +15608,13 @@ const ReferralCodes$1 = /*#__PURE__*/Object.freeze({
15408
15608
  WithPreviouslyCopiedCode: WithPreviouslyCopiedCode,
15409
15609
  Empty: Empty$3,
15410
15610
  EmptyWithCustomTextAndImage: EmptyWithCustomTextAndImage,
15411
- Loading: Loading$a
15611
+ Loading: Loading$b
15412
15612
  });
15413
15613
 
15414
15614
  const BaseRegistrationForm_stories = {
15415
15615
  title: "Components/Microsite Base Registration",
15416
15616
  };
15417
- const defaultProps$o = {
15617
+ const defaultProps$q = {
15418
15618
  states: {
15419
15619
  error: "",
15420
15620
  },
@@ -15433,145 +15633,30 @@ const defaultProps$o = {
15433
15633
  " ")),
15434
15634
  },
15435
15635
  };
15436
- const errorProps$9 = {
15437
- ...defaultProps$o,
15636
+ const errorProps$a = {
15637
+ ...defaultProps$q,
15438
15638
  states: {
15439
15639
  error: "Something went wrong. Please try again.",
15440
15640
  },
15441
15641
  };
15442
- const Default$l = () => {
15443
- return h(BaseRegistrationFormView, Object.assign({}, defaultProps$o));
15642
+ const Default$o = () => {
15643
+ return h(BaseRegistrationFormView, Object.assign({}, defaultProps$q));
15444
15644
  };
15445
15645
  const EmailError = () => {
15446
- return h(BaseRegistrationFormView, Object.assign({}, errorProps$9));
15646
+ return h(BaseRegistrationFormView, Object.assign({}, errorProps$a));
15447
15647
  };
15448
15648
 
15449
15649
  const BaseRegistrationForm = /*#__PURE__*/Object.freeze({
15450
15650
  __proto__: null,
15451
15651
  'default': BaseRegistrationForm_stories,
15452
- Default: Default$l,
15652
+ Default: Default$o,
15453
15653
  EmailError: EmailError
15454
15654
  });
15455
15655
 
15456
- const PortalRegistrationForm_stories = {
15457
- title: "Components/Microsite Portal Register",
15458
- };
15459
- const defaultProps$p = {
15460
- states: {
15461
- error: "",
15462
- loading: false,
15463
- confirmPassword: true,
15464
- hideInputs: false,
15465
- loginPath: "/login",
15466
- },
15467
- callbacks: {
15468
- submit: () => console.log("Submit!"),
15469
- inputFunction: () => { },
15470
- },
15471
- refs: {
15472
- formRef: {},
15473
- },
15474
- content: { pageLabel: "Register", confirmPasswordLabel: "Confirm Password" },
15475
- };
15476
- const errorProps$a = {
15477
- states: {
15478
- error: "Something went wrong. Please try again.",
15479
- loading: false,
15480
- confirmPassword: true,
15481
- hideInputs: false,
15482
- loginPath: "/login",
15483
- },
15484
- callbacks: {
15485
- submit: () => console.log("Submit!"),
15486
- inputFunction: () => { },
15487
- },
15488
- refs: {
15489
- formRef: {},
15490
- },
15491
- content: {
15492
- pageLabel: "Register",
15493
- confirmPasswordLabel: "Confirm Password",
15494
- },
15495
- };
15496
- const loadingProps$7 = {
15497
- states: {
15498
- error: "",
15499
- loading: true,
15500
- confirmPassword: true,
15501
- hideInputs: false,
15502
- loginPath: "/login",
15503
- },
15504
- callbacks: {
15505
- submit: () => console.log("Submit!"),
15506
- inputFunction: () => { },
15507
- },
15508
- refs: {
15509
- formRef: {},
15510
- },
15511
- content: { pageLabel: "Register", confirmPasswordLabel: "Confirm Password" },
15512
- };
15513
- const slottedProps$1 = {
15514
- states: {
15515
- error: "",
15516
- loading: false,
15517
- confirmPassword: true,
15518
- hideInputs: false,
15519
- loginPath: "/login",
15520
- },
15521
- callbacks: {
15522
- submit: () => console.log("Submit!"),
15523
- inputFunction: () => { },
15524
- },
15525
- refs: {
15526
- formRef: {},
15527
- },
15528
- content: {
15529
- pageLabel: "Register",
15530
- confirmPasswordLabel: "Confirm Password",
15531
- formData: (h("div", null,
15532
- h("sl-input", { style: { marginBottom: "var(--sl-spacing-x-large)" }, exportparts: "label: input-label, base: input-base", label: "Slotted Input", required: true }),
15533
- h("sl-input", { exportparts: "label: input-label, base: input-base", label: "Slotted Input 2", required: true }))),
15534
- },
15535
- };
15536
- const Default$m = () => h(PortalRegistrationFormView, Object.assign({}, defaultProps$p));
15537
- const RegisterWithError$1 = () => (h(PortalRegistrationFormView, Object.assign({}, errorProps$a)));
15538
- const RegisterLoading$1 = () => (h(PortalRegistrationFormView, Object.assign({}, loadingProps$7)));
15539
- const FieldsHidden$1 = () => {
15540
- return (h("sqm-portal-register", { demoData: {
15541
- states: {
15542
- error: "",
15543
- loading: true,
15544
- registrationFormState: {},
15545
- confirmPassword: true,
15546
- hideInputs: true,
15547
- loginPath: "/login",
15548
- },
15549
- } }));
15550
- };
15551
- const SlottedInputs$1 = () => (h(PortalRegistrationFormView, Object.assign({}, slottedProps$1)));
15552
- const TermsAndConditions$3 = () => (h(PortalRegistrationFormView, Object.assign({}, defaultProps$p, { content: {
15553
- ...defaultProps$p.content,
15554
- terms: (h("p", null,
15555
- "By signing up you agree to the",
15556
- " ",
15557
- h("a", { href: "https://example.com", target: "_blank" }, "Terms and Conditions"))),
15558
- } })));
15559
-
15560
- const PortalRegistrationForm = /*#__PURE__*/Object.freeze({
15561
- __proto__: null,
15562
- 'default': PortalRegistrationForm_stories,
15563
- Default: Default$m,
15564
- RegisterWithError: RegisterWithError$1,
15565
- RegisterLoading: RegisterLoading$1,
15566
- FieldsHidden: FieldsHidden$1,
15567
- SlottedInputs: SlottedInputs$1,
15568
- TermsAndConditions: TermsAndConditions$3
15569
- });
15570
-
15571
15656
  const PortalGoogleRegistrationForm_stories = {
15572
15657
  title: "Components/Microsite Google Register",
15573
15658
  };
15574
- const defaultProps$q = {
15659
+ const defaultProps$r = {
15575
15660
  states: {
15576
15661
  error: "",
15577
15662
  loading: false,
@@ -15616,7 +15701,7 @@ const defaultProps$q = {
15616
15701
  },
15617
15702
  };
15618
15703
  const errorProps$b = {
15619
- ...defaultProps$q,
15704
+ ...defaultProps$r,
15620
15705
  states: {
15621
15706
  error: "Something went wrong. Please try again.",
15622
15707
  loading: false,
@@ -15632,7 +15717,7 @@ const errorProps$b = {
15632
15717
  },
15633
15718
  };
15634
15719
  const loadingProps$8 = {
15635
- ...defaultProps$q,
15720
+ ...defaultProps$r,
15636
15721
  states: {
15637
15722
  error: "",
15638
15723
  loading: true,
@@ -15647,11 +15732,11 @@ const loadingProps$8 = {
15647
15732
  },
15648
15733
  },
15649
15734
  };
15650
- const Default$n = () => (h(PortalRegistrationFormView, Object.assign({}, defaultProps$q)));
15735
+ const Default$p = () => (h(PortalRegistrationFormView, Object.assign({}, defaultProps$r)));
15651
15736
  const RegisterWithError$2 = () => (h(PortalRegistrationFormView, Object.assign({}, errorProps$b)));
15652
15737
  const RegisterLoading$2 = () => (h(PortalRegistrationFormView, Object.assign({}, loadingProps$8)));
15653
- const TermsAndConditions$4 = () => (h(PortalRegistrationFormView, Object.assign({}, defaultProps$q, { content: {
15654
- ...defaultProps$q.content,
15738
+ const TermsAndConditions$4 = () => (h(PortalRegistrationFormView, Object.assign({}, defaultProps$r, { content: {
15739
+ ...defaultProps$r.content,
15655
15740
  terms: (h("p", null,
15656
15741
  "By signing up you agree to the",
15657
15742
  " ",
@@ -15661,7 +15746,7 @@ const TermsAndConditions$4 = () => (h(PortalRegistrationFormView, Object.assign(
15661
15746
  const PortalGoogleRegistrationFormStories = /*#__PURE__*/Object.freeze({
15662
15747
  __proto__: null,
15663
15748
  'default': PortalGoogleRegistrationForm_stories,
15664
- Default: Default$n,
15749
+ Default: Default$p,
15665
15750
  RegisterWithError: RegisterWithError$2,
15666
15751
  RegisterLoading: RegisterLoading$2,
15667
15752
  TermsAndConditions: TermsAndConditions$4
@@ -15679,7 +15764,7 @@ const PortalGoogleRegistrationFormStories = /*#__PURE__*/Object.freeze({
15679
15764
  *
15680
15765
  */
15681
15766
  //
15682
- const Default$o = `
15767
+ const Default$q = `
15683
15768
  // No CSS
15684
15769
  `;
15685
15770
  const Orangey = `
@@ -15713,7 +15798,7 @@ const Klip = `
15713
15798
 
15714
15799
  const Themes = /*#__PURE__*/Object.freeze({
15715
15800
  __proto__: null,
15716
- Default: Default$o,
15801
+ Default: Default$q,
15717
15802
  Orangey: Orangey,
15718
15803
  Netflix: Netflix,
15719
15804
  SaaSquatchCorporate: SaaSquatchCorporate,
@@ -18358,6 +18443,7 @@ const stories = [
18358
18443
  ReferralIframe$1,
18359
18444
  NameFields$1,
18360
18445
  CheckboxField,
18446
+ MarketingEmailsCheckbox,
18361
18447
  DropdownField,
18362
18448
  InputField,
18363
18449
  RewardExchangeList,
@@ -18393,6 +18479,8 @@ const stories = [
18393
18479
  TaxFormSlots,
18394
18480
  PayoutDetailsCard,
18395
18481
  BankingInfoForm,
18482
+ PortalRegistrationForm,
18483
+ ChangeMarketing,
18396
18484
  BaseRegistrationForm,
18397
18485
  PortalRegistrationForm,
18398
18486
  PortalGoogleRegistrationFormStories,