Skip to content

Commit 4747fea

Browse files
authoredNov 19, 2020
Merge pull request #12845 from Tomastomaslol/12324_zoom_buttons_in_docs_do_not_work
Addon-docs: Fix Preview scaling with transform instead of zoom
2 parents 428b6e0 + 790b371 commit 4747fea

File tree

7 files changed

+242
-79
lines changed

7 files changed

+242
-79
lines changed
 
+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import React, { CSSProperties, useEffect, useState } from 'react';
2+
import { Zoom } from './Zoom';
3+
4+
export default {
5+
component: Zoom,
6+
title: 'Basics/Zoom',
7+
argTypes: {
8+
scale: {
9+
control: { type: 'range', min: 0.2, max: 30, step: 0.02 },
10+
},
11+
},
12+
};
13+
const EXAMPLE_ELEMENT = (
14+
<div
15+
style={{
16+
width: 2000,
17+
height: 2000,
18+
border: '10px solid orangered',
19+
background: `url('data:image/png;base64,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')`,
20+
}}
21+
/>
22+
);
23+
24+
const TemplateElement = (args) => <Zoom.Element {...args} />;
25+
26+
export const elementActualSize = TemplateElement.bind({});
27+
28+
elementActualSize.args = {
29+
scale: 1,
30+
children: EXAMPLE_ELEMENT,
31+
};
32+
33+
export const elementZoomedIn = TemplateElement.bind({});
34+
35+
elementZoomedIn.args = {
36+
scale: 0.7,
37+
children: EXAMPLE_ELEMENT,
38+
};
39+
40+
export const elementZoomedOut = TemplateElement.bind({});
41+
42+
elementZoomedOut.args = {
43+
scale: 3,
44+
children: EXAMPLE_ELEMENT,
45+
};
46+
47+
const style: CSSProperties = {
48+
width: '500px',
49+
height: '500px',
50+
border: '2px solid hotpink',
51+
position: 'relative',
52+
};
53+
54+
const TemplateIFrame = (args) => {
55+
const iFrameRef = React.useRef<HTMLIFrameElement>(null);
56+
const [scale, setScale] = useState(1);
57+
const [loaded, hasLoaded] = useState(false);
58+
59+
useEffect(() => {
60+
if (loaded) {
61+
setScale(args.scale);
62+
}
63+
}, [args.scale, loaded]);
64+
return (
65+
<Zoom.IFrame iFrameRef={iFrameRef} scale={scale} active={args.active}>
66+
<iframe
67+
id="iframe"
68+
title="UI Panel"
69+
onLoad={() => hasLoaded(true)}
70+
src="/iframe.html?id=ui-panel--default&viewMode=story"
71+
style={style}
72+
ref={iFrameRef}
73+
allowFullScreen
74+
/>
75+
</Zoom.IFrame>
76+
);
77+
};
78+
export const iFrameActualSize = TemplateIFrame.bind({});
79+
80+
iFrameActualSize.args = {
81+
scale: 1,
82+
active: true,
83+
};
84+
85+
export const iFrameZoomedIn = TemplateIFrame.bind({});
86+
87+
iFrameZoomedIn.args = {
88+
scale: 0.7,
89+
active: true,
90+
};
91+
92+
export const iFrameZoomedOut = TemplateIFrame.bind({});
93+
94+
iFrameZoomedOut.args = {
95+
scale: 3,
96+
active: true,
97+
};

‎lib/components/src/Zoom/Zoom.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import window from 'global';
2+
import { ZoomElement as Element } from './ZoomElement';
3+
import { ZoomIFrame as IFrame } from './ZoomIFrame';
4+
5+
export const browserSupportsCssZoom = (): boolean =>
6+
window.document.implementation.createHTMLDocument().body.style.zoom !== undefined;
7+
8+
export const Zoom = {
9+
Element,
10+
IFrame,
11+
};
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import React, { ReactElement, useEffect, useState } from 'react';
2+
import { styled } from '@storybook/theming';
3+
import { browserSupportsCssZoom } from './Zoom';
4+
5+
const ZoomElementWrapper = styled.div<{ scale: number; height: number }>(({ scale = 1, height }) =>
6+
browserSupportsCssZoom()
7+
? {
8+
'> *': {
9+
zoom: 1 / scale,
10+
},
11+
}
12+
: {
13+
height: height + 50,
14+
transformOrigin: 'top left',
15+
transform: `scale(${1 / scale})`,
16+
}
17+
);
18+
type ZoomProps = {
19+
scale: number;
20+
children: ReactElement | ReactElement[];
21+
};
22+
23+
export function ZoomElement({ scale, children }: ZoomProps) {
24+
const componentWrapperRef = React.useRef<HTMLDivElement>(null);
25+
const [height, setHeight] = useState(0);
26+
27+
useEffect(() => {
28+
if (componentWrapperRef.current) {
29+
setHeight(componentWrapperRef.current.getBoundingClientRect().height);
30+
}
31+
}, [scale, componentWrapperRef.current]);
32+
33+
return (
34+
<ZoomElementWrapper scale={scale} height={height}>
35+
<div ref={componentWrapperRef} className="innerZoomElementWrapper">
36+
{children}
37+
</div>
38+
</ZoomElementWrapper>
39+
);
40+
}
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { Component, ReactElement } from 'react';
2+
import { browserSupportsCssZoom } from './Zoom';
3+
4+
export type IZoomIFrameProps = {
5+
scale: number;
6+
children: ReactElement<HTMLIFrameElement>;
7+
iFrameRef: React.MutableRefObject<HTMLIFrameElement>;
8+
active?: boolean;
9+
};
10+
11+
export class ZoomIFrame extends Component<IZoomIFrameProps> {
12+
iframe: HTMLIFrameElement = null;
13+
14+
componentDidMount() {
15+
const { iFrameRef } = this.props;
16+
this.iframe = iFrameRef.current;
17+
}
18+
19+
shouldComponentUpdate(nextProps: IZoomIFrameProps) {
20+
const { scale, active } = this.props;
21+
22+
if (scale !== nextProps.scale) {
23+
this.setIframeInnerZoom(nextProps.scale);
24+
}
25+
26+
if (active !== nextProps.active) {
27+
this.iframe.setAttribute('data-is-storybook', nextProps.active ? 'true' : 'false');
28+
}
29+
30+
// this component renders an iframe, which gets updates via post-messages
31+
// never update this component, it will cause the iframe to refresh
32+
return false;
33+
}
34+
35+
setIframeInnerZoom(scale: number) {
36+
try {
37+
if (browserSupportsCssZoom()) {
38+
Object.assign(this.iframe.contentDocument.body.style, {
39+
zoom: 1 / scale,
40+
});
41+
} else {
42+
Object.assign(this.iframe.contentDocument.body.style, {
43+
width: `${scale * 100}%`,
44+
height: `${scale * 100}%`,
45+
transform: `scale(${1 / scale})`,
46+
transformOrigin: 'top left',
47+
});
48+
}
49+
} catch (e) {
50+
this.setIframeZoom(scale);
51+
}
52+
}
53+
54+
setIframeZoom(scale: number) {
55+
Object.assign(this.iframe.style, {
56+
width: `${scale * 100}%`,
57+
height: `${scale * 100}%`,
58+
transform: `scale(${1 / scale})`,
59+
transformOrigin: 'top left',
60+
});
61+
}
62+
63+
render() {
64+
const { children } = this.props;
65+
return children;
66+
}
67+
}

‎lib/components/src/blocks/Preview.tsx

+15-16
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Source, SourceProps } from './Source';
77
import { ActionBar, ActionItem } from '../ActionBar/ActionBar';
88
import { Toolbar } from './Toolbar';
99
import { ZoomContext } from './ZoomContext';
10+
import { Zoom } from '../Zoom/Zoom';
1011

1112
export interface PreviewProps {
1213
isColumn?: boolean;
@@ -20,15 +21,15 @@ export interface PreviewProps {
2021

2122
type layout = 'padded' | 'fullscreen' | 'centered';
2223

23-
const ChildrenContainer = styled.div<PreviewProps & { zoom: number; layout: layout }>(
24+
const ChildrenContainer = styled.div<PreviewProps & { layout: layout }>(
2425
({ isColumn, columns, layout }) => ({
2526
display: isColumn || !columns ? 'block' : 'flex',
2627
position: 'relative',
2728
flexWrap: 'wrap',
2829
overflow: 'auto',
2930
flexDirection: isColumn ? 'column' : 'row',
3031

31-
'& > *': isColumn
32+
'& .innerZoomElementWrapper > *': isColumn
3233
? {
3334
width: layout !== 'fullscreen' ? 'calc(100% - 20px)' : '100%',
3435
display: 'block',
@@ -43,7 +44,7 @@ const ChildrenContainer = styled.div<PreviewProps & { zoom: number; layout: layo
4344
? {
4445
padding: '30px 20px',
4546
margin: -10,
46-
'& > *': {
47+
'& .innerZoomElementWrapper > *': {
4748
width: 'auto',
4849
border: '10px solid transparent!important',
4950
},
@@ -59,13 +60,10 @@ const ChildrenContainer = styled.div<PreviewProps & { zoom: number; layout: layo
5960
alignItems: 'center',
6061
}
6162
: {},
62-
({ zoom = 1 }) => ({
63-
'> *': {
64-
zoom: 1 / zoom,
65-
},
66-
}),
6763
({ columns }) =>
68-
columns && columns > 1 ? { '> *': { minWidth: `calc(100% / ${columns} - 20px)` } } : {}
64+
columns && columns > 1
65+
? { '.innerZoomElementWrapper > *': { minWidth: `calc(100% / ${columns} - 20px)` } }
66+
: {}
6967
);
7068

7169
const StyledSource = styled(Source)<{}>(({ theme }) => ({
@@ -217,15 +215,16 @@ const Preview: FunctionComponent<PreviewProps> = ({
217215
<ChildrenContainer
218216
isColumn={isColumn || !Array.isArray(children)}
219217
columns={columns}
220-
zoom={scale}
221218
layout={layout}
222219
>
223-
{Array.isArray(children) ? (
224-
// eslint-disable-next-line react/no-array-index-key
225-
children.map((child, i) => <div key={i}>{child}</div>)
226-
) : (
227-
<div>{children}</div>
228-
)}
220+
<Zoom.Element scale={scale}>
221+
{Array.isArray(children) ? (
222+
// eslint-disable-next-line react/no-array-index-key
223+
children.map((child, i) => <div key={i}>{child}</div>)
224+
) : (
225+
<div>{children}</div>
226+
)}
227+
</Zoom.Element>
229228
</ChildrenContainer>
230229
<ActionBar actionItems={actionItems} />
231230
</Relative>

‎lib/components/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export { ActionBar } from './ActionBar/ActionBar';
1515
export { Spaced } from './spaced/Spaced';
1616
export { Placeholder } from './placeholder/placeholder';
1717
export { ScrollArea } from './ScrollArea/ScrollArea';
18+
export { Zoom } from './Zoom/Zoom';
1819

1920
// Forms
2021
export { Button } from './Button/Button';
+11-63
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
import window from 'global';
2-
import React, { Component, IframeHTMLAttributes } from 'react';
3-
1+
import React, { IframeHTMLAttributes } from 'react';
42
import { styled } from '@storybook/theming';
5-
6-
const FIREFOX_BROWSER = 'Firefox';
3+
import { Zoom } from '@storybook/components';
74

85
const StyledIframe = styled.iframe({
96
position: 'absolute',
@@ -25,70 +22,21 @@ export interface IFrameProps {
2522
active: boolean;
2623
}
2724

28-
export class IFrame extends Component<IFrameProps & IframeHTMLAttributes<HTMLIFrameElement>> {
29-
iframe: HTMLIFrameElement = null;
30-
31-
componentDidMount() {
32-
const { id } = this.props;
33-
this.iframe = window.document.getElementById(id);
34-
}
35-
36-
shouldComponentUpdate(nextProps: IFrameProps) {
37-
const { scale, active } = this.props;
38-
39-
if (scale !== nextProps.scale) {
40-
this.setIframeInnerZoom(nextProps.scale);
41-
}
42-
43-
if (active !== nextProps.active) {
44-
this.iframe.setAttribute('data-is-storybook', nextProps.active ? 'true' : 'false');
45-
}
46-
47-
// this component renders an iframe, which gets updates via post-messages
48-
// never update this component, it will cause the iframe to refresh
49-
return false;
50-
}
51-
52-
setIframeInnerZoom(scale: number) {
53-
try {
54-
if (window.navigator.userAgent.indexOf(FIREFOX_BROWSER) !== -1) {
55-
Object.assign(this.iframe.contentDocument.body.style, {
56-
width: `${scale * 100}%`,
57-
height: `${scale * 100}%`,
58-
transform: `scale(${1 / scale})`,
59-
transformOrigin: 'top left',
60-
});
61-
} else {
62-
Object.assign(this.iframe.contentDocument.body.style, {
63-
zoom: 1 / scale,
64-
});
65-
}
66-
} catch (e) {
67-
this.setIframeZoom(scale);
68-
}
69-
}
70-
71-
setIframeZoom(scale: number) {
72-
Object.assign(this.iframe.style, {
73-
width: `${scale * 100}%`,
74-
height: `${scale * 100}%`,
75-
transform: `scale(${1 / scale})`,
76-
transformOrigin: 'top left',
77-
});
78-
}
79-
80-
render() {
81-
const { id, title, src, allowFullScreen, scale, active, ...rest } = this.props;
82-
return (
25+
export function IFrame(props: IFrameProps & IframeHTMLAttributes<HTMLIFrameElement>) {
26+
const { active, id, title, src, allowFullScreen, scale, ...rest } = props;
27+
const iFrameRef = React.useRef<HTMLIFrameElement>(null);
28+
return (
29+
<Zoom.IFrame scale={scale} active={active} iFrameRef={iFrameRef}>
8330
<StyledIframe
84-
onLoad={() => this.iframe.setAttribute('data-is-loaded', 'true')}
8531
data-is-storybook={active ? 'true' : 'false'}
32+
onLoad={(e) => e.currentTarget.setAttribute('data-is-loaded', 'true')}
8633
id={id}
8734
title={title}
8835
src={src}
8936
allowFullScreen={allowFullScreen}
37+
ref={iFrameRef}
9038
{...rest}
9139
/>
92-
);
93-
}
40+
</Zoom.IFrame>
41+
);
9442
}

0 commit comments

Comments
 (0)
Please sign in to comment.