@ledvance/base 1.3.81 → 1.3.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/localazy.json CHANGED
@@ -1200,7 +1200,10 @@
1200
1200
  "MATCH:setting_set_passwd",
1201
1201
  "MATCH:camera_user",
1202
1202
  "MATCH:camera_motiondetection",
1203
- "MATCH:camera_motiondetectiondescription"
1203
+ "MATCH:camera_motiondetectiondescription",
1204
+ "MATCH:wifi_repeater_title",
1205
+ "MATCH:wifi_repeater_description",
1206
+ "MATCH:wifi_repeater_group_tips"
1204
1207
  ],
1205
1208
  "replacements": {
1206
1209
  "REGEX:% %1\\$s.*?\\)%": "{0}",
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "name": "@ledvance/base",
5
5
  "pid": [],
6
6
  "uiid": "",
7
- "version": "1.3.81",
7
+ "version": "1.3.82",
8
8
  "scripts": {
9
9
  "prepublishOnly": "python update-localazy.py"
10
10
  },
@@ -63,7 +63,7 @@ const AdvanceCard = (props: AdvanceCardProps) => {
63
63
  {
64
64
  props.children ?
65
65
  props.children :
66
- <View style={styles.titleBg}>
66
+ <View accessibilityLabel='AdvanceCard' accessibilityHint={props.data.title} style={styles.titleBg}>
67
67
  <Text style={{...styles.title, color: props.theme?.global.fontColor}}>{props.data.title}</Text>
68
68
  <Spacer height={cx(8)} />
69
69
  {
@@ -1,184 +1,199 @@
1
- import {Utils} from "tuya-panel-kit";
2
- import React, {useEffect} from "react";
3
- import {Image, StyleSheet, TouchableOpacity, View} from "react-native";
1
+ import { Utils } from "tuya-panel-kit";
2
+ import React, { useEffect } from "react";
3
+ import { Image, StyleSheet, TouchableOpacity, View } from "react-native";
4
4
  import res from "../res";
5
- import {useReactive} from "ahooks";
6
- import {hsv2Hex} from "../utils/index";
7
- import {cctToColor} from "../utils/cctUtils";
8
- import {AdjustType, HSV} from '../utils/interface'
5
+ import { useReactive } from "ahooks";
6
+ import { hsv2Hex } from "../utils/index";
7
+ import { cctToColor } from "../utils/cctUtils";
8
+ import { AdjustType, HSV } from '../utils/interface'
9
9
 
10
- const {withTheme} = Utils.ThemeUtils
10
+ const { withTheme } = Utils.ThemeUtils
11
11
  const cx = Utils.RatioUtils.convertX;
12
12
 
13
13
  export enum PaintMode {
14
- Top,
15
- Bottom,
16
- ALL
14
+ Top,
15
+ Bottom,
16
+ ALL
17
17
  }
18
18
 
19
19
  interface BallDirectionProps {
20
- theme?: any,
21
- adjustType: AdjustType,
22
- paintMode: PaintMode,
23
- onPaintModeChanged: (paintMode: PaintMode) => void,
24
- topColor: HSV,
25
- bottomColor: HSV,
26
- colorTemp: number,
27
- brightness: number,
20
+ theme?: any,
21
+ adjustType: AdjustType,
22
+ paintMode: PaintMode,
23
+ onPaintModeChanged: (paintMode: PaintMode) => void,
24
+ topColor: HSV,
25
+ bottomColor: HSV,
26
+ colorTemp: number,
27
+ brightness: number,
28
28
  }
29
29
 
30
30
  const BallDirectionView = (props: BallDirectionProps) => {
31
- const {theme, adjustType, paintMode, onPaintModeChanged, topColor, bottomColor, colorTemp, brightness} = props;
32
- const state = useReactive({
33
- adjustType: adjustType,
34
- paintMode: paintMode,
35
- halfCircleTopColor: '#ff0000',
36
- halfCircleBottomColor: '#00ff00',
37
- });
31
+ const { theme, adjustType, paintMode, onPaintModeChanged, topColor, bottomColor, colorTemp, brightness } = props;
32
+ const state = useReactive({
33
+ adjustType: adjustType,
34
+ paintMode: paintMode,
35
+ halfCircleTopColor: '#ff0000',
36
+ halfCircleBottomColor: '#00ff00',
37
+ });
38
38
 
39
- useEffect(() => {
40
- state.adjustType = adjustType;
41
- state.paintMode = paintMode;
42
- if (state.adjustType === AdjustType.COLOUR) {
43
- state.halfCircleTopColor = hsv2Hex(topColor.h, Math.max(Math.round(topColor.s / 10), 10), 100);
44
- state.halfCircleBottomColor = hsv2Hex(bottomColor.h, Math.max(Math.round(bottomColor.s / 10), 10), 100);
45
- } else if (state.adjustType === AdjustType.WHITE) {
46
- state.halfCircleTopColor = cctToColor(colorTemp, brightness);
47
- state.halfCircleBottomColor = cctToColor(colorTemp, brightness);
48
- } else {
49
- state.halfCircleTopColor = '#FEAC5B';
50
- state.halfCircleBottomColor = '#FEAC5B';
51
- }
52
- }, [adjustType, paintMode, JSON.stringify(topColor), JSON.stringify(bottomColor), colorTemp, brightness]);
39
+ useEffect(() => {
40
+ state.adjustType = adjustType;
41
+ state.paintMode = paintMode;
42
+ if (state.adjustType === AdjustType.COLOUR) {
43
+ state.halfCircleTopColor = hsv2Hex(topColor.h, Math.max(Math.round(topColor.s / 10), 10), 100);
44
+ state.halfCircleBottomColor = hsv2Hex(bottomColor.h, Math.max(Math.round(bottomColor.s / 10), 10), 100);
45
+ } else if (state.adjustType === AdjustType.WHITE) {
46
+ state.halfCircleTopColor = cctToColor(colorTemp, brightness);
47
+ state.halfCircleBottomColor = cctToColor(colorTemp, brightness);
48
+ } else {
49
+ state.halfCircleTopColor = '#FEAC5B';
50
+ state.halfCircleBottomColor = '#FEAC5B';
51
+ }
52
+ }, [adjustType, paintMode, JSON.stringify(topColor), JSON.stringify(bottomColor), colorTemp, brightness]);
53
53
 
54
- const styles = StyleSheet.create({
55
- root: {
56
- flexDirection: 'row',
57
- width: '100%',
58
- alignItems: 'center',
59
- justifyContent: 'center'
60
- },
61
- paintModeRoot: {
62
- flexDirection: 'column',
63
- position: 'absolute',
64
- left: cx(24)
65
- },
66
- paintModeAll: {
67
- resizeMode: 'contain',
68
- width: '100%',
69
- height: '100%',
70
- tintColor: state.paintMode === PaintMode.ALL ? props.theme?.icon.primary : props.theme?.icon.normal
71
- },
72
- paintModeHalf: {
73
- resizeMode: 'contain',
74
- width: '100%',
75
- height: '100%',
76
- tintColor: state.paintMode !== PaintMode.ALL ? props.theme?.icon.primary : props.theme?.icon.normal
77
- },
78
- circleLayout: {
79
- marginVertical: cx(10),
80
- width: cx(180),
81
- height: cx(180)
82
- },
83
- circleBorder: {
84
- position: 'absolute',
85
- width: '84%',
86
- height: '84%',
87
- borderColor: theme?.textInput.line,
88
- borderRadius: 100,
89
- borderWidth: 2,
90
- bottom: '8%',
91
- left: '8%',
92
- right: '8%',
93
- top: '8%',
94
- },
95
- coloring: {
96
- width: '100%',
97
- height: '100%',
98
- resizeMode: 'contain',
99
- },
100
- ringUp: {
101
- position: 'absolute',
102
- width: '100%',
103
- height: '56%',
104
- resizeMode: 'contain',
105
- transform: [{ rotate: '180deg' }]
106
- },
107
- ringDown: {
108
- position: 'absolute',
109
- width: '100%',
110
- height: '56%',
111
- resizeMode: 'contain',
112
- bottom: 0
113
- },
114
- halfCircleDown: {
115
- position: 'absolute',
116
- width: '60%',
117
- left: '20%',
118
- right: '20%',
119
- bottom: '11%',
120
- },
121
- halfCircleUp: {
122
- position: 'absolute',
123
- width: '60%',
124
- left: '20%',
125
- right: '20%',
126
- top: '11%',
127
- }
128
- });
129
- return (<View style={styles.root}>
130
- <View style={styles.paintModeRoot}>
131
- {state.adjustType === AdjustType.COLOUR &&
132
- <TouchableOpacity style={{width: cx(40), height: cx(40)}} onPress={() => {
133
- onPaintModeChanged(PaintMode.Top);
134
- }}>
135
- <Image source={{ uri: res.half}} style={styles.paintModeHalf}/>
136
- </TouchableOpacity>}
137
- <TouchableOpacity
138
- style={{width: cx(40), height: cx(40), marginTop: cx(10),}}
139
- onPress={() => {
140
- onPaintModeChanged(PaintMode.ALL);
141
- }}>
142
- <Image source={{ uri: res.all }} style={styles.paintModeAll}/>
143
- </TouchableOpacity>
144
- </View>
145
- <View style={styles.circleLayout}>
146
- <View style={styles.circleBorder}/>
147
- {state.paintMode === PaintMode.ALL &&
148
- <Image source={{ uri: res.coloring}} style={styles.coloring}/>}
149
- {state.paintMode === PaintMode.Top &&
150
- <Image source={{ uri: res.ringdown}} style={styles.ringUp}/>}
151
- {state.paintMode === PaintMode.Bottom &&
152
- <Image source={{ uri: res.ringdown}} style={styles.ringDown}/>}
153
- <TouchableOpacity
154
- style={styles.halfCircleUp}
155
- disabled={state.paintMode === PaintMode.ALL}
156
- onPress={() => {
157
- onPaintModeChanged(PaintMode.Top);
158
- }}>
159
- <Image source={res.halfcircle} style={{
160
- width: '100%',
161
- resizeMode: 'contain',
162
- tintColor: state.halfCircleTopColor
163
- }}/>
54
+ const styles = StyleSheet.create({
55
+ root: {
56
+ flexDirection: 'row',
57
+ width: '100%',
58
+ alignItems: 'center',
59
+ justifyContent: 'center'
60
+ },
61
+ paintModeRoot: {
62
+ flexDirection: 'column',
63
+ position: 'absolute',
64
+ left: cx(24)
65
+ },
66
+ paintModeAll: {
67
+ resizeMode: 'contain',
68
+ width: '100%',
69
+ height: '100%',
70
+ tintColor: state.paintMode === PaintMode.ALL ? props.theme?.icon.primary : props.theme?.icon.normal
71
+ },
72
+ paintModeHalf: {
73
+ resizeMode: 'contain',
74
+ width: '100%',
75
+ height: '100%',
76
+ tintColor: state.paintMode !== PaintMode.ALL ? props.theme?.icon.primary : props.theme?.icon.normal
77
+ },
78
+ circleLayout: {
79
+ marginVertical: cx(10),
80
+ width: cx(180),
81
+ height: cx(180)
82
+ },
83
+ circleBorder: {
84
+ position: 'absolute',
85
+ width: '84%',
86
+ height: '84%',
87
+ borderColor: theme?.textInput.line,
88
+ borderRadius: 100,
89
+ borderWidth: 2,
90
+ bottom: '8%',
91
+ left: '8%',
92
+ right: '8%',
93
+ top: '8%',
94
+ },
95
+ coloring: {
96
+ width: '100%',
97
+ height: '100%',
98
+ resizeMode: 'contain',
99
+ },
100
+ ringUp: {
101
+ position: 'absolute',
102
+ width: '100%',
103
+ height: '56%',
104
+ resizeMode: 'contain',
105
+ transform: [{ rotate: '180deg' }]
106
+ },
107
+ ringDown: {
108
+ position: 'absolute',
109
+ width: '100%',
110
+ height: '56%',
111
+ resizeMode: 'contain',
112
+ bottom: 0
113
+ },
114
+ halfCircleDown: {
115
+ position: 'absolute',
116
+ width: '60%',
117
+ left: '20%',
118
+ right: '20%',
119
+ bottom: '11%',
120
+ },
121
+ halfCircleUp: {
122
+ position: 'absolute',
123
+ width: '60%',
124
+ left: '20%',
125
+ right: '20%',
126
+ top: '11%',
127
+ }
128
+ });
129
+ return (<View style={styles.root}>
130
+ <View style={styles.paintModeRoot}>
131
+ {state.adjustType === AdjustType.COLOUR &&
132
+ <TouchableOpacity
133
+ accessibilityLabel="HalfCircleButton"
134
+ accessibilityHint="HalfCircle"
135
+ accessibilityState={{ checked: [PaintMode.Top, PaintMode.Bottom].includes(state.paintMode) }}
136
+ style={{ width: cx(40), height: cx(40) }}
137
+ onPress={() => {
138
+ onPaintModeChanged(PaintMode.Top);
139
+ }}
140
+ >
141
+ <Image source={{ uri: res.half }} style={styles.paintModeHalf} />
142
+ </TouchableOpacity>}
143
+ <TouchableOpacity
144
+ accessibilityLabel="AllCircleButton"
145
+ accessibilityHint="AllCircle"
146
+ accessibilityState={{ checked: state.paintMode === PaintMode.ALL }}
147
+ style={{ width: cx(40), height: cx(40), marginTop: cx(10), }}
148
+ onPress={() => {
149
+ onPaintModeChanged(PaintMode.ALL);
150
+ }}>
151
+ <Image source={{ uri: res.all }} style={styles.paintModeAll} />
152
+ </TouchableOpacity>
153
+ </View>
154
+ <View style={styles.circleLayout}>
155
+ <View style={styles.circleBorder} />
156
+ {state.paintMode === PaintMode.ALL &&
157
+ <Image source={{ uri: res.coloring }} style={styles.coloring} />}
158
+ {state.paintMode === PaintMode.Top &&
159
+ <Image source={{ uri: res.ringdown }} style={styles.ringUp} />}
160
+ {state.paintMode === PaintMode.Bottom &&
161
+ <Image source={{ uri: res.ringdown }} style={styles.ringDown} />}
162
+ <TouchableOpacity
163
+ accessibilityLabel="HalfCircle"
164
+ accessibilityHint="TopHalfCircle"
165
+ accessibilityState={{ checked: state.paintMode === PaintMode.Top, disabled: state.paintMode === PaintMode.ALL }}
166
+ style={styles.halfCircleUp}
167
+ disabled={state.paintMode === PaintMode.ALL}
168
+ onPress={() => {
169
+ onPaintModeChanged(PaintMode.Top);
170
+ }}>
171
+ <Image source={res.halfcircle} style={{
172
+ width: '100%',
173
+ resizeMode: 'contain',
174
+ tintColor: state.halfCircleTopColor
175
+ }} />
164
176
 
165
- </TouchableOpacity>
177
+ </TouchableOpacity>
166
178
 
167
- <TouchableOpacity
168
- style={styles.halfCircleDown}
169
- disabled={state.paintMode === PaintMode.ALL}
170
- onPress={() => {
171
- onPaintModeChanged(PaintMode.Bottom);
172
- }}>
173
- <Image source={res.halfcircle} style={{
174
- width: '100%',
175
- resizeMode: 'contain',
176
- transform: [{rotate: '180deg'}],
177
- tintColor: state.halfCircleBottomColor
178
- }}/>
179
- </TouchableOpacity>
180
- </View>
181
- </View>)
179
+ <TouchableOpacity
180
+ accessibilityLabel="HalfCircle"
181
+ accessibilityHint="BottomHalfCircle"
182
+ accessibilityState={{ checked: state.paintMode === PaintMode.Bottom, disabled: state.paintMode === PaintMode.ALL }}
183
+ style={styles.halfCircleDown}
184
+ disabled={state.paintMode === PaintMode.ALL}
185
+ onPress={() => {
186
+ onPaintModeChanged(PaintMode.Bottom);
187
+ }}>
188
+ <Image source={res.halfcircle} style={{
189
+ width: '100%',
190
+ resizeMode: 'contain',
191
+ transform: [{ rotate: '180deg' }],
192
+ tintColor: state.halfCircleBottomColor
193
+ }} />
194
+ </TouchableOpacity>
195
+ </View>
196
+ </View>)
182
197
  }
183
198
 
184
199
  export default withTheme(BallDirectionView) as React.ComponentType<BallDirectionProps>
@@ -23,7 +23,7 @@ const DeleteButton = (props: DeleteButtonProps) => {
23
23
  accessibilityHint={text}
24
24
  accessibilityState={{disabled}}
25
25
  disabled={disabled}
26
- onPress={onPress}
26
+ onPress={disabled ? undefined : onPress}
27
27
  style={[{
28
28
  width: '100%',
29
29
  height: cx(50),
@@ -71,6 +71,9 @@ const DiySceneNodeView = (props: DiySceneNodeProps) => {
71
71
  return (
72
72
  <View style={styles.circleLayout}>
73
73
  <TouchableOpacity
74
+ accessibilityLabel="HalfCircleButton"
75
+ accessibilityHint={'Top'}
76
+ accessibilityState={{ checked: isCurrent && position === 'Top' }}
74
77
  style={styles.halfCircleUp}
75
78
  onPress={() => {
76
79
  onChangePosition("Top")
@@ -84,6 +87,9 @@ const DiySceneNodeView = (props: DiySceneNodeProps) => {
84
87
  { (isCurrent && position === 'Top') && <Image source={{uri: res.halfborder}} style={styles.borderTop} />}
85
88
  </TouchableOpacity>
86
89
  <TouchableOpacity
90
+ accessibilityLabel="HalfCircleButton"
91
+ accessibilityHint={'Bottom'}
92
+ accessibilityState={{ checked: isCurrent && position === 'Bottom' }}
87
93
  style={styles.halfCircleDown}
88
94
  onPress={() => {
89
95
  onChangePosition("Bottom")
@@ -149,6 +149,9 @@ const DrawToolView = (props: DrawToolViewProps) => {
149
149
  <View style={styles.container}>
150
150
  <View style={styles.adjustButtons}>
151
151
  <TouchableOpacity
152
+ accessibilityLabel='AdjustButton'
153
+ accessibilityHint='1'
154
+ accessibilityState={{ checked: props.adjustType === 1 }}
152
155
  onPress={() => {
153
156
  props.setAdjustType(1)
154
157
  }}>
@@ -157,6 +160,9 @@ const DrawToolView = (props: DrawToolViewProps) => {
157
160
  source={{ uri: res.ic_paint_bucket}} />
158
161
  </TouchableOpacity>
159
162
  {!props.hideDisableLight && <TouchableOpacity
163
+ accessibilityLabel='AdjustButton'
164
+ accessibilityHint='3'
165
+ accessibilityState={{ checked: props.adjustType === 3 }}
160
166
  onPress={() => {
161
167
  props.setAdjustType(3)
162
168
  }}>
@@ -165,6 +171,9 @@ const DrawToolView = (props: DrawToolViewProps) => {
165
171
  source={{uri: res.ic_disabled_light}} />
166
172
  </TouchableOpacity>}
167
173
  {!props.hideColorize && <TouchableOpacity
174
+ accessibilityLabel='AdjustButton'
175
+ accessibilityHint='2'
176
+ accessibilityState={{ checked: props.adjustType === 2 }}
168
177
  onPress={() => {
169
178
  props.setAdjustType(2)
170
179
  }}>
@@ -173,6 +182,8 @@ const DrawToolView = (props: DrawToolViewProps) => {
173
182
  source={{uri: res.ic_colorize}} />
174
183
  </TouchableOpacity>}
175
184
  {!props.hideLedNum && <TouchableOpacity
185
+ accessibilityLabel='LedNumInput'
186
+ accessibilityHint={`${props.ledNum || 5}`}
176
187
  onPress={() => {
177
188
  state.visible = true
178
189
  }}
@@ -250,6 +261,7 @@ const DrawToolView = (props: DrawToolViewProps) => {
250
261
  text={I18n.getLang('auto_scan_system_wifi_confirm')}
251
262
  style={{ width: cx(150), height: cx(40), backgroundColor: ledNumValidator(state.ledNum) ? props.theme?.button.primary : props.theme?.button.disabled }}
252
263
  textStyle={{ fontSize: cx(14) }}
264
+ disabled={!ledNumValidator(state.ledNum)}
253
265
  onPress={() => {
254
266
  if (!ledNumValidator(state.ledNum)) return
255
267
  props.setLedNum(state.ledNum)
@@ -83,6 +83,8 @@ const MoodStripAdjustView = (props: MoodStripAdjustViewProps) => {
83
83
  props.favoriteScenes.map((sceneInfo: DiySceneInfo) => {
84
84
  return (
85
85
  <TouchableOpacity
86
+ accessibilityLabel="SceneItem"
87
+ accessibilityHint={`${sceneInfo.id}`}
86
88
  key={sceneInfo.id}
87
89
  onPress={() => {
88
90
  props.onFavoriteSceneChange(sceneInfo)
@@ -104,6 +106,8 @@ const MoodStripAdjustView = (props: MoodStripAdjustViewProps) => {
104
106
  <View style={{justifyContent: 'center', alignItems: 'center', width: '100%', height: '100%'}}>
105
107
  {props.favoriteScenes.length > 3 &&
106
108
  <TouchableOpacity
109
+ accessibilityLabel="FavoriteSceneDeleteButton"
110
+ accessibilityHint={`${sceneInfo.id}`}
107
111
  style={{position: 'absolute', top: cx(5), right: cx(5)}}
108
112
  onPress={() => {
109
113
  props.onFavoriteSceneRemove && props.onFavoriteSceneRemove(sceneInfo)
@@ -73,7 +73,7 @@ const OptionGroup = (props: OptionGroupProps) => {
73
73
  return (
74
74
  <TouchableOpacity
75
75
  accessibilityLabel={"OptionItem"}
76
- accessibilityHint={props.value}
76
+ accessibilityHint={`${props.value}`}
77
77
  accessibilityState={{checked: props.enable}}
78
78
  onPress={() => props.onPress && props.onPress(props.value)}
79
79
  >
@@ -0,0 +1,93 @@
1
+ import React from "react"
2
+ import { View, Text, TouchableOpacity, Image } from "react-native"
3
+ import LdvSwitch from "./ldvSwitch"
4
+ import I18n from "@i18n"
5
+ import LdvSlider from "./ldvSlider"
6
+ import Spacer from "./Spacer"
7
+ import ThemeType from "config/themeType"
8
+ import { Utils } from "tuya-panel-kit"
9
+ import Popup from "./Popup"
10
+ import res from "@res"
11
+ import Segmented from "./Segmented"
12
+
13
+ const cx = Utils.RatioUtils.convertX
14
+ const { withTheme } = Utils.ThemeUtils
15
+
16
+ interface OsramFanAdjustProps {
17
+ theme?: ThemeType
18
+ hideFanSwitch?: boolean
19
+ fanSwitch: boolean
20
+ setFanSwitch: (v: boolean) => void
21
+ fanSpeed: number
22
+ minSpeed?: number
23
+ maxSpeed?: number
24
+ onFanSpeedChange?: (v: number) => void
25
+ setFanSpeed: (v: number) => void
26
+ fanMode: 'fresh' | 'nature'
27
+ setFanMode: (v: 'fresh' | 'nature') => void
28
+ }
29
+
30
+ const OsramFanAdjustView = (props: OsramFanAdjustProps) => {
31
+ const { hideFanSwitch = false, fanSwitch, setFanSwitch, fanSpeed, onFanSpeedChange, setFanSpeed, minSpeed = 1, maxSpeed = 3, fanMode, setFanMode } = props
32
+ return (
33
+ <View>
34
+ {
35
+ !hideFanSwitch && <LdvSwitch
36
+ title={I18n.getLang('add_new_dynamic_mood_ceiling_fan_field_headline')}
37
+ enable={fanSwitch}
38
+ setEnable={setFanSwitch}
39
+ />
40
+ }
41
+ {
42
+ fanSwitch && (
43
+ <>
44
+ <LdvSlider
45
+ title={I18n.getLang('add_new_dynamic_mood_ceiling_fan_field_text')}
46
+ subTitleStr={`${fanSpeed}/${maxSpeed}`}
47
+ value={fanSpeed}
48
+ min={minSpeed}
49
+ max={maxSpeed}
50
+ onValueChange={onFanSpeedChange}
51
+ onSlidingComplete={setFanSpeed}
52
+ />
53
+ <Spacer />
54
+ <View style={{ marginHorizontal: cx(16) }}>
55
+ <View style={{ flexDirection: 'row', marginBottom: cx(2), alignItems: 'center' }}>
56
+ <Text style={{ marginRight: cx(5), color: props.theme?.global.fontColor }}>{I18n.getLang('ceiling_fan_tile_uvc_fan_mode')}</Text>
57
+ <TouchableOpacity onPress={() => Popup({
58
+ title: I18n.getLang('ceiling_fan_mode_info_headline'),
59
+ confirmText: I18n.getLang('ceiling_fan_direction_info_button_label'),
60
+ content: <View>
61
+ <Text style={{
62
+ fontWeight: 'bold',
63
+ color: props.theme?.global.fontColor,
64
+ }}>{I18n.getLang('ceiling_fan_mode_info_description_text')}</Text>
65
+ <Spacer />
66
+ <Text style={{ color: props.theme?.global.fontColor }}>{I18n.getLang('ceiling_fan_mode_info_option_1_headline')}</Text>
67
+ <Text style={{ color: props.theme?.global.fontColor }}>{I18n.getLang('ceiling_fan_mode_info_option_1_text')}</Text>
68
+ <Spacer />
69
+ <Text style={{ color: props.theme?.global.fontColor }}>{I18n.getLang('ceiling_fan_mode_info_option_2_headline')}</Text>
70
+ <Text style={{ color: props.theme?.global.fontColor }}>{I18n.getLang('ceiling_fan_mode_info_option_2_text')}</Text>
71
+ </View>,
72
+ })}>
73
+ <Image style={{ width: cx(16), height: cx(16), tintColor: props.theme?.icon.primary }} source={{ uri: res.ic_info }} />
74
+ </TouchableOpacity>
75
+ </View>
76
+ <Segmented
77
+ options={[
78
+ { label: I18n.getLang('ceiling_fan_tile_uvc_fan_mode_opt_1'), value: 'fresh' },
79
+ { label: I18n.getLang('ceiling_fan_tile_uvc_fan_mode_opt_2'), value: 'nature' },
80
+ ]}
81
+ value={fanMode}
82
+ onChange={setFanMode}
83
+ />
84
+ </View>
85
+ <Spacer />
86
+ </>
87
+ )
88
+ }
89
+ </View>
90
+ )
91
+ }
92
+
93
+ export default withTheme(OsramFanAdjustView)
@@ -70,7 +70,11 @@ const Page = (props: PageProps) => {
70
70
 
71
71
  return (
72
72
  <>
73
- <View style={[{ flex: 1, position: 'relative', backgroundColor: props.theme?.global.background }, props.style]}>
73
+ <View
74
+ accessibilityLabel='Page'
75
+ accessibilityHint={props.headlineText}
76
+ style={[{ flex: 1, position: 'relative', backgroundColor: props.theme?.global.background }, props.style]}
77
+ >
74
78
  <LDVTopBar
75
79
  title={props.backText}
76
80
  onBackPress={
@@ -26,6 +26,8 @@ const InformationPopup = (props: InformationPopupProps) => {
26
26
  }}>{props.title}</Text>
27
27
  </View>
28
28
  <TouchableOpacity
29
+ accessibilityLabel='PopupCloseButton'
30
+ accessibilityHint={props.confirmText}
29
31
  style={{
30
32
  flexDirection: 'column-reverse',
31
33
  alignItems: 'center',
@@ -58,7 +58,7 @@ const Segmented = (props: SegmentedProps) => {
58
58
  {props.options && props.options.map((item, idx) => (
59
59
  <TouchableOpacity
60
60
  accessibilityLabel={"Segmented"}
61
- accessibilityHint={item.value}
61
+ accessibilityHint={`${item.value}`}
62
62
  accessibilityState={{checked: item.value === props.value}}
63
63
  style={[
64
64
  styles.segmented_item,