@helsenorge/designsystem-react 15.5.1 → 15.6.0
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.
- package/lib/CHANGELOG.md +13 -0
- package/lib/Checkbox.js +1 -1
- package/lib/Checkbox.js.map +1 -1
- package/lib/FormGroup.js +9 -2
- package/lib/FormGroup.js.map +1 -1
- package/lib/FormLayout.js +9 -1
- package/lib/FormLayout.js.map +1 -1
- package/lib/Toggle.js +176 -0
- package/lib/Toggle.js.map +1 -0
- package/lib/components/Close/styles.module.scss +2 -2
- package/lib/components/FormGroup/styles.module.scss +15 -3
- package/lib/components/FormGroup/styles.module.scss.d.ts +2 -0
- package/lib/components/FormLayout/styles.module.scss +9 -1
- package/lib/components/FormLayout/styles.module.scss.d.ts +2 -0
- package/lib/components/HelpPanel/HelpPanel.d.ts +2 -2
- package/lib/components/HelpPanel/index.js +49 -9
- package/lib/components/HelpPanel/index.js.map +1 -1
- package/lib/components/HelpPanel/styles.module.scss +66 -2
- package/lib/components/HelpPanel/styles.module.scss.d.ts +8 -0
- package/lib/components/HelpTeaser/HelpTeaser.d.ts +5 -2
- package/lib/components/HelpTeaser/index.js +59 -14
- package/lib/components/HelpTeaser/index.js.map +1 -1
- package/lib/components/HelpTeaser/styles.module.scss +105 -2
- package/lib/components/HelpTeaser/styles.module.scss.d.ts +6 -0
- package/lib/components/HighlightPanel/index.js +79 -1
- package/lib/components/HighlightPanel/index.js.map +1 -0
- package/lib/components/InfoTeaser/index.js +71 -1
- package/lib/components/InfoTeaser/index.js.map +1 -0
- package/lib/components/RadioButton/styles.module.scss +6 -6
- package/lib/components/Toggle/index.js +1 -175
- package/lib/resourceHelper2.js +22 -0
- package/lib/resourceHelper2.js.map +1 -0
- package/lib/utils/formSpacing.d.ts +3 -0
- package/lib/utils/formSpacing.js +16 -0
- package/lib/utils/formSpacing.js.map +1 -0
- package/package.json +1 -1
- package/lib/HighlightPanel.js +0 -80
- package/lib/HighlightPanel.js.map +0 -1
- package/lib/InfoTeaser.js +0 -89
- package/lib/InfoTeaser.js.map +0 -1
- package/lib/components/Toggle/index.js.map +0 -1
|
@@ -1,176 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { usePseudoClasses } from "../../hooks/usePseudoClasses.js";
|
|
3
|
-
import classNames from "classnames";
|
|
4
|
-
import React, { useEffect, useId, useState } from "react";
|
|
5
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
-
import { useAnimate } from "motion/react";
|
|
7
|
-
import styles from "./styles.module.scss";
|
|
8
|
-
//#region src/components/Toggle/constants.ts
|
|
9
|
-
var TogglePosition = /* @__PURE__ */ function(TogglePosition) {
|
|
10
|
-
TogglePosition["left"] = "left";
|
|
11
|
-
TogglePosition["right"] = "right";
|
|
12
|
-
return TogglePosition;
|
|
13
|
-
}({});
|
|
14
|
-
var ToggleOnColor = /* @__PURE__ */ function(ToggleOnColor) {
|
|
15
|
-
ToggleOnColor["onwhite"] = "onwhite";
|
|
16
|
-
ToggleOnColor["onneutral"] = "onneutral";
|
|
17
|
-
ToggleOnColor["onblueberry"] = "onblueberry";
|
|
18
|
-
return ToggleOnColor;
|
|
19
|
-
}({});
|
|
20
|
-
//#endregion
|
|
21
|
-
//#region src/components/Toggle/Toggle.tsx
|
|
22
|
-
var Toggle = ({ checked = false, disabled, label, onChange, onColor = ToggleOnColor.onwhite, statusText, subLabel, togglePosition = TogglePosition.left, testId }) => {
|
|
23
|
-
const [checkedControlledState, setCheckedControlledState] = useState(checked);
|
|
24
|
-
const [checkedState, setCheckedState] = useState(checked);
|
|
25
|
-
const [showToggleAnimation, setShowToggleAnimation] = useState(false);
|
|
26
|
-
const [scope, animate] = useAnimate();
|
|
27
|
-
const baseId = useId();
|
|
28
|
-
const toggleId = "toggle-" + baseId;
|
|
29
|
-
const inputId = "input-" + baseId;
|
|
30
|
-
const labelId = "label-" + baseId;
|
|
31
|
-
const subLabelId = "sublabel-" + baseId;
|
|
32
|
-
const toggleRef = React.useRef(null);
|
|
33
|
-
const toggleDotRef = React.useRef(null);
|
|
34
|
-
const { refObject, isHovered, isActive } = usePseudoClasses(scope);
|
|
35
|
-
const showHoveredStyling = isHovered && !showToggleAnimation;
|
|
36
|
-
const isOnWhite = onColor === ToggleOnColor.onwhite;
|
|
37
|
-
const animationDuration = disabled ? 0 : .2;
|
|
38
|
-
const dotBackgroundColor = disabled ? "var(--color-disabled-graphics)" : checkedState ? "var(--color-action-graphics-ondark)" : "var(--core-color-neutral-700)";
|
|
39
|
-
if (checked !== checkedControlledState && typeof checked !== "undefined") {
|
|
40
|
-
setCheckedControlledState(checked);
|
|
41
|
-
if (typeof checked !== "undefined") setCheckedState(checked);
|
|
42
|
-
}
|
|
43
|
-
const getBackgroundColor = () => {
|
|
44
|
-
if (disabled) return "transparent";
|
|
45
|
-
else if (checkedState && isActive) return "var(--core-color-blueberry-800)";
|
|
46
|
-
else if (checkedState) return showHoveredStyling ? "var(--color-action-graphics-onlight-hover)" : "var(--color-action-graphics-onlight)";
|
|
47
|
-
else if (isOnWhite && isActive) return "var(--core-color-neutral-400)";
|
|
48
|
-
else if (isOnWhite) return showHoveredStyling ? "var(--core-color-neutral-200)" : "var(--core-color-neutral-50)";
|
|
49
|
-
else if (isActive) return "var(--core-color-neutral-200)";
|
|
50
|
-
else return showHoveredStyling ? "var(--core-color-neutral-50)" : "var(--core-color-white)";
|
|
51
|
-
};
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
if (showToggleAnimation) {
|
|
54
|
-
const timer = setTimeout(() => setShowToggleAnimation(false), 300);
|
|
55
|
-
return () => clearTimeout(timer);
|
|
56
|
-
}
|
|
57
|
-
}, [showToggleAnimation]);
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
if (!toggleRef.current || !toggleDotRef.current) return;
|
|
60
|
-
animate(toggleRef.current, { background: getBackgroundColor() }, {
|
|
61
|
-
duration: animationDuration,
|
|
62
|
-
ease: "easeInOut"
|
|
63
|
-
});
|
|
64
|
-
animate(toggleDotRef.current, { background: dotBackgroundColor }, {
|
|
65
|
-
duration: animationDuration,
|
|
66
|
-
ease: "easeInOut"
|
|
67
|
-
});
|
|
68
|
-
animate(toggleDotRef.current, { x: checkedState ? 16 : 0 }, {
|
|
69
|
-
duration: animationDuration,
|
|
70
|
-
ease: "easeInOut"
|
|
71
|
-
});
|
|
72
|
-
animate("svg", { opacity: checkedState ? 1 : 0 }, {
|
|
73
|
-
duration: animationDuration,
|
|
74
|
-
ease: "easeInOut"
|
|
75
|
-
});
|
|
76
|
-
}, [
|
|
77
|
-
checkedState,
|
|
78
|
-
showHoveredStyling,
|
|
79
|
-
isActive,
|
|
80
|
-
disabled
|
|
81
|
-
]);
|
|
82
|
-
const handleChange = (event) => {
|
|
83
|
-
setCheckedState(event.target.checked);
|
|
84
|
-
setShowToggleAnimation(true);
|
|
85
|
-
onChange?.(event);
|
|
86
|
-
};
|
|
87
|
-
const toggleContainerClassNames = classNames(styles["toggle-container"], {
|
|
88
|
-
[styles["toggle-container--position-right"]]: togglePosition === TogglePosition.right,
|
|
89
|
-
[styles["toggle-container--with-status"]]: statusText !== void 0 && statusText !== null,
|
|
90
|
-
[styles["toggle-container--disabled"]]: disabled
|
|
91
|
-
});
|
|
92
|
-
const subLabelClassNames = classNames(styles["toggle-container__sublabel"]);
|
|
93
|
-
const statusTextClassNames = classNames(styles["toggle-container__status"], { [styles["toggle-container__status--checked"]]: checkedState });
|
|
94
|
-
const toggleClassNames = classNames(styles["toggle-container__toggle"], {
|
|
95
|
-
[styles["toggle-container__toggle--ignore-hover"]]: showToggleAnimation,
|
|
96
|
-
[styles["toggle-container__toggle--on-white"]]: onColor === ToggleOnColor.onwhite
|
|
97
|
-
});
|
|
98
|
-
const toggleDotClassNames = classNames(styles["toggle-container__toggle__dot"], { [styles["toggle-container__toggle__dot--ignore-hover"]]: showToggleAnimation });
|
|
99
|
-
const renderToggle = () => /* @__PURE__ */ jsxs("div", {
|
|
100
|
-
className: styles["toggle-container__outer-toggle"],
|
|
101
|
-
children: [/* @__PURE__ */ jsxs("label", {
|
|
102
|
-
ref: refObject,
|
|
103
|
-
className: styles["toggle-container__toggle-group"],
|
|
104
|
-
children: [/* @__PURE__ */ jsx("input", {
|
|
105
|
-
disabled,
|
|
106
|
-
id: inputId,
|
|
107
|
-
type: "checkbox",
|
|
108
|
-
checked: checkedState,
|
|
109
|
-
onChange: handleChange,
|
|
110
|
-
className: styles["toggle-container__input"],
|
|
111
|
-
"aria-label": label.map((l) => l.text).join(" "),
|
|
112
|
-
"aria-describedby": [subLabel ? subLabelId : null, statusText ? toggleId + "-status" : null].filter(Boolean).join(" ") || void 0,
|
|
113
|
-
role: "switch"
|
|
114
|
-
}), /* @__PURE__ */ jsx("span", {
|
|
115
|
-
id: toggleId,
|
|
116
|
-
ref: toggleRef,
|
|
117
|
-
className: toggleClassNames,
|
|
118
|
-
"aria-hidden": "true",
|
|
119
|
-
children: /* @__PURE__ */ jsx("span", {
|
|
120
|
-
ref: toggleDotRef,
|
|
121
|
-
className: toggleDotClassNames,
|
|
122
|
-
"aria-hidden": "true",
|
|
123
|
-
children: /* @__PURE__ */ jsx("svg", {
|
|
124
|
-
width: "12",
|
|
125
|
-
height: "12",
|
|
126
|
-
viewBox: "0 0 12 12",
|
|
127
|
-
fill: "none",
|
|
128
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
129
|
-
className: styles["toggle-container__toggle__dot__icon"],
|
|
130
|
-
children: /* @__PURE__ */ jsx("path", {
|
|
131
|
-
d: "M11 2.65247L4.69877 9.34741L1 5.41836",
|
|
132
|
-
strokeWidth: "2.2"
|
|
133
|
-
})
|
|
134
|
-
})
|
|
135
|
-
})
|
|
136
|
-
})]
|
|
137
|
-
}), statusText && /* @__PURE__ */ jsx("span", {
|
|
138
|
-
className: statusTextClassNames,
|
|
139
|
-
id: toggleId + "-status",
|
|
140
|
-
children: checkedState ? statusText.checked : statusText.unchecked
|
|
141
|
-
})]
|
|
142
|
-
});
|
|
143
|
-
const renderLabelText = () => {
|
|
144
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
145
|
-
className: styles["toggle-container__outer-label"],
|
|
146
|
-
children: [/* @__PURE__ */ jsx("span", {
|
|
147
|
-
id: labelId,
|
|
148
|
-
className: styles["toggle-container__label"],
|
|
149
|
-
children: label.map((labelText) => {
|
|
150
|
-
const labelClassNames = classNames({ [styles["toggle-container__label__text--subdued"]]: labelText.type === "subdued" });
|
|
151
|
-
return /* @__PURE__ */ jsx("span", {
|
|
152
|
-
className: labelClassNames,
|
|
153
|
-
children: labelText.text
|
|
154
|
-
}, labelId + labelText.text);
|
|
155
|
-
})
|
|
156
|
-
}), subLabel && /* @__PURE__ */ jsx("div", {
|
|
157
|
-
id: subLabelId,
|
|
158
|
-
className: subLabelClassNames,
|
|
159
|
-
children: subLabel
|
|
160
|
-
})]
|
|
161
|
-
});
|
|
162
|
-
};
|
|
163
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
164
|
-
className: toggleContainerClassNames,
|
|
165
|
-
"data-testid": testId,
|
|
166
|
-
"data-analyticsid": AnalyticsId.Toggle,
|
|
167
|
-
children: [togglePosition === TogglePosition.left && /* @__PURE__ */ jsxs(Fragment, { children: [renderToggle(), renderLabelText()] }), togglePosition === TogglePosition.right && /* @__PURE__ */ jsxs(Fragment, { children: [renderLabelText(), renderToggle()] })]
|
|
168
|
-
});
|
|
169
|
-
};
|
|
170
|
-
//#endregion
|
|
171
|
-
//#region src/components/Toggle/index.ts
|
|
172
|
-
var Toggle_default = Toggle;
|
|
173
|
-
//#endregion
|
|
1
|
+
import { n as ToggleOnColor, r as TogglePosition, t as Toggle_default } from "../../Toggle.js";
|
|
174
2
|
export { ToggleOnColor, TogglePosition, Toggle_default as default };
|
|
175
|
-
|
|
176
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { LanguageLocales } from "./constants.js";
|
|
2
|
+
var HN_Designsystem_InfoTeaser_en_GB_default = {
|
|
3
|
+
expandButtonOpen: "Show less",
|
|
4
|
+
expandButtonClose: "Show more"
|
|
5
|
+
};
|
|
6
|
+
var HN_Designsystem_InfoTeaser_nb_NO_default = {
|
|
7
|
+
expandButtonOpen: "Vis mindre",
|
|
8
|
+
expandButtonClose: "Vis mer"
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/components/InfoTeaser/resourceHelper.ts
|
|
12
|
+
var getResources = (language) => {
|
|
13
|
+
switch (language) {
|
|
14
|
+
case LanguageLocales.ENGLISH: return HN_Designsystem_InfoTeaser_en_GB_default;
|
|
15
|
+
case LanguageLocales.NORWEGIAN:
|
|
16
|
+
default: return HN_Designsystem_InfoTeaser_nb_NO_default;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { getResources as t };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=resourceHelper2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceHelper2.js","names":[],"sources":["../src/resources/HN.Designsystem.InfoTeaser.en-GB.json","../src/resources/HN.Designsystem.InfoTeaser.nb-NO.json","../src/components/InfoTeaser/resourceHelper.ts"],"sourcesContent":["{\n \"expandButtonOpen\": \"Show less\",\n \"expandButtonClose\": \"Show more\"\n}\n","{\n \"expandButtonOpen\": \"Vis mindre\",\n \"expandButtonClose\": \"Vis mer\"\n}\n","import type { HNDesignsystemInfoTeaser } from '../../resources/Resources';\n\nimport { LanguageLocales } from '../../constants';\nimport enGB from '../../resources/HN.Designsystem.InfoTeaser.en-GB.json';\nimport nbNO from '../../resources/HN.Designsystem.InfoTeaser.nb-NO.json';\n\nexport const getResources = (language: LanguageLocales): HNDesignsystemInfoTeaser => {\n switch (language) {\n case LanguageLocales.ENGLISH:\n return enGB;\n case LanguageLocales.NORWEGIAN:\n default:\n return nbNO;\n }\n};\n"],"mappings":";;;;;;;;;;;AEMA,IAAa,gBAAgB,aAAwD;CACnF,QAAQ,UAAR;EACE,KAAK,gBAAgB,SACnB,OAAO;EACT,KAAK,gBAAgB;EACrB,SACE,OAAO;CACX;AACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { isComponent } from "./component.js";
|
|
2
|
+
import { t as Checkbox } from "../Checkbox.js";
|
|
3
|
+
import { t as RadioButton } from "../RadioButton.js";
|
|
4
|
+
import { t as Toggle_default } from "../Toggle.js";
|
|
5
|
+
import React from "react";
|
|
6
|
+
//#region src/utils/formSpacing.ts
|
|
7
|
+
var isCompactComponent = (child) => isComponent(child, Checkbox) || isComponent(child, RadioButton) || isComponent(child, Toggle_default);
|
|
8
|
+
var hasSublabel = (child) => {
|
|
9
|
+
if (isComponent(child, Checkbox) || isComponent(child, RadioButton)) return React.isValidElement(child.props.label) && !!child.props.label.props.sublabel;
|
|
10
|
+
if (isComponent(child, Toggle_default)) return !!child.props.subLabel;
|
|
11
|
+
return false;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { hasSublabel, isCompactComponent };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=formSpacing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formSpacing.js","names":[],"sources":["../../src/utils/formSpacing.ts"],"sourcesContent":["import React from 'react';\n\nimport type { CheckboxProps } from '../components/Checkbox/Checkbox';\nimport type { LabelProps } from '../components/Label';\nimport type { RadioButtonProps } from '../components/RadioButton/RadioButton';\nimport type { ToggleProps } from '../components/Toggle';\n\nimport { isComponent } from './component';\nimport Checkbox from '../components/Checkbox/Checkbox';\nimport RadioButton from '../components/RadioButton/RadioButton';\nimport Toggle from '../components/Toggle';\n\nexport const isCompactComponent = (child: React.ReactNode): boolean =>\n isComponent<CheckboxProps>(child, Checkbox) ||\n isComponent<RadioButtonProps>(child, RadioButton) ||\n isComponent<ToggleProps>(child, Toggle);\n\nexport const hasSublabel = (child: React.ReactNode): boolean => {\n if (isComponent<CheckboxProps>(child, Checkbox) || isComponent<RadioButtonProps>(child, RadioButton)) {\n return React.isValidElement<LabelProps>(child.props.label) && !!child.props.label.props.sublabel;\n }\n if (isComponent<ToggleProps>(child, Toggle)) {\n return !!child.props.subLabel;\n }\n return false;\n};\n"],"mappings":";;;;;;AAYA,IAAa,sBAAsB,UACjC,YAA2B,OAAO,QAAQ,KAC1C,YAA8B,OAAO,WAAW,KAChD,YAAyB,OAAO,cAAM;AAExC,IAAa,eAAe,UAAoC;CAC9D,IAAI,YAA2B,OAAO,QAAQ,KAAK,YAA8B,OAAO,WAAW,GACjG,OAAO,MAAM,eAA2B,MAAM,MAAM,KAAK,KAAK,CAAC,CAAC,MAAM,MAAM,MAAM,MAAM;CAE1F,IAAI,YAAyB,OAAO,cAAM,GACxC,OAAO,CAAC,CAAC,MAAM,MAAM;CAEvB,OAAO;AACT"}
|
package/package.json
CHANGED
package/lib/HighlightPanel.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { AnalyticsId, IconSize } from "./constants.js";
|
|
2
|
-
import { t as Icon_default } from "./Icon.js";
|
|
3
|
-
import { t as LazyIcon_default } from "./LazyIcon.js";
|
|
4
|
-
import { Breakpoint, useBreakpoint } from "./hooks/useBreakpoint.js";
|
|
5
|
-
import Title_default from "./components/Title/index.js";
|
|
6
|
-
import classNames from "classnames";
|
|
7
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
-
import styles from "./components/HighlightPanel/styles.module.scss";
|
|
9
|
-
//#region src/components/HighlightPanel/HighlightPanel.tsx
|
|
10
|
-
var HighlightPanel = (props) => {
|
|
11
|
-
const { children, color = "white", testId, svgIcon, htmlMarkup = "div", className, variant = "normal", title, titleHtmlMarkup = "h2" } = props;
|
|
12
|
-
const breakpoint = useBreakpoint();
|
|
13
|
-
const containerClassName = classNames(styles.highlightpanel, styles[`highlightpanel--${color}`], svgIcon && styles["highlightpanel--has-icon"], className, { [styles["highlightpanel--compact"]]: variant === "compact" });
|
|
14
|
-
const renderContent = () => {
|
|
15
|
-
const titleElement = title && /* @__PURE__ */ jsx(Title_default, {
|
|
16
|
-
testId: "titleId",
|
|
17
|
-
htmlMarkup: titleHtmlMarkup,
|
|
18
|
-
appearance: variant === "compact" ? "title6" : "title4",
|
|
19
|
-
children: title
|
|
20
|
-
});
|
|
21
|
-
if (svgIcon) {
|
|
22
|
-
const iconSize = IconSize.Small;
|
|
23
|
-
if (variant === "compact") return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
24
|
-
className: classNames(styles.highlightpanel__icon, styles["highlightpanel__icon--compact"]),
|
|
25
|
-
children: typeof svgIcon === "string" ? /* @__PURE__ */ jsx(LazyIcon_default, {
|
|
26
|
-
iconName: svgIcon,
|
|
27
|
-
size: iconSize
|
|
28
|
-
}) : /* @__PURE__ */ jsx(Icon_default, {
|
|
29
|
-
svgIcon,
|
|
30
|
-
size: iconSize
|
|
31
|
-
})
|
|
32
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
33
|
-
className: classNames(styles.highlightpanel__content, styles["highlightpanel__content--compact"]),
|
|
34
|
-
children: [title && /* @__PURE__ */ jsx("div", {
|
|
35
|
-
className: styles["highlightpanel__title-wrapper"],
|
|
36
|
-
children: titleElement
|
|
37
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
38
|
-
className: styles["highlightpanel__content__children--compact"],
|
|
39
|
-
children
|
|
40
|
-
})]
|
|
41
|
-
})] });
|
|
42
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
|
|
43
|
-
className: styles.highlightpanel__icon,
|
|
44
|
-
children: [typeof svgIcon === "string" ? /* @__PURE__ */ jsx(LazyIcon_default, {
|
|
45
|
-
iconName: svgIcon,
|
|
46
|
-
size: iconSize
|
|
47
|
-
}) : /* @__PURE__ */ jsx(Icon_default, {
|
|
48
|
-
svgIcon,
|
|
49
|
-
size: iconSize
|
|
50
|
-
}), title && breakpoint < Breakpoint.md && /* @__PURE__ */ jsx("div", {
|
|
51
|
-
className: styles["highlightpanel__title-wrapper"],
|
|
52
|
-
children: titleElement
|
|
53
|
-
})]
|
|
54
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
55
|
-
className: styles.highlightpanel__content,
|
|
56
|
-
children: [title && breakpoint >= Breakpoint.md && /* @__PURE__ */ jsx("div", {
|
|
57
|
-
className: styles["highlightpanel__title-wrapper"],
|
|
58
|
-
children: titleElement
|
|
59
|
-
}), children]
|
|
60
|
-
})] });
|
|
61
|
-
}
|
|
62
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [title && /* @__PURE__ */ jsx("div", {
|
|
63
|
-
className: styles.highlightpanel__content,
|
|
64
|
-
children: /* @__PURE__ */ jsx("div", { children: titleElement })
|
|
65
|
-
}), children] });
|
|
66
|
-
};
|
|
67
|
-
return /* @__PURE__ */ jsx(htmlMarkup, {
|
|
68
|
-
className: containerClassName,
|
|
69
|
-
"data-testid": testId,
|
|
70
|
-
"data-analyticsid": AnalyticsId.HighlightPanel,
|
|
71
|
-
children: renderContent()
|
|
72
|
-
});
|
|
73
|
-
};
|
|
74
|
-
//#endregion
|
|
75
|
-
//#region src/components/HighlightPanel/index.ts
|
|
76
|
-
var HighlightPanel_default = HighlightPanel;
|
|
77
|
-
//#endregion
|
|
78
|
-
export { HighlightPanel_default as t };
|
|
79
|
-
|
|
80
|
-
//# sourceMappingURL=HighlightPanel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HighlightPanel.js","names":[],"sources":["../src/components/HighlightPanel/HighlightPanel.tsx","../src/components/HighlightPanel/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { PaletteNames } from '../../theme/palette';\nimport type { SvgIcon } from '../Icon';\nimport type { IconName } from '../Icons/IconNames';\nimport type { TitleTags } from '../Title';\n\nimport { useBreakpoint, Breakpoint } from '../..';\nimport { AnalyticsId } from '../../constants';\nimport Icon, { IconSize } from '../Icon';\nimport LazyIcon from '../LazyIcon';\nimport Title from '../Title';\n\nimport styles from './styles.module.scss';\n\nexport type HighlightPanelColors = Extract<PaletteNames, 'white' | 'neutral' | 'blueberry' | 'cherry'>;\n\nexport type HighlightPanelTags = Exclude<\n keyof HTMLElementTagNameMap,\n 'dir' | 'font' | 'frame' | 'frameset' | 'marquee' | 'applet' | 'basefont' | 'search'\n>;\n\nexport type HighlightPanelVariants = 'normal' | 'compact';\n\nexport interface HighlightPanelProps {\n /** What's in the box? */\n children: React.ReactNode;\n /** Changes the background color. Default: white */\n color?: HighlightPanelColors;\n /** Adds an icon to the highlightpanel. */\n svgIcon?: SvgIcon | IconName;\n /** Changes the underlying element. Default: div */\n htmlMarkup?: HighlightPanelTags;\n /** Adds custom classes to the element. */\n className?: string;\n /** Uses the compact styling if set to compact */\n variant?: HighlightPanelVariants;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Element that is set after the icon-element in the DOM, often a title-element */\n title?: string;\n /** Markup props for title */\n titleHtmlMarkup?: TitleTags;\n}\n\nconst HighlightPanel: React.FC<HighlightPanelProps> = props => {\n const {\n children,\n color = 'white',\n testId,\n svgIcon,\n htmlMarkup = 'div',\n className,\n variant = 'normal',\n title,\n titleHtmlMarkup = 'h2',\n } = props;\n const breakpoint = useBreakpoint();\n\n const containerClassName = classNames(\n styles.highlightpanel,\n styles[`highlightpanel--${color}`],\n svgIcon && styles['highlightpanel--has-icon'],\n className,\n { [styles['highlightpanel--compact']]: variant === 'compact' }\n );\n\n const renderContent = (): React.ReactNode => {\n const titleElement = title && (\n <Title testId=\"titleId\" htmlMarkup={titleHtmlMarkup} appearance={variant === 'compact' ? 'title6' : 'title4'}>\n {title}\n </Title>\n );\n\n if (svgIcon) {\n const iconSize = IconSize.Small;\n\n if (variant === 'compact') {\n return (\n <>\n <div className={classNames(styles.highlightpanel__icon, styles['highlightpanel__icon--compact'])}>\n {typeof svgIcon === 'string' ? <LazyIcon iconName={svgIcon} size={iconSize} /> : <Icon svgIcon={svgIcon} size={iconSize} />}\n </div>\n <div className={classNames(styles.highlightpanel__content, styles['highlightpanel__content--compact'])}>\n {title && <div className={styles['highlightpanel__title-wrapper']}>{titleElement}</div>}\n <div className={styles['highlightpanel__content__children--compact']}>{children}</div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <div className={styles.highlightpanel__icon}>\n {typeof svgIcon === 'string' ? <LazyIcon iconName={svgIcon} size={iconSize} /> : <Icon svgIcon={svgIcon} size={iconSize} />}\n {title && breakpoint < Breakpoint.md && <div className={styles['highlightpanel__title-wrapper']}>{titleElement}</div>}\n </div>\n <div className={styles.highlightpanel__content}>\n {title && breakpoint >= Breakpoint.md && <div className={styles['highlightpanel__title-wrapper']}>{titleElement}</div>}\n {children}\n </div>\n </>\n );\n }\n\n return (\n <>\n {title && (\n <div className={styles.highlightpanel__content}>\n <div>{titleElement}</div>\n </div>\n )}\n {children}\n </>\n );\n };\n\n const CustomTag = htmlMarkup;\n\n return (\n <CustomTag className={containerClassName} data-testid={testId} data-analyticsid={AnalyticsId.HighlightPanel}>\n {renderContent()}\n </CustomTag>\n );\n};\n\nexport default HighlightPanel;\n","import HighlightPanel from './HighlightPanel';\nexport * from './HighlightPanel';\nexport default HighlightPanel;\n"],"mappings":";;;;;;;;;AA6CA,IAAM,kBAAgD,UAAS;CAC7D,MAAM,EACJ,UACA,QAAQ,SACR,QACA,SACA,aAAa,OACb,WACA,UAAU,UACV,OACA,kBAAkB,SAChB;CACJ,MAAM,aAAa,cAAc;CAEjC,MAAM,qBAAqB,WACzB,OAAO,gBACP,OAAO,mBAAmB,UAC1B,WAAW,OAAO,6BAClB,WACA,GAAG,OAAO,6BAA6B,YAAY,UAAU,CAC/D;CAEA,MAAM,sBAAuC;EAC3C,MAAM,eAAe,SACnB,oBAAC,eAAD;GAAO,QAAO;GAAU,YAAY;GAAiB,YAAY,YAAY,YAAY,WAAW;GACjG,UAAA;EACI,CAAA;EAGT,IAAI,SAAS;GACX,MAAM,WAAW,SAAS;GAE1B,IAAI,YAAY,WACd,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;IAAK,WAAW,WAAW,OAAO,sBAAsB,OAAO,gCAAgC;IAC5F,UAAA,OAAO,YAAY,WAAW,oBAAC,kBAAD;KAAU,UAAU;KAAS,MAAM;IAAW,CAAA,IAAI,oBAAC,cAAD;KAAe;KAAS,MAAM;IAAW,CAAA;GACvH,CAAA,GACL,qBAAC,OAAD;IAAK,WAAW,WAAW,OAAO,yBAAyB,OAAO,mCAAmC;IAArG,UAAA,CACG,SAAS,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAmC,UAAA;IAAkB,CAAA,GACtF,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAgD;IAAc,CAAA,CAClF;GACL,CAAA,CAAA,EAAA,CAAA;GAIN,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,qBAAC,OAAD;IAAK,WAAW,OAAO;IAAvB,UAAA,CACG,OAAO,YAAY,WAAW,oBAAC,kBAAD;KAAU,UAAU;KAAS,MAAM;IAAW,CAAA,IAAI,oBAAC,cAAD;KAAe;KAAS,MAAM;IAAW,CAAA,GACzH,SAAS,aAAa,WAAW,MAAM,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAmC,UAAA;IAAkB,CAAA,CACjH;GACL,CAAA,GAAA,qBAAC,OAAD;IAAK,WAAW,OAAO;IAAvB,UAAA,CACG,SAAS,cAAc,WAAW,MAAM,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAmC,UAAA;IAAkB,CAAA,GACpH,QACE;GACL,CAAA,CAAA,EAAA,CAAA;EAEN;EAEA,OACE,qBAAA,UAAA,EAAA,UAAA,CACG,SACC,oBAAC,OAAD;GAAK,WAAW,OAAO;GACrB,UAAA,oBAAC,OAAD,EAAA,UAAM,aAAkB,CAAA;EACrB,CAAA,GAEN,QACD,EAAA,CAAA;CAEN;CAIA,OACE,oBAAC,YAAD;EAAW,WAAW;EAAoB,eAAa;EAAQ,oBAAkB,YAAY;EAC1F,UAAA,cAAc;CACN,CAAA;AAEf;;;AC1HA,IAAA,yBAAe"}
|
package/lib/InfoTeaser.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { AnalyticsId, IconSize, LanguageLocales } from "./constants.js";
|
|
2
|
-
import { t as Icon_default } from "./Icon.js";
|
|
3
|
-
import { useLanguage } from "./hooks/useLanguage.js";
|
|
4
|
-
import { t as LazyIcon_default } from "./LazyIcon.js";
|
|
5
|
-
import Title_default from "./components/Title/index.js";
|
|
6
|
-
import { useExpand } from "./hooks/useExpand.js";
|
|
7
|
-
import classNames from "classnames";
|
|
8
|
-
import { useId } from "react";
|
|
9
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
-
import styles from "./components/InfoTeaser/styles.module.scss";
|
|
11
|
-
var HN_Designsystem_InfoTeaser_en_GB_default = {
|
|
12
|
-
expandButtonOpen: "Show less",
|
|
13
|
-
expandButtonClose: "Show more"
|
|
14
|
-
};
|
|
15
|
-
var HN_Designsystem_InfoTeaser_nb_NO_default = {
|
|
16
|
-
expandButtonOpen: "Vis mindre",
|
|
17
|
-
expandButtonClose: "Vis mer"
|
|
18
|
-
};
|
|
19
|
-
//#endregion
|
|
20
|
-
//#region src/components/InfoTeaser/resourceHelper.ts
|
|
21
|
-
var getResources = (language) => {
|
|
22
|
-
switch (language) {
|
|
23
|
-
case LanguageLocales.ENGLISH: return HN_Designsystem_InfoTeaser_en_GB_default;
|
|
24
|
-
case LanguageLocales.NORWEGIAN:
|
|
25
|
-
default: return HN_Designsystem_InfoTeaser_nb_NO_default;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
//#endregion
|
|
29
|
-
//#region src/components/InfoTeaser/InfoTeaser.tsx
|
|
30
|
-
var InfoTeaser = (props) => {
|
|
31
|
-
const { buttonClassName, children, className, expanded = false, htmlMarkup = "div", onExpand, resources, svgIcon, testId, title, titleHtmlMarkup = "h2", collapsedMaxHeight } = props;
|
|
32
|
-
const [isExpanded, setIsExpanded] = useExpand(expanded, onExpand);
|
|
33
|
-
const { language } = useLanguage(LanguageLocales.NORWEGIAN);
|
|
34
|
-
const defaultResources = getResources(language);
|
|
35
|
-
const infoteaserTextId = useId();
|
|
36
|
-
const mergedResources = {
|
|
37
|
-
...defaultResources,
|
|
38
|
-
...resources
|
|
39
|
-
};
|
|
40
|
-
return /* @__PURE__ */ jsxs(htmlMarkup, {
|
|
41
|
-
className: styles.wrapper,
|
|
42
|
-
"data-testid": testId,
|
|
43
|
-
"data-analyticsid": AnalyticsId.InfoTeaser,
|
|
44
|
-
children: [/* @__PURE__ */ jsxs("div", {
|
|
45
|
-
className: classNames(styles.infoteaser, className, { [styles["infoteaser--collapsed"]]: !isExpanded }),
|
|
46
|
-
style: { maxHeight: !isExpanded ? collapsedMaxHeight ? collapsedMaxHeight : "12.25rem" : void 0 },
|
|
47
|
-
children: [
|
|
48
|
-
svgIcon && (typeof svgIcon === "string" ? /* @__PURE__ */ jsx(LazyIcon_default, {
|
|
49
|
-
iconName: svgIcon,
|
|
50
|
-
size: IconSize.Small,
|
|
51
|
-
className: styles.infoteaser__icon
|
|
52
|
-
}) : /* @__PURE__ */ jsx(Icon_default, {
|
|
53
|
-
svgIcon,
|
|
54
|
-
size: IconSize.Small,
|
|
55
|
-
className: styles.infoteaser__icon
|
|
56
|
-
})),
|
|
57
|
-
title && typeof title !== "undefined" && /* @__PURE__ */ jsx(Title_default, {
|
|
58
|
-
testId: "titleId",
|
|
59
|
-
htmlMarkup: titleHtmlMarkup,
|
|
60
|
-
appearance: "title4",
|
|
61
|
-
className: styles.infoteaser__title,
|
|
62
|
-
children: title
|
|
63
|
-
}),
|
|
64
|
-
/* @__PURE__ */ jsx("div", {
|
|
65
|
-
className: styles.infoteaser__text,
|
|
66
|
-
"aria-hidden": isExpanded ? false : true,
|
|
67
|
-
id: infoteaserTextId,
|
|
68
|
-
children
|
|
69
|
-
})
|
|
70
|
-
]
|
|
71
|
-
}), /* @__PURE__ */ jsx("button", {
|
|
72
|
-
type: "button",
|
|
73
|
-
className: classNames(styles.infoteaser__button, buttonClassName),
|
|
74
|
-
onClick: () => {
|
|
75
|
-
setIsExpanded(!isExpanded);
|
|
76
|
-
},
|
|
77
|
-
"aria-expanded": isExpanded,
|
|
78
|
-
"aria-controls": infoteaserTextId,
|
|
79
|
-
children: isExpanded ? mergedResources.expandButtonOpen : mergedResources.expandButtonClose
|
|
80
|
-
})]
|
|
81
|
-
});
|
|
82
|
-
};
|
|
83
|
-
//#endregion
|
|
84
|
-
//#region src/components/InfoTeaser/index.ts
|
|
85
|
-
var InfoTeaser_default = InfoTeaser;
|
|
86
|
-
//#endregion
|
|
87
|
-
export { InfoTeaser_default as t };
|
|
88
|
-
|
|
89
|
-
//# sourceMappingURL=InfoTeaser.js.map
|
package/lib/InfoTeaser.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InfoTeaser.js","names":[],"sources":["../src/resources/HN.Designsystem.InfoTeaser.en-GB.json","../src/resources/HN.Designsystem.InfoTeaser.nb-NO.json","../src/components/InfoTeaser/resourceHelper.ts","../src/components/InfoTeaser/InfoTeaser.tsx","../src/components/InfoTeaser/index.ts"],"sourcesContent":["{\n \"expandButtonOpen\": \"Show less\",\n \"expandButtonClose\": \"Show more\"\n}\n","{\n \"expandButtonOpen\": \"Vis mindre\",\n \"expandButtonClose\": \"Vis mer\"\n}\n","import type { HNDesignsystemInfoTeaser } from '../../resources/Resources';\n\nimport { LanguageLocales } from '../../constants';\nimport enGB from '../../resources/HN.Designsystem.InfoTeaser.en-GB.json';\nimport nbNO from '../../resources/HN.Designsystem.InfoTeaser.nb-NO.json';\n\nexport const getResources = (language: LanguageLocales): HNDesignsystemInfoTeaser => {\n switch (language) {\n case LanguageLocales.ENGLISH:\n return enGB;\n case LanguageLocales.NORWEGIAN:\n default:\n return nbNO;\n }\n};\n","import { useId } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { HNDesignsystemInfoTeaser } from '../../resources/Resources';\nimport type { SvgIcon } from '../Icon';\nimport type { IconName } from '../Icons/IconNames';\nimport type { TitleTags } from '../Title';\n\nimport { AnalyticsId, LanguageLocales } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport Icon, { IconSize } from '../Icon';\nimport LazyIcon from '../LazyIcon';\nimport Title from '../Title';\nimport { getResources } from './resourceHelper';\n\nimport styles from './styles.module.scss';\n\nexport type InfoTeaserTags = 'div' | 'section' | 'aside' | 'article';\n\nexport interface InfoTeaserProps {\n /** For overriding styling on the button */\n buttonClassName?: string;\n /** What's in the box? */\n children: React.ReactNode;\n /** Override the default max height for collapsed teaser. Default is 12.25rem */\n collapsedMaxHeight?: string;\n /** For overriding styling on infoteaser box */\n className?: string;\n /** Opens or closes the teaser */\n expanded?: boolean;\n /** Changes the underlying element of the wrapper */\n htmlMarkup?: InfoTeaserTags;\n /** Called when the teaser is expanded/collapsed. */\n onExpand?: (isExpanded: boolean) => void;\n /** Resources for component */\n resources?: Partial<HNDesignsystemInfoTeaser>;\n /** Adds an icon */\n svgIcon?: SvgIcon | IconName;\n /** Sets the data-testid attribute */\n testId?: string;\n /** Title on top of the component */\n title?: string;\n /** Markup props for title */\n titleHtmlMarkup?: TitleTags;\n}\n\nconst InfoTeaser: React.FC<InfoTeaserProps> = props => {\n const {\n buttonClassName,\n children,\n className,\n expanded = false,\n htmlMarkup = 'div',\n onExpand,\n resources,\n svgIcon,\n testId,\n title,\n titleHtmlMarkup = 'h2',\n collapsedMaxHeight,\n } = props;\n const [isExpanded, setIsExpanded] = useExpand(expanded, onExpand);\n const { language } = useLanguage<LanguageLocales>(LanguageLocales.NORWEGIAN);\n const defaultResources = getResources(language);\n const infoteaserTextId = useId();\n\n const mergedResources: HNDesignsystemInfoTeaser = {\n ...defaultResources,\n ...resources,\n };\n\n const WrapperTag = htmlMarkup;\n\n return (\n <WrapperTag className={styles.wrapper} data-testid={testId} data-analyticsid={AnalyticsId.InfoTeaser}>\n <div\n className={classNames(styles.infoteaser, className, {\n [styles['infoteaser--collapsed']]: !isExpanded,\n })}\n style={{ maxHeight: !isExpanded ? (collapsedMaxHeight ? collapsedMaxHeight : '12.25rem') : undefined }}\n >\n {svgIcon &&\n (typeof svgIcon === 'string' ? (\n <LazyIcon iconName={svgIcon} size={IconSize.Small} className={styles.infoteaser__icon} />\n ) : (\n <Icon svgIcon={svgIcon} size={IconSize.Small} className={styles.infoteaser__icon} />\n ))}\n {title && typeof title !== 'undefined' && (\n <Title testId=\"titleId\" htmlMarkup={titleHtmlMarkup} appearance=\"title4\" className={styles.infoteaser__title}>\n {title}\n </Title>\n )}\n <div className={styles.infoteaser__text} aria-hidden={isExpanded ? false : true} id={infoteaserTextId}>\n {children}\n </div>\n </div>\n <button\n type=\"button\"\n className={classNames(styles.infoteaser__button, buttonClassName)}\n onClick={() => {\n setIsExpanded(!isExpanded);\n }}\n aria-expanded={isExpanded}\n aria-controls={infoteaserTextId}\n >\n {isExpanded ? mergedResources.expandButtonOpen : mergedResources.expandButtonClose}\n </button>\n </WrapperTag>\n );\n};\n\nexport default InfoTeaser;\n","import InfoTeaser from './InfoTeaser';\nexport * from './InfoTeaser';\nexport default InfoTeaser;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AEMA,IAAa,gBAAgB,aAAwD;CACnF,QAAQ,UAAR;EACE,KAAK,gBAAgB,SACnB,OAAO;EACT,KAAK,gBAAgB;EACrB,SACE,OAAO;CACX;AACF;;;ACkCA,IAAM,cAAwC,UAAS;CACrD,MAAM,EACJ,iBACA,UACA,WACA,WAAW,OACX,aAAa,OACb,UACA,WACA,SACA,QACA,OACA,kBAAkB,MAClB,uBACE;CACJ,MAAM,CAAC,YAAY,iBAAiB,UAAU,UAAU,QAAQ;CAChE,MAAM,EAAE,aAAa,YAA6B,gBAAgB,SAAS;CAC3E,MAAM,mBAAmB,aAAa,QAAQ;CAC9C,MAAM,mBAAmB,MAAM;CAE/B,MAAM,kBAA4C;EAChD,GAAG;EACH,GAAG;CACL;CAIA,OACE,qBAAC,YAAD;EAAY,WAAW,OAAO;EAAS,eAAa;EAAQ,oBAAkB,YAAY;EAA1F,UAAA,CACE,qBAAC,OAAD;GACE,WAAW,WAAW,OAAO,YAAY,WAAW,GACjD,OAAO,2BAA2B,CAAC,WACtC,CAAC;GACD,OAAO,EAAE,WAAW,CAAC,aAAc,qBAAqB,qBAAqB,aAAc,KAAA,EAAU;GAJvG,UAAA;IAMG,YACE,OAAO,YAAY,WAClB,oBAAC,kBAAD;KAAU,UAAU;KAAS,MAAM,SAAS;KAAO,WAAW,OAAO;IAAmB,CAAA,IAExF,oBAAC,cAAD;KAAe;KAAS,MAAM,SAAS;KAAO,WAAW,OAAO;IAAmB,CAAA;IAEtF,SAAS,OAAO,UAAU,eACzB,oBAAC,eAAD;KAAO,QAAO;KAAU,YAAY;KAAiB,YAAW;KAAS,WAAW,OAAO;KACxF,UAAA;IACI,CAAA;IAET,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAkB,eAAa,aAAa,QAAQ;KAAM,IAAI;KAClF;IACE,CAAA;GACF;EACL,CAAA,GAAA,oBAAC,UAAD;GACE,MAAK;GACL,WAAW,WAAW,OAAO,oBAAoB,eAAe;GAChE,eAAe;IACb,cAAc,CAAC,UAAU;GAC3B;GACA,iBAAe;GACf,iBAAe;GAEd,UAAA,aAAa,gBAAgB,mBAAmB,gBAAgB;EAC3D,CAAA,CACE;;AAEhB;;;AC7GA,IAAA,qBAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Toggle/constants.ts","../../../src/components/Toggle/Toggle.tsx","../../../src/components/Toggle/index.ts"],"sourcesContent":["export enum TogglePosition {\n left = 'left',\n right = 'right',\n}\n\nexport enum ToggleOnColor {\n onwhite = 'onwhite',\n onneutral = 'onneutral',\n onblueberry = 'onblueberry',\n}\n","import React, { useState, useEffect, useId } from 'react';\n\nimport classNames from 'classnames';\nimport { useAnimate } from 'motion/react';\n\nimport { ToggleOnColor, TogglePosition } from './constants';\nimport { AnalyticsId } from '../../constants';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\n\nimport styles from './styles.module.scss';\n\nimport '../../scss/supernova/styles/colors.css';\n\nexport type LabelText = {\n text: string;\n type?: 'subdued' | 'normal';\n};\n\nexport type StatusTextType = {\n checked: string;\n unchecked: string;\n};\n\nexport interface ToggleProps extends Pick<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'disabled'> {\n /** Determines if the Toggle is checked */\n checked?: boolean;\n /** Sets the label of the Toggle */\n label: LabelText[];\n /** Defines the color of the toggle */\n onColor?: keyof typeof ToggleOnColor;\n /** A text that is shown under the Toggle switch */\n statusText?: StatusTextType;\n /** Sets the sublabel of the Toggle */\n subLabel?: string;\n /** Sets the position of the toggle relative to the label */\n togglePosition?: keyof typeof TogglePosition;\n /** Sets the data-testid attribute. */\n testId?: string;\n}\n\nconst Toggle: React.FC<ToggleProps> = ({\n checked = false,\n disabled,\n label,\n onChange,\n onColor = ToggleOnColor.onwhite,\n statusText,\n subLabel,\n togglePosition = TogglePosition.left,\n testId,\n}: ToggleProps) => {\n const [checkedControlledState, setCheckedControlledState] = useState(checked);\n const [checkedState, setCheckedState] = useState(checked);\n const [showToggleAnimation, setShowToggleAnimation] = useState(false);\n const [scope, animate] = useAnimate();\n const baseId = useId();\n const toggleId = 'toggle-' + baseId;\n const inputId = 'input-' + baseId;\n const labelId = 'label-' + baseId;\n const subLabelId = 'sublabel-' + baseId;\n const toggleRef = React.useRef<HTMLSpanElement>(null);\n const toggleDotRef = React.useRef<HTMLSpanElement>(null);\n const { refObject, isHovered, isActive } = usePseudoClasses<HTMLLabelElement>(scope);\n const showHoveredStyling = isHovered && !showToggleAnimation;\n const isOnWhite = onColor === ToggleOnColor.onwhite;\n const animationDuration = disabled ? 0 : 0.2;\n const dotBackgroundColor = disabled\n ? 'var(--color-disabled-graphics)'\n : checkedState\n ? 'var(--color-action-graphics-ondark)'\n : 'var(--core-color-neutral-700)';\n\n if (checked !== checkedControlledState && typeof checked !== 'undefined') {\n setCheckedControlledState(checked);\n\n if (typeof checked !== 'undefined') {\n setCheckedState(checked);\n }\n }\n\n const getBackgroundColor = (): string => {\n if (disabled) {\n return 'transparent';\n } else if (checkedState && isActive) {\n return 'var(--core-color-blueberry-800)';\n } else if (checkedState) {\n return showHoveredStyling ? 'var(--color-action-graphics-onlight-hover)' : 'var(--color-action-graphics-onlight)';\n } else if (isOnWhite && isActive) {\n return 'var(--core-color-neutral-400)';\n } else if (isOnWhite) {\n return showHoveredStyling ? 'var(--core-color-neutral-200)' : 'var(--core-color-neutral-50)';\n } else if (isActive) {\n return 'var(--core-color-neutral-200)';\n } else {\n return showHoveredStyling ? 'var(--core-color-neutral-50)' : 'var(--core-color-white)';\n }\n };\n\n useEffect(() => {\n if (showToggleAnimation) {\n const timer = setTimeout(() => setShowToggleAnimation(false), 300);\n return (): void => clearTimeout(timer);\n }\n }, [showToggleAnimation]);\n\n useEffect(() => {\n if (!toggleRef.current || !toggleDotRef.current) return;\n animate(toggleRef.current, { background: getBackgroundColor() }, { duration: animationDuration, ease: 'easeInOut' });\n animate(\n toggleDotRef.current,\n {\n background: dotBackgroundColor,\n },\n { duration: animationDuration, ease: 'easeInOut' }\n );\n animate(toggleDotRef.current, { x: checkedState ? 16 : 0 }, { duration: animationDuration, ease: 'easeInOut' });\n animate('svg', { opacity: checkedState ? 1 : 0 }, { duration: animationDuration, ease: 'easeInOut' });\n }, [checkedState, showHoveredStyling, isActive, disabled]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n setCheckedState(event.target.checked);\n setShowToggleAnimation(true);\n onChange?.(event);\n };\n\n const toggleContainerClassNames = classNames(styles['toggle-container'], {\n [styles['toggle-container--position-right']]: togglePosition === TogglePosition.right,\n [styles['toggle-container--with-status']]: statusText !== undefined && statusText !== null,\n [styles['toggle-container--disabled']]: disabled,\n });\n\n const subLabelClassNames = classNames(styles['toggle-container__sublabel']);\n\n const statusTextClassNames = classNames(styles['toggle-container__status'], {\n [styles['toggle-container__status--checked']]: checkedState,\n });\n\n const toggleClassNames = classNames(styles['toggle-container__toggle'], {\n [styles['toggle-container__toggle--ignore-hover']]: showToggleAnimation,\n [styles['toggle-container__toggle--on-white']]: onColor === ToggleOnColor.onwhite,\n });\n\n const toggleDotClassNames = classNames(styles['toggle-container__toggle__dot'], {\n [styles['toggle-container__toggle__dot--ignore-hover']]: showToggleAnimation,\n });\n\n const renderToggle = (): React.ReactElement => (\n <div className={styles['toggle-container__outer-toggle']}>\n <label ref={refObject} className={styles['toggle-container__toggle-group']}>\n <input\n disabled={disabled}\n id={inputId}\n type=\"checkbox\"\n checked={checkedState}\n onChange={handleChange}\n className={styles['toggle-container__input']}\n aria-label={label.map(l => l.text).join(' ')}\n aria-describedby={[subLabel ? subLabelId : null, statusText ? toggleId + '-status' : null].filter(Boolean).join(' ') || undefined}\n role=\"switch\"\n />\n <span id={toggleId} ref={toggleRef} className={toggleClassNames} aria-hidden=\"true\">\n <span ref={toggleDotRef} className={toggleDotClassNames} aria-hidden=\"true\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={styles['toggle-container__toggle__dot__icon']}\n >\n <path d=\"M11 2.65247L4.69877 9.34741L1 5.41836\" strokeWidth=\"2.2\" />\n </svg>\n </span>\n </span>\n </label>\n {statusText && (\n <span className={statusTextClassNames} id={toggleId + '-status'}>\n {checkedState ? statusText.checked : statusText.unchecked}\n </span>\n )}\n </div>\n );\n\n const renderLabelText = (): React.ReactElement => {\n return (\n <div className={styles['toggle-container__outer-label']}>\n <span id={labelId} className={styles['toggle-container__label']}>\n {label.map(labelText => {\n const labelClassNames = classNames({\n [styles['toggle-container__label__text--subdued']]: labelText.type === 'subdued',\n });\n\n return (\n <span key={labelId + labelText.text} className={labelClassNames}>\n {labelText.text}\n </span>\n );\n })}\n </span>\n {subLabel && (\n <div id={subLabelId} className={subLabelClassNames}>\n {subLabel}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={toggleContainerClassNames} data-testid={testId} data-analyticsid={AnalyticsId.Toggle}>\n {togglePosition === TogglePosition.left && (\n <>\n {renderToggle()}\n {renderLabelText()}\n </>\n )}\n {togglePosition === TogglePosition.right && (\n <>\n {renderLabelText()}\n {renderToggle()}\n </>\n )}\n </div>\n );\n};\n\nexport default Toggle;\n","import Toggle from './Toggle';\nexport { TogglePosition, ToggleOnColor } from './constants';\nexport * from './Toggle';\nexport default Toggle;\n"],"mappings":"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"}
|