Skip to content

Commit 13995fa

Browse files
authored
Merge pull request #2017 from navikt/sticky-close-position
Lukker sticky beholder posisjon på siden
2 parents 77f9364 + 4ee73d2 commit 13995fa

File tree

4 files changed

+45
-13
lines changed

4 files changed

+45
-13
lines changed

src/components/_common/accordion/Accordion.tsx

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect, useState } from 'react';
1+
import React, { useEffect, useRef, useState } from 'react';
22
import { Accordion as DSAccordion } from '@navikt/ds-react';
33
import { ParsedHtml } from 'components/_common/parsed-html/ParsedHtml';
44
import { AnalyticsEvents, logAmplitudeEvent } from 'utils/amplitude';
@@ -7,6 +7,7 @@ import { usePageContentProps } from 'store/pageContext';
77
import { EditorHelp } from 'components/_editor-only/editor-help/EditorHelp';
88
import { PartConfigAccordion } from 'components/parts/accordion/AccordionPart';
99
import { classNames } from 'utils/classnames';
10+
import { handleStickyScrollOffset } from 'utils/scroll-to';
1011

1112
import defaultHtml from 'components/_common/parsed-html/DefaultHtmlStyling.module.scss';
1213
import styles from './Accordion.module.scss';
@@ -15,6 +16,8 @@ type AccordionProps = PartConfigAccordion;
1516
type PanelItem = AccordionProps['accordion'][number];
1617

1718
export const Accordion = ({ accordion }: AccordionProps) => {
19+
const itemRefs = useRef<(HTMLDivElement | null)[]>([]);
20+
1821
const { editorView } = usePageContentProps();
1922
const [openAccordions, setOpenAccordions] = useState<number[]>([]);
2023

@@ -27,6 +30,8 @@ export const Accordion = ({ accordion }: AccordionProps) => {
2730
useShortcuts({ shortcut: Shortcuts.SEARCH, callback: expandAll });
2831

2932
const openChangeHandler = (isOpening: boolean, tittel: string, index: number) => {
33+
handleStickyScrollOffset(isOpening, itemRefs.current[index]);
34+
3035
if (isOpening) {
3136
setOpenAccordions([...openAccordions, index]);
3237
} else {
@@ -64,6 +69,10 @@ export const Accordion = ({ accordion }: AccordionProps) => {
6469
className={styles.item}
6570
open={openAccordions.includes(index)}
6671
onOpenChange={(open) => openChangeHandler(open, item.title, index)}
72+
ref={(el) => {
73+
itemRefs.current[index] = el;
74+
}}
75+
tabIndex={-1}
6776
>
6877
<DSAccordion.Header className={styles.header} id={item.anchorId}>
6978
{!isValid && (

src/components/_common/expandable/Expandable.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ExpansionCard } from '@navikt/ds-react';
33
import { BarChartIcon, BriefcaseClockIcon, CalendarIcon, TasklistIcon } from '@navikt/aksel-icons';
44
import { AnalyticsEvents, logAmplitudeEvent } from 'utils/amplitude';
55
import { classNames } from 'utils/classnames';
6-
import { smoothScrollToTarget } from 'utils/scroll-to';
6+
import { smoothScrollToTarget, handleStickyScrollOffset } from 'utils/scroll-to';
77
import { Shortcuts, useShortcuts } from 'utils/useShortcuts';
88
import { ProductDetailType } from 'types/content-props/product-details';
99

@@ -40,6 +40,8 @@ export const Expandable = ({
4040

4141
const toggleExpandCollapse = (isOpening: boolean, tittel: string) => {
4242
setIsOpen(isOpening);
43+
handleStickyScrollOffset(isOpening, accordionRef.current);
44+
4345
logAmplitudeEvent(isOpening ? AnalyticsEvents.ACC_EXPAND : AnalyticsEvents.ACC_COLLAPSE, {
4446
tittel,
4547
opprinnelse: analyticsOriginTag || 'utvidbar tekst',
@@ -117,6 +119,7 @@ export const Expandable = ({
117119
onToggle={(isOpen) => toggleExpandCollapse(isOpen, title)}
118120
open={isOpen}
119121
aria-label={ariaLabel || title}
122+
tabIndex={-1}
120123
>
121124
<ExpansionCard.Header className={style.header}>
122125
{getHeaderIcon()}

src/components/parts/read-more/ReadMorePart.tsx

+18-11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react';
1+
import React, { useRef, useState } from 'react';
22
import { ReadMore } from '@navikt/ds-react';
33
import { EditorHelp } from 'components/_editor-only/editor-help/EditorHelp';
44
import { ParsedHtml } from 'components/_common/parsed-html/ParsedHtml';
@@ -7,6 +7,7 @@ import { Shortcuts, useShortcuts } from 'utils/useShortcuts';
77
import { PartComponentProps, PartType } from 'types/component-props/parts';
88
import { ProcessedHtmlProps } from 'types/processed-html-props';
99
import { classNames } from 'utils/classnames';
10+
import { handleStickyScrollOffset } from 'utils/scroll-to';
1011

1112
import defaultHtml from 'components/_common/parsed-html/DefaultHtmlStyling.module.scss';
1213
import styles from './ReadMorePart.module.scss';
@@ -18,6 +19,8 @@ export type PartConfigReadMore = {
1819

1920
export const ReadMorePart = ({ config }: PartComponentProps<PartType.ReadMore>) => {
2021
const [isOpen, setIsOpen] = useState(false);
22+
const divRef = useRef<HTMLDivElement | null>(null);
23+
2124
useShortcuts({
2225
shortcut: Shortcuts.SEARCH,
2326
callback: () => setIsOpen(true),
@@ -28,6 +31,8 @@ export const ReadMorePart = ({ config }: PartComponentProps<PartType.ReadMore>)
2831
}
2932

3033
const openChangeHandler = (isOpening: boolean, tittel: string) => {
34+
handleStickyScrollOffset(isOpening, divRef.current);
35+
3136
setIsOpen(isOpening);
3237
logAmplitudeEvent(isOpening ? AnalyticsEvents.ACC_EXPAND : AnalyticsEvents.ACC_COLLAPSE, {
3338
tittel,
@@ -39,15 +44,17 @@ export const ReadMorePart = ({ config }: PartComponentProps<PartType.ReadMore>)
3944
const { title, html } = config;
4045

4146
return (
42-
<ReadMore
43-
header={title}
44-
open={isOpen}
45-
onOpenChange={(isOpen) => openChangeHandler(isOpen, title)}
46-
className={styles.readMore}
47-
>
48-
<div className={classNames(defaultHtml.html, 'parsedHtml')}>
49-
<ParsedHtml htmlProps={html} />
50-
</div>
51-
</ReadMore>
47+
<div tabIndex={-1} ref={divRef}>
48+
<ReadMore
49+
header={title}
50+
open={isOpen}
51+
onOpenChange={(isOpen) => openChangeHandler(isOpen, title)}
52+
className={styles.readMore}
53+
>
54+
<div className={classNames(defaultHtml.html, 'parsedHtml')}>
55+
<ParsedHtml htmlProps={html} />
56+
</div>
57+
</ReadMore>
58+
</div>
5259
);
5360
};

src/utils/scroll-to.ts

+13
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,16 @@ export const smoothScrollToTarget = (targetId: string, offset = 0) => {
2121
targetElement.focus({ preventScroll: true });
2222
}
2323
};
24+
25+
export const handleStickyScrollOffset = (isOpening: boolean, current: HTMLDivElement | null) => {
26+
if (!isOpening && current) {
27+
const verticalPosition = current.getBoundingClientRect().top;
28+
29+
if (verticalPosition < 0) {
30+
window.scrollBy({
31+
top: verticalPosition,
32+
behavior: 'instant',
33+
});
34+
}
35+
}
36+
};

0 commit comments

Comments
 (0)