summit-registration-lite 7.0.3 → 7.0.5

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 (28) hide show
  1. package/.claude/rules/summit-registration-lite-component-props.md +95 -0
  2. package/.claude/rules/summit-registration-lite-i18n.md +62 -0
  3. package/.claude/rules/summit-registration-lite-payment-providers.md +69 -0
  4. package/.claude/rules/summit-registration-lite-project.md +80 -0
  5. package/.claude/rules/summit-registration-lite-redux-actions.md +65 -0
  6. package/.claude/rules/summit-registration-lite-step-flow.md +77 -0
  7. package/.claude/rules/summit-registration-lite-testing.md +97 -0
  8. package/.claude/rules/summit-registration-lite-utils.md +71 -0
  9. package/.claude/skills/summit-registration-lite-add-provider/SKILL.md +155 -0
  10. package/.claude/skills/summit-registration-lite-dev-setup/SKILL.md +67 -0
  11. package/.claude/skills/summit-registration-lite-publish/SKILL.md +64 -0
  12. package/.claude/skills/summit-registration-lite-scaffold-component/SKILL.md +152 -0
  13. package/.codegraph/config.json +141 -0
  14. package/.codegraph/daemon.pid +6 -0
  15. package/dist/components/index.css +1 -2
  16. package/dist/components/index.js +78 -113
  17. package/dist/components/index.js.map +1 -1
  18. package/dist/components/registration-form.css +1 -2
  19. package/dist/components/registration-form.js +71 -105
  20. package/dist/components/registration-form.js.map +1 -1
  21. package/dist/components/registration-modal.css +1 -2
  22. package/dist/components/registration-modal.js +77 -112
  23. package/dist/components/registration-modal.js.map +1 -1
  24. package/dist/index.css +1 -2
  25. package/dist/index.js +77 -112
  26. package/dist/index.js.map +1 -1
  27. package/e2e/promo-code-discovery.spec.js +4 -2
  28. package/package.json +5 -3
@@ -7,12 +7,11 @@
7
7
  .title___DNZyl{font-weight:bold;display:flex;justify-content:space-between}.summary___quWdZ{text-align:right}.promoCode___bqTCw{display:inline-flex}.promoCode___bqTCw abbr{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:10ch}.crossOut___QZ7dy{text-decoration:line-through}.discount___sEK_Q{color:red}.taxes___fe8oJ{display:inline-flex}.taxes___fe8oJ abbr{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:15ch}.promo___F8lPO{font-weight:bold;display:flex;justify-content:flex-end}.form___aoo7w{display:flex;gap:10px;margin-top:10px}.dropdown____HWg0{flex:1 1 auto;min-width:0}.quantity___SIEQZ{flex-shrink:0}.quantity___SIEQZ input,.quantity___SIEQZ button{height:36px;text-align:center;border:1px solid var(--color_input_border_color)}.quantity___SIEQZ input{padding:0 8px;width:48px !important}.quantity___SIEQZ input,.quantity___SIEQZ input:read-only{border:1px solid var(--color_input_border_color);color:var(--color_input_text_color);background-color:var(--color_input_background_color)}.quantity___SIEQZ button{display:flex;align-items:center}.quantity___SIEQZ button:disabled,.quantity___SIEQZ button:disabled:hover{opacity:.65;background:#dedede;border-color:#bebebe}.soldOut___Hatfr{height:36px;padding:0 16px;line-height:34px;font-weight:700px;background:#dedede;border:solid 1px #bebebe;border-radius:5px;opacity:.65;font-weight:700;flex-shrink:0}.moreInfo___LmwOe{display:inline-block;margin-top:4px;font-size:12px}.moreInfoTooltip___nOBf1{max-width:280px}.inPersonDisclaimer___PXGTz{margin-top:15px;padding-right:10px;max-height:150px;overflow-y:auto}
8
8
  .placeholder___pcdCn{border-radius:5px;width:100%;border:1px solid var(--color_input_border_color);background-color:var(--color_input_background_color);padding:5px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;height:36px}.placeholder___pcdCn i{padding:2px 5px;border-left:1px solid var(--color_primary)}.placeholder___pcdCn .selectedTicket___qkbpH{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inPersonDisclaimer___z_DzO{padding:4px}.dropdown___mfbPG{margin-top:10px;border-radius:5px;width:100%;border:1px solid var(--color_input_border_color);color:var(--color_input_text_color);background-color:var(--color_input_background_color);cursor:pointer}.dropdown___mfbPG div{padding:5px}.dropdown___mfbPG div:hover{border-radius:5px;background-color:var(--color_primary50);color:var(--color_input_text_color)}.soldOut___rBLC0,.soldOut___rBLC0:hover,.soldOut___rBLC0:focus{color:inherit !important;background-color:#dedede !important;opacity:.65;cursor:not-allowed}
9
9
  .promoCodeWrapper___aw3Zx{padding-top:16px;display:flex;flex-direction:column;gap:8px}.promoCodeWrapper___aw3Zx span{color:var(--color_text_dark);font-size:14px;font-weight:600;line-height:140%}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET{display:flex;align-items:center;position:relative;height:36px;max-width:400px}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET input{display:inline-flex;padding:13px 8px;width:70%;height:100%;color:var(--color_input_text_color);background-color:var(--color_input_background_color);border:1px solid var(--color_input_border_color);border-right:none;border-radius:5px 0px 0px 5px}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET input.promoCodeActive___j7xnn{padding-right:25px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:var(--color_gray_dark, #333) !important;background-color:var(--color_gray_lighter, #f5f5f5) !important}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET .codeButtonWrapper___jVZh5{display:flex;align-items:center;width:30%;height:100%;background-color:#818181;border-radius:0px 5px 5px 0px}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET .codeButtonWrapper___jVZh5.noCode___YUmVy{background-color:#cfcfcf;cursor:not-allowed}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET .codeButtonWrapper___jVZh5 button{color:#fff;font-size:14px;font-style:normal;font-weight:600;line-height:120%;letter-spacing:-0.14px;width:100%;height:100%;border:none;background-color:rgba(0,0,0,0)}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET .statusIcon___l1uV0{position:absolute;right:32%;font-size:16px;font-weight:bold;line-height:1}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET .valid___pDUq_{color:#92cd76}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET .invalid___UO9dX{color:#d32f2f}.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET .spinner___SKEJg{width:16px;height:16px;border:2px solid var(--color_gray_light);border-top-color:var(--color_primary);border-radius:50%;animation:spin___wP5uK .6s linear infinite;font-size:0}@keyframes spin___wP5uK{to{transform:rotate(360deg)}}.promoCodeWrapper___aw3Zx .moreInfo___Ru3Rv{display:inline-block;margin-top:-4px;font-size:12px}@media screen and (max-width: 540px){.promoCodeWrapper___aw3Zx .promoCodeInput___rDiET{max-width:100%}.promoCodeWrapper___aw3Zx .moreInfo___Ru3Rv{display:none}}.moreInfoTooltip___eaYWm{max-width:280px}
10
- .notice____Pa2z{margin-top:10px;padding:10px 12px;border-radius:4px;font-size:13px}.notice____Pa2z>div+div{margin-top:1px}.error___WzZms{background-color:#fff0f0;border:1px solid #ffcdd2;color:#d32f2f}.info___WFfzs{background-color:#f0f7ff;border:1px solid #b8daff;color:inherit}.icon___YWZms{margin-right:6px}
10
+ .notice____Pa2z{display:flex;align-items:flex-start;gap:6px;margin-top:10px;padding:10px 12px;border-radius:4px;font-size:13px}.content___sR1Ps{flex:1}.content___sR1Ps>div+div{margin-top:1px}.error___WzZms{background-color:#fff0f0;border:1px solid #ffcdd2;color:#d32f2f}.info___WFfzs{background-color:#f0f7ff;border:1px solid #b8daff;color:inherit}.icon___YWZms{flex-shrink:0;line-height:1.4}
11
11
  .button___MZBIY[disabled]{background-color:var(--color_secondary_contrast) !important}.button___MZBIY{font-weight:bold !important;font-size:1em !important;cursor:pointer !important;border:1px solid var(--color_input_border_color) !important;color:var(--color_input_text_color) !important;background-color:var(--color_input_background_color) !important}.button___MZBIY:hover{color:var(--color_input_text_color) !important}.button___MZBIY:active,.button___MZBIY:focus{color:var(--color_input_text_color) !important}.outerWrapper___XRnaq{padding:10px 0px 10px 10px;margin:10px}.outerWrapper___XRnaq .innerWrapper___LFsOH{display:flex;justify-content:space-between;align-items:center}.outerWrapper___XRnaq .innerWrapper___LFsOH span{font-size:14px}.outerWrapper___XRnaq .innerWrapper___LFsOH .registration___jdf6T{cursor:pointer;color:var(--color_primary);text-decoration:underline}.outerWrapper___XRnaq .innerWrapper___LFsOH .actions___Gsf0y{display:flex}.outerWrapper___XRnaq .innerWrapper___LFsOH .actions___Gsf0y button{margin-left:10px}
12
12
  .button___XMN8a[disabled]{background-color:var(--color_secondary_contrast) !important}.button___XMN8a{font-weight:bold !important;font-size:1em !important;cursor:pointer !important;border:1px solid var(--color_input_border_color) !important;color:var(--color_input_text_color) !important;background-color:var(--color_input_background_color) !important}.button___XMN8a:hover{color:var(--color_input_text_color) !important}.button___XMN8a:active,.button___XMN8a:focus{color:var(--color_input_text_color) !important}.wrapper___Jd5Xg{height:370px;display:flex;flex-direction:column;align-items:center;justify-content:space-around;margin:15px 0;padding:15px;border-radius:5px;border:1px solid var(--color_input_border_color);text-align:center}.wrapper___Jd5Xg .circle___lcN86{margin-bottom:10px;background-color:var(--color_input_background_color);border-radius:50px;border:1px solid var(--color_text_dark);padding:10px}.wrapper___Jd5Xg .circle___lcN86 i{font-size:36px;color:var(--color_text_dark)}.wrapper___Jd5Xg .complete___HAHzl{font-weight:bold;font-size:20px}.wrapper___Jd5Xg .actions___jJdPX{display:flex}.wrapper___Jd5Xg button{margin:10px 5px 0 5px;background-color:var(--color_button_background_color) !important;color:var(--color_button_color) !important}.wrapper___Jd5Xg span{font-size:14px}.wrapper___Jd5Xg a{color:var(--color_text_dark);text-decoration:underline}.wrapper___Jd5Xg .footer___FL9TW{font-size:14px;font-weight:normal}
13
13
  .passwordlessWrapper___BRQ_s{height:450px;display:flex;justify-content:center;align-items:center;flex-direction:column}.passwordlessWrapper___BRQ_s .codeSent___NzYb_{margin-top:10px;color:#e5424d;font-weight:bold;font-size:14px}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi{text-align:center;font-weight:bold;height:100%;width:300px;display:flex;flex-direction:column;justify-content:center}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .logo___qNVrv{width:175px;align-self:center}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .logo___qNVrv.logoDark___VVYee{display:none}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .digits___Vu5iy{margin-top:15px;display:inline-block}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .codeInput___LnTZe{margin-top:20px;display:flex;justify-content:center}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .codeInput___LnTZe input{font-family:"Monaco",monospace,"OpenSans",Helvetica;height:56px;width:56px;font-size:42px;color:var(--color_input_text_color);background-color:var(--color_input_background_color);border:1px solid var(--color_input_border_color);border-radius:5px;padding:5px;display:inline-flex;text-transform:uppercase;text-align:center;margin:0 5px}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .error___wZflZ{margin-top:10px;color:#e5424d;font-size:14px}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .verify___IBgMl{margin-top:10px}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .verify___IBgMl .button___nBhtQ{padding:10px 30px;font-weight:normal;justify-content:center;margin:5px 0;border-radius:5px;cursor:pointer;color:var(--color_input_text_color);background-color:var(--color_input_background_color);border:1px solid var(--color_input_border_color);width:100%;font-size:1em}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .verify___IBgMl .link___f6fDT{color:var(--color_text_dark);text-decoration:underline;cursor:pointer}.passwordlessWrapper___BRQ_s .resend___Nma1U{margin:auto 0 0 0;font-weight:normal;font-size:14px}.passwordlessWrapper___BRQ_s .resend___Nma1U button{color:var(--color_text_dark);text-decoration:underline;cursor:pointer;display:inline;border:none;background-color:rgba(0,0,0,0);padding:0}.passwordlessWrapper___BRQ_s .resend___Nma1U .disabled___fMnzY{color:var(--color_text_med);cursor:not-allowed}html[data-theme=DARK] .logoLight___vSbn_{display:none}html[data-theme=DARK] .logoDark___VVYee{display:block !important}html[data-theme=LIGHT] .logoDark___VVYee{display:none}html[data-theme=LIGHT] .logoLight___vSbn_{display:block !important}
14
14
  .ticketOwnedWrapper___nhkDY{margin:10px}.ticketOwnedWrapper___nhkDY span{display:block}.alert___c49oP{margin:0 !important}
15
- .noAllowedWrapper___k52of{margin:10px}.alert___McKm0{margin:0 !important}
16
15
  .ticketTaxesErrorWrapper___ldztd{margin:10px;min-height:150px;display:flex;flex-direction:column}.ticketTaxesErrorWrapper___ldztd button{width:100px;align-self:center;margin:10px 5px 0 5px}.alert___AM17V{margin:0 !important;text-align:center;padding:30px}
17
16
 
18
17
  /*# sourceMappingURL=registration-form.css.map*/
@@ -40,7 +40,6 @@ __webpack_require__.d(__webpack_exports__, {
40
40
  "Nh": () => (/* binding */ SET_PASSWORDLESS_SETTINGS),
41
41
  "Vx": () => (/* binding */ START_WIDGET_LOADING),
42
42
  "sC": () => (/* binding */ STOP_WIDGET_LOADING),
43
- "VH": () => (/* binding */ UPDATE_CLOCK),
44
43
  "j6": () => (/* binding */ VALIDATE_PROMO_CODE),
45
44
  "o5": () => (/* binding */ VALIDATE_PROMO_CODE_ERROR),
46
45
  "Tk": () => (/* binding */ VALIDATE_PROMO_CODE_RATE_LIMITED),
@@ -63,7 +62,6 @@ __webpack_require__.d(__webpack_exports__, {
63
62
  "cL": () => (/* binding */ reserveTicket),
64
63
  "Bq": () => (/* binding */ startWidgetLoading),
65
64
  "Rs": () => (/* binding */ stopWidgetLoading),
66
- "ry": () => (/* binding */ updateClock),
67
65
  "jn": () => (/* binding */ validatePromoCode)
68
66
  });
69
67
 
@@ -398,7 +396,6 @@ const GO_TO_LOGIN = 'GO_TO_LOGIN';
398
396
  const GET_MY_INVITATION = 'GET_MY_INVITATION';
399
397
  const CLEAR_MY_INVITATION = 'CLEAR_MY_INVITATION';
400
398
  const CLEAR_WIDGET_STATE = 'CLEAR_WIDGET_STATE';
401
- const UPDATE_CLOCK = 'UPDATE_CLOCK';
402
399
  const LOAD_PROFILE_DATA = 'LOAD_PROFILE_DATA';
403
400
  const SET_CURRENT_PROMO_CODE = 'SET_CURRENT_PROMO_CODE';
404
401
  const CLEAR_CURRENT_PROMO_CODE = 'CLEAR_CURRENT_PROMO_CODE';
@@ -899,11 +896,6 @@ const getMyInvitation = summitId => async (dispatch, getState, {
899
896
  return Promise.reject(e);
900
897
  }
901
898
  };
902
- const updateClock = timestamp => dispatch => {
903
- dispatch((0,actions_namespaceObject.createAction)(UPDATE_CLOCK)({
904
- timestamp
905
- }));
906
- };
907
899
 
908
900
  /***/ }),
909
901
 
@@ -1703,14 +1695,14 @@ const avoidTooltipOverflow = ({
1703
1695
 
1704
1696
  /***/ }),
1705
1697
 
1706
- /***/ 974:
1698
+ /***/ 336:
1707
1699
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1708
1700
 
1709
1701
  "use strict";
1710
1702
 
1711
1703
  // EXPORTS
1712
1704
  __webpack_require__.d(__webpack_exports__, {
1713
- "y": () => (/* binding */ withReduxProvider)
1705
+ "F": () => (/* binding */ withWidgetProviders)
1714
1706
  });
1715
1707
 
1716
1708
  // UNUSED EXPORTS: default
@@ -1722,6 +1714,8 @@ var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_)
1722
1714
  var external_react_redux_ = __webpack_require__(22);
1723
1715
  ;// CONCATENATED MODULE: external "redux-persist/integration/react"
1724
1716
  const react_namespaceObject = require("redux-persist/integration/react");
1717
+ // EXTERNAL MODULE: external "openstack-uicore-foundation/lib/components/clock-context"
1718
+ var clock_context_ = __webpack_require__(959);
1725
1719
  ;// CONCATENATED MODULE: external "redux"
1726
1720
  const external_redux_namespaceObject = require("redux");
1727
1721
  ;// CONCATENATED MODULE: external "redux-thunk"
@@ -1736,9 +1730,6 @@ var storage_default = /*#__PURE__*/__webpack_require__.n(storage_namespaceObject
1736
1730
  var actions = __webpack_require__(595);
1737
1731
  ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/security/actions"
1738
1732
  const actions_namespaceObject = require("openstack-uicore-foundation/lib/security/actions");
1739
- ;// CONCATENATED MODULE: external "moment"
1740
- const external_moment_namespaceObject = require("moment");
1741
- var external_moment_default = /*#__PURE__*/__webpack_require__.n(external_moment_namespaceObject);
1742
1733
  // EXTERNAL MODULE: ./src/utils/constants.js
1743
1734
  var constants = __webpack_require__(243);
1744
1735
  ;// CONCATENATED MODULE: ./src/reducer.js
@@ -1763,8 +1754,6 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
1763
1754
 
1764
1755
 
1765
1756
 
1766
-
1767
- const localNowUtc = external_moment_default()().unix();
1768
1757
  const DEFAULT_STATE = {
1769
1758
  reservation: null,
1770
1759
  checkout: null,
@@ -1788,7 +1777,6 @@ const DEFAULT_STATE = {
1788
1777
  summitId: null,
1789
1778
  userProfile: null
1790
1779
  },
1791
- nowUtc: localNowUtc,
1792
1780
  promoCode: '',
1793
1781
  promoCodeVerified: null,
1794
1782
  promoCodeValidating: false,
@@ -1988,16 +1976,6 @@ const RegistrationLiteReducer = (state = DEFAULT_STATE, action) => {
1988
1976
  });
1989
1977
  }
1990
1978
 
1991
- case actions/* UPDATE_CLOCK */.VH:
1992
- {
1993
- const {
1994
- timestamp
1995
- } = payload;
1996
- return _objectSpread(_objectSpread({}, state), {}, {
1997
- nowUtc: timestamp
1998
- });
1999
- }
2000
-
2001
1979
  case actions/* CLEAR_CURRENT_PROMO_CODE */.ZD:
2002
1980
  {
2003
1981
  return _objectSpread(_objectSpread({}, state), {}, {
@@ -2117,7 +2095,7 @@ const getPersistor = () => {
2117
2095
  persistor = (0,external_redux_persist_namespaceObject.persistStore)(store, null, onRehydrateComplete);
2118
2096
  return persistor;
2119
2097
  };
2120
- ;// CONCATENATED MODULE: ./src/utils/withReduxProvider.js
2098
+ ;// CONCATENATED MODULE: ./src/utils/withWidgetProviders.js
2121
2099
  /**
2122
2100
  * Copyright 2026 OpenStack Foundation
2123
2101
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -2130,36 +2108,42 @@ const getPersistor = () => {
2130
2108
  * See the License for the specific language governing permissions and
2131
2109
  * limitations under the License.
2132
2110
  *
2133
- * HOC to wrap a component with Redux Provider and PersistGate.
2111
+ * HOC to wrap a widget root with Redux, PersistGate, and ClockProvider.
2134
2112
  **/
2135
2113
 
2136
2114
 
2137
2115
 
2138
2116
 
2139
- const withReduxProvider = WrappedComponent => {
2140
- class WithReduxProvider extends (external_react_default()).PureComponent {
2117
+
2118
+ const withWidgetProviders = WrappedComponent => {
2119
+ class WithWidgetProviders extends (external_react_default()).PureComponent {
2141
2120
  constructor(props) {
2142
2121
  super(props);
2143
2122
  this.store = getStore(props.clientId, props.apiBaseUrl, props.getAccessToken);
2144
2123
  }
2145
2124
 
2146
2125
  render() {
2126
+ const {
2127
+ summitData
2128
+ } = this.props;
2147
2129
  return /*#__PURE__*/external_react_default().createElement(external_react_redux_.Provider, {
2148
2130
  store: this.store
2149
2131
  }, /*#__PURE__*/external_react_default().createElement(react_namespaceObject.PersistGate, {
2150
2132
  persistor: getPersistor()
2151
- }, /*#__PURE__*/external_react_default().createElement(WrappedComponent, this.props)));
2133
+ }, /*#__PURE__*/external_react_default().createElement(clock_context_.ClockProvider, {
2134
+ timezone: summitData?.time_zone_id || 'UTC',
2135
+ now: Math.floor(Date.now() / 1000)
2136
+ }, /*#__PURE__*/external_react_default().createElement(WrappedComponent, this.props))));
2152
2137
  }
2153
2138
 
2154
- } // Copy propTypes and defaultProps from wrapped component
2155
-
2139
+ }
2156
2140
 
2157
- WithReduxProvider.propTypes = WrappedComponent.propTypes;
2158
- WithReduxProvider.defaultProps = WrappedComponent.defaultProps;
2159
- WithReduxProvider.displayName = `WithReduxProvider(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`;
2160
- return WithReduxProvider;
2141
+ WithWidgetProviders.propTypes = WrappedComponent.propTypes;
2142
+ WithWidgetProviders.defaultProps = WrappedComponent.defaultProps;
2143
+ WithWidgetProviders.displayName = `WithWidgetProviders(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`;
2144
+ return WithWidgetProviders;
2161
2145
  };
2162
- /* harmony default export */ const utils_withReduxProvider = ((/* unused pure expression or super */ null && (withReduxProvider)));
2146
+ /* harmony default export */ const utils_withWidgetProviders = ((/* unused pure expression or super */ null && (withWidgetProviders)));
2163
2147
 
2164
2148
  /***/ }),
2165
2149
 
@@ -2206,6 +2190,14 @@ webpackContext.id = 267;
2206
2190
 
2207
2191
  /***/ }),
2208
2192
 
2193
+ /***/ 959:
2194
+ /***/ ((module) => {
2195
+
2196
+ "use strict";
2197
+ module.exports = require("openstack-uicore-foundation/lib/components/clock-context");
2198
+
2199
+ /***/ }),
2200
+
2209
2201
  /***/ 580:
2210
2202
  /***/ ((module) => {
2211
2203
 
@@ -2335,8 +2327,10 @@ var external_react_redux_ = __webpack_require__(22);
2335
2327
  // EXTERNAL MODULE: external "prop-types"
2336
2328
  var external_prop_types_ = __webpack_require__(580);
2337
2329
  var external_prop_types_default = /*#__PURE__*/__webpack_require__.n(external_prop_types_);
2338
- // EXTERNAL MODULE: ./src/utils/withReduxProvider.js + 9 modules
2339
- var withReduxProvider = __webpack_require__(974);
2330
+ // EXTERNAL MODULE: ./src/utils/withWidgetProviders.js + 8 modules
2331
+ var withWidgetProviders = __webpack_require__(336);
2332
+ // EXTERNAL MODULE: external "openstack-uicore-foundation/lib/components/clock-context"
2333
+ var clock_context_ = __webpack_require__(959);
2340
2334
  ;// CONCATENATED MODULE: external "react-spring"
2341
2335
  const external_react_spring_namespaceObject = require("react-spring");
2342
2336
  ;// CONCATENATED MODULE: external "react-use"
@@ -2598,9 +2592,6 @@ const usePromoCode = ({
2598
2592
  ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/components/ajaxloader"
2599
2593
  const ajaxloader_namespaceObject = require("openstack-uicore-foundation/lib/components/ajaxloader");
2600
2594
  var ajaxloader_default = /*#__PURE__*/__webpack_require__.n(ajaxloader_namespaceObject);
2601
- ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/components/clock"
2602
- const clock_namespaceObject = require("openstack-uicore-foundation/lib/components/clock");
2603
- var clock_default = /*#__PURE__*/__webpack_require__.n(clock_namespaceObject);
2604
2595
  // EXTERNAL MODULE: ./src/components/login/index.js + 2 modules
2605
2596
  var login = __webpack_require__(462);
2606
2597
  ;// CONCATENATED MODULE: ./src/components/payment/index.module.scss
@@ -3972,17 +3963,19 @@ const PromoCodeInput = ({
3972
3963
  /* harmony default export */ const promocode_input = (PromoCodeInput);
3973
3964
  ;// CONCATENATED MODULE: ./src/components/ticket-notice/index.module.scss
3974
3965
  // extracted by mini-css-extract-plugin
3975
- /* harmony default export */ const ticket_notice_index_module = ({"notice":"notice____Pa2z","error":"error___WzZms","info":"info___WFfzs","icon":"icon___YWZms"});
3966
+ /* harmony default export */ const ticket_notice_index_module = ({"notice":"notice____Pa2z","content":"content___sR1Ps","error":"error___WzZms","info":"info___WFfzs","icon":"icon___YWZms"});
3976
3967
  ;// CONCATENATED MODULE: ./src/components/ticket-notice/index.js
3977
3968
 
3978
3969
  // `message` is either a single string or an array of strings. Arrays render
3979
3970
  // stacked consecutively inside the same notice box. Returns null when the
3980
3971
  // message is empty/unset so callers can pass conditional arrays without an
3981
- // outer guard.
3972
+ // outer guard. Pass `html` when the message is admin-authored HTML (e.g.
3973
+ // marketing settings) that needs link rendering.
3982
3974
 
3983
3975
  const TicketNotice = ({
3984
3976
  message,
3985
- variant = 'info'
3977
+ variant = 'info',
3978
+ html = false
3986
3979
  }) => {
3987
3980
  const items = Array.isArray(message) ? message : message ? [message] : [];
3988
3981
  if (items.length === 0) return null;
@@ -3990,9 +3983,16 @@ const TicketNotice = ({
3990
3983
  className: `${ticket_notice_index_module.notice} ${ticket_notice_index_module[variant]}`
3991
3984
  }, variant === 'error' && /*#__PURE__*/external_react_default().createElement("span", {
3992
3985
  className: ticket_notice_index_module.icon
3993
- }, "\u26A0"), items.map((m, i) => /*#__PURE__*/external_react_default().createElement("div", {
3986
+ }, "\u26A0"), /*#__PURE__*/external_react_default().createElement("div", {
3987
+ className: ticket_notice_index_module.content
3988
+ }, items.map((m, i) => html ? /*#__PURE__*/external_react_default().createElement("div", {
3989
+ key: i,
3990
+ dangerouslySetInnerHTML: {
3991
+ __html: m
3992
+ }
3993
+ }) : /*#__PURE__*/external_react_default().createElement("div", {
3994
3994
  key: i
3995
- }, m)));
3995
+ }, m))));
3996
3996
  };
3997
3997
 
3998
3998
  /* harmony default export */ const ticket_notice = (TicketNotice);
@@ -4047,7 +4047,7 @@ const TicketTypeComponent = ({
4047
4047
  promoCode,
4048
4048
  promoCodeAllowsReassign = true,
4049
4049
  trackViewItem,
4050
- noTicketsAvailableMessage
4050
+ noAllowedTicketsMessage
4051
4051
  }) => {
4052
4052
  const {
4053
4053
  state: promoState = {},
@@ -4267,8 +4267,9 @@ const TicketTypeComponent = ({
4267
4267
  }, /*#__PURE__*/external_react_default().createElement("i", {
4268
4268
  className: "fa fa-plus"
4269
4269
  }))))))), !showTicketSelector && /*#__PURE__*/external_react_default().createElement(ticket_notice, {
4270
- message: noTicketsAvailableMessage || external_i18n_react_default().translate("ticket_type.no_tickets_available"),
4271
- variant: "info"
4270
+ message: noAllowedTicketsMessage || external_i18n_react_default().translate("ticket_type.no_tickets_available"),
4271
+ variant: "info",
4272
+ html: !!noAllowedTicketsMessage
4272
4273
  }), /*#__PURE__*/external_react_default().createElement((external_react_tooltip_default()), {
4273
4274
  id: "ticket-quantity-info",
4274
4275
  place: "bottom",
@@ -4383,7 +4384,7 @@ const external_react_content_loader_namespaceObject = require("react-content-loa
4383
4384
  var external_react_content_loader_default = /*#__PURE__*/__webpack_require__.n(external_react_content_loader_namespaceObject);
4384
4385
  ;// CONCATENATED MODULE: ./src/components/purchase-complete/index.js
4385
4386
  const _excluded = ["cta", "clear", "close"],
4386
- _excluded2 = ["checkout", "user", "onPurchaseComplete", "goToExtraQuestions", "goToEvent", "goToMyOrders", "completedExtraQuestions", "summit", "nowUtc", "clearWidgetState", "closeWidget", "supportEmail", "hasVirtualAccessLevel"];
4387
+ _excluded2 = ["checkout", "user", "onPurchaseComplete", "goToExtraQuestions", "goToEvent", "goToMyOrders", "completedExtraQuestions", "summit", "clearWidgetState", "closeWidget", "supportEmail", "hasVirtualAccessLevel"];
4387
4388
 
4388
4389
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
4389
4390
 
@@ -4410,6 +4411,7 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
4410
4411
 
4411
4412
 
4412
4413
 
4414
+
4413
4415
  const CTAButton = _ref => {
4414
4416
  let {
4415
4417
  cta,
@@ -4438,7 +4440,6 @@ const PurchaseComplete = _ref2 => {
4438
4440
  goToMyOrders,
4439
4441
  completedExtraQuestions,
4440
4442
  summit,
4441
- nowUtc,
4442
4443
  clearWidgetState,
4443
4444
  closeWidget,
4444
4445
  supportEmail,
@@ -4451,8 +4452,10 @@ const PurchaseComplete = _ref2 => {
4451
4452
  }, []);
4452
4453
  const [requireExtraQuestions, setRequireExtraQuestions] = (0,external_react_.useState)(null);
4453
4454
  const [extraQuestionsLoaded, setExtraQuestonsLoaded] = (0,external_react_.useState)(false);
4454
- const isMultiOrder = (0,external_react_.useMemo)(() => checkout?.tickets.length > 1, [checkout]);
4455
- const isActive = (0,external_react_.useMemo)(() => summit.start_date <= nowUtc && summit.end_date >= nowUtc, [summit, nowUtc]);
4455
+ const isMultiOrder = (0,external_react_.useMemo)(() => checkout?.tickets.length > 1, [checkout]); // Re-runs every clock tick but the boolean only changes on summit
4456
+ // active/inactive transitions (typically zero times per session).
4457
+
4458
+ const isActive = (0,clock_context_.useClockSelector)((0,external_react_.useCallback)(nowUtc => summit.start_date <= nowUtc && summit.end_date >= nowUtc, [summit.start_date, summit.end_date]));
4456
4459
  const currentTicket = (0,external_react_.useMemo)(() => isMultiOrder ? checkout?.tickets.find(t => t?.owner?.email === user?.email) : checkout?.tickets.find(t => t?.owner), [user]);
4457
4460
  (0,external_react_.useEffect)(() => {
4458
4461
  completedExtraQuestions(currentTicket?.owner || null).then(res => {
@@ -4601,40 +4604,6 @@ const TicketOwnedComponent = ({
4601
4604
  };
4602
4605
 
4603
4606
  /* harmony default export */ const ticket_owned = (TicketOwnedComponent);
4604
- ;// CONCATENATED MODULE: ./src/components/no-allowed-tickets/index.module.scss
4605
- // extracted by mini-css-extract-plugin
4606
- /* harmony default export */ const no_allowed_tickets_index_module = ({"noAllowedWrapper":"noAllowedWrapper___k52of","alert":"alert___McKm0"});
4607
- ;// CONCATENATED MODULE: ./src/components/no-allowed-tickets/index.js
4608
- /**
4609
- * Copyright 2020 OpenStack Foundation
4610
- * Licensed under the Apache License, Version 2.0 (the "License");
4611
- * you may not use this file except in compliance with the License.
4612
- * You may obtain a copy of the License at
4613
- * http://www.apache.org/licenses/LICENSE-2.0
4614
- * Unless required by applicable law or agreed to in writing, software
4615
- * distributed under the License is distributed on an "AS IS" BASIS,
4616
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4617
- * See the License for the specific language governing permissions and
4618
- * limitations under the License.
4619
- **/
4620
-
4621
-
4622
-
4623
- const NoAllowedTickets = ({
4624
- noAllowedTicketsMessage
4625
- }) => {
4626
- return /*#__PURE__*/React.createElement("div", {
4627
- className: styles.noAllowedWrapper
4628
- }, /*#__PURE__*/React.createElement("div", {
4629
- className: `${styles.alert} alert alert-warning`,
4630
- role: "alert",
4631
- dangerouslySetInnerHTML: {
4632
- __html: noAllowedTicketsMessage
4633
- }
4634
- }));
4635
- };
4636
-
4637
- /* harmony default export */ const no_allowed_tickets = ((/* unused pure expression or super */ null && (NoAllowedTickets)));
4638
4607
  ;// CONCATENATED MODULE: ./src/components/ticket-taxes-error/index.module.scss
4639
4608
  // extracted by mini-css-extract-plugin
4640
4609
  /* harmony default export */ const ticket_taxes_error_index_module = ({"ticketTaxesErrorWrapper":"ticketTaxesErrorWrapper___ldztd","alert":"alert___AM17V"});
@@ -4674,7 +4643,7 @@ const TicketTaxesError = ({
4674
4643
 
4675
4644
  /* harmony default export */ const ticket_taxes_error = (TicketTaxesError);
4676
4645
  ;// CONCATENATED MODULE: ./src/components/registration-form/index.js
4677
- const registration_form_excluded = ["loadSession", "setMarketingSettings", "changeStep", "removeReservedTicket", "reserveTicket", "payTicketWithProvider", "trackEvent", "onPurchaseComplete", "getTicketTypesAndTaxes", "getLoginCode", "passwordlessLogin", "goToLogin", "loginOptions", "allowsNativeAuth", "allowsOtpAuth", "reservation", "checkout", "ticketTypes", "taxTypes", "step", "passwordlessCodeSent", "passwordlessEmail", "passwordlessCode", "passwordlessCodeLifeTime", "getPasswordlessCode", "passwordlessCodeError", "loginWithCode", "goToExtraQuestions", "goToMyOrders", "goToEvent", "profileData", "summitData", "supportEmail", "ticketOwned", "ownedTickets", "widgetLoading", "loading", "inPersonDisclaimer", "userProfile", "handleCompanyError", "providerOptions", "invitation", "loginInitialEmailInputValue", "getMyInvitation", "showMultipleTicketTexts", "noAllowedTicketsMessage", "noTicketsAvailableMessage", "ticketTaxesErrorMessage", "authErrorCallback", "clearWidgetState", "allowPromoCodes", "showCompanyInput", "companyDDLPlaceholder", "nowUtc", "updateClock", "completedExtraQuestions", "loadProfileData", "closeWidget", "hasVirtualAccessLevel", "hidePostalCode", "onError", "successfulPaymentReturnUrl", "idpLogoLight", "idpLogoDark", "idpLogoAlt", "showCompanyInputDefaultOptions", "companyDDLOptions2Show", "promoCode", "promoCodeVerified", "promoCodeValidating", "promoCodeAllowsReassign", "discoveredPromoCodes", "hasDiscount", "getTicketDiscount", "removePromoCode", "applyPromoCode", "validatePromoCode", "discoverPromoCodes", "startWidgetLoading", "stopWidgetLoading", "closeHandlerRef"];
4646
+ const registration_form_excluded = ["loadSession", "setMarketingSettings", "changeStep", "removeReservedTicket", "reserveTicket", "payTicketWithProvider", "trackEvent", "onPurchaseComplete", "getTicketTypesAndTaxes", "getLoginCode", "passwordlessLogin", "goToLogin", "loginOptions", "allowsNativeAuth", "allowsOtpAuth", "reservation", "checkout", "ticketTypes", "taxTypes", "step", "passwordlessCodeSent", "passwordlessEmail", "passwordlessCode", "passwordlessCodeLifeTime", "getPasswordlessCode", "passwordlessCodeError", "loginWithCode", "goToExtraQuestions", "goToMyOrders", "goToEvent", "profileData", "summitData", "supportEmail", "ticketOwned", "ownedTickets", "widgetLoading", "loading", "inPersonDisclaimer", "userProfile", "handleCompanyError", "providerOptions", "invitation", "loginInitialEmailInputValue", "getMyInvitation", "showMultipleTicketTexts", "noAllowedTicketsMessage", "ticketTaxesErrorMessage", "authErrorCallback", "clearWidgetState", "allowPromoCodes", "showCompanyInput", "companyDDLPlaceholder", "completedExtraQuestions", "loadProfileData", "closeWidget", "hasVirtualAccessLevel", "hidePostalCode", "onError", "successfulPaymentReturnUrl", "idpLogoLight", "idpLogoDark", "idpLogoAlt", "showCompanyInputDefaultOptions", "companyDDLOptions2Show", "promoCode", "promoCodeVerified", "promoCodeValidating", "promoCodeAllowsReassign", "discoveredPromoCodes", "hasDiscount", "getTicketDiscount", "removePromoCode", "applyPromoCode", "validatePromoCode", "discoverPromoCodes", "startWidgetLoading", "stopWidgetLoading", "closeHandlerRef"];
4678
4647
 
4679
4648
  function registration_form_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4680
4649
 
@@ -4723,7 +4692,6 @@ function registration_form_objectWithoutPropertiesLoose(source, excluded) { if (
4723
4692
 
4724
4693
 
4725
4694
 
4726
-
4727
4695
 
4728
4696
 
4729
4697
  let language = (0,utils/* getCurrentUserLanguage */.AS)();
@@ -4739,6 +4707,11 @@ try {
4739
4707
  external_i18n_react_default().setTexts(__webpack_require__(443));
4740
4708
  }
4741
4709
 
4710
+ const isTicketCurrentlyAvailable = (tt, nowUtc) => // prepaid tickets are always available (sales windows don't apply)
4711
+ tt.sub_type === constants.TICKET_TYPE_SUBTYPE_PREPAID || // no sales window configured → ticket is open-ended, always available
4712
+ tt.sales_start_date === null && tt.sales_end_date === null || // ticket is within its configured sales window
4713
+ nowUtc >= tt.sales_start_date && nowUtc <= tt.sales_end_date;
4714
+
4742
4715
  const RegistrationFormContent = _ref => {
4743
4716
  let {
4744
4717
  loadSession,
@@ -4787,15 +4760,12 @@ const RegistrationFormContent = _ref => {
4787
4760
  getMyInvitation,
4788
4761
  showMultipleTicketTexts,
4789
4762
  noAllowedTicketsMessage,
4790
- noTicketsAvailableMessage,
4791
4763
  ticketTaxesErrorMessage,
4792
4764
  authErrorCallback,
4793
4765
  clearWidgetState,
4794
4766
  allowPromoCodes,
4795
4767
  showCompanyInput,
4796
4768
  companyDDLPlaceholder,
4797
- nowUtc,
4798
- updateClock,
4799
4769
  completedExtraQuestions,
4800
4770
  loadProfileData,
4801
4771
  closeWidget,
@@ -4854,9 +4824,11 @@ const RegistrationFormContent = _ref => {
4854
4824
  const {
4855
4825
  publicKey,
4856
4826
  provider
4857
- } = (0,utils/* getCurrentProvider */.U5)(summitData);
4858
- const allowedTicketTypes = (0,external_react_.useMemo)(() => hasTicketData ? ticketTypes.filter(tt => tt.sub_type === constants.TICKET_TYPE_SUBTYPE_PREPAID || tt.sales_start_date === null && tt.sales_end_date === null || nowUtc >= tt.sales_start_date && nowUtc <= tt.sales_end_date) : [], [hasTicketData, ticketTypes, nowUtc]);
4859
- const noAvailableTickets = (0,external_react_.useMemo)(() => isAuthenticated && hasTicketData && !ticketDataError && allowedTicketTypes.length === 0 && step !== constants.STEP_COMPLETE, [isAuthenticated, hasTicketData, ticketDataError, allowedTicketTypes, step]);
4827
+ } = (0,utils/* getCurrentProvider */.U5)(summitData); // Re-runs every clock tick but only commits a new array when the filtered
4828
+ // contents shift (a sale window opens/closes), so the form tree stops
4829
+ // re-rendering once per second.
4830
+
4831
+ const allowedTicketTypes = (0,clock_context_.useClockSelector)((0,external_react_.useCallback)(nowUtc => hasTicketData ? ticketTypes.filter(tt => isTicketCurrentlyAvailable(tt, nowUtc)) : [], [hasTicketData, ticketTypes]), external_react_redux_.shallowEqual);
4860
4832
  const alreadyOwnedTickets = (0,external_react_.useMemo)(() => isAuthenticated && hasTicketData && !ticketDataError && allowedTicketTypes.length > 0 && ownedTickets.length > 0, [isAuthenticated, hasTicketData, ticketDataError, allowedTicketTypes, ownedTickets]);
4861
4833
  (0,external_react_.useEffect)(() => {
4862
4834
  if (profileData) loadProfileData(profileData);
@@ -5035,9 +5007,6 @@ const RegistrationFormContent = _ref => {
5035
5007
  color: '#ffffff',
5036
5008
  show: widgetLoading || loading,
5037
5009
  size: 80
5038
- }), /*#__PURE__*/external_react_default().createElement((clock_default()), {
5039
- onTick: timestamp => updateClock(timestamp),
5040
- timezone: summitData.time_zone_id
5041
5010
  }), profileData && ticketDataError && /*#__PURE__*/external_react_default().createElement(ticket_taxes_error, {
5042
5011
  ticketTaxesErrorMessage: ticketTaxesErrorMessage,
5043
5012
  retryTicketTaxes: () => handleGetTicketTypesAndTaxes(summitData?.id)
@@ -5080,7 +5049,7 @@ const RegistrationFormContent = _ref => {
5080
5049
  changeForm: mergeFormValues,
5081
5050
  trackViewItem: trackViewItem,
5082
5051
  showMultipleTicketTexts: showMultipleTicketTexts,
5083
- noTicketsAvailableMessage: noTicketsAvailableMessage
5052
+ noAllowedTicketsMessage: noAllowedTicketsMessage
5084
5053
  }), /*#__PURE__*/external_react_default().createElement(personal_information, {
5085
5054
  isActive: step === constants.STEP_PERSONAL_INFO,
5086
5055
  reservation: reservation,
@@ -5153,7 +5122,6 @@ const RegistrationFormContent = _ref => {
5153
5122
  goToMyOrders: goToMyOrders,
5154
5123
  goToExtraQuestions: goToExtraQuestions,
5155
5124
  completedExtraQuestions: completedExtraQuestions,
5156
- nowUtc: nowUtc,
5157
5125
  clearWidgetState: clearWidgetState,
5158
5126
  closeWidget: closeWidget,
5159
5127
  hasVirtualAccessLevel: hasVirtualAccessLevel,
@@ -5184,7 +5152,6 @@ const mapStateToProps = ({
5184
5152
  passwordlessCodeLifeTime: registrationLiteState.passwordless.otp_lifetime,
5185
5153
  passwordlessCodeSent: registrationLiteState.passwordless.code_sent,
5186
5154
  passwordlessCodeError: registrationLiteState.passwordless.error,
5187
- nowUtc: registrationLiteState.nowUtc,
5188
5155
  promoCode: registrationLiteState.promoCode,
5189
5156
  promoCodeVerified: registrationLiteState.promoCodeVerified,
5190
5157
  promoCodeValidating: registrationLiteState.promoCodeValidating,
@@ -5204,7 +5171,6 @@ const RegistrationForm = (0,external_react_redux_.connect)(mapStateToProps, {
5204
5171
  goToLogin: actions/* goToLogin */.hh,
5205
5172
  getMyInvitation: actions/* getMyInvitation */.q1,
5206
5173
  clearWidgetState: actions/* clearWidgetState */.YS,
5207
- updateClock: actions/* updateClock */.ry,
5208
5174
  loadProfileData: actions/* loadProfileData */.Bi,
5209
5175
  applyPromoCode: actions/* applyPromoCode */.gs,
5210
5176
  removePromoCode: actions/* removePromoCode */.$r,
@@ -5264,7 +5230,7 @@ RegistrationForm.propTypes = {
5264
5230
  companyDDLOptions2Show: (external_prop_types_default()).number
5265
5231
  };
5266
5232
 
5267
- /* harmony default export */ const registration_form = ((0,withReduxProvider/* withReduxProvider */.y)(RegistrationForm));
5233
+ /* harmony default export */ const registration_form = ((0,withWidgetProviders/* withWidgetProviders */.F)(RegistrationForm));
5268
5234
  })();
5269
5235
 
5270
5236
  /******/ return __webpack_exports__;