Skip to content

Commit db35207

Browse files
jstarplMint de Wit
authored andcommitted
wip: Preview popup (next gen floating inspector)
1 parent b20b4a4 commit db35207

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
.preview-popUp {
2+
display: grid;
3+
grid-template-columns: 1fr;
4+
grid-template-rows: repeat(4, auto);
5+
grid-template-areas:
6+
'preview'
7+
'controls'
8+
'content-info'
9+
'warnings';
10+
11+
border: 1px solid var(--sofie-segment-layer-hover-popup-border);
12+
background: var(--sofie-segment-layer-hover-popup-background);
13+
box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.5);
14+
border-radius: 5px;
15+
overflow: hidden;
16+
pointer-events: none;
17+
18+
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.6);
19+
20+
&--large {
21+
}
22+
23+
&-small {
24+
}
25+
}
26+
27+
.preview-popUp__preview {
28+
}
29+
30+
.preview-popUp__controls {
31+
}
32+
33+
.preview-popUp__content-info {
34+
}
35+
36+
.preview-popUp__warnings {
37+
}
38+
39+
.preview-popUp__warning-row {
40+
display: grid;
41+
grid-template-columns: 1fr;
42+
grid-auto-rows: auto;
43+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import React, { useMemo, useState } from 'react'
2+
import classNames from 'classnames'
3+
import { usePopper } from 'react-popper'
4+
import { Padding, Placement, VirtualElement } from '@popperjs/core'
5+
6+
export function PreviewPopUp({
7+
anchor,
8+
padding,
9+
placement,
10+
size,
11+
preview,
12+
controls,
13+
contentInfo,
14+
warnings,
15+
}: {
16+
anchor: HTMLElement | VirtualElement
17+
padding: Padding
18+
placement: Placement
19+
size: 'small' | 'large'
20+
preview?: React.ReactNode
21+
controls?: React.ReactNode
22+
contentInfo?: React.ReactNode
23+
warnings?: React.ReactNode
24+
}): React.JSX.Element {
25+
const warningsCount = React.Children.count(warnings)
26+
27+
const [popperEl, setPopperEl] = useState<HTMLDivElement | null>(null)
28+
const popperOptions = useMemo(
29+
() => ({
30+
placement: placement ?? 'top',
31+
strategy: 'fixed' as const,
32+
modifiers: [
33+
{
34+
name: 'flip',
35+
options: {
36+
fallbackPlacements: [
37+
'top-start',
38+
'top-end',
39+
'right',
40+
'right-start',
41+
'right-end',
42+
'left',
43+
'left-start',
44+
'left-end',
45+
'bottom',
46+
'bottom-start',
47+
'bottom-end',
48+
],
49+
rootBoundary: 'viewport',
50+
padding: padding ?? 0,
51+
},
52+
},
53+
{
54+
name: 'preventOverflow',
55+
options: {
56+
padding: padding ?? 0, // additional padding placed here (like Header, etc.)
57+
},
58+
},
59+
],
60+
}),
61+
[padding]
62+
)
63+
const { styles, attributes } = usePopper(anchor, popperEl, popperOptions)
64+
65+
return (
66+
<div
67+
ref={setPopperEl}
68+
className={classNames('preview-popUp', {
69+
'preview-popUp--large': size === 'large',
70+
'preview-popUp--small': size === 'small',
71+
})}
72+
style={styles.popper}
73+
{...attributes.popper}
74+
>
75+
{preview && <div className="preview-popUp__preview">{preview}</div>}
76+
{controls && <div className="preview-popUp__controls">{controls}</div>}
77+
{contentInfo && <div className="preview-popUp__content-info">{contentInfo}</div>}
78+
{warnings && warningsCount > 0 && (
79+
<div className="preview-popUp__warnings">
80+
{React.Children.map(warnings, (child) => (
81+
<div className="preview-popUp__warning-row">{child}</div>
82+
))}
83+
</div>
84+
)}
85+
</div>
86+
)
87+
}

packages/webui/src/client/styles/rundownView.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ $segment-layer-separator-color: transparentize(#000, 0.5);
4040

4141
:root {
4242
--popdown: 2rem;
43+
44+
--sofie-segment-layer-hover-popup-border: #838383;
45+
--sofie-segment-layer-hover-popup-background: #333333;
4346
}
4447
$break-width: 35rem;
4548

0 commit comments

Comments
 (0)