/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @noflow */ /* eslint-disable no-use-before-define */ import React from 'react'; import { Image, PixelRatio, Pressable, ScrollView, StyleSheet, Text, Switch, View } from 'react-native'; import Example from '../../shared/example'; const SCALE = PixelRatio.get(); const IMAGE_DIMENSION = 100 * SCALE; const IMAGE_SIZE = [IMAGE_DIMENSION, IMAGE_DIMENSION]; const iconSource = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMjAwJyBoZWlnaHQ9JzIwMCcgZmlsbD0iIzAwMDAwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMCAxMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwYXRoIGQ9Ik0yNS44NjcsNDguODUzQzMyLjgwNiw1MC4xNzYsNDYuNDYsNTIuNSw2MS4yMTUsNTIuNWgwLjAwNWM5LjcxLDAsMTguNDAxLTEuMDU3LDI1LjkzOC0yLjkxMyAgIGMwLjE1OS0wLjA0NiwwLjM1LTAuMTM1LDAuNTY1LTAuMTg3YzAuMjgyLTAuMDcyLDAuNTY1LTAuMTY0LDAuODQ0LTAuMjM4YzMuMTg0LTAuOTY0LDIuNTc3LTMuMDUxLDIuMTk5LTMuODUyICAgYy00LjE2Ni03LjcxOS0xNS4wODYtMjMuNDE1LTM1LjAyOC0yMy40MTVjLTIyLjE2OSwwLTMwLjI2MiwxMC42MzUtMzMuMTQsMTkuNTg5QzIyLjU0NSw0Mi4zMzMsMjIuNDA3LDQ3LjEzNSwyNS44NjcsNDguODUzeiAgICBNMjguNjc2LDM4LjAzMmMwLjAxMy0wLjAzNiwwLjYxNC0xLjYyNiwxLjkyMy0xLjAwOGMxLjEzMywwLjUzNSwwLjk2MSwxLjU2MywwLjg4NywxLjg1Yy0wLjAwNywwLjAyNC0wLjAxNCwwLjA0OC0wLjAyMSwwLjA3MyAgIGMwLDAuMDAxLTAuMDAxLDAuMDA0LTAuMDAxLDAuMDA0bDAsMGMtMC4yNDksMC45MjktMC40MDQsMi4wODYtMC4wMTcsMi44NmMwLjE2LDAuMzE5LDAuNDkyLDAuNzY4LDEuNTQyLDAuOTg3bDAuMzY2LDAuMDc3ICAgYzIwLjgxNiw0LjM2LDM2LDIuOTMzLDQ1LjY3OCwwLjYyNmwtMC4wMDQsMC4wMDJjMCwwLDAuMDA1LTAuMDAyLDAuMDA3LTAuMDAzYzAuMjEyLTAuMDUsMC40MjEtMC4xMDEsMC42MjgtMC4xNTIgICBjMC41MDktMC4wNSwxLjE3MywwLjA3OCwxLjM5OSwxYzAuMzUxLDEuNDI0LTAuOTczLDEuODk1LTEuMjE3LDEuOTY5Yy01LjMyNSwxLjI3OS0xMi4yNjYsMi4zMDYtMjAuODM1LDIuMzA3ICAgYy03LjUwNSwwLTE2LjI1NS0wLjc4Ny0yNi4yNTctMi44ODJsLTAuMzY0LTAuMDc3Yy0yLjEyLTAuNDQyLTMuMTExLTEuNjMzLTMuNTY5LTIuNTU1QzI3Ljk4NSw0MS40MjEsMjguMjgxLDM5LjQxNiwyOC42NzYsMzguMDMyICAgeiI+PC9wYXRoPjxjaXJjbGUgY3g9IjEwLjQ5MyIgY3k9IjIzLjQ1NSIgcj0iMC42MTkiPjwvY2lyY2xlPjxwYXRoIGQ9Ik0yLjA4LDI4LjMwOGMwLjY3Ni0wLjE3OCwwLjk4My0wLjM1MiwxLjE3NC0wLjVDNC42OSwyNi42OSw2LjUsMjcuNDgzLDcuNSwyOC4zNTd2MC4wMDJjMCwwLDEuNzExLDEuMjM1LDAuNzM3LDIuMjAyICAgYy0wLjk3NCwwLjk2NS0yLjMxOSwwLjAwNi0yLjMxOSwwLjAwNmwwLjAzNSwwLjAxNmMtMC4zMjctMC4yMDMtMC42LTAuNTYxLTAuNzgtMC41ODRjLTAuMzcsMC4yNi0wLjg3NiwwLjUtMS40NzYsMC41SDMuNyAgIGMwLDAtMS4zNDUsMC43MDksMC4xNzgsMS42NTJjMC4wMDEsMC4wMDEsMC4wMDIsMC4wNzIsMC4wMDQsMC4wNzNjMy45MzksMi4zNDIsOC4yNzEsNS43MDEsOC4yNzEsOC44OCAgIGMwLDAuNjkxLDAuMiwxNy4wNDIsMTcuNjI2LDI0LjczOWwwLjk2NywwLjQ0MmwtMC4xLDEuMDU5Yy0wLjQyMSw0LjM5LDEuMTQ1LDEwLjE5MSwxMC45OTMsMTIuODg4bDAuMTEzLDAuMDM4ICAgYzAuMDY3LDAuMDIzLDYuNzMyLDIuNDI5LDEwLjkwNywyLjQyOWMxLjU4NCwwLDIuMTU1LTAuMzUyLDIuMjQzLTAuNTYxYzAuMDg1LTAuMjAyLDAuNjEyLTIuMTY0LTYuMzMyLTkuMzg3bDAuMDAyLTAuMTgzICAgYzAsMC0yLjQ3Ny0zLjA3LDEuNTMzLTMuMDdjMC4wMSwwLDAuMDE5LDAsMC4wMjksMGMxLjI4NSwwLDIuNjA4LDAuMjE1LDMuOTgsMC4xODRjNC43NzEtMC4xMTcsOS4zMTYtMC40MjUsMTMuNTA2LTEuMDk2ICAgbDAuNDc0LTAuMDI4bDAuNjY4LDAuMTU4YzkuNjUxLDQuOTQ4LDE2LjczOCw3LjcxNiwxOS43MzgsNy43MTZ2MC4wMDZjMCwwLDAuMTY0LDAuMDExLDAuMjMsMC4wMDQgICBjLTAuMTg5LTAuNzIzLTIuMjMtMi44LTcuMjMtOS4wNzl2MC4wMjFjMCwwLTEuNTEyLTEuNjU4LDAuNzk3LTIuNjUzYzAuMDYzLTAuMDI2LDAuMDA4LDAuMDIzLDAuMDYtMC4wMDEgICBjOC42MzktMy41MDksMTMuNTAxLTguMjA0LDE1LjQxMS0xMS43NzVjMS4xNDUtMi4xMjksMC4yMDYtMi43ODQtMC42NTktMi45NzZjLTAuMzE3LTAuMDM4LTAuNjM0LTAuMDYyLTAuOTEyLTAuMDYyICAgYy0wLjIwNSwwLTAuMzc5LDAuMDEtMC41MjgsMC4wMjdsLTMuMTQzLDEuMjE0QzgzLjczMiw1My45MjYsNzMuMjE4LDU1LjUsNjEuMjIsNTUuNWMtMC4wMDIsMC0wLjAwNSwwLTAuMDA1LDAgICBjLTE1LjEyOCwwLTI5LjEwMS0yLjQzMi0zNi4wODMtMy43NzFsLTAuMTczLTAuMTExbC0wLjE2LTAuMTI2Yy01Ljg1OC0yLjY4MS01LjEzNy0xMC4yMDItNS4xMDMtMTAuNTE5bDAuMDYtMC4zICAgYzAuODk1LTIuODM4LDIuNDY3LTYuMzUyLDUuMjEzLTkuNzE5Yy0xLjgwOC0xLjM2OS00LjU5LTQuMTg4LTQuNDMtOC40OTRjMC4wNDYtMS4yNDQtMC40ODYtMi41MDgtMS40OTgtMy41NTkgICBjLTEuNDk4LTEuNTU1LTMuNzg1LTIuNDQ2LTYuMjc0LTIuNDQ2Yy0xLjc3LDAtMy41NTMsMC40NDItNS4yOTMsMS4zMTRjLTQuMDYxLDIuMDM1LTQuODU1LDQuNzM2LTUuNjkyLDcuNTk2ICAgYy0wLjEzNiwwLjQ2OC0wLjI4NCwwLjkzOS0wLjQzOCwxLjQxYy0wLjAwNiwwLjAxOS0wLjAyMiwwLjAzNS0wLjAyOCwwLjA1NkMwLjgzMywyOC40MjMsMS42OTEsMjguMzksMi4wOCwyOC4zMDh6IE0xMC40OTMsMTkuOTA4ICAgYzEuOTU2LDAsMy41NDgsMS41OTEsMy41NDgsMy41NDdjMCwxLjk1Ny0xLjU5MiwzLjU0OC0zLjU0OCwzLjU0OGMtMS45NTcsMC0zLjU0OC0xLjU5Mi0zLjU0OC0zLjU0OCAgIEM2Ljk0NCwyMS40OTksOC41MzYsMTkuOTA4LDEwLjQ5MywxOS45MDh6Ij48L3BhdGg+PC9nPjwvc3ZnPg=='; function ListItem(props) { return ( Text Text Text {}} style={styles.smallButton}> Button ); } function TextAlignmentExample(props) { return ( Left-to-Right language text alignment. {'\u0645\u0646 \u0627\u0644\u064A\u0645\u064A\u0646 ' + '\u0625\u0644\u0649 \u0627\u0644\u064A\u0633\u0627\u0631 ' + '\u0627\u0644\u0644\u063A\u0629 \u062F\u0648\u0646 ' + '\u0645\u062D\u0627\u0630\u0627\u0629 \u0627\u0644\u0646\u0635'} {'\u05DE\u05D9\u05DE\u05D9\u05DF \u05DC\u05E9\u05DE\u05D0\u05DC ' + '\u05D4\u05E9\u05E4\u05D4 \u05D1\u05DC\u05D9 ' + '\u05D9\u05D9\u05E9\u05D5\u05E8 \u05D8\u05E7\u05E1\u05D8'} ); } function withRTLState(Component) { return class extends React.Component { constructor(...args) { super(...args); this.state = { isRTL: false }; } render() { const isRTL = this.state.isRTL; const setRTL = (isRTL) => this.setState({ isRTL: isRTL }); return ; } }; } const RTLToggler = ({ isRTL, setRTL }) => { const toggleRTL = () => setRTL(!isRTL); return ( {isRTL ? 'RTL' : 'LTR'} ); }; const PaddingExample = withRTLState(({ isRTL, setRTL }) => { const color = 'teal'; return ( Styles paddingStart: 50, paddingEnd: 10 Demo: The {color} is padding. ); }); const MarginExample = withRTLState(({ isRTL, setRTL }) => { return ( Styles marginStart: 50, marginEnd: 10 Demo: The green is margin. ); }); const PositionExample = withRTLState(({ isRTL, setRTL }) => { return ( Styles start: 50 Demo: The orange is position. Styles end: 50 Demo: The orange is position. ); }); const BorderWidthExample = withRTLState(({ isRTL, setRTL }) => { return ( Styles borderStartWidth: 10, borderEndWidth: 50 Demo: ); }); const BorderColorExample = withRTLState(({ isRTL, setRTL }) => { return ( Styles borderStartColor: 'red', borderEndColor: 'green', Demo: ); }); const BorderRadiiExample = withRTLState(({ isRTL, setRTL }) => { return ( Styles borderTopStartRadius: 10, borderTopEndRadius: 20, borderBottomStartRadius: 30, borderBottomEndRadius: 40 Demo: ); }); function Block(props) { let description; if (props.description) { description = ( {props.description} ); } return ( {props.title} {description} {props.children} ); } const blockStyles = StyleSheet.create({ container: { borderRadius: 3, borderWidth: 0.5, borderColor: '#d6d7da', backgroundColor: '#ffffff', margin: 10, marginVertical: 5, overflow: 'hidden' }, titleContainer: { borderBottomWidth: 0.5, borderTopLeftRadius: 3, borderTopRightRadius: 2.5, borderBottomColor: '#d6d7da', backgroundColor: '#f6f7f8', paddingHorizontal: 10, paddingVertical: 10 }, titleText: { fontSize: 16, fontWeight: '500' }, descriptionText: { fontSize: 14 }, disclosure: { position: 'absolute', top: 0, right: 0, padding: 10 }, disclosureIcon: { width: 12, height: 8 }, children: { margin: 10 } }); class LayoutRTLExample extends React.Component { constructor(props) { super(props); this.state = { toggleStatus: {}, isRTL: false, containerWidth: 0 }; this._onDirectionChange = this._onDirectionChange.bind(this); } render() { return ( {this.state.isRTL ? 'Right-to-Left' : 'Left-to-Right'} No RTL flip RTL flip ); } _onDirectionChange() { this.setState({ isRTL: !this.state.isRTL }); } } const styles = StyleSheet.create({ container: { width: '100%' }, directionBox: { alignItems: 'center', flex: 1, flexDirection: 'row', backgroundColor: '#f8f8f8', borderWidth: 0.5, borderColor: 'black' }, directionText: { padding: 10, fontSize: 16, textAlign: 'center', fontWeight: 'bold' }, switchRow: { alignItems: 'center', justifyContent: 'space-between', paddingVertical: 5 }, list: { height: 120, marginBottom: 5, borderTopWidth: 0.5, borderLeftWidth: 0.5, borderRightWidth: 0.5, borderColor: '#e5e5e5' }, row: { height: 60, flexDirection: 'row', borderBottomWidth: 0.5, borderColor: '#e5e5e5' }, column1: { width: 60, padding: 6 }, column2: { flex: 1, padding: 6 }, column3: { justifyContent: 'center', padding: 6 }, icon: { width: 48, height: 48, borderWidth: 0.5, borderColor: '#e5e5e5' }, image: { width: 48, height: 48 }, img: { width: IMAGE_SIZE[0] / SCALE, height: IMAGE_SIZE[1] / SCALE }, view: { flex: 1 }, block: { padding: 10, alignItems: 'center' }, smallButton: { height: 24, width: 64 }, fontSizeSmall: { fontSize: 14 }, fontSizeExtraSmall: { fontSize: 12 }, textAlignLeft: { textAlign: 'left' }, textAlignRight: { textAlign: 'right' }, textAlignStart: { textAlign: 'start' }, textAlignEnd: { textAlign: 'end' }, flexDirectionRow: { flexDirection: 'row' }, bold: { fontWeight: 'bold' }, rtlToggler: { color: 'gray', padding: 8, textAlign: 'center', fontWeight: '500' } }); export default function LocalizationPage() { return ( ); }