/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow strict-local * @format */ import RNTesterText from '../components/RNTesterText'; import RNTOption from './RNTOption'; import * as React from 'react'; import {useState} from 'react'; import {StyleSheet, Text, View} from 'react-native'; const PANGRAMS = { arabic: 'صِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَت — يَحظى الضَجيعُ بِها نَجلاءَ مِعطارِ', chinese: 'Innovation in China 中国智造,慧及全球 0123456789', english: 'The quick brown fox jumps over the lazy dog.', emoji: '🙏🏾🚗💩😍🤯👩🏽‍🔧🇨🇦💯', german: 'Falsches Üben von Xylophonmusik quält jeden größeren Zwerg', greek: 'Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός', hebrew: 'דג סקרן שט בים מאוכזב ולפתע מצא חברה', hindi: 'ऋषियों को सताने वाले दुष्ट राक्षसों के राजा रावण का सर्वनाश करने वाले विष्णुवतार भगवान श्रीराम, अयोध्या के महाराज दशरथ के बड़े सपुत्र थे।', igbo: 'Nne, nna, wepụ he’l’ụjọ dum n’ime ọzụzụ ụmụ, vufesi obi nye Chukwu, ṅụrịanụ, gbakọọnụ kpaa, kwee ya ka o guzoshie ike; ọ ghaghị ito, nwapụta ezi agwa', irish: 'D’fhuascail Íosa Úrmhac na hÓighe Beannaithe pór Éava agus Ádhaimh', japanese: '色は匂へど 散りぬるを 我が世誰ぞ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず', korean: '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다', norwegian: 'Vår sære Zulu fra badeøya spilte jo whist og quickstep i min taxi.', polish: 'Jeżu klątw, spłódź Finom część gry hańb!', romanian: 'Muzicologă în bej vând whisky și tequila, preț fix.', russian: 'Эх, чужак, общий съём цен шляп (юфть) – вдрызг!', swedish: 'Yxskaftbud, ge vår WC-zonmö IQ-hjälp.', thai: 'เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอยฯ', }; export default function TextLegend(): React.Node { const [language, setLanguage] = useState('english'); const [alignment, setAlignment] = useState('left'); // $FlowFixMe[missing-empty-array-annot] const [textMetrics, setTextMetrics] = useState([]); const [fontSize, setFontSize] = useState(50); return ( setFontSize(fontSize + 3)}> Increase size setFontSize(fontSize - 3)}> Decrease size Language {Object.keys(PANGRAMS).map(lang => ( setLanguage(lang)} selected={lang === language} style={styles.option} /> ))} {textMetrics.map( ({x, y, width, height, capHeight, ascender, descender, xHeight}) => { return [ , Baseline , , Capheight , , X-height , , Descender , , End of text , , Start of text , ]; }, )} { setTextMetrics(event.nativeEvent.lines); }} /* $FlowFixMe[incompatible-type] Natural Inference rollout. See * https://fburl.com/workplace/6291gfvu */ style={{ fontSize: fontSize, textAlign: alignment, }}> { /* $FlowFixMe[invalid-computed-prop] Natural Inference rollout. See * https://fburl.com/workplace/6291gfvu */ PANGRAMS[language] } Alignment: setAlignment('left')} selected={alignment === 'left'} style={styles.option} /> setAlignment('center')} selected={alignment === 'center'} style={styles.option} /> setAlignment('right')} selected={alignment === 'right'} style={styles.option} /> ); } const styles = StyleSheet.create({ row: { flexDirection: 'row', flexWrap: 'wrap', margin: 6, alignItems: 'center', }, title: { fontWeight: 'bold', }, block: { borderColor: 'rgba(0,0,0, 0.1)', borderBottomWidth: 1, padding: 6, }, option: { margin: 4, }, });