@configura/web-ui 1.3.0-alpha.5 → 1.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.postcssrc.json +8 -8
  2. package/LICENSE +201 -201
  3. package/README.md +1 -1
  4. package/dist/components/CanvasWrapper.d.ts +9 -9
  5. package/dist/components/CanvasWrapper.js +8 -8
  6. package/dist/components/ConfigurationActionsButtonRow.d.ts +11 -11
  7. package/dist/components/ConfigurationActionsButtonRow.js +13 -13
  8. package/dist/components/Configurator.d.ts +12 -12
  9. package/dist/components/Configurator.js +15 -15
  10. package/dist/components/ConfiguratorWrapper.d.ts +8 -8
  11. package/dist/components/ConfiguratorWrapper.js +5 -5
  12. package/dist/components/CurrencyPrice.d.ts +9 -9
  13. package/dist/components/CurrencyPrice.js +7 -7
  14. package/dist/components/ExpandableHeadingRow.d.ts +15 -15
  15. package/dist/components/ExpandableHeadingRow.js +21 -21
  16. package/dist/components/Loading.d.ts +13 -13
  17. package/dist/components/Loading.js +20 -20
  18. package/dist/components/ProductInformation.d.ts +10 -10
  19. package/dist/components/ProductInformation.js +23 -23
  20. package/dist/components/icons/Checkmark.d.ts +5 -5
  21. package/dist/components/icons/Checkmark.js +12 -12
  22. package/dist/components/icons/Chevron.d.ts +6 -6
  23. package/dist/components/icons/Chevron.js +18 -18
  24. package/dist/components/productConfiguration/CfgAdditionalProductView.d.ts +3 -3
  25. package/dist/components/productConfiguration/CfgAdditionalProductView.js +28 -28
  26. package/dist/components/productConfiguration/CfgCheckboxView.d.ts +18 -18
  27. package/dist/components/productConfiguration/CfgCheckboxView.js +22 -22
  28. package/dist/components/productConfiguration/CfgCheckboxesView.d.ts +12 -12
  29. package/dist/components/productConfiguration/CfgCheckboxesView.js +18 -18
  30. package/dist/components/productConfiguration/CfgDropdownOptionView.d.ts +18 -18
  31. package/dist/components/productConfiguration/CfgDropdownOptionView.js +35 -35
  32. package/dist/components/productConfiguration/CfgDropdownView.d.ts +12 -12
  33. package/dist/components/productConfiguration/CfgDropdownView.js +20 -20
  34. package/dist/components/productConfiguration/CfgFeatureView.d.ts +27 -27
  35. package/dist/components/productConfiguration/CfgFeatureView.js +34 -34
  36. package/dist/components/productConfiguration/CfgGroupView.d.ts +4 -4
  37. package/dist/components/productConfiguration/CfgGroupView.js +13 -13
  38. package/dist/components/productConfiguration/CfgOptionFeaturesView.d.ts +6 -6
  39. package/dist/components/productConfiguration/CfgOptionFeaturesView.js +13 -13
  40. package/dist/components/productConfiguration/CfgOptionNumericView.d.ts +27 -27
  41. package/dist/components/productConfiguration/CfgOptionNumericView.js +117 -116
  42. package/dist/components/productConfiguration/CfgOptionPriceView.d.ts +9 -9
  43. package/dist/components/productConfiguration/CfgOptionPriceView.js +29 -29
  44. package/dist/components/productConfiguration/CfgProductConfigurationView.d.ts +18 -18
  45. package/dist/components/productConfiguration/CfgProductConfigurationView.js +45 -45
  46. package/dist/css/web-ui.css +1 -1
  47. package/dist/css/web-ui.css.map +1 -1
  48. package/dist/index.d.ts +20 -20
  49. package/dist/index.js +20 -20
  50. package/dist/scss/_button.scss +36 -36
  51. package/dist/scss/_configurator.scss +67 -67
  52. package/dist/scss/_expandable.scss +37 -37
  53. package/dist/scss/_feature-item.scss +124 -124
  54. package/dist/scss/_hr.scss +16 -16
  55. package/dist/scss/_loading.scss +98 -98
  56. package/dist/scss/_mixins.scss +56 -56
  57. package/dist/scss/_option-tree.scss +29 -29
  58. package/dist/scss/_product-information.scss +49 -49
  59. package/dist/scss/_range-view.scss +28 -20
  60. package/dist/scss/_slider.scss +70 -70
  61. package/dist/scss/_themed.scss +124 -124
  62. package/dist/scss/_utilities.scss +21 -21
  63. package/dist/scss/_variables.scss +6 -6
  64. package/dist/scss/icons/_checkmark.scss +46 -46
  65. package/dist/scss/icons/_chevron.scss +62 -62
  66. package/dist/scss/web-ui.scss +11 -11
  67. package/dist/useObservable.d.ts +4 -4
  68. package/dist/useObservable.js +18 -18
  69. package/dist/useRerender.d.ts +1 -1
  70. package/dist/useRerender.js +5 -5
  71. package/dist/useResize.d.ts +6 -6
  72. package/dist/useResize.js +47 -47
  73. package/dist/useSelected.d.ts +2 -2
  74. package/dist/useSelected.js +13 -13
  75. package/dist/useUniqueId.d.ts +1 -1
  76. package/dist/useUniqueId.js +7 -7
  77. package/dist/utilities.d.ts +5 -5
  78. package/dist/utilities.js +1 -1
  79. package/package.json +3 -3
@@ -1,116 +1,117 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { NumericValueDiscrete, NumericValueRangeDefinition } from "@configura/web-api";
11
- import React, { useEffect, useState } from "react";
12
- import { useRerender } from "../../useRerender.js";
13
- import { useUuid } from "../../useUniqueId.js";
14
- import { Checkmark } from "../icons/Checkmark.js";
15
- export const CfgOptionNumericView = (props) => {
16
- const { option } = props;
17
- const { isUseNumericValue } = option;
18
- // Contrary to most other components this one has its own connection to the
19
- // option that is backing it. This is for it to be able to "live" update
20
- // as we drag sliders. The value is not "commited" at immediate drag, and so
21
- // the full machinery of validations and such is not run until later.
22
- const rerender = useRerender();
23
- useEffect(() => {
24
- option.listenForChange(rerender);
25
- return () => {
26
- option.stopListenForChange(rerender);
27
- };
28
- }, [option, rerender]);
29
- if (!isUseNumericValue) {
30
- return null;
31
- }
32
- const { allowedNumericValues, numericValue, unit } = option;
33
- if (allowedNumericValues === undefined) {
34
- throw new Error("AllowedNumericValues undefined for numeric option");
35
- }
36
- if (numericValue === undefined) {
37
- throw new Error("Numeric value not set for numeric option");
38
- }
39
- const { ranges } = allowedNumericValues;
40
- const isSingleRange = ranges.length === 1;
41
- if (isSingleRange && ranges[0] instanceof NumericValueDiscrete) {
42
- return null;
43
- }
44
- return (React.createElement("ul", { className: `cfgOptionTree cfgOptionTree--subLevel cfgOptionTree--indent ${props.className || ""}`, style: props.style }, ranges.map((range) => (React.createElement(NumericValueView, { currentValue: numericValue, unit: unit, range: range, key: range.first, hasNoSiblings: isSingleRange, updateValue: (value, commit) => __awaiter(void 0, void 0, void 0, function* () { return yield option.setNumericValue(value, commit); }) })))));
45
- };
46
- /**
47
- * Displays GUI for selecting in one "range". Please note that the range
48
- * parameter can also be a discrete value.
49
- */
50
- export const NumericValueView = (props) => {
51
- const { range, currentValue, updateValue, hasNoSiblings } = props;
52
- const { legend, first } = range;
53
- const selected = range.includesValue(currentValue);
54
- const optionClasses = selected ? "cfgFeatureItemOption--checked" : "";
55
- const uniqueId = useUuid();
56
- const [inputValue, setInputValue] = useState(first);
57
- const [inputCommited, setInputCommited] = useState(true);
58
- const [showRangeError, setShowRangeError] = useState(false);
59
- if (inputCommited && inputValue !== currentValue && range.includesValue(currentValue)) {
60
- setInputValue(currentValue);
61
- }
62
- function isAcceptableValue(value) {
63
- return !isNaN(value) && range.includesValue(value);
64
- }
65
- return (React.createElement("li", { className: `cfgFeatureItem cfgMb1 ${hasNoSiblings ? "" : "cfgMt1"}` },
66
- !hasNoSiblings && (React.createElement("label", { className: `cfgFeatureItemOption ${optionClasses}`, htmlFor: uniqueId },
67
- React.createElement("input", { checked: selected, className: "cfgFeatureItem__hiddenInput", id: uniqueId, name: uniqueId, onChange: (event) => {
68
- if (event.target.checked) {
69
- updateValue(inputValue, true);
70
- }
71
- }, type: "radio", value: first }),
72
- React.createElement("div", { className: "cfgFeatureItem__radio" }, selected && React.createElement(Checkmark, null)),
73
- React.createElement("div", { className: "cfgFeatureItemOption__titleWrapper" },
74
- React.createElement("div", { className: "cfgFeatureItemOption__title" }, legend)))),
75
- selected && range instanceof NumericValueRangeDefinition && (React.createElement(RangeView, Object.assign({}, props, { className: hasNoSiblings ? undefined : "cfgOptionTree--indent", range: range, onChange: (val, instantUpdate) => {
76
- setInputValue(val);
77
- if (!isAcceptableValue(inputValue)) {
78
- return;
79
- }
80
- if (instantUpdate) {
81
- updateValue(val, false);
82
- }
83
- setShowRangeError(false);
84
- setInputCommited(false);
85
- }, onCommit: () => {
86
- if (inputCommited) {
87
- return;
88
- }
89
- if (!isAcceptableValue(inputValue)) {
90
- setShowRangeError(true);
91
- return;
92
- }
93
- updateValue(inputValue, true);
94
- setShowRangeError(false);
95
- setInputCommited(true);
96
- }, inputValue: inputValue, showRangeError: showRangeError })))));
97
- };
98
- export const RangeView = (props) => {
99
- const { currentValue, unit, inputValue, range, onChange, onCommit, showRangeError } = props;
100
- const { minValue, maxValue, increment, legend } = range;
101
- const getOnChange = (instant) => (event) => onChange(event.currentTarget.valueAsNumber, instant);
102
- const inputProps = {
103
- min: minValue,
104
- max: maxValue,
105
- step: increment || Math.pow(10, Math.round(Math.log10(maxValue - minValue)) - 3),
106
- onBlur: onCommit,
107
- onMouseUp: onCommit,
108
- };
109
- return (React.createElement("div", { className: `cfgRangeView cfgMt1 ${props.className || ""}`, style: props.style },
110
- React.createElement("input", Object.assign({}, inputProps, { type: "number", value: isNaN(inputValue) ? "" : inputValue, onChange: getOnChange(false), className: "cfgRangeView__number-input" })),
111
- React.createElement("span", { className: "cfgRangeView__unit-label" }, unit),
112
- React.createElement("input", Object.assign({}, inputProps, { type: "range", className: "cfgSlider cfgRangeView__slider-input", value: currentValue, onChange: getOnChange(true) })),
113
- showRangeError && React.createElement("div", null,
114
- "Value not allowed, allowed values are ",
115
- legend)));
116
- };
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { NumericValueDiscrete, NumericValueRangeDefinition } from "@configura/web-api";
11
+ import React, { useEffect, useState } from "react";
12
+ import { useRerender } from "../../useRerender.js";
13
+ import { useUuid } from "../../useUniqueId.js";
14
+ import { Checkmark } from "../icons/Checkmark.js";
15
+ export const CfgOptionNumericView = (props) => {
16
+ const { option } = props;
17
+ const { isUseNumericValue } = option;
18
+ // Contrary to most other components this one has its own connection to the
19
+ // option that is backing it. This is for it to be able to "live" update
20
+ // as we drag sliders. The value is not "commited" at immediate drag, and so
21
+ // the full machinery of validations and such is not run until later.
22
+ const rerender = useRerender();
23
+ useEffect(() => {
24
+ option.listenForChange(rerender);
25
+ return () => {
26
+ option.stopListenForChange(rerender);
27
+ };
28
+ }, [option, rerender]);
29
+ if (!isUseNumericValue) {
30
+ return null;
31
+ }
32
+ const { allowedNumericValues, numericValue, unit } = option;
33
+ if (allowedNumericValues === undefined) {
34
+ throw new Error("AllowedNumericValues undefined for numeric option");
35
+ }
36
+ if (numericValue === undefined) {
37
+ throw new Error("Numeric value not set for numeric option");
38
+ }
39
+ const { ranges } = allowedNumericValues;
40
+ const isSingleRange = ranges.length === 1;
41
+ if (isSingleRange && ranges[0] instanceof NumericValueDiscrete) {
42
+ return null;
43
+ }
44
+ return (React.createElement("ul", { className: `cfgOptionTree cfgOptionTree--subLevel cfgOptionTree--indent ${props.className || ""}`, style: props.style }, ranges.map((range) => (React.createElement(NumericValueView, { currentValue: numericValue, unit: unit, range: range, key: range.first, hasNoSiblings: isSingleRange, updateValue: (value, commit) => __awaiter(void 0, void 0, void 0, function* () { return yield option.setNumericValue(value, commit); }) })))));
45
+ };
46
+ /**
47
+ * Displays GUI for selecting in one "range". Please note that the range
48
+ * parameter can also be a discrete value.
49
+ */
50
+ export const NumericValueView = (props) => {
51
+ const { range, currentValue, updateValue, hasNoSiblings } = props;
52
+ const { legend, first } = range;
53
+ const selected = range.includesValue(currentValue);
54
+ const optionClasses = selected ? "cfgFeatureItemOption--checked" : "";
55
+ const uniqueId = useUuid();
56
+ const [inputValue, setInputValue] = useState(first);
57
+ const [inputCommited, setInputCommited] = useState(true);
58
+ const [showRangeError, setShowRangeError] = useState(false);
59
+ if (inputCommited && inputValue !== currentValue && range.includesValue(currentValue)) {
60
+ setInputValue(currentValue);
61
+ }
62
+ function isAcceptableValue(value) {
63
+ return !isNaN(value) && range.includesValue(value);
64
+ }
65
+ return (React.createElement("li", { className: `cfgFeatureItem cfgMb1 ${hasNoSiblings ? "" : "cfgMt1"}` },
66
+ !hasNoSiblings && (React.createElement("label", { className: `cfgFeatureItemOption ${optionClasses}`, htmlFor: uniqueId },
67
+ React.createElement("input", { checked: selected, className: "cfgFeatureItem__hiddenInput", id: uniqueId, name: uniqueId, onChange: (event) => {
68
+ if (event.target.checked) {
69
+ updateValue(inputValue, true);
70
+ }
71
+ }, type: "radio", value: first }),
72
+ React.createElement("div", { className: "cfgFeatureItem__radio" }, selected && React.createElement(Checkmark, null)),
73
+ React.createElement("div", { className: "cfgFeatureItemOption__titleWrapper" },
74
+ React.createElement("div", { className: "cfgFeatureItemOption__title" }, legend)))),
75
+ selected && range instanceof NumericValueRangeDefinition && (React.createElement(RangeView, Object.assign({}, props, { className: hasNoSiblings ? undefined : "cfgOptionTree--indent", range: range, onChange: (val, instantUpdate) => {
76
+ setInputValue(val);
77
+ if (!isAcceptableValue(inputValue)) {
78
+ return;
79
+ }
80
+ if (instantUpdate) {
81
+ updateValue(val, false);
82
+ }
83
+ setShowRangeError(false);
84
+ setInputCommited(false);
85
+ }, onCommit: () => {
86
+ if (inputCommited) {
87
+ return;
88
+ }
89
+ if (!isAcceptableValue(inputValue)) {
90
+ setShowRangeError(true);
91
+ return;
92
+ }
93
+ updateValue(inputValue, true);
94
+ setShowRangeError(false);
95
+ setInputCommited(true);
96
+ }, inputValue: inputValue, showRangeError: showRangeError })))));
97
+ };
98
+ export const RangeView = (props) => {
99
+ const { currentValue, unit, inputValue, range, onChange, onCommit, showRangeError } = props;
100
+ const { minValue, maxValue, increment, legend } = range;
101
+ const getOnChange = (instant) => (event) => onChange(event.currentTarget.valueAsNumber, instant);
102
+ const inputProps = {
103
+ min: minValue,
104
+ max: maxValue,
105
+ step: increment || Math.pow(10, Math.round(Math.log10(maxValue - minValue)) - 3),
106
+ onBlur: onCommit,
107
+ onMouseUp: onCommit,
108
+ };
109
+ return (React.createElement("div", { className: `cfgRangeView cfgMt1 ${props.className || ""}`, style: props.style },
110
+ React.createElement("div", { className: "cfgRangeView__inputs" },
111
+ React.createElement("input", Object.assign({}, inputProps, { type: "number", value: isNaN(inputValue) ? "" : inputValue, onChange: getOnChange(false), className: "cfgRangeView__number-input" })),
112
+ React.createElement("span", { className: "cfgRangeView__unit-label" }, unit),
113
+ React.createElement("input", Object.assign({}, inputProps, { type: "range", className: "cfgSlider cfgRangeView__slider-input", value: currentValue, onChange: getOnChange(true) }))),
114
+ showRangeError && (React.createElement("div", { className: "cfgRangeView__error" },
115
+ "Value not allowed, allowed values are ",
116
+ legend))));
117
+ };
@@ -1,10 +1,10 @@
1
- import { CfgOption } from "@configura/web-api";
2
- import React from "react";
3
- import { UpchargeDisplayMode } from "./CfgProductConfigurationView.js";
4
- declare type Props = {
5
- option: CfgOption;
6
- upchargeDisplayMode: UpchargeDisplayMode | undefined;
7
- };
8
- export declare const CfgOptionPriceView: React.FC<Props>;
9
- export {};
1
+ import { CfgOption } from "@configura/web-api";
2
+ import React from "react";
3
+ import { UpchargeDisplayMode } from "./CfgProductConfigurationView.js";
4
+ declare type Props = {
5
+ option: CfgOption;
6
+ upchargeDisplayMode: UpchargeDisplayMode | undefined;
7
+ };
8
+ export declare const CfgOptionPriceView: React.FC<Props>;
9
+ export {};
10
10
  //# sourceMappingURL=CfgOptionPriceView.d.ts.map
@@ -1,29 +1,29 @@
1
- import React from "react";
2
- import { CurrencyPrice } from "../CurrencyPrice.js";
3
- import { UpchargeDisplayMode } from "./CfgProductConfigurationView.js";
4
- export const CfgOptionPriceView = (props) => {
5
- const { option, upchargeDisplayMode } = props;
6
- const { currency, fractionDigits, lang } = option.parentProduct;
7
- if (currency === "") {
8
- return null;
9
- }
10
- switch (upchargeDisplayMode) {
11
- case UpchargeDisplayMode.None:
12
- return null;
13
- case UpchargeDisplayMode.Price:
14
- const { upcharge } = option;
15
- if (upcharge === undefined || upcharge === 0) {
16
- return null;
17
- }
18
- return (React.createElement("div", { className: "cfgFeatureItemOption__price" },
19
- React.createElement(CurrencyPrice, { currency: currency, language: lang, price: upcharge, fractionDigits: fractionDigits })));
20
- default:
21
- const { priceChangeAtSelectChange } = option;
22
- if (priceChangeAtSelectChange === undefined || priceChangeAtSelectChange === 0) {
23
- return null;
24
- }
25
- return (React.createElement("div", { className: "cfgFeatureItemOption__price" },
26
- priceChangeAtSelectChange < 0 ? "-" : "+",
27
- React.createElement(CurrencyPrice, { currency: currency, language: lang, price: Math.abs(priceChangeAtSelectChange), fractionDigits: fractionDigits })));
28
- }
29
- };
1
+ import React from "react";
2
+ import { CurrencyPrice } from "../CurrencyPrice.js";
3
+ import { UpchargeDisplayMode } from "./CfgProductConfigurationView.js";
4
+ export const CfgOptionPriceView = (props) => {
5
+ const { option, upchargeDisplayMode } = props;
6
+ const { currency, fractionDigits, lang } = option.parentProduct;
7
+ if (currency === "") {
8
+ return null;
9
+ }
10
+ switch (upchargeDisplayMode) {
11
+ case UpchargeDisplayMode.None:
12
+ return null;
13
+ case UpchargeDisplayMode.Price:
14
+ const { upcharge } = option;
15
+ if (upcharge === undefined || upcharge === 0) {
16
+ return null;
17
+ }
18
+ return (React.createElement("div", { className: "cfgFeatureItemOption__price" },
19
+ React.createElement(CurrencyPrice, { currency: currency, language: lang, price: upcharge, fractionDigits: fractionDigits })));
20
+ default:
21
+ const { priceChangeAtSelectChange } = option;
22
+ if (priceChangeAtSelectChange === undefined || priceChangeAtSelectChange === 0) {
23
+ return null;
24
+ }
25
+ return (React.createElement("div", { className: "cfgFeatureItemOption__price" },
26
+ priceChangeAtSelectChange < 0 ? "-" : "+",
27
+ React.createElement(CurrencyPrice, { currency: currency, language: lang, price: Math.abs(priceChangeAtSelectChange), fractionDigits: fractionDigits })));
28
+ }
29
+ };
@@ -1,19 +1,19 @@
1
- import { CfgProduct, CfgProductConfiguration } from "@configura/web-api";
2
- import React from "react";
3
- import { CssProps } from "../../utilities.js";
4
- import { CfgProductConfigurationComponentAndPassthroughProps } from "./CfgFeatureView.js";
5
- export declare enum UpchargeDisplayMode {
6
- SelectionImpact = 0,
7
- None = 1,
8
- Price = 2
9
- }
10
- export declare type PassthroughProps = {
11
- upchargeDisplayMode?: UpchargeDisplayMode;
12
- };
13
- declare type Props = PassthroughProps & {
14
- productOrConfiguration: CfgProductConfiguration | CfgProduct;
15
- permanentlyExpandedAdditionalProductLevels?: number;
16
- };
17
- export declare const CfgProductConfigurationView: React.FC<Props & CfgProductConfigurationComponentAndPassthroughProps & CssProps>;
18
- export {};
1
+ import { CfgProduct, CfgProductConfiguration } from "@configura/web-api";
2
+ import React from "react";
3
+ import { CssProps } from "../../utilities.js";
4
+ import { CfgProductConfigurationComponentAndPassthroughProps } from "./CfgFeatureView.js";
5
+ export declare enum UpchargeDisplayMode {
6
+ SelectionImpact = 0,
7
+ None = 1,
8
+ Price = 2
9
+ }
10
+ export declare type PassthroughProps = {
11
+ upchargeDisplayMode?: UpchargeDisplayMode;
12
+ };
13
+ declare type Props = PassthroughProps & {
14
+ productOrConfiguration: CfgProductConfiguration | CfgProduct;
15
+ permanentlyExpandedAdditionalProductLevels?: number;
16
+ };
17
+ export declare const CfgProductConfigurationView: React.FC<Props & CfgProductConfigurationComponentAndPassthroughProps & CssProps>;
18
+ export {};
19
19
  //# sourceMappingURL=CfgProductConfigurationView.d.ts.map
@@ -1,45 +1,45 @@
1
- import { CfgProduct } from "@configura/web-api";
2
- import React, { useEffect } from "react";
3
- import { useRerender } from "../../useRerender.js";
4
- import { CfgAdditionalProductView } from "./CfgAdditionalProductView.js";
5
- import { CfgFeatureViewMemo, forwardProps, } from "./CfgFeatureView.js";
6
- export var UpchargeDisplayMode;
7
- (function (UpchargeDisplayMode) {
8
- UpchargeDisplayMode[UpchargeDisplayMode["SelectionImpact"] = 0] = "SelectionImpact";
9
- UpchargeDisplayMode[UpchargeDisplayMode["None"] = 1] = "None";
10
- UpchargeDisplayMode[UpchargeDisplayMode["Price"] = 2] = "Price";
11
- })(UpchargeDisplayMode || (UpchargeDisplayMode = {}));
12
- export const CfgProductConfigurationView = React.memo((props) => {
13
- const { productOrConfiguration, permanentlyExpandedAdditionalProductLevels, additionalProductComponent, } = props;
14
- const configuration = productOrConfiguration instanceof CfgProduct
15
- ? productOrConfiguration.configuration
16
- : productOrConfiguration;
17
- const features = configuration.features.reduce((agg, feature) => {
18
- // It is possible in Cat Creator to double add a Feature. This fills no known
19
- // purpose and React can not handle this, so we filter out the duplicates.
20
- const code = feature.code;
21
- if (agg.every((f) => f.code !== code)) {
22
- agg.push(feature);
23
- }
24
- return agg;
25
- }, []);
26
- const additionalProducts = productOrConfiguration instanceof CfgProduct
27
- ? productOrConfiguration.additionalProducts
28
- : undefined;
29
- const AdditionalProductComponent = additionalProductComponent || CfgAdditionalProductView;
30
- // Re-rendering is driven from the very top of the tree. However, when selecting an option
31
- // the change is not bubbled all the way to the top (and then down again) until after
32
- // validation has been done. This keeps the 3D-view from re-rendering until after validation
33
- // has been done. But it also makes the state of this GUI not update until after validate,
34
- // which does not look good. So we add this extra hook to make this rerender early.
35
- const rerender = useRerender();
36
- useEffect(() => {
37
- configuration.listenForChange(rerender);
38
- return () => {
39
- configuration.stopListenForChange(rerender);
40
- };
41
- }, [configuration, rerender]);
42
- return (React.createElement(React.Fragment, null,
43
- React.createElement("ul", { className: `cfgOptionTree cfgOptionTree--topLevel ${props.className || ""}`, style: props.style }, features.map((f) => (React.createElement(CfgFeatureViewMemo, Object.assign({ feature: f, key: f.key }, forwardProps(props)))))),
44
- additionalProducts !== undefined && (React.createElement("ul", { className: `cfgAdditionalProduct cfgOptionTree cfgOptionTree--topLevel` }, additionalProducts.map((additionalProduct) => (React.createElement(AdditionalProductComponent, Object.assign({ key: additionalProduct.key }, forwardProps(props), { additionalProductComponent: AdditionalProductComponent, product: additionalProduct, permanentlyExpandedLevels: permanentlyExpandedAdditionalProductLevels || 0 }))))))));
45
- });
1
+ import { CfgProduct } from "@configura/web-api";
2
+ import React, { useEffect } from "react";
3
+ import { useRerender } from "../../useRerender.js";
4
+ import { CfgAdditionalProductView } from "./CfgAdditionalProductView.js";
5
+ import { CfgFeatureViewMemo, forwardProps, } from "./CfgFeatureView.js";
6
+ export var UpchargeDisplayMode;
7
+ (function (UpchargeDisplayMode) {
8
+ UpchargeDisplayMode[UpchargeDisplayMode["SelectionImpact"] = 0] = "SelectionImpact";
9
+ UpchargeDisplayMode[UpchargeDisplayMode["None"] = 1] = "None";
10
+ UpchargeDisplayMode[UpchargeDisplayMode["Price"] = 2] = "Price";
11
+ })(UpchargeDisplayMode || (UpchargeDisplayMode = {}));
12
+ export const CfgProductConfigurationView = React.memo((props) => {
13
+ const { productOrConfiguration, permanentlyExpandedAdditionalProductLevels, additionalProductComponent, } = props;
14
+ const configuration = productOrConfiguration instanceof CfgProduct
15
+ ? productOrConfiguration.configuration
16
+ : productOrConfiguration;
17
+ const features = configuration.features.reduce((agg, feature) => {
18
+ // It is possible in Cat Creator to double add a Feature. This fills no known
19
+ // purpose and React can not handle this, so we filter out the duplicates.
20
+ const code = feature.code;
21
+ if (agg.every((f) => f.code !== code)) {
22
+ agg.push(feature);
23
+ }
24
+ return agg;
25
+ }, []);
26
+ const additionalProducts = productOrConfiguration instanceof CfgProduct
27
+ ? productOrConfiguration.additionalProducts
28
+ : undefined;
29
+ const AdditionalProductComponent = additionalProductComponent || CfgAdditionalProductView;
30
+ // Re-rendering is driven from the very top of the tree. However, when selecting an option
31
+ // the change is not bubbled all the way to the top (and then down again) until after
32
+ // validation has been done. This keeps the 3D-view from re-rendering until after validation
33
+ // has been done. But it also makes the state of this GUI not update until after validate,
34
+ // which does not look good. So we add this extra hook to make this rerender early.
35
+ const rerender = useRerender();
36
+ useEffect(() => {
37
+ configuration.listenForChange(rerender);
38
+ return () => {
39
+ configuration.stopListenForChange(rerender);
40
+ };
41
+ }, [configuration, rerender]);
42
+ return (React.createElement(React.Fragment, null,
43
+ React.createElement("ul", { className: `cfgOptionTree cfgOptionTree--topLevel ${props.className || ""}`, style: props.style }, features.map((f) => (React.createElement(CfgFeatureViewMemo, Object.assign({ feature: f, key: f.key }, forwardProps(props)))))),
44
+ additionalProducts !== undefined && (React.createElement("ul", { className: `cfgAdditionalProduct cfgOptionTree cfgOptionTree--topLevel` }, additionalProducts.map((additionalProduct) => (React.createElement(AdditionalProductComponent, Object.assign({ key: additionalProduct.key }, forwardProps(props), { additionalProductComponent: AdditionalProductComponent, product: additionalProduct, permanentlyExpandedLevels: permanentlyExpandedAdditionalProductLevels || 0 }))))))));
45
+ });
@@ -1 +1 @@
1
- .cfgRangeView{display:flex;align-items:center}.cfgRangeView__number-input{font-size:1.5em;flex-grow:1;text-align:right}.cfgRangeView__unit-label{font-size:1.5em;margin-left:.3em}.cfgRangeView__slider-input.cfgSlider{margin-left:1em;flex-grow:3}.cfgMl1{margin-left:1em}.cfgMt1{margin-top:1em}.cfgMb1{margin-bottom:1em}.cfgTextOverflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cfgButton{box-sizing:border-box;display:inline-block;background-color:transparent;color:#333;border-radius:.3em;border:.1em solid #bababa;font-size:1.3em;font-weight:500;outline:none;padding:.4em .8em}.cfgButton:after,.cfgButton:before{box-sizing:inherit}.cfgButton *{box-sizing:border-box}.cfgButton :after,.cfgButton :before{box-sizing:inherit}.cfgButton:focus{box-shadow:0 0 0 .075em #fff,0 0 0 .2em #333}.cfgButtonRow{box-sizing:border-box}.cfgButtonRow:after,.cfgButtonRow:before{box-sizing:inherit}.cfgButtonRow *{box-sizing:border-box}.cfgButtonRow :after,.cfgButtonRow :before{box-sizing:inherit}.cfgButtonRow__button:nth-child(n+2){margin-left:1em}.cfgConfigurator{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:10px;color:#333;min-width:0}.cfgConfigurator:after,.cfgConfigurator:before{box-sizing:inherit}.cfgConfigurator *{box-sizing:border-box}.cfgConfigurator :after,.cfgConfigurator :before{box-sizing:inherit}.cfgConfiguratorHeader{border-bottom:.1em solid #c8c7cc;padding:1.7em 1.7em 1.9em;position:relative}.cfgConfiguratorHeader__actions{margin-top:1em}.cfgConfiguratorTree{padding-top:1em}.cfgCanvasWrapper{box-sizing:border-box;position:relative;height:50rem;-webkit-user-select:none;user-select:none}.cfgCanvasWrapper:after,.cfgCanvasWrapper:before{box-sizing:inherit}.cfgCanvasWrapper *{box-sizing:border-box}.cfgCanvasWrapper :after,.cfgCanvasWrapper :before{box-sizing:inherit}.cfgCanvasWrapper canvas{outline:none}.cfgConfiguratorWrapper{box-sizing:border-box;color:#333;height:100%;width:100%}.cfgConfiguratorWrapper:after,.cfgConfiguratorWrapper:before{box-sizing:inherit}.cfgConfiguratorWrapper *{box-sizing:border-box}.cfgConfiguratorWrapper :after,.cfgConfiguratorWrapper :before{box-sizing:inherit}@media screen and (orientation:landscape){.cfgConfiguratorWrapper{display:flex;flex-direction:row}.cfgConfiguratorWrapper>.cfgConfigurator{flex:0 1 40%;height:100%}.cfgConfiguratorWrapper .cfgCanvasWrapper{flex:0 1 60%;height:85vh;overflow:hidden;position:sticky;top:0}}.cfgExpandableHeadingRow{box-sizing:border-box;-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%}.cfgExpandableHeadingRow:after,.cfgExpandableHeadingRow:before{box-sizing:inherit}.cfgExpandableHeadingRow *{box-sizing:border-box}.cfgExpandableHeadingRow :after,.cfgExpandableHeadingRow :before{box-sizing:inherit}.cfgExpandableHeadingRow--expandable{cursor:pointer}.cfgExpandableHeadingRow__title{align-items:center;display:flex;flex:1 1 auto;font-size:1.5em;font-weight:500;justify-content:flex-start}.cfgExpandableHeadingRow__icon{align-items:center;display:flex;flex:0 0 5em;justify-content:center;padding:0 1.5em}.cfgHr{box-sizing:border-box;border:0;border-bottom:.1em solid #c8c7cc;padding:0;margin:0}.cfgHr:after,.cfgHr:before{box-sizing:inherit}.cfgHr *{box-sizing:border-box}.cfgHr :after,.cfgHr :before{box-sizing:inherit}.cfgThumbnailImage{border-radius:.7em;display:inline-block;height:3em;width:3em}.cfgThumbnailPlaceholder{align-items:center;display:flex;flex:0 0 4.2em;justify-content:flex-start}.cfgFeatureItem{box-sizing:border-box;color:#333}.cfgFeatureItem:after,.cfgFeatureItem:before{box-sizing:inherit}.cfgFeatureItem *{box-sizing:border-box}.cfgFeatureItem :after,.cfgFeatureItem :before{box-sizing:inherit}.cfgFeatureItem__dropdown{-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%;cursor:pointer}.cfgFeatureItem--optional{margin-top:1em}.cfgFeatureItem__hiddenInput{left:-99999px;opacity:0;position:absolute;z-index:-1}.cfgFeatureItem__radio{border:.2em solid #c8c7cc;border-radius:50%}.cfgFeatureItem__checkbox,.cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgFeatureItem__checkbox{border:.2em solid #c8c7cc;border-radius:.3em}.cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__checkbox,.cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__radio{box-shadow:0 0 0 .075em #fff,0 0 0 .2em #333}.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{border:.2em solid #000;border-radius:50%}.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox,.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox{border:.2em solid #000;border-radius:.3em}.cfgFeatureItemOption__titleWrapper,.cfgFeatureItemOptional__titleWrapper{flex:1 1 auto;margin-left:1em}.cfgFeatureItemOption__title,.cfgFeatureItemOptional__title{font-size:1.5em}.cfgFeatureItemOption__price{font-weight:600;font-size:.75em;color:grey}.cfgOptionTree--subLevel .cfgFeatureItem__hr{display:none}.cfgFeatureItemOption,.cfgFeatureItemOptional{align-items:center;display:flex}.cfgFeatureItemOptional{justify-content:center;margin-top:.5em}.cfgFeatureItemOptional__header{font-size:1.2em;font-weight:600;margin:0 0 .3em;padding:0;text-transform:uppercase}.cfgAdditionalProduct .cfgFeatureItem:last-child .cfgFeatureItem__hr{margin-bottom:-.1em}.cfgOptionTree{box-sizing:border-box;list-style:none;margin:0;padding:0}.cfgOptionTree:after,.cfgOptionTree:before{box-sizing:inherit}.cfgOptionTree *{box-sizing:border-box}.cfgOptionTree :after,.cfgOptionTree :before{box-sizing:inherit}.cfgOptionTree--topLevel{padding-left:1.7em}.cfgOptionTree--indent{margin-left:3.2em}.cfgOptionTree--compThumb{margin-left:4.2em}.cfgProductInfo{box-sizing:border-box;color:#333;display:flex}.cfgProductInfo:after,.cfgProductInfo:before{box-sizing:inherit}.cfgProductInfo *{box-sizing:border-box}.cfgProductInfo :after,.cfgProductInfo :before{box-sizing:inherit}.cfgProductInfo__left{flex:1 1 auto;min-width:0;overflow:hidden}.cfgProductInfo__right{align-items:flex-end;display:flex;flex-direction:column;flex:1 0 auto;margin-left:1em;max-width:.333333333;min-width:0}.cfgProductInfo__name{display:block;font-size:1.6em;font-weight:600;line-height:1.33;margin:0}.cfgProductInfo__number{font-size:1.3em;font-weight:400;line-height:1.38;margin:0}.cfgCenteredLoading{box-sizing:border-box;align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;width:100%}.cfgCenteredLoading:after,.cfgCenteredLoading:before{box-sizing:inherit}.cfgCenteredLoading *{box-sizing:border-box}.cfgCenteredLoading :after,.cfgCenteredLoading :before{box-sizing:inherit}.cfgOverlayLoading{box-sizing:border-box;align-items:center;background-color:#fff;bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:1000}.cfgOverlayLoading:after,.cfgOverlayLoading:before{box-sizing:inherit}.cfgOverlayLoading *{box-sizing:border-box}.cfgOverlayLoading :after,.cfgOverlayLoading :before{box-sizing:inherit}.cfgOverlayLoading--clickThrough{background-color:transparent;pointer-events:none}.cfgOverlayLoading--clickThrough .cfgLoadingWithText{padding:2em 2em 1.8em;border-radius:.8em;background-color:#fff;opacity:.8;border:.1em solid rgba(0,0,0,.15)}.cfgOverlayLoading--fullWindow{position:fixed;z-index:1001}.cfgLoadingWithText{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-align:center}.cfgLoadingWithText:after,.cfgLoadingWithText:before{box-sizing:inherit}.cfgLoadingWithText *{box-sizing:border-box}.cfgLoadingWithText :after,.cfgLoadingWithText :before{box-sizing:inherit}.cfgLoadingWithText__text{color:#000;font-weight:600;margin-top:.5em;font-size:1.6em}.cfgLoading{box-sizing:border-box;animation:rotate 1.1s linear 0s infinite;border-radius:100%;border:.5em solid rgba(0,0,0,.15);border-bottom-color:#000;display:inline-block;height:3em;width:3em}.cfgLoading:after,.cfgLoading:before{box-sizing:inherit}.cfgLoading *{box-sizing:border-box}.cfgLoading :after,.cfgLoading :before{box-sizing:inherit}.cfgLoading--small{border-width:.4em;height:2em;width:2em}.cfgSlider{box-sizing:border-box;flex:1;margin:0;padding:0;min-height:2.8em;background:transparent;font:inherit}.cfgSlider:after,.cfgSlider:before{box-sizing:inherit}.cfgSlider *{box-sizing:border-box}.cfgSlider :after,.cfgSlider :before{box-sizing:inherit}.cfgSlider,.cfgSlider::-webkit-slider-thumb{-webkit-appearance:none}.cfgSlider::-webkit-slider-runnable-track{box-sizing:border-box;border:none;height:.2em;background:#666}.cfgSlider::-moz-range-track{box-sizing:border-box;border:none;height:.2em;background:#666}.cfgSlider::-ms-track{box-sizing:border-box;border:none;height:.2em;background:#666}.cfgSlider::-webkit-slider-thumb{margin-top:-1.3em;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#fff;box-shadow:0 .15em .45em .05em #666}.cfgSlider::-moz-range-thumb{box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#fff;box-shadow:0 .15em .45em .05em #666}.cfgSlider::-ms-thumb{margin-top:0;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#fff;box-shadow:0 .15em .45em .05em #666}.cfgSlider::-ms-tooltip{display:none}.cfgCheckmark{box-sizing:border-box;display:inline-block;width:100%;height:100%}.cfgCheckmark:after,.cfgCheckmark:before{box-sizing:inherit}.cfgCheckmark *{box-sizing:border-box}.cfgCheckmark :after,.cfgCheckmark :before{box-sizing:inherit}.cfgCheckmark__container{transition:transform .4s;transform:translateY(17px)}.cfgCheckmark__line{stroke:#000;stroke-linecap:round;stroke-width:12;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgCheckmark__lineLeft{stroke:#000;transform:rotate(40deg) translateY(24px) translateX(18px)}.cfgCheckmark__lineRight{stroke:#000;transform:rotate(-50deg) translateY(-2px) translateX(-3px)}.cfgCheckmark__border{border:.2em solid #c8c7cc;border-radius:.3em}.cfgCheckmark__border,.cfgCheckmark__border--active{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgCheckmark__border--active{border:.2em solid #000;border-radius:.3em}.cfgChevron{box-sizing:border-box;display:inline-block;width:100%}.cfgChevron:after,.cfgChevron:before{box-sizing:inherit}.cfgChevron *{box-sizing:border-box}.cfgChevron :after,.cfgChevron :before{box-sizing:inherit}.cfgChevron__container{transition:transform .4s}.cfgChevron__container--down{transform:translateY(13px)}.cfgChevron__container--up{transform:translateY(-13px)}.cfgChevron__line{stroke-linecap:round;stroke-width:10;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgChevron__lineLeft--active,.cfgChevron__lineRight--active{stroke:#000}.cfgChevron__lineLeft--passive,.cfgChevron__lineRight--passive{stroke:#bababa}.cfgChevron__lineLeft--down{transform:rotate(40deg)}.cfgChevron__lineLeft--up,.cfgChevron__lineRight--down{transform:rotate(-40deg)}.cfgChevron__lineRight--up{transform:rotate(40deg)}.cfgDarkTheme .cfgButton{box-sizing:border-box;display:inline-block;background-color:transparent;color:#d6d6d6;border-radius:.3em;border:.1em solid #6a6a6a;font-size:1.3em;font-weight:500;outline:none;padding:.4em .8em}.cfgDarkTheme .cfgButton:after,.cfgDarkTheme .cfgButton:before{box-sizing:inherit}.cfgDarkTheme .cfgButton *{box-sizing:border-box}.cfgDarkTheme .cfgButton :after,.cfgDarkTheme .cfgButton :before{box-sizing:inherit}.cfgDarkTheme .cfgButton:focus{box-shadow:0 0 0 .075em #333,0 0 0 .2em #d6d6d6}.cfgDarkTheme .cfgButtonRow{box-sizing:border-box}.cfgDarkTheme .cfgButtonRow:after,.cfgDarkTheme .cfgButtonRow:before{box-sizing:inherit}.cfgDarkTheme .cfgButtonRow *{box-sizing:border-box}.cfgDarkTheme .cfgButtonRow :after,.cfgDarkTheme .cfgButtonRow :before{box-sizing:inherit}.cfgDarkTheme .cfgButtonRow__button:nth-child(n+2){margin-left:1em}.cfgDarkTheme .cfgConfigurator{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:10px;color:#d6d6d6;min-width:0}.cfgDarkTheme .cfgConfigurator:after,.cfgDarkTheme .cfgConfigurator:before{box-sizing:inherit}.cfgDarkTheme .cfgConfigurator *{box-sizing:border-box}.cfgDarkTheme .cfgConfigurator :after,.cfgDarkTheme .cfgConfigurator :before{box-sizing:inherit}.cfgDarkTheme .cfgConfiguratorHeader{border-bottom:.1em solid #5b5963;padding:1.7em 1.7em 1.9em;position:relative}.cfgDarkTheme .cfgConfiguratorHeader__actions{margin-top:1em}.cfgDarkTheme .cfgConfiguratorTree{padding-top:1em}.cfgDarkTheme .cfgCanvasWrapper{box-sizing:border-box;position:relative;height:50rem;-webkit-user-select:none;user-select:none}.cfgDarkTheme .cfgCanvasWrapper:after,.cfgDarkTheme .cfgCanvasWrapper:before{box-sizing:inherit}.cfgDarkTheme .cfgCanvasWrapper *{box-sizing:border-box}.cfgDarkTheme .cfgCanvasWrapper :after,.cfgDarkTheme .cfgCanvasWrapper :before{box-sizing:inherit}.cfgDarkTheme .cfgCanvasWrapper canvas{outline:none}.cfgDarkTheme .cfgConfiguratorWrapper{box-sizing:border-box;color:#d6d6d6;height:100%;width:100%}.cfgDarkTheme .cfgConfiguratorWrapper:after,.cfgDarkTheme .cfgConfiguratorWrapper:before{box-sizing:inherit}.cfgDarkTheme .cfgConfiguratorWrapper *{box-sizing:border-box}.cfgDarkTheme .cfgConfiguratorWrapper :after,.cfgDarkTheme .cfgConfiguratorWrapper :before{box-sizing:inherit}@media screen and (orientation:landscape){.cfgDarkTheme .cfgConfiguratorWrapper{display:flex;flex-direction:row}.cfgDarkTheme .cfgConfiguratorWrapper>.cfgConfigurator{flex:0 1 40%;height:100%}.cfgDarkTheme .cfgConfiguratorWrapper .cfgCanvasWrapper{flex:0 1 60%;height:85vh;overflow:hidden;position:sticky;top:0}}.cfgDarkTheme .cfgExpandableHeadingRow{box-sizing:border-box;-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%}.cfgDarkTheme .cfgExpandableHeadingRow:after,.cfgDarkTheme .cfgExpandableHeadingRow:before{box-sizing:inherit}.cfgDarkTheme .cfgExpandableHeadingRow *{box-sizing:border-box}.cfgDarkTheme .cfgExpandableHeadingRow :after,.cfgDarkTheme .cfgExpandableHeadingRow :before{box-sizing:inherit}.cfgDarkTheme .cfgExpandableHeadingRow--expandable{cursor:pointer}.cfgDarkTheme .cfgExpandableHeadingRow__title{align-items:center;display:flex;flex:1 1 auto;font-size:1.5em;font-weight:500;justify-content:flex-start}.cfgDarkTheme .cfgExpandableHeadingRow__icon{align-items:center;display:flex;flex:0 0 5em;justify-content:center;padding:0 1.5em}.cfgDarkTheme .cfgHr{box-sizing:border-box;border:0;border-bottom:.1em solid #5b5963;padding:0;margin:0}.cfgDarkTheme .cfgHr:after,.cfgDarkTheme .cfgHr:before{box-sizing:inherit}.cfgDarkTheme .cfgHr *{box-sizing:border-box}.cfgDarkTheme .cfgHr :after,.cfgDarkTheme .cfgHr :before{box-sizing:inherit}.cfgDarkTheme .cfgThumbnailImage{border-radius:.7em;display:inline-block;height:3em;width:3em}.cfgDarkTheme .cfgThumbnailPlaceholder{align-items:center;display:flex;flex:0 0 4.2em;justify-content:flex-start}.cfgDarkTheme .cfgFeatureItem{box-sizing:border-box;color:#d6d6d6}.cfgDarkTheme .cfgFeatureItem:after,.cfgDarkTheme .cfgFeatureItem:before{box-sizing:inherit}.cfgDarkTheme .cfgFeatureItem *{box-sizing:border-box}.cfgDarkTheme .cfgFeatureItem :after,.cfgDarkTheme .cfgFeatureItem :before{box-sizing:inherit}.cfgDarkTheme .cfgFeatureItem__dropdown{-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%;cursor:pointer}.cfgDarkTheme .cfgFeatureItem--optional{margin-top:1em}.cfgDarkTheme .cfgFeatureItem__hiddenInput{left:-99999px;opacity:0;position:absolute;z-index:-1}.cfgDarkTheme .cfgFeatureItem__radio{border:.2em solid #5b5963;border-radius:50%}.cfgDarkTheme .cfgFeatureItem__checkbox,.cfgDarkTheme .cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgDarkTheme .cfgFeatureItem__checkbox{border:.2em solid #5b5963;border-radius:.3em}.cfgDarkTheme .cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__checkbox,.cfgDarkTheme .cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__radio{box-shadow:0 0 0 .075em #333,0 0 0 .2em #d6d6d6}.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{border:.2em solid #fff;border-radius:50%}.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox,.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox{border:.2em solid #fff;border-radius:.3em}.cfgDarkTheme .cfgFeatureItemOption__titleWrapper,.cfgDarkTheme .cfgFeatureItemOptional__titleWrapper{flex:1 1 auto;margin-left:1em}.cfgDarkTheme .cfgFeatureItemOption__title,.cfgDarkTheme .cfgFeatureItemOptional__title{font-size:1.5em}.cfgDarkTheme .cfgFeatureItemOption__price{font-weight:600;font-size:.75em;color:#999}.cfgDarkTheme .cfgOptionTree--subLevel .cfgFeatureItem__hr{display:none}.cfgDarkTheme .cfgFeatureItemOption{align-items:center;display:flex}.cfgDarkTheme .cfgFeatureItemOptional{align-items:center;display:flex;justify-content:center;margin-top:.5em}.cfgDarkTheme .cfgFeatureItemOptional__header{font-size:1.2em;font-weight:600;margin:0 0 .3em;padding:0;text-transform:uppercase}.cfgDarkTheme .cfgAdditionalProduct .cfgFeatureItem:last-child .cfgFeatureItem__hr{margin-bottom:-.1em}.cfgDarkTheme .cfgOptionTree{box-sizing:border-box;list-style:none;margin:0;padding:0}.cfgDarkTheme .cfgOptionTree:after,.cfgDarkTheme .cfgOptionTree:before{box-sizing:inherit}.cfgDarkTheme .cfgOptionTree *{box-sizing:border-box}.cfgDarkTheme .cfgOptionTree :after,.cfgDarkTheme .cfgOptionTree :before{box-sizing:inherit}.cfgDarkTheme .cfgOptionTree--topLevel{padding-left:1.7em}.cfgDarkTheme .cfgOptionTree--indent{margin-left:3.2em}.cfgDarkTheme .cfgOptionTree--compThumb{margin-left:4.2em}.cfgDarkTheme .cfgProductInfo{box-sizing:border-box;color:#d6d6d6;display:flex}.cfgDarkTheme .cfgProductInfo:after,.cfgDarkTheme .cfgProductInfo:before{box-sizing:inherit}.cfgDarkTheme .cfgProductInfo *{box-sizing:border-box}.cfgDarkTheme .cfgProductInfo :after,.cfgDarkTheme .cfgProductInfo :before{box-sizing:inherit}.cfgDarkTheme .cfgProductInfo__left{flex:1 1 auto;min-width:0;overflow:hidden}.cfgDarkTheme .cfgProductInfo__right{align-items:flex-end;display:flex;flex-direction:column;flex:1 0 auto;margin-left:1em;max-width:.333333333;min-width:0}.cfgDarkTheme .cfgProductInfo__name{display:block;font-size:1.6em;font-weight:600;line-height:1.33;margin:0}.cfgDarkTheme .cfgProductInfo__number{font-size:1.3em;font-weight:400;line-height:1.38;margin:0}.cfgDarkTheme .cfgCenteredLoading{box-sizing:border-box;align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;width:100%}.cfgDarkTheme .cfgCenteredLoading:after,.cfgDarkTheme .cfgCenteredLoading:before{box-sizing:inherit}.cfgDarkTheme .cfgCenteredLoading *{box-sizing:border-box}.cfgDarkTheme .cfgCenteredLoading :after,.cfgDarkTheme .cfgCenteredLoading :before{box-sizing:inherit}.cfgDarkTheme .cfgOverlayLoading{box-sizing:border-box;align-items:center;background-color:#333;bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:1000}.cfgDarkTheme .cfgOverlayLoading:after,.cfgDarkTheme .cfgOverlayLoading:before{box-sizing:inherit}.cfgDarkTheme .cfgOverlayLoading *{box-sizing:border-box}.cfgDarkTheme .cfgOverlayLoading :after,.cfgDarkTheme .cfgOverlayLoading :before{box-sizing:inherit}.cfgDarkTheme .cfgOverlayLoading--clickThrough{background-color:transparent;pointer-events:none}.cfgDarkTheme .cfgOverlayLoading--clickThrough .cfgLoadingWithText{padding:2em 2em 1.8em;border-radius:.8em;background-color:#333;opacity:.8;border:.1em solid hsla(0,0%,100%,.15)}.cfgDarkTheme .cfgOverlayLoading--fullWindow{position:fixed;z-index:1001}.cfgDarkTheme .cfgLoadingWithText{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-align:center}.cfgDarkTheme .cfgLoadingWithText:after,.cfgDarkTheme .cfgLoadingWithText:before{box-sizing:inherit}.cfgDarkTheme .cfgLoadingWithText *{box-sizing:border-box}.cfgDarkTheme .cfgLoadingWithText :after,.cfgDarkTheme .cfgLoadingWithText :before{box-sizing:inherit}.cfgDarkTheme .cfgLoadingWithText__text{color:#fff;font-weight:600;margin-top:.5em;font-size:1.6em}.cfgDarkTheme .cfgLoading{box-sizing:border-box;animation:rotate 1.1s linear 0s infinite;border-radius:100%;border:.5em solid hsla(0,0%,100%,.15);border-bottom-color:#fff;display:inline-block;height:3em;width:3em}.cfgDarkTheme .cfgLoading:after,.cfgDarkTheme .cfgLoading:before{box-sizing:inherit}.cfgDarkTheme .cfgLoading *{box-sizing:border-box}.cfgDarkTheme .cfgLoading :after,.cfgDarkTheme .cfgLoading :before{box-sizing:inherit}.cfgDarkTheme .cfgLoading--small{border-width:.4em;height:2em;width:2em}@keyframes rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.cfgDarkTheme .cfgSlider{box-sizing:border-box;flex:1;margin:0;padding:0;min-height:2.8em;background:transparent;font:inherit}.cfgDarkTheme .cfgSlider:after,.cfgDarkTheme .cfgSlider:before{box-sizing:inherit}.cfgDarkTheme .cfgSlider *{box-sizing:border-box}.cfgDarkTheme .cfgSlider :after,.cfgDarkTheme .cfgSlider :before{box-sizing:inherit}.cfgDarkTheme .cfgSlider,.cfgDarkTheme .cfgSlider::-webkit-slider-thumb{-webkit-appearance:none}.cfgDarkTheme .cfgSlider::-webkit-slider-runnable-track{box-sizing:border-box;border:none;height:.2em;background:#adadad}.cfgDarkTheme .cfgSlider::-moz-range-track{box-sizing:border-box;border:none;height:.2em;background:#adadad}.cfgDarkTheme .cfgSlider::-ms-track{box-sizing:border-box;border:none;height:.2em;background:#adadad}.cfgDarkTheme .cfgSlider::-webkit-slider-thumb{margin-top:-1.3em;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#333;box-shadow:0 .15em .45em .05em #adadad}.cfgDarkTheme .cfgSlider::-moz-range-thumb{box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#333;box-shadow:0 .15em .45em .05em #adadad}.cfgDarkTheme .cfgSlider::-ms-thumb{margin-top:0;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#333;box-shadow:0 .15em .45em .05em #adadad}.cfgDarkTheme .cfgSlider::-ms-tooltip{display:none}.cfgDarkTheme .cfgCheckmark{box-sizing:border-box;display:inline-block;width:100%;height:100%}.cfgDarkTheme .cfgCheckmark:after,.cfgDarkTheme .cfgCheckmark:before{box-sizing:inherit}.cfgDarkTheme .cfgCheckmark *{box-sizing:border-box}.cfgDarkTheme .cfgCheckmark :after,.cfgDarkTheme .cfgCheckmark :before{box-sizing:inherit}.cfgDarkTheme .cfgCheckmark__container{transition:transform .4s;transform:translateY(17px)}.cfgDarkTheme .cfgCheckmark__line{stroke:#fff;stroke-linecap:round;stroke-width:12;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgDarkTheme .cfgCheckmark__lineLeft{stroke:#fff;transform:rotate(40deg) translateY(24px) translateX(18px)}.cfgDarkTheme .cfgCheckmark__lineRight{stroke:#fff;transform:rotate(-50deg) translateY(-2px) translateX(-3px)}.cfgDarkTheme .cfgCheckmark__border{border:.2em solid #5b5963;border-radius:.3em}.cfgDarkTheme .cfgCheckmark__border,.cfgDarkTheme .cfgCheckmark__border--active{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgDarkTheme .cfgCheckmark__border--active{border:.2em solid #fff;border-radius:.3em}.cfgDarkTheme .cfgChevron{box-sizing:border-box;display:inline-block;width:100%}.cfgDarkTheme .cfgChevron:after,.cfgDarkTheme .cfgChevron:before{box-sizing:inherit}.cfgDarkTheme .cfgChevron *{box-sizing:border-box}.cfgDarkTheme .cfgChevron :after,.cfgDarkTheme .cfgChevron :before{box-sizing:inherit}.cfgDarkTheme .cfgChevron__container{transition:transform .4s}.cfgDarkTheme .cfgChevron__container--down{transform:translateY(13px)}.cfgDarkTheme .cfgChevron__container--up{transform:translateY(-13px)}.cfgDarkTheme .cfgChevron__line{stroke-linecap:round;stroke-width:10;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgDarkTheme .cfgChevron__lineLeft--active,.cfgDarkTheme .cfgChevron__lineRight--active{stroke:#fff}.cfgDarkTheme .cfgChevron__lineLeft--passive,.cfgDarkTheme .cfgChevron__lineRight--passive{stroke:#6a6a6a}.cfgDarkTheme .cfgChevron__lineLeft--down{transform:rotate(40deg)}.cfgDarkTheme .cfgChevron__lineLeft--up,.cfgDarkTheme .cfgChevron__lineRight--down{transform:rotate(-40deg)}.cfgDarkTheme .cfgChevron__lineRight--up{transform:rotate(40deg)}
1
+ .cfgRangeView__inputs{display:flex;align-items:center}.cfgRangeView__number-input{font-size:1.5em;flex-grow:1;text-align:right}.cfgRangeView__unit-label{font-size:1.5em;margin-left:.3em}.cfgRangeView__slider-input.cfgSlider{margin-left:1em;flex-grow:3}.cfgRangeView__error{margin-top:1em;font-size:1.5em;color:#b00}.cfgMl1{margin-left:1em}.cfgMt1{margin-top:1em}.cfgMb1{margin-bottom:1em}.cfgTextOverflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cfgButton{box-sizing:border-box;display:inline-block;background-color:transparent;color:#333;border-radius:.3em;border:.1em solid #bababa;font-size:1.3em;font-weight:500;outline:none;padding:.4em .8em}.cfgButton:after,.cfgButton:before{box-sizing:inherit}.cfgButton *{box-sizing:border-box}.cfgButton :after,.cfgButton :before{box-sizing:inherit}.cfgButton:focus{box-shadow:0 0 0 .075em #fff,0 0 0 .2em #333}.cfgButtonRow{box-sizing:border-box}.cfgButtonRow:after,.cfgButtonRow:before{box-sizing:inherit}.cfgButtonRow *{box-sizing:border-box}.cfgButtonRow :after,.cfgButtonRow :before{box-sizing:inherit}.cfgButtonRow__button:nth-child(n+2){margin-left:1em}.cfgConfigurator{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:10px;color:#333;min-width:0}.cfgConfigurator:after,.cfgConfigurator:before{box-sizing:inherit}.cfgConfigurator *{box-sizing:border-box}.cfgConfigurator :after,.cfgConfigurator :before{box-sizing:inherit}.cfgConfiguratorHeader{border-bottom:.1em solid #c8c7cc;padding:1.7em 1.7em 1.9em;position:relative}.cfgConfiguratorHeader__actions{margin-top:1em}.cfgConfiguratorTree{padding-top:1em}.cfgCanvasWrapper{box-sizing:border-box;position:relative;height:50rem;-webkit-user-select:none;user-select:none}.cfgCanvasWrapper:after,.cfgCanvasWrapper:before{box-sizing:inherit}.cfgCanvasWrapper *{box-sizing:border-box}.cfgCanvasWrapper :after,.cfgCanvasWrapper :before{box-sizing:inherit}.cfgCanvasWrapper canvas{outline:none}.cfgConfiguratorWrapper{box-sizing:border-box;color:#333;height:100%;width:100%}.cfgConfiguratorWrapper:after,.cfgConfiguratorWrapper:before{box-sizing:inherit}.cfgConfiguratorWrapper *{box-sizing:border-box}.cfgConfiguratorWrapper :after,.cfgConfiguratorWrapper :before{box-sizing:inherit}@media screen and (orientation:landscape){.cfgConfiguratorWrapper{display:flex;flex-direction:row}.cfgConfiguratorWrapper>.cfgConfigurator{flex:0 1 40%;height:100%}.cfgConfiguratorWrapper .cfgCanvasWrapper{flex:0 1 60%;height:85vh;overflow:hidden;position:sticky;top:0}}.cfgExpandableHeadingRow{box-sizing:border-box;-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%}.cfgExpandableHeadingRow:after,.cfgExpandableHeadingRow:before{box-sizing:inherit}.cfgExpandableHeadingRow *{box-sizing:border-box}.cfgExpandableHeadingRow :after,.cfgExpandableHeadingRow :before{box-sizing:inherit}.cfgExpandableHeadingRow--expandable{cursor:pointer}.cfgExpandableHeadingRow__title{align-items:center;display:flex;flex:1 1 auto;font-size:1.5em;font-weight:500;justify-content:flex-start}.cfgExpandableHeadingRow__icon{align-items:center;display:flex;flex:0 0 5em;justify-content:center;padding:0 1.5em}.cfgHr{box-sizing:border-box;border:0;border-bottom:.1em solid #c8c7cc;padding:0;margin:0}.cfgHr:after,.cfgHr:before{box-sizing:inherit}.cfgHr *{box-sizing:border-box}.cfgHr :after,.cfgHr :before{box-sizing:inherit}.cfgThumbnailImage{border-radius:.7em;display:inline-block;height:3em;width:3em}.cfgThumbnailPlaceholder{align-items:center;display:flex;flex:0 0 4.2em;justify-content:flex-start}.cfgFeatureItem{box-sizing:border-box;color:#333}.cfgFeatureItem:after,.cfgFeatureItem:before{box-sizing:inherit}.cfgFeatureItem *{box-sizing:border-box}.cfgFeatureItem :after,.cfgFeatureItem :before{box-sizing:inherit}.cfgFeatureItem__dropdown{-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%;cursor:pointer}.cfgFeatureItem--optional{margin-top:1em}.cfgFeatureItem__hiddenInput{left:-99999px;opacity:0;position:absolute;z-index:-1}.cfgFeatureItem__radio{border:.2em solid #c8c7cc;border-radius:50%}.cfgFeatureItem__checkbox,.cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgFeatureItem__checkbox{border:.2em solid #c8c7cc;border-radius:.3em}.cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__checkbox,.cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__radio{box-shadow:0 0 0 .075em #fff,0 0 0 .2em #333}.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{border:.2em solid #000;border-radius:50%}.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox,.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox{border:.2em solid #000;border-radius:.3em}.cfgFeatureItemOption__titleWrapper,.cfgFeatureItemOptional__titleWrapper{flex:1 1 auto;margin-left:1em}.cfgFeatureItemOption__title,.cfgFeatureItemOptional__title{font-size:1.5em}.cfgFeatureItemOption__price{font-weight:600;font-size:.75em;color:grey}.cfgOptionTree--subLevel .cfgFeatureItem__hr{display:none}.cfgFeatureItemOption,.cfgFeatureItemOptional{align-items:center;display:flex}.cfgFeatureItemOptional{justify-content:center;margin-top:.5em}.cfgFeatureItemOptional__header{font-size:1.2em;font-weight:600;margin:0 0 .3em;padding:0;text-transform:uppercase}.cfgAdditionalProduct .cfgFeatureItem:last-child .cfgFeatureItem__hr{margin-bottom:-.1em}.cfgOptionTree{box-sizing:border-box;list-style:none;margin:0;padding:0}.cfgOptionTree:after,.cfgOptionTree:before{box-sizing:inherit}.cfgOptionTree *{box-sizing:border-box}.cfgOptionTree :after,.cfgOptionTree :before{box-sizing:inherit}.cfgOptionTree--topLevel{padding-left:1.7em}.cfgOptionTree--indent{margin-left:3.2em}.cfgOptionTree--compThumb{margin-left:4.2em}.cfgProductInfo{box-sizing:border-box;color:#333;display:flex}.cfgProductInfo:after,.cfgProductInfo:before{box-sizing:inherit}.cfgProductInfo *{box-sizing:border-box}.cfgProductInfo :after,.cfgProductInfo :before{box-sizing:inherit}.cfgProductInfo__left{flex:1 1 auto;min-width:0;overflow:hidden}.cfgProductInfo__right{align-items:flex-end;display:flex;flex-direction:column;flex:1 0 auto;margin-left:1em;max-width:.333333333;min-width:0}.cfgProductInfo__name{display:block;font-size:1.6em;font-weight:600;line-height:1.33;margin:0}.cfgProductInfo__number{font-size:1.3em;font-weight:400;line-height:1.38;margin:0}.cfgCenteredLoading{box-sizing:border-box;align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;width:100%}.cfgCenteredLoading:after,.cfgCenteredLoading:before{box-sizing:inherit}.cfgCenteredLoading *{box-sizing:border-box}.cfgCenteredLoading :after,.cfgCenteredLoading :before{box-sizing:inherit}.cfgOverlayLoading{box-sizing:border-box;align-items:center;background-color:#fff;bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:1000}.cfgOverlayLoading:after,.cfgOverlayLoading:before{box-sizing:inherit}.cfgOverlayLoading *{box-sizing:border-box}.cfgOverlayLoading :after,.cfgOverlayLoading :before{box-sizing:inherit}.cfgOverlayLoading--clickThrough{background-color:transparent;pointer-events:none}.cfgOverlayLoading--clickThrough .cfgLoadingWithText{padding:2em 2em 1.8em;border-radius:.8em;background-color:#fff;opacity:.8;border:.1em solid rgba(0,0,0,.15)}.cfgOverlayLoading--fullWindow{position:fixed;z-index:1001}.cfgLoadingWithText{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-align:center}.cfgLoadingWithText:after,.cfgLoadingWithText:before{box-sizing:inherit}.cfgLoadingWithText *{box-sizing:border-box}.cfgLoadingWithText :after,.cfgLoadingWithText :before{box-sizing:inherit}.cfgLoadingWithText__text{color:#000;font-weight:600;margin-top:.5em;font-size:1.6em}.cfgLoading{box-sizing:border-box;animation:rotate 1.1s linear 0s infinite;border-radius:100%;border:.5em solid rgba(0,0,0,.15);border-bottom-color:#000;display:inline-block;height:3em;width:3em}.cfgLoading:after,.cfgLoading:before{box-sizing:inherit}.cfgLoading *{box-sizing:border-box}.cfgLoading :after,.cfgLoading :before{box-sizing:inherit}.cfgLoading--small{border-width:.4em;height:2em;width:2em}.cfgSlider{box-sizing:border-box;flex:1;margin:0;padding:0;min-height:2.8em;background:transparent;font:inherit}.cfgSlider:after,.cfgSlider:before{box-sizing:inherit}.cfgSlider *{box-sizing:border-box}.cfgSlider :after,.cfgSlider :before{box-sizing:inherit}.cfgSlider,.cfgSlider::-webkit-slider-thumb{-webkit-appearance:none}.cfgSlider::-webkit-slider-runnable-track{box-sizing:border-box;border:none;height:.2em;background:#666}.cfgSlider::-moz-range-track{box-sizing:border-box;border:none;height:.2em;background:#666}.cfgSlider::-ms-track{box-sizing:border-box;border:none;height:.2em;background:#666}.cfgSlider::-webkit-slider-thumb{margin-top:-1.3em;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#fff;box-shadow:0 .15em .45em .05em #666}.cfgSlider::-moz-range-thumb{box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#fff;box-shadow:0 .15em .45em .05em #666}.cfgSlider::-ms-thumb{margin-top:0;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#fff;box-shadow:0 .15em .45em .05em #666}.cfgSlider::-ms-tooltip{display:none}.cfgCheckmark{box-sizing:border-box;display:inline-block;width:100%;height:100%}.cfgCheckmark:after,.cfgCheckmark:before{box-sizing:inherit}.cfgCheckmark *{box-sizing:border-box}.cfgCheckmark :after,.cfgCheckmark :before{box-sizing:inherit}.cfgCheckmark__container{transition:transform .4s;transform:translateY(17px)}.cfgCheckmark__line{stroke:#000;stroke-linecap:round;stroke-width:12;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgCheckmark__lineLeft{stroke:#000;transform:rotate(40deg) translateY(24px) translateX(18px)}.cfgCheckmark__lineRight{stroke:#000;transform:rotate(-50deg) translateY(-2px) translateX(-3px)}.cfgCheckmark__border{border:.2em solid #c8c7cc;border-radius:.3em}.cfgCheckmark__border,.cfgCheckmark__border--active{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgCheckmark__border--active{border:.2em solid #000;border-radius:.3em}.cfgChevron{box-sizing:border-box;display:inline-block;width:100%}.cfgChevron:after,.cfgChevron:before{box-sizing:inherit}.cfgChevron *{box-sizing:border-box}.cfgChevron :after,.cfgChevron :before{box-sizing:inherit}.cfgChevron__container{transition:transform .4s}.cfgChevron__container--down{transform:translateY(13px)}.cfgChevron__container--up{transform:translateY(-13px)}.cfgChevron__line{stroke-linecap:round;stroke-width:10;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgChevron__lineLeft--active,.cfgChevron__lineRight--active{stroke:#000}.cfgChevron__lineLeft--passive,.cfgChevron__lineRight--passive{stroke:#bababa}.cfgChevron__lineLeft--down{transform:rotate(40deg)}.cfgChevron__lineLeft--up,.cfgChevron__lineRight--down{transform:rotate(-40deg)}.cfgChevron__lineRight--up{transform:rotate(40deg)}.cfgDarkTheme .cfgButton{box-sizing:border-box;display:inline-block;background-color:transparent;color:#d6d6d6;border-radius:.3em;border:.1em solid #6a6a6a;font-size:1.3em;font-weight:500;outline:none;padding:.4em .8em}.cfgDarkTheme .cfgButton:after,.cfgDarkTheme .cfgButton:before{box-sizing:inherit}.cfgDarkTheme .cfgButton *{box-sizing:border-box}.cfgDarkTheme .cfgButton :after,.cfgDarkTheme .cfgButton :before{box-sizing:inherit}.cfgDarkTheme .cfgButton:focus{box-shadow:0 0 0 .075em #333,0 0 0 .2em #d6d6d6}.cfgDarkTheme .cfgButtonRow{box-sizing:border-box}.cfgDarkTheme .cfgButtonRow:after,.cfgDarkTheme .cfgButtonRow:before{box-sizing:inherit}.cfgDarkTheme .cfgButtonRow *{box-sizing:border-box}.cfgDarkTheme .cfgButtonRow :after,.cfgDarkTheme .cfgButtonRow :before{box-sizing:inherit}.cfgDarkTheme .cfgButtonRow__button:nth-child(n+2){margin-left:1em}.cfgDarkTheme .cfgConfigurator{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:10px;color:#d6d6d6;min-width:0}.cfgDarkTheme .cfgConfigurator:after,.cfgDarkTheme .cfgConfigurator:before{box-sizing:inherit}.cfgDarkTheme .cfgConfigurator *{box-sizing:border-box}.cfgDarkTheme .cfgConfigurator :after,.cfgDarkTheme .cfgConfigurator :before{box-sizing:inherit}.cfgDarkTheme .cfgConfiguratorHeader{border-bottom:.1em solid #5b5963;padding:1.7em 1.7em 1.9em;position:relative}.cfgDarkTheme .cfgConfiguratorHeader__actions{margin-top:1em}.cfgDarkTheme .cfgConfiguratorTree{padding-top:1em}.cfgDarkTheme .cfgCanvasWrapper{box-sizing:border-box;position:relative;height:50rem;-webkit-user-select:none;user-select:none}.cfgDarkTheme .cfgCanvasWrapper:after,.cfgDarkTheme .cfgCanvasWrapper:before{box-sizing:inherit}.cfgDarkTheme .cfgCanvasWrapper *{box-sizing:border-box}.cfgDarkTheme .cfgCanvasWrapper :after,.cfgDarkTheme .cfgCanvasWrapper :before{box-sizing:inherit}.cfgDarkTheme .cfgCanvasWrapper canvas{outline:none}.cfgDarkTheme .cfgConfiguratorWrapper{box-sizing:border-box;color:#d6d6d6;height:100%;width:100%}.cfgDarkTheme .cfgConfiguratorWrapper:after,.cfgDarkTheme .cfgConfiguratorWrapper:before{box-sizing:inherit}.cfgDarkTheme .cfgConfiguratorWrapper *{box-sizing:border-box}.cfgDarkTheme .cfgConfiguratorWrapper :after,.cfgDarkTheme .cfgConfiguratorWrapper :before{box-sizing:inherit}@media screen and (orientation:landscape){.cfgDarkTheme .cfgConfiguratorWrapper{display:flex;flex-direction:row}.cfgDarkTheme .cfgConfiguratorWrapper>.cfgConfigurator{flex:0 1 40%;height:100%}.cfgDarkTheme .cfgConfiguratorWrapper .cfgCanvasWrapper{flex:0 1 60%;height:85vh;overflow:hidden;position:sticky;top:0}}.cfgDarkTheme .cfgExpandableHeadingRow{box-sizing:border-box;-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%}.cfgDarkTheme .cfgExpandableHeadingRow:after,.cfgDarkTheme .cfgExpandableHeadingRow:before{box-sizing:inherit}.cfgDarkTheme .cfgExpandableHeadingRow *{box-sizing:border-box}.cfgDarkTheme .cfgExpandableHeadingRow :after,.cfgDarkTheme .cfgExpandableHeadingRow :before{box-sizing:inherit}.cfgDarkTheme .cfgExpandableHeadingRow--expandable{cursor:pointer}.cfgDarkTheme .cfgExpandableHeadingRow__title{align-items:center;display:flex;flex:1 1 auto;font-size:1.5em;font-weight:500;justify-content:flex-start}.cfgDarkTheme .cfgExpandableHeadingRow__icon{align-items:center;display:flex;flex:0 0 5em;justify-content:center;padding:0 1.5em}.cfgDarkTheme .cfgHr{box-sizing:border-box;border:0;border-bottom:.1em solid #5b5963;padding:0;margin:0}.cfgDarkTheme .cfgHr:after,.cfgDarkTheme .cfgHr:before{box-sizing:inherit}.cfgDarkTheme .cfgHr *{box-sizing:border-box}.cfgDarkTheme .cfgHr :after,.cfgDarkTheme .cfgHr :before{box-sizing:inherit}.cfgDarkTheme .cfgThumbnailImage{border-radius:.7em;display:inline-block;height:3em;width:3em}.cfgDarkTheme .cfgThumbnailPlaceholder{align-items:center;display:flex;flex:0 0 4.2em;justify-content:flex-start}.cfgDarkTheme .cfgFeatureItem{box-sizing:border-box;color:#d6d6d6}.cfgDarkTheme .cfgFeatureItem:after,.cfgDarkTheme .cfgFeatureItem:before{box-sizing:inherit}.cfgDarkTheme .cfgFeatureItem *{box-sizing:border-box}.cfgDarkTheme .cfgFeatureItem :after,.cfgDarkTheme .cfgFeatureItem :before{box-sizing:inherit}.cfgDarkTheme .cfgFeatureItem__dropdown{-webkit-appearance:none;appearance:none;font-family:inherit;font-size:inherit;color:inherit;background:none;border:none;padding:0;align-items:stretch;display:flex;height:3.9em;outline:0;position:relative;width:100%;cursor:pointer}.cfgDarkTheme .cfgFeatureItem--optional{margin-top:1em}.cfgDarkTheme .cfgFeatureItem__hiddenInput{left:-99999px;opacity:0;position:absolute;z-index:-1}.cfgDarkTheme .cfgFeatureItem__radio{border:.2em solid #5b5963;border-radius:50%}.cfgDarkTheme .cfgFeatureItem__checkbox,.cfgDarkTheme .cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgDarkTheme .cfgFeatureItem__checkbox{border:.2em solid #5b5963;border-radius:.3em}.cfgDarkTheme .cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__checkbox,.cfgDarkTheme .cfgFeatureItem__hiddenInput:focus~.cfgFeatureItem__radio{box-shadow:0 0 0 .075em #333,0 0 0 .2em #d6d6d6}.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{border:.2em solid #fff;border-radius:50%}.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox,.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__radio{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgDarkTheme .cfgFeatureItem__hiddenInput:checked~.cfgFeatureItem__checkbox{border:.2em solid #fff;border-radius:.3em}.cfgDarkTheme .cfgFeatureItemOption__titleWrapper,.cfgDarkTheme .cfgFeatureItemOptional__titleWrapper{flex:1 1 auto;margin-left:1em}.cfgDarkTheme .cfgFeatureItemOption__title,.cfgDarkTheme .cfgFeatureItemOptional__title{font-size:1.5em}.cfgDarkTheme .cfgFeatureItemOption__price{font-weight:600;font-size:.75em;color:#999}.cfgDarkTheme .cfgOptionTree--subLevel .cfgFeatureItem__hr{display:none}.cfgDarkTheme .cfgFeatureItemOption{align-items:center;display:flex}.cfgDarkTheme .cfgFeatureItemOptional{align-items:center;display:flex;justify-content:center;margin-top:.5em}.cfgDarkTheme .cfgFeatureItemOptional__header{font-size:1.2em;font-weight:600;margin:0 0 .3em;padding:0;text-transform:uppercase}.cfgDarkTheme .cfgAdditionalProduct .cfgFeatureItem:last-child .cfgFeatureItem__hr{margin-bottom:-.1em}.cfgDarkTheme .cfgOptionTree{box-sizing:border-box;list-style:none;margin:0;padding:0}.cfgDarkTheme .cfgOptionTree:after,.cfgDarkTheme .cfgOptionTree:before{box-sizing:inherit}.cfgDarkTheme .cfgOptionTree *{box-sizing:border-box}.cfgDarkTheme .cfgOptionTree :after,.cfgDarkTheme .cfgOptionTree :before{box-sizing:inherit}.cfgDarkTheme .cfgOptionTree--topLevel{padding-left:1.7em}.cfgDarkTheme .cfgOptionTree--indent{margin-left:3.2em}.cfgDarkTheme .cfgOptionTree--compThumb{margin-left:4.2em}.cfgDarkTheme .cfgProductInfo{box-sizing:border-box;color:#d6d6d6;display:flex}.cfgDarkTheme .cfgProductInfo:after,.cfgDarkTheme .cfgProductInfo:before{box-sizing:inherit}.cfgDarkTheme .cfgProductInfo *{box-sizing:border-box}.cfgDarkTheme .cfgProductInfo :after,.cfgDarkTheme .cfgProductInfo :before{box-sizing:inherit}.cfgDarkTheme .cfgProductInfo__left{flex:1 1 auto;min-width:0;overflow:hidden}.cfgDarkTheme .cfgProductInfo__right{align-items:flex-end;display:flex;flex-direction:column;flex:1 0 auto;margin-left:1em;max-width:.333333333;min-width:0}.cfgDarkTheme .cfgProductInfo__name{display:block;font-size:1.6em;font-weight:600;line-height:1.33;margin:0}.cfgDarkTheme .cfgProductInfo__number{font-size:1.3em;font-weight:400;line-height:1.38;margin:0}.cfgDarkTheme .cfgCenteredLoading{box-sizing:border-box;align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;width:100%}.cfgDarkTheme .cfgCenteredLoading:after,.cfgDarkTheme .cfgCenteredLoading:before{box-sizing:inherit}.cfgDarkTheme .cfgCenteredLoading *{box-sizing:border-box}.cfgDarkTheme .cfgCenteredLoading :after,.cfgDarkTheme .cfgCenteredLoading :before{box-sizing:inherit}.cfgDarkTheme .cfgOverlayLoading{box-sizing:border-box;align-items:center;background-color:#333;bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:1000}.cfgDarkTheme .cfgOverlayLoading:after,.cfgDarkTheme .cfgOverlayLoading:before{box-sizing:inherit}.cfgDarkTheme .cfgOverlayLoading *{box-sizing:border-box}.cfgDarkTheme .cfgOverlayLoading :after,.cfgDarkTheme .cfgOverlayLoading :before{box-sizing:inherit}.cfgDarkTheme .cfgOverlayLoading--clickThrough{background-color:transparent;pointer-events:none}.cfgDarkTheme .cfgOverlayLoading--clickThrough .cfgLoadingWithText{padding:2em 2em 1.8em;border-radius:.8em;background-color:#333;opacity:.8;border:.1em solid hsla(0,0%,100%,.15)}.cfgDarkTheme .cfgOverlayLoading--fullWindow{position:fixed;z-index:1001}.cfgDarkTheme .cfgLoadingWithText{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-align:center}.cfgDarkTheme .cfgLoadingWithText:after,.cfgDarkTheme .cfgLoadingWithText:before{box-sizing:inherit}.cfgDarkTheme .cfgLoadingWithText *{box-sizing:border-box}.cfgDarkTheme .cfgLoadingWithText :after,.cfgDarkTheme .cfgLoadingWithText :before{box-sizing:inherit}.cfgDarkTheme .cfgLoadingWithText__text{color:#fff;font-weight:600;margin-top:.5em;font-size:1.6em}.cfgDarkTheme .cfgLoading{box-sizing:border-box;animation:rotate 1.1s linear 0s infinite;border-radius:100%;border:.5em solid hsla(0,0%,100%,.15);border-bottom-color:#fff;display:inline-block;height:3em;width:3em}.cfgDarkTheme .cfgLoading:after,.cfgDarkTheme .cfgLoading:before{box-sizing:inherit}.cfgDarkTheme .cfgLoading *{box-sizing:border-box}.cfgDarkTheme .cfgLoading :after,.cfgDarkTheme .cfgLoading :before{box-sizing:inherit}.cfgDarkTheme .cfgLoading--small{border-width:.4em;height:2em;width:2em}@keyframes rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.cfgDarkTheme .cfgSlider{box-sizing:border-box;flex:1;margin:0;padding:0;min-height:2.8em;background:transparent;font:inherit}.cfgDarkTheme .cfgSlider:after,.cfgDarkTheme .cfgSlider:before{box-sizing:inherit}.cfgDarkTheme .cfgSlider *{box-sizing:border-box}.cfgDarkTheme .cfgSlider :after,.cfgDarkTheme .cfgSlider :before{box-sizing:inherit}.cfgDarkTheme .cfgSlider,.cfgDarkTheme .cfgSlider::-webkit-slider-thumb{-webkit-appearance:none}.cfgDarkTheme .cfgSlider::-webkit-slider-runnable-track{box-sizing:border-box;border:none;height:.2em;background:#adadad}.cfgDarkTheme .cfgSlider::-moz-range-track{box-sizing:border-box;border:none;height:.2em;background:#adadad}.cfgDarkTheme .cfgSlider::-ms-track{box-sizing:border-box;border:none;height:.2em;background:#adadad}.cfgDarkTheme .cfgSlider::-webkit-slider-thumb{margin-top:-1.3em;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#333;box-shadow:0 .15em .45em .05em #adadad}.cfgDarkTheme .cfgSlider::-moz-range-thumb{box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#333;box-shadow:0 .15em .45em .05em #adadad}.cfgDarkTheme .cfgSlider::-ms-thumb{margin-top:0;box-sizing:border-box;border:none;width:2.8em;height:2.8em;border-radius:50%;background:#333;box-shadow:0 .15em .45em .05em #adadad}.cfgDarkTheme .cfgSlider::-ms-tooltip{display:none}.cfgDarkTheme .cfgCheckmark{box-sizing:border-box;display:inline-block;width:100%;height:100%}.cfgDarkTheme .cfgCheckmark:after,.cfgDarkTheme .cfgCheckmark:before{box-sizing:inherit}.cfgDarkTheme .cfgCheckmark *{box-sizing:border-box}.cfgDarkTheme .cfgCheckmark :after,.cfgDarkTheme .cfgCheckmark :before{box-sizing:inherit}.cfgDarkTheme .cfgCheckmark__container{transition:transform .4s;transform:translateY(17px)}.cfgDarkTheme .cfgCheckmark__line{stroke:#fff;stroke-linecap:round;stroke-width:12;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgDarkTheme .cfgCheckmark__lineLeft{stroke:#fff;transform:rotate(40deg) translateY(24px) translateX(18px)}.cfgDarkTheme .cfgCheckmark__lineRight{stroke:#fff;transform:rotate(-50deg) translateY(-2px) translateX(-3px)}.cfgDarkTheme .cfgCheckmark__border{border:.2em solid #5b5963;border-radius:.3em}.cfgDarkTheme .cfgCheckmark__border,.cfgDarkTheme .cfgCheckmark__border--active{align-items:center;display:flex;flex:0 0 auto;height:2.2em;justify-content:center;pointer-events:none;-webkit-user-select:none;user-select:none;width:2.2em}.cfgDarkTheme .cfgCheckmark__border--active{border:.2em solid #fff;border-radius:.3em}.cfgDarkTheme .cfgChevron{box-sizing:border-box;display:inline-block;width:100%}.cfgDarkTheme .cfgChevron:after,.cfgDarkTheme .cfgChevron:before{box-sizing:inherit}.cfgDarkTheme .cfgChevron *{box-sizing:border-box}.cfgDarkTheme .cfgChevron :after,.cfgDarkTheme .cfgChevron :before{box-sizing:inherit}.cfgDarkTheme .cfgChevron__container{transition:transform .4s}.cfgDarkTheme .cfgChevron__container--down{transform:translateY(13px)}.cfgDarkTheme .cfgChevron__container--up{transform:translateY(-13px)}.cfgDarkTheme .cfgChevron__line{stroke-linecap:round;stroke-width:10;transform-origin:50px 50px;transition:transform .4s,stroke .4s}.cfgDarkTheme .cfgChevron__lineLeft--active,.cfgDarkTheme .cfgChevron__lineRight--active{stroke:#fff}.cfgDarkTheme .cfgChevron__lineLeft--passive,.cfgDarkTheme .cfgChevron__lineRight--passive{stroke:#6a6a6a}.cfgDarkTheme .cfgChevron__lineLeft--down{transform:rotate(40deg)}.cfgDarkTheme .cfgChevron__lineLeft--up,.cfgDarkTheme .cfgChevron__lineRight--down{transform:rotate(-40deg)}.cfgDarkTheme .cfgChevron__lineRight--up{transform:rotate(40deg)}