@proulr/sdui-components 0.1.66 → 0.1.67

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.
Files changed (171) hide show
  1. package/assets/icons/arrow-down-right.svg +8 -0
  2. package/assets/icons/arrow-right.svg +8 -0
  3. package/assets/icons/arrow-up-right.svg +8 -0
  4. package/assets/icons/attachment.svg +8 -0
  5. package/assets/icons/back.svg +8 -0
  6. package/assets/icons/bell.svg +10 -0
  7. package/assets/icons/bookmark.svg +8 -0
  8. package/assets/icons/boost.svg +11 -0
  9. package/assets/icons/camera.svg +10 -0
  10. package/assets/icons/chat.svg +11 -0
  11. package/assets/icons/check.svg +8 -0
  12. package/assets/icons/chevron-down.svg +8 -0
  13. package/assets/icons/chevron-right.svg +8 -0
  14. package/assets/icons/close.svg +8 -0
  15. package/assets/icons/communities.svg +10 -0
  16. package/assets/icons/copy.svg +11 -0
  17. package/assets/icons/crop.svg +10 -0
  18. package/assets/icons/download.svg +9 -0
  19. package/assets/icons/edit.svg +10 -0
  20. package/assets/icons/events.svg +15 -0
  21. package/assets/icons/fire.svg +8 -0
  22. package/assets/icons/flash.svg +8 -0
  23. package/assets/icons/flip-camera.svg +12 -0
  24. package/assets/icons/followers.svg +13 -0
  25. package/assets/icons/gallery.svg +12 -0
  26. package/assets/icons/gift.svg +11 -0
  27. package/assets/icons/globe.svg +10 -0
  28. package/assets/icons/heart-filled.svg +8 -0
  29. package/assets/icons/heart.svg +8 -0
  30. package/assets/icons/hourglass.svg +13 -0
  31. package/assets/icons/hunt.svg +12 -0
  32. package/assets/icons/incognito.svg +11 -0
  33. package/assets/icons/info.svg +10 -0
  34. package/assets/icons/list.svg +13 -0
  35. package/assets/icons/location.svg +8 -0
  36. package/assets/icons/lock.svg +11 -0
  37. package/assets/icons/mention.svg +9 -0
  38. package/assets/icons/mic.svg +10 -0
  39. package/assets/icons/overflow.svg +12 -0
  40. package/assets/icons/pause.svg +10 -0
  41. package/assets/icons/pending.svg +10 -0
  42. package/assets/icons/play.svg +8 -0
  43. package/assets/icons/plus.svg +8 -0
  44. package/assets/icons/poll.svg +9 -0
  45. package/assets/icons/profile.svg +10 -0
  46. package/assets/icons/publish.svg +9 -0
  47. package/assets/icons/radio-unchecked.svg +8 -0
  48. package/assets/icons/reply.svg +9 -0
  49. package/assets/icons/repost.svg +11 -0
  50. package/assets/icons/right-now.svg +14 -0
  51. package/assets/icons/search.svg +10 -0
  52. package/assets/icons/send.svg +9 -0
  53. package/assets/icons/settings.svg +8 -0
  54. package/assets/icons/share.svg +13 -0
  55. package/assets/icons/shield.svg +9 -0
  56. package/assets/icons/sign-out.svg +9 -0
  57. package/assets/icons/signal.svg +8 -0
  58. package/assets/icons/star.svg +8 -0
  59. package/assets/icons/story-effects.svg +12 -0
  60. package/assets/icons/story-mention.svg +10 -0
  61. package/assets/icons/story-music.svg +10 -0
  62. package/assets/icons/story-sticker.svg +11 -0
  63. package/assets/icons/story-text.svg +9 -0
  64. package/assets/icons/story.svg +10 -0
  65. package/assets/icons/tab-chat.svg +11 -0
  66. package/assets/icons/tab-discover.svg +11 -0
  67. package/assets/icons/tab-flash.svg +8 -0
  68. package/assets/icons/tab-random.svg +13 -0
  69. package/assets/icons/tab-vibes.svg +8 -0
  70. package/assets/icons/thumbs-up-filled.svg +8 -0
  71. package/assets/icons/thumbs-up.svg +9 -0
  72. package/assets/icons/trash.svg +10 -0
  73. package/assets/icons/travel.svg +11 -0
  74. package/assets/icons/video.svg +11 -0
  75. package/assets/icons/visibility-off.svg +10 -0
  76. package/assets/icons/visibility.svg +9 -0
  77. package/assets/icons/volume-off.svg +9 -0
  78. package/assets/icons/volume-on.svg +10 -0
  79. package/assets/icons/warning.svg +10 -0
  80. package/package.json +4 -2
  81. package/src/catalog/catalog.test.ts +3 -1
  82. package/src/renderer/ui/app-icon-glyph-props.ts +5 -0
  83. package/src/renderer/ui/app-icon.test.ts +45 -0
  84. package/src/renderer/ui/app-icon.tsx +6 -166
  85. package/src/renderer/ui/compose-recent-media-grid.tsx +2 -2
  86. package/src/renderer/ui/compose-screen-header.tsx +2 -2
  87. package/src/renderer/ui/compose-visibility-row.tsx +2 -2
  88. package/src/renderer/ui/generated/arrow-down-right.tsx +16 -0
  89. package/src/renderer/ui/generated/arrow-right.tsx +16 -0
  90. package/src/renderer/ui/generated/arrow-up-right.tsx +16 -0
  91. package/src/renderer/ui/generated/attachment.tsx +16 -0
  92. package/src/renderer/ui/generated/back.tsx +16 -0
  93. package/src/renderer/ui/generated/bell.tsx +18 -0
  94. package/src/renderer/ui/generated/bookmark.tsx +16 -0
  95. package/src/renderer/ui/generated/boost.tsx +19 -0
  96. package/src/renderer/ui/generated/camera.tsx +18 -0
  97. package/src/renderer/ui/generated/chat.tsx +19 -0
  98. package/src/renderer/ui/generated/check.tsx +16 -0
  99. package/src/renderer/ui/generated/chevron-down.tsx +16 -0
  100. package/src/renderer/ui/generated/chevron-right.tsx +16 -0
  101. package/src/renderer/ui/generated/close.tsx +16 -0
  102. package/src/renderer/ui/generated/communities.tsx +18 -0
  103. package/src/renderer/ui/generated/copy.tsx +19 -0
  104. package/src/renderer/ui/generated/crop.tsx +18 -0
  105. package/src/renderer/ui/generated/download.tsx +17 -0
  106. package/src/renderer/ui/generated/edit.tsx +18 -0
  107. package/src/renderer/ui/generated/events.tsx +23 -0
  108. package/src/renderer/ui/generated/fire.tsx +16 -0
  109. package/src/renderer/ui/generated/flash.tsx +16 -0
  110. package/src/renderer/ui/generated/flip-camera.tsx +20 -0
  111. package/src/renderer/ui/generated/followers.tsx +21 -0
  112. package/src/renderer/ui/generated/gallery.tsx +20 -0
  113. package/src/renderer/ui/generated/gift.tsx +19 -0
  114. package/src/renderer/ui/generated/globe.tsx +18 -0
  115. package/src/renderer/ui/generated/heart-filled.tsx +16 -0
  116. package/src/renderer/ui/generated/heart.tsx +16 -0
  117. package/src/renderer/ui/generated/hourglass.tsx +21 -0
  118. package/src/renderer/ui/generated/hunt.tsx +20 -0
  119. package/src/renderer/ui/generated/incognito.tsx +19 -0
  120. package/src/renderer/ui/generated/index.ts +248 -0
  121. package/src/renderer/ui/generated/info.tsx +18 -0
  122. package/src/renderer/ui/generated/list.tsx +21 -0
  123. package/src/renderer/ui/generated/location.tsx +16 -0
  124. package/src/renderer/ui/generated/lock.tsx +19 -0
  125. package/src/renderer/ui/generated/mention.tsx +17 -0
  126. package/src/renderer/ui/generated/mic.tsx +18 -0
  127. package/src/renderer/ui/generated/overflow.tsx +20 -0
  128. package/src/renderer/ui/generated/pause.tsx +18 -0
  129. package/src/renderer/ui/generated/pending.tsx +18 -0
  130. package/src/renderer/ui/generated/play.tsx +16 -0
  131. package/src/renderer/ui/generated/plus.tsx +16 -0
  132. package/src/renderer/ui/generated/poll.tsx +17 -0
  133. package/src/renderer/ui/generated/profile.tsx +18 -0
  134. package/src/renderer/ui/generated/publish.tsx +17 -0
  135. package/src/renderer/ui/generated/radio-unchecked.tsx +16 -0
  136. package/src/renderer/ui/generated/reply.tsx +17 -0
  137. package/src/renderer/ui/generated/repost.tsx +19 -0
  138. package/src/renderer/ui/generated/right-now.tsx +22 -0
  139. package/src/renderer/ui/generated/search.tsx +18 -0
  140. package/src/renderer/ui/generated/send.tsx +17 -0
  141. package/src/renderer/ui/generated/settings.tsx +16 -0
  142. package/src/renderer/ui/generated/share.tsx +21 -0
  143. package/src/renderer/ui/generated/shield.tsx +17 -0
  144. package/src/renderer/ui/generated/sign-out.tsx +17 -0
  145. package/src/renderer/ui/generated/signal.tsx +16 -0
  146. package/src/renderer/ui/generated/star.tsx +16 -0
  147. package/src/renderer/ui/generated/story-effects.tsx +20 -0
  148. package/src/renderer/ui/generated/story-mention.tsx +18 -0
  149. package/src/renderer/ui/generated/story-music.tsx +18 -0
  150. package/src/renderer/ui/generated/story-sticker.tsx +19 -0
  151. package/src/renderer/ui/generated/story-text.tsx +17 -0
  152. package/src/renderer/ui/generated/story.tsx +18 -0
  153. package/src/renderer/ui/generated/tab-chat.tsx +19 -0
  154. package/src/renderer/ui/generated/tab-discover.tsx +19 -0
  155. package/src/renderer/ui/generated/tab-flash.tsx +16 -0
  156. package/src/renderer/ui/generated/tab-random.tsx +21 -0
  157. package/src/renderer/ui/generated/tab-vibes.tsx +16 -0
  158. package/src/renderer/ui/generated/thumbs-up-filled.tsx +16 -0
  159. package/src/renderer/ui/generated/thumbs-up.tsx +17 -0
  160. package/src/renderer/ui/generated/trash.tsx +18 -0
  161. package/src/renderer/ui/generated/travel.tsx +19 -0
  162. package/src/renderer/ui/generated/video.tsx +19 -0
  163. package/src/renderer/ui/generated/visibility-off.tsx +18 -0
  164. package/src/renderer/ui/generated/visibility.tsx +17 -0
  165. package/src/renderer/ui/generated/volume-off.tsx +17 -0
  166. package/src/renderer/ui/generated/volume-on.tsx +18 -0
  167. package/src/renderer/ui/generated/warning.tsx +18 -0
  168. package/src/renderer/ui/index.ts +2 -85
  169. package/src/renderer/ui/story-compose-header.tsx +2 -2
  170. package/src/renderer/ui/app-glyphs.tsx +0 -2082
  171. package/src/renderer/ui/compose-glyphs.tsx +0 -439
@@ -1,2082 +0,0 @@
1
- import { Platform, StyleSheet, Text, View } from 'react-native';
2
- import { m3Colors } from '../theme/proulr-theme';
3
-
4
- export type AppChromeGlyphProps = {
5
- color?: string;
6
- size?: number;
7
- };
8
-
9
- function strokeFor(size: number) {
10
- return Math.max(1.8, size * 0.075);
11
- }
12
-
13
- export function AppChromeSearchGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
14
- const stroke = strokeFor(size);
15
- const lens = size * 0.48;
16
- return (
17
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
18
- <View
19
- style={{
20
- width: lens,
21
- height: lens,
22
- borderRadius: lens / 2,
23
- borderWidth: stroke,
24
- borderColor: color,
25
- }}
26
- />
27
- <View
28
- style={{
29
- position: 'absolute',
30
- width: size * 0.26,
31
- height: stroke,
32
- borderRadius: 1,
33
- backgroundColor: color,
34
- transform: [{ rotate: '45deg' }],
35
- bottom: size * 0.14,
36
- right: size * 0.12,
37
- }}
38
- />
39
- </View>
40
- );
41
- }
42
-
43
- export function AppChromeHuntGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
44
- const stroke = strokeFor(size);
45
- const ring = size * 0.82;
46
- return (
47
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
48
- <View
49
- style={{
50
- width: ring,
51
- height: ring,
52
- borderRadius: ring / 2,
53
- borderWidth: stroke,
54
- borderColor: color,
55
- alignItems: 'center',
56
- justifyContent: 'center',
57
- }}
58
- >
59
- <View
60
- style={{
61
- width: ring * 0.3,
62
- height: ring * 0.3,
63
- borderRadius: ring * 0.15,
64
- backgroundColor: color,
65
- }}
66
- />
67
- </View>
68
- <View style={[styles.crosshair, { width: size * 0.92, height: stroke, backgroundColor: color }]} />
69
- <View style={[styles.crosshair, { width: stroke, height: size * 0.92, backgroundColor: color }]} />
70
- </View>
71
- );
72
- }
73
-
74
- export function AppChromeBackGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
75
- const stroke = strokeFor(size) + 0.2;
76
- return (
77
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
78
- <View
79
- style={{
80
- width: size * 0.36,
81
- height: size * 0.36,
82
- borderLeftWidth: stroke,
83
- borderBottomWidth: stroke,
84
- borderColor: color,
85
- transform: [{ rotate: '45deg' }],
86
- marginLeft: size * 0.1,
87
- }}
88
- />
89
- </View>
90
- );
91
- }
92
-
93
- export function AppChromeOverflowGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
94
- const dot = size * 0.13;
95
- return (
96
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center', gap: dot * 0.75 }}>
97
- <View style={{ width: dot, height: dot, borderRadius: dot / 2, backgroundColor: color }} />
98
- <View style={{ width: dot, height: dot, borderRadius: dot / 2, backgroundColor: color }} />
99
- <View style={{ width: dot, height: dot, borderRadius: dot / 2, backgroundColor: color }} />
100
- </View>
101
- );
102
- }
103
-
104
- export function AppChromeLocationGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
105
- const stroke = strokeFor(size);
106
- const head = size * 0.42;
107
- return (
108
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
109
- <View
110
- style={{
111
- width: head,
112
- height: head,
113
- borderRadius: head / 2,
114
- borderWidth: stroke,
115
- borderColor: color,
116
- alignItems: 'center',
117
- justifyContent: 'center',
118
- position: 'absolute',
119
- top: size * 0.06,
120
- }}
121
- >
122
- <View
123
- style={{
124
- width: head * 0.34,
125
- height: head * 0.34,
126
- borderRadius: head * 0.17,
127
- backgroundColor: color,
128
- }}
129
- />
130
- </View>
131
- <View
132
- style={{
133
- position: 'absolute',
134
- bottom: size * 0.04,
135
- width: 0,
136
- height: 0,
137
- borderLeftWidth: head * 0.52,
138
- borderRightWidth: head * 0.52,
139
- borderTopWidth: size * 0.3,
140
- borderLeftColor: 'transparent',
141
- borderRightColor: 'transparent',
142
- borderTopColor: color,
143
- }}
144
- />
145
- </View>
146
- );
147
- }
148
-
149
- export function AppChromeMicGlyph({ color = m3Colors.onPrimary, size = 24 }: AppChromeGlyphProps) {
150
- const stroke = strokeFor(size);
151
- const capsuleW = size * 0.38;
152
- const capsuleH = size * 0.56;
153
- return (
154
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
155
- <View
156
- style={{
157
- width: capsuleW,
158
- height: capsuleH,
159
- borderRadius: capsuleW / 2,
160
- borderWidth: stroke,
161
- borderColor: color,
162
- }}
163
- />
164
- <View style={{ width: size * 0.48, height: stroke, backgroundColor: color, marginTop: 2 }} />
165
- <View style={{ width: stroke, height: size * 0.16, backgroundColor: color }} />
166
- </View>
167
- );
168
- }
169
-
170
- export function AppChromeSendGlyph({ color = m3Colors.onPrimary, size = 24 }: AppChromeGlyphProps) {
171
- const wingSpan = size * 0.17;
172
- const bodyLength = size * 0.5;
173
-
174
- return (
175
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
176
- <View style={{ transform: [{ rotate: '-42deg' }] }}>
177
- <View
178
- style={{
179
- width: 0,
180
- height: 0,
181
- borderTopWidth: wingSpan,
182
- borderBottomWidth: wingSpan,
183
- borderLeftWidth: bodyLength,
184
- borderTopColor: 'transparent',
185
- borderBottomColor: 'transparent',
186
- borderLeftColor: color,
187
- marginLeft: size * 0.04,
188
- }}
189
- />
190
- </View>
191
- </View>
192
- );
193
- }
194
-
195
- export function AppChromeChatGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
196
- const stroke = strokeFor(size);
197
- const bubbleW = size * 0.86;
198
- const bubbleH = size * 0.62;
199
- return (
200
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
201
- <View
202
- style={{
203
- width: bubbleW,
204
- height: bubbleH,
205
- borderRadius: size * 0.16,
206
- borderWidth: stroke,
207
- borderColor: color,
208
- }}
209
- />
210
- <View
211
- style={{
212
- position: 'absolute',
213
- bottom: size * 0.1,
214
- left: size * 0.18,
215
- width: size * 0.16,
216
- height: size * 0.16,
217
- borderBottomWidth: stroke,
218
- borderLeftWidth: stroke,
219
- borderColor: color,
220
- transform: [{ rotate: '-45deg' }],
221
- }}
222
- />
223
- </View>
224
- );
225
- }
226
-
227
- export function AppChromeCloseGlyph({ color = m3Colors.onSurface, size = 20 }: AppChromeGlyphProps) {
228
- const stroke = strokeFor(size);
229
- const bar = size * 0.68;
230
- return (
231
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
232
- <View style={[styles.diag, { width: bar, height: stroke, backgroundColor: color, transform: [{ rotate: '45deg' }] }]} />
233
- <View style={[styles.diag, { width: bar, height: stroke, backgroundColor: color, transform: [{ rotate: '-45deg' }] }]} />
234
- </View>
235
- );
236
- }
237
-
238
- export function AppChromeChevronDownGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
239
- const stroke = strokeFor(size);
240
- return (
241
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
242
- <View
243
- style={{
244
- width: size * 0.36,
245
- height: size * 0.36,
246
- borderRightWidth: stroke,
247
- borderBottomWidth: stroke,
248
- borderColor: color,
249
- transform: [{ rotate: '45deg' }],
250
- marginTop: -size * 0.06,
251
- }}
252
- />
253
- </View>
254
- );
255
- }
256
-
257
- export function AppChromeChevronRightGlyph({ color = m3Colors.onSurfaceVariant, size = 20 }: AppChromeGlyphProps) {
258
- const stroke = strokeFor(size);
259
- return (
260
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
261
- <View
262
- style={{
263
- width: size * 0.36,
264
- height: size * 0.36,
265
- borderRightWidth: stroke,
266
- borderBottomWidth: stroke,
267
- borderColor: color,
268
- transform: [{ rotate: '-45deg' }],
269
- marginLeft: -size * 0.06,
270
- }}
271
- />
272
- </View>
273
- );
274
- }
275
-
276
- export function AppChromeFlipCameraGlyph({ color = m3Colors.onPrimary, size = 24 }: AppChromeGlyphProps) {
277
- const stroke = strokeFor(size);
278
- const ring = size * 0.78;
279
- return (
280
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
281
- <View
282
- style={{
283
- width: ring,
284
- height: ring,
285
- borderRadius: ring / 2,
286
- borderWidth: stroke,
287
- borderColor: color,
288
- borderTopColor: 'transparent',
289
- transform: [{ rotate: '45deg' }],
290
- }}
291
- />
292
- <View
293
- style={{
294
- position: 'absolute',
295
- top: size * 0.1,
296
- right: size * 0.12,
297
- width: 0,
298
- height: 0,
299
- borderTopWidth: size * 0.11,
300
- borderBottomWidth: size * 0.11,
301
- borderLeftWidth: size * 0.13,
302
- borderTopColor: 'transparent',
303
- borderBottomColor: 'transparent',
304
- borderLeftColor: color,
305
- transform: [{ rotate: '-30deg' }],
306
- }}
307
- />
308
- </View>
309
- );
310
- }
311
-
312
- /** Flash — estalo / sinal de interesse (centro + 4 raios longos + 4 curtos). */
313
- export function AppChromeFlashGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
314
- const core = size * 0.22;
315
- const mainRayW = Math.max(2.6, size * 0.12);
316
- const mainRayLen = size * 0.42;
317
- const diagRayW = Math.max(2, size * 0.09);
318
- const diagRayLen = size * 0.28;
319
- const mainAngles = [0, 90, 180, 270];
320
- const diagAngles = [45, 135, 225, 315];
321
-
322
- const rayStyle = (rayW: number, rayLen: number, angle: number) => ({
323
- position: 'absolute' as const,
324
- width: rayW,
325
- height: rayLen,
326
- borderRadius: rayW / 2,
327
- backgroundColor: color,
328
- left: size / 2 - rayW / 2,
329
- top: size / 2 - rayLen / 2,
330
- transform: [{ rotate: `${angle}deg` }, { translateY: -size * 0.28 }],
331
- });
332
-
333
- return (
334
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
335
- {mainAngles.map((angle) => (
336
- <View key={`m-${angle}`} style={rayStyle(mainRayW, mainRayLen, angle)} />
337
- ))}
338
- {diagAngles.map((angle) => (
339
- <View key={`d-${angle}`} style={rayStyle(diagRayW, diagRayLen, angle)} />
340
- ))}
341
- <View
342
- style={{
343
- width: core,
344
- height: core,
345
- borderRadius: core / 2,
346
- backgroundColor: color,
347
- }}
348
- />
349
- </View>
350
- );
351
- }
352
-
353
- export function AppChromeTabDiscoverGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
354
- return <AppChromeHuntGlyph color={color} size={size} />;
355
- }
356
-
357
- /** Vibes — play em círculo (feed de vídeo / mídia). */
358
- export function AppChromeTabVibesGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
359
- const stroke = strokeFor(size);
360
- const ring = size * 0.84;
361
- return (
362
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
363
- <View
364
- style={{
365
- width: ring,
366
- height: ring,
367
- borderRadius: ring / 2,
368
- borderWidth: stroke,
369
- borderColor: color,
370
- alignItems: 'center',
371
- justifyContent: 'center',
372
- }}
373
- >
374
- <View
375
- style={{
376
- width: 0,
377
- height: 0,
378
- borderTopWidth: size * 0.14,
379
- borderBottomWidth: size * 0.14,
380
- borderLeftWidth: size * 0.22,
381
- borderTopColor: 'transparent',
382
- borderBottomColor: 'transparent',
383
- borderLeftColor: color,
384
- marginLeft: size * 0.05,
385
- }}
386
- />
387
- </View>
388
- </View>
389
- );
390
- }
391
-
392
- export function AppChromeTabFlashGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
393
- return <AppChromeFlashGlyph color={color} size={size} />;
394
- }
395
-
396
- export function AppChromeTabChatGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
397
- return <AppChromeChatGlyph color={color} size={size} />;
398
- }
399
-
400
- /** Tab Randoms — shuffle / chance (dois nós ligados). */
401
- export function AppChromeTabRandomGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
402
- const stroke = strokeFor(size);
403
- const node = size * 0.22;
404
- return (
405
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
406
- <View
407
- style={{
408
- position: 'absolute',
409
- left: size * 0.14,
410
- top: size * 0.18,
411
- width: node,
412
- height: node,
413
- borderRadius: node / 2,
414
- backgroundColor: color,
415
- }}
416
- />
417
- <View
418
- style={{
419
- position: 'absolute',
420
- right: size * 0.14,
421
- bottom: size * 0.18,
422
- width: node,
423
- height: node,
424
- borderRadius: node / 2,
425
- backgroundColor: color,
426
- }}
427
- />
428
- <View
429
- style={{
430
- position: 'absolute',
431
- width: size * 0.55,
432
- height: stroke,
433
- backgroundColor: color,
434
- borderRadius: 1,
435
- transform: [{ rotate: '45deg' }],
436
- }}
437
- />
438
- </View>
439
- );
440
- }
441
-
442
- /** Configurações — sliders horizontais (não confundir com alvo de caçar). */
443
- export function AppChromeSettingsGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
444
- const stroke = strokeFor(size);
445
- const trackW = size * 0.72;
446
- const knob = size * 0.14;
447
- const rows = [
448
- { top: size * 0.22, knobLeft: size * 0.14 },
449
- { top: size * 0.44, knobLeft: size * 0.42 },
450
- { top: size * 0.66, knobLeft: size * 0.24 },
451
- ];
452
- return (
453
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
454
- {rows.map((row) => (
455
- <View
456
- key={row.top}
457
- style={{
458
- position: 'absolute',
459
- top: row.top,
460
- width: trackW,
461
- height: stroke,
462
- backgroundColor: color,
463
- borderRadius: 1,
464
- opacity: 0.45,
465
- }}
466
- />
467
- ))}
468
- {rows.map((row) => (
469
- <View
470
- key={`knob-${row.top}`}
471
- style={{
472
- position: 'absolute',
473
- top: row.top - knob / 2 + stroke / 2,
474
- left: row.knobLeft,
475
- width: knob,
476
- height: knob,
477
- borderRadius: knob / 2,
478
- borderWidth: stroke,
479
- borderColor: color,
480
- backgroundColor: color,
481
- }}
482
- />
483
- ))}
484
- </View>
485
- );
486
- }
487
-
488
- export function AppChromeBoostGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
489
- const stroke = strokeFor(size);
490
- const bodyW = size * 0.34;
491
- const bodyH = size * 0.46;
492
- return (
493
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
494
- <View
495
- style={{
496
- position: 'absolute',
497
- top: size * 0.1,
498
- width: 0,
499
- height: 0,
500
- borderLeftWidth: size * 0.12,
501
- borderRightWidth: size * 0.12,
502
- borderBottomWidth: size * 0.18,
503
- borderLeftColor: 'transparent',
504
- borderRightColor: 'transparent',
505
- borderBottomColor: color,
506
- }}
507
- />
508
- <View
509
- style={{
510
- position: 'absolute',
511
- top: size * 0.26,
512
- width: bodyW,
513
- height: bodyH,
514
- borderRadius: size * 0.06,
515
- borderWidth: stroke,
516
- borderColor: color,
517
- alignItems: 'center',
518
- justifyContent: 'center',
519
- }}
520
- >
521
- <View
522
- style={{
523
- width: bodyW * 0.38,
524
- height: bodyW * 0.38,
525
- borderRadius: bodyW * 0.19,
526
- borderWidth: stroke * 0.8,
527
- borderColor: color,
528
- }}
529
- />
530
- </View>
531
- <View
532
- style={{
533
- position: 'absolute',
534
- bottom: size * 0.14,
535
- left: size * 0.28,
536
- width: size * 0.16,
537
- height: size * 0.12,
538
- borderBottomWidth: stroke,
539
- borderLeftWidth: stroke,
540
- borderColor: color,
541
- transform: [{ rotate: '-35deg' }],
542
- }}
543
- />
544
- <View
545
- style={{
546
- position: 'absolute',
547
- bottom: size * 0.14,
548
- right: size * 0.28,
549
- width: size * 0.16,
550
- height: size * 0.12,
551
- borderBottomWidth: stroke,
552
- borderRightWidth: stroke,
553
- borderColor: color,
554
- transform: [{ rotate: '35deg' }],
555
- }}
556
- />
557
- </View>
558
- );
559
- }
560
-
561
- export function AppChromeFireGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
562
- const stroke = strokeFor(size);
563
- const w = size * 0.5;
564
- const h = size * 0.7;
565
- return (
566
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
567
- <View
568
- style={{
569
- width: w,
570
- height: h,
571
- borderTopLeftRadius: w * 0.55,
572
- borderTopRightRadius: w * 0.55,
573
- borderBottomLeftRadius: w * 0.22,
574
- borderBottomRightRadius: w * 0.22,
575
- borderWidth: stroke,
576
- borderColor: color,
577
- }}
578
- />
579
- <View
580
- style={{
581
- position: 'absolute',
582
- bottom: size * 0.18,
583
- width: w * 0.34,
584
- height: h * 0.46,
585
- borderTopLeftRadius: w * 0.22,
586
- borderTopRightRadius: w * 0.22,
587
- borderBottomLeftRadius: w * 0.12,
588
- borderBottomRightRadius: w * 0.12,
589
- backgroundColor: color,
590
- }}
591
- />
592
- </View>
593
- );
594
- }
595
-
596
- /**
597
- * Right Now — flame (🔥). Source SVG: assets/icons/right-now.svg
598
- * Outline teardrop + solid inner tongue (reads at 12–24px chrome sizes).
599
- */
600
- export function AppChromeRightNowGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
601
- const stroke = strokeFor(size);
602
- const outerW = size * 0.5;
603
- const outerH = size * 0.74;
604
- const innerW = outerW * 0.4;
605
- const innerH = outerH * 0.42;
606
- return (
607
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
608
- <View
609
- style={{
610
- width: outerW,
611
- height: outerH,
612
- borderTopLeftRadius: outerW * 0.58,
613
- borderTopRightRadius: outerW * 0.58,
614
- borderBottomLeftRadius: outerW * 0.46,
615
- borderBottomRightRadius: outerW * 0.46,
616
- borderWidth: stroke,
617
- borderColor: color,
618
- alignItems: 'center',
619
- justifyContent: 'flex-end',
620
- paddingBottom: size * 0.11,
621
- }}
622
- >
623
- <View
624
- style={{
625
- width: innerW,
626
- height: innerH,
627
- backgroundColor: color,
628
- borderTopLeftRadius: innerW * 0.55,
629
- borderTopRightRadius: innerW * 0.55,
630
- borderBottomLeftRadius: innerW * 0.42,
631
- borderBottomRightRadius: innerW * 0.42,
632
- }}
633
- />
634
- </View>
635
- </View>
636
- );
637
- }
638
-
639
- /** Editar perfil — só lápis (corpo + ponta). */
640
- export function AppChromeEditGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
641
- const bodyW = Math.max(3, size * 0.17);
642
- const bodyH = size * 0.64;
643
- return (
644
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
645
- <View
646
- style={{
647
- width: bodyW,
648
- height: bodyH,
649
- borderRadius: bodyW / 2,
650
- backgroundColor: color,
651
- transform: [{ rotate: '-45deg' }],
652
- }}
653
- />
654
- <View
655
- style={{
656
- position: 'absolute',
657
- bottom: size * 0.17,
658
- left: size * 0.17,
659
- width: 0,
660
- height: 0,
661
- borderLeftWidth: bodyW * 0.95,
662
- borderRightWidth: bodyW * 0.95,
663
- borderTopWidth: size * 0.13,
664
- borderLeftColor: 'transparent',
665
- borderRightColor: 'transparent',
666
- borderTopColor: color,
667
- transform: [{ rotate: '-45deg' }],
668
- }}
669
- />
670
- </View>
671
- );
672
- }
673
-
674
- /** Cortar imagem — tesoura (duas lâminas + pivô). */
675
- export function AppChromeCropGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
676
- const bladeW = Math.max(2, size * 0.12);
677
- const bladeH = size * 0.52;
678
- const pivot = Math.max(4, size * 0.2);
679
- return (
680
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
681
- <View
682
- style={{
683
- position: 'absolute',
684
- width: bladeW,
685
- height: bladeH,
686
- borderRadius: bladeW,
687
- backgroundColor: color,
688
- transform: [{ rotate: '-28deg' }, { translateY: -size * 0.06 }],
689
- }}
690
- />
691
- <View
692
- style={{
693
- position: 'absolute',
694
- width: bladeW,
695
- height: bladeH,
696
- borderRadius: bladeW,
697
- backgroundColor: color,
698
- transform: [{ rotate: '28deg' }, { translateY: -size * 0.06 }],
699
- }}
700
- />
701
- <View
702
- style={{
703
- position: 'absolute',
704
- bottom: size * 0.18,
705
- width: pivot,
706
- height: pivot,
707
- borderRadius: pivot / 2,
708
- borderWidth: Math.max(1.5, size * 0.07),
709
- borderColor: color,
710
- backgroundColor: 'transparent',
711
- }}
712
- />
713
- </View>
714
- );
715
- }
716
-
717
- /** Story — anel com ponto central (criar story). */
718
- export function AppChromeStoryGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
719
- const stroke = strokeFor(size);
720
- const ring = size * 0.82;
721
- return (
722
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
723
- <View
724
- style={{
725
- width: ring,
726
- height: ring,
727
- borderRadius: ring / 2,
728
- borderWidth: stroke,
729
- borderColor: color,
730
- alignItems: 'center',
731
- justifyContent: 'center',
732
- }}
733
- >
734
- <View
735
- style={{
736
- width: ring * 0.34,
737
- height: ring * 0.34,
738
- borderRadius: ring * 0.17,
739
- backgroundColor: color,
740
- }}
741
- />
742
- </View>
743
- </View>
744
- );
745
- }
746
-
747
- export function AppChromeStoryMusicGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
748
- const stroke = strokeFor(size);
749
- const head = size * 0.18;
750
- return (
751
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
752
- <View
753
- style={{
754
- position: 'absolute',
755
- left: size * 0.22,
756
- bottom: size * 0.18,
757
- width: head,
758
- height: head,
759
- borderRadius: head / 2,
760
- borderWidth: stroke,
761
- borderColor: color,
762
- }}
763
- />
764
- <View
765
- style={{
766
- position: 'absolute',
767
- left: size * 0.3,
768
- bottom: size * 0.34,
769
- width: stroke,
770
- height: size * 0.42,
771
- backgroundColor: color,
772
- }}
773
- />
774
- <View
775
- style={{
776
- position: 'absolute',
777
- top: size * 0.16,
778
- right: size * 0.24,
779
- width: size * 0.28,
780
- height: stroke,
781
- backgroundColor: color,
782
- transform: [{ rotate: '32deg' }],
783
- }}
784
- />
785
- </View>
786
- );
787
- }
788
-
789
- export function AppChromeStoryStickerGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
790
- const stroke = strokeFor(size);
791
- const frame = size * 0.78;
792
- return (
793
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
794
- <View
795
- style={{
796
- width: frame,
797
- height: frame,
798
- borderRadius: size * 0.14,
799
- borderWidth: stroke,
800
- borderColor: color,
801
- alignItems: 'center',
802
- justifyContent: 'center',
803
- }}
804
- >
805
- <View
806
- style={{
807
- flexDirection: 'row',
808
- gap: frame * 0.14,
809
- marginBottom: frame * 0.08,
810
- }}
811
- >
812
- <View style={{ width: frame * 0.1, height: frame * 0.1, borderRadius: frame * 0.05, backgroundColor: color }} />
813
- <View style={{ width: frame * 0.1, height: frame * 0.1, borderRadius: frame * 0.05, backgroundColor: color }} />
814
- </View>
815
- <View
816
- style={{
817
- width: frame * 0.34,
818
- height: frame * 0.16,
819
- borderBottomLeftRadius: frame * 0.17,
820
- borderBottomRightRadius: frame * 0.17,
821
- borderWidth: stroke,
822
- borderTopWidth: 0,
823
- borderColor: color,
824
- }}
825
- />
826
- </View>
827
- </View>
828
- );
829
- }
830
-
831
- export function AppChromeStoryTextGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
832
- const stroke = strokeFor(size);
833
- const frame = size * 0.78;
834
- return (
835
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
836
- <View
837
- style={{
838
- width: frame,
839
- height: frame * 0.72,
840
- borderRadius: size * 0.1,
841
- borderWidth: stroke,
842
- borderColor: color,
843
- alignItems: 'center',
844
- justifyContent: 'center',
845
- }}
846
- >
847
- <View style={{ flexDirection: 'row', alignItems: 'flex-end', gap: 1 }}>
848
- <View style={{ width: stroke * 1.1, height: size * 0.28, backgroundColor: color, borderRadius: 1 }} />
849
- <View style={{ width: size * 0.2, height: size * 0.2, borderRadius: size * 0.1, borderWidth: stroke, borderColor: color }} />
850
- </View>
851
- </View>
852
- </View>
853
- );
854
- }
855
-
856
- export function AppChromeStoryEffectsGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
857
- return <AppChromeFlashGlyph color={color} size={size} />;
858
- }
859
-
860
- export function AppChromeStoryMentionGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
861
- const stroke = strokeFor(size);
862
- const ring = size * 0.78;
863
- return (
864
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
865
- <View
866
- style={{
867
- width: ring,
868
- height: ring,
869
- borderRadius: ring / 2,
870
- borderWidth: stroke,
871
- borderColor: color,
872
- alignItems: 'center',
873
- justifyContent: 'center',
874
- }}
875
- >
876
- <View
877
- style={{
878
- width: stroke * 1.2,
879
- height: size * 0.34,
880
- backgroundColor: color,
881
- borderRadius: 1,
882
- }}
883
- />
884
- <View
885
- style={{
886
- position: 'absolute',
887
- bottom: size * 0.22,
888
- width: size * 0.14,
889
- height: size * 0.14,
890
- borderRadius: size * 0.07,
891
- borderWidth: stroke,
892
- borderColor: color,
893
- }}
894
- />
895
- </View>
896
- </View>
897
- );
898
- }
899
-
900
- export function AppChromeRepostGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
901
- const stroke = strokeFor(size);
902
- const shaft = size * 0.36;
903
- const head = size * 0.1;
904
- const rowH = stroke;
905
-
906
- return (
907
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
908
- {/* seta superior → */}
909
- <View
910
- style={{
911
- position: 'absolute',
912
- top: size * 0.28,
913
- left: size * 0.2,
914
- width: shaft,
915
- height: rowH,
916
- backgroundColor: color,
917
- borderRadius: 1,
918
- }}
919
- />
920
- <View
921
- style={{
922
- position: 'absolute',
923
- top: size * 0.28 + rowH / 2 - head,
924
- left: size * 0.2 + shaft - head * 0.15,
925
- width: 0,
926
- height: 0,
927
- borderTopWidth: head,
928
- borderBottomWidth: head,
929
- borderLeftWidth: head * 1.15,
930
- borderTopColor: 'transparent',
931
- borderBottomColor: 'transparent',
932
- borderLeftColor: color,
933
- }}
934
- />
935
- {/* seta inferior ← */}
936
- <View
937
- style={{
938
- position: 'absolute',
939
- top: size * 0.56,
940
- left: size * 0.28,
941
- width: shaft,
942
- height: rowH,
943
- backgroundColor: color,
944
- borderRadius: 1,
945
- }}
946
- />
947
- <View
948
- style={{
949
- position: 'absolute',
950
- top: size * 0.56 + rowH / 2 - head,
951
- left: size * 0.22,
952
- width: 0,
953
- height: 0,
954
- borderTopWidth: head,
955
- borderBottomWidth: head,
956
- borderRightWidth: head * 1.15,
957
- borderTopColor: 'transparent',
958
- borderBottomColor: 'transparent',
959
- borderRightColor: color,
960
- }}
961
- />
962
- </View>
963
- );
964
- }
965
-
966
- type HeartGlyphProps = AppChromeGlyphProps & { filled?: boolean };
967
-
968
- function AppChromeHeartShape({ color = m3Colors.primary, size = 24, filled = false }: HeartGlyphProps) {
969
- const glyph = filled ? '♥' : '♡';
970
- return (
971
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
972
- <Text
973
- style={{
974
- color,
975
- fontSize: size * 0.9,
976
- lineHeight: size,
977
- height: size,
978
- textAlign: 'center',
979
- ...(Platform.OS === 'android'
980
- ? { includeFontPadding: false, textAlignVertical: 'center' as const }
981
- : null),
982
- }}
983
- >
984
- {glyph}
985
- </Text>
986
- </View>
987
- );
988
- }
989
-
990
- export function AppChromePlayGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
991
- return (
992
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
993
- <View
994
- style={{
995
- width: 0,
996
- height: 0,
997
- borderTopWidth: size * 0.2,
998
- borderBottomWidth: size * 0.2,
999
- borderLeftWidth: size * 0.32,
1000
- borderTopColor: 'transparent',
1001
- borderBottomColor: 'transparent',
1002
- borderLeftColor: color,
1003
- marginLeft: size * 0.07,
1004
- }}
1005
- />
1006
- </View>
1007
- );
1008
- }
1009
-
1010
- export function AppChromePauseGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1011
- const barW = Math.max(2.4, size * 0.14);
1012
- const barH = size * 0.4;
1013
- const gap = size * 0.1;
1014
- return (
1015
- <View
1016
- style={{
1017
- width: size,
1018
- height: size,
1019
- flexDirection: 'row',
1020
- alignItems: 'center',
1021
- justifyContent: 'center',
1022
- gap,
1023
- }}
1024
- >
1025
- <View style={{ width: barW, height: barH, borderRadius: 2, backgroundColor: color }} />
1026
- <View style={{ width: barW, height: barH, borderRadius: 2, backgroundColor: color }} />
1027
- </View>
1028
- );
1029
- }
1030
-
1031
- export function AppChromeHeartGlyph(props: AppChromeGlyphProps) {
1032
- return <AppChromeHeartShape {...props} filled={false} />;
1033
- }
1034
-
1035
- export function AppChromeHeartFilledGlyph(props: AppChromeGlyphProps) {
1036
- return <AppChromeHeartShape {...props} filled />;
1037
- }
1038
-
1039
- type ThumbsUpGlyphProps = AppChromeGlyphProps & { filled?: boolean };
1040
-
1041
- function AppChromeThumbsUpShape({ color = m3Colors.primary, size = 24, filled = false }: ThumbsUpGlyphProps) {
1042
- const stroke = strokeFor(size);
1043
- const palmW = size * 0.46;
1044
- const palmH = size * 0.34;
1045
- const thumbW = size * 0.2;
1046
- const thumbH = size * 0.36;
1047
- const fill = filled ? color : 'transparent';
1048
- const borderW = filled ? 0 : stroke;
1049
- const radius = Math.max(2, size * 0.07);
1050
-
1051
- return (
1052
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1053
- <View style={{ width: palmW, height: palmH + thumbH * 0.62 }}>
1054
- <View
1055
- style={{
1056
- position: 'absolute',
1057
- top: 0,
1058
- right: palmW * 0.04,
1059
- width: thumbW,
1060
- height: thumbH,
1061
- borderRadius: thumbW / 2,
1062
- backgroundColor: fill,
1063
- borderWidth: borderW,
1064
- borderColor: color,
1065
- }}
1066
- />
1067
- <View
1068
- style={{
1069
- position: 'absolute',
1070
- bottom: 0,
1071
- left: 0,
1072
- width: palmW,
1073
- height: palmH,
1074
- borderRadius: radius,
1075
- backgroundColor: fill,
1076
- borderWidth: borderW,
1077
- borderColor: color,
1078
- }}
1079
- />
1080
- </View>
1081
- </View>
1082
- );
1083
- }
1084
-
1085
- export function AppChromeThumbsUpGlyph(props: AppChromeGlyphProps) {
1086
- return <AppChromeThumbsUpShape {...props} filled={false} />;
1087
- }
1088
-
1089
- export function AppChromeThumbsUpFilledGlyph(props: AppChromeGlyphProps) {
1090
- return <AppChromeThumbsUpShape {...props} filled />;
1091
- }
1092
-
1093
- export function AppChromePlusGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1094
- const stroke = strokeFor(size);
1095
- const arm = size * 0.46;
1096
- return (
1097
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1098
- <View style={{ width: arm, height: stroke, backgroundColor: color, borderRadius: 1 }} />
1099
- <View style={{ position: 'absolute', width: stroke, height: arm, backgroundColor: color, borderRadius: 1 }} />
1100
- </View>
1101
- );
1102
- }
1103
-
1104
- /** Publicar — documento com + central. */
1105
- export function AppChromePublishGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1106
- const stroke = strokeFor(size);
1107
- const frame = size * 0.74;
1108
- const plusLen = frame * 0.42;
1109
- return (
1110
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1111
- <View
1112
- style={{
1113
- width: frame,
1114
- height: frame,
1115
- borderRadius: size * 0.12,
1116
- borderWidth: stroke,
1117
- borderColor: color,
1118
- alignItems: 'center',
1119
- justifyContent: 'center',
1120
- }}
1121
- >
1122
- <View style={{ width: plusLen, height: stroke, backgroundColor: color, borderRadius: 1 }} />
1123
- <View
1124
- style={{
1125
- position: 'absolute',
1126
- width: stroke,
1127
- height: plusLen,
1128
- backgroundColor: color,
1129
- borderRadius: 1,
1130
- }}
1131
- />
1132
- </View>
1133
- </View>
1134
- );
1135
- }
1136
-
1137
- export function AppChromeIncognitoGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1138
- const stroke = strokeFor(size);
1139
- const frameW = size * 0.86;
1140
- const frameH = size * 0.34;
1141
- return (
1142
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1143
- <View
1144
- style={{
1145
- width: frameW,
1146
- height: frameH,
1147
- borderRadius: frameH / 2,
1148
- borderWidth: stroke,
1149
- borderColor: color,
1150
- marginTop: size * 0.08,
1151
- }}
1152
- />
1153
- <View
1154
- style={{
1155
- position: 'absolute',
1156
- top: size * 0.34,
1157
- width: frameW * 0.72,
1158
- height: frameH * 0.9,
1159
- borderBottomLeftRadius: frameH * 0.45,
1160
- borderBottomRightRadius: frameH * 0.45,
1161
- borderWidth: stroke,
1162
- borderTopWidth: 0,
1163
- borderColor: color,
1164
- }}
1165
- />
1166
- </View>
1167
- );
1168
- }
1169
-
1170
- export function AppChromeEventsGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1171
- const stroke = strokeFor(size);
1172
- const pole = size * 0.12;
1173
- return (
1174
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1175
- <View style={{ position: 'absolute', left: size * 0.22, width: pole, height: size * 0.72, backgroundColor: color }} />
1176
- <View style={{ position: 'absolute', right: size * 0.22, width: pole, height: size * 0.72, backgroundColor: color }} />
1177
- <View
1178
- style={{
1179
- position: 'absolute',
1180
- top: size * 0.12,
1181
- width: size * 0.72,
1182
- height: size * 0.34,
1183
- borderTopLeftRadius: size * 0.08,
1184
- borderTopRightRadius: size * 0.08,
1185
- borderWidth: stroke,
1186
- borderColor: color,
1187
- }}
1188
- />
1189
- </View>
1190
- );
1191
- }
1192
-
1193
- export function AppChromeShieldGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1194
- const stroke = strokeFor(size);
1195
- const w = size * 0.62;
1196
- const h = size * 0.76;
1197
- return (
1198
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1199
- <View
1200
- style={{
1201
- width: w,
1202
- height: h,
1203
- borderTopLeftRadius: w * 0.2,
1204
- borderTopRightRadius: w * 0.2,
1205
- borderBottomLeftRadius: w * 0.45,
1206
- borderBottomRightRadius: w * 0.45,
1207
- borderWidth: stroke,
1208
- borderColor: color,
1209
- }}
1210
- />
1211
- </View>
1212
- );
1213
- }
1214
-
1215
- export function AppChromeProfileGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1216
- const stroke = strokeFor(size);
1217
- const head = size * 0.28;
1218
- return (
1219
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1220
- <View
1221
- style={{
1222
- width: head,
1223
- height: head,
1224
- borderRadius: head / 2,
1225
- borderWidth: stroke,
1226
- borderColor: color,
1227
- marginBottom: size * 0.04,
1228
- }}
1229
- />
1230
- <View
1231
- style={{
1232
- width: size * 0.62,
1233
- height: size * 0.3,
1234
- borderTopLeftRadius: size * 0.3,
1235
- borderTopRightRadius: size * 0.3,
1236
- borderWidth: stroke,
1237
- borderColor: color,
1238
- borderBottomWidth: 0,
1239
- }}
1240
- />
1241
- </View>
1242
- );
1243
- }
1244
-
1245
- export function AppChromeBookmarkGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1246
- const stroke = strokeFor(size);
1247
- const w = size * 0.52;
1248
- const h = size * 0.72;
1249
- return (
1250
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1251
- <View
1252
- style={{
1253
- width: w,
1254
- height: h,
1255
- borderWidth: stroke,
1256
- borderColor: color,
1257
- borderBottomWidth: 0,
1258
- }}
1259
- />
1260
- <View
1261
- style={{
1262
- position: 'absolute',
1263
- bottom: size * 0.12,
1264
- width: 0,
1265
- height: 0,
1266
- borderLeftWidth: w / 2,
1267
- borderRightWidth: w / 2,
1268
- borderTopWidth: size * 0.16,
1269
- borderLeftColor: 'transparent',
1270
- borderRightColor: 'transparent',
1271
- borderTopColor: color,
1272
- }}
1273
- />
1274
- </View>
1275
- );
1276
- }
1277
-
1278
- export function AppChromeListGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1279
- const stroke = strokeFor(size);
1280
- const lineW = size * 0.62;
1281
- return (
1282
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center', gap: size * 0.1 }}>
1283
- {[0, 1, 2].map((row) => (
1284
- <View key={row} style={{ flexDirection: 'row', alignItems: 'center', gap: size * 0.08 }}>
1285
- <View style={{ width: size * 0.14, height: size * 0.14, borderRadius: size * 0.07, borderWidth: stroke, borderColor: color }} />
1286
- <View style={{ width: lineW, height: stroke, backgroundColor: color }} />
1287
- </View>
1288
- ))}
1289
- </View>
1290
- );
1291
- }
1292
-
1293
- export function AppChromeCommunitiesGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1294
- const stroke = strokeFor(size);
1295
- const head = size * 0.22;
1296
- return (
1297
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1298
- <View style={{ flexDirection: 'row', gap: size * 0.08, marginBottom: size * 0.04 }}>
1299
- <View style={{ width: head, height: head, borderRadius: head / 2, borderWidth: stroke, borderColor: color }} />
1300
- <View style={{ width: head, height: head, borderRadius: head / 2, borderWidth: stroke, borderColor: color }} />
1301
- </View>
1302
- <View
1303
- style={{
1304
- width: size * 0.72,
1305
- height: size * 0.26,
1306
- borderTopLeftRadius: size * 0.16,
1307
- borderTopRightRadius: size * 0.16,
1308
- borderWidth: stroke,
1309
- borderColor: color,
1310
- borderBottomWidth: 0,
1311
- }}
1312
- />
1313
- </View>
1314
- );
1315
- }
1316
-
1317
- export function AppChromeStarGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1318
- const stroke = strokeFor(size);
1319
- const arm = size * 0.34;
1320
- return (
1321
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1322
- <View style={{ position: 'absolute', width: arm, height: stroke, backgroundColor: color }} />
1323
- <View style={{ position: 'absolute', width: stroke, height: arm, backgroundColor: color }} />
1324
- <View style={{ position: 'absolute', width: arm, height: stroke, backgroundColor: color, transform: [{ rotate: '45deg' }] }} />
1325
- <View style={{ position: 'absolute', width: arm, height: stroke, backgroundColor: color, transform: [{ rotate: '-45deg' }] }} />
1326
- <View
1327
- style={{
1328
- width: size * 0.2,
1329
- height: size * 0.2,
1330
- borderRadius: size * 0.1,
1331
- backgroundColor: color,
1332
- }}
1333
- />
1334
- </View>
1335
- );
1336
- }
1337
-
1338
- export function AppChromeSignOutGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1339
- const stroke = strokeFor(size);
1340
- return (
1341
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1342
- <View
1343
- style={{
1344
- position: 'absolute',
1345
- left: size * 0.12,
1346
- width: size * 0.34,
1347
- height: size * 0.34,
1348
- borderRadius: size * 0.17,
1349
- borderWidth: stroke,
1350
- borderColor: color,
1351
- }}
1352
- />
1353
- <View style={{ position: 'absolute', right: size * 0.1, width: size * 0.34, height: stroke, backgroundColor: color }} />
1354
- <View
1355
- style={{
1356
- position: 'absolute',
1357
- right: size * 0.1,
1358
- width: size * 0.16,
1359
- height: size * 0.16,
1360
- borderRightWidth: stroke,
1361
- borderTopWidth: stroke,
1362
- borderColor: color,
1363
- transform: [{ rotate: '45deg' }],
1364
- }}
1365
- />
1366
- </View>
1367
- );
1368
- }
1369
-
1370
- /** Olho aberto — mostrar senha. */
1371
- export function AppChromeVisibilityGlyph({ color = m3Colors.onSurfaceVariant, size = 24 }: AppChromeGlyphProps) {
1372
- const stroke = strokeFor(size);
1373
- const eyeW = size * 0.82;
1374
- const eyeH = size * 0.46;
1375
- const pupil = size * 0.18;
1376
- return (
1377
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1378
- <View
1379
- style={{
1380
- width: eyeW,
1381
- height: eyeH,
1382
- borderRadius: eyeH / 2,
1383
- borderWidth: stroke,
1384
- borderColor: color,
1385
- }}
1386
- />
1387
- <View
1388
- style={{
1389
- position: 'absolute',
1390
- width: pupil,
1391
- height: pupil,
1392
- borderRadius: pupil / 2,
1393
- backgroundColor: color,
1394
- }}
1395
- />
1396
- </View>
1397
- );
1398
- }
1399
-
1400
- /** Olho riscado — ocultar senha. */
1401
- export function AppChromeVisibilityOffGlyph({ color = m3Colors.onSurfaceVariant, size = 24 }: AppChromeGlyphProps) {
1402
- const stroke = strokeFor(size);
1403
- const eyeW = size * 0.82;
1404
- const eyeH = size * 0.46;
1405
- const pupil = size * 0.18;
1406
- const slash = size * 0.88;
1407
- return (
1408
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1409
- <View
1410
- style={{
1411
- width: eyeW,
1412
- height: eyeH,
1413
- borderRadius: eyeH / 2,
1414
- borderWidth: stroke,
1415
- borderColor: color,
1416
- opacity: 0.72,
1417
- }}
1418
- />
1419
- <View
1420
- style={{
1421
- position: 'absolute',
1422
- width: pupil,
1423
- height: pupil,
1424
- borderRadius: pupil / 2,
1425
- backgroundColor: color,
1426
- opacity: 0.72,
1427
- }}
1428
- />
1429
- <View
1430
- style={{
1431
- position: 'absolute',
1432
- width: slash,
1433
- height: stroke,
1434
- backgroundColor: color,
1435
- borderRadius: 1,
1436
- transform: [{ rotate: '-35deg' }],
1437
- }}
1438
- />
1439
- </View>
1440
- );
1441
- }
1442
-
1443
- export function AppChromeCheckGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1444
- const stroke = strokeFor(size) + 0.2;
1445
- return (
1446
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1447
- <View
1448
- style={{
1449
- width: size * 0.42,
1450
- height: size * 0.22,
1451
- borderLeftWidth: stroke,
1452
- borderBottomWidth: stroke,
1453
- borderColor: color,
1454
- transform: [{ rotate: '-45deg' }],
1455
- marginTop: -size * 0.06,
1456
- }}
1457
- />
1458
- </View>
1459
- );
1460
- }
1461
-
1462
- export function AppChromeArrowRightGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
1463
- const stroke = strokeFor(size);
1464
- const shaft = size * 0.5;
1465
- return (
1466
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1467
- <View style={{ width: shaft, height: stroke, backgroundColor: color, borderRadius: 1, marginRight: size * 0.08 }} />
1468
- <View
1469
- style={{
1470
- position: 'absolute',
1471
- width: size * 0.28,
1472
- height: size * 0.28,
1473
- borderTopWidth: stroke,
1474
- borderRightWidth: stroke,
1475
- borderColor: color,
1476
- transform: [{ rotate: '45deg' }],
1477
- right: size * 0.18,
1478
- }}
1479
- />
1480
- </View>
1481
- );
1482
- }
1483
-
1484
- export function AppChromeArrowUpRightGlyph({ color = m3Colors.onSurfaceVariant, size = 16 }: AppChromeGlyphProps) {
1485
- const stroke = strokeFor(size);
1486
- return (
1487
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1488
- <View style={{ position: 'absolute', width: size * 0.55, height: stroke, backgroundColor: color, transform: [{ rotate: '-45deg' }] }} />
1489
- <View
1490
- style={{
1491
- position: 'absolute',
1492
- top: size * 0.18,
1493
- right: size * 0.18,
1494
- width: size * 0.32,
1495
- height: size * 0.32,
1496
- borderTopWidth: stroke,
1497
- borderRightWidth: stroke,
1498
- borderColor: color,
1499
- }}
1500
- />
1501
- </View>
1502
- );
1503
- }
1504
-
1505
- export function AppChromeArrowDownRightGlyph({ color = m3Colors.onSurfaceVariant, size = 16 }: AppChromeGlyphProps) {
1506
- const stroke = strokeFor(size);
1507
- return (
1508
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1509
- <View style={{ position: 'absolute', width: size * 0.55, height: stroke, backgroundColor: color, transform: [{ rotate: '45deg' }] }} />
1510
- <View
1511
- style={{
1512
- position: 'absolute',
1513
- bottom: size * 0.18,
1514
- right: size * 0.18,
1515
- width: size * 0.32,
1516
- height: size * 0.32,
1517
- borderBottomWidth: stroke,
1518
- borderRightWidth: stroke,
1519
- borderColor: color,
1520
- }}
1521
- />
1522
- </View>
1523
- );
1524
- }
1525
-
1526
- export function AppChromeReplyGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
1527
- const stroke = strokeFor(size);
1528
- return (
1529
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1530
- <View
1531
- style={{
1532
- width: size * 0.28,
1533
- height: size * 0.28,
1534
- borderLeftWidth: stroke,
1535
- borderBottomWidth: stroke,
1536
- borderColor: color,
1537
- transform: [{ rotate: '45deg' }],
1538
- marginRight: size * 0.2,
1539
- marginTop: -size * 0.08,
1540
- }}
1541
- />
1542
- <View
1543
- style={{
1544
- position: 'absolute',
1545
- width: size * 0.42,
1546
- height: size * 0.36,
1547
- borderRightWidth: stroke,
1548
- borderBottomWidth: stroke,
1549
- borderColor: color,
1550
- borderBottomRightRadius: size * 0.2,
1551
- right: size * 0.16,
1552
- top: size * 0.28,
1553
- }}
1554
- />
1555
- </View>
1556
- );
1557
- }
1558
-
1559
- export function AppChromePendingGlyph({ color = m3Colors.onSurfaceVariant, size = 16 }: AppChromeGlyphProps) {
1560
- const stroke = strokeFor(size);
1561
- const dial = size * 0.72;
1562
- return (
1563
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1564
- <View
1565
- style={{
1566
- width: dial,
1567
- height: dial,
1568
- borderRadius: dial / 2,
1569
- borderWidth: stroke,
1570
- borderColor: color,
1571
- alignItems: 'center',
1572
- justifyContent: 'center',
1573
- }}
1574
- >
1575
- <View style={{ position: 'absolute', width: stroke, height: dial * 0.28, backgroundColor: color, top: dial * 0.14, borderRadius: 1 }} />
1576
- <View
1577
- style={{
1578
- position: 'absolute',
1579
- width: dial * 0.22,
1580
- height: stroke,
1581
- backgroundColor: color,
1582
- borderRadius: 1,
1583
- transform: [{ rotate: '45deg' }],
1584
- top: dial * 0.36,
1585
- left: dial * 0.4,
1586
- }}
1587
- />
1588
- </View>
1589
- </View>
1590
- );
1591
- }
1592
-
1593
- export function AppChromeDownloadGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1594
- const stroke = strokeFor(size);
1595
- return (
1596
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1597
- <View style={{ width: stroke, height: size * 0.42, backgroundColor: color, borderRadius: 1, marginBottom: size * 0.08 }} />
1598
- <View
1599
- style={{
1600
- position: 'absolute',
1601
- width: size * 0.28,
1602
- height: size * 0.28,
1603
- borderRightWidth: stroke,
1604
- borderBottomWidth: stroke,
1605
- borderColor: color,
1606
- transform: [{ rotate: '45deg' }],
1607
- top: size * 0.34,
1608
- }}
1609
- />
1610
- <View
1611
- style={{
1612
- position: 'absolute',
1613
- bottom: size * 0.14,
1614
- width: size * 0.5,
1615
- height: stroke,
1616
- backgroundColor: color,
1617
- borderRadius: 1,
1618
- }}
1619
- />
1620
- </View>
1621
- );
1622
- }
1623
-
1624
- export function AppChromeRadioUncheckedGlyph({ color = m3Colors.onSurfaceVariant, size = 20 }: AppChromeGlyphProps) {
1625
- const stroke = strokeFor(size);
1626
- const ring = size * 0.72;
1627
- return (
1628
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1629
- <View
1630
- style={{
1631
- width: ring,
1632
- height: ring,
1633
- borderRadius: ring / 2,
1634
- borderWidth: stroke,
1635
- borderColor: color,
1636
- }}
1637
- />
1638
- </View>
1639
- );
1640
- }
1641
-
1642
- export function AppChromeCopyGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
1643
- const stroke = strokeFor(size);
1644
- const sheet = size * 0.46;
1645
- return (
1646
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1647
- <View
1648
- style={{
1649
- position: 'absolute',
1650
- top: size * 0.14,
1651
- left: size * 0.18,
1652
- width: sheet,
1653
- height: sheet * 1.15,
1654
- borderRadius: size * 0.06,
1655
- borderWidth: stroke,
1656
- borderColor: color,
1657
- }}
1658
- />
1659
- <View
1660
- style={{
1661
- position: 'absolute',
1662
- top: size * 0.26,
1663
- left: size * 0.32,
1664
- width: sheet,
1665
- height: sheet * 1.15,
1666
- borderRadius: size * 0.06,
1667
- borderWidth: stroke,
1668
- borderColor: color,
1669
- backgroundColor: 'transparent',
1670
- }}
1671
- />
1672
- </View>
1673
- );
1674
- }
1675
-
1676
- export function AppChromeAttachmentGlyph({ color = m3Colors.onSurfaceVariant, size = 16 }: AppChromeGlyphProps) {
1677
- const stroke = strokeFor(size);
1678
- return (
1679
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1680
- <View
1681
- style={{
1682
- width: size * 0.28,
1683
- height: size * 0.62,
1684
- borderRadius: size * 0.14,
1685
- borderWidth: stroke,
1686
- borderColor: color,
1687
- transform: [{ rotate: '35deg' }],
1688
- }}
1689
- />
1690
- </View>
1691
- );
1692
- }
1693
-
1694
- export function AppChromePollGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1695
- const barW = Math.max(2.2, size * 0.12);
1696
- const gap = size * 0.1;
1697
- return (
1698
- <View
1699
- style={{
1700
- width: size,
1701
- height: size,
1702
- flexDirection: 'row',
1703
- alignItems: 'flex-end',
1704
- justifyContent: 'center',
1705
- gap,
1706
- paddingBottom: size * 0.14,
1707
- }}
1708
- >
1709
- <View style={{ width: barW, height: size * 0.28, borderRadius: 1, backgroundColor: color }} />
1710
- <View style={{ width: barW, height: size * 0.48, borderRadius: 1, backgroundColor: color }} />
1711
- <View style={{ width: barW, height: size * 0.36, borderRadius: 1, backgroundColor: color }} />
1712
- </View>
1713
- );
1714
- }
1715
-
1716
- export function AppChromeLockGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
1717
- const stroke = strokeFor(size);
1718
- const body = size * 0.5;
1719
- const shackle = size * 0.34;
1720
- return (
1721
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1722
- <View
1723
- style={{
1724
- width: shackle,
1725
- height: shackle * 0.7,
1726
- borderTopLeftRadius: shackle / 2,
1727
- borderTopRightRadius: shackle / 2,
1728
- borderWidth: stroke,
1729
- borderBottomWidth: 0,
1730
- borderColor: color,
1731
- marginBottom: -stroke,
1732
- }}
1733
- />
1734
- <View
1735
- style={{
1736
- width: body,
1737
- height: body * 0.72,
1738
- borderRadius: size * 0.08,
1739
- borderWidth: stroke,
1740
- borderColor: color,
1741
- alignItems: 'center',
1742
- justifyContent: 'center',
1743
- }}
1744
- >
1745
- <View style={{ width: size * 0.1, height: size * 0.14, borderRadius: 1, backgroundColor: color }} />
1746
- </View>
1747
- </View>
1748
- );
1749
- }
1750
-
1751
- export function AppChromeVolumeOnGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
1752
- const stroke = strokeFor(size);
1753
- return (
1754
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1755
- <View
1756
- style={{
1757
- width: size * 0.22,
1758
- height: size * 0.28,
1759
- backgroundColor: color,
1760
- borderRadius: 2,
1761
- marginRight: size * 0.22,
1762
- }}
1763
- />
1764
- <View
1765
- style={{
1766
- position: 'absolute',
1767
- left: size * 0.28,
1768
- width: 0,
1769
- height: 0,
1770
- borderTopWidth: size * 0.22,
1771
- borderBottomWidth: size * 0.22,
1772
- borderRightWidth: size * 0.2,
1773
- borderTopColor: 'transparent',
1774
- borderBottomColor: 'transparent',
1775
- borderRightColor: color,
1776
- }}
1777
- />
1778
- <View
1779
- style={{
1780
- position: 'absolute',
1781
- right: size * 0.12,
1782
- width: size * 0.28,
1783
- height: size * 0.28,
1784
- borderRadius: size * 0.14,
1785
- borderWidth: stroke,
1786
- borderColor: color,
1787
- borderLeftWidth: 0,
1788
- }}
1789
- />
1790
- </View>
1791
- );
1792
- }
1793
-
1794
- export function AppChromeVolumeOffGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
1795
- const stroke = strokeFor(size);
1796
- return (
1797
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1798
- <AppChromeVolumeOnGlyph color={color} size={size} />
1799
- <View
1800
- style={{
1801
- position: 'absolute',
1802
- width: size * 0.72,
1803
- height: stroke,
1804
- backgroundColor: color,
1805
- borderRadius: 1,
1806
- transform: [{ rotate: '-35deg' }],
1807
- }}
1808
- />
1809
- </View>
1810
- );
1811
- }
1812
-
1813
- export function AppChromeInfoGlyph({ color = m3Colors.onSurface, size = 24 }: AppChromeGlyphProps) {
1814
- const stroke = strokeFor(size);
1815
- const ring = size * 0.78;
1816
- const dot = Math.max(2, size * 0.1);
1817
- return (
1818
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1819
- <View
1820
- style={{
1821
- width: ring,
1822
- height: ring,
1823
- borderRadius: ring / 2,
1824
- borderWidth: stroke,
1825
- borderColor: color,
1826
- alignItems: 'center',
1827
- justifyContent: 'center',
1828
- }}
1829
- >
1830
- <View style={{ width: dot, height: dot, borderRadius: dot / 2, backgroundColor: color, marginBottom: size * 0.06 }} />
1831
- <View style={{ width: stroke, height: size * 0.22, borderRadius: 1, backgroundColor: color }} />
1832
- </View>
1833
- </View>
1834
- );
1835
- }
1836
-
1837
- export function AppChromeWarningGlyph({ color = m3Colors.error, size = 24 }: AppChromeGlyphProps) {
1838
- const stroke = strokeFor(size);
1839
- const dot = Math.max(2, size * 0.1);
1840
- return (
1841
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1842
- <View
1843
- style={{
1844
- width: 0,
1845
- height: 0,
1846
- borderLeftWidth: size * 0.38,
1847
- borderRightWidth: size * 0.38,
1848
- borderBottomWidth: size * 0.66,
1849
- borderLeftColor: 'transparent',
1850
- borderRightColor: 'transparent',
1851
- borderBottomColor: color,
1852
- opacity: 0.2,
1853
- }}
1854
- />
1855
- <View style={{ position: 'absolute', width: stroke, height: size * 0.22, backgroundColor: color, top: size * 0.28, borderRadius: 1 }} />
1856
- <View style={{ position: 'absolute', width: dot, height: dot, borderRadius: dot / 2, backgroundColor: color, bottom: size * 0.22 }} />
1857
- </View>
1858
- );
1859
- }
1860
-
1861
- export function AppChromeSignalGlyph({ color = m3Colors.onSurfaceVariant, size = 24 }: AppChromeGlyphProps) {
1862
- const stroke = strokeFor(size);
1863
- return (
1864
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1865
- <View
1866
- style={{
1867
- width: size * 0.55,
1868
- height: size * 0.55,
1869
- borderRadius: size * 0.28,
1870
- borderWidth: stroke,
1871
- borderColor: color,
1872
- borderBottomWidth: 0,
1873
- borderLeftWidth: 0,
1874
- transform: [{ rotate: '-45deg' }],
1875
- marginTop: size * 0.1,
1876
- }}
1877
- />
1878
- <View
1879
- style={{
1880
- position: 'absolute',
1881
- width: size * 0.32,
1882
- height: size * 0.32,
1883
- borderRadius: size * 0.16,
1884
- borderWidth: stroke,
1885
- borderColor: color,
1886
- borderBottomWidth: 0,
1887
- borderLeftWidth: 0,
1888
- transform: [{ rotate: '-45deg' }],
1889
- top: size * 0.34,
1890
- }}
1891
- />
1892
- <View
1893
- style={{
1894
- position: 'absolute',
1895
- width: size * 0.12,
1896
- height: size * 0.12,
1897
- borderRadius: size * 0.06,
1898
- backgroundColor: color,
1899
- bottom: size * 0.22,
1900
- }}
1901
- />
1902
- </View>
1903
- );
1904
- }
1905
-
1906
- export function AppChromeHourglassGlyph({ color = m3Colors.onSurfaceVariant, size = 24 }: AppChromeGlyphProps) {
1907
- const stroke = strokeFor(size);
1908
- const frame = size * 0.5;
1909
- return (
1910
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1911
- <View style={{ width: frame, height: stroke, backgroundColor: color, borderRadius: 1 }} />
1912
- <View
1913
- style={{
1914
- width: frame * 0.7,
1915
- height: size * 0.22,
1916
- borderLeftWidth: stroke,
1917
- borderRightWidth: stroke,
1918
- borderColor: color,
1919
- marginVertical: 1,
1920
- }}
1921
- />
1922
- <View style={{ width: frame * 0.35, height: stroke, backgroundColor: color, borderRadius: 1 }} />
1923
- <View
1924
- style={{
1925
- width: frame * 0.7,
1926
- height: size * 0.22,
1927
- borderLeftWidth: stroke,
1928
- borderRightWidth: stroke,
1929
- borderColor: color,
1930
- marginVertical: 1,
1931
- }}
1932
- />
1933
- <View style={{ width: frame, height: stroke, backgroundColor: color, borderRadius: 1 }} />
1934
- </View>
1935
- );
1936
- }
1937
-
1938
- export function AppChromeBellGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1939
- const stroke = strokeFor(size);
1940
- const body = size * 0.52;
1941
- return (
1942
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1943
- <View
1944
- style={{
1945
- width: body * 0.28,
1946
- height: body * 0.18,
1947
- borderTopLeftRadius: body * 0.14,
1948
- borderTopRightRadius: body * 0.14,
1949
- borderWidth: stroke,
1950
- borderBottomWidth: 0,
1951
- borderColor: color,
1952
- marginBottom: -1,
1953
- }}
1954
- />
1955
- <View
1956
- style={{
1957
- width: body,
1958
- height: body * 0.7,
1959
- borderTopLeftRadius: body * 0.5,
1960
- borderTopRightRadius: body * 0.5,
1961
- borderWidth: stroke,
1962
- borderColor: color,
1963
- }}
1964
- />
1965
- <View style={{ width: body * 1.15, height: stroke, backgroundColor: color, borderRadius: 1, marginTop: 1 }} />
1966
- <View
1967
- style={{
1968
- width: body * 0.22,
1969
- height: body * 0.14,
1970
- borderBottomLeftRadius: body * 0.11,
1971
- borderBottomRightRadius: body * 0.11,
1972
- backgroundColor: color,
1973
- marginTop: 1,
1974
- }}
1975
- />
1976
- </View>
1977
- );
1978
- }
1979
-
1980
- /** Share / export — box with upward arrow. */
1981
- export function AppChromeShareGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
1982
- const stroke = strokeFor(size);
1983
- return (
1984
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
1985
- <View
1986
- style={{
1987
- position: 'absolute',
1988
- bottom: size * 0.18,
1989
- width: size * 0.62,
1990
- height: size * 0.42,
1991
- borderWidth: stroke,
1992
- borderTopWidth: 0,
1993
- borderColor: color,
1994
- borderBottomLeftRadius: size * 0.1,
1995
- borderBottomRightRadius: size * 0.1,
1996
- }}
1997
- />
1998
- <View
1999
- style={{
2000
- position: 'absolute',
2001
- top: size * 0.16,
2002
- width: stroke,
2003
- height: size * 0.38,
2004
- backgroundColor: color,
2005
- borderRadius: 1,
2006
- }}
2007
- />
2008
- <View
2009
- style={{
2010
- position: 'absolute',
2011
- top: size * 0.14,
2012
- width: size * 0.28,
2013
- height: size * 0.28,
2014
- borderLeftWidth: stroke,
2015
- borderTopWidth: stroke,
2016
- borderColor: color,
2017
- transform: [{ rotate: '45deg' }],
2018
- }}
2019
- />
2020
- </View>
2021
- );
2022
- }
2023
-
2024
- /** Gift / referral reward — box with ribbon. */
2025
- export function AppChromeGiftGlyph({ color = m3Colors.primary, size = 24 }: AppChromeGlyphProps) {
2026
- const stroke = strokeFor(size);
2027
- const box = size * 0.55;
2028
- return (
2029
- <View style={{ width: size, height: size, alignItems: 'center', justifyContent: 'center' }}>
2030
- <View
2031
- style={{
2032
- width: box,
2033
- height: box * 0.72,
2034
- marginTop: size * 0.12,
2035
- borderWidth: stroke,
2036
- borderColor: color,
2037
- borderRadius: size * 0.06,
2038
- }}
2039
- />
2040
- <View
2041
- style={{
2042
- position: 'absolute',
2043
- top: size * 0.22,
2044
- width: box,
2045
- height: stroke,
2046
- backgroundColor: color,
2047
- }}
2048
- />
2049
- <View
2050
- style={{
2051
- position: 'absolute',
2052
- top: size * 0.28,
2053
- width: stroke,
2054
- height: box * 0.72,
2055
- backgroundColor: color,
2056
- }}
2057
- />
2058
- <View
2059
- style={{
2060
- position: 'absolute',
2061
- top: size * 0.1,
2062
- width: size * 0.22,
2063
- height: size * 0.16,
2064
- borderWidth: stroke,
2065
- borderColor: color,
2066
- borderRadius: size * 0.11,
2067
- }}
2068
- />
2069
- </View>
2070
- );
2071
- }
2072
-
2073
- const styles = StyleSheet.create({
2074
- crosshair: {
2075
- position: 'absolute',
2076
- borderRadius: 1,
2077
- },
2078
- diag: {
2079
- position: 'absolute',
2080
- borderRadius: 1,
2081
- },
2082
- });