Skip to content

Commit cb7bcf3

Browse files
authored
[dev-overlay] expandable error message container (#76297)
When the error message exceeds 200px in height, we want to collapse the part above 200px, and show a button to expand it. [CleanShot 2025-02-20 at 16.46.16.mp4 <span class="graphite__hidden">(uploaded via Graphite)</span> <img class="graphite__hidden" src="https://app.graphite.dev/api/v1/graphite/video/thumbnail/rKSEEwxbNzdFs9t0yyxN/ad657511-2c09-4180-85db-be7325f45d2f.mp4" />](https://app.graphite.dev/media/video/rKSEEwxbNzdFs9t0yyxN/ad657511-2c09-4180-85db-be7325f45d2f.mp4) Closes NDX-743
1 parent d55c00d commit cb7bcf3

File tree

2 files changed

+84
-6
lines changed

2 files changed

+84
-6
lines changed

packages/next/src/client/components/react-dev-overlay/_experimental/internal/components/errors/error-message/error-message.stories.tsx

+9
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ export const LongString: Story = {
3434
},
3535
}
3636

37+
export const SuperLongString: Story = {
38+
args: {
39+
errorMessage:
40+
'Lorem ipsum dolor sit, amet consectetur adipisicing elit. Praesentium molestiae, perspiciatis earum labore repudiandae aliquid atque soluta ullam. Quidem provident non at. Reprehenderit similique harum recusandae id est dolore temporibus!\n'.repeat(
41+
30
42+
),
43+
},
44+
}
45+
3746
export const ReactNode: Story = {
3847
args: {
3948
errorMessage: (
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useState, useRef, useLayoutEffect } from 'react'
12
import { noop as css } from '../../../helpers/noop-template'
23

34
export type ErrorMessageType = React.ReactNode
@@ -7,17 +8,47 @@ type ErrorMessageProps = {
78
}
89

910
export function ErrorMessage({ errorMessage }: ErrorMessageProps) {
11+
const [isExpanded, setIsExpanded] = useState(false)
12+
const [shouldTruncate, setShouldTruncate] = useState(false)
13+
const messageRef = useRef<HTMLParagraphElement>(null)
14+
15+
useLayoutEffect(() => {
16+
if (messageRef.current) {
17+
setShouldTruncate(messageRef.current.scrollHeight > 200)
18+
}
19+
}, [errorMessage])
20+
1021
return (
11-
<p
12-
id="nextjs__container_errors_desc"
13-
className="nextjs__container_errors_desc"
14-
>
15-
{errorMessage}
16-
</p>
22+
<div className="nextjs__container_errors_wrapper">
23+
<p
24+
ref={messageRef}
25+
id="nextjs__container_errors_desc"
26+
className={`nextjs__container_errors_desc ${shouldTruncate && !isExpanded ? 'truncated' : ''}`}
27+
>
28+
{errorMessage}
29+
</p>
30+
{shouldTruncate && !isExpanded && (
31+
<>
32+
<div className="nextjs__container_errors_gradient_overlay" />
33+
<button
34+
onClick={() => setIsExpanded(true)}
35+
className="nextjs__container_errors_expand_button"
36+
aria-expanded={isExpanded}
37+
aria-controls="nextjs__container_errors_desc"
38+
>
39+
Show More
40+
</button>
41+
</>
42+
)}
43+
</div>
1744
)
1845
}
1946

2047
export const styles = css`
48+
.nextjs__container_errors_wrapper {
49+
position: relative;
50+
}
51+
2152
.nextjs__container_errors_desc {
2253
margin: 0;
2354
margin-left: var(--size-1);
@@ -29,4 +60,42 @@ export const styles = css`
2960
overflow-wrap: break-word;
3061
white-space: pre-wrap;
3162
}
63+
64+
.nextjs__container_errors_desc.truncated {
65+
max-height: 200px;
66+
overflow: hidden;
67+
}
68+
69+
.nextjs__container_errors_gradient_overlay {
70+
position: absolute;
71+
bottom: 0;
72+
left: 0;
73+
right: 0;
74+
height: 85px;
75+
background: linear-gradient(
76+
180deg,
77+
rgba(250, 250, 250, 0) 0%,
78+
var(--color-background-200) 100%
79+
);
80+
}
81+
82+
.nextjs__container_errors_expand_button {
83+
position: absolute;
84+
bottom: 10px;
85+
left: 50%;
86+
transform: translateX(-50%);
87+
display: flex;
88+
align-items: center;
89+
padding: 6px 8px;
90+
background: var(--color-background-100);
91+
border: 1px solid var(--color-gray-alpha-400);
92+
border-radius: 999px;
93+
box-shadow:
94+
0px 2px 2px var(--color-gray-alpha-100),
95+
0px 8px 8px -8px var(--color-gray-alpha-100);
96+
font-size: 13px;
97+
cursor: pointer;
98+
color: var(--color-gray-900);
99+
font-weight: 500;
100+
}
32101
`

0 commit comments

Comments
 (0)