From 18b32cc8a3c94dd0d1ae5c84ce1e35b5687864dd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Sep 2025 23:13:49 +0000 Subject: [PATCH 1/3] Initial plan From ad9d6a90d2d2a92c9eb6ec04d686d427d07d3be8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Sep 2025 23:28:15 +0000 Subject: [PATCH 2/3] Add unified dev server with Cloudflare Tunnels integration Co-authored-by: bookernath <8922457+bookernath@users.noreply.github.com> --- README.md | 70 ++++++- dist/checkout-6837841f.css | 2 +- package.json | 3 + scripts/README.md | 66 +++++++ scripts/dev-server.js | 352 +++++++++++++++++++++++++++++++++ scripts/install-cloudflared.js | 93 +++++++++ scripts/test-dev-server.js | 96 +++++++++ 7 files changed, 679 insertions(+), 3 deletions(-) create mode 100644 scripts/README.md create mode 100755 scripts/dev-server.js create mode 100755 scripts/install-cloudflared.js create mode 100755 scripts/test-dev-server.js diff --git a/README.md b/README.md index 3e30e73cde..fbd6155157 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,60 @@ After that, you can make changes to the source code and run the following comman npm run build ``` -If you are developing the application locally and want to build the source code in watch mode, you can run the following command: +### Development Server + +For local development, you have several options: + +#### Full Development Server (Recommended) +Run everything with a single command that combines webpack build watching and HTTP server: + +```sh +npm run dev:full +``` + +This will: +- Start webpack in watch mode for automatic rebuilds +- Start an HTTP server on http://localhost:8080 with CORS enabled +- Display the auto-loader URL for Custom Checkout integration + +#### Development Server with HTTPS Tunnel +For testing with live HTTPS websites, you can enable Cloudflare Tunnels: ```sh +npm run dev:tunnel +``` + +This provides: +- All features of `dev:full` +- An HTTPS tunnel URL (e.g., `https://abc123.trycloudflare.com`) +- Automatic tunnel URL display for easy Custom Checkout integration + +#### Manual Development (Legacy) +If you prefer the traditional two-step approach: + +```sh +# Terminal 1: Start webpack in watch mode npm run dev + +# Terminal 2: Start the HTTP server +npm run dev:server +``` + +#### Environment Variables +You can customize the development server behavior using environment variables: + +```sh +# Enable tunnel mode +DEV_SERVER_TUNNEL=true npm run dev:full + +# Change port +DEV_SERVER_PORT=3000 npm run dev:full + +# Enable verbose logging +DEV_SERVER_VERBOSE=true npm run dev:full + +# Custom cloudflared path +CLOUDFLARED_PATH=/usr/local/bin/cloudflared npm run dev:tunnel ``` If you want to create a prerelease (i.e.: `alpha`) for testing in the integration environment, you can run the following command: @@ -61,13 +111,29 @@ npm run regenerate-har Follow [this guide](https://developer.bigcommerce.com/stencil-docs/customizing-checkout/installing-custom-checkouts) for instructions on how to fork and install this app as a Custom Checkout in your store. -If you want to test your checkout implementation, you can run: +### For Development Testing + +#### Using the Enhanced Development Server (Recommended) +```sh +# Local development with HTTP +npm run dev:full +# Then use: http://localhost:8080/auto-loader-dev.js + +# For HTTPS testing with live stores +npm run dev:tunnel +# The tunnel URL will be displayed (e.g., https://abc123.trycloudflare.com/auto-loader-dev.js) +``` + +#### Using the Legacy Method +If you want to test your checkout implementation manually, you can run: ```sh npm run dev:server ``` And enter the local URL for `auto-loader-dev.js` in Checkout Settings, e.g `http://127.0.0.1:8080/auto-loader-dev.js` +**Note:** The HTTPS tunnel option is particularly useful when testing with live BigCommerce stores that require HTTPS connections. + ## Release Everytime a PR is merged to the master branch, CircleCI will trigger a build automatically. However, it won't create a new Git release until it is approved by a person with write access to the repository. If you have write access, you can approve a release job by going to [CircleCI](https://circleci.com/gh/bigcommerce/workflows/checkout-js/tree/master) and look for the job you wish to approve. You can also navigate directly to the release job by clicking on the yellow dot next to the merged commit. diff --git a/dist/checkout-6837841f.css b/dist/checkout-6837841f.css index 8890ee0ad4..b628c615f0 100644 --- a/dist/checkout-6837841f.css +++ b/dist/checkout-6837841f.css @@ -1,4 +1,4 @@ -.react-datepicker__navigation-icon::before,.react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view--down-arrow{border-color:#ccc;border-style:solid;border-width:3px 3px 0 0;content:"";display:block;height:9px;position:absolute;top:6px;width:9px}.react-datepicker-wrapper{display:inline-block;padding:0;border:0}.react-datepicker{font-family:"Helvetica Neue",helvetica,arial,sans-serif;font-size:.8rem;background-color:#fff;color:#000;border:1px solid #aeaeae;border-radius:.3rem;display:inline-block;position:relative;line-height:initial}.react-datepicker--time-only .react-datepicker__time-container{border-left:0}.react-datepicker--time-only .react-datepicker__time,.react-datepicker--time-only .react-datepicker__time-box{border-bottom-left-radius:.3rem;border-bottom-right-radius:.3rem}.react-datepicker-popper{z-index:1;line-height:0}.react-datepicker-popper .react-datepicker__triangle{stroke:#aeaeae}.react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle{fill:#f0f0f0;color:#f0f0f0}.react-datepicker-popper[data-placement^=top] .react-datepicker__triangle{fill:#fff;color:#fff}.react-datepicker__header{text-align:center;background-color:#f0f0f0;border-bottom:1px solid #aeaeae;border-top-left-radius:.3rem;padding:8px 0;position:relative}.react-datepicker__header--time{padding-bottom:8px;padding-left:5px;padding-right:5px}.react-datepicker__header--time:not(.react-datepicker__header--time--only){border-top-left-radius:0}.react-datepicker__header:not(.react-datepicker__header--has-time-select){border-top-right-radius:.3rem}.react-datepicker__year-dropdown-container--select,.react-datepicker__month-dropdown-container--select,.react-datepicker__month-year-dropdown-container--select,.react-datepicker__year-dropdown-container--scroll,.react-datepicker__month-dropdown-container--scroll,.react-datepicker__month-year-dropdown-container--scroll{display:inline-block;margin:0 15px}.react-datepicker__current-month,.react-datepicker-time__header,.react-datepicker-year-header{margin-top:0;color:#000;font-weight:bold;font-size:.944rem}h2.react-datepicker__current-month{padding:0;margin:0}.react-datepicker-time__header{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.react-datepicker__navigation{align-items:center;background:none;display:flex;justify-content:center;text-align:center;cursor:pointer;position:absolute;top:2px;padding:0;border:none;z-index:1;height:32px;width:32px;text-indent:-999em;overflow:hidden}.react-datepicker__navigation--previous{left:2px}.react-datepicker__navigation--next{right:2px}.react-datepicker__navigation--next--with-time:not(.react-datepicker__navigation--next--with-today-button){right:85px}.react-datepicker__navigation--years{position:relative;top:0;display:block;margin-left:auto;margin-right:auto}.react-datepicker__navigation--years-previous{top:4px}.react-datepicker__navigation--years-upcoming{top:-4px}.react-datepicker__navigation:hover *::before{border-color:rgb(165.75, 165.75, 165.75)}.react-datepicker__navigation-icon{position:relative;top:-1px;font-size:20px;width:0}.react-datepicker__navigation-icon--next{left:-2px}.react-datepicker__navigation-icon--next::before{transform:rotate(45deg);left:-7px}.react-datepicker__navigation-icon--previous{right:-2px}.react-datepicker__navigation-icon--previous::before{transform:rotate(225deg);right:-7px}.react-datepicker__month-container{float:left}.react-datepicker__year{margin:.4rem;text-align:center}.react-datepicker__year-wrapper{display:flex;flex-wrap:wrap;max-width:180px}.react-datepicker__year .react-datepicker__year-text{display:inline-block;width:4rem;margin:2px}.react-datepicker__month{margin:.4rem;text-align:center}.react-datepicker__month .react-datepicker__month-text,.react-datepicker__month .react-datepicker__quarter-text{display:inline-block;width:4rem;margin:2px}.react-datepicker__input-time-container{clear:both;width:100%;float:left;margin:5px 0 10px 15px;text-align:left}.react-datepicker__input-time-container .react-datepicker-time__caption{display:inline-block}.react-datepicker__input-time-container .react-datepicker-time__input-container{display:inline-block}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input{display:inline-block;margin-left:10px}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input{width:auto}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-inner-spin-button,.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]{-moz-appearance:textfield}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__delimiter{margin-left:5px;display:inline-block}.react-datepicker__time-container{float:right;border-left:1px solid #aeaeae;width:85px}.react-datepicker__time-container--with-today-button{display:inline;border:1px solid #aeaeae;border-radius:.3rem;position:absolute;right:-87px;top:0}.react-datepicker__time-container .react-datepicker__time{position:relative;background:white;border-bottom-right-radius:.3rem}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box{width:85px;overflow-x:hidden;margin:0 auto;text-align:center;border-bottom-right-radius:.3rem}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list{list-style:none;margin:0;height:calc(195px + .85rem);overflow-y:scroll;padding-right:0;padding-left:0;width:100%;box-sizing:content-box}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item{height:30px;padding:5px 10px;white-space:nowrap}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item:hover{cursor:pointer;background-color:#f0f0f0}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected{background-color:#216ba5;color:white;font-weight:bold}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected:hover{background-color:#216ba5}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled{color:#ccc}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled:hover{cursor:default;background-color:transparent}.react-datepicker__week-number{color:#ccc;display:inline-block;width:1.7rem;line-height:1.7rem;text-align:center;margin:.166rem}.react-datepicker__week-number.react-datepicker__week-number--clickable{cursor:pointer}.react-datepicker__week-number.react-datepicker__week-number--clickable:not(.react-datepicker__week-number--selected):hover{border-radius:.3rem;background-color:#f0f0f0}.react-datepicker__week-number--selected{border-radius:.3rem;background-color:#216ba5;color:#fff}.react-datepicker__week-number--selected:hover{background-color:rgb(28.75, 93.2196969697, 143.75)}.react-datepicker__day-names{white-space:nowrap;margin-bottom:-8px}.react-datepicker__week{white-space:nowrap}.react-datepicker__day-name,.react-datepicker__day,.react-datepicker__time-name{color:#000;display:inline-block;width:1.7rem;line-height:1.7rem;text-align:center;margin:.166rem}.react-datepicker__day,.react-datepicker__month-text,.react-datepicker__quarter-text,.react-datepicker__year-text{cursor:pointer}.react-datepicker__day:not([aria-disabled=true]):hover,.react-datepicker__month-text:not([aria-disabled=true]):hover,.react-datepicker__quarter-text:not([aria-disabled=true]):hover,.react-datepicker__year-text:not([aria-disabled=true]):hover{border-radius:.3rem;background-color:#f0f0f0}.react-datepicker__day--today,.react-datepicker__month-text--today,.react-datepicker__quarter-text--today,.react-datepicker__year-text--today{font-weight:bold}.react-datepicker__day--highlighted,.react-datepicker__month-text--highlighted,.react-datepicker__quarter-text--highlighted,.react-datepicker__year-text--highlighted{border-radius:.3rem;background-color:#3dcc4a;color:#fff}.react-datepicker__day--highlighted:not([aria-disabled=true]):hover,.react-datepicker__month-text--highlighted:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--highlighted:not([aria-disabled=true]):hover,.react-datepicker__year-text--highlighted:not([aria-disabled=true]):hover{background-color:rgb(49.8551020408, 189.6448979592, 62.5632653061)}.react-datepicker__day--highlighted-custom-1,.react-datepicker__month-text--highlighted-custom-1,.react-datepicker__quarter-text--highlighted-custom-1,.react-datepicker__year-text--highlighted-custom-1{color:magenta}.react-datepicker__day--highlighted-custom-2,.react-datepicker__month-text--highlighted-custom-2,.react-datepicker__quarter-text--highlighted-custom-2,.react-datepicker__year-text--highlighted-custom-2{color:green}.react-datepicker__day--holidays,.react-datepicker__month-text--holidays,.react-datepicker__quarter-text--holidays,.react-datepicker__year-text--holidays{position:relative;border-radius:.3rem;background-color:#ff6803;color:#fff}.react-datepicker__day--holidays .overlay,.react-datepicker__month-text--holidays .overlay,.react-datepicker__quarter-text--holidays .overlay,.react-datepicker__year-text--holidays .overlay{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background-color:#333;color:#fff;padding:4px;border-radius:4px;white-space:nowrap;visibility:hidden;opacity:0;transition:visibility 0s,opacity .3s ease-in-out}.react-datepicker__day--holidays:not([aria-disabled=true]):hover,.react-datepicker__month-text--holidays:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--holidays:not([aria-disabled=true]):hover,.react-datepicker__year-text--holidays:not([aria-disabled=true]):hover{background-color:rgb(207, 82.9642857143, 0)}.react-datepicker__day--holidays:hover .overlay,.react-datepicker__month-text--holidays:hover .overlay,.react-datepicker__quarter-text--holidays:hover .overlay,.react-datepicker__year-text--holidays:hover .overlay{visibility:visible;opacity:1}.react-datepicker__day--selected,.react-datepicker__day--in-selecting-range,.react-datepicker__day--in-range,.react-datepicker__month-text--selected,.react-datepicker__month-text--in-selecting-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--selected,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--selected,.react-datepicker__year-text--in-selecting-range,.react-datepicker__year-text--in-range{border-radius:.3rem;background-color:#216ba5;color:#fff}.react-datepicker__day--selected:not([aria-disabled=true]):hover,.react-datepicker__day--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__day--in-range:not([aria-disabled=true]):hover,.react-datepicker__month-text--selected:not([aria-disabled=true]):hover,.react-datepicker__month-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__month-text--in-range:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--selected:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--in-range:not([aria-disabled=true]):hover,.react-datepicker__year-text--selected:not([aria-disabled=true]):hover,.react-datepicker__year-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__year-text--in-range:not([aria-disabled=true]):hover{background-color:rgb(28.75, 93.2196969697, 143.75)}.react-datepicker__day--keyboard-selected,.react-datepicker__month-text--keyboard-selected,.react-datepicker__quarter-text--keyboard-selected,.react-datepicker__year-text--keyboard-selected{border-radius:.3rem;background-color:rgb(186.25, 217.0833333333, 241.25);color:rgb(0, 0, 0)}.react-datepicker__day--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__month-text--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__year-text--keyboard-selected:not([aria-disabled=true]):hover{background-color:rgb(28.75, 93.2196969697, 143.75)}.react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__month-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__quarter-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__year-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range){background-color:rgba(33, 107, 165, 0.5)}.react-datepicker__month--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range){background-color:#f0f0f0;color:#000}.react-datepicker__day--disabled,.react-datepicker__month-text--disabled,.react-datepicker__quarter-text--disabled,.react-datepicker__year-text--disabled{cursor:default;color:#ccc}.react-datepicker__day--disabled .overlay,.react-datepicker__month-text--disabled .overlay,.react-datepicker__quarter-text--disabled .overlay,.react-datepicker__year-text--disabled .overlay{position:absolute;bottom:70%;left:50%;transform:translateX(-50%);background-color:#333;color:#fff;padding:4px;border-radius:4px;white-space:nowrap;visibility:hidden;opacity:0;transition:visibility 0s,opacity .3s ease-in-out}.react-datepicker__input-container{position:relative;display:inline-block;width:100%}.react-datepicker__input-container .react-datepicker__calendar-icon{position:absolute;padding:.5rem;box-sizing:content-box}.react-datepicker__view-calendar-icon input{padding:6px 10px 5px 25px}.react-datepicker__year-read-view,.react-datepicker__month-read-view,.react-datepicker__month-year-read-view{border:1px solid transparent;border-radius:.3rem;position:relative}.react-datepicker__year-read-view:hover,.react-datepicker__month-read-view:hover,.react-datepicker__month-year-read-view:hover{cursor:pointer}.react-datepicker__year-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__year-read-view:hover .react-datepicker__month-read-view--down-arrow,.react-datepicker__month-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view:hover .react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__month-year-read-view:hover .react-datepicker__month-read-view--down-arrow{border-top-color:rgb(178.5, 178.5, 178.5)}.react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view--down-arrow{transform:rotate(135deg);right:-16px;top:0}.react-datepicker__year-dropdown,.react-datepicker__month-dropdown,.react-datepicker__month-year-dropdown{background-color:#f0f0f0;position:absolute;width:50%;left:25%;top:30px;z-index:1;text-align:center;border-radius:.3rem;border:1px solid #aeaeae}.react-datepicker__year-dropdown:hover,.react-datepicker__month-dropdown:hover,.react-datepicker__month-year-dropdown:hover{cursor:pointer}.react-datepicker__year-dropdown--scrollable,.react-datepicker__month-dropdown--scrollable,.react-datepicker__month-year-dropdown--scrollable{height:150px;overflow-y:scroll}.react-datepicker__year-option,.react-datepicker__month-option,.react-datepicker__month-year-option{line-height:20px;width:100%;display:block;margin-left:auto;margin-right:auto}.react-datepicker__year-option:first-of-type,.react-datepicker__month-option:first-of-type,.react-datepicker__month-year-option:first-of-type{border-top-left-radius:.3rem;border-top-right-radius:.3rem}.react-datepicker__year-option:last-of-type,.react-datepicker__month-option:last-of-type,.react-datepicker__month-year-option:last-of-type{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom-left-radius:.3rem;border-bottom-right-radius:.3rem}.react-datepicker__year-option:hover,.react-datepicker__month-option:hover,.react-datepicker__month-year-option:hover{background-color:#ccc}.react-datepicker__year-option:hover .react-datepicker__navigation--years-upcoming,.react-datepicker__month-option:hover .react-datepicker__navigation--years-upcoming,.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-upcoming{border-bottom-color:rgb(178.5, 178.5, 178.5)}.react-datepicker__year-option:hover .react-datepicker__navigation--years-previous,.react-datepicker__month-option:hover .react-datepicker__navigation--years-previous,.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-previous{border-top-color:rgb(178.5, 178.5, 178.5)}.react-datepicker__year-option--selected,.react-datepicker__month-option--selected,.react-datepicker__month-year-option--selected{position:absolute;left:15px}.react-datepicker__close-icon{cursor:pointer;background-color:transparent;border:0;outline:0;padding:0 6px 0 0;position:absolute;top:0;right:0;height:100%;display:table-cell;vertical-align:middle}.react-datepicker__close-icon::after{cursor:pointer;background-color:#216ba5;color:#fff;border-radius:50%;height:16px;width:16px;padding:2px;font-size:12px;line-height:1;text-align:center;display:table-cell;vertical-align:middle;content:"ร—"}.react-datepicker__close-icon--disabled{cursor:default}.react-datepicker__close-icon--disabled::after{cursor:default;background-color:#ccc}.react-datepicker__today-button{background:#f0f0f0;border-top:1px solid #aeaeae;cursor:pointer;text-align:center;font-weight:bold;padding:5px 0;clear:left}.react-datepicker__portal{position:fixed;width:100vw;height:100vh;background-color:rgba(0, 0, 0, 0.8);left:0;top:0;justify-content:center;align-items:center;display:flex;z-index:2147483647}.react-datepicker__portal .react-datepicker__day-name,.react-datepicker__portal .react-datepicker__day,.react-datepicker__portal .react-datepicker__time-name{width:3rem;line-height:3rem}@media(max-width: 400px),(max-height: 550px){.react-datepicker__portal .react-datepicker__day-name,.react-datepicker__portal .react-datepicker__day,.react-datepicker__portal .react-datepicker__time-name{width:2rem;line-height:2rem}}.react-datepicker__portal .react-datepicker__current-month,.react-datepicker__portal .react-datepicker-time__header{font-size:1.44rem}.react-datepicker__children-container{width:13.8rem;margin:.4rem;padding-right:.2rem;padding-left:.2rem;height:auto}.react-datepicker__aria-live{position:absolute;clip-path:circle(0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;width:1px;white-space:nowrap}.react-datepicker__calendar-icon{width:1em;height:1em;vertical-align:-0.125em}meta.foundation-version{font-family:"/5.5.3/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 551px)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:551px)/";width:551px}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:551px) and (max-width:801px)/";width:551px}meta.foundation-mq-large{font-family:"/only screen and (min-width:801px)/";width:801px}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:801px) and (max-width:968px)/";width:801px}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:968px)/";width:968px}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:968px) and (max-width:1441px)/";width:968px}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:1441px)/";width:1441px}meta.foundation-data-attribute-namespace{font-family:false}.has-tip{border-bottom:dotted 1px #ddd;color:#292929;cursor:help;font-weight:600}.has-tip:hover,.has-tip:focus{border-bottom:dotted 1px hsl(0,0%,9%);color:#333}.has-tip.tip-left,.has-tip.tip-right{float:none !important}.tooltip{background:#292929;color:#fff;display:none;font-size:1rem;font-weight:400;line-height:1.25;max-width:300px;padding:.375rem .5rem .2980769231rem;position:absolute;width:100%;z-index:1006;left:50%}.tooltip>.nub{border:solid 5px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #292929 rgba(0,0,0,0);display:block;height:0;pointer-events:none;position:absolute;top:-10px;width:0;left:5px}.tooltip>.nub.rtl{left:auto;right:5px}.tooltip.radius{border-radius:2px}.tooltip.round{border-radius:1000px}.tooltip.round>.nub{left:2rem}.tooltip.opened{border-bottom:dotted 1px hsl(0,0%,9%) !important;color:#333 !important}.tap-to-close{color:#f5f5f5;display:block;font-size:1rem;font-weight:400}@media only screen{.tooltip>.nub{border-color:rgba(0,0,0,0) rgba(0,0,0,0) #292929 rgba(0,0,0,0);top:-10px}.tooltip.tip-top>.nub{border-color:#292929 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);bottom:-10px;top:auto}.tooltip.tip-left,.tooltip.tip-right{float:none !important}.tooltip.tip-left>.nub{border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #292929;left:auto;margin-top:-5px;right:-10px;top:50%}.tooltip.tip-right>.nub{border-color:rgba(0,0,0,0) #292929 rgba(0,0,0,0) rgba(0,0,0,0);left:-10px;margin-top:-5px;right:auto;top:50%}}.u-block{display:block !important}.u-inlineBlock{display:inline-block !important;max-width:100% !important}.u-hidden{display:none !important}.u-hiddenVisually{border:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.is-srOnly{border:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.u-textAlignCenter{text-align:center !important}.u-textAlignLeft{text-align:left !important}.u-textAlignRight{text-align:right !important}.u-textBreak{word-wrap:break-word !important}.u-textInheritColor{color:inherit !important}.u-textKern{text-rendering:optimizeLegibility !important;font-feature-settings:"kern" 1 !important;font-kerning:normal !important}.u-textLead{line-height:1.6 !important;font-size:1.1em !important}.u-textNoWrap{white-space:nowrap !important}.u-textTruncate{max-width:100% !important;overflow:hidden !important;text-overflow:ellipsis !important;white-space:nowrap !important;word-wrap:normal !important}.u-fontSmoothing{-moz-osx-font-smoothing:grayscale !important;-webkit-font-smoothing:antialiased !important}/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{background:#fff;color:#333;cursor:auto;margin:0;padding:0;position:relative}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}a:hover{cursor:pointer}figure{margin:0 0 1rem}img{display:inline-block;height:auto;max-width:100%;vertical-align:middle}img{-ms-interpolation-mode:bicubic}button{background:none;border:0}button:active,button:focus{box-shadow:none;outline:none}textarea{height:auto;min-height:50px}select{width:100%}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}html{font-size:13px}@media(min-width: 551px){html{font-size:13px}}@media(min-width: 801px){html{font-size:13px}}@media(min-width: 968px){html{font-size:13px}}body{font-family:"Open Sans","Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5}a{color:#4496f6;line-height:inherit;text-decoration:none}a:hover,a:focus{color:rgb(10.9056122449,110.2678571429,226.5943877551)}p{font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:1.5rem;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#292929;font-family:"Open Sans","Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:0;line-height:1.25;margin-bottom:3rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#999;font-size:80%;line-height:0}h1{font-size:2.7692307692rem}h2{font-size:1.9230769231rem}h3{font-size:1.1538461538rem}h4{font-size:1.3846153846rem}h5{font-size:1rem}h6{font-size:1rem}.subheader{color:#999;font-weight:400;line-height:1.25;margin-bottom:.75rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1rem 0 .9230769231rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:600;line-height:inherit}small{font-size:80%;line-height:inherit}code{background-color:#fff;border-color:#ebebeb;border-style:solid;border-width:1px;color:#ad0000;font-family:Consolas,Monaco,"Andale Mono",monospace;font-size:1rem;font-weight:400;padding:.375rem .5rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.5;list-style-position:outside;margin-bottom:1.5rem}ul ul,ul ol,ol ul,ol ol{margin-left:1.5384615385rem;margin-bottom:0}ul{margin-left:1.1rem}ol{margin-left:1.4rem}dl dt{font-weight:600;margin-bottom:.3rem}dl dd{margin-bottom:1.5rem}abbr,acronym{border-bottom:1px dotted #ddd;color:#333;cursor:help;font-size:90%;text-transform:uppercase}abbr{text-transform:none}blockquote{border:#ddd solid;border-width:0 0 0 1px;margin:0 0 1.5rem;padding:.75rem 1.5rem}blockquote,blockquote p{color:#333;font-size:1rem;font-weight:400;line-height:1.5}cite{color:#999;display:block;font-size:1rem}cite:before{content:"โ€” "}cite a,cite a:visited{color:#999}.icon{height:1.3846153846rem;width:1.3846153846rem;display:inline-block;vertical-align:middle}.icon svg{display:inline-block;fill:#999;height:100%;vertical-align:top;width:100%}.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:1px;cursor:pointer;font-family:"Open Sans","Helvetica Neue",Arial,sans-serif;font-weight:400;line-height:normal;margin:0 0 1.5rem;position:relative;text-align:center;text-decoration:none;display:inline-block;background-color:#fff;border-color:#ddd;color:#5f5f5f;font-size:1rem;padding:1rem 2.25rem;border-radius:3px;outline:none;vertical-align:middle}.button:hover,.button:focus,.button.is-active,.button.active{background-color:#fff;border-color:#999;color:#333}.button:active{background-color:#fff;border:1px solid #5f5f5f;color:#292929}.button:focus,.button.is-active,.button.active{box-shadow:0 0 2px rgba(51,51,51,.6);outline:none}@media(min-width: 481px){.button+.button{margin-left:.75rem}}.button--primary{background-color:#333;border-color:#333;color:#fff}.button--primary:hover,.button--primary:focus,.button--primary.is-active,.button--primary.active{background-color:hsl(0,0%,5%);border-color:hsl(0,0%,5%);color:#fff}.button--primary:active{background-color:#000;border:1px solid #000;color:#fff}.button--tertiary{background-color:#fff;border-color:#ebebeb;color:#4496f6}.button--tertiary:hover,.button--tertiary:focus,.button--tertiary.is-active,.button--tertiary.active{background-color:#fff;border-color:#ddd;color:rgb(10.9056122449,110.2678571429,226.5943877551)}.button--tertiary:active{background-color:#fff;border:1px solid #ddd;color:rgb(10.9056122449,110.2678571429,226.5943877551)}.button--action{background-color:#4496f6;border-color:#4496f6;color:#fff}.button--action:hover,.button--action:focus,.button--action.is-active,.button--action.active{background-color:rgb(10.9056122449,110.2678571429,226.5943877551);border-color:rgb(10.9056122449,110.2678571429,226.5943877551);color:#fff}.button--action:active{background-color:rgb(8.5637755102,86.5892857143,177.9362244898);border:1px solid rgb(8.5637755102,86.5892857143,177.9362244898);color:#fff}.button[disabled]{background-color:#fcfcfc;border-color:#ebebeb;color:#ddd;cursor:default}.button[disabled]:hover,.button[disabled]:focus,.button[disabled].is-active,.button[disabled].active{background-color:#fcfcfc;border-color:#ebebeb;color:#ddd}.button[disabled]:active{background-color:#fcfcfc;border:1px solid #ebebeb;color:#ddd}.button--large{font-size:1.3846153846rem;padding:1.1875rem 4.5rem}.button--small{font-size:1rem;padding:.9375rem 1.875rem}.button--tiny{font-size:1rem;padding:.5rem 1.1875rem}.button--slab{display:block;width:100%}.button+.button--slab{margin-left:0}.button--icon{font-size:1rem;padding:.75rem .75rem}.button--icon svg{fill:#333}.dropdown-menu{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ddd;font-size:1rem;height:auto;max-height:none;width:100%;z-index:89;max-width:200px}.dropdown-menu.open{display:block}.dropdown-menu>*:first-child{margin-top:0}.dropdown-menu>*:last-child{margin-bottom:0}.dropdown-menu--content{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ddd;font-size:1rem;height:auto;max-height:none;padding:.75rem;width:100%;z-index:89;max-width:200px}.dropdown-menu--content.open{display:block}.dropdown-menu--content>*:first-child{margin-top:0}.dropdown-menu--content>*:last-child{margin-bottom:0}.dropdown-menu,.dropdown-menu--content{box-shadow:0 2px 3px 0 #f5f5f5;margin-top:-1px}.dropdown-menu-item{cursor:pointer;font-size:1rem;line-height:1.5;margin:0;padding:.75rem 1.5rem}.dropdown-menu-item:hover,.dropdown-menu-item:focus{background:#fcfcfc}.dropdown-menu-item a{display:block;padding:.75rem;color:#333}.dropdown-menu-item a{margin:-0.75rem}.dropdown-button{position:relative;padding-right:2.4375rem;cursor:pointer}.dropdown-button::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);border-style:solid;content:"";display:block;height:0;position:absolute;top:50%;width:0}.dropdown-button::after{border-width:.375rem;right:.9375rem;margin-top:-0.125rem}.dropdown-button::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.dropdown-button.button--small{padding-right:1.8rem}.dropdown-button.button--small::after{border-width:.3rem;right:.6rem;margin-top:-0.12rem}.dropdown-button.button--small::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.dropdown-button.button--large{padding-right:2.625rem}.dropdown-button.button--large::after{border-width:.375rem;right:1.125rem;margin-top:-0.125rem}.dropdown-button.button--large::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.dropdown-button.button--primary:after{border-color:#fff rgba(0,0,0,0) rgba(0,0,0,0)}.form{margin:0}.form-fieldset{border:solid #ddd;border-width:0;margin:0;padding:0}.form-legend{background:rgba(0,0,0,0);display:block;line-height:1.5;margin-bottom:0;padding:0 0 2rem;width:100%}.form-label{color:#5f5f5f;cursor:pointer;display:block;font-size:1rem;font-weight:500;line-height:1.5;margin-bottom:.375rem}.form-label small{font-size:1rem;font-weight:400;text-transform:none;vertical-align:bottom}.form-input,.widget--stripev3{appearance:none;background-color:#fff;border-color:#ddd;border-style:solid;border-width:1px;border-radius:4px;box-shadow:none;color:#333;display:block;font-family:inherit;font-size:1rem;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;height:3.45rem;margin:0;padding:.75rem 1rem;transition:all 100ms ease-out;width:100%}.form-input:disabled,.widget--stripev3:disabled{background-color:#f5f5f5;border-color:#ddd;color:#333;cursor:not-allowed}.form-input[readonly],[readonly].widget--stripev3{background-color:#f5f5f5;border-color:#ddd;color:#333;cursor:text}.form-input:focus,.widget--stripev3:focus{background:#fff;border-color:#4496f6;box-shadow:none;outline:none}.form-input[rows],[rows].widget--stripev3{height:auto}.form-input[type=search],[type=search].widget--stripev3{box-sizing:border-box}.form-input::-webkit-input-placeholder,.widget--stripev3::-webkit-input-placeholder{color:#ddd}.form-input::-ms-clear,.widget--stripev3::-ms-clear{height:0;width:0}.form-input::-moz-placeholder,.widget--stripev3::-moz-placeholder{color:#ddd}.form-input:-ms-input-placeholder,.widget--stripev3:-ms-input-placeholder{color:#ddd}.form-select{-webkit-appearance:none !important;-moz-appearance:none !important;background-color:#fff;border-radius:0;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+");background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ddd;color:#333;font-family:inherit;font-size:1rem;line-height:normal;padding:.75rem;border-radius:0;box-shadow:none;cursor:pointer;height:3.45rem;margin:0;max-width:none;outline:0;padding-right:1.5rem}.form-select::-ms-expand{display:none}.form-select.radius{border-radius:4px}.form-select:focus{background-color:#fff;border-color:#4496f6}.form-select:disabled{background-color:#f5f5f5;cursor:not-allowed}.form-select:focus{border-color:#4496f6;box-shadow:none}.form-body{background-color:rgba(0,0,0,0);border:none;box-shadow:none;margin-bottom:1.5rem;max-width:none;padding:0}@media(min-width: 551px){.form-row{display:flex;flex-direction:row;margin:0 -1.1538461538rem;padding:0}.form-row .form-field{flex:1;margin-left:1.1538461538rem;margin-right:1.1538461538rem;max-width:none;padding:0}.form-row .form-select{max-width:none}}.form-field{display:block;margin:0 0 1rem;max-width:none}.form-field:before,.form-field:after{content:" ";display:table}.form-field:after{clear:both}.form-select[multiple]{height:auto}.form-select[multiple] option{padding:5px}.form-checkbox,.form-radio{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-checkbox+.form-label,.form-radio+.form-label{display:inline-block;font-size:1rem;font-weight:400;line-height:1.25;margin-bottom:.375rem;padding-left:1.875rem;position:relative;vertical-align:baseline;width:100%}.form-checkbox+.form-label::before,.form-checkbox+.form-label::after,.form-radio+.form-label::before,.form-radio+.form-label::after{content:"";display:block;position:absolute;transition:all 50ms ease-out}.form-checkbox+.form-label::before,.form-radio+.form-label::before{background-color:#fff;border:solid #ddd;border-width:1px;box-shadow:none;height:1.2307692308rem;left:0;top:0;width:1.2307692308rem}.form-checkbox+.form-label::after,.form-radio+.form-label::after{height:.9230769231rem;left:2px;opacity:0;top:2px;transform:scale(0);width:.9230769231rem}.form-checkbox:checked+.form-label::after,.form-radio:checked+.form-label::after{opacity:1;transform:scale(1)}.form-checkbox:focus+.form-label::before,.form-radio:focus+.form-label::before{border-color:#4496f6;box-shadow:none}.form-checkbox[disabled]+.form-label,.form-radio[disabled]+.form-label{cursor:default}.form-checkbox[disabled]+.form-label::before,.form-radio[disabled]+.form-label::before{background-color:#f5f5f5}.form-checkbox[disabled]+.form-label::after,.form-radio[disabled]+.form-label::after{opacity:.4}.form-checkbox+.form-label::before{border-radius:4px}.form-checkbox+.form-label::after{background-image:url("data:image/svg+xml;utf8, %3Csvg%20width%3D%2212%22%20height%3D%2211%22%20viewBox%3D%220%200%2012%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cdefs%3E%3Cfilter%20x%3D%22-50%25%22%20y%3D%22-50%25%22%20width%3D%22200%25%22%20height%3D%22200%25%22%20filterUnits%3D%22objectBoundingBox%22%20id%3D%22a%22%3E%3CfeOffset%20dy%3D%221%22%20in%3D%22SourceAlpha%22%20result%3D%22shadowOffsetOuter1%22%2F%3E%3CfeGaussianBlur%20in%3D%22shadowOffsetOuter1%22%20result%3D%22shadowBlurOuter1%22%2F%3E%3CfeColorMatrix%20values%3D%220%200%200%200%200.137254902%200%200%200%200%200.505882353%200%200%200%200%200.870588235%200%200%200%200.7%200%22%20in%3D%22shadowBlurOuter1%22%20result%3D%22shadowMatrixOuter1%22%2F%3E%3CfeMerge%3E%3CfeMergeNode%20in%3D%22shadowMatrixOuter1%22%2F%3E%3CfeMergeNode%20in%3D%22SourceGraphic%22%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fdefs%3E%3Cpath%20d%3D%22M612.138%202935.716c-1.964%202.295-3.942%204.556-5.92%206.833-.098.115-.194.215-.29.33-.146.168-.42.15-.564%200-.998-.98-1.996-1.977-2.993-2.958-.37-.366.194-.965.564-.582.9.88%201.786%201.762%202.687%202.66%201.997-2.294%203.975-4.57%205.955-6.866.353-.4.916.183.563.582z%22%20transform%3D%22translate(-601%20-2934)%22%20stroke%3D%22%23FFF%22%20filter%3D%22url(%23a)%22%20stroke-width%3D%22.3%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E");background-position:50%;background-repeat:no-repeat;background-size:100%;color:#4496f6;content:"";font-size:.9230769231rem;line-height:1;text-align:center}.form-radio+.form-label::before{border-radius:1.2307692308rem}.form-radio+.form-label::after{background:#fff;border:3px solid #4496f6;border-radius:.9230769231rem}.form-input.has-action,.has-action.widget--stripev3{float:left;padding-right:2.8461538462rem}.form-input.has-action+.button--inputAction,.has-action.widget--stripev3+.button--inputAction{background:rgba(0,0,0,0);border:0;border-radius:0 4px 4px 0;float:left;height:2.8461538462rem;margin:.0769230769rem 0 0 -2.9230769231rem;width:2.8461538462rem}.form-input.has-icon,.has-icon.widget--stripev3{float:left;padding-right:2.1538461538rem}.form-input.has-icon+.icon,.has-icon.widget--stripev3+.icon{height:3.45rem;margin-left:-2.1538461538rem;width:1.5384615385rem}.form-prefixPostfix{display:flex;flex-direction:row;flex-wrap:nowrap}.form-prefixPostfix .form-input,.form-prefixPostfix .widget--stripev3{flex:1}.form-prefixPostfix .button{height:3.45rem}.form-prefixPostfix-input{border-radius:4px 0 0 4px}.form-prefixPostfix-label{background-color:#fff;border:solid #ddd;border-width:1px;flex:1;font-weight:300;height:3.45rem;line-height:normal;max-width:6.9230769231rem;padding:.75rem 1.5rem;text-align:center}.form-prefixPostfix-label--prefix{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px}.form-prefixPostfix-label--prefix+.form-input,.form-prefixPostfix-label--prefix+.widget--stripev3{border-radius:0 4px 4px 0}.form-prefixPostfix-label--postfix{border-radius:0 4px 4px 0;border-width:1px 1px 1px 0}.form-prefixPostfix-button--prefix{margin:0 .75rem 0 0}.form-prefixPostfix-button--postfix{margin:0 0 0 .75rem}.switch-checkbox{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.switch-checkbox:focus+.switch-toggle{border-color:#333;box-shadow:0 0 4px rgba(51,51,51,.4)}.switch-toggle{background-color:#ddd;border:1px solid #ddd;border-radius:2.1538461538rem;cursor:pointer;display:inline-block;height:2.1538461538rem;position:relative;transition:all 100ms ease-out;vertical-align:middle;width:4.6153846154rem}.switch--important .switch-toggle{background-color:#d1a162;border-color:#d1a162}.switch--checked .switch-toggle{background-color:#004d0d;border-color:#004d0d}.switch--disabled .switch-toggle{background-color:#fcfcfc;border-color:#ebebeb;cursor:default}.switch-toggle::before{background:#fff;border-radius:1.5384923077rem;box-shadow:0 1px 1px rgba(0,0,0,.1);content:"";height:1.5384923077rem;left:.2307538462rem;position:absolute;top:.2307538462rem;transition:all 100ms ease-out;width:1.5384923077rem}.switch--checked .switch-toggle::before{left:2.6922923077rem}.switch-label{color:#fff;height:26px;line-height:2.0769230769;position:absolute;right:.4615384615rem;text-transform:uppercase;transition:all 100ms ease-out}.switch--checked .switch-label{font-weight:600;left:.4615384615rem;right:auto}.switch--disabled .switch-label{color:#ddd}.switch-label--icon.icon{height:2rem;width:2rem}.switch-label--icon.icon svg{height:2rem;width:2rem;fill:#fff}.switch--disabled .switch-label--icon.icon svg{fill:#ddd}.switch-description--off{color:#292929;margin-right:5px}.switch--checked .switch-description--off{color:#ddd}.switch-description--on{color:#ddd;margin-left:5px}.switch--checked .switch-description--on{color:#292929}.switch-ariaDescription{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-actions{background:none;border:0;padding:1.5rem 0 0;text-align:center}@media(min-width: 481px){.form-actions{text-align:left}}.form-actions>*{display:inline-block;margin-bottom:1rem;width:100%}@media(min-width: 481px){.form-actions>*{margin:0 0 0 .75rem;vertical-align:baseline;width:auto}}@media(min-width: 481px){.form-actions--fixed{background:#fff;border-top:1px solid #ddd;bottom:0;left:0;padding:1.5rem 3rem;position:fixed;right:0;text-align:right;z-index:20}}.form-input-indicator{height:1.6923076923rem;width:1.6923076923rem;float:left;margin:0 0 0 -2.3076923077rem;position:relative;top:.7692307692rem}.form-prefixPostfix .form-input-indicator{top:0}.form-input-indicator>svg{fill:#004d0d}.form-field-errors{list-style:none;margin-left:0;margin-left:0;clear:both;margin-bottom:0;margin-top:.1875rem}.form-field-errors ul,.form-field-errors ol{list-style:none;margin-bottom:0}.form-inlineMessage{display:inline-block;font-weight:400;line-height:1.25;margin:.1875rem 0 0;width:100%}.form-field--success .form-input,.form-field--success .widget--stripev3,.form-field--error .form-input,.form-field--error .widget--stripev3,.form-field--warning .form-input,.form-field--warning .widget--stripev3{float:left}.form-field--success .form-input,.form-field--success .widget--stripev3,.form-field--success .form-select,.form-field--success .form-checkbox+.form-label::before,.form-field--success .form-radio+.form-label::before,.form-field--success .form-prefixPostfix-label{border-color:#004d0d}.form-field--success .form-field-error,.form-field--success .form-inlineMessage{color:#004d0d}.form-field--success .form-input-indicator>svg{fill:#004d0d}.form-field--error .form-input,.form-field--error .widget--stripev3,.form-field--error .form-select,.form-field--error .form-checkbox+.form-label::before,.form-field--error .form-radio+.form-label::before,.form-field--error .form-prefixPostfix-label{border-color:#ad0000}.form-field--error .form-field-error,.form-field--error .form-inlineMessage{color:#ad0000}.form-field--error .form-input-indicator>svg{fill:#ad0000}.form-field--warning .form-input,.form-field--warning .widget--stripev3,.form-field--warning .form-select,.form-field--warning .form-checkbox+.form-label::before,.form-field--warning .form-radio+.form-label::before,.form-field--warning .form-prefixPostfix-label{border-color:#d1a162}.form-field--warning .form-field-error,.form-field--warning .form-inlineMessage{color:#d1a162}.form-field--warning .form-input-indicator>svg{fill:#d1a162}.form-ccFields{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 -1.1538461538rem;padding:0}.form-ccFields>.form-field{max-width:none;padding:0 1.1538461538rem}.form-field--ccNumber{order:1}.form-field--ccExpiry{order:2}.form-field--ccName{order:4}@media(min-width: 551px){.form-field--ccName{order:3}}.form-field--ccCvv{order:3}@media(min-width: 551px){.form-field--ccCvv{order:4}}.form-field--ccNumber,.form-field--ccName{flex:100%}@media(min-width: 551px){.form-field--ccNumber,.form-field--ccName{flex:.65 0 65%}}@media(min-width: 801px){.form-field--ccNumber,.form-field--ccName{flex:.75 0 75%}}.form-field--ccExpiry,.form-field--ccCvv{flex:.5}@media(min-width: 551px){.form-field--ccExpiry,.form-field--ccCvv{flex:.35 0 35%;max-width:13.8461538462rem !important}}@media(min-width: 801px){.form-field--ccExpiry,.form-field--ccCvv{flex:.25 0 25%}}.form-ccFields-cvvExample{display:flex}.form-ccFields-cvvExampleDescription{flex:2 auto;margin-right:.75rem}.form-ccFields-cvvExampleDescription p{font-size:.8461538462rem;margin:0}.form-ccFields-cvvExampleFigures{flex:1 auto}.form-ccFields-cvvExampleFigures figure{margin-bottom:.75rem}.form-ccFields-cvvExampleFigures icon{height:auto}.media:before,.media:after{content:" ";display:table}.media:after{clear:both}.media-figure{float:left;margin-right:.75rem}.media-figure>img{display:block}.media-figure--opposite{float:right;margin-left:.75rem;margin-right:0}.media-body:before,.media-body:after{content:" ";display:table}.media-body:after{clear:both}.mediaTable{display:table;padding:1.5rem}.mediaTable:before,.mediaTable:after{content:" ";display:table}.mediaTable:after{clear:both}.mediaTable-column{display:table-cell;padding-right:1.5rem;vertical-align:middle}.mediaTable-column:last-child{padding:0}.mediaTable-figure{text-align:center;vertical-align:middle;width:15%}.mediaTable-body{vertical-align:middle}.mediaTable-actions{text-align:right;vertical-align:top;width:30%}.alertBox{border-style:none;border-width:1px;display:block;font-size:1rem;font-weight:400;margin-bottom:.75rem;padding:1rem 1.5rem 1rem 1.5rem;position:relative;transition:opacity 300ms ease-out;background-color:#ebebeb;border-color:#ebebeb;color:#333}.alertBox .icon{height:1.5384615385rem;width:1.5384615385rem}.alertBox .button{margin:0 0 0 .75rem}.alertBox--info{background-color:#f5f5f5;border-color:#f5f5f5;color:#333}.alertBox--info svg{fill:#5f5f5f}.alertBox--success{background-color:#d3f5d9;border-color:#d3f5d9;color:#333}.alertBox--success svg{fill:#004d0d}.alertBox--warning{background-color:#fbf7ee;border-color:#fbf7ee;color:#333}.alertBox--warning svg{fill:#d1a162}.alertBox--error{background-color:#fff0f1;border-color:#fff0f1;color:#333}.alertBox--error svg{fill:#ad0000}.alertBox-column{display:table-cell;text-align:center;vertical-align:middle}.alertBox-icon{padding-right:1.5rem}.alertBox-message{margin:0;text-align:left;width:100%}.alertBox-heading{margin:0}.alertBox-close{cursor:pointer;padding-left:1.5rem}.alertBox-close .icon{height:1.5384615385rem;width:1.5384615385rem}.alertBox-close svg{fill:#999}.tooltip{border-radius:2px}body.has-activeModal{overflow:hidden}.modal-background{background:#fff;background:hsla(0,0%,100%,.9);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1004;left:0}.has-activeModal .modal-background{display:block}.modal{border-radius:0;display:none;position:absolute;top:0;visibility:hidden;width:100%;z-index:1005;left:0;background-color:#fff;padding:0;border:solid 1px #ddd;box-shadow:0 0 12px hsla(0,0%,60%,.4);max-height:80%;overflow:auto;position:fixed}@media only screen and (max-width: 551px){.modal{min-height:100vh}}.modal .column,.modal .columns{min-width:0}.modal>:first-child{margin-top:0}.modal>:last-child{margin-bottom:0}@media only screen and (min-width:551px){.modal{left:0;margin:0 auto;max-width:80%;right:0;width:680px}}@media only screen and (min-width:551px){.modal{top:50%}}@media(min-width: 551px){.modal{transform:translateY(-50%)}}.modal--large{max-height:90%;width:900px}.modal--small{width:300px}.modal-header{border-bottom:1px solid #ebebeb;padding:1.6875rem 1.875rem;position:relative}.modal-header-title{margin:0}.modal-body{padding:1.6875rem 1.875rem}.modal-body>:last-child{margin-bottom:0}.modal-footer{border-top:1px solid #ebebeb;padding:1.6875rem 1.875rem;text-align:center}@media(min-width: 481px){.modal-footer{text-align:right}}.modal-footer .button{display:block}@media(min-width: 481px){.modal-footer .button{display:inline-block;margin-bottom:0}}.modal-footer-link{display:inline-block;font-size:1.1538461538rem;margin:0 0 .75rem}@media(min-width: 481px){.modal-footer-link{display:inline;margin:1.5rem}}.modal-close{color:#5f5f5f;cursor:pointer;font-size:2.3076923077rem;font-weight:normal;line-height:1;position:absolute;top:50%;right:.9375rem;transform:translateY(-50%)}.modal-close .icon{height:2.3076923077rem;width:2.3076923077rem}@media print{.modal{background:#fff !important;display:none}}.loadingNotification{left:50%;position:fixed;text-align:center;top:6rem;transform:translateX(-50%);transform-style:preserve-3d;transition:all 200ms ease-out;z-index:500}.loadingNotification.ng-hide-remove,.loadingNotification.ng-hide-add-active{opacity:0;top:7.5rem;transform:scale(0.9) translateX(-50%)}.loadingNotification.ng-hide-remove-active{opacity:1;top:6rem;transform:scale(1) translateX(-50%)}.loadingNotification-label{background:#333;border-radius:4px;color:#fff;display:inline-block;font-size:1.1538461538rem;padding:.5625rem 1.1875rem}.loadingOverlay-container{min-height:0;position:relative}.loadingOverlay{background:hsla(0,0%,100%,.9);bottom:0;height:100%;left:0;opacity:1;position:absolute;right:0;top:0;transition:all 250ms ease-out;width:100%}.loadingOverlay::before{height:4.6153846154rem;width:4.6153846154rem;border-radius:4.6153846154rem;border:solid 1px;border-color:#fff #fff #ddd #ddd;content:"";display:block;left:0;margin:0 auto;position:absolute;right:0;top:50%;transform:translateY(-50%) rotate(0deg);transform-style:preserve-3d;animation:spin 500ms infinite cubic-bezier(0.69, 0.31, 0.56, 0.83)}.loadingOverlay.ng-enter,.loadingOverlay.ng-leave.ng-leave-active{opacity:0}.loadingOverlay.ng-leave,.loadingOverlay.ng-enter.ng-enter-active{opacity:1}@keyframes spin{0%{transform:translateY(-50%) rotate(0deg)}100%{transform:translateY(-50%) rotate(360deg)}}.creditCardTypes{display:inline-block}.creditCardTypes-list{list-style:none;margin-left:0}.creditCardTypes-list ul,.creditCardTypes-list ol{list-style:none;margin-bottom:0}.creditCardTypes-list-item{display:inline-block;margin:.1875rem}.creditCardTypes-list-item.is-active{opacity:1}.creditCardTypes-list-item.not-active{opacity:.2}html,body{height:auto}@media(min-width: 968px){html,body{scroll-behavior:smooth}}h1{font-size:2.7692307692rem}h2{font-size:1.9230769231rem}h3{font-size:1.1538461538rem;font-weight:700}h4{font-size:1rem;font-weight:600}h5{font-size:1rem;font-weight:600}h6{font-size:1rem}h1 a,h1 a:hover,h2 a,h2 a:hover,h3 a,h3 a:hover,h4 a,h4 a:hover,h5 a,h5 a:hover,h6 a,h6 a:hover{color:currentcolor}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}.button{text-transform:uppercase;transition:all 100ms ease-out}.button:focus{border-color:#4496f6}.button.is-loading{color:#fff;inset:0;background:linear-gradient(to right, transparent 0%, transparent 20%, rgba(255, 255, 255, 0.5) 50%, transparent 80%, transparent 100%);animation:shimmer 2s ease-in-out infinite;background-size:200% 100%}.button.is-loading.button--primary{color:#333}.button.is-loading[disabled]{color:#ebebeb}.button--primary,.button--action{font-weight:600}.button--small,.button--tiny{text-transform:none}.button--small{line-height:1}.button--slab{width:100%}.link--disabled{color:#ebebeb;cursor:default;pointer-events:none}@media(min-width: 968px){.form{max-width:41.5384615385rem}}.form-fieldset{margin-bottom:1.25rem}.form-fieldset:last-child{margin-bottom:0}#checkoutShippingAddress.form-fieldset:has(.floating-form-field){margin-bottom:5px}.floating-fieldset .form-fieldset{margin-bottom:0}.form-field{position:relative;margin:0 0 .75rem}.form-field:last-child{margin-bottom:0}.form-field .floating-input,.form-field .floating-select{background-color:#fff;font-size:1.077rem;height:3.6975rem;padding-bottom:0;padding-left:1rem;padding-right:1rem;padding-top:1.125rem}.form-field .floating-input.floating-form-field-input,.form-field .floating-select.floating-form-field-input{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400}.form-field .floating-textarea{background-color:#fff;padding-top:1.875rem}.form-field .dropdown-chevron,.form-field .floating-select-chevron{position:absolute;right:1rem;top:37.7px}.form-field .floating-select-chevron{top:14.95px}.form-field .floating-label{font-size:1.077rem;left:1.05rem;line-height:3.5;position:absolute;top:0;transition:all .15s cubic-bezier(0.13, 0.615, 0.315, 0.915)}.form-field .floating-label small{font-size:1.077rem;vertical-align:baseline}.form-field .floating-label.floating-form-field-label{color:#757575;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:500;margin-top:.1875rem}.form-field .floating-label.floating-form-field-label small{font-size:1rem}.form-field .react-datepicker__tab-loop+.floating-label,.form-field .react-datepicker-wrapper+.floating-label,.form-field select+.floating-label,.form-field textarea:focus+.floating-label,.form-field textarea:not(:empty)+.floating-label,.form-field input:focus+.floating-label,.form-field input:not(:placeholder-shown)+.floating-label{color:#5f5f5f;display:block;font-size:.8461538462rem;line-height:2;top:.2958rem}.form-field .react-datepicker__tab-loop+.floating-label small,.form-field .react-datepicker-wrapper+.floating-label small,.form-field select+.floating-label small,.form-field textarea:focus+.floating-label small,.form-field textarea:not(:empty)+.floating-label small,.form-field input:focus+.floating-label small,.form-field input:not(:placeholder-shown)+.floating-label small{font-size:.8461538462rem}.form-field .react-datepicker__tab-loop+.floating-label.floating-form-field-label,.form-field .react-datepicker-wrapper+.floating-label.floating-form-field-label,.form-field select+.floating-label.floating-form-field-label,.form-field textarea:focus+.floating-label.floating-form-field-label,.form-field textarea:not(:empty)+.floating-label.floating-form-field-label,.form-field input:focus+.floating-label.floating-form-field-label,.form-field input:not(:placeholder-shown)+.floating-label.floating-form-field-label{color:#757575;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:.8461538462rem;font-weight:500;margin-top:0}.form-field .react-datepicker__tab-loop+.floating-label.floating-form-field-label small,.form-field .react-datepicker-wrapper+.floating-label.floating-form-field-label small,.form-field select+.floating-label.floating-form-field-label small,.form-field textarea:focus+.floating-label.floating-form-field-label small,.form-field textarea:not(:empty)+.floating-label.floating-form-field-label small,.form-field input:focus+.floating-label.floating-form-field-label small,.form-field input:not(:placeholder-shown)+.floating-label.floating-form-field-label small{font-size:.8461538462rem}.form-field:not(.form-field--error) .floating-input:not(:focus),.form-field:not(.form-field--error) .floating-select:not(:focus),.form-field:not(.form-field--error) .floating-textarea{border-color:#ebebeb}.floating-label+.form-field-errors,.dynamic-form-field--addressLineAutocomplete.floating-form-field .form-field-errors{padding-top:.75rem}.form-input:focus,.widget--stripev3:focus,.form-input--focus{box-shadow:none,none}.form-input.form-input--withIcon,.form-input--withIcon.widget--stripev3{padding-right:2.8846153846rem}.form-input-icon{height:1.3846153846rem;position:absolute;right:.75rem;top:50%;transform:translateY(-50%);width:1.3846153846rem}.form-actions{margin:1.875rem 0;padding:0}.form-actions .button:first-child{margin-left:0}.form-body{background-color:rgba(0,0,0,0);margin:0;position:relative}.form-field--error .form-input,.form-field--error .widget--stripev3,.form-field--error .form-select{background-color:#fdf5f5;transition:background-color .8s ease-out}.form-field--error .form-label:not(.floating-label){color:#ad0000}.form-field--error .floating-label.form-label.optimizedCheckout-form-label{color:#5f5f5f}.form-input--error{border-color:#ad0000;box-shadow:none}.form-legend-container{align-items:center;display:flex;flex-direction:row;justify-content:space-between}.form-legend{font-size:1.1538461538rem;font-weight:700;background-color:rgba(0,0,0,0);color:#292929;font-weight:700;padding:0 0 .75rem 0;width:auto}.form-toggle{background-color:rgba(0,0,0,0);color:#292929;font-weight:700}@media(min-width: 968px){.form-toggle-password{display:none}}.form-field-password{position:relative}.form-select{-webkit-appearance:none;background-image:none;border-radius:4px;padding:.75rem 1.5rem .75rem 1rem}.alertBox-heading{font-size:1.1538461538rem;font-weight:700}.alertBox--error{color:#ad0000}.alertBox--success{color:#004d0d}.alertBox--warning{color:#d1a162}.modal-background{opacity:0;transition:opacity 400ms ease-out}.modal-background.is-active,.modal-background.modal--afterOpen{opacity:1}.modal{border:0;border-radius:6px;box-shadow:0 2px 12px hsla(0,0%,60%,.4);opacity:0;outline:none;transition:opacity 200ms ease-out,transform 200ms ease-out}@media(min-width: 551px){.modal{transform:scale(0.95) translateY(-50%)}}.modal .form-actions{text-align:right}.modal.is-active,.modal.modal--afterOpen{bottom:2%;display:flex;flex-direction:column;justify-content:end;left:2%;max-width:96%;min-height:96vh;opacity:1;right:2%;top:2%}@media(min-width: 551px){.modal.is-active,.modal.modal--afterOpen{bottom:auto;left:0;max-width:80%;min-height:0;right:0;top:50%;transform:scale(1) translateY(-50%)}}@media(min-width: 551px){.modal.modal--medium{max-width:500px}}.modal.modal--error,.modal.modal--confirm{padding-bottom:.75rem;padding-left:3.75rem;padding-right:3rem;padding-top:1.5rem}.modal.modal--error .modal-body,.modal.modal--confirm .modal-body{padding-bottom:.75rem;padding-top:0}.modal.modal--error .modal-header-title,.modal.modal--confirm .modal-header-title{position:relative}.modal.modal--error .modal-header-icon,.modal.modal--confirm .modal-header-icon{left:-3rem;position:absolute;top:50%;transform:translateY(-50%)}.modal.modal--bluesnap{width:auto}.modal-header{border-bottom:0}.modal-header-title{font-size:1.3846153846rem}.modal-body .modal-footer{padding-left:0;padding-right:0}.modal-body .adyen-checkout__threeds2__challenge.adyen-checkout__threeds2__challenge--05{height:calc(96vh - 150px);padding-top:0}@media(min-width: 551px){.modal-body .adyen-checkout__threeds2__challenge.adyen-checkout__threeds2__challenge--05{height:calc(80vh - 150px)}}.modal-footer{border-top:0}.modal-footer .button{margin-bottom:.75rem;margin-left:0;width:100%}.modal-footer .button:last-child{margin-bottom:0}@media(min-width: 551px){.modal-footer .button{margin-bottom:0;margin-left:.75rem;width:auto}}.modal-body--center{display:flex;justify-content:center}.modalOverlay{background:hsla(0,0%,100%,.9);bottom:0;left:0;opacity:0;position:fixed;right:0;top:0;transition:opacity 200ms ease-out;z-index:500}.modalOverlay--afterOpen{opacity:1}.modalOverlay--beforeClose{opacity:0}.modal--afterOpen{display:block;visibility:visible}body.has-activeModal .modal-body{overflow:scroll;padding-bottom:20%}@media(min-width: 551px){body.has-activeModal .modal-body{padding-bottom:0}}.table{background:#fff;border:solid 1px #ebebeb;margin-bottom:3rem;table-layout:auto;margin-bottom:1rem;table-layout:auto;width:100%}.table caption{background:rgba(0,0,0,0);color:#333;font-size:1rem;font-weight:bold}.table thead{background:#fcfcfc}.table thead tr th,.table thead tr td{color:#333;font-size:1rem;font-weight:600;padding:1.5rem}.table tfoot{background:#fcfcfc}.table tfoot tr th,.table tfoot tr td{color:#333;font-size:1rem;font-weight:600;padding:1.5rem}.table tr th,.table tr td{color:#333;font-size:1rem;padding:1.5rem;text-align:left}.table tr.even,.table tr.alt,.table tr:nth-of-type(even){background:#fff}.table thead tr th,.table tfoot tr th,.table tfoot tr td,.table tbody tr th,.table tbody tr td,.table tr td{display:table-cell;line-height:1.5}.table-thead{border-bottom:1px solid #ddd}.table-thead a{color:#333}.table-thead a:hover{text-decoration:underline}.table-thead tr:hover{background-color:palette("grey", 50)}.table-tbody tr{border-bottom:1px solid #ebebeb}.table-tbody tr:hover{background-color:palette("white")}.table-tfoot{border-top:1px solid #ddd}.table-tfoot tr:hover{background-color:palette("white")}.table-actionButton{margin-bottom:0}.form-checkbox+.form-label,.form-radio+.form-label{color:inherit}.form-checkbox:checked+.form-label::before,.form-radio:checked+.form-label::before{background-color:#4496f6;border-color:#4496f6}.form-radio:checked+.form-label::after{border:none;transform:scale(0.5)}.formField--helpText{color:#999}.form-field--error .form-select.floating-select,.form-field--error .form-select.floating-select:hover,.form-field--error .form-select.floating-select:focus,.form-field--error .form-input.floating-input,.form-field--error .form-input.floating-input:hover,.form-field--error .form-input.floating-input:focus,.form-select.floating-select,.form-select.floating-select:focus,.form-select.floating-select:hover,.form-input.floating-input,.floating-input.widget--stripev3,.form-input.floating-input:focus,.form-input.floating-input:hover,.form-input.optimizedCheckout-form-input,.optimizedCheckout-form-input.widget--stripev3,.form-input.optimizedCheckout-form-input:focus,.form-input.optimizedCheckout-form-input:hover{box-shadow:none;-webkit-box-shadow:none}.form-ccFields{margin:0 -0.75rem}.form-ccFields>.form-field,.form-ccFields>.form-ccFields-field{display:block;flex-grow:1;margin-bottom:1rem;max-width:none !important;padding:0 .75rem}.form-ccFields--without-card-name:not(.form-ccFields--without-card-code) .form-field--ccNumber{flex-basis:100%}.form-ccFields--without-card-name:not(.form-ccFields--without-card-code) .form-field--ccExpiry,.form-ccFields--without-card-name:not(.form-ccFields--without-card-code) .form-ccFields-field--ccCvv{flex-basis:50%}.form-field--ccNumber,.form-field--ccName{flex-basis:65%}.form-field--ccDocument{flex-basis:100%;order:4}.form-field--stripe-ccNumber{flex-basis:100%}.form-field--bolt-embed{flex-basis:100%;height:8.4615384615rem}.form-field--createAccount{height:auto}.mollie-full{flex-basis:100%}.mollie-aside{flex:1 0 0}.form-field--ccNumber--hasExpiryDate{flex-basis:50%}.form-field-ccNumber--hide{display:none !important}.form-ccFields-field--ccCvv,.form-field--ccExpiry{flex-basis:1%;min-width:7.6923076923rem}.form-ccFields-field--ccCvv{order:4}.form-field--postCode{flex-basis:100%;order:5}.form-field--stripe-postalCode{flex-basis:1%;order:5}.form-field--ccAdditionalField{flex:100%;order:99}.form-field--saveInstrument{order:6}.form-field--setAsDefaultInstrument{order:7}.icon--small{height:2.0769230769rem;width:2.0769230769rem}.icon--medium{height:2.7692307692rem;width:2.7692307692rem}.icon--large{height:4.1538461538rem;width:4.1538461538rem}.icon--error svg{fill:#ad0000}.loadingNotification-label{align-items:center;display:flex;padding:.75rem 3rem}.loadingNotification-label .label{margin-left:.75rem}.spinner{animation:lds-dual-ring 1.2s linear infinite;border-color:#fff #fff #5f5f5f #5f5f5f;border-radius:50%;border-style:solid;border-width:1px;display:inline-block;height:1.1538461538rem;width:1.1538461538rem}@keyframes lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.layout>.loadingOverlay::before{position:fixed;top:40%}.loadingOverlay{opacity:.9;z-index:20}.embedded-checkout-loading-spinner-overlay{position:fixed;top:0;left:0;background-color:rgba(0,0,0,.3);display:flex;justify-content:center;align-items:center;width:100%;height:100%;z-index:999}.creditCardTypes-list{align-content:flex-end;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:end;margin-left:1.5rem;max-width:17rem}.creditCardTypes-list-item{opacity:1;transition:all .6s ease-out;width:3rem}.creditCardTypes-list-item.not-active{filter:grayscale(100%);transform:scale(0.95)}.creditCardTypes-list-item.is-active{transform:scale(1.1)}.cardIcon-icon{position:relative}.cardIcon-icon svg{fill:none}.cardIcon-icon--default{background:url(static/card-9f708a7a.svg) no-repeat center center}.cartDrawer{align-items:center;background-color:#fff;border:1px solid #ebebeb;border-radius:4px;bottom:0;box-shadow:0 1px 4px rgba(95,95,95,.14);display:flex;left:0;margin:1.5rem;padding:.75rem;position:fixed;right:0;z-index:20}@media(max-height: 26.9230769231rem){.cartDrawer{position:static}.is-embedded .cartDrawer{position:fixed}}.cartDrawer:hover{cursor:pointer}.cartDrawer-actions{flex:1;text-align:right;vertical-align:middle}.cartDrawer-body{flex:1;padding-left:1.5rem}.cartDrawer-figure{border:1px solid #ebebeb;height:50px;margin:0;min-width:50px;position:relative;width:50px}.cartDrawer-figure--stack::after{border:1px solid #ebebeb;bottom:-4px;content:"";left:4px;position:absolute;right:-4px;top:4px;z-index:-1}.cartDrawer-items{font-size:1.3846153846rem}.cartDrawer-total{font-size:1.9230769231rem}.cartDrawer-items,.cartDrawer-total{margin-bottom:0}.cartDrawer-imageWrapper{display:flex;height:100%;overflow:hidden;width:100%}.cartDrawer-imageWrapper svg{margin:auto}.productImage-giftCertificate{background:#fff;height:100%;padding:15%;width:100%}.cart-modal-body{padding:0 1.875rem}.cart-modal-header{border-bottom:0;display:table;table-layout:fixed;width:100%}.cart-modal-close,.cart-modal-link,.cart-modal-title{display:table-cell;vertical-align:middle}.cart-modal-title{padding-right:0;text-align:center;width:50%}.cart-modal-close{text-align:left}.cart-modal-link{text-align:right}.cart-modal-link svg{fill:currentColor}.modal.modal--afterOpen.optimizedCheckout-cart-modal{display:block;bottom:0;min-height:90vh}.modal.modal--afterOpen.optimizedCheckout-cart-modal .modal-body{box-shadow:none;height:70%;padding-bottom:0}.with-continue-button.cart-modal-header{box-shadow:none}.with-continue-button .cart-modal-link{text-align:left}.with-continue-button .cart-modal-close{text-align:right}.with-continue-button .cart-heading-subheader{font-weight:500;font-size:1rem;margin-top:.375rem}.changeHighlight-enter-active,.changeHighlight{animation:highlightFade 1000ms ease-out}@keyframes highlightFade{0%{background:rgba(68,150,246,.6)}100%{background:rgba(68,150,246,0)}}.form-checklist{border:1px solid #ddd;border-radius:4px 4px 0 0;color:#292929;list-style:none;margin-left:0}.form-checklist:only-child{border-radius:4px}.form-checklist-item{border-bottom:1px solid #ddd;overflow:hidden}.form-checklist-item:last-child{border-bottom:0}.form-checklist-item--selected{overflow:visible}.form-checklist-item:hover,.form-checklist-item--selected{background-color:#fcfcfc}.custom-checklist-item .paymentMethod--hosted,.custom-checklist-item .widget{padding:0}.form-checklist-header>.form-field{margin-bottom:0}.form-checklist-header--selected .form-label{font-weight:700}.form-checklist-checkbox~.form-label{color:inherit;display:block;font-size:1.1538461538rem;line-height:2.2;margin-bottom:0;min-height:4.6153846154rem;padding:1rem 2.25rem 1rem 3.75rem;position:relative}@media(min-width: 551px){.form-checklist-checkbox~.form-label{padding-left:4.5rem}}.form-checklist-checkbox~.form-label::before,.form-checklist-checkbox~.form-label::after{height:2rem;width:2rem;background-color:#fff;border-radius:100%;content:"";left:1rem;margin:auto;position:absolute;top:1.4615384615rem}@media(min-width: 551px){.form-checklist-checkbox~.form-label::before,.form-checklist-checkbox~.form-label::after{left:1.5rem}}.form-checklist-checkbox~.form-label::after{transform:scale(0.66)}.form-checklist-checkbox~.form-label::before{border:1px solid #ddd}.form-checklist-checkbox{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-checklist-checkbox:focus~.form-label{box-shadow:inset 0 0 0 1px #4496f6}.form-checklist-checkbox:checked~.form-label::before{border-color:#4496f6}.form-checklist-checkbox:checked~.form-label::after{background-color:#4496f6}.form-checklist-body{margin-left:3.75rem;margin-right:2.25rem}.form-checklist-body.ng-enter,.form-checklist-body.ng-leave{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.form-checklist-body.ng-enter{max-height:0}.form-checklist-body.ng-leave{max-height:26.9230769231rem}.form-checklist-body.ng-enter.ng-enter-active{max-height:26.9230769231rem}.form-checklist-body.ng-leave.ng-leave-active{max-height:0}.form-checklist-body-enter,.form-checklist-body-exit{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.form-checklist-body-enter{max-height:0}.form-checklist-body-exit{max-height:26.9230769231rem}.form-checklist-body-enter-active{max-height:26.9230769231rem}.form-checklist-body-exit-active{max-height:0}@media(min-width: 551px){.form-checklist-body{margin-left:4.5rem}}.form-checklist-container{clear:both;padding:.6666666667rem 0}.form-checklist-footer{border:1px solid #ddd;border-radius:0 0 4px 4px;border-top:0;color:#4496f6;line-height:1.25;margin-bottom:1rem;text-align:center}.form-checklist-action{border-radius:0 0 4px 4px;padding:1.5rem 0;width:100%}.form-checklist-action:focus,.form-checklist-action:hover{background-color:#fcfcfc}.form-checklist-action:focus{box-shadow:inset 0 0 0 1px #4496f6}.form-addressState{display:block;flex:1}.shipping-address .address-line{margin-bottom:0}.optimizedCheckout-orderSummary.cart{box-shadow:none;-webkit-box-shadow:none}.cart{border:1px solid #ebebeb;border-radius:4px;display:none;margin:3rem 0 1.5rem;min-height:300px}@media(min-width: 968px){.cart{display:block}}.cart-note{color:#999;font-size:1rem;padding-left:1.5rem}.cart-header{display:table;padding:1.5rem;width:100%}.cart-title{display:table-cell;margin-bottom:0;vertical-align:middle}.cart-header-link{display:table-cell;text-align:right;vertical-align:middle}.cart-header-link .icon{margin:-2px 3px 0 0}.cart-header-link svg{fill:currentColor}.cart-section{border-top:1px solid #ebebeb;padding:1.5rem}.cart-section-heading{font-size:1rem;font-weight:600;margin-bottom:1.5rem}.cart-actions{margin-top:.75rem;text-align:center}.cart-actions .button{margin-bottom:0}.cart-priceItem{display:table;margin-bottom:.75rem;width:100%}.cart-priceItem-label,.cart-priceItem-value{display:table-cell;vertical-align:middle}.cart-priceItem-value{text-align:right}.cart-priceItem-before-value{text-decoration:line-through;color:#999;margin-right:.375rem}.cart-priceItem-postFix{color:#999;display:table-row;font-size:1rem}.cart-priceItem--total{margin-bottom:0}.cart-priceItem--total .cart-priceItem-label{font-size:1.1538461538rem}.cart-priceItem--total .cart-priceItem-value{font-size:2.3076923077rem;font-weight:700;line-height:1.2}.cart-priceItem--total .cart-priceItem-value.header{font-size:1.9230769231rem}.cart-priceItem--subtotal{font-weight:600}@media print{.cart{background-color:#fff;display:block}.cart-header-link{display:none}}.cart-priceItem--totalNote{margin-bottom:0;margin-top:.75rem}.cart-taxItem{display:table;margin-bottom:.75rem;width:100%}.cart-taxItem--subtotal{font-weight:600}.consignment{display:flex;flex-direction:row;margin:.75rem 0 1.5rem;width:100%}.consignment-product-figure{padding:0 1.5rem 0;width:25%}.consignmentList{list-style:none;margin-left:0}.consignmentList ul,.consignmentList ol{list-style:none;margin-bottom:0}.consignment-product-body{display:flex;flex-direction:column;width:100%}.consignment-product-body h5{margin-bottom:.1875rem}.consignment-product-body .form-field{margin-top:.375rem}.customerEmail-container{margin:0 auto;max-width:92.3076923077rem;width:100%}.customerEmail-container:before,.customerEmail-container:after{content:" ";display:table}.customerEmail-container:after{clear:both}@media(min-width: 551px){.customerEmail-container{margin-bottom:.75rem}}@media(min-width: 551px){.customerEmail-container .customerEmail-floating--enabled{margin-top:0;padding-left:8px}.customerEmail-container .customerEmail-floating--enabled button{height:3.6975rem}}.customerEmail-action{padding-left:0;padding-right:0;width:100%;float:left;margin-bottom:.75rem;padding:0}@media(min-width: 551px){.customerEmail-action{margin:1.8rem 0 0 0;padding-left:1.5rem;width:41.6666666667%}}.customerEmail-body{padding-left:0;padding-right:0;width:100%;float:left}@media(min-width: 551px){.customerEmail-body{width:58.3333333333%}}.customerEmail-button{padding:1rem .5rem;width:100%}.customer-login-link{margin-bottom:1.25rem}.stripeCustomerEmail-button{bottom:3px;padding:1rem .5rem;width:100%}.customerHeader .stepHeader-body,.checkout-step--customer .stepHeader-body{overflow:visible}.customerView{align-items:top;display:flex}.customerView-actions{margin-top:0;white-space:nowrap}@media(min-width: 551px){.customerView-actions{margin-top:-.3846153846rem}}.customerView-actions .button{margin-bottom:0}.customerView-body{hyphens:auto;max-width:100%;overflow:hidden;overflow-wrap:break-word;word-break:break-word;word-wrap:break-word;margin-right:1.5rem;width:100%}.checkout-button-container{margin:3rem 0 0}.checkout-button-container p{margin-bottom:1.25rem}.checkout-button-container .checkoutRemote{display:grid;grid-gap:8px;grid-template-columns:repeat(12, 1fr);margin:0}.checkout-button-container .checkoutRemote>div{height:36px;margin-right:0;margin-top:0;width:100%}.checkout-button-container #applepayCheckoutButton button,.checkout-button-container #braintreepaypalcreditCheckoutButton,.checkout-button-container #braintreepaypalCheckoutButton{width:100%}.checkout-button-container .gpay-button.short{background-size:auto;border:none;border-radius:4px;height:36px;min-height:0;min-width:0;width:100%}.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(1){grid-column:span 12;max-width:320px}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(2),.checkout-buttons-auto-layout div:first-child:nth-last-child(2)~div{grid-column:span 6}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(3){grid-column:span 4}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(3)~div:nth-child(n+2){grid-column:span 4}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 6}}@media(min-width: 801px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 3}}@media(min-width: 968px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 6}}@media(min-width: 1261px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 3}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(5){grid-column:span 6}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(5)~div:nth-child(2){grid-column:span 6}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(5)~div:nth-child(n+3){grid-column:span 4}}.checkout-buttons-auto-layout .checkoutRemote>div{grid-column:span 12}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div{grid-column:span 4}}.checkout-separator{align-items:center;display:flex;height:.75rem;justify-content:space-between;margin-top:2rem;text-align:center;width:100%}.checkout-separator span{padding:0 .75rem}.checkout-separator::before,.checkout-separator::after{background-color:#ebebeb;content:" ";display:inline-block;flex-grow:2;height:1px}.checkoutRemote{display:flex;flex-wrap:wrap;margin-left:-0.5rem;margin-right:-0.5rem;margin-top:-1.5rem}.checkoutRemote>div{margin-right:1.5rem;margin-top:1.5rem;z-index:20}.checkoutRemote>.AmazonPayContainer{width:15.3846153846rem;height:51px !important}.checkoutRemote>.AmazonPayContainer #amazonpayCheckoutButton>div{width:100% !important;height:51px !important}.checkoutRemote .gpay-button,.checkoutRemote .gpay-card-info-container{border-radius:4px;height:36px;min-height:36px;max-width:320px}#applepayCheckoutButton button,#braintreepaypalcreditCheckoutButton,#braintreepaypalCheckoutButton{width:160px}#applepayCheckoutButton button{background-color:#000;background-image:-webkit-named-image(apple-pay-logo-white);background-position:50% 50%;background-repeat:no-repeat;background-size:100% 60%;border-radius:4px;height:36px}.checkoutRemote-button{margin-bottom:1rem;margin-left:.5rem;margin-right:.5rem}#checkout-customer-guest .checkoutRemote{margin-bottom:1rem}.checkoutHeader{background-color:#fcfcfc;border-bottom:1px solid #ebebeb;text-align:center}@media(min-width: 551px){.checkoutHeader{min-height:9.2307692308rem}}@media(min-width: 801px){.checkoutHeader{text-align:left}}.checkoutHeader-content{margin:0 auto;max-width:92.3076923077rem;width:100%;padding:1.5rem}.checkoutHeader-content:before,.checkoutHeader-content:after{content:" ";display:table}.checkoutHeader-content:after{clear:both}@media(min-width: 551px){.checkoutHeader-content{padding:3rem}}.checkoutHeader-heading{font-size:2.7692307692rem;color:inherit;margin-bottom:0;word-wrap:break-word}.checkout-steps{counter-reset:li-counter;list-style-type:none;margin:0}@media(min-width: 801px){.checkout-steps{padding-right:6rem}}.checkout-step{border-bottom:1px solid #ebebeb;counter-increment:li-counter;padding:0.6rem 0 0}.checkout-step:last-child{border:0}.checkout-view-header:last-child{margin-bottom:0}@media(min-width: 968px){.checkout-view-content.ng-enter,.checkout-view-content.ng-leave{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.checkout-view-content.ng-enter{max-height:0}.checkout-view-content.ng-leave{max-height:92.3076923077rem}.checkout-view-content.ng-enter.ng-enter-active{max-height:92.3076923077rem}.checkout-view-content.ng-leave.ng-leave-active{max-height:0}.checkout-view-content-enter,.checkout-view-content-exit{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.checkout-view-content-enter{max-height:0}.checkout-view-content-exit{max-height:92.3076923077rem}.checkout-view-content-enter-active{max-height:92.3076923077rem}.checkout-view-content-exit-active{max-height:0}}.checkout-step-info{margin-bottom:1.5rem}.checkout-form{margin:0}@media(min-width: 551px){.checkout-form{margin-left:4.1923076923rem}}@media(min-width: 968px){.checkout-form{margin-left:0}}@media(min-width: 1080px){.checkout-form{margin-left:4.1923076923rem}}.stepHeader-counter{height:2.6923076923rem;width:2.6923076923rem;background-color:#333;border-radius:50%;text-align:center;transition:transform 250ms ease}.stepHeader-counter::before{height:2.6923076923rem;width:2.6923076923rem;color:#fff;content:counter(li-counter);display:inline-block;font-size:1.3846153846rem;line-height:35px;text-align:center}.stepHeader-counter svg{display:none;fill:#fff;padding:0}.stepHeader-counter--complete{transform:scale(0.8)}.stepHeader-counter--complete::before{height:0;width:0;content:""}.stepHeader-counter--complete svg{display:inline-block;padding:.25rem}.stepHeader{align-items:top;display:flex;flex-wrap:wrap;padding:1.25rem 0}@media(min-width: 551px){.stepHeader{flex-wrap:nowrap}}@media(min-width: 968px){.stepHeader{flex-wrap:nowrap}}.stepHeader.is-clickable{cursor:pointer}.stepHeader-figure{align-items:center;display:flex;height:2.6923076923rem;margin-right:1.5rem}.stepHeader-title{margin:0 0 0 1.5rem;min-width:9rem}.remove-checkout-step-numbers li.checkout-step div.stepHeader-counter.icon{display:none}.remove-checkout-step-numbers li.checkout-step .checkout-form,.remove-checkout-step-numbers li.checkout-step div.stepHeader-body,.remove-checkout-step-numbers li.checkout-step h2.stepHeader-title{margin-left:0}.stepHeader-body{hyphens:auto;max-width:100%;overflow:hidden;overflow-wrap:break-word;word-break:break-word;word-wrap:break-word;color:#333;margin-left:4.1923076923rem;margin-top:.7692307692rem;order:3;width:100%}@media(min-width: 551px){.stepHeader-body{margin-left:0;order:inherit}}@media(min-width: 801px){.stepHeader-body{margin-left:4.1923076923rem}}@media(min-width: 968px){.stepHeader-body{margin-left:0}}.stepHeader-actions{align-self:flex-start;margin-left:auto;margin-top:.3846153846rem}@media(min-width: 551px){.stepHeader-actions{margin-left:1.5rem}}.stepHeader-actions .button{margin-bottom:0;border:none}.stepHeader-actions .button:hover,.stepHeader-actions .button:focus{background:none;box-shadow:none;outline:none}.checkout-suggestion{margin:0}@media(min-width: 551px){.checkout-suggestion{margin-left:4.1923076923rem}}@media(min-width: 968px){.checkout-suggestion{margin-left:0}}@media(min-width: 1080px){.checkout-suggestion{margin-left:4.1923076923rem}}.checkoutSuggestion{align-items:center;border:1px solid #ddd;border-radius:4px;cursor:default;display:flex;flex-direction:column;justify-content:space-between;margin:1.5rem 0 0 0;padding:1.5rem;width:100%}@media(min-width: 801px){.checkoutSuggestion{flex-direction:row}}.checkoutSuggestion-message{color:#333;font-weight:400;margin:0 0 1.5rem 0;width:100%}@media(min-width: 801px){.checkoutSuggestion-message{margin:0 1.5rem 0 0;width:auto}}.checkoutSuggestion-button{color:#fff;margin:0;text-transform:initial;white-space:nowrap;width:100%}@media(min-width: 801px){.checkoutSuggestion-button{width:auto}}.checkoutSuggestion-button:hover{color:#fff}.checkoutSuggestion-button--bolt{background-color:#006cff;border-color:#006cff}.checkoutSuggestion-button--bolt:hover{background-color:#005ad5;border-color:#005ad5}.checkoutSuggestion-button-icon--bolt{height:1rem;margin-right:.375rem}.genericModal-body-iframe--center{display:block;margin-left:auto;margin-right:auto}.instrumentModal-trigger{color:#4496f6;display:block;margin-bottom:.75rem;margin-left:auto;margin-right:0}.instrumentModal-instrumentAccountExternalId,.instrumentModal-instrumentAccountNumber,.instrumentModal-instrumentCardType{margin-left:.75rem}.instrumentModal-instrumentExpiry--expired{color:#ad0000}.instrumentSelect{position:relative;width:100%}.instrumentSelect-button{height:auto}.instrumentSelect-dropdownMenu{max-height:14.2307692308rem;max-width:none;overflow:scroll}.dropdownMenu .instrumentSelect-dropdownMenu{display:block;left:auto;position:static}.instrumentSelect-option{padding:0}.instrumentSelect-option>button{display:block;padding:.75rem 1rem;width:100%}.instrumentSelect-option--addNew>button{color:#4496f6}.instrumentSelect-option--selected{background-color:#4496f6}.instrumentSelect-option--selected>button{color:#fff}.instrumentSelect-option--selected:hover{background-color:#4496f6}.instrumentSelect-details{align-items:center;display:flex}.instrumentSelect-account,.instrumentSelect-card{flex-grow:2;margin-left:.75rem;margin-right:.75rem;text-align:left}.instrumentSelect-bank{display:flex;flex-direction:column;align-items:start;margin-left:.75rem;margin-right:.75rem}.instrumentSelect-expiry{margin-right:1.5384615385rem;text-align:right}.instrumentSelect-issuer{flex-grow:2;margin-right:1.5384615385rem;text-align:left}.instrumentSelect-expiry--expired{color:#ad0000}.instrumentSelect-details--expired{cursor:not-allowed}.instrumentSelect-note p:last-child{margin-bottom:0}.mollie-instrument-card{margin-left:.6923076923rem;margin-top:-1.5384615385rem;overflow:auto;width:80%}.mollie-instrument-list{display:flex !important;justify-content:flex-end}.mollie-instrument-left{margin-right:auto}.loadingSpinner .loadingOverlay{background-color:rgba(0,0,0,0)}.paymentProviderHeader-container{align-items:start;display:flex;justify-content:space-between}.paymentProviderHeader-container-googlePay{align-items:center}.paymentProviderHeader-subtitleContainer{flex-basis:100%}.paymentProviderHeader-nameContainer{display:flex;justify-content:space-between;flex-wrap:wrap}.paymentProviderHeader-img{align-self:center;display:flex;height:1.9230769231rem;object-fit:contain}.paymentProviderHeader-img+.paymentProviderHeader-name{margin-left:.75rem;white-space:nowrap}.paymentProviderHeader-img-applePay{height:2.3076923077rem;margin-top:.1875rem;margin-left:.375rem}.paymentProviderHeader-img-googlePay{height:2.3076923077rem}.googlePay-logo{height:3.0769230769rem}@media(min-width: 551px){.paymentProviderHeader-cc{align-items:flex-end;display:flex;flex-grow:0;flex-shrink:2}}.paymentProviderHeader-name{align-items:flex-end;align-self:start;display:flex;flex-grow:1;flex-shrink:1}@media(max-width: 481px){div[data-test=payment-method-sezzle] .paymentProviderHeader-name{visibility:hidden}}.paymentMethod--creditCard,.paymentMethod--hosted,.paymentMethod--walletButton{clear:both;padding:.6666666667rem 0}.button-masterpass-mark,.button-masterpass{background-color:#fcfcfc;background-image:url(https://masterpass.com/dyn/img/btn/global/mp_chk_btn_180x042px.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#fcfcfc;border-radius:.3846153846rem;height:3.2307692308rem;padding:0;width:13.8461538462rem}.button-masterpass{cursor:pointer;display:none}.button-masterpass-mark{cursor:default;margin:auto}body.klarna-payments-fso-open{scroll-behavior:auto}.stripe-sepa-mandate-disclaimer{margin-bottom:0;padding-bottom:1.5384615385rem}#stripe-card-field--invalid{border-color:#fa755a}#stripe-card-field--webkit-autofill{background-color:#fefde5 !important}.submitButtonContainer{margin-left:0;width:100%}.checkoutcom-sepa-column-container{display:flex;flex:1;flex-basis:100%;flex-direction:row;margin-bottom:0;padding-bottom:.3846153846rem}.checkoutcom-sepa-column-content{width:50%}.checkoutcom-sepa-title{margin-bottom:0;padding-bottom:.3846153846rem}.checkoutcom-sepa-line{margin-bottom:0}.payment-submit-button-bolt{font-size:16px}.payment-submit-button-bolt-icon{height:.9230769231rem;margin-right:.6153846154rem;width:.9230769231rem}.productList{list-style:none;margin-left:0;margin:0}.productList ul,.productList ol{list-style:none;margin-bottom:0}.productList-item{margin-bottom:3rem}@media(min-width: 551px){.productList-item{margin-bottom:1.5rem}}.productList-item:last-child{margin-bottom:0}.productList-item:nth-child(n+5){display:none}.productList-item.is-visible:nth-child(n+5){display:list-item}.product{display:flex;flex-wrap:wrap}@media(min-width: 551px){.product{flex-wrap:nowrap}}.product-figure{margin:0;padding-right:1.5rem;width:25%}.product-body{order:2;padding-right:0;width:100%;word-wrap:break-word}@media(min-width: 551px){.product-body{padding-right:.375rem;width:50%}}.product-title{margin-bottom:.1875rem}.product-options{color:#999;font-size:.8461538462rem;margin:0}.product-description{margin-top:.375rem}.product-actions{align-self:center;margin-left:auto}@media(min-width: 551px){.product-actions{align-self:flex-start;order:3;text-align:right;width:25%;word-wrap:break-word}}.product-price--beforeDiscount{text-decoration:line-through}.spamProtection-container{margin:0}@media(min-width: 551px){.spamProtection-container{margin-left:4.1923076923rem}}@media(min-width: 968px){.spamProtection-container{margin-left:0}}@media(min-width: 1080px){.spamProtection-container{margin-left:4.1923076923rem}}.spamProtection-panel{background-color:#fff;border:1px solid #ebebeb;border-radius:4px;display:flex;min-height:10rem;padding:.75rem;text-align:center}.spamProtection-panel-message{align-self:center;flex:1;margin:0}.storeCreditOverlay{align-items:center;background-color:hsla(0,0%,100%,.9);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:100}.storeCreditOverlay-text{margin:0;text-align:center}.orderConfirmation{padding:3rem 0 0}.orderConfirmation-section{border-bottom:1px solid #ebebeb;margin-bottom:2.5rem;padding:0 0 2.5rem}.orderConfirmation-section *:last-child{margin-bottom:0}.continueButtonContainer{margin-top:3rem}.trackingCodeIframe{left:-5000px;position:absolute}@media print{.guest-signup{display:none}.continueButtonContainer{display:none}}.widget{outline:0;padding-bottom:.75rem;width:100%}.widget--paymentMethod{background-color:#fcfcfc;border:1px solid #ddd;border-radius:4px;list-style:none;margin-left:0;padding-bottom:0}.widget--braintree .cardDetails{margin-bottom:0}.widget--opy{padding-bottom:0}.widget-header{display:block;padding:1rem 2.25rem 1rem 3.75rem}.widget-body{margin-left:3.75rem;margin-right:2.25rem}.widget-body.ng-enter,.widget-body.ng-leave{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.widget-body.ng-enter{max-height:0}.widget-body.ng-leave{max-height:26.9230769231rem}.widget-body.ng-enter.ng-enter-active{max-height:26.9230769231rem}.widget-body.ng-leave.ng-leave-active{max-height:0}.widget-body-enter,.widget-body-exit{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.widget-body-enter{max-height:0}.widget-body-exit{max-height:26.9230769231rem}.widget-body-enter-active{max-height:26.9230769231rem}.widget-body-exit-active{max-height:0}.widget-container{padding:.6666666667rem 0}.widget-bodyCard{align-items:center;display:flex;flex-direction:column;justify-content:flex-start}.widget-header-googlepay{text-align:center}.widget-input--stripev3{color:#000;font:400 1.1rem/normal sans-serif;padding:1rem}.widget-input--stripev3::placeholder{color:#757575;font:400 1.1rem/normal sans-serif}.widget--stripev3{margin-bottom:1.5384615385rem;margin-top:1.5384615385rem;padding:1rem}@media screen and (max-width: 414px){.widget--stripev3{margin:1.5384615385rem 0 1.5384615385rem 0;padding:1rem 0 1rem 1rem;width:20rem}}@media screen and (max-width: 375px){.widget--stripev3{margin:1.5384615385rem -2rem 1.5384615385rem -2rem;padding:1rem 0 1rem 1rem;width:20rem}}@media screen and (max-width: 320px){.widget--stripev3{margin:1.5384615385rem -2rem 1.5384615385rem -3rem;padding:1rem 0 1rem .25rem;width:19rem}}.StripeElement--focus{border-color:#4496f6;box-shadow:none}.widget-link-amazonpay{padding-bottom:.375rem}.signout-link{padding-bottom:1.5rem;width:100%}.react-datepicker{border:none;color:inherit;font-family:inherit;font-size:inherit;position:relative}.react-datepicker__current-month{color:inherit;font-size:inherit;font-weight:inherit}.react-datepicker__day,.react-datepicker__day:hover{border-radius:50%}.react-datepicker__day--today{background-color:rgba(0,0,0,0);font-weight:700}.react-datepicker__day--keyboard-selected,.react-datepicker__day--keyboard-selected:hover,.react-datepicker__day--selected,.react-datepicker__day--selected:hover{background-color:#4496f6;border-radius:50%}.react-datepicker-popper{background-color:#fff;box-shadow:0 1px 4px rgba(95,95,95,.14);color:#5f5f5f;font-size:1rem;padding:.75rem;text-align:center;z-index:500}.react-datepicker__triangle{display:none}.react-datepicker__header{background:none;border:none}.react-datepicker__day-name{color:#999;font-size:.8461538462rem;font-weight:600;text-transform:uppercase}.datepicker{background-color:#fff;box-shadow:0 1px 4px rgba(95,95,95,.14);color:#5f5f5f;font-size:1rem;padding:1.5rem 0;text-align:center;z-index:500}.datepicker-attachment{position:absolute}.datepicker-month{font-size:1.1538461538rem;margin:0}.datepicker-back,.datepicker-next{color:#999;cursor:default;font-weight:700;padding:0}.datepicker-back{float:left;margin-left:1.5rem}.datepicker-back::before{content:"<";display:block}.datepicker-next{float:right;margin-right:1.5rem}.datepicker-next::before{content:">";display:block}.datepicker-days{border-collapse:separate;font-size:1rem;margin:1.5rem 1.5rem 0;table-layout:fixed}.datepicker-days-head{line-height:1.25}.datepicker-day-name{color:#999;font-size:.8461538462rem;font-weight:600;text-transform:uppercase}.datepicker-day{cursor:pointer;height:2.25rem;line-height:1;margin:.3846153846rem;position:relative;text-align:center;width:2.25rem;z-index:5}.datepicker-day:hover::before{background-color:#ebebeb}.datepicker-day.is-selected{color:#fff;cursor:pointer}.datepicker-day.is-selected::before,.datepicker-day.is-selected:hover::before{background-color:#4496f6}.datepicker-day::before,.datepicker-day.is-selected::before{border-radius:50%;bottom:.1538461538rem;content:"";left:.1538461538rem;position:absolute;right:.1538461538rem;top:.1538461538rem;z-index:-1}.datepicker-day.is-disabled{color:#999;cursor:default}.checkout-ach-form{display:flex;flex-flow:row wrap;margin:0 -4px;padding:.6666666667rem 0}.checkout-ach-form .mandate-text{padding:0 4px;margin-top:.75rem}.checkout-ach-form .form-fieldset{margin:0 4px}.checkout-ach-form .dynamic-form-field{margin-bottom:.75rem;padding:0 4px;width:100%}@media(min-width: 551px){.checkout-ach-form .dynamic-form-field--firstName,.checkout-ach-form .dynamic-form-field--lastName,.checkout-ach-form .dynamic-form-field--city{flex-basis:50%}}@media(min-width: 551px){.checkout-ach-form .dynamic-form-field--city{flex-basis:30%}}@media(min-width: 551px){.checkout-ach-form .dynamic-form-field--postalCode{flex-basis:70%}}.checkout-ach-form__instrument{width:100%;margin-bottom:.75rem}.dynamic-form-field--ratepayPhoneCountryCode{display:inline-flex;width:26%}.dynamic-form-field--ratepayPhoneNumber{display:inline-flex;width:calc(74% - .5em);margin-left:.5em}.dynamic-form-field--ratepayPhoneNumber>div{width:100%}@media only screen and (max-width: 500px){.dynamic-form-field--ratepayPhoneNumber{display:block;width:100%;margin:0}.dynamic-form-field--ratepayPhoneCountryCode{display:block;width:100%}}.checkout-page-skeleton--cart .item,.checkout-page-skeleton--cart .item--first,.checkout-page-skeleton--cart .item--product,.checkout-page-skeleton--cart .item--last,.checkout-page-skeleton--cart .item--coupon,.checkout-page-skeleton--cart .item--total,.checkout-page-skeleton--cart .item--tax,.checkout-page-skeleton .subscription,.order-confirmation-page-skeleton .text .line,.order-confirmation-page-skeleton .text{background:none;animation:none}@keyframes lightColorTransition{0%,100%{background-color:#ebebeb}50%{background-color:#fcfcfc}}.animated-grey-box,.checkout-page-skeleton div,.address-form-skeleton div,.checklist-skeleton div,.order-confirmation-page-skeleton div,.walletbuttons-skeleton div{background:#ebebeb;border-radius:4px;content:" ";display:block;height:3.6975rem;margin-bottom:1.5rem;animation:lightColorTransition 4000ms infinite cubic-bezier(0.13, 0.615, 0.315, 0.915)}.walletbuttons-skeleton div{height:36px;margin-bottom:0}.order-confirmation-page-skeleton .thankyou{margin-top:3rem;width:38.2%}.order-confirmation-page-skeleton .line-1,.order-confirmation-page-skeleton .line-2{width:100%;height:.8616rem;margin-bottom:.75rem}.order-confirmation-page-skeleton .line-2{width:22%;margin-bottom:3rem}.order-confirmation-page-skeleton .continue{width:120px}.order-confirmation-page-skeleton .text{height:auto}.order-confirmation-page-skeleton .text div{height:1.220175rem;margin-bottom:.375rem}.order-confirmation-page-skeleton .text .t1{width:20%}.order-confirmation-page-skeleton .text .t2{width:8%}.order-confirmation-page-skeleton .text .t3{width:15%}.order-confirmation-page-skeleton .text .t4{width:25%}.order-confirmation-page-skeleton .text .first-line{margin-bottom:.75rem}.order-confirmation-page-skeleton .text .line{display:flex;gap:.375rem}.order-confirmation-page-skeleton .text .line:first-child{margin-bottom:1.5rem}.order-confirmation-page-skeleton .text .line:last-child{margin-bottom:4.5rem}.checkout-page-skeleton .title--first,.checkout-page-skeleton .mobile-title--first{margin-top:3rem;width:120px}.checkout-page-skeleton .title{width:100px;height:2.44035rem;margin:3rem 0 3.75rem}.checkout-page-skeleton .textbox{width:100%}.checkout-page-skeleton .subscription,.checkout-page-skeleton .terms--1,.checkout-page-skeleton .terms--2{height:.8616rem;margin-bottom:.75rem}.checkout-page-skeleton .subscription{width:33%;display:flex;gap:.7395rem}.checkout-page-skeleton .subscription div{background:#ebebeb;height:100%}.checkout-page-skeleton .subscription .checkbox{width:.7395rem}.checkout-page-skeleton .subscription .description{flex-grow:3}.checkout-page-skeleton .terms--1{width:55%}.checkout-page-skeleton .terms--2{width:44%;margin-bottom:4.125rem}.checkout-page-skeleton .walletbutton--tagline{margin:3rem 0 .75rem;height:.8616rem;width:45%}.checkout-page-skeleton .walletbutton{height:3.32775rem}.checkout-page-skeleton .walletbutton--divider{height:1.479rem;width:5%;margin:auto}.checkout-page-skeleton .mobile-title--first,.checkout-page-skeleton .mobile-title--2,.checkout-page-skeleton .mobile-title--3,.checkout-page-skeleton .mobile-title--4{margin-top:2.25rem;margin-bottom:.75rem;height:2.44035rem}.checkout-page-skeleton .mobile-title--2{width:100px}.checkout-page-skeleton .mobile-title--3{width:80px}.checkout-page-skeleton .mobile-title--4{width:105px}.checkout-page-skeleton .divider{border-bottom:1px solid #ebebeb;background:none;border-radius:0;height:0}.checkout-page-skeleton .divider:last-child{margin-top:3rem}.checkout-page-skeleton--cart{min-height:479px;padding:1.5rem}.checkout-page-skeleton--cart .item,.checkout-page-skeleton--cart .item--first,.checkout-page-skeleton--cart .item--product,.checkout-page-skeleton--cart .item--last,.checkout-page-skeleton--cart .item--coupon,.checkout-page-skeleton--cart .item--total,.checkout-page-skeleton--cart .item--tax{display:flex;justify-content:space-between;height:auto;margin-bottom:1.5rem}.checkout-page-skeleton--cart .item div,.checkout-page-skeleton--cart .item--first div,.checkout-page-skeleton--cart .item--product div,.checkout-page-skeleton--cart .item--last div,.checkout-page-skeleton--cart .item--coupon div,.checkout-page-skeleton--cart .item--total div,.checkout-page-skeleton--cart .item--tax div{width:18%;height:.9693rem;margin-bottom:0}.checkout-page-skeleton--cart .item--first{margin-bottom:3rem}.checkout-page-skeleton--cart .item--first div{width:32%;height:1.2924rem}.checkout-page-skeleton--cart .item--product .figure{width:22%;height:5.54625rem;margin-bottom:1.5rem}.checkout-page-skeleton--cart .item--product .name{width:40%}.checkout-page-skeleton--cart .item--coupon{padding-bottom:.75rem}.checkout-page-skeleton--cart .item--coupon div{width:48%}.checkout-page-skeleton--cart .item--total{padding:1.5rem 0}.checkout-page-skeleton--cart .item--total div{width:26%}.checkout-page-skeleton--cart .item--tax{padding-top:.75rem}.checkout-page-skeleton--cart .item--tax div{width:40%}.checkout-page-skeleton--cart .item--last{margin-bottom:0}.checkout-page-skeleton--cartdrawer{display:flex;justify-content:space-between;align-items:center;height:50px;width:100%}.checkout-page-skeleton--cartdrawer .animated-grey-box{margin-bottom:0}.checkout-page-skeleton--cartdrawer .product{display:flex;align-items:center;gap:.75rem;width:50%}.checkout-page-skeleton--cartdrawer .product .figure{width:50px;height:50px}.checkout-page-skeleton--cartdrawer .product .details{display:flex;flex-direction:column;width:50%}.checkout-page-skeleton--cartdrawer .product .details .name{width:50%;height:1.10925rem;margin-bottom:.375rem}.checkout-page-skeleton--cartdrawer .product .details .description{width:100%;height:.7395rem}.checkout-page-skeleton--cartdrawer .more{width:4.437rem;height:1.663875rem}.address-form-skeleton{display:flex;justify-content:space-between;gap:.75rem}.address-form-skeleton div{margin-bottom:.75rem;height:2.44035rem}.address-form-skeleton .label{width:140px;height:.9693rem}.address-form-skeleton .name{flex-grow:1}.address-form-skeleton .address{width:100%;margin-bottom:3rem}.checklist-skeleton div{width:100%;margin-bottom:.75rem;height:2.44035rem}.shippingOptions-skeleton{margin-left:0}.layout{margin:0 auto;max-width:92.3076923077rem;width:100%;min-height:15.3846153846rem;padding:0 1.5rem 7.5rem}.layout:before,.layout:after{content:" ";display:table}.layout:after{clear:both}@media(min-width: 968px){.layout{padding-bottom:1.5rem}}.layout-cart{padding-left:1.1538461538rem;padding-right:1.1538461538rem;width:100%;float:left}@media(min-width: 968px){.layout-cart{width:41.6666666667%}}@media(min-width: 1261px){.layout-cart{width:33.3333333333%}}.layout-cart.is-sticky{position:sticky;top:0}.layout-main{padding-left:1.1538461538rem;padding-right:1.1538461538rem;width:100%;float:left}@media(min-width: 968px){.layout-main{width:58.3333333333%}}@media(min-width: 1261px){.layout-main{width:66.6666666667%}}@media(min-width: 1261px){.layout-main{padding-right:6rem}}@media print{@page{margin:1.5rem 0;size:auto}.layout-cart{display:block;float:none;page-break-inside:auto;position:static !important;width:75%}.layout-main{float:none;width:75%}}.themeV2 .header,.themeV2 .header-secondary,.themeV2 .sub-header{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1.9230769231rem;font-weight:700}.themeV2 .header-secondary{color:#757575}.themeV2 .sub-header{font-size:1.1538461538rem}.themeV2 .body-regular,.themeV2 .body-cta,.themeV2 .body-medium,.themeV2 .body-bold{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400}.themeV2 .body-cta{color:#476bef}.themeV2 .body-medium{font-weight:500}.themeV2 .body-bold{font-weight:700}.themeV2 .sub-text,.themeV2 .sub-text-medium,.themeV2 .sub-text-bold{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:.8461538462rem;font-weight:400}.themeV2 .sub-text-medium{color:#757575;font-weight:500}.themeV2 .sub-text-bold{font-weight:700}.themeV2 .body-bold.button--primary:not(:disabled),.themeV2 .body-medium.button--primary:not(:disabled){color:#fff}.themeV2 .form-checkbox+.form-label.body-regular,.themeV2 .form-radio+.form-label.body-regular{color:#000;font-size:1rem;font-weight:400}.themeV2 .shippingOptionLabel .shippingOption-price.body-medium,.themeV2 .shippingOptionLabel .shippingOption-desc.body-medium{font-size:1rem;font-weight:500}.themeV2 .body-medium small{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:500}.themeV2 .add-consignment-button.body-regular{color:#000}.themeV2 .floating-select,.themeV2 .floating-input{background-color:#fcfcfc}.themeV2 .form-field:not(.form-field--error) .floating-input:not(:focus),.themeV2 .form-field:not(.form-field--error) .floating-select:not(:focus),.themeV2 .form-field:not(.form-field--error) .floating-textarea{border-color:#ddd}.themeV2 .form-checklist-checkbox~.form-label::before,.themeV2 .form-checklist-checkbox~.form-label::after{background-color:#fff}.themeV2 .form-checklist-checkbox~.form-label::after{transform:scale(0.36)}.themeV2 .form-checklist-checkbox:checked~.form-label::before{background-color:#4496f6}.themeV2{background-color:#f5f5f5}.themeV2 .layout{padding:0}@media(min-width: 551px){.themeV2 .layout{padding:0 1.5rem 7.5rem}}.themeV2 .layout-main{padding:0}@media(min-width: 551px){.themeV2 .layout-main{padding-left:1.1538461538rem;padding-right:1.1538461538rem;width:100%;float:left}}@media(min-width: 968px){.themeV2 .layout-main{width:58.3333333333%}}@media(min-width: 1261px){.themeV2 .layout-main{width:66.6666666667%}}@media(min-width: 1261px){.themeV2 .layout-main{padding-right:1.5rem}}.themeV2 .cart{border:none}.themeV2 .checkout-separator::before,.themeV2 .checkout-separator::after{background-color:#000}.themeV2 .checkout-steps{margin-top:2rem}.themeV2 .checkout-step{background-color:#fff;border-bottom:none;padding:2rem;margin:1.5rem 0}.themeV2 .stepHeader{flex-wrap:wrap;padding:0}.themeV2 .stepHeader .stepHeader-body{order:3;width:100%;margin-left:0;margin-top:.7692307692rem}.themeV2 .stepHeader .stepHeader-actions{margin-left:auto;align-self:flex-start}.themeV2 .stepHeader .stepHeader-figure{align-items:flex-end}@media(min-width: 968px){.themeV2 .checkout-button-container{padding-right:6rem}}.themeV2 .checkout-step--customer .customerEmail-container{display:flex}@media(min-width: 968px){.themeV2 .checkout-step--customer .customerEmail-container{flex-direction:row}.themeV2 .checkout-step--customer .customerEmail-body{width:80%}}.themeV2 .layout-cart .cart-priceItem:last-child{margin-bottom:0}@media(min-width: 968px){.themeV2 .layout-cart{position:sticky;right:auto;left:auto;top:0;bottom:0}} +.react-datepicker__navigation-icon::before,.react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view--down-arrow{border-color:#ccc;border-style:solid;border-width:3px 3px 0 0;content:"";display:block;height:9px;position:absolute;top:6px;width:9px}.react-datepicker-wrapper{display:inline-block;padding:0;border:0}.react-datepicker{font-family:"Helvetica Neue",helvetica,arial,sans-serif;font-size:.8rem;background-color:#fff;color:#000;border:1px solid #aeaeae;border-radius:.3rem;display:inline-block;position:relative;line-height:initial}.react-datepicker--time-only .react-datepicker__time-container{border-left:0}.react-datepicker--time-only .react-datepicker__time,.react-datepicker--time-only .react-datepicker__time-box{border-bottom-left-radius:.3rem;border-bottom-right-radius:.3rem}.react-datepicker-popper{z-index:1;line-height:0}.react-datepicker-popper .react-datepicker__triangle{stroke:#aeaeae}.react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle{fill:#f0f0f0;color:#f0f0f0}.react-datepicker-popper[data-placement^=top] .react-datepicker__triangle{fill:#fff;color:#fff}.react-datepicker__header{text-align:center;background-color:#f0f0f0;border-bottom:1px solid #aeaeae;border-top-left-radius:.3rem;padding:8px 0;position:relative}.react-datepicker__header--time{padding-bottom:8px;padding-left:5px;padding-right:5px}.react-datepicker__header--time:not(.react-datepicker__header--time--only){border-top-left-radius:0}.react-datepicker__header:not(.react-datepicker__header--has-time-select){border-top-right-radius:.3rem}.react-datepicker__year-dropdown-container--select,.react-datepicker__month-dropdown-container--select,.react-datepicker__month-year-dropdown-container--select,.react-datepicker__year-dropdown-container--scroll,.react-datepicker__month-dropdown-container--scroll,.react-datepicker__month-year-dropdown-container--scroll{display:inline-block;margin:0 15px}.react-datepicker__current-month,.react-datepicker-time__header,.react-datepicker-year-header{margin-top:0;color:#000;font-weight:bold;font-size:.944rem}h2.react-datepicker__current-month{padding:0;margin:0}.react-datepicker-time__header{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.react-datepicker__navigation{align-items:center;background:none;display:flex;justify-content:center;text-align:center;cursor:pointer;position:absolute;top:2px;padding:0;border:none;z-index:1;height:32px;width:32px;text-indent:-999em;overflow:hidden}.react-datepicker__navigation--previous{left:2px}.react-datepicker__navigation--next{right:2px}.react-datepicker__navigation--next--with-time:not(.react-datepicker__navigation--next--with-today-button){right:85px}.react-datepicker__navigation--years{position:relative;top:0;display:block;margin-left:auto;margin-right:auto}.react-datepicker__navigation--years-previous{top:4px}.react-datepicker__navigation--years-upcoming{top:-4px}.react-datepicker__navigation:hover *::before{border-color:rgb(165.75, 165.75, 165.75)}.react-datepicker__navigation-icon{position:relative;top:-1px;font-size:20px;width:0}.react-datepicker__navigation-icon--next{left:-2px}.react-datepicker__navigation-icon--next::before{transform:rotate(45deg);left:-7px}.react-datepicker__navigation-icon--previous{right:-2px}.react-datepicker__navigation-icon--previous::before{transform:rotate(225deg);right:-7px}.react-datepicker__month-container{float:left}.react-datepicker__year{margin:.4rem;text-align:center}.react-datepicker__year-wrapper{display:flex;flex-wrap:wrap;max-width:180px}.react-datepicker__year .react-datepicker__year-text{display:inline-block;width:4rem;margin:2px}.react-datepicker__month{margin:.4rem;text-align:center}.react-datepicker__month .react-datepicker__month-text,.react-datepicker__month .react-datepicker__quarter-text{display:inline-block;width:4rem;margin:2px}.react-datepicker__input-time-container{clear:both;width:100%;float:left;margin:5px 0 10px 15px;text-align:left}.react-datepicker__input-time-container .react-datepicker-time__caption{display:inline-block}.react-datepicker__input-time-container .react-datepicker-time__input-container{display:inline-block}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input{display:inline-block;margin-left:10px}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input{width:auto}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-inner-spin-button,.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]{-moz-appearance:textfield}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__delimiter{margin-left:5px;display:inline-block}.react-datepicker__time-container{float:right;border-left:1px solid #aeaeae;width:85px}.react-datepicker__time-container--with-today-button{display:inline;border:1px solid #aeaeae;border-radius:.3rem;position:absolute;right:-87px;top:0}.react-datepicker__time-container .react-datepicker__time{position:relative;background:white;border-bottom-right-radius:.3rem}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box{width:85px;overflow-x:hidden;margin:0 auto;text-align:center;border-bottom-right-radius:.3rem}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list{list-style:none;margin:0;height:calc(195px + .85rem);overflow-y:scroll;padding-right:0;padding-left:0;width:100%;box-sizing:content-box}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item{height:30px;padding:5px 10px;white-space:nowrap}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item:hover{cursor:pointer;background-color:#f0f0f0}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected{background-color:#216ba5;color:white;font-weight:bold}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected:hover{background-color:#216ba5}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled{color:#ccc}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled:hover{cursor:default;background-color:transparent}.react-datepicker__week-number{color:#ccc;display:inline-block;width:1.7rem;line-height:1.7rem;text-align:center;margin:.166rem}.react-datepicker__week-number.react-datepicker__week-number--clickable{cursor:pointer}.react-datepicker__week-number.react-datepicker__week-number--clickable:not(.react-datepicker__week-number--selected):hover{border-radius:.3rem;background-color:#f0f0f0}.react-datepicker__week-number--selected{border-radius:.3rem;background-color:#216ba5;color:#fff}.react-datepicker__week-number--selected:hover{background-color:rgb(28.75, 93.2196969697, 143.75)}.react-datepicker__day-names{white-space:nowrap;margin-bottom:-8px}.react-datepicker__week{white-space:nowrap}.react-datepicker__day-name,.react-datepicker__day,.react-datepicker__time-name{color:#000;display:inline-block;width:1.7rem;line-height:1.7rem;text-align:center;margin:.166rem}.react-datepicker__day,.react-datepicker__month-text,.react-datepicker__quarter-text,.react-datepicker__year-text{cursor:pointer}.react-datepicker__day:not([aria-disabled=true]):hover,.react-datepicker__month-text:not([aria-disabled=true]):hover,.react-datepicker__quarter-text:not([aria-disabled=true]):hover,.react-datepicker__year-text:not([aria-disabled=true]):hover{border-radius:.3rem;background-color:#f0f0f0}.react-datepicker__day--today,.react-datepicker__month-text--today,.react-datepicker__quarter-text--today,.react-datepicker__year-text--today{font-weight:bold}.react-datepicker__day--highlighted,.react-datepicker__month-text--highlighted,.react-datepicker__quarter-text--highlighted,.react-datepicker__year-text--highlighted{border-radius:.3rem;background-color:#3dcc4a;color:#fff}.react-datepicker__day--highlighted:not([aria-disabled=true]):hover,.react-datepicker__month-text--highlighted:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--highlighted:not([aria-disabled=true]):hover,.react-datepicker__year-text--highlighted:not([aria-disabled=true]):hover{background-color:rgb(49.8551020408, 189.6448979592, 62.5632653061)}.react-datepicker__day--highlighted-custom-1,.react-datepicker__month-text--highlighted-custom-1,.react-datepicker__quarter-text--highlighted-custom-1,.react-datepicker__year-text--highlighted-custom-1{color:magenta}.react-datepicker__day--highlighted-custom-2,.react-datepicker__month-text--highlighted-custom-2,.react-datepicker__quarter-text--highlighted-custom-2,.react-datepicker__year-text--highlighted-custom-2{color:green}.react-datepicker__day--holidays,.react-datepicker__month-text--holidays,.react-datepicker__quarter-text--holidays,.react-datepicker__year-text--holidays{position:relative;border-radius:.3rem;background-color:#ff6803;color:#fff}.react-datepicker__day--holidays .overlay,.react-datepicker__month-text--holidays .overlay,.react-datepicker__quarter-text--holidays .overlay,.react-datepicker__year-text--holidays .overlay{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background-color:#333;color:#fff;padding:4px;border-radius:4px;white-space:nowrap;visibility:hidden;opacity:0;transition:visibility 0s,opacity .3s ease-in-out}.react-datepicker__day--holidays:not([aria-disabled=true]):hover,.react-datepicker__month-text--holidays:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--holidays:not([aria-disabled=true]):hover,.react-datepicker__year-text--holidays:not([aria-disabled=true]):hover{background-color:rgb(207, 82.9642857143, 0)}.react-datepicker__day--holidays:hover .overlay,.react-datepicker__month-text--holidays:hover .overlay,.react-datepicker__quarter-text--holidays:hover .overlay,.react-datepicker__year-text--holidays:hover .overlay{visibility:visible;opacity:1}.react-datepicker__day--selected,.react-datepicker__day--in-selecting-range,.react-datepicker__day--in-range,.react-datepicker__month-text--selected,.react-datepicker__month-text--in-selecting-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--selected,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--selected,.react-datepicker__year-text--in-selecting-range,.react-datepicker__year-text--in-range{border-radius:.3rem;background-color:#216ba5;color:#fff}.react-datepicker__day--selected:not([aria-disabled=true]):hover,.react-datepicker__day--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__day--in-range:not([aria-disabled=true]):hover,.react-datepicker__month-text--selected:not([aria-disabled=true]):hover,.react-datepicker__month-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__month-text--in-range:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--selected:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--in-range:not([aria-disabled=true]):hover,.react-datepicker__year-text--selected:not([aria-disabled=true]):hover,.react-datepicker__year-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__year-text--in-range:not([aria-disabled=true]):hover{background-color:rgb(28.75, 93.2196969697, 143.75)}.react-datepicker__day--keyboard-selected,.react-datepicker__month-text--keyboard-selected,.react-datepicker__quarter-text--keyboard-selected,.react-datepicker__year-text--keyboard-selected{border-radius:.3rem;background-color:rgb(186.25, 217.0833333333, 241.25);color:rgb(0, 0, 0)}.react-datepicker__day--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__month-text--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__year-text--keyboard-selected:not([aria-disabled=true]):hover{background-color:rgb(28.75, 93.2196969697, 143.75)}.react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__month-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__quarter-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__year-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range){background-color:rgba(33, 107, 165, 0.5)}.react-datepicker__month--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range){background-color:#f0f0f0;color:#000}.react-datepicker__day--disabled,.react-datepicker__month-text--disabled,.react-datepicker__quarter-text--disabled,.react-datepicker__year-text--disabled{cursor:default;color:#ccc}.react-datepicker__day--disabled .overlay,.react-datepicker__month-text--disabled .overlay,.react-datepicker__quarter-text--disabled .overlay,.react-datepicker__year-text--disabled .overlay{position:absolute;bottom:70%;left:50%;transform:translateX(-50%);background-color:#333;color:#fff;padding:4px;border-radius:4px;white-space:nowrap;visibility:hidden;opacity:0;transition:visibility 0s,opacity .3s ease-in-out}.react-datepicker__input-container{position:relative;display:inline-block;width:100%}.react-datepicker__input-container .react-datepicker__calendar-icon{position:absolute;padding:.5rem;box-sizing:content-box}.react-datepicker__view-calendar-icon input{padding:6px 10px 5px 25px}.react-datepicker__year-read-view,.react-datepicker__month-read-view,.react-datepicker__month-year-read-view{border:1px solid transparent;border-radius:.3rem;position:relative}.react-datepicker__year-read-view:hover,.react-datepicker__month-read-view:hover,.react-datepicker__month-year-read-view:hover{cursor:pointer}.react-datepicker__year-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__year-read-view:hover .react-datepicker__month-read-view--down-arrow,.react-datepicker__month-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view:hover .react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__month-year-read-view:hover .react-datepicker__month-read-view--down-arrow{border-top-color:rgb(178.5, 178.5, 178.5)}.react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view--down-arrow{transform:rotate(135deg);right:-16px;top:0}.react-datepicker__year-dropdown,.react-datepicker__month-dropdown,.react-datepicker__month-year-dropdown{background-color:#f0f0f0;position:absolute;width:50%;left:25%;top:30px;z-index:1;text-align:center;border-radius:.3rem;border:1px solid #aeaeae}.react-datepicker__year-dropdown:hover,.react-datepicker__month-dropdown:hover,.react-datepicker__month-year-dropdown:hover{cursor:pointer}.react-datepicker__year-dropdown--scrollable,.react-datepicker__month-dropdown--scrollable,.react-datepicker__month-year-dropdown--scrollable{height:150px;overflow-y:scroll}.react-datepicker__year-option,.react-datepicker__month-option,.react-datepicker__month-year-option{line-height:20px;width:100%;display:block;margin-left:auto;margin-right:auto}.react-datepicker__year-option:first-of-type,.react-datepicker__month-option:first-of-type,.react-datepicker__month-year-option:first-of-type{border-top-left-radius:.3rem;border-top-right-radius:.3rem}.react-datepicker__year-option:last-of-type,.react-datepicker__month-option:last-of-type,.react-datepicker__month-year-option:last-of-type{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom-left-radius:.3rem;border-bottom-right-radius:.3rem}.react-datepicker__year-option:hover,.react-datepicker__month-option:hover,.react-datepicker__month-year-option:hover{background-color:#ccc}.react-datepicker__year-option:hover .react-datepicker__navigation--years-upcoming,.react-datepicker__month-option:hover .react-datepicker__navigation--years-upcoming,.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-upcoming{border-bottom-color:rgb(178.5, 178.5, 178.5)}.react-datepicker__year-option:hover .react-datepicker__navigation--years-previous,.react-datepicker__month-option:hover .react-datepicker__navigation--years-previous,.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-previous{border-top-color:rgb(178.5, 178.5, 178.5)}.react-datepicker__year-option--selected,.react-datepicker__month-option--selected,.react-datepicker__month-year-option--selected{position:absolute;left:15px}.react-datepicker__close-icon{cursor:pointer;background-color:transparent;border:0;outline:0;padding:0 6px 0 0;position:absolute;top:0;right:0;height:100%;display:table-cell;vertical-align:middle}.react-datepicker__close-icon::after{cursor:pointer;background-color:#216ba5;color:#fff;border-radius:50%;height:16px;width:16px;padding:2px;font-size:12px;line-height:1;text-align:center;display:table-cell;vertical-align:middle;content:"ร—"}.react-datepicker__close-icon--disabled{cursor:default}.react-datepicker__close-icon--disabled::after{cursor:default;background-color:#ccc}.react-datepicker__today-button{background:#f0f0f0;border-top:1px solid #aeaeae;cursor:pointer;text-align:center;font-weight:bold;padding:5px 0;clear:left}.react-datepicker__portal{position:fixed;width:100vw;height:100vh;background-color:rgba(0, 0, 0, 0.8);left:0;top:0;justify-content:center;align-items:center;display:flex;z-index:2147483647}.react-datepicker__portal .react-datepicker__day-name,.react-datepicker__portal .react-datepicker__day,.react-datepicker__portal .react-datepicker__time-name{width:3rem;line-height:3rem}@media(max-width: 400px),(max-height: 550px){.react-datepicker__portal .react-datepicker__day-name,.react-datepicker__portal .react-datepicker__day,.react-datepicker__portal .react-datepicker__time-name{width:2rem;line-height:2rem}}.react-datepicker__portal .react-datepicker__current-month,.react-datepicker__portal .react-datepicker-time__header{font-size:1.44rem}.react-datepicker__children-container{width:13.8rem;margin:.4rem;padding-right:.2rem;padding-left:.2rem;height:auto}.react-datepicker__aria-live{position:absolute;clip-path:circle(0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;width:1px;white-space:nowrap}.react-datepicker__calendar-icon{width:1em;height:1em;vertical-align:-0.125em}meta.foundation-version{font-family:"/5.5.3/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 551px)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:551px)/";width:551px}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:551px) and (max-width:801px)/";width:551px}meta.foundation-mq-large{font-family:"/only screen and (min-width:801px)/";width:801px}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:801px) and (max-width:968px)/";width:801px}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:968px)/";width:968px}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:968px) and (max-width:1441px)/";width:968px}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:1441px)/";width:1441px}meta.foundation-data-attribute-namespace{font-family:false}.has-tip{border-bottom:dotted 1px #ddd;color:#292929;cursor:help;font-weight:600}.has-tip:hover,.has-tip:focus{border-bottom:dotted 1px hsl(0deg,0%,9%);color:#333}.has-tip.tip-left,.has-tip.tip-right{float:none !important}.tooltip{background:#292929;color:#fff;display:none;font-size:1rem;font-weight:400;line-height:1.25;max-width:300px;padding:.375rem .5rem .2980769231rem;position:absolute;width:100%;z-index:1006;left:50%}.tooltip>.nub{border:solid 5px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #292929 rgba(0,0,0,0);display:block;height:0;pointer-events:none;position:absolute;top:-10px;width:0;left:5px}.tooltip>.nub.rtl{left:auto;right:5px}.tooltip.radius{border-radius:2px}.tooltip.round{border-radius:1000px}.tooltip.round>.nub{left:2rem}.tooltip.opened{border-bottom:dotted 1px hsl(0deg,0%,9%) !important;color:#333 !important}.tap-to-close{color:#f5f5f5;display:block;font-size:1rem;font-weight:400}@media only screen{.tooltip>.nub{border-color:rgba(0,0,0,0) rgba(0,0,0,0) #292929 rgba(0,0,0,0);top:-10px}.tooltip.tip-top>.nub{border-color:#292929 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);bottom:-10px;top:auto}.tooltip.tip-left,.tooltip.tip-right{float:none !important}.tooltip.tip-left>.nub{border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #292929;left:auto;margin-top:-5px;right:-10px;top:50%}.tooltip.tip-right>.nub{border-color:rgba(0,0,0,0) #292929 rgba(0,0,0,0) rgba(0,0,0,0);left:-10px;margin-top:-5px;right:auto;top:50%}}.u-block{display:block !important}.u-inlineBlock{display:inline-block !important;max-width:100% !important}.u-hidden{display:none !important}.u-hiddenVisually{border:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.is-srOnly{border:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.u-textAlignCenter{text-align:center !important}.u-textAlignLeft{text-align:left !important}.u-textAlignRight{text-align:right !important}.u-textBreak{word-wrap:break-word !important}.u-textInheritColor{color:inherit !important}.u-textKern{text-rendering:optimizeLegibility !important;font-feature-settings:"kern" 1 !important;font-kerning:normal !important}.u-textLead{line-height:1.6 !important;font-size:1.1em !important}.u-textNoWrap{white-space:nowrap !important}.u-textTruncate{max-width:100% !important;overflow:hidden !important;text-overflow:ellipsis !important;white-space:nowrap !important;word-wrap:normal !important}.u-fontSmoothing{-moz-osx-font-smoothing:grayscale !important;-webkit-font-smoothing:antialiased !important}/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{background:#fff;color:#333;cursor:auto;margin:0;padding:0;position:relative}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}a:hover{cursor:pointer}figure{margin:0 0 1rem}img{display:inline-block;height:auto;max-width:100%;vertical-align:middle}img{-ms-interpolation-mode:bicubic}button{background:none;border:0}button:active,button:focus{box-shadow:none;outline:none}textarea{height:auto;min-height:50px}select{width:100%}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}html{font-size:13px}@media(min-width: 551px){html{font-size:13px}}@media(min-width: 801px){html{font-size:13px}}@media(min-width: 968px){html{font-size:13px}}body{font-family:"Open Sans","Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5}a{color:#4496f6;line-height:inherit;text-decoration:none}a:hover,a:focus{color:rgb(10.9056122449,110.2678571429,226.5943877551)}p{font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:1.5rem;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#292929;font-family:"Open Sans","Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:0;line-height:1.25;margin-bottom:3rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#999;font-size:80%;line-height:0}h1{font-size:2.7692307692rem}h2{font-size:1.9230769231rem}h3{font-size:1.1538461538rem}h4{font-size:1.3846153846rem}h5{font-size:1rem}h6{font-size:1rem}.subheader{color:#999;font-weight:400;line-height:1.25;margin-bottom:.75rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1rem 0 .9230769231rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:600;line-height:inherit}small{font-size:80%;line-height:inherit}code{background-color:#fff;border-color:#ebebeb;border-style:solid;border-width:1px;color:#ad0000;font-family:Consolas,Monaco,"Andale Mono",monospace;font-size:1rem;font-weight:400;padding:.375rem .5rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.5;list-style-position:outside;margin-bottom:1.5rem}ul ul,ul ol,ol ul,ol ol{margin-left:1.5384615385rem;margin-bottom:0}ul{margin-left:1.1rem}ol{margin-left:1.4rem}dl dt{font-weight:600;margin-bottom:.3rem}dl dd{margin-bottom:1.5rem}abbr,acronym{border-bottom:1px dotted #ddd;color:#333;cursor:help;font-size:90%;text-transform:uppercase}abbr{text-transform:none}blockquote{border:#ddd solid;border-width:0 0 0 1px;margin:0 0 1.5rem;padding:.75rem 1.5rem}blockquote,blockquote p{color:#333;font-size:1rem;font-weight:400;line-height:1.5}cite{color:#999;display:block;font-size:1rem}cite:before{content:"โ€” "}cite a,cite a:visited{color:#999}.icon{height:1.3846153846rem;width:1.3846153846rem;display:inline-block;vertical-align:middle}.icon svg{display:inline-block;fill:#999;height:100%;vertical-align:top;width:100%}.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:1px;cursor:pointer;font-family:"Open Sans","Helvetica Neue",Arial,sans-serif;font-weight:400;line-height:normal;margin:0 0 1.5rem;position:relative;text-align:center;text-decoration:none;display:inline-block;background-color:#fff;border-color:#ddd;color:#5f5f5f;font-size:1rem;padding:1rem 2.25rem;border-radius:3px;outline:none;vertical-align:middle}.button:hover,.button:focus,.button.is-active,.button.active{background-color:#fff;border-color:#999;color:#333}.button:active{background-color:#fff;border:1px solid #5f5f5f;color:#292929}.button:focus,.button.is-active,.button.active{box-shadow:0 0 2px rgba(51,51,51,.6);outline:none}@media(min-width: 481px){.button+.button{margin-left:.75rem}}.button--primary{background-color:#333;border-color:#333;color:#fff}.button--primary:hover,.button--primary:focus,.button--primary.is-active,.button--primary.active{background-color:hsl(0deg,0%,5%);border-color:hsl(0deg,0%,5%);color:#fff}.button--primary:active{background-color:#000;border:1px solid #000;color:#fff}.button--tertiary{background-color:#fff;border-color:#ebebeb;color:#4496f6}.button--tertiary:hover,.button--tertiary:focus,.button--tertiary.is-active,.button--tertiary.active{background-color:#fff;border-color:#ddd;color:rgb(10.9056122449,110.2678571429,226.5943877551)}.button--tertiary:active{background-color:#fff;border:1px solid #ddd;color:rgb(10.9056122449,110.2678571429,226.5943877551)}.button--action{background-color:#4496f6;border-color:#4496f6;color:#fff}.button--action:hover,.button--action:focus,.button--action.is-active,.button--action.active{background-color:rgb(10.9056122449,110.2678571429,226.5943877551);border-color:rgb(10.9056122449,110.2678571429,226.5943877551);color:#fff}.button--action:active{background-color:rgb(8.5637755102,86.5892857143,177.9362244898);border:1px solid rgb(8.5637755102,86.5892857143,177.9362244898);color:#fff}.button[disabled]{background-color:#fcfcfc;border-color:#ebebeb;color:#ddd;cursor:default}.button[disabled]:hover,.button[disabled]:focus,.button[disabled].is-active,.button[disabled].active{background-color:#fcfcfc;border-color:#ebebeb;color:#ddd}.button[disabled]:active{background-color:#fcfcfc;border:1px solid #ebebeb;color:#ddd}.button--large{font-size:1.3846153846rem;padding:1.1875rem 4.5rem}.button--small{font-size:1rem;padding:.9375rem 1.875rem}.button--tiny{font-size:1rem;padding:.5rem 1.1875rem}.button--slab{display:block;width:100%}.button+.button--slab{margin-left:0}.button--icon{font-size:1rem;padding:.75rem .75rem}.button--icon svg{fill:#333}.dropdown-menu{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ddd;font-size:1rem;height:auto;max-height:none;width:100%;z-index:89;max-width:200px}.dropdown-menu.open{display:block}.dropdown-menu>*:first-child{margin-top:0}.dropdown-menu>*:last-child{margin-bottom:0}.dropdown-menu--content{display:none;left:-9999px;list-style:none;margin-left:0;position:absolute;background:#fff;border:solid 1px #ddd;font-size:1rem;height:auto;max-height:none;padding:.75rem;width:100%;z-index:89;max-width:200px}.dropdown-menu--content.open{display:block}.dropdown-menu--content>*:first-child{margin-top:0}.dropdown-menu--content>*:last-child{margin-bottom:0}.dropdown-menu,.dropdown-menu--content{box-shadow:0 2px 3px 0 #f5f5f5;margin-top:-1px}.dropdown-menu-item{cursor:pointer;font-size:1rem;line-height:1.5;margin:0;padding:.75rem 1.5rem}.dropdown-menu-item:hover,.dropdown-menu-item:focus{background:#fcfcfc}.dropdown-menu-item a{display:block;padding:.75rem;color:#333}.dropdown-menu-item a{margin:-0.75rem}.dropdown-button{position:relative;padding-right:2.4375rem;cursor:pointer}.dropdown-button::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);border-style:solid;content:"";display:block;height:0;position:absolute;top:50%;width:0}.dropdown-button::after{border-width:.375rem;right:.9375rem;margin-top:-0.125rem}.dropdown-button::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.dropdown-button.button--small{padding-right:1.8rem}.dropdown-button.button--small::after{border-width:.3rem;right:.6rem;margin-top:-0.12rem}.dropdown-button.button--small::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.dropdown-button.button--large{padding-right:2.625rem}.dropdown-button.button--large::after{border-width:.375rem;right:1.125rem;margin-top:-0.125rem}.dropdown-button.button--large::after{border-color:#999 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.dropdown-button.button--primary:after{border-color:#fff rgba(0,0,0,0) rgba(0,0,0,0)}.form{margin:0}.form-fieldset{border:solid #ddd;border-width:0;margin:0;padding:0}.form-legend{background:rgba(0,0,0,0);display:block;line-height:1.5;margin-bottom:0;padding:0 0 2rem;width:100%}.form-label{color:#5f5f5f;cursor:pointer;display:block;font-size:1rem;font-weight:500;line-height:1.5;margin-bottom:.375rem}.form-label small{font-size:1rem;font-weight:400;text-transform:none;vertical-align:bottom}.form-input,.widget--stripev3{appearance:none;background-color:#fff;border-color:#ddd;border-style:solid;border-width:1px;border-radius:4px;box-shadow:none;color:#333;display:block;font-family:inherit;font-size:1rem;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;height:3.45rem;margin:0;padding:.75rem 1rem;transition:all 100ms ease-out;width:100%}.form-input:disabled,.widget--stripev3:disabled{background-color:#f5f5f5;border-color:#ddd;color:#333;cursor:not-allowed}.form-input[readonly],[readonly].widget--stripev3{background-color:#f5f5f5;border-color:#ddd;color:#333;cursor:text}.form-input:focus,.widget--stripev3:focus{background:#fff;border-color:#4496f6;box-shadow:none;outline:none}.form-input[rows],[rows].widget--stripev3{height:auto}.form-input[type=search],[type=search].widget--stripev3{box-sizing:border-box}.form-input::-webkit-input-placeholder,.widget--stripev3::-webkit-input-placeholder{color:#ddd}.form-input::-ms-clear,.widget--stripev3::-ms-clear{height:0;width:0}.form-input::-moz-placeholder,.widget--stripev3::-moz-placeholder{color:#ddd}.form-input:-ms-input-placeholder,.widget--stripev3:-ms-input-placeholder{color:#ddd}.form-select{-webkit-appearance:none !important;-moz-appearance:none !important;background-color:#fff;border-radius:0;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+");background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ddd;color:#333;font-family:inherit;font-size:1rem;line-height:normal;padding:.75rem;border-radius:0;box-shadow:none;cursor:pointer;height:3.45rem;margin:0;max-width:none;outline:0;padding-right:1.5rem}.form-select::-ms-expand{display:none}.form-select.radius{border-radius:4px}.form-select:focus{background-color:#fff;border-color:#4496f6}.form-select:disabled{background-color:#f5f5f5;cursor:not-allowed}.form-select:focus{border-color:#4496f6;box-shadow:none}.form-body{background-color:rgba(0,0,0,0);border:none;box-shadow:none;margin-bottom:1.5rem;max-width:none;padding:0}@media(min-width: 551px){.form-row{display:flex;flex-direction:row;margin:0 -1.1538461538rem;padding:0}.form-row .form-field{flex:1;margin-left:1.1538461538rem;margin-right:1.1538461538rem;max-width:none;padding:0}.form-row .form-select{max-width:none}}.form-field{display:block;margin:0 0 1rem;max-width:none}.form-field:before,.form-field:after{content:" ";display:table}.form-field:after{clear:both}.form-select[multiple]{height:auto}.form-select[multiple] option{padding:5px}.form-checkbox,.form-radio{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-checkbox+.form-label,.form-radio+.form-label{display:inline-block;font-size:1rem;font-weight:400;line-height:1.25;margin-bottom:.375rem;padding-left:1.875rem;position:relative;vertical-align:baseline;width:100%}.form-checkbox+.form-label::before,.form-checkbox+.form-label::after,.form-radio+.form-label::before,.form-radio+.form-label::after{content:"";display:block;position:absolute;transition:all 50ms ease-out}.form-checkbox+.form-label::before,.form-radio+.form-label::before{background-color:#fff;border:solid #ddd;border-width:1px;box-shadow:none;height:1.2307692308rem;left:0;top:0;width:1.2307692308rem}.form-checkbox+.form-label::after,.form-radio+.form-label::after{height:.9230769231rem;left:2px;opacity:0;top:2px;transform:scale(0);width:.9230769231rem}.form-checkbox:checked+.form-label::after,.form-radio:checked+.form-label::after{opacity:1;transform:scale(1)}.form-checkbox:focus+.form-label::before,.form-radio:focus+.form-label::before{border-color:#4496f6;box-shadow:none}.form-checkbox[disabled]+.form-label,.form-radio[disabled]+.form-label{cursor:default}.form-checkbox[disabled]+.form-label::before,.form-radio[disabled]+.form-label::before{background-color:#f5f5f5}.form-checkbox[disabled]+.form-label::after,.form-radio[disabled]+.form-label::after{opacity:.4}.form-checkbox+.form-label::before{border-radius:4px}.form-checkbox+.form-label::after{background-image:url("data:image/svg+xml;utf8, %3Csvg%20width%3D%2212%22%20height%3D%2211%22%20viewBox%3D%220%200%2012%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cdefs%3E%3Cfilter%20x%3D%22-50%25%22%20y%3D%22-50%25%22%20width%3D%22200%25%22%20height%3D%22200%25%22%20filterUnits%3D%22objectBoundingBox%22%20id%3D%22a%22%3E%3CfeOffset%20dy%3D%221%22%20in%3D%22SourceAlpha%22%20result%3D%22shadowOffsetOuter1%22%2F%3E%3CfeGaussianBlur%20in%3D%22shadowOffsetOuter1%22%20result%3D%22shadowBlurOuter1%22%2F%3E%3CfeColorMatrix%20values%3D%220%200%200%200%200.137254902%200%200%200%200%200.505882353%200%200%200%200%200.870588235%200%200%200%200.7%200%22%20in%3D%22shadowBlurOuter1%22%20result%3D%22shadowMatrixOuter1%22%2F%3E%3CfeMerge%3E%3CfeMergeNode%20in%3D%22shadowMatrixOuter1%22%2F%3E%3CfeMergeNode%20in%3D%22SourceGraphic%22%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fdefs%3E%3Cpath%20d%3D%22M612.138%202935.716c-1.964%202.295-3.942%204.556-5.92%206.833-.098.115-.194.215-.29.33-.146.168-.42.15-.564%200-.998-.98-1.996-1.977-2.993-2.958-.37-.366.194-.965.564-.582.9.88%201.786%201.762%202.687%202.66%201.997-2.294%203.975-4.57%205.955-6.866.353-.4.916.183.563.582z%22%20transform%3D%22translate(-601%20-2934)%22%20stroke%3D%22%23FFF%22%20filter%3D%22url(%23a)%22%20stroke-width%3D%22.3%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E");background-position:50%;background-repeat:no-repeat;background-size:100%;color:#4496f6;content:"";font-size:.9230769231rem;line-height:1;text-align:center}.form-radio+.form-label::before{border-radius:1.2307692308rem}.form-radio+.form-label::after{background:#fff;border:3px solid #4496f6;border-radius:.9230769231rem}.form-input.has-action,.has-action.widget--stripev3{float:left;padding-right:2.8461538462rem}.form-input.has-action+.button--inputAction,.has-action.widget--stripev3+.button--inputAction{background:rgba(0,0,0,0);border:0;border-radius:0 4px 4px 0;float:left;height:2.8461538462rem;margin:.0769230769rem 0 0 -2.9230769231rem;width:2.8461538462rem}.form-input.has-icon,.has-icon.widget--stripev3{float:left;padding-right:2.1538461538rem}.form-input.has-icon+.icon,.has-icon.widget--stripev3+.icon{height:3.45rem;margin-left:-2.1538461538rem;width:1.5384615385rem}.form-prefixPostfix{display:flex;flex-direction:row;flex-wrap:nowrap}.form-prefixPostfix .form-input,.form-prefixPostfix .widget--stripev3{flex:1}.form-prefixPostfix .button{height:3.45rem}.form-prefixPostfix-input{border-radius:4px 0 0 4px}.form-prefixPostfix-label{background-color:#fff;border:solid #ddd;border-width:1px;flex:1;font-weight:300;height:3.45rem;line-height:normal;max-width:6.9230769231rem;padding:.75rem 1.5rem;text-align:center}.form-prefixPostfix-label--prefix{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px}.form-prefixPostfix-label--prefix+.form-input,.form-prefixPostfix-label--prefix+.widget--stripev3{border-radius:0 4px 4px 0}.form-prefixPostfix-label--postfix{border-radius:0 4px 4px 0;border-width:1px 1px 1px 0}.form-prefixPostfix-button--prefix{margin:0 .75rem 0 0}.form-prefixPostfix-button--postfix{margin:0 0 0 .75rem}.switch-checkbox{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.switch-checkbox:focus+.switch-toggle{border-color:#333;box-shadow:0 0 4px rgba(51,51,51,.4)}.switch-toggle{background-color:#ddd;border:1px solid #ddd;border-radius:2.1538461538rem;cursor:pointer;display:inline-block;height:2.1538461538rem;position:relative;transition:all 100ms ease-out;vertical-align:middle;width:4.6153846154rem}.switch--important .switch-toggle{background-color:#d1a162;border-color:#d1a162}.switch--checked .switch-toggle{background-color:#004d0d;border-color:#004d0d}.switch--disabled .switch-toggle{background-color:#fcfcfc;border-color:#ebebeb;cursor:default}.switch-toggle::before{background:#fff;border-radius:1.5384923077rem;box-shadow:0 1px 1px rgba(0,0,0,.1);content:"";height:1.5384923077rem;left:.2307538462rem;position:absolute;top:.2307538462rem;transition:all 100ms ease-out;width:1.5384923077rem}.switch--checked .switch-toggle::before{left:2.6922923077rem}.switch-label{color:#fff;height:26px;line-height:2.0769230769;position:absolute;right:.4615384615rem;text-transform:uppercase;transition:all 100ms ease-out}.switch--checked .switch-label{font-weight:600;left:.4615384615rem;right:auto}.switch--disabled .switch-label{color:#ddd}.switch-label--icon.icon{height:2rem;width:2rem}.switch-label--icon.icon svg{height:2rem;width:2rem;fill:#fff}.switch--disabled .switch-label--icon.icon svg{fill:#ddd}.switch-description--off{color:#292929;margin-right:5px}.switch--checked .switch-description--off{color:#ddd}.switch-description--on{color:#ddd;margin-left:5px}.switch--checked .switch-description--on{color:#292929}.switch-ariaDescription{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-actions{background:none;border:0;padding:1.5rem 0 0;text-align:center}@media(min-width: 481px){.form-actions{text-align:left}}.form-actions>*{display:inline-block;margin-bottom:1rem;width:100%}@media(min-width: 481px){.form-actions>*{margin:0 0 0 .75rem;vertical-align:baseline;width:auto}}@media(min-width: 481px){.form-actions--fixed{background:#fff;border-top:1px solid #ddd;bottom:0;left:0;padding:1.5rem 3rem;position:fixed;right:0;text-align:right;z-index:20}}.form-input-indicator{height:1.6923076923rem;width:1.6923076923rem;float:left;margin:0 0 0 -2.3076923077rem;position:relative;top:.7692307692rem}.form-prefixPostfix .form-input-indicator{top:0}.form-input-indicator>svg{fill:#004d0d}.form-field-errors{list-style:none;margin-left:0;margin-left:0;clear:both;margin-bottom:0;margin-top:.1875rem}.form-field-errors ul,.form-field-errors ol{list-style:none;margin-bottom:0}.form-inlineMessage{display:inline-block;font-weight:400;line-height:1.25;margin:.1875rem 0 0;width:100%}.form-field--success .form-input,.form-field--success .widget--stripev3,.form-field--error .form-input,.form-field--error .widget--stripev3,.form-field--warning .form-input,.form-field--warning .widget--stripev3{float:left}.form-field--success .form-input,.form-field--success .widget--stripev3,.form-field--success .form-select,.form-field--success .form-checkbox+.form-label::before,.form-field--success .form-radio+.form-label::before,.form-field--success .form-prefixPostfix-label{border-color:#004d0d}.form-field--success .form-field-error,.form-field--success .form-inlineMessage{color:#004d0d}.form-field--success .form-input-indicator>svg{fill:#004d0d}.form-field--error .form-input,.form-field--error .widget--stripev3,.form-field--error .form-select,.form-field--error .form-checkbox+.form-label::before,.form-field--error .form-radio+.form-label::before,.form-field--error .form-prefixPostfix-label{border-color:#ad0000}.form-field--error .form-field-error,.form-field--error .form-inlineMessage{color:#ad0000}.form-field--error .form-input-indicator>svg{fill:#ad0000}.form-field--warning .form-input,.form-field--warning .widget--stripev3,.form-field--warning .form-select,.form-field--warning .form-checkbox+.form-label::before,.form-field--warning .form-radio+.form-label::before,.form-field--warning .form-prefixPostfix-label{border-color:#d1a162}.form-field--warning .form-field-error,.form-field--warning .form-inlineMessage{color:#d1a162}.form-field--warning .form-input-indicator>svg{fill:#d1a162}.form-ccFields{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 -1.1538461538rem;padding:0}.form-ccFields>.form-field{max-width:none;padding:0 1.1538461538rem}.form-field--ccNumber{order:1}.form-field--ccExpiry{order:2}.form-field--ccName{order:4}@media(min-width: 551px){.form-field--ccName{order:3}}.form-field--ccCvv{order:3}@media(min-width: 551px){.form-field--ccCvv{order:4}}.form-field--ccNumber,.form-field--ccName{flex:100%}@media(min-width: 551px){.form-field--ccNumber,.form-field--ccName{flex:.65 0 65%}}@media(min-width: 801px){.form-field--ccNumber,.form-field--ccName{flex:.75 0 75%}}.form-field--ccExpiry,.form-field--ccCvv{flex:.5}@media(min-width: 551px){.form-field--ccExpiry,.form-field--ccCvv{flex:.35 0 35%;max-width:13.8461538462rem !important}}@media(min-width: 801px){.form-field--ccExpiry,.form-field--ccCvv{flex:.25 0 25%}}.form-ccFields-cvvExample{display:flex}.form-ccFields-cvvExampleDescription{flex:2 auto;margin-right:.75rem}.form-ccFields-cvvExampleDescription p{font-size:.8461538462rem;margin:0}.form-ccFields-cvvExampleFigures{flex:1 auto}.form-ccFields-cvvExampleFigures figure{margin-bottom:.75rem}.form-ccFields-cvvExampleFigures icon{height:auto}.media:before,.media:after{content:" ";display:table}.media:after{clear:both}.media-figure{float:left;margin-right:.75rem}.media-figure>img{display:block}.media-figure--opposite{float:right;margin-left:.75rem;margin-right:0}.media-body:before,.media-body:after{content:" ";display:table}.media-body:after{clear:both}.mediaTable{display:table;padding:1.5rem}.mediaTable:before,.mediaTable:after{content:" ";display:table}.mediaTable:after{clear:both}.mediaTable-column{display:table-cell;padding-right:1.5rem;vertical-align:middle}.mediaTable-column:last-child{padding:0}.mediaTable-figure{text-align:center;vertical-align:middle;width:15%}.mediaTable-body{vertical-align:middle}.mediaTable-actions{text-align:right;vertical-align:top;width:30%}.alertBox{border-style:none;border-width:1px;display:block;font-size:1rem;font-weight:400;margin-bottom:.75rem;padding:1rem 1.5rem 1rem 1.5rem;position:relative;transition:opacity 300ms ease-out;background-color:#ebebeb;border-color:#ebebeb;color:#333}.alertBox .icon{height:1.5384615385rem;width:1.5384615385rem}.alertBox .button{margin:0 0 0 .75rem}.alertBox--info{background-color:#f5f5f5;border-color:#f5f5f5;color:#333}.alertBox--info svg{fill:#5f5f5f}.alertBox--success{background-color:#d3f5d9;border-color:#d3f5d9;color:#333}.alertBox--success svg{fill:#004d0d}.alertBox--warning{background-color:#fbf7ee;border-color:#fbf7ee;color:#333}.alertBox--warning svg{fill:#d1a162}.alertBox--error{background-color:#fff0f1;border-color:#fff0f1;color:#333}.alertBox--error svg{fill:#ad0000}.alertBox-column{display:table-cell;text-align:center;vertical-align:middle}.alertBox-icon{padding-right:1.5rem}.alertBox-message{margin:0;text-align:left;width:100%}.alertBox-heading{margin:0}.alertBox-close{cursor:pointer;padding-left:1.5rem}.alertBox-close .icon{height:1.5384615385rem;width:1.5384615385rem}.alertBox-close svg{fill:#999}.tooltip{border-radius:2px}body.has-activeModal{overflow:hidden}.modal-background{background:#fff;background:hsla(0deg,0%,100%,.9);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1004;left:0}.has-activeModal .modal-background{display:block}.modal{border-radius:0;display:none;position:absolute;top:0;visibility:hidden;width:100%;z-index:1005;left:0;background-color:#fff;padding:0;border:solid 1px #ddd;box-shadow:0 0 12px hsla(0deg,0%,60%,.4);max-height:80%;overflow:auto;position:fixed}@media only screen and (max-width: 551px){.modal{min-height:100vh}}.modal .column,.modal .columns{min-width:0}.modal>:first-child{margin-top:0}.modal>:last-child{margin-bottom:0}@media only screen and (min-width:551px){.modal{left:0;margin:0 auto;max-width:80%;right:0;width:680px}}@media only screen and (min-width:551px){.modal{top:50%}}@media(min-width: 551px){.modal{transform:translateY(-50%)}}.modal--large{max-height:90%;width:900px}.modal--small{width:300px}.modal-header{border-bottom:1px solid #ebebeb;padding:1.6875rem 1.875rem;position:relative}.modal-header-title{margin:0}.modal-body{padding:1.6875rem 1.875rem}.modal-body>:last-child{margin-bottom:0}.modal-footer{border-top:1px solid #ebebeb;padding:1.6875rem 1.875rem;text-align:center}@media(min-width: 481px){.modal-footer{text-align:right}}.modal-footer .button{display:block}@media(min-width: 481px){.modal-footer .button{display:inline-block;margin-bottom:0}}.modal-footer-link{display:inline-block;font-size:1.1538461538rem;margin:0 0 .75rem}@media(min-width: 481px){.modal-footer-link{display:inline;margin:1.5rem}}.modal-close{color:#5f5f5f;cursor:pointer;font-size:2.3076923077rem;font-weight:normal;line-height:1;position:absolute;top:50%;right:.9375rem;transform:translateY(-50%)}.modal-close .icon{height:2.3076923077rem;width:2.3076923077rem}@media print{.modal{background:#fff !important;display:none}}.loadingNotification{left:50%;position:fixed;text-align:center;top:6rem;transform:translateX(-50%);transform-style:preserve-3d;transition:all 200ms ease-out;z-index:500}.loadingNotification.ng-hide-remove,.loadingNotification.ng-hide-add-active{opacity:0;top:7.5rem;transform:scale(0.9) translateX(-50%)}.loadingNotification.ng-hide-remove-active{opacity:1;top:6rem;transform:scale(1) translateX(-50%)}.loadingNotification-label{background:#333;border-radius:4px;color:#fff;display:inline-block;font-size:1.1538461538rem;padding:.5625rem 1.1875rem}.loadingOverlay-container{min-height:0;position:relative}.loadingOverlay{background:hsla(0deg,0%,100%,.9);bottom:0;height:100%;left:0;opacity:1;position:absolute;right:0;top:0;transition:all 250ms ease-out;width:100%}.loadingOverlay::before{height:4.6153846154rem;width:4.6153846154rem;border-radius:4.6153846154rem;border:solid 1px;border-color:#fff #fff #ddd #ddd;content:"";display:block;left:0;margin:0 auto;position:absolute;right:0;top:50%;transform:translateY(-50%) rotate(0deg);transform-style:preserve-3d;animation:spin 500ms infinite cubic-bezier(0.69, 0.31, 0.56, 0.83)}.loadingOverlay.ng-enter,.loadingOverlay.ng-leave.ng-leave-active{opacity:0}.loadingOverlay.ng-leave,.loadingOverlay.ng-enter.ng-enter-active{opacity:1}@keyframes spin{0%{transform:translateY(-50%) rotate(0deg)}100%{transform:translateY(-50%) rotate(360deg)}}.creditCardTypes{display:inline-block}.creditCardTypes-list{list-style:none;margin-left:0}.creditCardTypes-list ul,.creditCardTypes-list ol{list-style:none;margin-bottom:0}.creditCardTypes-list-item{display:inline-block;margin:.1875rem}.creditCardTypes-list-item.is-active{opacity:1}.creditCardTypes-list-item.not-active{opacity:.2}html,body{height:auto}@media(min-width: 968px){html,body{scroll-behavior:smooth}}h1{font-size:2.7692307692rem}h2{font-size:1.9230769231rem}h3{font-size:1.1538461538rem;font-weight:700}h4{font-size:1rem;font-weight:600}h5{font-size:1rem;font-weight:600}h6{font-size:1rem}h1 a,h1 a:hover,h2 a,h2 a:hover,h3 a,h3 a:hover,h4 a,h4 a:hover,h5 a,h5 a:hover,h6 a,h6 a:hover{color:currentcolor}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}.button{text-transform:uppercase;transition:all 100ms ease-out}.button:focus{border-color:#4496f6}.button.is-loading{color:#fff;inset:0;background:linear-gradient(to right, transparent 0%, transparent 20%, rgba(255, 255, 255, 0.5) 50%, transparent 80%, transparent 100%);animation:shimmer 2s ease-in-out infinite;background-size:200% 100%}.button.is-loading.button--primary{color:#333}.button.is-loading[disabled]{color:#ebebeb}.button--primary,.button--action{font-weight:600}.button--small,.button--tiny{text-transform:none}.button--small{line-height:1}.button--slab{width:100%}.link--disabled{color:#ebebeb;cursor:default;pointer-events:none}@media(min-width: 968px){.form{max-width:41.5384615385rem}}.form-fieldset{margin-bottom:1.25rem}.form-fieldset:last-child{margin-bottom:0}#checkoutShippingAddress.form-fieldset:has(.floating-form-field){margin-bottom:5px}.floating-fieldset .form-fieldset{margin-bottom:0}.form-field{position:relative;margin:0 0 .75rem}.form-field:last-child{margin-bottom:0}.form-field .floating-input,.form-field .floating-select{background-color:#fff;font-size:1.077rem;height:3.6975rem;padding-bottom:0;padding-left:1rem;padding-right:1rem;padding-top:1.125rem}.form-field .floating-input.floating-form-field-input,.form-field .floating-select.floating-form-field-input{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400}.form-field .floating-textarea{background-color:#fff;padding-top:1.875rem}.form-field .dropdown-chevron,.form-field .floating-select-chevron{position:absolute;right:1rem;top:37.7px}.form-field .floating-select-chevron{top:14.95px}.form-field .floating-label{font-size:1.077rem;left:1.05rem;line-height:3.5;position:absolute;top:0;transition:all .15s cubic-bezier(0.13, 0.615, 0.315, 0.915)}.form-field .floating-label small{font-size:1.077rem;vertical-align:baseline}.form-field .floating-label.floating-form-field-label{color:#757575;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:500;margin-top:.1875rem}.form-field .floating-label.floating-form-field-label small{font-size:1rem}.form-field .react-datepicker__tab-loop+.floating-label,.form-field .react-datepicker-wrapper+.floating-label,.form-field select+.floating-label,.form-field textarea:focus+.floating-label,.form-field textarea:not(:empty)+.floating-label,.form-field input:focus+.floating-label,.form-field input:not(:placeholder-shown)+.floating-label{color:#5f5f5f;display:block;font-size:.8461538462rem;line-height:2;top:.2958rem}.form-field .react-datepicker__tab-loop+.floating-label small,.form-field .react-datepicker-wrapper+.floating-label small,.form-field select+.floating-label small,.form-field textarea:focus+.floating-label small,.form-field textarea:not(:empty)+.floating-label small,.form-field input:focus+.floating-label small,.form-field input:not(:placeholder-shown)+.floating-label small{font-size:.8461538462rem}.form-field .react-datepicker__tab-loop+.floating-label.floating-form-field-label,.form-field .react-datepicker-wrapper+.floating-label.floating-form-field-label,.form-field select+.floating-label.floating-form-field-label,.form-field textarea:focus+.floating-label.floating-form-field-label,.form-field textarea:not(:empty)+.floating-label.floating-form-field-label,.form-field input:focus+.floating-label.floating-form-field-label,.form-field input:not(:placeholder-shown)+.floating-label.floating-form-field-label{color:#757575;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:.8461538462rem;font-weight:500;margin-top:0}.form-field .react-datepicker__tab-loop+.floating-label.floating-form-field-label small,.form-field .react-datepicker-wrapper+.floating-label.floating-form-field-label small,.form-field select+.floating-label.floating-form-field-label small,.form-field textarea:focus+.floating-label.floating-form-field-label small,.form-field textarea:not(:empty)+.floating-label.floating-form-field-label small,.form-field input:focus+.floating-label.floating-form-field-label small,.form-field input:not(:placeholder-shown)+.floating-label.floating-form-field-label small{font-size:.8461538462rem}.form-field:not(.form-field--error) .floating-input:not(:focus),.form-field:not(.form-field--error) .floating-select:not(:focus),.form-field:not(.form-field--error) .floating-textarea{border-color:#ebebeb}.floating-label+.form-field-errors,.dynamic-form-field--addressLineAutocomplete.floating-form-field .form-field-errors{padding-top:.75rem}.form-input:focus,.widget--stripev3:focus,.form-input--focus{box-shadow:none,none}.form-input.form-input--withIcon,.form-input--withIcon.widget--stripev3{padding-right:2.8846153846rem}.form-input-icon{height:1.3846153846rem;position:absolute;right:.75rem;top:50%;transform:translateY(-50%);width:1.3846153846rem}.form-actions{margin:1.875rem 0;padding:0}.form-actions .button:first-child{margin-left:0}.form-body{background-color:rgba(0,0,0,0);margin:0;position:relative}.form-field--error .form-input,.form-field--error .widget--stripev3,.form-field--error .form-select{background-color:#fdf5f5;transition:background-color .8s ease-out}.form-field--error .form-label:not(.floating-label){color:#ad0000}.form-field--error .floating-label.form-label.optimizedCheckout-form-label{color:#5f5f5f}.form-input--error{border-color:#ad0000;box-shadow:none}.form-legend-container{align-items:center;display:flex;flex-direction:row;justify-content:space-between}.form-legend{font-size:1.1538461538rem;font-weight:700;background-color:rgba(0,0,0,0);color:#292929;font-weight:700;padding:0 0 .75rem 0;width:auto}.form-toggle{background-color:rgba(0,0,0,0);color:#292929;font-weight:700}@media(min-width: 968px){.form-toggle-password{display:none}}.form-field-password{position:relative}.form-select{-webkit-appearance:none;background-image:none;border-radius:4px;padding:.75rem 1.5rem .75rem 1rem}.alertBox-heading{font-size:1.1538461538rem;font-weight:700}.alertBox--error{color:#ad0000}.alertBox--success{color:#004d0d}.alertBox--warning{color:#d1a162}.modal-background{opacity:0;transition:opacity 400ms ease-out}.modal-background.is-active,.modal-background.modal--afterOpen{opacity:1}.modal{border:0;border-radius:6px;box-shadow:0 2px 12px hsla(0deg,0%,60%,.4);opacity:0;outline:none;transition:opacity 200ms ease-out,transform 200ms ease-out}@media(min-width: 551px){.modal{transform:scale(0.95) translateY(-50%)}}.modal .form-actions{text-align:right}.modal.is-active,.modal.modal--afterOpen{bottom:2%;display:flex;flex-direction:column;justify-content:end;left:2%;max-width:96%;min-height:96vh;opacity:1;right:2%;top:2%}@media(min-width: 551px){.modal.is-active,.modal.modal--afterOpen{bottom:auto;left:0;max-width:80%;min-height:0;right:0;top:50%;transform:scale(1) translateY(-50%)}}@media(min-width: 551px){.modal.modal--medium{max-width:500px}}.modal.modal--error,.modal.modal--confirm{padding-bottom:.75rem;padding-left:3.75rem;padding-right:3rem;padding-top:1.5rem}.modal.modal--error .modal-body,.modal.modal--confirm .modal-body{padding-bottom:.75rem;padding-top:0}.modal.modal--error .modal-header-title,.modal.modal--confirm .modal-header-title{position:relative}.modal.modal--error .modal-header-icon,.modal.modal--confirm .modal-header-icon{left:-3rem;position:absolute;top:50%;transform:translateY(-50%)}.modal.modal--bluesnap{width:auto}.modal-header{border-bottom:0}.modal-header-title{font-size:1.3846153846rem}.modal-body .modal-footer{padding-left:0;padding-right:0}.modal-body .adyen-checkout__threeds2__challenge.adyen-checkout__threeds2__challenge--05{height:calc(96vh - 150px);padding-top:0}@media(min-width: 551px){.modal-body .adyen-checkout__threeds2__challenge.adyen-checkout__threeds2__challenge--05{height:calc(80vh - 150px)}}.modal-footer{border-top:0}.modal-footer .button{margin-bottom:.75rem;margin-left:0;width:100%}.modal-footer .button:last-child{margin-bottom:0}@media(min-width: 551px){.modal-footer .button{margin-bottom:0;margin-left:.75rem;width:auto}}.modal-body--center{display:flex;justify-content:center}.modalOverlay{background:hsla(0deg,0%,100%,.9);bottom:0;left:0;opacity:0;position:fixed;right:0;top:0;transition:opacity 200ms ease-out;z-index:500}.modalOverlay--afterOpen{opacity:1}.modalOverlay--beforeClose{opacity:0}.modal--afterOpen{display:block;visibility:visible}body.has-activeModal .modal-body{overflow:scroll;padding-bottom:20%}@media(min-width: 551px){body.has-activeModal .modal-body{padding-bottom:0}}.table{background:#fff;border:solid 1px #ebebeb;margin-bottom:3rem;table-layout:auto;margin-bottom:1rem;table-layout:auto;width:100%}.table caption{background:rgba(0,0,0,0);color:#333;font-size:1rem;font-weight:bold}.table thead{background:#fcfcfc}.table thead tr th,.table thead tr td{color:#333;font-size:1rem;font-weight:600;padding:1.5rem}.table tfoot{background:#fcfcfc}.table tfoot tr th,.table tfoot tr td{color:#333;font-size:1rem;font-weight:600;padding:1.5rem}.table tr th,.table tr td{color:#333;font-size:1rem;padding:1.5rem;text-align:left}.table tr.even,.table tr.alt,.table tr:nth-of-type(even){background:#fff}.table thead tr th,.table tfoot tr th,.table tfoot tr td,.table tbody tr th,.table tbody tr td,.table tr td{display:table-cell;line-height:1.5}.table-thead{border-bottom:1px solid #ddd}.table-thead a{color:#333}.table-thead a:hover{text-decoration:underline}.table-thead tr:hover{background-color:palette("grey", 50)}.table-tbody tr{border-bottom:1px solid #ebebeb}.table-tbody tr:hover{background-color:palette("white")}.table-tfoot{border-top:1px solid #ddd}.table-tfoot tr:hover{background-color:palette("white")}.table-actionButton{margin-bottom:0}.form-checkbox+.form-label,.form-radio+.form-label{color:inherit}.form-checkbox:checked+.form-label::before,.form-radio:checked+.form-label::before{background-color:#4496f6;border-color:#4496f6}.form-radio:checked+.form-label::after{border:none;transform:scale(0.5)}.formField--helpText{color:#999}.form-field--error .form-select.floating-select,.form-field--error .form-select.floating-select:hover,.form-field--error .form-select.floating-select:focus,.form-field--error .form-input.floating-input,.form-field--error .form-input.floating-input:hover,.form-field--error .form-input.floating-input:focus,.form-select.floating-select,.form-select.floating-select:focus,.form-select.floating-select:hover,.form-input.floating-input,.floating-input.widget--stripev3,.form-input.floating-input:focus,.form-input.floating-input:hover,.form-input.optimizedCheckout-form-input,.optimizedCheckout-form-input.widget--stripev3,.form-input.optimizedCheckout-form-input:focus,.form-input.optimizedCheckout-form-input:hover{box-shadow:none;-webkit-box-shadow:none}.form-ccFields{margin:0 -0.75rem}.form-ccFields>.form-field,.form-ccFields>.form-ccFields-field{display:block;flex-grow:1;margin-bottom:1rem;max-width:none !important;padding:0 .75rem}.form-ccFields--without-card-name:not(.form-ccFields--without-card-code) .form-field--ccNumber{flex-basis:100%}.form-ccFields--without-card-name:not(.form-ccFields--without-card-code) .form-field--ccExpiry,.form-ccFields--without-card-name:not(.form-ccFields--without-card-code) .form-ccFields-field--ccCvv{flex-basis:50%}.form-field--ccNumber,.form-field--ccName{flex-basis:65%}.form-field--ccDocument{flex-basis:100%;order:4}.form-field--stripe-ccNumber{flex-basis:100%}.form-field--bolt-embed{flex-basis:100%;height:8.4615384615rem}.form-field--createAccount{height:auto}.mollie-full{flex-basis:100%}.mollie-aside{flex:1 0 0}.form-field--ccNumber--hasExpiryDate{flex-basis:50%}.form-field-ccNumber--hide{display:none !important}.form-ccFields-field--ccCvv,.form-field--ccExpiry{flex-basis:1%;min-width:7.6923076923rem}.form-ccFields-field--ccCvv{order:4}.form-field--postCode{flex-basis:100%;order:5}.form-field--stripe-postalCode{flex-basis:1%;order:5}.form-field--ccAdditionalField{flex:100%;order:99}.form-field--saveInstrument{order:6}.form-field--setAsDefaultInstrument{order:7}.icon--small{height:2.0769230769rem;width:2.0769230769rem}.icon--medium{height:2.7692307692rem;width:2.7692307692rem}.icon--large{height:4.1538461538rem;width:4.1538461538rem}.icon--error svg{fill:#ad0000}.loadingNotification-label{align-items:center;display:flex;padding:.75rem 3rem}.loadingNotification-label .label{margin-left:.75rem}.spinner{animation:lds-dual-ring 1.2s linear infinite;border-color:#fff #fff #5f5f5f #5f5f5f;border-radius:50%;border-style:solid;border-width:1px;display:inline-block;height:1.1538461538rem;width:1.1538461538rem}@keyframes lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.layout>.loadingOverlay::before{position:fixed;top:40%}.loadingOverlay{opacity:.9;z-index:20}.embedded-checkout-loading-spinner-overlay{position:fixed;top:0;left:0;background-color:rgba(0,0,0,.3);display:flex;justify-content:center;align-items:center;width:100%;height:100%;z-index:999}.creditCardTypes-list{align-content:flex-end;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:end;margin-left:1.5rem;max-width:17rem}.creditCardTypes-list-item{opacity:1;transition:all .6s ease-out;width:3rem}.creditCardTypes-list-item.not-active{filter:grayscale(100%);transform:scale(0.95)}.creditCardTypes-list-item.is-active{transform:scale(1.1)}.cardIcon-icon{position:relative}.cardIcon-icon svg{fill:none}.cardIcon-icon--default{background:url(static/card-9f708a7a.svg) no-repeat center center}.cartDrawer{align-items:center;background-color:#fff;border:1px solid #ebebeb;border-radius:4px;bottom:0;box-shadow:0 1px 4px rgba(95,95,95,.14);display:flex;left:0;margin:1.5rem;padding:.75rem;position:fixed;right:0;z-index:20}@media(max-height: 26.9230769231rem){.cartDrawer{position:static}.is-embedded .cartDrawer{position:fixed}}.cartDrawer:hover{cursor:pointer}.cartDrawer-actions{flex:1;text-align:right;vertical-align:middle}.cartDrawer-body{flex:1;padding-left:1.5rem}.cartDrawer-figure{border:1px solid #ebebeb;height:50px;margin:0;min-width:50px;position:relative;width:50px}.cartDrawer-figure--stack::after{border:1px solid #ebebeb;bottom:-4px;content:"";left:4px;position:absolute;right:-4px;top:4px;z-index:-1}.cartDrawer-items{font-size:1.3846153846rem}.cartDrawer-total{font-size:1.9230769231rem}.cartDrawer-items,.cartDrawer-total{margin-bottom:0}.cartDrawer-imageWrapper{display:flex;height:100%;overflow:hidden;width:100%}.cartDrawer-imageWrapper svg{margin:auto}.productImage-giftCertificate{background:#fff;height:100%;padding:15%;width:100%}.cart-modal-body{padding:0 1.875rem}.cart-modal-header{border-bottom:0;display:table;table-layout:fixed;width:100%}.cart-modal-close,.cart-modal-link,.cart-modal-title{display:table-cell;vertical-align:middle}.cart-modal-title{padding-right:0;text-align:center;width:50%}.cart-modal-close{text-align:left}.cart-modal-link{text-align:right}.cart-modal-link svg{fill:currentColor}.modal.modal--afterOpen.optimizedCheckout-cart-modal{display:block;bottom:0;min-height:90vh}.modal.modal--afterOpen.optimizedCheckout-cart-modal .modal-body{box-shadow:none;height:70%;padding-bottom:0}.with-continue-button.cart-modal-header{box-shadow:none}.with-continue-button .cart-modal-link{text-align:left}.with-continue-button .cart-modal-close{text-align:right}.with-continue-button .cart-heading-subheader{font-weight:500;font-size:1rem;margin-top:.375rem}.changeHighlight-enter-active,.changeHighlight{animation:highlightFade 1000ms ease-out}@keyframes highlightFade{0%{background:rgba(68,150,246,.6)}100%{background:rgba(68,150,246,0)}}.form-checklist{border:1px solid #ddd;border-radius:4px 4px 0 0;color:#292929;list-style:none;margin-left:0}.form-checklist:only-child{border-radius:4px}.form-checklist-item{border-bottom:1px solid #ddd;overflow:hidden}.form-checklist-item:last-child{border-bottom:0}.form-checklist-item--selected{overflow:visible}.form-checklist-item:hover,.form-checklist-item--selected{background-color:#fcfcfc}.custom-checklist-item .paymentMethod--hosted,.custom-checklist-item .widget{padding:0}.form-checklist-header>.form-field{margin-bottom:0}.form-checklist-header--selected .form-label{font-weight:700}.form-checklist-checkbox~.form-label{color:inherit;display:block;font-size:1.1538461538rem;line-height:2.2;margin-bottom:0;min-height:4.6153846154rem;padding:1rem 2.25rem 1rem 3.75rem;position:relative}@media(min-width: 551px){.form-checklist-checkbox~.form-label{padding-left:4.5rem}}.form-checklist-checkbox~.form-label::before,.form-checklist-checkbox~.form-label::after{height:2rem;width:2rem;background-color:#fff;border-radius:100%;content:"";left:1rem;margin:auto;position:absolute;top:1.4615384615rem}@media(min-width: 551px){.form-checklist-checkbox~.form-label::before,.form-checklist-checkbox~.form-label::after{left:1.5rem}}.form-checklist-checkbox~.form-label::after{transform:scale(0.66)}.form-checklist-checkbox~.form-label::before{border:1px solid #ddd}.form-checklist-checkbox{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-checklist-checkbox:focus~.form-label{box-shadow:inset 0 0 0 1px #4496f6}.form-checklist-checkbox:checked~.form-label::before{border-color:#4496f6}.form-checklist-checkbox:checked~.form-label::after{background-color:#4496f6}.form-checklist-body{margin-left:3.75rem;margin-right:2.25rem}.form-checklist-body.ng-enter,.form-checklist-body.ng-leave{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.form-checklist-body.ng-enter{max-height:0}.form-checklist-body.ng-leave{max-height:26.9230769231rem}.form-checklist-body.ng-enter.ng-enter-active{max-height:26.9230769231rem}.form-checklist-body.ng-leave.ng-leave-active{max-height:0}.form-checklist-body-enter,.form-checklist-body-exit{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.form-checklist-body-enter{max-height:0}.form-checklist-body-exit{max-height:26.9230769231rem}.form-checklist-body-enter-active{max-height:26.9230769231rem}.form-checklist-body-exit-active{max-height:0}@media(min-width: 551px){.form-checklist-body{margin-left:4.5rem}}.form-checklist-container{clear:both;padding:.6666666667rem 0}.form-checklist-footer{border:1px solid #ddd;border-radius:0 0 4px 4px;border-top:0;color:#4496f6;line-height:1.25;margin-bottom:1rem;text-align:center}.form-checklist-action{border-radius:0 0 4px 4px;padding:1.5rem 0;width:100%}.form-checklist-action:focus,.form-checklist-action:hover{background-color:#fcfcfc}.form-checklist-action:focus{box-shadow:inset 0 0 0 1px #4496f6}.form-addressState{display:block;flex:1}.shipping-address .address-line{margin-bottom:0}.optimizedCheckout-orderSummary.cart{box-shadow:none;-webkit-box-shadow:none}.cart{border:1px solid #ebebeb;border-radius:4px;display:none;margin:3rem 0 1.5rem;min-height:300px}@media(min-width: 968px){.cart{display:block}}.cart-note{color:#999;font-size:1rem;padding-left:1.5rem}.cart-header{display:table;padding:1.5rem;width:100%}.cart-title{display:table-cell;margin-bottom:0;vertical-align:middle}.cart-header-link{display:table-cell;text-align:right;vertical-align:middle}.cart-header-link .icon{margin:-2px 3px 0 0}.cart-header-link svg{fill:currentColor}.cart-section{border-top:1px solid #ebebeb;padding:1.5rem}.cart-section-heading{font-size:1rem;font-weight:600;margin-bottom:1.5rem}.cart-actions{margin-top:.75rem;text-align:center}.cart-actions .button{margin-bottom:0}.cart-priceItem{display:table;margin-bottom:.75rem;width:100%}.cart-priceItem-label,.cart-priceItem-value{display:table-cell;vertical-align:middle}.cart-priceItem-value{text-align:right}.cart-priceItem-before-value{text-decoration:line-through;color:#999;margin-right:.375rem}.cart-priceItem-postFix{color:#999;display:table-row;font-size:1rem}.cart-priceItem--total{margin-bottom:0}.cart-priceItem--total .cart-priceItem-label{font-size:1.1538461538rem}.cart-priceItem--total .cart-priceItem-value{font-size:2.3076923077rem;font-weight:700;line-height:1.2}.cart-priceItem--total .cart-priceItem-value.header{font-size:1.9230769231rem}.cart-priceItem--subtotal{font-weight:600}@media print{.cart{background-color:#fff;display:block}.cart-header-link{display:none}}.cart-priceItem--totalNote{margin-bottom:0;margin-top:.75rem}.cart-taxItem{display:table;margin-bottom:.75rem;width:100%}.cart-taxItem--subtotal{font-weight:600}.consignment{display:flex;flex-direction:row;margin:.75rem 0 1.5rem;width:100%}.consignment-product-figure{padding:0 1.5rem 0;width:25%}.consignmentList{list-style:none;margin-left:0}.consignmentList ul,.consignmentList ol{list-style:none;margin-bottom:0}.consignment-product-body{display:flex;flex-direction:column;width:100%}.consignment-product-body h5{margin-bottom:.1875rem}.consignment-product-body .form-field{margin-top:.375rem}.customerEmail-container{margin:0 auto;max-width:92.3076923077rem;width:100%}.customerEmail-container:before,.customerEmail-container:after{content:" ";display:table}.customerEmail-container:after{clear:both}@media(min-width: 551px){.customerEmail-container{margin-bottom:.75rem}}@media(min-width: 551px){.customerEmail-container .customerEmail-floating--enabled{margin-top:0;padding-left:8px}.customerEmail-container .customerEmail-floating--enabled button{height:3.6975rem}}.customerEmail-action{padding-left:0;padding-right:0;width:100%;float:left;margin-bottom:.75rem;padding:0}@media(min-width: 551px){.customerEmail-action{margin:1.8rem 0 0 0;padding-left:1.5rem;width:41.6666666667%}}.customerEmail-body{padding-left:0;padding-right:0;width:100%;float:left}@media(min-width: 551px){.customerEmail-body{width:58.3333333333%}}.customerEmail-button{padding:1rem .5rem;width:100%}.customer-login-link{margin-bottom:1.25rem}.stripeCustomerEmail-button{bottom:3px;padding:1rem .5rem;width:100%}.customerHeader .stepHeader-body,.checkout-step--customer .stepHeader-body{overflow:visible}.customerView{align-items:top;display:flex}.customerView-actions{margin-top:0;white-space:nowrap}@media(min-width: 551px){.customerView-actions{margin-top:-.3846153846rem}}.customerView-actions .button{margin-bottom:0}.customerView-body{hyphens:auto;max-width:100%;overflow:hidden;overflow-wrap:break-word;word-break:break-word;word-wrap:break-word;margin-right:1.5rem;width:100%}.checkout-button-container{margin:3rem 0 0}.checkout-button-container p{margin-bottom:1.25rem}.checkout-button-container .checkoutRemote{display:grid;grid-gap:8px;grid-template-columns:repeat(12, 1fr);margin:0}.checkout-button-container .checkoutRemote>div{height:36px;margin-right:0;margin-top:0;width:100%}.checkout-button-container #applepayCheckoutButton button,.checkout-button-container #braintreepaypalcreditCheckoutButton,.checkout-button-container #braintreepaypalCheckoutButton{width:100%}.checkout-button-container .gpay-button.short{background-size:auto;border:none;border-radius:4px;height:36px;min-height:0;min-width:0;width:100%}.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(1){grid-column:span 12;max-width:320px}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(2),.checkout-buttons-auto-layout div:first-child:nth-last-child(2)~div{grid-column:span 6}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(3){grid-column:span 4}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(3)~div:nth-child(n+2){grid-column:span 4}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 6}}@media(min-width: 801px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 3}}@media(min-width: 968px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 6}}@media(min-width: 1261px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(4),.checkout-buttons-auto-layout div:first-child:nth-last-child(4)~div{grid-column:span 3}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(5){grid-column:span 6}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(5)~div:nth-child(2){grid-column:span 6}}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div:first-child:nth-last-child(5)~div:nth-child(n+3){grid-column:span 4}}.checkout-buttons-auto-layout .checkoutRemote>div{grid-column:span 12}@media(min-width: 551px){.checkout-buttons-auto-layout .checkoutRemote>div{grid-column:span 4}}.checkout-separator{align-items:center;display:flex;height:.75rem;justify-content:space-between;margin-top:2rem;text-align:center;width:100%}.checkout-separator span{padding:0 .75rem}.checkout-separator::before,.checkout-separator::after{background-color:#ebebeb;content:" ";display:inline-block;flex-grow:2;height:1px}.checkoutRemote{display:flex;flex-wrap:wrap;margin-left:-0.5rem;margin-right:-0.5rem;margin-top:-1.5rem}.checkoutRemote>div{margin-right:1.5rem;margin-top:1.5rem;z-index:20}.checkoutRemote>.AmazonPayContainer{width:15.3846153846rem;height:51px !important}.checkoutRemote>.AmazonPayContainer #amazonpayCheckoutButton>div{width:100% !important;height:51px !important}.checkoutRemote .gpay-button,.checkoutRemote .gpay-card-info-container{border-radius:4px;height:36px;min-height:36px;max-width:320px}#applepayCheckoutButton button,#braintreepaypalcreditCheckoutButton,#braintreepaypalCheckoutButton{width:160px}#applepayCheckoutButton button{background-color:#000;background-image:-webkit-named-image(apple-pay-logo-white);background-position:50% 50%;background-repeat:no-repeat;background-size:100% 60%;border-radius:4px;height:36px}.checkoutRemote-button{margin-bottom:1rem;margin-left:.5rem;margin-right:.5rem}#checkout-customer-guest .checkoutRemote{margin-bottom:1rem}.checkoutHeader{background-color:#fcfcfc;border-bottom:1px solid #ebebeb;text-align:center}@media(min-width: 551px){.checkoutHeader{min-height:9.2307692308rem}}@media(min-width: 801px){.checkoutHeader{text-align:left}}.checkoutHeader-content{margin:0 auto;max-width:92.3076923077rem;width:100%;padding:1.5rem}.checkoutHeader-content:before,.checkoutHeader-content:after{content:" ";display:table}.checkoutHeader-content:after{clear:both}@media(min-width: 551px){.checkoutHeader-content{padding:3rem}}.checkoutHeader-heading{font-size:2.7692307692rem;color:inherit;margin-bottom:0;word-wrap:break-word}.checkout-steps{counter-reset:li-counter;list-style-type:none;margin:0}@media(min-width: 801px){.checkout-steps{padding-right:6rem}}.checkout-step{border-bottom:1px solid #ebebeb;counter-increment:li-counter;padding:0.6rem 0 0}.checkout-step:last-child{border:0}.checkout-view-header:last-child{margin-bottom:0}@media(min-width: 968px){.checkout-view-content.ng-enter,.checkout-view-content.ng-leave{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.checkout-view-content.ng-enter{max-height:0}.checkout-view-content.ng-leave{max-height:92.3076923077rem}.checkout-view-content.ng-enter.ng-enter-active{max-height:92.3076923077rem}.checkout-view-content.ng-leave.ng-leave-active{max-height:0}.checkout-view-content-enter,.checkout-view-content-exit{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.checkout-view-content-enter{max-height:0}.checkout-view-content-exit{max-height:92.3076923077rem}.checkout-view-content-enter-active{max-height:92.3076923077rem}.checkout-view-content-exit-active{max-height:0}}.checkout-step-info{margin-bottom:1.5rem}.checkout-form{margin:0}@media(min-width: 551px){.checkout-form{margin-left:4.1923076923rem}}@media(min-width: 968px){.checkout-form{margin-left:0}}@media(min-width: 1080px){.checkout-form{margin-left:4.1923076923rem}}.stepHeader-counter{height:2.6923076923rem;width:2.6923076923rem;background-color:#333;border-radius:50%;text-align:center;transition:transform 250ms ease}.stepHeader-counter::before{height:2.6923076923rem;width:2.6923076923rem;color:#fff;content:counter(li-counter);display:inline-block;font-size:1.3846153846rem;line-height:35px;text-align:center}.stepHeader-counter svg{display:none;fill:#fff;padding:0}.stepHeader-counter--complete{transform:scale(0.8)}.stepHeader-counter--complete::before{height:0;width:0;content:""}.stepHeader-counter--complete svg{display:inline-block;padding:.25rem}.stepHeader{align-items:top;display:flex;flex-wrap:wrap;padding:1.25rem 0}@media(min-width: 551px){.stepHeader{flex-wrap:nowrap}}@media(min-width: 968px){.stepHeader{flex-wrap:nowrap}}.stepHeader.is-clickable{cursor:pointer}.stepHeader-figure{align-items:center;display:flex;height:2.6923076923rem;margin-right:1.5rem}.stepHeader-title{margin:0 0 0 1.5rem;min-width:9rem}.remove-checkout-step-numbers li.checkout-step div.stepHeader-counter.icon{display:none}.remove-checkout-step-numbers li.checkout-step .checkout-form,.remove-checkout-step-numbers li.checkout-step div.stepHeader-body,.remove-checkout-step-numbers li.checkout-step h2.stepHeader-title{margin-left:0}.stepHeader-body{hyphens:auto;max-width:100%;overflow:hidden;overflow-wrap:break-word;word-break:break-word;word-wrap:break-word;color:#333;margin-left:4.1923076923rem;margin-top:.7692307692rem;order:3;width:100%}@media(min-width: 551px){.stepHeader-body{margin-left:0;order:inherit}}@media(min-width: 801px){.stepHeader-body{margin-left:4.1923076923rem}}@media(min-width: 968px){.stepHeader-body{margin-left:0}}.stepHeader-actions{align-self:flex-start;margin-left:auto;margin-top:.3846153846rem}@media(min-width: 551px){.stepHeader-actions{margin-left:1.5rem}}.stepHeader-actions .button{margin-bottom:0;border:none}.stepHeader-actions .button:hover,.stepHeader-actions .button:focus{background:none;box-shadow:none;outline:none}.checkout-suggestion{margin:0}@media(min-width: 551px){.checkout-suggestion{margin-left:4.1923076923rem}}@media(min-width: 968px){.checkout-suggestion{margin-left:0}}@media(min-width: 1080px){.checkout-suggestion{margin-left:4.1923076923rem}}.checkoutSuggestion{align-items:center;border:1px solid #ddd;border-radius:4px;cursor:default;display:flex;flex-direction:column;justify-content:space-between;margin:1.5rem 0 0 0;padding:1.5rem;width:100%}@media(min-width: 801px){.checkoutSuggestion{flex-direction:row}}.checkoutSuggestion-message{color:#333;font-weight:400;margin:0 0 1.5rem 0;width:100%}@media(min-width: 801px){.checkoutSuggestion-message{margin:0 1.5rem 0 0;width:auto}}.checkoutSuggestion-button{color:#fff;margin:0;text-transform:initial;white-space:nowrap;width:100%}@media(min-width: 801px){.checkoutSuggestion-button{width:auto}}.checkoutSuggestion-button:hover{color:#fff}.checkoutSuggestion-button--bolt{background-color:#006cff;border-color:#006cff}.checkoutSuggestion-button--bolt:hover{background-color:#005ad5;border-color:#005ad5}.checkoutSuggestion-button-icon--bolt{height:1rem;margin-right:.375rem}.genericModal-body-iframe--center{display:block;margin-left:auto;margin-right:auto}.instrumentModal-trigger{color:#4496f6;display:block;margin-bottom:.75rem;margin-left:auto;margin-right:0}.instrumentModal-instrumentAccountExternalId,.instrumentModal-instrumentAccountNumber,.instrumentModal-instrumentCardType{margin-left:.75rem}.instrumentModal-instrumentExpiry--expired{color:#ad0000}.instrumentSelect{position:relative;width:100%}.instrumentSelect-button{height:auto}.instrumentSelect-dropdownMenu{max-height:14.2307692308rem;max-width:none;overflow:scroll}.dropdownMenu .instrumentSelect-dropdownMenu{display:block;left:auto;position:static}.instrumentSelect-option{padding:0}.instrumentSelect-option>button{display:block;padding:.75rem 1rem;width:100%}.instrumentSelect-option--addNew>button{color:#4496f6}.instrumentSelect-option--selected{background-color:#4496f6}.instrumentSelect-option--selected>button{color:#fff}.instrumentSelect-option--selected:hover{background-color:#4496f6}.instrumentSelect-details{align-items:center;display:flex}.instrumentSelect-account,.instrumentSelect-card{flex-grow:2;margin-left:.75rem;margin-right:.75rem;text-align:left}.instrumentSelect-bank{display:flex;flex-direction:column;align-items:start;margin-left:.75rem;margin-right:.75rem}.instrumentSelect-expiry{margin-right:1.5384615385rem;text-align:right}.instrumentSelect-issuer{flex-grow:2;margin-right:1.5384615385rem;text-align:left}.instrumentSelect-expiry--expired{color:#ad0000}.instrumentSelect-details--expired{cursor:not-allowed}.instrumentSelect-note p:last-child{margin-bottom:0}.mollie-instrument-card{margin-left:.6923076923rem;margin-top:-1.5384615385rem;overflow:auto;width:80%}.mollie-instrument-list{display:flex !important;justify-content:flex-end}.mollie-instrument-left{margin-right:auto}.loadingSpinner .loadingOverlay{background-color:rgba(0,0,0,0)}.paymentProviderHeader-container{align-items:start;display:flex;justify-content:space-between}.paymentProviderHeader-container-googlePay{align-items:center}.paymentProviderHeader-subtitleContainer{flex-basis:100%}.paymentProviderHeader-nameContainer{display:flex;justify-content:space-between;flex-wrap:wrap}.paymentProviderHeader-img{align-self:center;display:flex;height:1.9230769231rem;object-fit:contain}.paymentProviderHeader-img+.paymentProviderHeader-name{margin-left:.75rem;white-space:nowrap}.paymentProviderHeader-img-applePay{height:2.3076923077rem;margin-top:.1875rem;margin-left:.375rem}.paymentProviderHeader-img-googlePay{height:2.3076923077rem}.googlePay-logo{height:3.0769230769rem}@media(min-width: 551px){.paymentProviderHeader-cc{align-items:flex-end;display:flex;flex-grow:0;flex-shrink:2}}.paymentProviderHeader-name{align-items:flex-end;align-self:start;display:flex;flex-grow:1;flex-shrink:1}@media(max-width: 481px){div[data-test=payment-method-sezzle] .paymentProviderHeader-name{visibility:hidden}}.paymentMethod--creditCard,.paymentMethod--hosted,.paymentMethod--walletButton{clear:both;padding:.6666666667rem 0}.button-masterpass-mark,.button-masterpass{background-color:#fcfcfc;background-image:url(https://masterpass.com/dyn/img/btn/global/mp_chk_btn_180x042px.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#fcfcfc;border-radius:.3846153846rem;height:3.2307692308rem;padding:0;width:13.8461538462rem}.button-masterpass{cursor:pointer;display:none}.button-masterpass-mark{cursor:default;margin:auto}body.klarna-payments-fso-open{scroll-behavior:auto}.stripe-sepa-mandate-disclaimer{margin-bottom:0;padding-bottom:1.5384615385rem}#stripe-card-field--invalid{border-color:#fa755a}#stripe-card-field--webkit-autofill{background-color:#fefde5 !important}.submitButtonContainer{margin-left:0;width:100%}.checkoutcom-sepa-column-container{display:flex;flex:1;flex-basis:100%;flex-direction:row;margin-bottom:0;padding-bottom:.3846153846rem}.checkoutcom-sepa-column-content{width:50%}.checkoutcom-sepa-title{margin-bottom:0;padding-bottom:.3846153846rem}.checkoutcom-sepa-line{margin-bottom:0}.payment-submit-button-bolt{font-size:16px}.payment-submit-button-bolt-icon{height:.9230769231rem;margin-right:.6153846154rem;width:.9230769231rem}.productList{list-style:none;margin-left:0;margin:0}.productList ul,.productList ol{list-style:none;margin-bottom:0}.productList-item{margin-bottom:3rem}@media(min-width: 551px){.productList-item{margin-bottom:1.5rem}}.productList-item:last-child{margin-bottom:0}.productList-item:nth-child(n+5){display:none}.productList-item.is-visible:nth-child(n+5){display:list-item}.product{display:flex;flex-wrap:wrap}@media(min-width: 551px){.product{flex-wrap:nowrap}}.product-figure{margin:0;padding-right:1.5rem;width:25%}.product-body{order:2;padding-right:0;width:100%;word-wrap:break-word}@media(min-width: 551px){.product-body{padding-right:.375rem;width:50%}}.product-title{margin-bottom:.1875rem}.product-options{color:#999;font-size:.8461538462rem;margin:0}.product-description{margin-top:.375rem}.product-actions{align-self:center;margin-left:auto}@media(min-width: 551px){.product-actions{align-self:flex-start;order:3;text-align:right;width:25%;word-wrap:break-word}}.product-price--beforeDiscount{text-decoration:line-through}.spamProtection-container{margin:0}@media(min-width: 551px){.spamProtection-container{margin-left:4.1923076923rem}}@media(min-width: 968px){.spamProtection-container{margin-left:0}}@media(min-width: 1080px){.spamProtection-container{margin-left:4.1923076923rem}}.spamProtection-panel{background-color:#fff;border:1px solid #ebebeb;border-radius:4px;display:flex;min-height:10rem;padding:.75rem;text-align:center}.spamProtection-panel-message{align-self:center;flex:1;margin:0}.storeCreditOverlay{align-items:center;background-color:hsla(0deg,0%,100%,.9);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:100}.storeCreditOverlay-text{margin:0;text-align:center}.orderConfirmation{padding:3rem 0 0}.orderConfirmation-section{border-bottom:1px solid #ebebeb;margin-bottom:2.5rem;padding:0 0 2.5rem}.orderConfirmation-section *:last-child{margin-bottom:0}.continueButtonContainer{margin-top:3rem}.trackingCodeIframe{left:-5000px;position:absolute}@media print{.guest-signup{display:none}.continueButtonContainer{display:none}}.widget{outline:0;padding-bottom:.75rem;width:100%}.widget--paymentMethod{background-color:#fcfcfc;border:1px solid #ddd;border-radius:4px;list-style:none;margin-left:0;padding-bottom:0}.widget--braintree .cardDetails{margin-bottom:0}.widget--opy{padding-bottom:0}.widget-header{display:block;padding:1rem 2.25rem 1rem 3.75rem}.widget-body{margin-left:3.75rem;margin-right:2.25rem}.widget-body.ng-enter,.widget-body.ng-leave{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.widget-body.ng-enter{max-height:0}.widget-body.ng-leave{max-height:26.9230769231rem}.widget-body.ng-enter.ng-enter-active{max-height:26.9230769231rem}.widget-body.ng-leave.ng-leave-active{max-height:0}.widget-body-enter,.widget-body-exit{overflow:hidden;transition:max-height 600ms cubic-bezier(0.77, 0, 0.175, 1)}.widget-body-enter{max-height:0}.widget-body-exit{max-height:26.9230769231rem}.widget-body-enter-active{max-height:26.9230769231rem}.widget-body-exit-active{max-height:0}.widget-container{padding:.6666666667rem 0}.widget-bodyCard{align-items:center;display:flex;flex-direction:column;justify-content:flex-start}.widget-header-googlepay{text-align:center}.widget-input--stripev3{color:#000;font:400 1.1rem/normal sans-serif;padding:1rem}.widget-input--stripev3::placeholder{color:#757575;font:400 1.1rem/normal sans-serif}.widget--stripev3{margin-bottom:1.5384615385rem;margin-top:1.5384615385rem;padding:1rem}@media screen and (max-width: 414px){.widget--stripev3{margin:1.5384615385rem 0 1.5384615385rem 0;padding:1rem 0 1rem 1rem;width:20rem}}@media screen and (max-width: 375px){.widget--stripev3{margin:1.5384615385rem -2rem 1.5384615385rem -2rem;padding:1rem 0 1rem 1rem;width:20rem}}@media screen and (max-width: 320px){.widget--stripev3{margin:1.5384615385rem -2rem 1.5384615385rem -3rem;padding:1rem 0 1rem .25rem;width:19rem}}.StripeElement--focus{border-color:#4496f6;box-shadow:none}.widget-link-amazonpay{padding-bottom:.375rem}.signout-link{padding-bottom:1.5rem;width:100%}.react-datepicker{border:none;color:inherit;font-family:inherit;font-size:inherit;position:relative}.react-datepicker__current-month{color:inherit;font-size:inherit;font-weight:inherit}.react-datepicker__day,.react-datepicker__day:hover{border-radius:50%}.react-datepicker__day--today{background-color:rgba(0,0,0,0);font-weight:700}.react-datepicker__day--keyboard-selected,.react-datepicker__day--keyboard-selected:hover,.react-datepicker__day--selected,.react-datepicker__day--selected:hover{background-color:#4496f6;border-radius:50%}.react-datepicker-popper{background-color:#fff;box-shadow:0 1px 4px rgba(95,95,95,.14);color:#5f5f5f;font-size:1rem;padding:.75rem;text-align:center;z-index:500}.react-datepicker__triangle{display:none}.react-datepicker__header{background:none;border:none}.react-datepicker__day-name{color:#999;font-size:.8461538462rem;font-weight:600;text-transform:uppercase}.datepicker{background-color:#fff;box-shadow:0 1px 4px rgba(95,95,95,.14);color:#5f5f5f;font-size:1rem;padding:1.5rem 0;text-align:center;z-index:500}.datepicker-attachment{position:absolute}.datepicker-month{font-size:1.1538461538rem;margin:0}.datepicker-back,.datepicker-next{color:#999;cursor:default;font-weight:700;padding:0}.datepicker-back{float:left;margin-left:1.5rem}.datepicker-back::before{content:"<";display:block}.datepicker-next{float:right;margin-right:1.5rem}.datepicker-next::before{content:">";display:block}.datepicker-days{border-collapse:separate;font-size:1rem;margin:1.5rem 1.5rem 0;table-layout:fixed}.datepicker-days-head{line-height:1.25}.datepicker-day-name{color:#999;font-size:.8461538462rem;font-weight:600;text-transform:uppercase}.datepicker-day{cursor:pointer;height:2.25rem;line-height:1;margin:.3846153846rem;position:relative;text-align:center;width:2.25rem;z-index:5}.datepicker-day:hover::before{background-color:#ebebeb}.datepicker-day.is-selected{color:#fff;cursor:pointer}.datepicker-day.is-selected::before,.datepicker-day.is-selected:hover::before{background-color:#4496f6}.datepicker-day::before,.datepicker-day.is-selected::before{border-radius:50%;bottom:.1538461538rem;content:"";left:.1538461538rem;position:absolute;right:.1538461538rem;top:.1538461538rem;z-index:-1}.datepicker-day.is-disabled{color:#999;cursor:default}.checkout-ach-form{display:flex;flex-flow:row wrap;margin:0 -4px;padding:.6666666667rem 0}.checkout-ach-form .mandate-text{padding:0 4px;margin-top:.75rem}.checkout-ach-form .form-fieldset{margin:0 4px}.checkout-ach-form .dynamic-form-field{margin-bottom:.75rem;padding:0 4px;width:100%}@media(min-width: 551px){.checkout-ach-form .dynamic-form-field--firstName,.checkout-ach-form .dynamic-form-field--lastName,.checkout-ach-form .dynamic-form-field--city{flex-basis:50%}}@media(min-width: 551px){.checkout-ach-form .dynamic-form-field--city{flex-basis:30%}}@media(min-width: 551px){.checkout-ach-form .dynamic-form-field--postalCode{flex-basis:70%}}.checkout-ach-form__instrument{width:100%;margin-bottom:.75rem}.dynamic-form-field--ratepayPhoneCountryCode{display:inline-flex;width:26%}.dynamic-form-field--ratepayPhoneNumber{display:inline-flex;width:calc(74% - .5em);margin-left:.5em}.dynamic-form-field--ratepayPhoneNumber>div{width:100%}@media only screen and (max-width: 500px){.dynamic-form-field--ratepayPhoneNumber{display:block;width:100%;margin:0}.dynamic-form-field--ratepayPhoneCountryCode{display:block;width:100%}}.checkout-page-skeleton--cart .item,.checkout-page-skeleton--cart .item--first,.checkout-page-skeleton--cart .item--product,.checkout-page-skeleton--cart .item--last,.checkout-page-skeleton--cart .item--coupon,.checkout-page-skeleton--cart .item--total,.checkout-page-skeleton--cart .item--tax,.checkout-page-skeleton .subscription,.order-confirmation-page-skeleton .text .line,.order-confirmation-page-skeleton .text{background:none;animation:none}@keyframes lightColorTransition{0%,100%{background-color:#ebebeb}50%{background-color:#fcfcfc}}.animated-grey-box,.checkout-page-skeleton div,.address-form-skeleton div,.checklist-skeleton div,.order-confirmation-page-skeleton div,.walletbuttons-skeleton div{background:#ebebeb;border-radius:4px;content:" ";display:block;height:3.6975rem;margin-bottom:1.5rem;animation:lightColorTransition 4000ms infinite cubic-bezier(0.13, 0.615, 0.315, 0.915)}.walletbuttons-skeleton div{height:36px;margin-bottom:0}.order-confirmation-page-skeleton .thankyou{margin-top:3rem;width:38.2%}.order-confirmation-page-skeleton .line-1,.order-confirmation-page-skeleton .line-2{width:100%;height:.8616rem;margin-bottom:.75rem}.order-confirmation-page-skeleton .line-2{width:22%;margin-bottom:3rem}.order-confirmation-page-skeleton .continue{width:120px}.order-confirmation-page-skeleton .text{height:auto}.order-confirmation-page-skeleton .text div{height:1.220175rem;margin-bottom:.375rem}.order-confirmation-page-skeleton .text .t1{width:20%}.order-confirmation-page-skeleton .text .t2{width:8%}.order-confirmation-page-skeleton .text .t3{width:15%}.order-confirmation-page-skeleton .text .t4{width:25%}.order-confirmation-page-skeleton .text .first-line{margin-bottom:.75rem}.order-confirmation-page-skeleton .text .line{display:flex;gap:.375rem}.order-confirmation-page-skeleton .text .line:first-child{margin-bottom:1.5rem}.order-confirmation-page-skeleton .text .line:last-child{margin-bottom:4.5rem}.checkout-page-skeleton .title--first,.checkout-page-skeleton .mobile-title--first{margin-top:3rem;width:120px}.checkout-page-skeleton .title{width:100px;height:2.44035rem;margin:3rem 0 3.75rem}.checkout-page-skeleton .textbox{width:100%}.checkout-page-skeleton .subscription,.checkout-page-skeleton .terms--1,.checkout-page-skeleton .terms--2{height:.8616rem;margin-bottom:.75rem}.checkout-page-skeleton .subscription{width:33%;display:flex;gap:.7395rem}.checkout-page-skeleton .subscription div{background:#ebebeb;height:100%}.checkout-page-skeleton .subscription .checkbox{width:.7395rem}.checkout-page-skeleton .subscription .description{flex-grow:3}.checkout-page-skeleton .terms--1{width:55%}.checkout-page-skeleton .terms--2{width:44%;margin-bottom:4.125rem}.checkout-page-skeleton .walletbutton--tagline{margin:3rem 0 .75rem;height:.8616rem;width:45%}.checkout-page-skeleton .walletbutton{height:3.32775rem}.checkout-page-skeleton .walletbutton--divider{height:1.479rem;width:5%;margin:auto}.checkout-page-skeleton .mobile-title--first,.checkout-page-skeleton .mobile-title--2,.checkout-page-skeleton .mobile-title--3,.checkout-page-skeleton .mobile-title--4{margin-top:2.25rem;margin-bottom:.75rem;height:2.44035rem}.checkout-page-skeleton .mobile-title--2{width:100px}.checkout-page-skeleton .mobile-title--3{width:80px}.checkout-page-skeleton .mobile-title--4{width:105px}.checkout-page-skeleton .divider{border-bottom:1px solid #ebebeb;background:none;border-radius:0;height:0}.checkout-page-skeleton .divider:last-child{margin-top:3rem}.checkout-page-skeleton--cart{min-height:479px;padding:1.5rem}.checkout-page-skeleton--cart .item,.checkout-page-skeleton--cart .item--first,.checkout-page-skeleton--cart .item--product,.checkout-page-skeleton--cart .item--last,.checkout-page-skeleton--cart .item--coupon,.checkout-page-skeleton--cart .item--total,.checkout-page-skeleton--cart .item--tax{display:flex;justify-content:space-between;height:auto;margin-bottom:1.5rem}.checkout-page-skeleton--cart .item div,.checkout-page-skeleton--cart .item--first div,.checkout-page-skeleton--cart .item--product div,.checkout-page-skeleton--cart .item--last div,.checkout-page-skeleton--cart .item--coupon div,.checkout-page-skeleton--cart .item--total div,.checkout-page-skeleton--cart .item--tax div{width:18%;height:.9693rem;margin-bottom:0}.checkout-page-skeleton--cart .item--first{margin-bottom:3rem}.checkout-page-skeleton--cart .item--first div{width:32%;height:1.2924rem}.checkout-page-skeleton--cart .item--product .figure{width:22%;height:5.54625rem;margin-bottom:1.5rem}.checkout-page-skeleton--cart .item--product .name{width:40%}.checkout-page-skeleton--cart .item--coupon{padding-bottom:.75rem}.checkout-page-skeleton--cart .item--coupon div{width:48%}.checkout-page-skeleton--cart .item--total{padding:1.5rem 0}.checkout-page-skeleton--cart .item--total div{width:26%}.checkout-page-skeleton--cart .item--tax{padding-top:.75rem}.checkout-page-skeleton--cart .item--tax div{width:40%}.checkout-page-skeleton--cart .item--last{margin-bottom:0}.checkout-page-skeleton--cartdrawer{display:flex;justify-content:space-between;align-items:center;height:50px;width:100%}.checkout-page-skeleton--cartdrawer .animated-grey-box{margin-bottom:0}.checkout-page-skeleton--cartdrawer .product{display:flex;align-items:center;gap:.75rem;width:50%}.checkout-page-skeleton--cartdrawer .product .figure{width:50px;height:50px}.checkout-page-skeleton--cartdrawer .product .details{display:flex;flex-direction:column;width:50%}.checkout-page-skeleton--cartdrawer .product .details .name{width:50%;height:1.10925rem;margin-bottom:.375rem}.checkout-page-skeleton--cartdrawer .product .details .description{width:100%;height:.7395rem}.checkout-page-skeleton--cartdrawer .more{width:4.437rem;height:1.663875rem}.address-form-skeleton{display:flex;justify-content:space-between;gap:.75rem}.address-form-skeleton div{margin-bottom:.75rem;height:2.44035rem}.address-form-skeleton .label{width:140px;height:.9693rem}.address-form-skeleton .name{flex-grow:1}.address-form-skeleton .address{width:100%;margin-bottom:3rem}.checklist-skeleton div{width:100%;margin-bottom:.75rem;height:2.44035rem}.shippingOptions-skeleton{margin-left:0}.layout{margin:0 auto;max-width:92.3076923077rem;width:100%;min-height:15.3846153846rem;padding:0 1.5rem 7.5rem}.layout:before,.layout:after{content:" ";display:table}.layout:after{clear:both}@media(min-width: 968px){.layout{padding-bottom:1.5rem}}.layout-cart{padding-left:1.1538461538rem;padding-right:1.1538461538rem;width:100%;float:left}@media(min-width: 968px){.layout-cart{width:41.6666666667%}}@media(min-width: 1261px){.layout-cart{width:33.3333333333%}}.layout-cart.is-sticky{position:sticky;top:0}.layout-main{padding-left:1.1538461538rem;padding-right:1.1538461538rem;width:100%;float:left}@media(min-width: 968px){.layout-main{width:58.3333333333%}}@media(min-width: 1261px){.layout-main{width:66.6666666667%}}@media(min-width: 1261px){.layout-main{padding-right:6rem}}@media print{@page{margin:1.5rem 0;size:auto}.layout-cart{display:block;float:none;page-break-inside:auto;position:static !important;width:75%}.layout-main{float:none;width:75%}}.themeV2 .header,.themeV2 .header-secondary,.themeV2 .sub-header{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1.9230769231rem;font-weight:700}.themeV2 .header-secondary{color:#757575}.themeV2 .sub-header{font-size:1.1538461538rem}.themeV2 .body-regular,.themeV2 .body-cta,.themeV2 .body-medium,.themeV2 .body-bold{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400}.themeV2 .body-cta{color:#476bef}.themeV2 .body-medium{font-weight:500}.themeV2 .body-bold{font-weight:700}.themeV2 .sub-text,.themeV2 .sub-text-medium,.themeV2 .sub-text-bold{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:.8461538462rem;font-weight:400}.themeV2 .sub-text-medium{color:#757575;font-weight:500}.themeV2 .sub-text-bold{font-weight:700}.themeV2 .body-bold.button--primary:not(:disabled),.themeV2 .body-medium.button--primary:not(:disabled){color:#fff}.themeV2 .form-checkbox+.form-label.body-regular,.themeV2 .form-radio+.form-label.body-regular{color:#000;font-size:1rem;font-weight:400}.themeV2 .shippingOptionLabel .shippingOption-price.body-medium,.themeV2 .shippingOptionLabel .shippingOption-desc.body-medium{font-size:1rem;font-weight:500}.themeV2 .body-medium small{color:#000;font-family:"Montserrat","Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:500}.themeV2 .add-consignment-button.body-regular{color:#000}.themeV2 .floating-select,.themeV2 .floating-input{background-color:#fcfcfc}.themeV2 .form-field:not(.form-field--error) .floating-input:not(:focus),.themeV2 .form-field:not(.form-field--error) .floating-select:not(:focus),.themeV2 .form-field:not(.form-field--error) .floating-textarea{border-color:#ddd}.themeV2 .form-checklist-checkbox~.form-label::before,.themeV2 .form-checklist-checkbox~.form-label::after{background-color:#fff}.themeV2 .form-checklist-checkbox~.form-label::after{transform:scale(0.36)}.themeV2 .form-checklist-checkbox:checked~.form-label::before{background-color:#4496f6}.themeV2{background-color:#f5f5f5}.themeV2 .layout{padding:0}@media(min-width: 551px){.themeV2 .layout{padding:0 1.5rem 7.5rem}}.themeV2 .layout-main{padding:0}@media(min-width: 551px){.themeV2 .layout-main{padding-left:1.1538461538rem;padding-right:1.1538461538rem;width:100%;float:left}}@media(min-width: 968px){.themeV2 .layout-main{width:58.3333333333%}}@media(min-width: 1261px){.themeV2 .layout-main{width:66.6666666667%}}@media(min-width: 1261px){.themeV2 .layout-main{padding-right:1.5rem}}.themeV2 .cart{border:none}.themeV2 .checkout-separator::before,.themeV2 .checkout-separator::after{background-color:#000}.themeV2 .checkout-steps{margin-top:2rem}.themeV2 .checkout-step{background-color:#fff;border-bottom:none;padding:2rem;margin:1.5rem 0}.themeV2 .stepHeader{flex-wrap:wrap;padding:0}.themeV2 .stepHeader .stepHeader-body{order:3;width:100%;margin-left:0;margin-top:.7692307692rem}.themeV2 .stepHeader .stepHeader-actions{margin-left:auto;align-self:flex-start}.themeV2 .stepHeader .stepHeader-figure{align-items:flex-end}@media(min-width: 968px){.themeV2 .checkout-button-container{padding-right:6rem}}.themeV2 .checkout-step--customer .customerEmail-container{display:flex}@media(min-width: 968px){.themeV2 .checkout-step--customer .customerEmail-container{flex-direction:row}.themeV2 .checkout-step--customer .customerEmail-body{width:80%}}.themeV2 .layout-cart .cart-priceItem:last-child{margin-bottom:0}@media(min-width: 968px){.themeV2 .layout-cart{position:sticky;right:auto;left:auto;top:0;bottom:0}} .errorCode{font-size:.75rem;opacity:.4}.errorCode .errorCode-value{word-break:break-word} .discountBanner{margin-top:1.5rem}.discountBanner .alertBox{border-radius:4px}.discountBannerList{list-style:none;margin:0;margin-left:0}.discountBannerList ul,.discountBannerList ol{list-style:none;margin-bottom:0} .lazyContainer-error{padding:3rem;text-align:center} diff --git a/package.json b/package.json index 8fe3edda02..7916339d73 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,14 @@ "nx:prerelease-build": "nx run core:prerelease-build", "nx:dev": "nx run core:dev", "preinstall": "npx check-node-version --package", + "postinstall": "node scripts/install-cloudflared.js || echo 'โš ๏ธ Cloudflared installation failed - tunnel features will be unavailable'", "prebuild": "rm -rf dist && rm -rf packages/test-framework/report", "build": "npm-run-all nx:build", "build:server": "http-server dist", "typecheck": "tsc --noEmit -p ./tsconfig.base.json", "dev": "npm-run-all nx:dev", + "dev:full": "node scripts/dev-server.js", + "dev:tunnel": "node scripts/dev-server.js --tunnel", "dev:vm": "WEBPACK_DONE='rsync -rvc --progress --delete --compress-level=9 build store.bcdev:/opt/bigcommerce_app/vagrant_code/vendor/bower_components/checkout-js/' npm run dev", "dev:server": "http-server build --cors", "e2e": "npm run build && npx playwright install && PORT=5005 MODE=REPLAY npx playwright test", diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000000..cc691b4b43 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,66 @@ +# Development Server Enhancement + +This directory contains enhanced development server scripts that improve the BigCommerce Checkout JS development workflow. + +## Scripts + +### dev-server.js +Main development server script that combines webpack development build with HTTP server and optional Cloudflare Tunnels integration. + +**Features:** +- Unified command to start both webpack dev build and HTTP server +- Optional HTTPS tunneling via Cloudflare Tunnels +- Automatic process management and cleanup +- Configurable via CLI arguments or environment variables +- Verbose logging mode for debugging + +### install-cloudflared.js +Automatically downloads and installs the cloudflared binary required for tunnel functionality. + +**Features:** +- Automatic download from GitHub releases +- Cross-platform support (currently Linux) +- Proper executable permissions setup +- Graceful failure handling + +### test-dev-server.js +Test script to verify the development server functionality. + +**Features:** +- Automated testing of dev server startup +- HTTP endpoint validation +- Proper cleanup and error handling + +## Usage Examples + +```bash +# Basic development server +npm run dev:full + +# Development server with HTTPS tunnel +npm run dev:tunnel + +# Custom port and verbose logging +DEV_SERVER_PORT=3000 DEV_SERVER_VERBOSE=true npm run dev:full + +# Using the script directly +node scripts/dev-server.js --help +node scripts/dev-server.js --port 9000 --tunnel --verbose +``` + +## Environment Variables + +- `DEV_SERVER_TUNNEL`: Enable tunnel mode ('true'/'false') +- `DEV_SERVER_PORT`: HTTP server port (default: 8080) +- `DEV_SERVER_VERBOSE`: Enable verbose logging ('true'/'false') +- `CLOUDFLARED_PATH`: Custom path to cloudflared binary + +## Architecture + +The dev-server.js script manages multiple processes: + +1. **Webpack Process**: Runs `npm run dev` for watch mode compilation +2. **HTTP Server Process**: Runs `http-server` on the build directory +3. **Cloudflared Process** (optional): Creates HTTPS tunnel + +All processes are managed with proper signal handling and cleanup on exit. \ No newline at end of file diff --git a/scripts/dev-server.js b/scripts/dev-server.js new file mode 100755 index 0000000000..7275beac33 --- /dev/null +++ b/scripts/dev-server.js @@ -0,0 +1,352 @@ +#!/usr/bin/env node + +const { spawn } = require('child_process'); +const path = require('path'); +const fs = require('fs'); +const { promisify } = require('util'); + +const access = promisify(fs.access); + +class DevServer { + constructor(options = {}) { + this.options = { + port: options.port || 8080, + enableTunnel: options.enableTunnel || false, + cloudflaredPath: options.cloudflaredPath || '/tmp/cloudflared', + buildDir: options.buildDir || 'build', + verbose: options.verbose || false, + ...options + }; + + this.processes = []; + this.tunnelUrl = null; + this.serverReady = false; + this.webpackReady = false; + } + + log(message, force = false) { + if (this.options.verbose || force) { + console.log(`[DevServer] ${message}`); + } + } + + error(message) { + console.error(`[DevServer ERROR] ${message}`); + } + + async checkCloudflaredAvailable() { + try { + await access(this.options.cloudflaredPath, fs.constants.F_OK | fs.constants.X_OK); + return true; + } catch { + return false; + } + } + + startWebpack() { + return new Promise((resolve, reject) => { + this.log('Starting webpack in development mode...'); + + const webpackProcess = spawn('npm', ['run', 'dev'], { + stdio: ['inherit', 'pipe', 'pipe'], + cwd: process.cwd() + }); + + this.processes.push(webpackProcess); + + let initialBuildComplete = false; + + webpackProcess.stdout.on('data', (data) => { + const output = data.toString(); + if (this.options.verbose) { + process.stdout.write(`[Webpack] ${output}`); + } + + // Look for webpack compilation completion indicators + if (output.includes('webpack compiled') || output.includes('built at:')) { + if (!initialBuildComplete) { + this.log('Webpack initial build completed', true); + this.webpackReady = true; + initialBuildComplete = true; + resolve(); + } + } + }); + + webpackProcess.stderr.on('data', (data) => { + const output = data.toString(); + if (this.options.verbose || output.includes('ERROR')) { + process.stderr.write(`[Webpack] ${output}`); + } + }); + + webpackProcess.on('close', (code) => { + if (code !== 0 && !initialBuildComplete) { + reject(new Error(`Webpack process exited with code ${code}`)); + } + }); + + // Fallback timeout in case we miss the completion message + setTimeout(() => { + if (!initialBuildComplete) { + this.log('Webpack build timeout reached, assuming ready', true); + this.webpackReady = true; + resolve(); + } + }, 60000); // 60 second timeout + }); + } + + startHttpServer() { + return new Promise((resolve, reject) => { + this.log(`Starting HTTP server on port ${this.options.port}...`); + + const serverProcess = spawn('npx', ['http-server', this.options.buildDir, '--cors', '-p', this.options.port.toString()], { + stdio: ['inherit', 'pipe', 'pipe'], + cwd: process.cwd() + }); + + this.processes.push(serverProcess); + + serverProcess.stdout.on('data', (data) => { + const output = data.toString(); + if (this.options.verbose) { + process.stdout.write(`[HTTP Server] ${output}`); + } + + // Look for server start indicators + if (output.includes('Available on:') || output.includes(`http://127.0.0.1:${this.options.port}`)) { + this.log(`HTTP server ready on http://localhost:${this.options.port}`, true); + this.serverReady = true; + resolve(); + } + }); + + serverProcess.stderr.on('data', (data) => { + const output = data.toString(); + if (this.options.verbose || output.includes('ERROR') || output.includes('EADDRINUSE')) { + process.stderr.write(`[HTTP Server] ${output}`); + } + + if (output.includes('EADDRINUSE')) { + reject(new Error(`Port ${this.options.port} is already in use`)); + } + }); + + serverProcess.on('close', (code) => { + if (code !== 0) { + reject(new Error(`HTTP server process exited with code ${code}`)); + } + }); + + // Fallback timeout + setTimeout(() => { + if (!this.serverReady) { + this.log('HTTP server timeout reached, assuming ready', true); + this.serverReady = true; + resolve(); + } + }, 10000); // 10 second timeout + }); + } + + async startCloudflaredTunnel() { + if (!this.options.enableTunnel) { + return; + } + + const cloudflaredAvailable = await this.checkCloudflaredAvailable(); + if (!cloudflaredAvailable) { + this.error(`Cloudflared not found at ${this.options.cloudflaredPath}. Download it from https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/`); + return; + } + + return new Promise((resolve, reject) => { + this.log('Starting Cloudflare Tunnel...', true); + + const tunnelProcess = spawn(this.options.cloudflaredPath, ['tunnel', '--url', `http://localhost:${this.options.port}`], { + stdio: ['inherit', 'pipe', 'pipe'], + cwd: process.cwd() + }); + + this.processes.push(tunnelProcess); + let tunnelStarted = false; + + tunnelProcess.stdout.on('data', (data) => { + const output = data.toString(); + if (this.options.verbose) { + process.stdout.write(`[Cloudflared] ${output}`); + } + + // Extract tunnel URL from cloudflared output + const urlMatch = output.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/); + if (urlMatch && !this.tunnelUrl) { + this.tunnelUrl = urlMatch[0]; + this.log(`๐ŸŒฉ๏ธ Cloudflare Tunnel ready: ${this.tunnelUrl}`, true); + this.log(`๐Ÿ”— Auto-loader URL: ${this.tunnelUrl}/auto-loader-dev.js`, true); + tunnelStarted = true; + resolve(); + } + + // Look for successful connection messages + if (output.includes('Connection') && output.includes('registered')) { + tunnelStarted = true; + } + }); + + tunnelProcess.stderr.on('data', (data) => { + const output = data.toString(); + if (this.options.verbose || output.includes('error') || output.includes('failed')) { + process.stderr.write(`[Cloudflared] ${output}`); + } + + // Handle common errors + if (output.includes('failed to lookup TXT record') || output.includes('no such host')) { + this.log('โš ๏ธ Cloudflare tunnel may need internet connectivity - continuing without tunnel', true); + if (!tunnelStarted) { + tunnelStarted = true; + resolve(); + } + } + }); + + tunnelProcess.on('close', (code) => { + if (code !== 0 && !tunnelStarted) { + this.log(`โš ๏ธ Cloudflare tunnel failed (exit code ${code}) - continuing without tunnel`, true); + this.log('๐Ÿ’ก Tunnel requires internet connectivity. Local development server is still available.', true); + resolve(); + } else if (code !== 0) { + this.log(`Cloudflare tunnel process exited with code ${code}`, true); + } + }); + + // Timeout for tunnel establishment + setTimeout(() => { + if (!tunnelStarted) { + this.log('โš ๏ธ Cloudflare tunnel timeout - continuing without tunnel', true); + this.log('๐Ÿ’ก This is normal in offline environments. Local server is ready at http://localhost:' + this.options.port, true); + resolve(); + } + }, 20000); // 20 second timeout + }); + } + + async start() { + try { + this.log('๐Ÿš€ Starting development server...', true); + + // Start webpack and wait for initial build + await this.startWebpack(); + + // Start HTTP server + await this.startHttpServer(); + + // Start tunnel if enabled + if (this.options.enableTunnel) { + await this.startCloudflaredTunnel(); + } + + this.log('โœ… Development server is ready!', true); + this.log(`๐Ÿ“ Build directory: ${this.options.buildDir}`, true); + this.log(`๐ŸŒ Local server: http://localhost:${this.options.port}`, true); + if (this.tunnelUrl) { + this.log(`๐ŸŒฉ๏ธ HTTPS tunnel: ${this.tunnelUrl}`, true); + this.log(`๐Ÿ”ง For Custom Checkout, use: ${this.tunnelUrl}/auto-loader-dev.js`, true); + } + + } catch (error) { + this.error(`Failed to start development server: ${error.message}`); + this.cleanup(); + process.exit(1); + } + } + + cleanup() { + this.log('Cleaning up processes...', true); + this.processes.forEach(proc => { + if (proc && !proc.killed) { + proc.kill('SIGTERM'); + } + }); + } + + setupSignalHandlers() { + process.on('SIGINT', () => { + this.log('Received SIGINT, shutting down...', true); + this.cleanup(); + process.exit(0); + }); + + process.on('SIGTERM', () => { + this.log('Received SIGTERM, shutting down...', true); + this.cleanup(); + process.exit(0); + }); + } +} + +// CLI interface +if (require.main === module) { + const args = process.argv.slice(2); + const options = {}; + + // Parse command line arguments + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + switch (arg) { + case '--tunnel': + options.enableTunnel = true; + break; + case '--port': + options.port = parseInt(args[++i], 10); + break; + case '--verbose': + options.verbose = true; + break; + case '--cloudflared-path': + options.cloudflaredPath = args[++i]; + break; + case '--help': + console.log(` +Usage: node scripts/dev-server.js [options] + +Options: + --tunnel Enable Cloudflare Tunnel for HTTPS access + --port Port for HTTP server (default: 8080) + --verbose Enable verbose logging + --cloudflared-path Path to cloudflared binary (default: /tmp/cloudflared) + --help Show this help message + +Examples: + node scripts/dev-server.js + node scripts/dev-server.js --tunnel + node scripts/dev-server.js --port 3000 --tunnel --verbose + `); + process.exit(0); + break; + } + } + + // Check environment variables + if (process.env.DEV_SERVER_TUNNEL === 'true') { + options.enableTunnel = true; + } + if (process.env.DEV_SERVER_PORT) { + options.port = parseInt(process.env.DEV_SERVER_PORT, 10); + } + if (process.env.DEV_SERVER_VERBOSE === 'true') { + options.verbose = true; + } + if (process.env.CLOUDFLARED_PATH) { + options.cloudflaredPath = process.env.CLOUDFLARED_PATH; + } + + const devServer = new DevServer(options); + devServer.setupSignalHandlers(); + devServer.start().catch(error => { + console.error('Failed to start dev server:', error); + process.exit(1); + }); +} + +module.exports = DevServer; \ No newline at end of file diff --git a/scripts/install-cloudflared.js b/scripts/install-cloudflared.js new file mode 100755 index 0000000000..27b0f33669 --- /dev/null +++ b/scripts/install-cloudflared.js @@ -0,0 +1,93 @@ +#!/usr/bin/env node + +const { spawn } = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const https = require('https'); +const { promisify } = require('util'); + +const access = promisify(fs.access); +const chmod = promisify(fs.chmod); + +class CloudflaredInstaller { + constructor() { + this.cloudflaredPath = '/tmp/cloudflared'; + } + + async isCloudflaredInstalled() { + try { + await access(this.cloudflaredPath, fs.constants.F_OK | fs.constants.X_OK); + return true; + } catch { + return false; + } + } + + async downloadCloudflared() { + return new Promise((resolve, reject) => { + console.log('๐Ÿ“ฅ Downloading cloudflared...'); + + const url = 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64'; + const file = fs.createWriteStream(this.cloudflaredPath); + + https.get(url, (response) => { + if (response.statusCode === 302 || response.statusCode === 301) { + // Follow redirect + https.get(response.headers.location, (redirectResponse) => { + redirectResponse.pipe(file); + file.on('finish', async () => { + file.close(); + try { + await chmod(this.cloudflaredPath, 0o755); + console.log('โœ… Cloudflared downloaded and made executable'); + resolve(); + } catch (error) { + reject(new Error(`Failed to make cloudflared executable: ${error.message}`)); + } + }); + }).on('error', reject); + } else { + response.pipe(file); + file.on('finish', async () => { + file.close(); + try { + await chmod(this.cloudflaredPath, 0o755); + console.log('โœ… Cloudflared downloaded and made executable'); + resolve(); + } catch (error) { + reject(new Error(`Failed to make cloudflared executable: ${error.message}`)); + } + }); + } + }).on('error', reject); + }); + } + + async install() { + const isInstalled = await this.isCloudflaredInstalled(); + + if (isInstalled) { + console.log('โœ… Cloudflared is already installed'); + return; + } + + try { + await this.downloadCloudflared(); + } catch (error) { + console.error('โŒ Failed to install cloudflared:', error.message); + console.log('๐Ÿ’ก You can manually download cloudflared from:'); + console.log(' https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/'); + throw error; + } + } +} + +// CLI interface +if (require.main === module) { + const installer = new CloudflaredInstaller(); + installer.install().catch(error => { + process.exit(1); + }); +} + +module.exports = CloudflaredInstaller; \ No newline at end of file diff --git a/scripts/test-dev-server.js b/scripts/test-dev-server.js new file mode 100755 index 0000000000..b459ead7f4 --- /dev/null +++ b/scripts/test-dev-server.js @@ -0,0 +1,96 @@ +#!/usr/bin/env node + +/** + * Quick test script to verify the dev server functionality + */ + +const { spawn } = require('child_process'); +const http = require('http'); + +async function testDevServer() { + console.log('๐Ÿงช Testing dev server functionality...'); + + // Start the dev server + const devServer = spawn('node', ['scripts/dev-server.js', '--port', '8081'], { + stdio: ['inherit', 'pipe', 'pipe'], + cwd: process.cwd() + }); + + let serverReady = false; + + // Wait for server to be ready + const serverReadyPromise = new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + reject(new Error('Server start timeout')); + }, 120000); // 2 minutes timeout + + devServer.stdout.on('data', (data) => { + const output = data.toString(); + console.log('[DevServer]', output.trim()); + + if (output.includes('Development server is ready!') && !serverReady) { + serverReady = true; + clearTimeout(timeout); + resolve(); + } + }); + + devServer.stderr.on('data', (data) => { + console.error('[DevServer Error]', data.toString().trim()); + }); + + devServer.on('close', (code) => { + if (code !== 0 && !serverReady) { + clearTimeout(timeout); + reject(new Error(`Dev server exited with code ${code}`)); + } + }); + }); + + try { + await serverReadyPromise; + console.log('โœ… Dev server started successfully'); + + // Test HTTP endpoint + console.log('๐ŸŒ Testing HTTP endpoint...'); + const testResponse = await new Promise((resolve, reject) => { + const req = http.get('http://localhost:8081/auto-loader-dev.js', (res) => { + if (res.statusCode === 200) { + console.log('โœ… auto-loader-dev.js is accessible'); + resolve(true); + } else { + reject(new Error(`HTTP ${res.statusCode}`)); + } + res.resume(); // Consume response to free up memory + }); + + req.on('error', reject); + req.setTimeout(5000, () => { + req.destroy(); + reject(new Error('HTTP request timeout')); + }); + }); + + console.log('๐ŸŽ‰ All tests passed!'); + + } catch (error) { + console.error('โŒ Test failed:', error.message); + process.exit(1); + } finally { + // Clean up + console.log('๐Ÿงน Cleaning up...'); + devServer.kill('SIGTERM'); + + // Wait a bit for cleanup + await new Promise(resolve => setTimeout(resolve, 2000)); + } +} + +if (require.main === module) { + testDevServer().catch(error => { + console.error('Test runner failed:', error); + process.exit(1); + }); +} + +module.exports = testDevServer; \ No newline at end of file From cc82a8c3c0c562271ef0749784b4aa508663ba9b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 6 Sep 2025 04:26:53 +0000 Subject: [PATCH 3/3] Replace Cloudflare direct integration with listhen Co-authored-by: bookernath <8922457+bookernath@users.noreply.github.com> --- package.json | 2 +- scripts/README.md | 40 ++--- scripts/dev-server.js | 292 +++++++++++++++++---------------- scripts/install-cloudflared.js | 93 ----------- scripts/test-dev-server.js | 8 +- 5 files changed, 179 insertions(+), 256 deletions(-) mode change 100755 => 100644 scripts/dev-server.js delete mode 100755 scripts/install-cloudflared.js diff --git a/package.json b/package.json index 7916339d73..eab5f920d1 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "nx:prerelease-build": "nx run core:prerelease-build", "nx:dev": "nx run core:dev", "preinstall": "npx check-node-version --package", - "postinstall": "node scripts/install-cloudflared.js || echo 'โš ๏ธ Cloudflared installation failed - tunnel features will be unavailable'", "prebuild": "rm -rf dist && rm -rf packages/test-framework/report", "build": "npm-run-all nx:build", "build:server": "http-server dist", @@ -160,6 +159,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-junit": "^15.0.0", + "listhen": "^1.9.0", "mini-css-extract-plugin": "^2.6.0", "msw": "^1.3.2", "npm-run-all": "^4.1.5", diff --git a/scripts/README.md b/scripts/README.md index cc691b4b43..088e47a6e0 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,27 +1,19 @@ # Development Server Enhancement -This directory contains enhanced development server scripts that improve the BigCommerce Checkout JS development workflow. +This directory contains enhanced development server scripts that improve the BigCommerce Checkout JS development workflow using [listhen](https://github.com/unjs/listhen). ## Scripts ### dev-server.js -Main development server script that combines webpack development build with HTTP server and optional Cloudflare Tunnels integration. +Main development server script that combines webpack development build with HTTP server and optional tunneling via listhen. **Features:** - Unified command to start both webpack dev build and HTTP server -- Optional HTTPS tunneling via Cloudflare Tunnels -- Automatic process management and cleanup +- Optional HTTPS tunneling via listhen (powered by untun) +- Automatic port selection and process management - Configurable via CLI arguments or environment variables - Verbose logging mode for debugging - -### install-cloudflared.js -Automatically downloads and installs the cloudflared binary required for tunnel functionality. - -**Features:** -- Automatic download from GitHub releases -- Cross-platform support (currently Linux) -- Proper executable permissions setup -- Graceful failure handling +- Built-in static file serving with CORS support ### test-dev-server.js Test script to verify the development server functionality. @@ -51,16 +43,26 @@ node scripts/dev-server.js --port 9000 --tunnel --verbose ## Environment Variables - `DEV_SERVER_TUNNEL`: Enable tunnel mode ('true'/'false') -- `DEV_SERVER_PORT`: HTTP server port (default: 8080) +- `DEV_SERVER_PORT`: HTTP server port (default: 8080, auto-selected with listhen) - `DEV_SERVER_VERBOSE`: Enable verbose logging ('true'/'false') -- `CLOUDFLARED_PATH`: Custom path to cloudflared binary +- `DEV_SERVER_BUILD_DIR`: Build directory to serve (default: build) ## Architecture -The dev-server.js script manages multiple processes: +The dev-server.js script manages: 1. **Webpack Process**: Runs `npm run dev` for watch mode compilation -2. **HTTP Server Process**: Runs `http-server` on the build directory -3. **Cloudflared Process** (optional): Creates HTTPS tunnel +2. **Listhen Server**: Elegant HTTP server with optional tunneling capabilities + - Static file serving for the build directory + - Automatic CORS headers + - SPA routing support (fallback to index.html) + - Optional HTTPS tunnel via untun/cloudflared + +All processes are managed with proper signal handling and cleanup on exit. + +## Benefits of Listhen Integration -All processes are managed with proper signal handling and cleanup on exit. \ No newline at end of file +- **Automatic port selection**: No more port conflicts during development +- **Built-in tunneling**: Simplified tunnel setup without manual cloudflared installation +- **Better error handling**: Graceful fallbacks when tunneling is unavailable +- **Modern architecture**: Based on unjs ecosystem with h3 and nitro foundation \ No newline at end of file diff --git a/scripts/dev-server.js b/scripts/dev-server.js old mode 100755 new mode 100644 index 7275beac33..85dd363fea --- a/scripts/dev-server.js +++ b/scripts/dev-server.js @@ -1,8 +1,10 @@ #!/usr/bin/env node const { spawn } = require('child_process'); -const path = require('path'); +const { listen } = require('listhen'); +const { createApp, eventHandler } = require('h3'); const fs = require('fs'); +const path = require('path'); const { promisify } = require('util'); const access = promisify(fs.access); @@ -12,13 +14,13 @@ class DevServer { this.options = { port: options.port || 8080, enableTunnel: options.enableTunnel || false, - cloudflaredPath: options.cloudflaredPath || '/tmp/cloudflared', buildDir: options.buildDir || 'build', verbose: options.verbose || false, ...options }; this.processes = []; + this.serverInstance = null; this.tunnelUrl = null; this.serverReady = false; this.webpackReady = false; @@ -34,9 +36,9 @@ class DevServer { console.error(`[DevServer ERROR] ${message}`); } - async checkCloudflaredAvailable() { + async checkBuildDirectory() { try { - await access(this.options.cloudflaredPath, fs.constants.F_OK | fs.constants.X_OK); + await access(this.options.buildDir, fs.constants.F_OK); return true; } catch { return false; @@ -97,138 +99,144 @@ class DevServer { }); } - startHttpServer() { - return new Promise((resolve, reject) => { - this.log(`Starting HTTP server on port ${this.options.port}...`); + createStaticFileHandler() { + return eventHandler(async (event) => { + let filePath = event.node.req.url; - const serverProcess = spawn('npx', ['http-server', this.options.buildDir, '--cors', '-p', this.options.port.toString()], { - stdio: ['inherit', 'pipe', 'pipe'], - cwd: process.cwd() - }); - - this.processes.push(serverProcess); - - serverProcess.stdout.on('data', (data) => { - const output = data.toString(); - if (this.options.verbose) { - process.stdout.write(`[HTTP Server] ${output}`); - } - - // Look for server start indicators - if (output.includes('Available on:') || output.includes(`http://127.0.0.1:${this.options.port}`)) { - this.log(`HTTP server ready on http://localhost:${this.options.port}`, true); - this.serverReady = true; - resolve(); - } - }); - - serverProcess.stderr.on('data', (data) => { - const output = data.toString(); - if (this.options.verbose || output.includes('ERROR') || output.includes('EADDRINUSE')) { - process.stderr.write(`[HTTP Server] ${output}`); - } + // Remove query parameters + const urlParts = filePath.split('?'); + filePath = urlParts[0]; + + // Handle root path + if (filePath === '/') { + filePath = '/index.html'; + } + + // Security: prevent directory traversal + if (filePath.includes('..')) { + event.node.res.statusCode = 400; + return 'Bad Request'; + } + + const fullPath = path.join(this.options.buildDir, filePath); + + try { + // Check if file exists + await access(fullPath, fs.constants.F_OK); - if (output.includes('EADDRINUSE')) { - reject(new Error(`Port ${this.options.port} is already in use`)); - } - }); - - serverProcess.on('close', (code) => { - if (code !== 0) { - reject(new Error(`HTTP server process exited with code ${code}`)); - } - }); - - // Fallback timeout - setTimeout(() => { - if (!this.serverReady) { - this.log('HTTP server timeout reached, assuming ready', true); - this.serverReady = true; - resolve(); + // Read file + const content = fs.readFileSync(fullPath); + + // Set appropriate content type + const ext = path.extname(fullPath).toLowerCase(); + const contentTypes = { + '.html': 'text/html', + '.js': 'application/javascript', + '.css': 'text/css', + '.json': 'application/json', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon', + '.woff': 'font/woff', + '.woff2': 'font/woff2', + '.ttf': 'font/ttf', + '.eot': 'application/vnd.ms-fontobject' + }; + + const contentType = contentTypes[ext] || 'application/octet-stream'; + event.node.res.setHeader('Content-Type', contentType); + + // Enable CORS + event.node.res.setHeader('Access-Control-Allow-Origin', '*'); + event.node.res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + event.node.res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + return content; + + } catch (error) { + // Try to find index.html for SPA routing + if (filePath !== '/index.html') { + try { + const indexPath = path.join(this.options.buildDir, 'index.html'); + await access(indexPath, fs.constants.F_OK); + const indexContent = fs.readFileSync(indexPath); + event.node.res.setHeader('Content-Type', 'text/html'); + return indexContent; + } catch { + // Fall through to 404 + } } - }, 10000); // 10 second timeout + + event.node.res.statusCode = 404; + return 'File not found'; + } }); } - async startCloudflaredTunnel() { - if (!this.options.enableTunnel) { - return; + async startListhenServer() { + const buildDirExists = await this.checkBuildDirectory(); + if (!buildDirExists) { + throw new Error(`Build directory '${this.options.buildDir}' does not exist. Run webpack first.`); } - const cloudflaredAvailable = await this.checkCloudflaredAvailable(); - if (!cloudflaredAvailable) { - this.error(`Cloudflared not found at ${this.options.cloudflaredPath}. Download it from https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/`); - return; + this.log('Creating HTTP server with listhen...', true); + + const app = createApp(); + app.use(this.createStaticFileHandler()); + + const listenOptions = { + port: this.options.port, + showURL: this.options.verbose, + clipboard: false, + open: false, + qr: false + }; + + // Enable tunnel if requested + if (this.options.enableTunnel) { + listenOptions.tunnel = true; } - return new Promise((resolve, reject) => { - this.log('Starting Cloudflare Tunnel...', true); + try { + this.serverInstance = await listen(app, listenOptions); + this.serverReady = true; - const tunnelProcess = spawn(this.options.cloudflaredPath, ['tunnel', '--url', `http://localhost:${this.options.port}`], { - stdio: ['inherit', 'pipe', 'pipe'], - cwd: process.cwd() - }); - - this.processes.push(tunnelProcess); - let tunnelStarted = false; - - tunnelProcess.stdout.on('data', (data) => { - const output = data.toString(); - if (this.options.verbose) { - process.stdout.write(`[Cloudflared] ${output}`); - } - - // Extract tunnel URL from cloudflared output - const urlMatch = output.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/); - if (urlMatch && !this.tunnelUrl) { - this.tunnelUrl = urlMatch[0]; - this.log(`๐ŸŒฉ๏ธ Cloudflare Tunnel ready: ${this.tunnelUrl}`, true); - this.log(`๐Ÿ”— Auto-loader URL: ${this.tunnelUrl}/auto-loader-dev.js`, true); - tunnelStarted = true; - resolve(); - } - - // Look for successful connection messages - if (output.includes('Connection') && output.includes('registered')) { - tunnelStarted = true; - } - }); - - tunnelProcess.stderr.on('data', (data) => { - const output = data.toString(); - if (this.options.verbose || output.includes('error') || output.includes('failed')) { - process.stderr.write(`[Cloudflared] ${output}`); - } - - // Handle common errors - if (output.includes('failed to lookup TXT record') || output.includes('no such host')) { - this.log('โš ๏ธ Cloudflare tunnel may need internet connectivity - continuing without tunnel', true); - if (!tunnelStarted) { - tunnelStarted = true; - resolve(); - } - } - }); - - tunnelProcess.on('close', (code) => { - if (code !== 0 && !tunnelStarted) { - this.log(`โš ๏ธ Cloudflare tunnel failed (exit code ${code}) - continuing without tunnel`, true); - this.log('๐Ÿ’ก Tunnel requires internet connectivity. Local development server is still available.', true); - resolve(); - } else if (code !== 0) { - this.log(`Cloudflare tunnel process exited with code ${code}`, true); - } - }); - - // Timeout for tunnel establishment - setTimeout(() => { - if (!tunnelStarted) { - this.log('โš ๏ธ Cloudflare tunnel timeout - continuing without tunnel', true); - this.log('๐Ÿ’ก This is normal in offline environments. Local server is ready at http://localhost:' + this.options.port, true); - resolve(); - } - }, 20000); // 20 second timeout - }); + // Extract URLs + const localUrl = this.serverInstance.url; + this.tunnelUrl = this.serverInstance.tunnel?.url; + + this.log(`HTTP server ready on ${localUrl}`, true); + + if (this.tunnelUrl) { + this.log(`๐ŸŒฉ๏ธ Tunnel ready: ${this.tunnelUrl}`, true); + this.log(`๐Ÿ”— Auto-loader URL: ${this.tunnelUrl}/auto-loader-dev.js`, true); + } else if (this.options.enableTunnel) { + this.log('โš ๏ธ Tunnel was requested but could not be established', true); + this.log('๐Ÿ’ก This is normal in offline environments or if tunnel service is unavailable', true); + } + + return this.serverInstance; + + } catch (error) { + if (this.options.enableTunnel && error.message.includes('tunnel')) { + // Fallback: retry without tunnel + this.log('โš ๏ธ Tunnel failed, retrying without tunnel...', true); + const fallbackOptions = { ...listenOptions, tunnel: false }; + + this.serverInstance = await listen(app, fallbackOptions); + this.serverReady = true; + + this.log(`HTTP server ready on ${this.serverInstance.url}`, true); + this.log('๐Ÿ’ก Tunnel is unavailable - continuing with local server only', true); + + return this.serverInstance; + } + + throw error; + } } async start() { @@ -238,17 +246,12 @@ class DevServer { // Start webpack and wait for initial build await this.startWebpack(); - // Start HTTP server - await this.startHttpServer(); - - // Start tunnel if enabled - if (this.options.enableTunnel) { - await this.startCloudflaredTunnel(); - } + // Start listhen server + await this.startListhenServer(); this.log('โœ… Development server is ready!', true); this.log(`๐Ÿ“ Build directory: ${this.options.buildDir}`, true); - this.log(`๐ŸŒ Local server: http://localhost:${this.options.port}`, true); + this.log(`๐ŸŒ Local server: ${this.serverInstance.url}`, true); if (this.tunnelUrl) { this.log(`๐ŸŒฉ๏ธ HTTPS tunnel: ${this.tunnelUrl}`, true); this.log(`๐Ÿ”ง For Custom Checkout, use: ${this.tunnelUrl}/auto-loader-dev.js`, true); @@ -263,6 +266,17 @@ class DevServer { cleanup() { this.log('Cleaning up processes...', true); + + // Close listhen server + if (this.serverInstance) { + try { + this.serverInstance.close(); + } catch (error) { + this.log(`Error closing server: ${error.message}`); + } + } + + // Kill webpack process this.processes.forEach(proc => { if (proc && !proc.killed) { proc.kill('SIGTERM'); @@ -303,18 +317,18 @@ if (require.main === module) { case '--verbose': options.verbose = true; break; - case '--cloudflared-path': - options.cloudflaredPath = args[++i]; + case '--build-dir': + options.buildDir = args[++i]; break; case '--help': console.log(` Usage: node scripts/dev-server.js [options] Options: - --tunnel Enable Cloudflare Tunnel for HTTPS access + --tunnel Enable tunnel for HTTPS access (via listhen) --port Port for HTTP server (default: 8080) --verbose Enable verbose logging - --cloudflared-path Path to cloudflared binary (default: /tmp/cloudflared) + --build-dir Build directory to serve (default: build) --help Show this help message Examples: @@ -337,8 +351,8 @@ Examples: if (process.env.DEV_SERVER_VERBOSE === 'true') { options.verbose = true; } - if (process.env.CLOUDFLARED_PATH) { - options.cloudflaredPath = process.env.CLOUDFLARED_PATH; + if (process.env.DEV_SERVER_BUILD_DIR) { + options.buildDir = process.env.DEV_SERVER_BUILD_DIR; } const devServer = new DevServer(options); diff --git a/scripts/install-cloudflared.js b/scripts/install-cloudflared.js deleted file mode 100755 index 27b0f33669..0000000000 --- a/scripts/install-cloudflared.js +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env node - -const { spawn } = require('child_process'); -const fs = require('fs'); -const path = require('path'); -const https = require('https'); -const { promisify } = require('util'); - -const access = promisify(fs.access); -const chmod = promisify(fs.chmod); - -class CloudflaredInstaller { - constructor() { - this.cloudflaredPath = '/tmp/cloudflared'; - } - - async isCloudflaredInstalled() { - try { - await access(this.cloudflaredPath, fs.constants.F_OK | fs.constants.X_OK); - return true; - } catch { - return false; - } - } - - async downloadCloudflared() { - return new Promise((resolve, reject) => { - console.log('๐Ÿ“ฅ Downloading cloudflared...'); - - const url = 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64'; - const file = fs.createWriteStream(this.cloudflaredPath); - - https.get(url, (response) => { - if (response.statusCode === 302 || response.statusCode === 301) { - // Follow redirect - https.get(response.headers.location, (redirectResponse) => { - redirectResponse.pipe(file); - file.on('finish', async () => { - file.close(); - try { - await chmod(this.cloudflaredPath, 0o755); - console.log('โœ… Cloudflared downloaded and made executable'); - resolve(); - } catch (error) { - reject(new Error(`Failed to make cloudflared executable: ${error.message}`)); - } - }); - }).on('error', reject); - } else { - response.pipe(file); - file.on('finish', async () => { - file.close(); - try { - await chmod(this.cloudflaredPath, 0o755); - console.log('โœ… Cloudflared downloaded and made executable'); - resolve(); - } catch (error) { - reject(new Error(`Failed to make cloudflared executable: ${error.message}`)); - } - }); - } - }).on('error', reject); - }); - } - - async install() { - const isInstalled = await this.isCloudflaredInstalled(); - - if (isInstalled) { - console.log('โœ… Cloudflared is already installed'); - return; - } - - try { - await this.downloadCloudflared(); - } catch (error) { - console.error('โŒ Failed to install cloudflared:', error.message); - console.log('๐Ÿ’ก You can manually download cloudflared from:'); - console.log(' https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/'); - throw error; - } - } -} - -// CLI interface -if (require.main === module) { - const installer = new CloudflaredInstaller(); - installer.install().catch(error => { - process.exit(1); - }); -} - -module.exports = CloudflaredInstaller; \ No newline at end of file diff --git a/scripts/test-dev-server.js b/scripts/test-dev-server.js index b459ead7f4..d2cdb2de92 100755 --- a/scripts/test-dev-server.js +++ b/scripts/test-dev-server.js @@ -8,7 +8,7 @@ const { spawn } = require('child_process'); const http = require('http'); async function testDevServer() { - console.log('๐Ÿงช Testing dev server functionality...'); + console.log('๐Ÿงช Testing listhen-based dev server functionality...'); // Start the dev server const devServer = spawn('node', ['scripts/dev-server.js', '--port', '8081'], { @@ -49,14 +49,14 @@ async function testDevServer() { try { await serverReadyPromise; - console.log('โœ… Dev server started successfully'); + console.log('โœ… Listhen-based dev server started successfully'); // Test HTTP endpoint console.log('๐ŸŒ Testing HTTP endpoint...'); const testResponse = await new Promise((resolve, reject) => { const req = http.get('http://localhost:8081/auto-loader-dev.js', (res) => { if (res.statusCode === 200) { - console.log('โœ… auto-loader-dev.js is accessible'); + console.log('โœ… auto-loader-dev.js is accessible via listhen'); resolve(true); } else { reject(new Error(`HTTP ${res.statusCode}`)); @@ -71,7 +71,7 @@ async function testDevServer() { }); }); - console.log('๐ŸŽ‰ All tests passed!'); + console.log('๐ŸŽ‰ All tests passed! Listhen integration working correctly.'); } catch (error) { console.error('โŒ Test failed:', error.message);