@helsenorge/designsystem-react 16.0.0 → 16.2.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/Button.js +8 -9
- package/lib/Button.js.map +1 -1
- package/lib/CHANGELOG.md +24 -0
- package/lib/Checkbox.js +0 -2
- package/lib/Checkbox.js.map +1 -1
- package/lib/Drawer.js +30 -30
- package/lib/Drawer.js.map +1 -1
- package/lib/Expander.js +1 -0
- package/lib/Expander.js.map +1 -1
- package/lib/HorizontalScroll.js +6 -10
- package/lib/HorizontalScroll.js.map +1 -1
- package/lib/PopOver.js +2 -3
- package/lib/PopOver.js.map +1 -1
- package/lib/Radio.js +0 -2
- package/lib/Radio.js.map +1 -1
- package/lib/StackedCellContent.js +15 -0
- package/lib/StackedCellContent.js.map +1 -0
- package/lib/TabPanel.js +1 -0
- package/lib/TabPanel.js.map +1 -1
- package/lib/TableContext.js +26 -0
- package/lib/TableContext.js.map +1 -0
- package/lib/UNSAFE_TableBody.js +22 -0
- package/lib/UNSAFE_TableBody.js.map +1 -0
- package/lib/UNSAFE_TableCell.js +26 -0
- package/lib/UNSAFE_TableCell.js.map +1 -0
- package/lib/UNSAFE_TableDetail.js +17 -0
- package/lib/UNSAFE_TableDetail.js.map +1 -0
- package/lib/UNSAFE_TableExpandedRow.js +46 -0
- package/lib/UNSAFE_TableExpandedRow.js.map +1 -0
- package/lib/UNSAFE_TableHead.js +25 -0
- package/lib/UNSAFE_TableHead.js.map +1 -0
- package/lib/UNSAFE_TableHeadCell.js +182 -0
- package/lib/UNSAFE_TableHeadCell.js.map +1 -0
- package/lib/UNSAFE_TableRow.js +130 -0
- package/lib/UNSAFE_TableRow.js.map +1 -0
- package/lib/__mocks__/ResizeObserver.js +4 -1
- package/lib/__mocks__/ResizeObserver.js.map +1 -1
- package/lib/components/Button/Button.d.ts +1 -1
- package/lib/components/Button/styles.module.scss +0 -4
- package/lib/components/Button/styles.module.scss.d.ts +0 -1
- package/lib/components/Checkbox/styles.module.scss +5 -5
- package/lib/components/Checkbox/styles.module.scss.d.ts +12 -1
- package/lib/components/Drawer/DrawerHeaderContent.module.scss +10 -1
- package/lib/components/Drawer/styles.module.scss +6 -2
- package/lib/components/Duolist/styles.module.scss +3 -7
- package/lib/components/Expander/styles.module.scss.d.ts +0 -1
- package/lib/components/ExpanderHierarchy/index.js +1 -0
- package/lib/components/ExpanderHierarchy/index.js.map +1 -1
- package/lib/components/ExpanderList/index.js +1 -0
- package/lib/components/ExpanderList/index.js.map +1 -1
- package/lib/components/ExpanderList/styles.module.scss +1 -0
- package/lib/components/HorizontalScroll/HorizontalScroll.d.ts +0 -4
- package/lib/components/HorizontalScroll/styles.module.scss +1 -4
- package/lib/components/HorizontalScroll/styles.module.scss.d.ts +0 -1
- package/lib/components/Label/Label.d.ts +2 -0
- package/lib/components/Label/styles.module.scss +16 -0
- package/lib/components/Label/utils.d.ts +0 -1
- package/lib/components/Modal/index.js +5 -2
- package/lib/components/Modal/index.js.map +1 -1
- package/lib/components/Panel/styles.module.scss.d.ts +0 -1
- package/lib/components/PopMenu/PopMenu.d.ts +4 -0
- package/lib/components/PopMenu/index.js +3 -1
- package/lib/components/PopMenu/index.js.map +1 -1
- package/lib/components/Radio/styles.module.scss +6 -6
- package/lib/components/Radio/styles.module.scss.d.ts +12 -1
- package/lib/components/Table/index.js +0 -1
- package/lib/components/Table/index.js.map +1 -1
- package/lib/components/UNSAFE_Table/StackedCellContent.d.ts +9 -0
- package/lib/components/UNSAFE_Table/TableCaption.d.ts +10 -0
- package/lib/components/UNSAFE_Table/TableContext.d.ts +22 -0
- package/lib/components/UNSAFE_Table/UNSAFE_Table.d.ts +37 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableBody/UNSAFE_TableBody.d.ts +10 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableBody/index.d.ts +3 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableBody/index.js +2 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableCell/UNSAFE_TableCell.d.ts +15 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableCell/index.d.ts +3 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableCell/index.js +7 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableCell/index.js.map +1 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/UNSAFE_TableDetail.d.ts +12 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/index.d.ts +3 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/index.js +7 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/index.js.map +1 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/UNSAFE_TableExpandedRow.d.ts +17 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/index.d.ts +3 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/index.js +7 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/index.js.map +1 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableExpanderCell/UNSAFE_TableExpanderCellMobile.d.ts +4 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableHead/UNSAFE_TableHead.d.ts +8 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableHead/index.d.ts +3 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableHead/index.js +7 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableHead/index.js.map +1 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableHeadCell/UNSAFE_TableHeadCell.d.ts +15 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableHeadCell/index.d.ts +3 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableHeadCell/index.js +2 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TablePopMenuCell/UNSAFE_TablePopMenuCell.d.ts +8 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableRow/UNSAFE_TableRow.d.ts +20 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableRow/index.d.ts +3 -0
- package/lib/components/UNSAFE_Table/UNSAFE_TableRow/index.js +2 -0
- package/lib/components/UNSAFE_Table/constants.d.ts +29 -0
- package/lib/components/UNSAFE_Table/index.d.ts +19 -0
- package/lib/components/UNSAFE_Table/index.js +182 -0
- package/lib/components/UNSAFE_Table/index.js.map +1 -0
- package/lib/components/UNSAFE_Table/resourceHelper.d.ts +3 -0
- package/lib/components/UNSAFE_Table/styles.module.scss +621 -0
- package/lib/components/UNSAFE_Table/styles.module.scss.d.ts +62 -0
- package/lib/components/UNSAFE_Table/useTableExpandedRows.d.ts +12 -0
- package/lib/components/UNSAFE_Table/useTableShowMore.d.ts +25 -0
- package/lib/components/UNSAFE_Table/utils.d.ts +47 -0
- package/lib/constants3.js +42 -0
- package/lib/constants3.js.map +1 -0
- package/lib/floating-ui.react.js +2 -2
- package/lib/floating-ui.react.js.map +1 -1
- package/lib/hooks/useSort.d.ts +88 -0
- package/lib/hooks/useSort.js +91 -0
- package/lib/hooks/useSort.js.map +1 -0
- package/lib/hooks/useSort.test.js +11739 -0
- package/lib/hooks/useSort.test.js.map +1 -0
- package/lib/hooks/useSynchronousResizeObserver.d.ts +11 -0
- package/lib/hooks/useSynchronousResizeObserver.js +29 -0
- package/lib/hooks/useSynchronousResizeObserver.js.map +1 -0
- package/lib/resources/HN.Designsystem.Table.nb-NO.json.d.ts +9 -0
- package/lib/resources/Resources.d.ts +19 -0
- package/lib/rolldown-runtime.js +33 -0
- package/lib/scss/_font-mixins.scss +28 -1
- package/lib/scss/typography.module.scss +8 -0
- package/lib/scss/typography.module.scss.d.ts +2 -0
- package/lib/scss/typography.stories.tsx +8 -0
- package/lib/utils/uuid.js +1 -12
- package/lib/utils/uuid.js.map +1 -1
- package/lib/utils2.js +18 -14
- package/lib/utils2.js.map +1 -1
- package/package.json +54 -2
- package/scss/_font-mixins.scss +28 -1
- package/scss/typography.module.scss +8 -0
- package/scss/typography.module.scss.d.ts +2 -0
- package/scss/typography.stories.tsx +8 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { usePseudoClasses } from "./hooks/usePseudoClasses.js";
|
|
2
|
+
import { t as Icon_default } from "./Icon.js";
|
|
3
|
+
import { t as Button_default } from "./Button.js";
|
|
4
|
+
import ChevronDown from "./components/Icons/ChevronDown.js";
|
|
5
|
+
import ChevronUp from "./components/Icons/ChevronUp.js";
|
|
6
|
+
import { i as TableSizes, r as TableColors, t as ResponsiveTableVariant } from "./constants3.js";
|
|
7
|
+
import { n as TableContext, t as CellHeadingContext } from "./TableContext.js";
|
|
8
|
+
import { t as UNSAFE_TableCell } from "./UNSAFE_TableCell.js";
|
|
9
|
+
import { t as UNSAFE_TableDetail } from "./UNSAFE_TableDetail.js";
|
|
10
|
+
import { t as UNSAFE_TableExpandedRow } from "./UNSAFE_TableExpandedRow.js";
|
|
11
|
+
import classNames from "classnames";
|
|
12
|
+
import React, { useContext } from "react";
|
|
13
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
import styles from "./components/UNSAFE_Table/styles.module.scss";
|
|
15
|
+
//#region src/components/UNSAFE_Table/UNSAFE_TableExpanderCell/UNSAFE_TableExpanderCellMobile.tsx
|
|
16
|
+
var UNSAFE_TableExpanderCellMobile = ({ expanded, onClick, expandableRowId }) => {
|
|
17
|
+
const { size, resources } = useContext(TableContext);
|
|
18
|
+
const cellClass = classNames(styles.table__cell, styles["table__expander-cell-mobile"], { [styles["table__cell--compact"]]: size === TableSizes.compact });
|
|
19
|
+
return /* @__PURE__ */ jsx("td", {
|
|
20
|
+
className: cellClass,
|
|
21
|
+
children: /* @__PURE__ */ jsxs(Button_default, {
|
|
22
|
+
"aria-expanded": expanded,
|
|
23
|
+
"aria-controls": expandableRowId,
|
|
24
|
+
variant: "borderless",
|
|
25
|
+
onClick,
|
|
26
|
+
wrapperClassName: styles["table__expander-trigger"],
|
|
27
|
+
className: styles["table__expander-trigger__content"],
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx(Icon_default, { svgIcon: expanded ? ChevronUp : ChevronDown }),
|
|
30
|
+
" ",
|
|
31
|
+
expanded ? resources.collapseRowButton : resources.expandRowButton
|
|
32
|
+
]
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/components/UNSAFE_Table/UNSAFE_TablePopMenuCell/UNSAFE_TablePopMenuCell.tsx
|
|
38
|
+
var UNSAFE_TablePopMenuCell = ({ children }) => {
|
|
39
|
+
const { variant, size } = useContext(TableContext);
|
|
40
|
+
const cellClass = classNames(styles["table__cell"], styles["table__cell-pop-menu"], { [styles["table__cell--compact"]]: size === TableSizes.compact });
|
|
41
|
+
const { labelText, openButtonAriaLabel, closeButtonAriaLabel } = children.props;
|
|
42
|
+
const hideLabelText = labelText !== void 0 && variant !== ResponsiveTableVariant.stack;
|
|
43
|
+
return /* @__PURE__ */ jsx("td", {
|
|
44
|
+
className: cellClass,
|
|
45
|
+
children: React.cloneElement(children, {
|
|
46
|
+
popMenuClassName: classNames(styles["table__pop-menu"], children.props.popMenuClassName),
|
|
47
|
+
triggerClassName: classNames(styles["table__pop-menu__trigger"], children.props.triggerClassName),
|
|
48
|
+
triggerContentClassName: classNames(styles["table__pop-menu__content"], children.props.triggerContentClassName),
|
|
49
|
+
...hideLabelText && {
|
|
50
|
+
labelText: void 0,
|
|
51
|
+
openButtonAriaLabel: openButtonAriaLabel ?? labelText,
|
|
52
|
+
closeButtonAriaLabel: closeButtonAriaLabel ?? labelText
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/components/UNSAFE_Table/UNSAFE_TableRow/UNSAFE_TableRow.tsx
|
|
59
|
+
var UNSAFE_TableRow = ({ expandedContent, expanded, expandableRowId, onClick, className, children, popMenu, ...rest }) => {
|
|
60
|
+
const { color, size, hiddenColumns, headingTexts, variant, resources } = useContext(TableContext);
|
|
61
|
+
const expandable = expandedContent ? true : hiddenColumns.length > 0 ? "stack" : void 0;
|
|
62
|
+
const isExpandedVisible = !!expanded && (expandable !== "stack" || variant === ResponsiveTableVariant.stack);
|
|
63
|
+
const { refObject, isHovered, isActive } = usePseudoClasses();
|
|
64
|
+
const tableRowClass = classNames(styles["table__row"], {
|
|
65
|
+
[styles["table__row--transparent"]]: color === TableColors.transparent,
|
|
66
|
+
[styles["table__row--expandable"]]: expandable,
|
|
67
|
+
[styles["table__row--expanded"]]: isExpandedVisible
|
|
68
|
+
}, className);
|
|
69
|
+
const expanderCellClass = classNames(styles["table__cell"], styles["table__cell-expander"], { [styles["table__cell--compact"]]: size === TableSizes.compact });
|
|
70
|
+
const indexOffset = expandable === true ? 1 : 0;
|
|
71
|
+
const isHidden = (index) => hiddenColumns.includes(index + indexOffset);
|
|
72
|
+
const withHeading = (child, index) => React.isValidElement(child) && child.type === UNSAFE_TableCell ? /* @__PURE__ */ jsx(CellHeadingContext.Provider, {
|
|
73
|
+
value: headingTexts[index + indexOffset] ?? "",
|
|
74
|
+
children: child
|
|
75
|
+
}, child.key) : child;
|
|
76
|
+
const childArray = React.Children.toArray(children);
|
|
77
|
+
const cells = childArray.map((child, index) => withHeading(React.isValidElement(child) && isHidden(index) ? React.cloneElement(child, { className: classNames(child.props.className, styles["table__cell--behind-expander"]) }) : child, index));
|
|
78
|
+
const hiddenCells = childArray.flatMap((child, index) => React.isValidElement(child) && isHidden(index) ? [{
|
|
79
|
+
cell: child,
|
|
80
|
+
heading: headingTexts[index + indexOffset] ?? ""
|
|
81
|
+
}] : []);
|
|
82
|
+
const row = /* @__PURE__ */ jsxs("tr", {
|
|
83
|
+
className: tableRowClass,
|
|
84
|
+
...rest,
|
|
85
|
+
ref: refObject,
|
|
86
|
+
children: [
|
|
87
|
+
expandable === true && /* @__PURE__ */ jsx("td", {
|
|
88
|
+
className: expanderCellClass,
|
|
89
|
+
children: /* @__PURE__ */ jsx(Button_default, {
|
|
90
|
+
variant: "borderless",
|
|
91
|
+
wrapperClassName: styles["table__expander-button"],
|
|
92
|
+
className: styles["table__expander-button__content"],
|
|
93
|
+
"aria-expanded": expanded,
|
|
94
|
+
"aria-controls": expandableRowId,
|
|
95
|
+
ariaLabel: expanded ? resources.collapseRowButton : resources.expandRowButton,
|
|
96
|
+
onClick,
|
|
97
|
+
children: /* @__PURE__ */ jsx(Icon_default, {
|
|
98
|
+
color: isActive ? "var(--color-action-graphics-dark-active)" : isHovered ? "var(--color-action-graphics-dark-hover)" : "var(--color-action-graphics-dark-normal)",
|
|
99
|
+
svgIcon: expanded ? ChevronUp : ChevronDown
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
}),
|
|
103
|
+
cells,
|
|
104
|
+
popMenu && /* @__PURE__ */ jsx(UNSAFE_TablePopMenuCell, { children: popMenu }),
|
|
105
|
+
expandable && /* @__PURE__ */ jsx(UNSAFE_TableExpanderCellMobile, {
|
|
106
|
+
expanded,
|
|
107
|
+
onClick,
|
|
108
|
+
expandableRowId
|
|
109
|
+
})
|
|
110
|
+
]
|
|
111
|
+
}, "row");
|
|
112
|
+
if (!(!!expandable && (!!expandedContent || hiddenCells.length > 0))) return row;
|
|
113
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [row, /* @__PURE__ */ jsxs(UNSAFE_TableExpandedRow, {
|
|
114
|
+
stackOnly: !expandedContent,
|
|
115
|
+
id: expandableRowId,
|
|
116
|
+
expanded: !!expanded,
|
|
117
|
+
toggleClick: () => onClick?.(),
|
|
118
|
+
children: [hiddenCells.map(({ cell, heading }, index) => /* @__PURE__ */ jsx(UNSAFE_TableDetail, {
|
|
119
|
+
headingText: heading,
|
|
120
|
+
children: cell.props.children
|
|
121
|
+
}, cell.key ?? index)), expandedContent]
|
|
122
|
+
}, "expanded-row")] });
|
|
123
|
+
};
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region src/components/UNSAFE_Table/UNSAFE_TableRow/index.ts
|
|
126
|
+
var UNSAFE_TableRow_default = UNSAFE_TableRow;
|
|
127
|
+
//#endregion
|
|
128
|
+
export { UNSAFE_TableRow as n, UNSAFE_TableRow_default as t };
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=UNSAFE_TableRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UNSAFE_TableRow.js","names":[],"sources":["../src/components/UNSAFE_Table/UNSAFE_TableExpanderCell/UNSAFE_TableExpanderCellMobile.tsx","../src/components/UNSAFE_Table/UNSAFE_TablePopMenuCell/UNSAFE_TablePopMenuCell.tsx","../src/components/UNSAFE_Table/UNSAFE_TableRow/UNSAFE_TableRow.tsx","../src/components/UNSAFE_Table/UNSAFE_TableRow/index.ts"],"sourcesContent":["import { useContext } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { Props } from '../UNSAFE_TableRow/UNSAFE_TableRow';\n\nimport Button from '../../Button';\nimport Icon from '../../Icon';\nimport ChevronDown from '../../Icons/ChevronDown';\nimport ChevronUp from '../../Icons/ChevronUp';\nimport { TableSizes } from '../constants';\nimport styles from '../styles.module.scss';\nimport { TableContext } from '../TableContext';\n\ntype UNSAFE_TableExpanderCellMobileProps = Pick<Props, 'expanded' | 'onClick' | 'expandableRowId'>;\n\nconst UNSAFE_TableExpanderCellMobile: React.FC<UNSAFE_TableExpanderCellMobileProps> = ({ expanded, onClick, expandableRowId }) => {\n const { size, resources } = useContext(TableContext);\n const cellClass = classNames(styles.table__cell, styles['table__expander-cell-mobile'], {\n [styles['table__cell--compact']]: size === TableSizes.compact,\n });\n\n return (\n <td className={cellClass}>\n <Button\n aria-expanded={expanded}\n aria-controls={expandableRowId}\n variant=\"borderless\"\n onClick={onClick}\n wrapperClassName={styles['table__expander-trigger']}\n className={styles['table__expander-trigger__content']}\n >\n <Icon svgIcon={expanded ? ChevronUp : ChevronDown} /> {expanded ? resources.collapseRowButton : resources.expandRowButton}\n </Button>\n </td>\n );\n};\n\nexport default UNSAFE_TableExpanderCellMobile;\n","import React, { useContext } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { PopMenuProps } from '../../PopMenu';\n\nimport { ResponsiveTableVariant, TableSizes } from '../constants';\nimport styles from '../styles.module.scss';\nimport { TableContext } from '../TableContext';\n\nexport interface UNSAFE_TablePopMenuCellProps {\n /** PopMenu shown inside the cell. Fills the entire cell. */\n children: React.ReactElement<PopMenuProps>;\n}\n\nconst UNSAFE_TablePopMenuCell: React.FC<UNSAFE_TablePopMenuCellProps> = ({ children }) => {\n const { variant, size } = useContext(TableContext);\n const cellClass = classNames(styles['table__cell'], styles['table__cell-pop-menu'], {\n [styles['table__cell--compact']]: size === TableSizes.compact,\n });\n\n const { labelText, openButtonAriaLabel, closeButtonAriaLabel } = children.props;\n // Kun stack-varianten har plass til synlig ledetekst; ellers blir den skjult tekst for skjermlesere\n const hideLabelText = labelText !== undefined && variant !== ResponsiveTableVariant.stack;\n\n return (\n <td className={cellClass}>\n {React.cloneElement(children, {\n popMenuClassName: classNames(styles['table__pop-menu'], children.props.popMenuClassName),\n triggerClassName: classNames(styles['table__pop-menu__trigger'], children.props.triggerClassName),\n triggerContentClassName: classNames(styles['table__pop-menu__content'], children.props.triggerContentClassName),\n ...(hideLabelText && {\n labelText: undefined,\n openButtonAriaLabel: openButtonAriaLabel ?? labelText,\n closeButtonAriaLabel: closeButtonAriaLabel ?? labelText,\n }),\n })}\n </td>\n );\n};\n\nexport default UNSAFE_TablePopMenuCell;\n","import React, { useContext } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { PopMenuProps } from '../../PopMenu';\nimport type { Props as TableCellProps } from '../UNSAFE_TableCell/UNSAFE_TableCell';\n\nimport { usePseudoClasses } from '../../../hooks/usePseudoClasses';\nimport Button from '../../Button';\nimport Icon from '../../Icon';\nimport ChevronDown from '../../Icons/ChevronDown';\nimport ChevronUp from '../../Icons/ChevronUp';\nimport { ResponsiveTableVariant, TableColors, TableSizes } from '../constants';\nimport styles from '../styles.module.scss';\nimport { CellHeadingContext, TableContext } from '../TableContext';\nimport UNSAFE_TableCell from '../UNSAFE_TableCell/UNSAFE_TableCell';\nimport UNSAFE_TableDetail from '../UNSAFE_TableDetail/UNSAFE_TableDetail';\nimport UNSAFE_TableExpandedRow from '../UNSAFE_TableExpandedRow/UNSAFE_TableExpandedRow';\nimport UNSAFE_TableExpanderCellMobile from '../UNSAFE_TableExpanderCell/UNSAFE_TableExpanderCellMobile';\nimport UNSAFE_TablePopMenuCell from '../UNSAFE_TablePopMenuCell/UNSAFE_TablePopMenuCell';\n\nexport interface Props extends Omit<React.ComponentPropsWithoutRef<'tr'>, 'style'> {\n /** Content to be rendered in an expandable row. Make sure to add an empty TableHeadCell to the beginning of the Table. This content renders below the column content with hideBehindExpander set in the stack variant. */\n expandedContent?: React.ReactNode;\n /** Sets if expanded row is expanded */\n expanded?: boolean;\n /** Id of the expanded row this row controls. For use with aria-controls on the expander button. */\n expandableRowId?: string;\n /** When hide/show button for expanded row is clicked. */\n onClick?: () => void;\n /** Adds custom classes to the element. */\n className?: string;\n /** Sets the cells of the table row element. */\n children?: React.ReactNode;\n /** PopMenu rendered in an extra cell as the last cell in the row. Fills the entire cell. Outside the stack variant labelText is hidden and used as aria-label instead. */\n popMenu?: React.ReactElement<PopMenuProps>;\n}\n\nexport const UNSAFE_TableRow: React.FC<Props> = ({\n expandedContent,\n expanded,\n expandableRowId,\n onClick,\n className,\n children,\n popMenu,\n ...rest\n}) => {\n const { color, size, hiddenColumns, headingTexts, variant, resources } = useContext(TableContext);\n const expandable = expandedContent ? true : hiddenColumns.length > 0 ? 'stack' : undefined;\n const isExpandedVisible = !!expanded && (expandable !== 'stack' || variant === ResponsiveTableVariant.stack);\n const { refObject, isHovered, isActive } = usePseudoClasses<HTMLTableRowElement>();\n const tableRowClass = classNames(\n styles['table__row'],\n {\n [styles['table__row--transparent']]: color === TableColors.transparent,\n [styles['table__row--expandable']]: expandable,\n [styles['table__row--expanded']]: isExpandedVisible,\n },\n className\n );\n\n const expanderCellClass = classNames(styles['table__cell'], styles['table__cell-expander'], {\n [styles['table__cell--compact']]: size === TableSizes.compact,\n });\n\n // Tar hensyn til en hidden expander cell for visning i normal variant\n const indexOffset = expandable === true ? 1 : 0;\n const isHidden = (index: number): boolean => hiddenColumns.includes(index + indexOffset);\n\n // Gir hver celle teksten fra kolonnens headText, som vises foran innholdet i stack-varianten\n const withHeading = (child: React.ReactNode, index: number): React.ReactNode =>\n React.isValidElement(child) && child.type === UNSAFE_TableCell ? (\n <CellHeadingContext.Provider key={child.key} value={headingTexts[index + indexOffset] ?? ''}>\n {child}\n </CellHeadingContext.Provider>\n ) : (\n child\n );\n\n const childArray = React.Children.toArray(children);\n const cells = childArray.map((child, index) =>\n withHeading(\n React.isValidElement<TableCellProps>(child) && isHidden(index)\n ? React.cloneElement(child, { className: classNames(child.props.className, styles['table__cell--behind-expander']) })\n : child,\n index\n )\n );\n const hiddenCells = childArray.flatMap((child, index) =>\n React.isValidElement<TableCellProps>(child) && isHidden(index)\n ? [{ cell: child, heading: headingTexts[index + indexOffset] ?? '' }]\n : []\n );\n\n const row = (\n <tr key=\"row\" className={tableRowClass} {...rest} ref={refObject}>\n {expandable === true && (\n <td className={expanderCellClass}>\n <Button\n variant=\"borderless\"\n wrapperClassName={styles['table__expander-button']}\n className={styles['table__expander-button__content']}\n aria-expanded={expanded}\n aria-controls={expandableRowId}\n ariaLabel={expanded ? resources.collapseRowButton : resources.expandRowButton}\n onClick={onClick}\n >\n <Icon\n color={\n isActive\n ? 'var(--color-action-graphics-dark-active)'\n : isHovered\n ? 'var(--color-action-graphics-dark-hover)'\n : 'var(--color-action-graphics-dark-normal)'\n }\n svgIcon={expanded ? ChevronUp : ChevronDown}\n />\n </Button>\n </td>\n )}\n {cells}\n {popMenu && <UNSAFE_TablePopMenuCell>{popMenu}</UNSAFE_TablePopMenuCell>}\n {expandable && <UNSAFE_TableExpanderCellMobile expanded={expanded} onClick={onClick} expandableRowId={expandableRowId} />}\n </tr>\n );\n\n const hasAutomaticExpandedRow = !!expandable && (!!expandedContent || hiddenCells.length > 0);\n if (!hasAutomaticExpandedRow) {\n return row;\n }\n\n return (\n <>\n {row}\n <UNSAFE_TableExpandedRow\n key=\"expanded-row\"\n stackOnly={!expandedContent}\n id={expandableRowId}\n expanded={!!expanded}\n toggleClick={(): void => onClick?.()}\n >\n {hiddenCells.map(({ cell, heading }, index) => (\n <UNSAFE_TableDetail key={cell.key ?? index} headingText={heading}>\n {cell.props.children}\n </UNSAFE_TableDetail>\n ))}\n {expandedContent}\n </UNSAFE_TableExpandedRow>\n </>\n );\n};\n\nexport default UNSAFE_TableRow;\n","import UNSAFE_TableRow from './UNSAFE_TableRow';\nexport * from './UNSAFE_TableRow';\nexport default UNSAFE_TableRow;\n"],"mappings":"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"}
|
|
@@ -4,7 +4,10 @@ var ResizeObserver = class {
|
|
|
4
4
|
unobserve() {}
|
|
5
5
|
disconnect() {}
|
|
6
6
|
};
|
|
7
|
-
Object.defineProperty(window, "ResizeObserver", {
|
|
7
|
+
Object.defineProperty(window, "ResizeObserver", {
|
|
8
|
+
value: ResizeObserver,
|
|
9
|
+
configurable: true
|
|
10
|
+
});
|
|
8
11
|
//#endregion
|
|
9
12
|
export { ResizeObserver as default };
|
|
10
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResizeObserver.js","names":[],"sources":["../../src/__mocks__/ResizeObserver.ts"],"sourcesContent":["class ResizeObserver {\n observe(): void {\n // do nothing\n }\n unobserve(): void {\n // do nothing\n }\n disconnect(): void {\n // do nothing\n }\n}\n\nObject.defineProperty(window, 'ResizeObserver', {\n value: ResizeObserver,\n});\n\nexport default ResizeObserver;\n"],"mappings":";AAAA,IAAM,iBAAN,MAAqB;CACnB,UAAgB,CAEhB;CACA,YAAkB,CAElB;CACA,aAAmB,CAEnB;AACF;AAEA,OAAO,eAAe,QAAQ,kBAAkB,
|
|
1
|
+
{"version":3,"file":"ResizeObserver.js","names":[],"sources":["../../src/__mocks__/ResizeObserver.ts"],"sourcesContent":["class ResizeObserver {\n observe(): void {\n // do nothing\n }\n unobserve(): void {\n // do nothing\n }\n disconnect(): void {\n // do nothing\n }\n}\n\nObject.defineProperty(window, 'ResizeObserver', {\n value: ResizeObserver,\n configurable: true,\n});\n\nexport default ResizeObserver;\n"],"mappings":";AAAA,IAAM,iBAAN,MAAqB;CACnB,UAAgB,CAEhB;CACA,YAAkB,CAElB;CACA,aAAmB,CAEnB;AACF;AAEA,OAAO,eAAe,QAAQ,kBAAkB;CAC9C,OAAO;CACP,cAAc;AAChB,CAAC"}
|
|
@@ -5,7 +5,7 @@ export type ButtonVariant = 'fill' | 'outline' | 'borderless';
|
|
|
5
5
|
export type ButtonSize = 'normal' | 'large';
|
|
6
6
|
export type ButtonOnColor = 'onlight' | 'ondark';
|
|
7
7
|
export type ButtonTags = 'button' | 'a';
|
|
8
|
-
export type ButtonArrows = 'icon' | 'accessibility-character';
|
|
8
|
+
export type ButtonArrows = 'icon' | 'inline-accessible-right' | 'inline-accessible-up' | 'inline-accessible-down' | 'accessibility-character';
|
|
9
9
|
export type ButtonTextPosition = 'left' | 'centered';
|
|
10
10
|
export interface ButtonProps extends Omit<HTMLButtonProps, 'onClick' | 'type'>, Omit<HTMLAnchorProps, 'onClick'>, AriaAttributes {
|
|
11
11
|
/** Sets the aria-label of the button, use when the button only includes an icon */
|
|
@@ -463,10 +463,6 @@ $with-icons: // icon-class, size-class, padding-left, padding-right, padding-lef
|
|
|
463
463
|
}
|
|
464
464
|
}
|
|
465
465
|
|
|
466
|
-
&__right-unicode-arrow {
|
|
467
|
-
white-space: pre;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
466
|
/* stylelint-disable-next-line */
|
|
471
467
|
&--outline &__text,
|
|
472
468
|
&--borderless &__text {
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
@use '../../scss/font-settings' as font-settings;
|
|
5
5
|
@use '../../scss/screen-reader' as *;
|
|
6
6
|
@use '../../scss/breakpoints' as breakpoints;
|
|
7
|
+
@use '../Label/styles.module' as label;
|
|
7
8
|
|
|
8
9
|
$padding-clickable-area-top-bottom: 7px;
|
|
9
10
|
$padding-clickable-area-left: 8px;
|
|
@@ -131,6 +132,10 @@ $padding-clickable-area-left: 8px;
|
|
|
131
132
|
}
|
|
132
133
|
}
|
|
133
134
|
|
|
135
|
+
&--checked:not(#{&}--on-invalid, #{&}--disabled) {
|
|
136
|
+
@include label.on-dark-tokens;
|
|
137
|
+
}
|
|
138
|
+
|
|
134
139
|
&--checked#{&}--focus {
|
|
135
140
|
color: palette.$blueberry900;
|
|
136
141
|
background-color: palette.$blueberry500;
|
|
@@ -194,11 +199,6 @@ $padding-clickable-area-left: 8px;
|
|
|
194
199
|
}
|
|
195
200
|
}
|
|
196
201
|
|
|
197
|
-
.checkbox-sublabel-wrapper {
|
|
198
|
-
margin-top: -$padding-clickable-area-top-bottom;
|
|
199
|
-
padding-left: calc(2.8rem + $padding-clickable-area-left);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
202
|
.checkbox-afterlabelchildren-wrapper {
|
|
203
203
|
padding-top: $padding-clickable-area-top-bottom;
|
|
204
204
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type Styles = {
|
|
2
|
+
'after-label-children': string;
|
|
2
3
|
checkbox: string;
|
|
3
4
|
'checkbox__marker-wrapper': string;
|
|
4
5
|
'checkbox-afterlabelchildren-wrapper': string;
|
|
@@ -21,9 +22,19 @@ export type Styles = {
|
|
|
21
22
|
'checkbox-label--disabled': string;
|
|
22
23
|
'checkbox-label--large': string;
|
|
23
24
|
'checkbox-label--on-dark': string;
|
|
24
|
-
'checkbox-sublabel-wrapper': string;
|
|
25
25
|
'checkbox-wrapper': string;
|
|
26
26
|
'checkbox-wrapper--large': string;
|
|
27
|
+
label: string;
|
|
28
|
+
label__texts: string;
|
|
29
|
+
'label--on-dark': string;
|
|
30
|
+
'label--subdued': string;
|
|
31
|
+
'label-content-wrapper': string;
|
|
32
|
+
'label-wrapper': string;
|
|
33
|
+
'label-wrapper--after-label-children': string;
|
|
34
|
+
'label-wrapper--no-bottom-margin': string;
|
|
35
|
+
sublabel: string;
|
|
36
|
+
'sublabel--on-dark': string;
|
|
37
|
+
'sublabel--subdued': string;
|
|
27
38
|
};
|
|
28
39
|
|
|
29
40
|
export type ClassNames = keyof Styles;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@use 'sass:map';
|
|
1
2
|
@use '../../scss/breakpoints' as breakpoints;
|
|
2
3
|
|
|
3
4
|
.header-content {
|
|
@@ -18,7 +19,15 @@
|
|
|
18
19
|
align-self: flex-start;
|
|
19
20
|
align-items: center;
|
|
20
21
|
justify-content: flex-start;
|
|
21
|
-
margin
|
|
22
|
+
margin: var(--core-space-2xs) 0 0 var(--core-space-3xs);
|
|
23
|
+
|
|
24
|
+
@media (min-width: map.get(breakpoints.$grid-breakpoints, xs)) {
|
|
25
|
+
margin-left: var(--core-space-2xs);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@media (min-width: map.get(breakpoints.$grid-breakpoints, md)) {
|
|
29
|
+
margin-left: var(--core-space-xs);
|
|
30
|
+
}
|
|
22
31
|
|
|
23
32
|
&--centered {
|
|
24
33
|
position: relative;
|
|
@@ -81,10 +81,14 @@
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
&--padding-extra {
|
|
84
|
-
padding: var(--core-space-xs) var(--core-space-
|
|
84
|
+
padding: var(--core-space-xs) var(--core-space-4xs) var(--core-space-xs) var(--core-space-4xs);
|
|
85
|
+
|
|
86
|
+
@media (min-width: map.get(breakpoints.$grid-breakpoints, xs)) {
|
|
87
|
+
padding: var(--core-space-2xs);
|
|
88
|
+
}
|
|
85
89
|
|
|
86
90
|
@media (min-width: map.get(breakpoints.$grid-breakpoints, md)) {
|
|
87
|
-
padding: var(--core-space-xs)
|
|
91
|
+
padding: var(--core-space-xs);
|
|
88
92
|
}
|
|
89
93
|
}
|
|
90
94
|
|
|
@@ -117,13 +117,9 @@
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
&--no-padding
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
dd {
|
|
124
|
-
padding-top: 0;
|
|
125
|
-
padding-bottom: 0;
|
|
126
|
-
}
|
|
120
|
+
&--no-padding {
|
|
121
|
+
margin-top: 0;
|
|
122
|
+
margin-bottom: 0;
|
|
127
123
|
}
|
|
128
124
|
|
|
129
125
|
&--non-formatted {
|
|
@@ -69,6 +69,7 @@ var Expander = ({ title, htmlMarkup = "h2", level = 1, print, expanded = false,
|
|
|
69
69
|
children: title
|
|
70
70
|
}), /* @__PURE__ */ jsx("div", {
|
|
71
71
|
className: contentClasses,
|
|
72
|
+
"data-overflow-boundary": true,
|
|
72
73
|
children: React.Children.map(children, (child) => isComponent(child, ExpanderHierarchy) ? React.cloneElement(child, {
|
|
73
74
|
htmlMarkup: getHeadingTag(htmlMarkup),
|
|
74
75
|
level: level + 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/ExpanderHierarchy/ExpanderButton.tsx","../../../src/components/ExpanderHierarchy/utils.ts","../../../src/components/ExpanderHierarchy/Expander.tsx","../../../src/components/ExpanderHierarchy/ExpanderHierarchy.tsx","../../../src/components/ExpanderHierarchy/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { ExpanderHierarchyCommonProps } from '../ExpanderHierarchy';\n\nimport { AnalyticsId } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport Icon, { IconSize } from '../Icon';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\n\nimport styles from './expander.module.scss';\n\ninterface ExpanderButtonProps extends ExpanderHierarchyCommonProps {\n expanded: boolean;\n onExpand?: (isExpanded: boolean) => void;\n children: string;\n testId?: string;\n}\n\nconst ExpanderButton: React.FC<ExpanderButtonProps> = ({ htmlMarkup = 'h2', level = 1, print, expanded, onExpand, children, testId }) => {\n const { refObject, isHovered } = usePseudoClasses<HTMLButtonElement>();\n const [isExpanded, setIsExpanded] = useExpand(expanded, onExpand);\n\n const handleClick = (): void => {\n setIsExpanded(!isExpanded);\n };\n\n const CustomTag = htmlMarkup;\n\n const buttonClasses = classNames(\n styles.expander__button,\n level > 1 && styles[`expander__button--2-and-lower`],\n print && styles['expander__button--print']\n );\n\n const titleClasses = classNames(\n styles.expander__title,\n (level === 1 || level === 2 || level === 3) && styles[`expander__title--${level}`],\n level > 3 && styles[`expander__title--4-and-lower`],\n isExpanded && styles['expander__title--expanded'],\n print && styles['expander__title--print']\n );\n\n const iconClasses = classNames(\n styles.expander__icon,\n level > 1 && styles[`expander__icon--2-and-lower`],\n level > 2 && styles[`expander__icon--3-and-lower`]\n );\n\n return (\n <CustomTag className={titleClasses}>\n <button\n type=\"button\"\n onClick={handleClick}\n className={buttonClasses}\n aria-expanded={isExpanded}\n ref={refObject}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderHierarchyExpander}\n >\n {children}\n <Icon svgIcon={isExpanded ? ChevronUp : ChevronDown} isHovered={isHovered} className={iconClasses} size={IconSize.XSmall} />\n </button>\n </CustomTag>\n );\n};\n\nexport default ExpanderButton;\n","export type HeadingTags = 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nexport const getHeadingTag = (htmlMarkup?: HeadingTags): HeadingTags => {\n switch (htmlMarkup) {\n case 'h2':\n return 'h3';\n case 'h3':\n return 'h4';\n case 'h4':\n return 'h5';\n case 'h5':\n return 'h6';\n case 'h6':\n return 'h6';\n default:\n return 'h2';\n }\n};\n","import React from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ExpanderHierarchyCommonProps, ExpanderHierarchyProps } from './ExpanderHierarchy';\n\nimport ExpanderButton from './ExpanderButton';\nimport ExpanderHierarchy from './ExpanderHierarchy';\nimport { getHeadingTag } from './utils';\nimport { isComponent } from '../../utils/component';\n\nimport styles from './expander.module.scss';\n\nexport interface ExpanderProps extends ExpanderHierarchyCommonProps {\n /** Sets the trigger title */\n title: string;\n /** Opens or closes the expander */\n expanded?: boolean;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n /** Sets the expanded content */\n children?: React.ReactNode;\n /** Sets the data-testid attribute on the expander button. */\n testId?: string;\n /** Adds custom classes to the element. */\n className?: string;\n /** ref that is placed on the li element */\n ref?: React.RefObject<HTMLLIElement | null>;\n}\n\nexport type ExpanderType = typeof Expander;\n\nconst Expander: React.FC<ExpanderProps> = ({\n title,\n htmlMarkup = 'h2',\n level = 1,\n print,\n expanded = false,\n onExpand,\n children,\n testId,\n className,\n ref,\n}: ExpanderProps) => {\n const contentClasses = classNames(\n styles.expander__content,\n (level === 1 || level === 2) && styles[`expander__content--${level}`],\n level > 2 && styles[`expander__content--3-and-lower`]\n );\n\n return (\n <li className={classNames(styles.expander, className)} ref={ref}>\n <ExpanderButton htmlMarkup={htmlMarkup} level={level} print={print} expanded={expanded} onExpand={onExpand} testId={testId}>\n {title}\n </ExpanderButton>\n <div className={contentClasses}>\n {React.Children.map(children, child =>\n isComponent<ExpanderHierarchyProps>(child, ExpanderHierarchy)\n ? React.cloneElement(child, { htmlMarkup: getHeadingTag(htmlMarkup), level: level + 1, print })\n : child\n )}\n </div>\n </li>\n );\n};\n\nexport default Expander;\n","import React from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ExpanderProps, ExpanderType } from './Expander';\nimport type { HeadingTags } from './utils';\n\nimport Expander from './Expander';\nimport { AnalyticsId } from '../../constants';\nimport { isComponent } from '../../utils/component';\n\nimport styles from './styles.module.scss';\n\nexport interface ExpanderHierarchyCommonProps {\n /** Changes the underlying element of the expander title. Default: h2. */\n htmlMarkup?: HeadingTags;\n /** Expand all children when printing. */\n print?: boolean;\n /** Expander nesting level. Should not be set manually. */\n level?: number;\n}\n\nexport interface ExpanderHierarchyProps extends ExpanderHierarchyCommonProps {\n children: React.ReactNode;\n /** Sets the data-testid attribute on the expander list. */\n testId?: string;\n}\n\nexport interface ExpanderHierarchyCompound extends React.FC<ExpanderHierarchyProps> {\n Expander: ExpanderType;\n}\n\nconst ExpanderHierarchy: ExpanderHierarchyCompound = ({\n htmlMarkup = 'h2',\n level = 1,\n print,\n children,\n testId,\n}: ExpanderHierarchyProps) => {\n const listClasses = classNames(\n styles.expanderhierarchy,\n level === 2 && styles[`expanderhierarchy--${level}`],\n level > 2 && styles[`expanderhierarchy--3-and-lower`]\n );\n\n return (\n <ul className={listClasses} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderHierarchy}>\n {React.Children.map(children, child =>\n isComponent<ExpanderProps>(child, Expander) ? React.cloneElement(child, { htmlMarkup, level, print }) : child\n )}\n </ul>\n );\n};\n\nExpanderHierarchy.Expander = Expander;\n\nexport default ExpanderHierarchy;\n","import ExpanderHierarchy from './ExpanderHierarchy';\nexport * from './ExpanderHierarchy';\nexport * from './utils';\nexport default ExpanderHierarchy;\n"],"mappings":";;;;;;;;;;;;;AAoBA,IAAM,kBAAiD,EAAE,aAAa,MAAM,QAAQ,GAAG,OAAO,UAAU,UAAU,UAAU,aAAa;CACvI,MAAM,EAAE,WAAW,cAAc,iBAAoC;CACrE,MAAM,CAAC,YAAY,iBAAiB,UAAU,UAAU,QAAQ;CAEhE,MAAM,oBAA0B;EAC9B,cAAc,CAAC,UAAU;CAC3B;CAEA,MAAM,YAAY;CAElB,MAAM,gBAAgB,WACpB,OAAO,kBACP,QAAQ,KAAK,OAAO,kCACpB,SAAS,OAAO,0BAClB;CAEA,MAAM,eAAe,WACnB,OAAO,kBACN,UAAU,KAAK,UAAU,KAAK,UAAU,MAAM,OAAO,oBAAoB,UAC1E,QAAQ,KAAK,OAAO,iCACpB,cAAc,OAAO,8BACrB,SAAS,OAAO,yBAClB;CAEA,MAAM,cAAc,WAClB,OAAO,gBACP,QAAQ,KAAK,OAAO,gCACpB,QAAQ,KAAK,OAAO,8BACtB;CAEA,OACE,oBAAC,WAAD;EAAW,WAAW;EACpB,UAAA,qBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,WAAW;GACX,iBAAe;GACf,KAAK;GACL,eAAa;GACb,oBAAkB,YAAY;GAPhC,UAAA,CASG,UACD,oBAAC,cAAD;IAAM,SAAS,aAAa,YAAY;IAAwB;IAAW,WAAW;IAAa,MAAM,SAAS;GAAS,CAAA,CACrH;;CACC,CAAA;AAEf;;;AChEA,IAAa,iBAAiB,eAA0C;CACtE,QAAQ,YAAR;EACE,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;ACeA,IAAM,YAAqC,EACzC,OACA,aAAa,MACb,QAAQ,GACR,OACA,WAAW,OACX,UACA,UACA,QACA,WACA,UACmB;CACnB,MAAM,iBAAiB,WACrB,OAAO,oBACN,UAAU,KAAK,UAAU,MAAM,OAAO,sBAAsB,UAC7D,QAAQ,KAAK,OAAO,iCACtB;CAEA,OACE,qBAAC,MAAD;EAAI,WAAW,WAAW,OAAO,UAAU,SAAS;EAAQ;EAA5D,UAAA,CACE,oBAAC,gBAAD;GAA4B;GAAmB;GAAc;GAAiB;GAAoB;GAAkB;GACjH,UAAA;EACa,CAAA,GAChB,oBAAC,OAAD;GAAK,WAAW;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/ExpanderHierarchy/ExpanderButton.tsx","../../../src/components/ExpanderHierarchy/utils.ts","../../../src/components/ExpanderHierarchy/Expander.tsx","../../../src/components/ExpanderHierarchy/ExpanderHierarchy.tsx","../../../src/components/ExpanderHierarchy/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { ExpanderHierarchyCommonProps } from '../ExpanderHierarchy';\n\nimport { AnalyticsId } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport Icon, { IconSize } from '../Icon';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\n\nimport styles from './expander.module.scss';\n\ninterface ExpanderButtonProps extends ExpanderHierarchyCommonProps {\n expanded: boolean;\n onExpand?: (isExpanded: boolean) => void;\n children: string;\n testId?: string;\n}\n\nconst ExpanderButton: React.FC<ExpanderButtonProps> = ({ htmlMarkup = 'h2', level = 1, print, expanded, onExpand, children, testId }) => {\n const { refObject, isHovered } = usePseudoClasses<HTMLButtonElement>();\n const [isExpanded, setIsExpanded] = useExpand(expanded, onExpand);\n\n const handleClick = (): void => {\n setIsExpanded(!isExpanded);\n };\n\n const CustomTag = htmlMarkup;\n\n const buttonClasses = classNames(\n styles.expander__button,\n level > 1 && styles[`expander__button--2-and-lower`],\n print && styles['expander__button--print']\n );\n\n const titleClasses = classNames(\n styles.expander__title,\n (level === 1 || level === 2 || level === 3) && styles[`expander__title--${level}`],\n level > 3 && styles[`expander__title--4-and-lower`],\n isExpanded && styles['expander__title--expanded'],\n print && styles['expander__title--print']\n );\n\n const iconClasses = classNames(\n styles.expander__icon,\n level > 1 && styles[`expander__icon--2-and-lower`],\n level > 2 && styles[`expander__icon--3-and-lower`]\n );\n\n return (\n <CustomTag className={titleClasses}>\n <button\n type=\"button\"\n onClick={handleClick}\n className={buttonClasses}\n aria-expanded={isExpanded}\n ref={refObject}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderHierarchyExpander}\n >\n {children}\n <Icon svgIcon={isExpanded ? ChevronUp : ChevronDown} isHovered={isHovered} className={iconClasses} size={IconSize.XSmall} />\n </button>\n </CustomTag>\n );\n};\n\nexport default ExpanderButton;\n","export type HeadingTags = 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nexport const getHeadingTag = (htmlMarkup?: HeadingTags): HeadingTags => {\n switch (htmlMarkup) {\n case 'h2':\n return 'h3';\n case 'h3':\n return 'h4';\n case 'h4':\n return 'h5';\n case 'h5':\n return 'h6';\n case 'h6':\n return 'h6';\n default:\n return 'h2';\n }\n};\n","import React from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ExpanderHierarchyCommonProps, ExpanderHierarchyProps } from './ExpanderHierarchy';\n\nimport ExpanderButton from './ExpanderButton';\nimport ExpanderHierarchy from './ExpanderHierarchy';\nimport { getHeadingTag } from './utils';\nimport { isComponent } from '../../utils/component';\n\nimport styles from './expander.module.scss';\n\nexport interface ExpanderProps extends ExpanderHierarchyCommonProps {\n /** Sets the trigger title */\n title: string;\n /** Opens or closes the expander */\n expanded?: boolean;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n /** Sets the expanded content */\n children?: React.ReactNode;\n /** Sets the data-testid attribute on the expander button. */\n testId?: string;\n /** Adds custom classes to the element. */\n className?: string;\n /** ref that is placed on the li element */\n ref?: React.RefObject<HTMLLIElement | null>;\n}\n\nexport type ExpanderType = typeof Expander;\n\nconst Expander: React.FC<ExpanderProps> = ({\n title,\n htmlMarkup = 'h2',\n level = 1,\n print,\n expanded = false,\n onExpand,\n children,\n testId,\n className,\n ref,\n}: ExpanderProps) => {\n const contentClasses = classNames(\n styles.expander__content,\n (level === 1 || level === 2) && styles[`expander__content--${level}`],\n level > 2 && styles[`expander__content--3-and-lower`]\n );\n\n return (\n <li className={classNames(styles.expander, className)} ref={ref}>\n <ExpanderButton htmlMarkup={htmlMarkup} level={level} print={print} expanded={expanded} onExpand={onExpand} testId={testId}>\n {title}\n </ExpanderButton>\n <div className={contentClasses} data-overflow-boundary>\n {React.Children.map(children, child =>\n isComponent<ExpanderHierarchyProps>(child, ExpanderHierarchy)\n ? React.cloneElement(child, { htmlMarkup: getHeadingTag(htmlMarkup), level: level + 1, print })\n : child\n )}\n </div>\n </li>\n );\n};\n\nexport default Expander;\n","import React from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ExpanderProps, ExpanderType } from './Expander';\nimport type { HeadingTags } from './utils';\n\nimport Expander from './Expander';\nimport { AnalyticsId } from '../../constants';\nimport { isComponent } from '../../utils/component';\n\nimport styles from './styles.module.scss';\n\nexport interface ExpanderHierarchyCommonProps {\n /** Changes the underlying element of the expander title. Default: h2. */\n htmlMarkup?: HeadingTags;\n /** Expand all children when printing. */\n print?: boolean;\n /** Expander nesting level. Should not be set manually. */\n level?: number;\n}\n\nexport interface ExpanderHierarchyProps extends ExpanderHierarchyCommonProps {\n children: React.ReactNode;\n /** Sets the data-testid attribute on the expander list. */\n testId?: string;\n}\n\nexport interface ExpanderHierarchyCompound extends React.FC<ExpanderHierarchyProps> {\n Expander: ExpanderType;\n}\n\nconst ExpanderHierarchy: ExpanderHierarchyCompound = ({\n htmlMarkup = 'h2',\n level = 1,\n print,\n children,\n testId,\n}: ExpanderHierarchyProps) => {\n const listClasses = classNames(\n styles.expanderhierarchy,\n level === 2 && styles[`expanderhierarchy--${level}`],\n level > 2 && styles[`expanderhierarchy--3-and-lower`]\n );\n\n return (\n <ul className={listClasses} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderHierarchy}>\n {React.Children.map(children, child =>\n isComponent<ExpanderProps>(child, Expander) ? React.cloneElement(child, { htmlMarkup, level, print }) : child\n )}\n </ul>\n );\n};\n\nExpanderHierarchy.Expander = Expander;\n\nexport default ExpanderHierarchy;\n","import ExpanderHierarchy from './ExpanderHierarchy';\nexport * from './ExpanderHierarchy';\nexport * from './utils';\nexport default ExpanderHierarchy;\n"],"mappings":";;;;;;;;;;;;;AAoBA,IAAM,kBAAiD,EAAE,aAAa,MAAM,QAAQ,GAAG,OAAO,UAAU,UAAU,UAAU,aAAa;CACvI,MAAM,EAAE,WAAW,cAAc,iBAAoC;CACrE,MAAM,CAAC,YAAY,iBAAiB,UAAU,UAAU,QAAQ;CAEhE,MAAM,oBAA0B;EAC9B,cAAc,CAAC,UAAU;CAC3B;CAEA,MAAM,YAAY;CAElB,MAAM,gBAAgB,WACpB,OAAO,kBACP,QAAQ,KAAK,OAAO,kCACpB,SAAS,OAAO,0BAClB;CAEA,MAAM,eAAe,WACnB,OAAO,kBACN,UAAU,KAAK,UAAU,KAAK,UAAU,MAAM,OAAO,oBAAoB,UAC1E,QAAQ,KAAK,OAAO,iCACpB,cAAc,OAAO,8BACrB,SAAS,OAAO,yBAClB;CAEA,MAAM,cAAc,WAClB,OAAO,gBACP,QAAQ,KAAK,OAAO,gCACpB,QAAQ,KAAK,OAAO,8BACtB;CAEA,OACE,oBAAC,WAAD;EAAW,WAAW;EACpB,UAAA,qBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,WAAW;GACX,iBAAe;GACf,KAAK;GACL,eAAa;GACb,oBAAkB,YAAY;GAPhC,UAAA,CASG,UACD,oBAAC,cAAD;IAAM,SAAS,aAAa,YAAY;IAAwB;IAAW,WAAW;IAAa,MAAM,SAAS;GAAS,CAAA,CACrH;;CACC,CAAA;AAEf;;;AChEA,IAAa,iBAAiB,eAA0C;CACtE,QAAQ,YAAR;EACE,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;ACeA,IAAM,YAAqC,EACzC,OACA,aAAa,MACb,QAAQ,GACR,OACA,WAAW,OACX,UACA,UACA,QACA,WACA,UACmB;CACnB,MAAM,iBAAiB,WACrB,OAAO,oBACN,UAAU,KAAK,UAAU,MAAM,OAAO,sBAAsB,UAC7D,QAAQ,KAAK,OAAO,iCACtB;CAEA,OACE,qBAAC,MAAD;EAAI,WAAW,WAAW,OAAO,UAAU,SAAS;EAAQ;EAA5D,UAAA,CACE,oBAAC,gBAAD;GAA4B;GAAmB;GAAc;GAAiB;GAAoB;GAAkB;GACjH,UAAA;EACa,CAAA,GAChB,oBAAC,OAAD;GAAK,WAAW;GAAgB,0BAAA;GAC7B,UAAA,MAAM,SAAS,IAAI,WAAU,UAC5B,YAAoC,OAAO,iBAAiB,IACxD,MAAM,aAAa,OAAO;IAAE,YAAY,cAAc,UAAU;IAAG,OAAO,QAAQ;IAAG;GAAM,CAAC,IAC5F,KACN;EACG,CAAA,CACH;;AAER;;;AChCA,IAAM,qBAAgD,EACpD,aAAa,MACb,QAAQ,GACR,OACA,UACA,aAC4B;CAC5B,MAAM,cAAc,WAClB,SAAO,mBACP,UAAU,KAAK,SAAO,sBAAsB,UAC5C,QAAQ,KAAK,SAAO,iCACtB;CAEA,OACE,oBAAC,MAAD;EAAI,WAAW;EAAa,eAAa;EAAQ,oBAAkB,YAAY;EAC5E,UAAA,MAAM,SAAS,IAAI,WAAU,UAC5B,YAA2B,OAAO,QAAQ,IAAI,MAAM,aAAa,OAAO;GAAE;GAAY;GAAO;EAAM,CAAC,IAAI,KAC1G;CACE,CAAA;AAER;AAEA,kBAAkB,WAAW;;;ACnD7B,IAAA,4BAAe"}
|
|
@@ -56,6 +56,7 @@ var Expander = (props) => {
|
|
|
56
56
|
return /* @__PURE__ */ jsx("div", {
|
|
57
57
|
className: mainContentClasses,
|
|
58
58
|
"data-state": isExpanded ? "open" : "closed",
|
|
59
|
+
"data-overflow-boundary": true,
|
|
59
60
|
children: /* @__PURE__ */ jsx(Highlighter_default, {
|
|
60
61
|
searchText: highlightText,
|
|
61
62
|
children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/ExpanderList/ExpanderList.tsx","../../../src/components/ExpanderList/index.ts"],"sourcesContent":["import React, { useEffect, useId, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { PaletteNames } from '../../theme/palette';\nimport type { ElementHeaderType } from '../ElementHeader/ElementHeader';\nimport type { ListEditModeItemProps } from '../ListEditMode';\nimport type { TitleTags } from '../Title';\n\nimport { AnalyticsId } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport { mergeRefs } from '../../utils/refs';\nimport { isElementInViewport } from '../../utils/viewport';\nimport { renderElementHeader } from '../ElementHeader/utils';\nimport Highlighter from '../Highlighter';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport ListEditModeItem from '../ListEditMode';\nimport { listEditModeWrapperClassnames } from '../ListEditMode/constants';\n\nimport expanderListStyles from './styles.module.scss';\n\nexport type ExpanderListColors = Extract<PaletteNames, 'white' | 'blueberry' | 'cherry' | 'neutral'>;\nexport interface ExpanderType extends React.FC<ExpanderProps> {\n ElementHeader?: ElementHeaderType;\n}\n\nexport interface ExpanderListCompound extends React.FC<ExpanderListProps> {\n Expander: ExpanderType;\n}\n\nexport type ExpanderListVariant = 'line' | 'outline' | 'fill' | 'fill-negative';\n\nexport type ExpanderListStatus = 'none' | 'new';\n\ninterface ExpanderListProps {\n /** Toggles accordion functionality for the expanders. */\n accordion?: boolean;\n /** Items in the ExpanderList */\n children: React.ReactNode;\n /** Toggles padding of child elements */\n childPadding?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the colors of the list. */\n color?: ExpanderListColors;\n /** Changes the font size. */\n large?: boolean;\n /** Whether to render children when closed (in which case they are hidden with CSS). Default: false */\n renderChildrenWhenClosed?: boolean;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets visual priority */\n variant?: ExpanderListVariant;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n /** Highlights text in title and content. Used for search results */\n highlightText?: string;\n /**\n * @experimental This prop is experimental and may change in the future.\n * Enables ListEditMode\n */\n editMode?: boolean;\n /** Ref passed to the ul element */\n ref?: React.Ref<HTMLUListElement | null>;\n}\n\ntype Modify<T, R> = Omit<T, keyof R> & R;\n\ntype ExpanderProps = Modify<\n React.HTMLAttributes<HTMLButtonElement>,\n {\n id?: string;\n title: React.ReactElement | string;\n /** Changes the underlying element of the title. Default: span*/\n titleHtmlMarkup?: TitleTags;\n children: React.ReactNode;\n className?: string;\n color?: ExpanderListColors;\n icon?: React.ReactElement;\n padding?: boolean;\n expanded?: boolean;\n large?: boolean;\n testId?: string;\n handleExpanderClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n /** Highlights text in title and content. Override if different from list. */\n highlightText?: string;\n /** Displays a status on the left side: default none */\n status?: ExpanderListStatus;\n /** Ref passed to the li element */\n ref?: React.Ref<HTMLLIElement | null>;\n }\n> &\n Pick<ExpanderListProps, 'renderChildrenWhenClosed' | 'variant'> &\n ListEditModeItemProps;\n\nexport const Expander: ExpanderType = (props: ExpanderProps) => {\n const {\n id,\n children,\n padding = true,\n color = 'neutral',\n className = '',\n icon,\n large = false,\n title,\n titleHtmlMarkup = 'span',\n expanded = false,\n testId,\n handleExpanderClick,\n onExpand,\n renderChildrenWhenClosed,\n variant = 'line',\n zIndex = 0,\n highlightText,\n status = 'none',\n editMode = false,\n ref,\n } = props;\n const [isExpanded] = useExpand(expanded, onExpand);\n const expanderRef = useRef<HTMLLIElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { isHovered, isFocused } = usePseudoClasses(triggerRef);\n\n const isFill = variant === 'fill';\n const isFillNegative = variant === 'fill-negative';\n const isOutline = variant === 'outline';\n const isLine = variant === 'line';\n\n const itemClasses = classNames(className, expanderListStyles['expander-list__item'], {\n [expanderListStyles[`expander-list__item--fill`]]: isFill,\n [expanderListStyles[`expander-list__item--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list__item--fill-negative`]]: isFillNegative,\n [expanderListStyles[`expander-list__item--fill-negative--${color}`]]: isFillNegative,\n [expanderListStyles['expander-list__item--outline']]: isOutline,\n [expanderListStyles[`expander-list__item--outline--${color}`]]: isOutline,\n [expanderListStyles['expander-list__item--line']]: isLine,\n [expanderListStyles[`expander-list__item--line--${color}`]]: isLine,\n [expanderListStyles[`expander-list__item--new`]]: status === 'new',\n });\n\n const expanderClasses = classNames(expanderListStyles['expander-list-link'], expanderListStyles[`expander-list-link--${color}`], {\n [expanderListStyles[`expander-list-link--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list-link--fill-negative`]]: isFillNegative,\n [expanderListStyles[`expander-list-link--fill-negative--${color}`]]: isFillNegative,\n [expanderListStyles['expander-list-link--outline']]: isOutline,\n [expanderListStyles[`expander-list-link--outline--${color}`]]: isOutline,\n [expanderListStyles[`expander-list-link--line--${color}`]]: isLine,\n [expanderListStyles['expander-list-link--open']]: isExpanded,\n [expanderListStyles['expander-list-link--large']]: large,\n [expanderListStyles[`expander-list-link--new`]]: status === 'new',\n });\n\n const renderContent = (): React.ReactNode => {\n if (!renderChildrenWhenClosed && !isExpanded) {\n return null;\n }\n\n const mainContentClasses = classNames(expanderListStyles['expander-list-link__main-content'], {\n [expanderListStyles['expander-list-link__main-content--expanded']]: isExpanded,\n [expanderListStyles['expander-list-link__main-content--padding']]: padding,\n [expanderListStyles[`expander-list-link__main-content--outline--${color}`]]: isOutline,\n [expanderListStyles[`expander-list-link__main-content--new`]]: status === 'new',\n });\n\n return (\n <div className={mainContentClasses} data-state={isExpanded ? 'open' : 'closed'}>\n <Highlighter searchText={highlightText}>{children}</Highlighter>\n </div>\n );\n };\n\n const statusMarkerClasses = classNames(expanderListStyles['expander-list__item__status-marker'], {\n [expanderListStyles['expander-list__item__status-marker--new']]: status === 'new',\n });\n\n return (\n <>\n {editMode ? (\n <div className={itemClasses}>\n {status !== 'none' && <div className={statusMarkerClasses}></div>}\n <div id={id} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderListExpander} className={expanderClasses}>\n {renderElementHeader(title, {\n titleHtmlMarkup,\n isHovered: false,\n size: large ? 'large' : 'normal',\n parentType: 'expanderlist',\n chevronIcon: undefined,\n icon,\n highlightText,\n })}\n </div>\n </div>\n ) : (\n <li className={itemClasses} ref={mergeRefs([ref, expanderRef])}>\n {status !== 'none' && <div className={statusMarkerClasses}></div>}\n <button\n type=\"button\"\n id={id}\n onClick={handleExpanderClick}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderListExpander}\n className={expanderClasses}\n ref={triggerRef}\n aria-expanded={isExpanded}\n style={{\n zIndex: isFocused ? zIndex + 1 : zIndex,\n }}\n >\n {renderElementHeader(title, {\n titleHtmlMarkup,\n isHovered: isHovered || isFocused,\n size: large ? 'large' : 'normal',\n parentType: 'expanderlist',\n chevronIcon: isExpanded ? ChevronUp : ChevronDown,\n icon,\n highlightText,\n })}\n </button>\n {renderContent()}\n </li>\n )}\n </>\n );\n};\n\ntype ActiveExpander = Record<string, boolean>;\n\nconst isExpanderComponent = (element: unknown | null | undefined): element is React.ReactElement<ExpanderProps> =>\n React.isValidElement<ExpanderProps>(element) && (element as React.ReactElement).type === Expander;\n\nconst ExpanderListComponent: React.FC<ExpanderListProps> = (props: ExpanderListProps) => {\n const {\n children,\n childPadding = true,\n large,\n renderChildrenWhenClosed = false,\n color = 'white',\n className = '',\n accordion = false,\n testId,\n variant,\n zIndex,\n highlightText,\n editMode = false,\n ref,\n } = props;\n const [prevChildren, setPrevChildren] = useState(children);\n const [activeExpander, setActiveExpander] = useState<ActiveExpander>();\n const [latestExpander, setLatestExpander] = useState<HTMLElement>();\n const expanderIdBase = useId();\n const expanderListClasses = classNames(expanderListStyles['expander-list'], className, {\n [expanderListStyles[`expander-list--outline--${color}`]]: variant === 'outline',\n [expanderListStyles[`expander-list--fill`]]: variant === 'fill' || variant === 'fill-negative',\n [listEditModeWrapperClassnames]: editMode,\n });\n\n function handleExpanderClick(event: React.MouseEvent<HTMLElement, MouseEvent>, id: string): void {\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n setLatestExpander(event.currentTarget);\n }\n\n const getExpanderId = (index: number): string => `${expanderIdBase}-${index}`;\n\n useEffect(() => {\n if (accordion && latestExpander && !isElementInViewport(latestExpander)) {\n latestExpander.scrollIntoView();\n }\n }, [accordion, latestExpander]);\n\n const getExpanderStateFromChildren = (): ActiveExpander | undefined => {\n return React.Children.map(children, child => {\n if (isExpanderComponent(child)) {\n return child;\n }\n })?.reduce((acc, child, index) => {\n // Expanded-status skal bare settes dersom prop er satt av den som bruker komponenten\n if (typeof child.props.expanded !== 'undefined') {\n acc[getExpanderId(index)] = child.props.expanded;\n }\n return acc;\n }, {} as ActiveExpander);\n };\n\n if (children !== prevChildren) {\n setPrevChildren(children);\n const newActiveExpander = getExpanderStateFromChildren();\n if (newActiveExpander) {\n setActiveExpander({ ...activeExpander, ...newActiveExpander });\n }\n }\n\n if (activeExpander === undefined) {\n const initialState = getExpanderStateFromChildren();\n if (initialState && Object.keys(initialState).length > 0) {\n setActiveExpander(initialState);\n }\n }\n\n return (\n <ul className={expanderListClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderList}>\n {React.Children.map(children, (child, index) => {\n if (isExpanderComponent(child)) {\n const id = getExpanderId(index);\n const expanded = activeExpander?.[id];\n const highlightTextChild: string | undefined = child.props.highlightText || highlightText;\n const childProps = child.props;\n const sharedProps = {\n padding: childProps.padding ?? childPadding,\n color: childProps.color ?? color,\n large: childProps.large ?? large,\n className: classNames(expanderListStyles['expander-list__item'], childProps.className),\n variant: childProps.variant ?? variant,\n zIndex: childProps.zIndex ?? zIndex,\n highlightText: highlightTextChild,\n };\n\n if (editMode) {\n return (\n <ListEditModeItem color={color} variant={variant} onDelete={childProps.onDelete}>\n {React.cloneElement(child, {\n ...sharedProps,\n id,\n key: index,\n expanded,\n 'aria-expanded': false,\n renderChildrenWhenClosed: false,\n editMode: true,\n })}\n </ListEditModeItem>\n );\n } else {\n return React.cloneElement(child as React.ReactElement<ExpanderProps>, {\n ...sharedProps,\n id,\n key: index,\n expanded,\n 'aria-expanded': expanded,\n handleExpanderClick: (event: React.MouseEvent<HTMLElement>) => {\n childProps.handleExpanderClick?.(event);\n handleExpanderClick(event, id);\n },\n renderChildrenWhenClosed: childProps.renderChildrenWhenClosed ?? renderChildrenWhenClosed,\n });\n }\n }\n return child;\n })}\n </ul>\n );\n};\n\nconst ExpanderList = ExpanderListComponent as ExpanderListCompound;\n\nExpanderList.displayName = 'ExpanderList';\nExpanderList.Expander = Expander;\nExpander.displayName = 'ExpanderList.Expander';\n\nexport default ExpanderList;\n","import ExpanderList from './ExpanderList';\nexport * from './ExpanderList';\nexport default ExpanderList;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/ExpanderList/ExpanderList.tsx","../../../src/components/ExpanderList/index.ts"],"sourcesContent":["import React, { useEffect, useId, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { PaletteNames } from '../../theme/palette';\nimport type { ElementHeaderType } from '../ElementHeader/ElementHeader';\nimport type { ListEditModeItemProps } from '../ListEditMode';\nimport type { TitleTags } from '../Title';\n\nimport { AnalyticsId } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport { mergeRefs } from '../../utils/refs';\nimport { isElementInViewport } from '../../utils/viewport';\nimport { renderElementHeader } from '../ElementHeader/utils';\nimport Highlighter from '../Highlighter';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport ListEditModeItem from '../ListEditMode';\nimport { listEditModeWrapperClassnames } from '../ListEditMode/constants';\n\nimport expanderListStyles from './styles.module.scss';\n\nexport type ExpanderListColors = Extract<PaletteNames, 'white' | 'blueberry' | 'cherry' | 'neutral'>;\nexport interface ExpanderType extends React.FC<ExpanderProps> {\n ElementHeader?: ElementHeaderType;\n}\n\nexport interface ExpanderListCompound extends React.FC<ExpanderListProps> {\n Expander: ExpanderType;\n}\n\nexport type ExpanderListVariant = 'line' | 'outline' | 'fill' | 'fill-negative';\n\nexport type ExpanderListStatus = 'none' | 'new';\n\ninterface ExpanderListProps {\n /** Toggles accordion functionality for the expanders. */\n accordion?: boolean;\n /** Items in the ExpanderList */\n children: React.ReactNode;\n /** Toggles padding of child elements */\n childPadding?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the colors of the list. */\n color?: ExpanderListColors;\n /** Changes the font size. */\n large?: boolean;\n /** Whether to render children when closed (in which case they are hidden with CSS). Default: false */\n renderChildrenWhenClosed?: boolean;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets visual priority */\n variant?: ExpanderListVariant;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n /** Highlights text in title and content. Used for search results */\n highlightText?: string;\n /**\n * @experimental This prop is experimental and may change in the future.\n * Enables ListEditMode\n */\n editMode?: boolean;\n /** Ref passed to the ul element */\n ref?: React.Ref<HTMLUListElement | null>;\n}\n\ntype Modify<T, R> = Omit<T, keyof R> & R;\n\ntype ExpanderProps = Modify<\n React.HTMLAttributes<HTMLButtonElement>,\n {\n id?: string;\n title: React.ReactElement | string;\n /** Changes the underlying element of the title. Default: span*/\n titleHtmlMarkup?: TitleTags;\n children: React.ReactNode;\n className?: string;\n color?: ExpanderListColors;\n icon?: React.ReactElement;\n padding?: boolean;\n expanded?: boolean;\n large?: boolean;\n testId?: string;\n handleExpanderClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n /** Highlights text in title and content. Override if different from list. */\n highlightText?: string;\n /** Displays a status on the left side: default none */\n status?: ExpanderListStatus;\n /** Ref passed to the li element */\n ref?: React.Ref<HTMLLIElement | null>;\n }\n> &\n Pick<ExpanderListProps, 'renderChildrenWhenClosed' | 'variant'> &\n ListEditModeItemProps;\n\nexport const Expander: ExpanderType = (props: ExpanderProps) => {\n const {\n id,\n children,\n padding = true,\n color = 'neutral',\n className = '',\n icon,\n large = false,\n title,\n titleHtmlMarkup = 'span',\n expanded = false,\n testId,\n handleExpanderClick,\n onExpand,\n renderChildrenWhenClosed,\n variant = 'line',\n zIndex = 0,\n highlightText,\n status = 'none',\n editMode = false,\n ref,\n } = props;\n const [isExpanded] = useExpand(expanded, onExpand);\n const expanderRef = useRef<HTMLLIElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { isHovered, isFocused } = usePseudoClasses(triggerRef);\n\n const isFill = variant === 'fill';\n const isFillNegative = variant === 'fill-negative';\n const isOutline = variant === 'outline';\n const isLine = variant === 'line';\n\n const itemClasses = classNames(className, expanderListStyles['expander-list__item'], {\n [expanderListStyles[`expander-list__item--fill`]]: isFill,\n [expanderListStyles[`expander-list__item--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list__item--fill-negative`]]: isFillNegative,\n [expanderListStyles[`expander-list__item--fill-negative--${color}`]]: isFillNegative,\n [expanderListStyles['expander-list__item--outline']]: isOutline,\n [expanderListStyles[`expander-list__item--outline--${color}`]]: isOutline,\n [expanderListStyles['expander-list__item--line']]: isLine,\n [expanderListStyles[`expander-list__item--line--${color}`]]: isLine,\n [expanderListStyles[`expander-list__item--new`]]: status === 'new',\n });\n\n const expanderClasses = classNames(expanderListStyles['expander-list-link'], expanderListStyles[`expander-list-link--${color}`], {\n [expanderListStyles[`expander-list-link--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list-link--fill-negative`]]: isFillNegative,\n [expanderListStyles[`expander-list-link--fill-negative--${color}`]]: isFillNegative,\n [expanderListStyles['expander-list-link--outline']]: isOutline,\n [expanderListStyles[`expander-list-link--outline--${color}`]]: isOutline,\n [expanderListStyles[`expander-list-link--line--${color}`]]: isLine,\n [expanderListStyles['expander-list-link--open']]: isExpanded,\n [expanderListStyles['expander-list-link--large']]: large,\n [expanderListStyles[`expander-list-link--new`]]: status === 'new',\n });\n\n const renderContent = (): React.ReactNode => {\n if (!renderChildrenWhenClosed && !isExpanded) {\n return null;\n }\n\n const mainContentClasses = classNames(expanderListStyles['expander-list-link__main-content'], {\n [expanderListStyles['expander-list-link__main-content--expanded']]: isExpanded,\n [expanderListStyles['expander-list-link__main-content--padding']]: padding,\n [expanderListStyles[`expander-list-link__main-content--outline--${color}`]]: isOutline,\n [expanderListStyles[`expander-list-link__main-content--new`]]: status === 'new',\n });\n\n return (\n <div className={mainContentClasses} data-state={isExpanded ? 'open' : 'closed'} data-overflow-boundary>\n <Highlighter searchText={highlightText}>{children}</Highlighter>\n </div>\n );\n };\n\n const statusMarkerClasses = classNames(expanderListStyles['expander-list__item__status-marker'], {\n [expanderListStyles['expander-list__item__status-marker--new']]: status === 'new',\n });\n\n return (\n <>\n {editMode ? (\n <div className={itemClasses}>\n {status !== 'none' && <div className={statusMarkerClasses}></div>}\n <div id={id} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderListExpander} className={expanderClasses}>\n {renderElementHeader(title, {\n titleHtmlMarkup,\n isHovered: false,\n size: large ? 'large' : 'normal',\n parentType: 'expanderlist',\n chevronIcon: undefined,\n icon,\n highlightText,\n })}\n </div>\n </div>\n ) : (\n <li className={itemClasses} ref={mergeRefs([ref, expanderRef])}>\n {status !== 'none' && <div className={statusMarkerClasses}></div>}\n <button\n type=\"button\"\n id={id}\n onClick={handleExpanderClick}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderListExpander}\n className={expanderClasses}\n ref={triggerRef}\n aria-expanded={isExpanded}\n style={{\n zIndex: isFocused ? zIndex + 1 : zIndex,\n }}\n >\n {renderElementHeader(title, {\n titleHtmlMarkup,\n isHovered: isHovered || isFocused,\n size: large ? 'large' : 'normal',\n parentType: 'expanderlist',\n chevronIcon: isExpanded ? ChevronUp : ChevronDown,\n icon,\n highlightText,\n })}\n </button>\n {renderContent()}\n </li>\n )}\n </>\n );\n};\n\ntype ActiveExpander = Record<string, boolean>;\n\nconst isExpanderComponent = (element: unknown | null | undefined): element is React.ReactElement<ExpanderProps> =>\n React.isValidElement<ExpanderProps>(element) && (element as React.ReactElement).type === Expander;\n\nconst ExpanderListComponent: React.FC<ExpanderListProps> = (props: ExpanderListProps) => {\n const {\n children,\n childPadding = true,\n large,\n renderChildrenWhenClosed = false,\n color = 'white',\n className = '',\n accordion = false,\n testId,\n variant,\n zIndex,\n highlightText,\n editMode = false,\n ref,\n } = props;\n const [prevChildren, setPrevChildren] = useState(children);\n const [activeExpander, setActiveExpander] = useState<ActiveExpander>();\n const [latestExpander, setLatestExpander] = useState<HTMLElement>();\n const expanderIdBase = useId();\n const expanderListClasses = classNames(expanderListStyles['expander-list'], className, {\n [expanderListStyles[`expander-list--outline--${color}`]]: variant === 'outline',\n [expanderListStyles[`expander-list--fill`]]: variant === 'fill' || variant === 'fill-negative',\n [listEditModeWrapperClassnames]: editMode,\n });\n\n function handleExpanderClick(event: React.MouseEvent<HTMLElement, MouseEvent>, id: string): void {\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n setLatestExpander(event.currentTarget);\n }\n\n const getExpanderId = (index: number): string => `${expanderIdBase}-${index}`;\n\n useEffect(() => {\n if (accordion && latestExpander && !isElementInViewport(latestExpander)) {\n latestExpander.scrollIntoView();\n }\n }, [accordion, latestExpander]);\n\n const getExpanderStateFromChildren = (): ActiveExpander | undefined => {\n return React.Children.map(children, child => {\n if (isExpanderComponent(child)) {\n return child;\n }\n })?.reduce((acc, child, index) => {\n // Expanded-status skal bare settes dersom prop er satt av den som bruker komponenten\n if (typeof child.props.expanded !== 'undefined') {\n acc[getExpanderId(index)] = child.props.expanded;\n }\n return acc;\n }, {} as ActiveExpander);\n };\n\n if (children !== prevChildren) {\n setPrevChildren(children);\n const newActiveExpander = getExpanderStateFromChildren();\n if (newActiveExpander) {\n setActiveExpander({ ...activeExpander, ...newActiveExpander });\n }\n }\n\n if (activeExpander === undefined) {\n const initialState = getExpanderStateFromChildren();\n if (initialState && Object.keys(initialState).length > 0) {\n setActiveExpander(initialState);\n }\n }\n\n return (\n <ul className={expanderListClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderList}>\n {React.Children.map(children, (child, index) => {\n if (isExpanderComponent(child)) {\n const id = getExpanderId(index);\n const expanded = activeExpander?.[id];\n const highlightTextChild: string | undefined = child.props.highlightText || highlightText;\n const childProps = child.props;\n const sharedProps = {\n padding: childProps.padding ?? childPadding,\n color: childProps.color ?? color,\n large: childProps.large ?? large,\n className: classNames(expanderListStyles['expander-list__item'], childProps.className),\n variant: childProps.variant ?? variant,\n zIndex: childProps.zIndex ?? zIndex,\n highlightText: highlightTextChild,\n };\n\n if (editMode) {\n return (\n <ListEditModeItem color={color} variant={variant} onDelete={childProps.onDelete}>\n {React.cloneElement(child, {\n ...sharedProps,\n id,\n key: index,\n expanded,\n 'aria-expanded': false,\n renderChildrenWhenClosed: false,\n editMode: true,\n })}\n </ListEditModeItem>\n );\n } else {\n return React.cloneElement(child as React.ReactElement<ExpanderProps>, {\n ...sharedProps,\n id,\n key: index,\n expanded,\n 'aria-expanded': expanded,\n handleExpanderClick: (event: React.MouseEvent<HTMLElement>) => {\n childProps.handleExpanderClick?.(event);\n handleExpanderClick(event, id);\n },\n renderChildrenWhenClosed: childProps.renderChildrenWhenClosed ?? renderChildrenWhenClosed,\n });\n }\n }\n return child;\n })}\n </ul>\n );\n};\n\nconst ExpanderList = ExpanderListComponent as ExpanderListCompound;\n\nExpanderList.displayName = 'ExpanderList';\nExpanderList.Expander = Expander;\nExpander.displayName = 'ExpanderList.Expander';\n\nexport default ExpanderList;\n","import ExpanderList from './ExpanderList';\nexport * from './ExpanderList';\nexport default ExpanderList;\n"],"mappings":";;;;;;;;;;;;;;;AAqGA,IAAa,YAA0B,UAAyB;CAC9D,MAAM,EACJ,IACA,UACA,UAAU,MACV,QAAQ,WACR,YAAY,IACZ,MACA,QAAQ,OACR,OACA,kBAAkB,QAClB,WAAW,OACX,QACA,qBACA,UACA,0BACA,UAAU,QACV,SAAS,GACT,eACA,SAAS,QACT,WAAW,OACX,QACE;CACJ,MAAM,CAAC,cAAc,UAAU,UAAU,QAAQ;CACjD,MAAM,cAAc,OAAsB,IAAI;CAC9C,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,EAAE,WAAW,cAAc,iBAAiB,UAAU;CAE5D,MAAM,SAAS,YAAY;CAC3B,MAAM,iBAAiB,YAAY;CACnC,MAAM,YAAY,YAAY;CAC9B,MAAM,SAAS,YAAY;CAE3B,MAAM,cAAc,WAAW,WAAW,mBAAmB,wBAAwB;GAClF,mBAAmB,+BAA+B;GAClD,mBAAmB,8BAA8B,WAAW;GAC5D,mBAAmB,wCAAwC;GAC3D,mBAAmB,uCAAuC,WAAW;GACrE,mBAAmB,kCAAkC;GACrD,mBAAmB,iCAAiC,WAAW;GAC/D,mBAAmB,+BAA+B;GAClD,mBAAmB,8BAA8B,WAAW;GAC5D,mBAAmB,8BAA8B,WAAW;CAC/D,CAAC;CAED,MAAM,kBAAkB,WAAW,mBAAmB,uBAAuB,mBAAmB,uBAAuB,UAAU;GAC9H,mBAAmB,6BAA6B,WAAW;GAC3D,mBAAmB,uCAAuC;GAC1D,mBAAmB,sCAAsC,WAAW;GACpE,mBAAmB,iCAAiC;GACpD,mBAAmB,gCAAgC,WAAW;GAC9D,mBAAmB,6BAA6B,WAAW;GAC3D,mBAAmB,8BAA8B;GACjD,mBAAmB,+BAA+B;GAClD,mBAAmB,6BAA6B,WAAW;CAC9D,CAAC;CAED,MAAM,sBAAuC;EAC3C,IAAI,CAAC,4BAA4B,CAAC,YAChC,OAAO;EAGT,MAAM,qBAAqB,WAAW,mBAAmB,qCAAqC;IAC3F,mBAAmB,gDAAgD;IACnE,mBAAmB,+CAA+C;IAClE,mBAAmB,8CAA8C,WAAW;IAC5E,mBAAmB,2CAA2C,WAAW;EAC5E,CAAC;EAED,OACE,oBAAC,OAAD;GAAK,WAAW;GAAoB,cAAY,aAAa,SAAS;GAAU,0BAAA;GAC9E,UAAA,oBAAC,qBAAD;IAAa,YAAY;IAAgB;GAAsB,CAAA;EAC5D,CAAA;CAET;CAEA,MAAM,sBAAsB,WAAW,mBAAmB,uCAAuC,GAC9F,mBAAmB,6CAA6C,WAAW,MAC9E,CAAC;CAED,OACE,oBAAA,UAAA,EAAA,UACG,WACC,qBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA,CACG,WAAW,UAAU,oBAAC,OAAD,EAAK,WAAW,oBAA0B,CAAA,GAChE,oBAAC,OAAD;GAAS;GAAI,eAAa;GAAQ,oBAAkB,YAAY;GAAsB,WAAW;GAC9F,UAAA,oBAAoB,OAAO;IAC1B;IACA,WAAW;IACX,MAAM,QAAQ,UAAU;IACxB,YAAY;IACZ,aAAa,KAAA;IACb;IACA;GACF,CAAC;EACE,CAAA,CACF;CAEL,CAAA,IAAA,qBAAC,MAAD;EAAI,WAAW;EAAa,KAAK,UAAU,CAAC,KAAK,WAAW,CAAC;EAA7D,UAAA;GACG,WAAW,UAAU,oBAAC,OAAD,EAAK,WAAW,oBAA0B,CAAA;GAChE,oBAAC,UAAD;IACE,MAAK;IACD;IACJ,SAAS;IACT,eAAa;IACb,oBAAkB,YAAY;IAC9B,WAAW;IACX,KAAK;IACL,iBAAe;IACf,OAAO,EACL,QAAQ,YAAY,SAAS,IAAI,OACnC;IAEC,UAAA,oBAAoB,OAAO;KAC1B;KACA,WAAW,aAAa;KACxB,MAAM,QAAQ,UAAU;KACxB,YAAY;KACZ,aAAa,aAAa,YAAY;KACtC;KACA;IACF,CAAC;GACK,CAAA;GACP,cAAc;EACb;CAEN,CAAA,EAAA,CAAA;AAEN;AAIA,IAAM,uBAAuB,YAC3B,MAAM,eAA8B,OAAO,KAAM,QAA+B,SAAS;AAE3F,IAAM,yBAAsD,UAA6B;CACvF,MAAM,EACJ,UACA,eAAe,MACf,OACA,2BAA2B,OAC3B,QAAQ,SACR,YAAY,IACZ,YAAY,OACZ,QACA,SACA,QACA,eACA,WAAW,OACX,QACE;CACJ,MAAM,CAAC,cAAc,mBAAmB,SAAS,QAAQ;CACzD,MAAM,CAAC,gBAAgB,qBAAqB,SAAyB;CACrE,MAAM,CAAC,gBAAgB,qBAAqB,SAAsB;CAClE,MAAM,iBAAiB,MAAM;CAC7B,MAAM,sBAAsB,WAAW,mBAAmB,kBAAkB,WAAW;GACpF,mBAAmB,2BAA2B,WAAW,YAAY;GACrE,mBAAmB,yBAAyB,YAAY,UAAU,YAAY;GAC9E,gCAAgC;CACnC,CAAC;CAED,SAAS,oBAAoB,OAAkD,IAAkB;EAC/F,mBAAkB,cAAc,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI;GAAE,GAAG;IAAY,KAAK,CAAC,YAAY;EAAI,CAAE;EAClH,kBAAkB,MAAM,aAAa;CACvC;CAEA,MAAM,iBAAiB,UAA0B,GAAG,eAAe,GAAG;CAEtE,gBAAgB;EACd,IAAI,aAAa,kBAAkB,CAAC,oBAAoB,cAAc,GACpE,eAAe,eAAe;CAElC,GAAG,CAAC,WAAW,cAAc,CAAC;CAE9B,MAAM,qCAAiE;EACrE,OAAO,MAAM,SAAS,IAAI,WAAU,UAAS;GAC3C,IAAI,oBAAoB,KAAK,GAC3B,OAAO;EAEX,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,UAAU;GAEhC,IAAI,OAAO,MAAM,MAAM,aAAa,aAClC,IAAI,cAAc,KAAK,KAAK,MAAM,MAAM;GAE1C,OAAO;EACT,GAAG,CAAC,CAAmB;CACzB;CAEA,IAAI,aAAa,cAAc;EAC7B,gBAAgB,QAAQ;EACxB,MAAM,oBAAoB,6BAA6B;EACvD,IAAI,mBACF,kBAAkB;GAAE,GAAG;GAAgB,GAAG;EAAkB,CAAC;CAEjE;CAEA,IAAI,mBAAmB,KAAA,GAAW;EAChC,MAAM,eAAe,6BAA6B;EAClD,IAAI,gBAAgB,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GACrD,kBAAkB,YAAY;CAElC;CAEA,OACE,oBAAC,MAAD;EAAI,WAAW;EAA0B;EAAK,eAAa;EAAQ,oBAAkB,YAAY;EAC9F,UAAA,MAAM,SAAS,IAAI,WAAW,OAAO,UAAU;GAC9C,IAAI,oBAAoB,KAAK,GAAG;IAC9B,MAAM,KAAK,cAAc,KAAK;IAC9B,MAAM,WAAW,iBAAiB;IAClC,MAAM,qBAAyC,MAAM,MAAM,iBAAiB;IAC5E,MAAM,aAAa,MAAM;IACzB,MAAM,cAAc;KAClB,SAAS,WAAW,WAAW;KAC/B,OAAO,WAAW,SAAS;KAC3B,OAAO,WAAW,SAAS;KAC3B,WAAW,WAAW,mBAAmB,wBAAwB,WAAW,SAAS;KACrF,SAAS,WAAW,WAAW;KAC/B,QAAQ,WAAW,UAAU;KAC7B,eAAe;IACjB;IAEA,IAAI,UACF,OACE,oBAAC,sBAAD;KAAyB;KAAgB;KAAS,UAAU,WAAW;KACpE,UAAA,MAAM,aAAa,OAAO;MACzB,GAAG;MACH;MACA,KAAK;MACL;MACA,iBAAiB;MACjB,0BAA0B;MAC1B,UAAU;KACZ,CAAC;IACe,CAAA;SAGpB,OAAO,MAAM,aAAa,OAA4C;KACpE,GAAG;KACH;KACA,KAAK;KACL;KACA,iBAAiB;KACjB,sBAAsB,UAAyC;MAC7D,WAAW,sBAAsB,KAAK;MACtC,oBAAoB,OAAO,EAAE;KAC/B;KACA,0BAA0B,WAAW,4BAA4B;IACnE,CAAC;GAEL;GACA,OAAO;EACT,CAAC;CACC,CAAA;AAER;AAEA,IAAM,eAAe;AAErB,aAAa,cAAc;AAC3B,aAAa,WAAW;AACxB,SAAS,cAAc;;;ACvWvB,IAAA,uBAAe"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { AriaLabelAttributes } from '../../utils/accessibility';
|
|
2
2
|
interface HorizontalScrollProps {
|
|
3
3
|
children?: React.ReactNode;
|
|
4
|
-
/**
|
|
5
|
-
* Bredden på elementet som potensielt vil scrolle horisontalt i px
|
|
6
|
-
*/
|
|
7
|
-
childWidth: number;
|
|
8
4
|
/** Sets the data-testid attribute. */
|
|
9
5
|
testId?: string;
|
|
10
6
|
}
|
|
@@ -14,15 +14,12 @@ $gradient:
|
|
|
14
14
|
|
|
15
15
|
&__viewport {
|
|
16
16
|
display: flex;
|
|
17
|
+
overflow: auto hidden;
|
|
17
18
|
|
|
18
19
|
&:focus-visible {
|
|
19
20
|
outline: spacers.getSpacer(4xs) solid palette.$black;
|
|
20
21
|
outline-offset: -1px;
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
-
&--overflow {
|
|
24
|
-
overflow: auto hidden;
|
|
25
|
-
}
|
|
26
23
|
}
|
|
27
24
|
|
|
28
25
|
&__indicator {
|
|
@@ -39,6 +39,8 @@ export interface LabelProps {
|
|
|
39
39
|
testId?: string;
|
|
40
40
|
/** Gives a custom classname to the afterLabelChildren wrapper. Used in checkbox and radiobutton */
|
|
41
41
|
afterLabelChildrenClassName?: string;
|
|
42
|
+
/** Renders formFieldTag, sublabel and statusDot inside the label element, underneath the label texts. Used by Checkbox and Radio. */
|
|
43
|
+
sublabelInsideLabel?: boolean;
|
|
42
44
|
}
|
|
43
45
|
declare const Label: FunctionComponent<LabelProps>;
|
|
44
46
|
export default Label;
|
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
@use '../../scss/font-mixins' as fonts;
|
|
6
6
|
@use '../../scss/breakpoints' as breakpoints;
|
|
7
7
|
|
|
8
|
+
// Re-maps text and status dot tokens so sublabel and statusDot stay readable on the dark background of a checked large Radio/Checkbox.
|
|
9
|
+
@mixin on-dark-tokens {
|
|
10
|
+
--color-base-subdued-text-dark: var(--color-base-text-ondark);
|
|
11
|
+
--component-statusdot-graphics-kiwi-onlight: var(--component-statusdot-graphics-kiwi-ondark);
|
|
12
|
+
--component-statusdot-graphics-banana-onlight: var(--component-statusdot-graphics-banana-ondark);
|
|
13
|
+
--component-statusdot-graphics-cherry-onlight: var(--component-statusdot-graphics-cherry-ondark);
|
|
14
|
+
--component-statusdot-graphics-blueberry-onlight: var(--component-statusdot-graphics-blueberry-ondark);
|
|
15
|
+
--component-statusdot-graphics-neutral-onlight: var(--component-statusdot-graphics-neutral-ondark);
|
|
16
|
+
}
|
|
17
|
+
|
|
8
18
|
.label-wrapper {
|
|
9
19
|
margin-bottom: spacers.getSpacer(2xs);
|
|
10
20
|
line-height: font-settings.$lineheight-size-xs;
|
|
@@ -44,6 +54,7 @@
|
|
|
44
54
|
}
|
|
45
55
|
|
|
46
56
|
&__texts {
|
|
57
|
+
display: block;
|
|
47
58
|
min-width: 0;
|
|
48
59
|
}
|
|
49
60
|
}
|
|
@@ -51,8 +62,13 @@
|
|
|
51
62
|
.sublabel {
|
|
52
63
|
@include fonts.sublabel;
|
|
53
64
|
|
|
65
|
+
display: block;
|
|
54
66
|
color: var(--color-base-subdued-text-dark);
|
|
55
67
|
|
|
68
|
+
& + & {
|
|
69
|
+
margin-top: var(--core-space-3xs);
|
|
70
|
+
}
|
|
71
|
+
|
|
56
72
|
&--subdued {
|
|
57
73
|
@include fonts.sublabel-subdued;
|
|
58
74
|
}
|