-
Notifications
You must be signed in to change notification settings - Fork 179
/
fontPreview.js
93 lines (83 loc) · 2.31 KB
/
fontPreview.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* External dependencies
*/
import PropTypes from 'prop-types';
import styled from 'styled-components';
import { rgba } from 'polished';
import { useEffect } from 'react';
/**
* Internal dependencies
*/
import { useFont } from '../../../app';
import { ALLOWED_EDITOR_PAGE_WIDTHS, PAGE_WIDTH } from '../../../constants';
import { FontPropType } from '../../../types';
const PREVIEW_EM_SCALE = ALLOWED_EDITOR_PAGE_WIDTHS[0] / PAGE_WIDTH;
const Preview = styled.button`
position: relative;
background: ${({ theme }) => rgba(theme.colors.fg.v1, 0.1)};
padding: 6px;
margin-bottom: 12px;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
width: 100%;
border: none;
cursor: pointer;
`;
const Text = styled.span`
background: none;
font-size: ${({ fontSize }) => fontSize * PREVIEW_EM_SCALE}px;
font-weight: ${({ fontWeight }) => fontWeight};
font-family: ${({ fontFamily }) => fontFamily};
color: ${({ theme }) => theme.colors.fg.v1};
`;
function FontPreview({ title, font, fontSize, fontWeight, content, onClick }) {
const {
actions: { maybeEnqueueFontStyle },
} = useFont();
useEffect(() => {
maybeEnqueueFontStyle([
{
font,
fontWeight,
content,
},
]);
}, [font, fontWeight, content, maybeEnqueueFontStyle]);
return (
<Preview onClick={onClick}>
<Text
fontSize={fontSize}
fontWeight={fontWeight}
fontFamily={font.family}
>
{title}
</Text>
</Preview>
);
}
FontPreview.propTypes = {
title: PropTypes.string,
font: FontPropType,
fontSize: PropTypes.number,
fontWeight: PropTypes.number,
content: PropTypes.string,
onClick: PropTypes.func,
};
export default FontPreview;