@btndprojects/loam-ui-native 0.1.1 → 0.2.1

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 (262) hide show
  1. package/dist/accordion/index.js +5 -3
  2. package/dist/adaptive/index.js +6 -2
  3. package/dist/alert/index.js +5 -2
  4. package/dist/analyzer/index.js +9 -6
  5. package/dist/announcement/index.js +8 -5
  6. package/dist/audio-player/index.js +5 -3
  7. package/dist/avatar/index.js +5 -2
  8. package/dist/avatar-group/index.js +7 -3
  9. package/dist/badge/index.js +7 -4
  10. package/dist/banner/index.js +5 -2
  11. package/dist/board/index.js +11 -6
  12. package/dist/button/index.js +6 -3
  13. package/dist/camera-permission/index.js +15 -12
  14. package/dist/capture-result/index.js +19 -16
  15. package/dist/card/index.js +6 -3
  16. package/dist/card-form/index.js +12 -8
  17. package/dist/carousel/index.js +4 -2
  18. package/dist/chart/index.js +8 -5
  19. package/dist/charts/index.js +8 -6
  20. package/dist/chat/index.js +16 -0
  21. package/dist/checkbox/index.js +6 -4
  22. package/dist/checklist/index.js +11 -8
  23. package/dist/checkout/index.js +16 -11
  24. package/dist/chip/index.js +7 -4
  25. package/dist/{chunk-XNUVB5OL.js → chunk-2OLKPG4E.js} +92 -28
  26. package/dist/{chunk-RUZHTGKB.js → chunk-2PKYGLQ6.js} +71 -40
  27. package/dist/{chunk-UC2WGUP3.js → chunk-2SWKL3AJ.js} +91 -252
  28. package/dist/{chunk-AI4DWZCD.js → chunk-2SY63FCH.js} +63 -16
  29. package/dist/{chunk-F5XNPWS7.js → chunk-2TXERVVA.js} +92 -35
  30. package/dist/chunk-36EC2T6P.js +581 -0
  31. package/dist/chunk-3DUWIYV5.js +437 -0
  32. package/dist/{chunk-JNY4ZHAR.js → chunk-3QMEOFW5.js} +275 -71
  33. package/dist/chunk-3WEZCGHX.js +265 -0
  34. package/dist/chunk-46MMSDGL.js +194 -0
  35. package/dist/{chunk-7O2FMUPT.js → chunk-4IZXHVFJ.js} +297 -92
  36. package/dist/{chunk-LAECSR4H.js → chunk-5LAAAXFP.js} +14 -8
  37. package/dist/{chunk-2A5NIQAK.js → chunk-5RENVKBQ.js} +134 -46
  38. package/dist/{chunk-2ZZ7TDJ4.js → chunk-5UTRIXQ6.js} +37 -31
  39. package/dist/{chunk-LOE5YNN3.js → chunk-5VFZRGVD.js} +37 -10
  40. package/dist/{chunk-52X2VYTD.js → chunk-67IZZ2MJ.js} +115 -60
  41. package/dist/{chunk-UYG5L34B.js → chunk-6YAQBXB3.js} +10 -4
  42. package/dist/{chunk-BTTFCMKG.js → chunk-74FLKD24.js} +94 -23
  43. package/dist/{chunk-ITTYJZWX.js → chunk-7BUIKDD6.js} +73 -18
  44. package/dist/{chunk-423B7SPN.js → chunk-7OVVSVEZ.js} +273 -109
  45. package/dist/chunk-AEB7KCHQ.js +287 -0
  46. package/dist/chunk-APCWFOZW.js +28 -0
  47. package/dist/chunk-AWKQIE5I.js +139 -0
  48. package/dist/{chunk-VCDBXW5H.js → chunk-B7N4ASYE.js} +86 -42
  49. package/dist/{chunk-IVNRBPGC.js → chunk-C4GTDLRC.js} +104 -20
  50. package/dist/{chunk-4ZAHCY44.js → chunk-C6APNDVA.js} +12 -5
  51. package/dist/{chunk-4SZYY6AN.js → chunk-CMTVNF3D.js} +18 -13
  52. package/dist/{chunk-HZ6CNMAF.js → chunk-CPTOADB2.js} +151 -96
  53. package/dist/chunk-D5N5QWI7.js +1325 -0
  54. package/dist/{chunk-IIQTAY3J.js → chunk-DN7MNQIP.js} +113 -29
  55. package/dist/{chunk-47FWHGUN.js → chunk-DVGBZ3TX.js} +84 -23
  56. package/dist/chunk-DW3L54DQ.js +305 -0
  57. package/dist/{chunk-3ARE4TES.js → chunk-E2E3I5W2.js} +69 -18
  58. package/dist/{chunk-DHWADYZX.js → chunk-EDCBJV7J.js} +41 -28
  59. package/dist/{chunk-WSW6ZFAQ.js → chunk-ENP3BMZU.js} +4 -4
  60. package/dist/{chunk-OOPPQH27.js → chunk-EVOIGUBI.js} +43 -19
  61. package/dist/{chunk-VEAYTRPX.js → chunk-EY4DD67D.js} +165 -97
  62. package/dist/{chunk-223Q2T2Q.js → chunk-F3H33DQX.js} +132 -61
  63. package/dist/{chunk-CYRBHQQZ.js → chunk-F5B3UINI.js} +68 -35
  64. package/dist/{chunk-6X6PQ443.js → chunk-FAJI7BSC.js} +20 -9
  65. package/dist/{chunk-MOUJOP55.js → chunk-FUMHAAF3.js} +96 -29
  66. package/dist/{chunk-6HT2LP62.js → chunk-FV6HMP7W.js} +192 -73
  67. package/dist/{chunk-S7F6XLTK.js → chunk-FYWNRX4F.js} +76 -47
  68. package/dist/{chunk-YG3ZJHGU.js → chunk-FZGAAOKS.js} +30 -8
  69. package/dist/{chunk-YDGVJETP.js → chunk-G3AFC24V.js} +1 -1
  70. package/dist/{chunk-EJBDRVIH.js → chunk-G6UESEVN.js} +15 -8
  71. package/dist/chunk-GDKVKNR2.js +339 -0
  72. package/dist/chunk-GEIGMWNF.js +10 -0
  73. package/dist/{chunk-JUAMLEHX.js → chunk-H7DWSL4O.js} +24 -12
  74. package/dist/chunk-HJFFOOJ4.js +1 -0
  75. package/dist/{chunk-RW6ZL2FQ.js → chunk-HJLPZA4X.js} +106 -21
  76. package/dist/chunk-HYEOQWT7.js +647 -0
  77. package/dist/chunk-I2KLQ2HA.js +19 -0
  78. package/dist/{chunk-CJ5EOYZE.js → chunk-I4FHVKEC.js} +11 -5
  79. package/dist/{chunk-JNH2TYIN.js → chunk-IDM7JJMO.js} +19 -5
  80. package/dist/{chunk-O4AEHWII.js → chunk-IPUNJMAQ.js} +141 -49
  81. package/dist/{chunk-J7Q7VCVC.js → chunk-IT6FUXXG.js} +13 -6
  82. package/dist/{chunk-QJJ6MADV.js → chunk-IVKMZ7BB.js} +80 -28
  83. package/dist/{chunk-Z7H7VSFZ.js → chunk-IXKWIFWZ.js} +17 -6
  84. package/dist/chunk-J64KGCGX.js +55 -0
  85. package/dist/chunk-JBMLWFSJ.js +270 -0
  86. package/dist/{chunk-4BXMXBJO.js → chunk-JJLPBRVZ.js} +22 -11
  87. package/dist/chunk-JLC6PM5S.js +406 -0
  88. package/dist/chunk-JUYWSSKW.js +335 -0
  89. package/dist/{chunk-7CFF4HXS.js → chunk-JV5YOTOB.js} +49 -11
  90. package/dist/{chunk-LZLHELAG.js → chunk-KFJGFLMW.js} +29 -8
  91. package/dist/{chunk-O7AE6DAF.js → chunk-KQZ3GLHR.js} +18 -8
  92. package/dist/{chunk-N32RGOA5.js → chunk-LKFC4CS7.js} +80 -24
  93. package/dist/{chunk-YC6WORFL.js → chunk-LMPHCVJJ.js} +82 -50
  94. package/dist/{chunk-3WPW4KUN.js → chunk-LQP4KEXZ.js} +45 -13
  95. package/dist/{chunk-TKQYWZ5V.js → chunk-LUMVGO2K.js} +47 -31
  96. package/dist/{chunk-AWJOCGFZ.js → chunk-M656FYNH.js} +25 -13
  97. package/dist/{chunk-35OFI3JG.js → chunk-MKSNFG7H.js} +73 -20
  98. package/dist/{chunk-4GBOGOTV.js → chunk-NBEF4EPJ.js} +16 -6
  99. package/dist/chunk-NNCOFLNE.js +24 -0
  100. package/dist/{chunk-4YQOR7JM.js → chunk-NTQ2F3AU.js} +73 -20
  101. package/dist/{chunk-QCDXZBC5.js → chunk-O5V4TG3V.js} +126 -44
  102. package/dist/{chunk-U7TFM2JA.js → chunk-OJQUBQWA.js} +3 -3
  103. package/dist/{chunk-VQHPQEUH.js → chunk-OWAMM2DK.js} +13 -6
  104. package/dist/chunk-PID3NJB7.js +405 -0
  105. package/dist/{chunk-HET4LLMX.js → chunk-PMMTGBBS.js} +27 -17
  106. package/dist/{chunk-RIBDXGUG.js → chunk-PNF3NKB5.js} +49 -16
  107. package/dist/{chunk-JXJB2X6M.js → chunk-Q6NKEPRE.js} +81 -32
  108. package/dist/chunk-QDZGFXQD.js +176 -0
  109. package/dist/{chunk-SYNOJOQO.js → chunk-QEYFDRHR.js} +60 -26
  110. package/dist/{chunk-VBOXAEPI.js → chunk-QHAITQIF.js} +97 -22
  111. package/dist/{chunk-VXDZFJGP.js → chunk-QHTVYA65.js} +230 -76
  112. package/dist/{chunk-TUTI5HOZ.js → chunk-QIKT7LIB.js} +14 -8
  113. package/dist/{chunk-3ENTMPQY.js → chunk-QP3KMOVF.js} +82 -42
  114. package/dist/{chunk-GNNJ4GCC.js → chunk-QPWDDJJ4.js} +62 -148
  115. package/dist/{chunk-QWCMU5B2.js → chunk-QRUMA22E.js} +205 -80
  116. package/dist/{chunk-ZVFE5QGU.js → chunk-QYPE5JX3.js} +50 -10
  117. package/dist/{chunk-PUPM2YGF.js → chunk-ROCUG24E.js} +76 -36
  118. package/dist/{chunk-NQYBUO3K.js → chunk-RU3ZPNL6.js} +333 -142
  119. package/dist/{chunk-TOXAGRDQ.js → chunk-RXSCIO6W.js} +14 -5
  120. package/dist/{chunk-FMYDDECK.js → chunk-SATMR6SG.js} +631 -203
  121. package/dist/{chunk-4YIP3CWS.js → chunk-SHHY5OMK.js} +7 -5
  122. package/dist/chunk-SKWO3SZF.js +2284 -0
  123. package/dist/{chunk-YF4NSSMT.js → chunk-SWS5JQIF.js} +41 -13
  124. package/dist/{chunk-CUMUNPXY.js → chunk-T5LTPKX6.js} +15 -7
  125. package/dist/{chunk-H6NIOQHK.js → chunk-TDMG26JI.js} +26 -6
  126. package/dist/{chunk-UWFLYMAR.js → chunk-TLCIR6RG.js} +267 -126
  127. package/dist/{chunk-SBMNWWBV.js → chunk-TN2ZNJUI.js} +47 -9
  128. package/dist/{chunk-5YNTNN5A.js → chunk-TQVAIKFD.js} +106 -41
  129. package/dist/chunk-TRGFFU6A.js +1456 -0
  130. package/dist/{chunk-2GK6PHGE.js → chunk-TY4MTKQJ.js} +100 -22
  131. package/dist/{chunk-AZRX6SAC.js → chunk-U23FYWME.js} +15 -7
  132. package/dist/{chunk-PZXZJBMP.js → chunk-U5NLHYV6.js} +26 -12
  133. package/dist/chunk-UQEN55EY.js +1 -0
  134. package/dist/chunk-UQGBTPXH.js +218 -0
  135. package/dist/chunk-UXGIW7OK.js +116 -0
  136. package/dist/{chunk-PJXUJYS6.js → chunk-UYGDJWMN.js} +55 -30
  137. package/dist/{chunk-QDYDBCFP.js → chunk-V2OEB75Z.js} +50 -51
  138. package/dist/{chunk-LSS54GLJ.js → chunk-VAOAKWUK.js} +34 -13
  139. package/dist/{chunk-DM5QUKKO.js → chunk-VDPK5CY4.js} +18 -6
  140. package/dist/chunk-W23G6JLF.js +37 -0
  141. package/dist/{chunk-CDRZHT42.js → chunk-W63AJTM7.js} +276 -12
  142. package/dist/{chunk-XXXEFXY5.js → chunk-W74TXYFB.js} +13 -5
  143. package/dist/{chunk-LRJNDEIA.js → chunk-WRDSPUE7.js} +144 -29
  144. package/dist/{chunk-C2NTXVWM.js → chunk-XBZGDDMR.js} +11 -4
  145. package/dist/{chunk-BV3B2HYZ.js → chunk-XIDTBCBA.js} +189 -131
  146. package/dist/{chunk-YTFKPRUK.js → chunk-XN4KG3P4.js} +348 -153
  147. package/dist/chunk-XQXMLMH3.js +211 -0
  148. package/dist/{chunk-HPPW424V.js → chunk-XTORZWRF.js} +19 -8
  149. package/dist/{chunk-P23EQNRQ.js → chunk-YAAHPATV.js} +181 -30
  150. package/dist/{chunk-KMI5ML5I.js → chunk-YXOAPXMU.js} +57 -18
  151. package/dist/{chunk-RJQOOHT2.js → chunk-ZECZOOSB.js} +59 -28
  152. package/dist/{chunk-QKXCPTFS.js → chunk-ZLTO5VQI.js} +121 -31
  153. package/dist/{chunk-BEDBFJND.js → chunk-ZVATDZOM.js} +16 -18
  154. package/dist/coachmark/index.js +6 -3
  155. package/dist/code-block/index.js +5 -3
  156. package/dist/color-field/index.js +6 -4
  157. package/dist/commerce/index.js +19 -16
  158. package/dist/connectivity/index.js +5 -2
  159. package/dist/context-menu/index.js +5 -3
  160. package/dist/copy-button/index.js +4 -2
  161. package/dist/data-grid/index.js +21 -16
  162. package/dist/date-range-picker/index.js +11 -8
  163. package/dist/description-list/index.js +3 -1
  164. package/dist/dialog/index.js +4 -2
  165. package/dist/empty-state/index.js +4 -2
  166. package/dist/error-summary/index.js +4 -2
  167. package/dist/fab/index.js +5 -2
  168. package/dist/file-manager/index.js +28 -0
  169. package/dist/file-upload/index.js +10 -7
  170. package/dist/filter-bar/index.js +9 -6
  171. package/dist/flow-run/index.js +15 -12
  172. package/dist/form/index.js +5 -3
  173. package/dist/gallery/index.js +5 -2
  174. package/dist/hold-to-confirm/index.js +4 -2
  175. package/dist/index.d.ts +9557 -2985
  176. package/dist/index.js +355 -122
  177. package/dist/infinite-list/index.js +4 -2
  178. package/dist/inline-edit/index.js +6 -4
  179. package/dist/input/index.js +5 -3
  180. package/dist/interactions/index.js +2 -1
  181. package/dist/invoice/index.js +13 -9
  182. package/dist/kbd/index.js +5 -1
  183. package/dist/keyboard/index.js +4 -2
  184. package/dist/list-row/index.js +6 -4
  185. package/dist/log-viewer/index.js +4 -2
  186. package/dist/map-view/index.js +5 -3
  187. package/dist/markdown/index.js +9 -6
  188. package/dist/metric/index.js +7 -4
  189. package/dist/money/index.js +9 -3
  190. package/dist/nav-drawer/index.js +4 -2
  191. package/dist/nav-header/index.js +9 -0
  192. package/dist/navigation/index.js +5 -2
  193. package/dist/notification-center/index.js +12 -10
  194. package/dist/number-roll/index.js +5 -2
  195. package/dist/one-handed/index.js +5 -3
  196. package/dist/os-surfaces/index.js +6 -3
  197. package/dist/otp/index.js +7 -4
  198. package/dist/page-header/index.js +1 -0
  199. package/dist/pagination/index.js +6 -0
  200. package/dist/payment-method/index.js +14 -10
  201. package/dist/payment-status/index.js +17 -14
  202. package/dist/permission/index.js +5 -2
  203. package/dist/picker/index.js +11 -6
  204. package/dist/progress/index.js +6 -3
  205. package/dist/pull-to-refresh/index.js +4 -2
  206. package/dist/radio-group/index.js +6 -4
  207. package/dist/rating/index.js +5 -2
  208. package/dist/receivables/index.js +21 -16
  209. package/dist/refund/index.js +18 -14
  210. package/dist/save-status/index.js +5 -3
  211. package/dist/scroll-area/index.js +3 -1
  212. package/dist/search-field/index.js +8 -0
  213. package/dist/segmented-control/index.js +4 -3
  214. package/dist/sheet/index.js +5 -3
  215. package/dist/skeleton/index.js +3 -1
  216. package/dist/slider/index.js +4 -2
  217. package/dist/sortable/index.js +7 -0
  218. package/dist/spinner/index.js +3 -1
  219. package/dist/split-button/index.js +9 -6
  220. package/dist/spotlight/index.js +3 -1
  221. package/dist/stage-timeline/index.js +5 -3
  222. package/dist/status-dot/index.js +4 -2
  223. package/dist/stepper/index.js +7 -4
  224. package/dist/streaming-text/index.js +3 -2
  225. package/dist/survey/index.js +18 -15
  226. package/dist/switch/index.js +5 -3
  227. package/dist/system-state/index.js +7 -4
  228. package/dist/tab-bar/index.js +5 -2
  229. package/dist/tabs/index.js +4 -2
  230. package/dist/tags-input/index.js +10 -0
  231. package/dist/textarea/index.js +6 -4
  232. package/dist/thinking/index.js +3 -1
  233. package/dist/time-field/index.js +12 -0
  234. package/dist/time-range-control/index.js +22 -0
  235. package/dist/timeline/index.js +4 -2
  236. package/dist/toast/index.js +4 -2
  237. package/dist/toolbar/index.js +4 -2
  238. package/dist/tour/index.js +12 -9
  239. package/dist/truncation-notice/index.js +5 -2
  240. package/dist/update-notice/index.js +12 -9
  241. package/dist/video-player/index.js +5 -2
  242. package/dist/viewfinder/index.js +6 -4
  243. package/dist/widget/index.js +7 -4
  244. package/dist/wizard/index.js +7 -4
  245. package/package.json +13 -12
  246. package/dist/chunk-6N33LFQA.js +0 -35
  247. package/dist/chunk-GDKZTW34.js +0 -395
  248. package/dist/chunk-GL7B2DOW.js +0 -134
  249. package/dist/chunk-NKB7BZYK.js +0 -167
  250. package/dist/chunk-OETCUXQP.js +0 -134
  251. package/dist/chunk-OPXFZ4Y5.js +0 -204
  252. package/dist/chunk-Q72LJOVE.js +0 -169
  253. package/dist/chunk-RNGLIHFA.js +0 -191
  254. package/dist/chunk-RQ3HASCC.js +0 -6
  255. package/dist/chunk-RSOJT5YW.js +0 -124
  256. package/dist/chunk-TKVFVF5D.js +0 -95
  257. package/dist/chunk-XOSCY2CW.js +0 -242
  258. package/dist/header/index.js +0 -5
  259. package/dist/search-bar/index.js +0 -5
  260. /package/dist/{chunk-3ECPOSKO.js → chunk-3UG6JUCV.js} +0 -0
  261. /package/dist/{chunk-JRLTGLN4.js → chunk-5WWRTEPS.js} +0 -0
  262. /package/dist/{chunk-RTIKSY6A.js → chunk-5Z5ZYMOJ.js} +0 -0
@@ -1,9 +1,28 @@
1
- import { Icon } from './chunk-TKVFVF5D.js';
1
+ import { useLabels } from './chunk-APCWFOZW.js';
2
+ import { Icon } from './chunk-UXGIW7OK.js';
3
+ import { useResolvedMotion, springConfig } from './chunk-J64KGCGX.js';
2
4
  import * as React from 'react';
3
- import { View, Text, Pressable } from 'react-native';
5
+ import { Animated, View, Text, Pressable } from 'react-native';
4
6
  import { createStyleSheet, useStyles, useLoamTheme } from '@btndprojects/loam-theme-native';
5
7
  import { jsxs, jsx } from 'react/jsx-runtime';
6
8
 
9
+ var DEFAULT_LABELS = {
10
+ play: "Play",
11
+ pause: "Pause",
12
+ mute: "Mute",
13
+ unmute: "Unmute",
14
+ captions: "Captions",
15
+ captionsMark: "CC",
16
+ fullscreen: "Fullscreen",
17
+ seek: "Seek",
18
+ seekValue: (current, total) => `${current} of ${total}`,
19
+ poster: (aspectRatio) => `Poster ${aspectRatio}`,
20
+ buffering: "Buffering",
21
+ error: "This video couldn\u2019t be played.",
22
+ retry: "Retry",
23
+ volume: (percent) => `Volume ${percent}%`,
24
+ speed: (rate) => `Speed ${rate}\xD7`
25
+ };
7
26
  var POSTER = {
8
27
  /** Inset from the top of the stage. */
9
28
  padTop: 10,
@@ -38,11 +57,12 @@ function VideoPlayer({
38
57
  onTogglePlay,
39
58
  onSeek,
40
59
  children,
41
- // Inert (see prop docs); destructured so it never reaches a native element.
42
- motion: _motion = "full"
60
+ motion = "full",
61
+ labels: labelsProp
43
62
  }) {
63
+ const labels = useLabels("videoPlayer", DEFAULT_LABELS, labelsProp);
44
64
  const { styles } = useStyles(sheet);
45
- const theme = useLoamTheme();
65
+ const theme = useLoamTheme("video-player");
46
66
  const [ownPlaying, setOwnPlaying] = React.useState(false);
47
67
  const [ownPosition, setOwnPosition] = React.useState(0);
48
68
  const [trackWidth, setTrackWidth] = React.useState(0);
@@ -50,6 +70,21 @@ function VideoPlayer({
50
70
  const isPlaying = playing ?? ownPlaying;
51
71
  const current = position ?? ownPosition;
52
72
  const pct = duration > 0 ? Math.min(1, Math.max(0, current / duration)) : 0;
73
+ const level = useResolvedMotion(motion, "video-player");
74
+ const chrome = React.useRef(new Animated.Value(isPlaying ? 0 : 1)).current;
75
+ const wasPlaying = React.useRef(isPlaying);
76
+ React.useEffect(() => {
77
+ if (wasPlaying.current === isPlaying) return;
78
+ wasPlaying.current = isPlaying;
79
+ const to = isPlaying ? 0 : 1;
80
+ if (level === "none") chrome.setValue(to);
81
+ else
82
+ Animated.spring(chrome, {
83
+ ...springConfig(theme, "de"),
84
+ toValue: to,
85
+ useNativeDriver: true
86
+ }).start();
87
+ }, [isPlaying, level, chrome, theme]);
53
88
  const toggle = () => {
54
89
  const next = !isPlaying;
55
90
  if (playing == null) setOwnPlaying(next);
@@ -63,33 +98,50 @@ function VideoPlayer({
63
98
  };
64
99
  return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
65
100
  /* @__PURE__ */ jsxs(View, { style: [styles.stage, { aspectRatio }], children: [
66
- children ?? /* @__PURE__ */ jsx(View, { style: styles.placeholder, children: /* @__PURE__ */ jsxs(Text, { style: styles.placeholderLabel, children: [
67
- "Poster ",
68
- Math.round(aspectRatio * 100) / 100
69
- ] }) }),
101
+ children ?? /* @__PURE__ */ jsx(View, { style: styles.placeholder, children: /* @__PURE__ */ jsx(Text, { style: styles.placeholderLabel, children: labels.poster(String(Math.round(aspectRatio * 100) / 100)) }) }),
70
102
  /* @__PURE__ */ jsxs(
71
103
  Pressable,
72
104
  {
73
105
  accessibilityRole: "button",
74
- accessibilityLabel: isPlaying ? "Pause" : "Play",
106
+ accessibilityLabel: isPlaying ? labels.pause : labels.play,
75
107
  accessibilityState: { selected: isPlaying },
76
108
  onPress: toggle,
77
109
  style: styles.stagePress,
78
110
  children: [
79
- /* @__PURE__ */ jsx(View, { style: [styles.scrim, isPlaying ? styles.scrimDim : null] }),
80
- !isPlaying ? (
81
- // Centred in the stage *above the transport bar*, with explicit insets
82
- // so the answer is the same in Yoga and in the browser.
83
- /* @__PURE__ */ jsx(View, { style: [styles.playSlot, { bottom: controlsHeight }], children: /* @__PURE__ */ jsx(View, { style: styles.playButton, children: /* @__PURE__ */ jsx(
84
- Icon,
85
- {
86
- name: "play",
87
- size: theme.icon.md,
88
- color: theme.color.text,
89
- strokeWidth: theme.icon.stroke
90
- }
91
- ) }) })
92
- ) : null
111
+ /* @__PURE__ */ jsx(
112
+ Animated.View,
113
+ {
114
+ style: [
115
+ styles.scrim,
116
+ { opacity: chrome.interpolate({ inputRange: [0, 1], outputRange: [0.5, 1] }) }
117
+ ]
118
+ }
119
+ ),
120
+ /* @__PURE__ */ jsx(
121
+ Animated.View,
122
+ {
123
+ pointerEvents: "none",
124
+ accessibilityElementsHidden: isPlaying,
125
+ importantForAccessibility: isPlaying ? "no-hide-descendants" : "auto",
126
+ style: [
127
+ styles.playSlot,
128
+ {
129
+ bottom: controlsHeight,
130
+ opacity: chrome,
131
+ transform: level === "full" ? [{ scale: chrome.interpolate({ inputRange: [0, 1], outputRange: [0.9, 1] }) }] : []
132
+ }
133
+ ],
134
+ children: isPlaying && level === "none" ? null : /* @__PURE__ */ jsx(View, { style: styles.playButton, children: /* @__PURE__ */ jsx(
135
+ Icon,
136
+ {
137
+ name: "play",
138
+ size: theme.icon.md,
139
+ color: theme.color.text,
140
+ strokeWidth: theme.icon.stroke
141
+ }
142
+ ) })
143
+ }
144
+ )
93
145
  ]
94
146
  }
95
147
  ),
@@ -103,11 +155,11 @@ function VideoPlayer({
103
155
  Pressable,
104
156
  {
105
157
  accessibilityRole: "adjustable",
106
- accessibilityLabel: "Seek",
158
+ accessibilityLabel: labels.seek,
107
159
  "aria-valuemin": 0,
108
160
  "aria-valuemax": Math.round(duration),
109
161
  "aria-valuenow": Math.round(current),
110
- "aria-valuetext": `${formatTime(current)} of ${formatTime(duration)}`,
162
+ "aria-valuetext": labels.seekValue(formatTime(current), formatTime(duration)),
111
163
  accessibilityActions: [{ name: "increment" }, { name: "decrement" }],
112
164
  onAccessibilityAction: (e) => {
113
165
  const delta = e.nativeEvent.actionName === "increment" ? 5 : -5;
@@ -117,9 +169,10 @@ function VideoPlayer({
117
169
  },
118
170
  onLayout: (e) => setTrackWidth(e.nativeEvent.layout.width),
119
171
  onPress: (e) => seekFromX(e.nativeEvent.locationX),
172
+ onTouchMove: (e) => seekFromX(e.nativeEvent.locationX),
120
173
  hitSlop: theme.space.s3,
121
174
  style: styles.seek,
122
- children: /* @__PURE__ */ jsxs(View, { style: styles.track, children: [
175
+ children: /* @__PURE__ */ jsxs(View, { style: [styles.track, { pointerEvents: "none" }], children: [
123
176
  /* @__PURE__ */ jsx(View, { style: [styles.fill, { width: `${pct * 100}%` }] }),
124
177
  /* @__PURE__ */ jsx(View, { style: [styles.knob, { start: `${pct * 100}%` }] })
125
178
  ] })
@@ -176,7 +229,6 @@ var sheet = createStyleSheet((theme) => ({
176
229
  // rather than the mode-aware `overlay.*`: what is underneath is video, and
177
230
  // darkening it is the only direction that makes a white glyph legible.
178
231
  scrim: { ...cover(), backgroundColor: theme.black.a8 },
179
- scrimDim: { backgroundColor: theme.black.a4 },
180
232
  // The band of the stage the transport bar does not cover. `bottom` is set from
181
233
  // the bar's measured height at render time.
182
234
  playSlot: {
@@ -1,15 +1,19 @@
1
- import { Icon } from './chunk-TKVFVF5D.js';
1
+ import { useLabels } from './chunk-APCWFOZW.js';
2
+ import { Icon } from './chunk-UXGIW7OK.js';
2
3
  import * as React from 'react';
3
4
  import { Animated, Easing, View, ScrollView, Pressable, Text } from 'react-native';
4
5
  import { createStyleSheet, useLoamTheme, useStyles } from '@btndprojects/loam-theme-native';
5
6
  import { jsxs, jsx } from 'react/jsx-runtime';
6
7
 
7
- var CLOSE_ACTIONS = [{ name: "close", label: "Close" }];
8
8
  function tabsRevealOffset(triggerX, triggerWidth, stripWidth, viewportWidth) {
9
9
  const max = stripWidth - viewportWidth;
10
10
  if (max <= 0) return 0;
11
11
  return Math.min(Math.max(triggerX + triggerWidth / 2 - viewportWidth / 2, 0), max);
12
12
  }
13
+ var DEFAULT_LABELS = {
14
+ close: "Close",
15
+ addTab: "Add tab"
16
+ };
13
17
  function Tabs({
14
18
  items,
15
19
  value,
@@ -19,9 +23,16 @@ function Tabs({
19
23
  size = "md",
20
24
  onClose,
21
25
  onAdd,
22
- addLabel = "Add tab",
23
- motion = "full"
26
+ addLabel: addLabelProp,
27
+ motion = "full",
28
+ labels: labelsProp
24
29
  }) {
30
+ const labels = useLabels("tabs", DEFAULT_LABELS, labelsProp);
31
+ const addLabel = addLabelProp ?? labels.addTab;
32
+ const closeActions = React.useMemo(
33
+ () => [{ name: "close", label: labels.close }],
34
+ [labels.close]
35
+ );
25
36
  const isControlled = value !== void 0;
26
37
  const [internal, setInternal] = React.useState(
27
38
  defaultValue ?? items[0]?.value
@@ -32,7 +43,7 @@ function Tabs({
32
43
  items.findIndex((item) => item.value === current)
33
44
  );
34
45
  const activeItem = items[activeIndex];
35
- const theme = useLoamTheme();
46
+ const theme = useLoamTheme("tabs");
36
47
  const { styles } = useStyles(sheet, { variant, size });
37
48
  const iconSize = size === "sm" ? 16 : 18;
38
49
  const closeIconSize = size === "sm" ? 14 : 16;
@@ -130,7 +141,7 @@ function Tabs({
130
141
  accessibilityRole: "tab",
131
142
  accessibilityState: { selected },
132
143
  "aria-selected": selected,
133
- accessibilityActions: item.closable ? CLOSE_ACTIONS : void 0,
144
+ accessibilityActions: item.closable ? closeActions : void 0,
134
145
  onAccessibilityAction: item.closable && onClose ? (e) => {
135
146
  if (e.nativeEvent.actionName === "close") onClose(item.value);
136
147
  } : void 0,
@@ -0,0 +1,55 @@
1
+ import * as React from 'react';
2
+ import { AccessibilityInfo } from 'react-native';
3
+ import { useAppMotionLevel } from '@btndprojects/loam-theme-native';
4
+ import { lowerMotion, SPRING_TOKENS } from '@btndprojects/loam-tokens';
5
+ export { BREAKAWAY, project, releaseVelocity, resist, rubberband } from '@btndprojects/loam-tokens';
6
+
7
+ // src/lib/motion.ts
8
+ function useReducedMotion() {
9
+ const [reduced, setReduced] = React.useState(false);
10
+ React.useEffect(() => {
11
+ let cancelled = false;
12
+ let sub;
13
+ try {
14
+ const query = AccessibilityInfo.isReduceMotionEnabled?.();
15
+ query?.then((value) => {
16
+ if (!cancelled) setReduced(value);
17
+ }).catch(() => {
18
+ });
19
+ sub = AccessibilityInfo.addEventListener?.("reduceMotionChanged", (value) => {
20
+ setReduced(value);
21
+ });
22
+ } catch {
23
+ }
24
+ return () => {
25
+ cancelled = true;
26
+ sub?.remove?.();
27
+ };
28
+ }, []);
29
+ return reduced;
30
+ }
31
+ function useResolvedMotion(motion = "full", component) {
32
+ const osReduced = useReducedMotion();
33
+ const app = useAppMotionLevel(component);
34
+ return lowerMotion(lowerMotion(motion, app), osReduced ? "reduced" : void 0);
35
+ }
36
+ function springConfig(theme, name, opts = {}) {
37
+ const s = theme.spring[name];
38
+ const spatial = SPRING_TOKENS[name].family === "spatial";
39
+ const ratio = opts.thrown && spatial ? Math.min(s.dampingRatio, 0.8) : s.dampingRatio;
40
+ return {
41
+ stiffness: s.stiffness,
42
+ damping: 2 * ratio * Math.sqrt(s.stiffness),
43
+ mass: 1,
44
+ velocity: opts.velocity ?? 0,
45
+ // loam-audit-ignore raw-spring — settle epsilons, not feel: the spring itself comes from the token.
46
+ restDisplacementThreshold: 1e-3,
47
+ // loam-audit-ignore raw-spring
48
+ restSpeedThreshold: 1e-3
49
+ };
50
+ }
51
+ function motionTiming(level) {
52
+ return { duration: level === "none" ? 1 : 150 };
53
+ }
54
+
55
+ export { motionTiming, springConfig, useReducedMotion, useResolvedMotion };
@@ -0,0 +1,270 @@
1
+ import { useReorder } from './chunk-36EC2T6P.js';
2
+ import { useLabels } from './chunk-APCWFOZW.js';
3
+ import { Icon } from './chunk-UXGIW7OK.js';
4
+ import * as React from 'react';
5
+ import { View, Animated, Pressable, Text } from 'react-native';
6
+ import { createStyleSheet, useStyles, useLoamTheme } from '@btndprojects/loam-theme-native';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var DEFAULT_LABELS = {
10
+ list: "Sortable list",
11
+ moveUp: "Move up",
12
+ moveDown: "Move down",
13
+ moveToTop: "Move to top",
14
+ moveToBottom: "Move to bottom",
15
+ moved: (label, position, count) => `Moved ${label} to position ${position} of ${count}`,
16
+ movedNotice: (label) => `Moved ${label}`,
17
+ restored: (label, position, count) => `Restored ${label} to position ${position} of ${count}`,
18
+ pickedUp: (label) => `Picked up ${label}`,
19
+ droppedInPlace: (label) => `${label} dropped where it started`,
20
+ rowHint: (position, count) => `Position ${position} of ${count}. Press and hold to drag, or use the actions to move it.`
21
+ };
22
+ var rowActions = (labels) => [
23
+ { name: "moveUp", label: labels.moveUp },
24
+ { name: "moveDown", label: labels.moveDown },
25
+ { name: "moveToTop", label: labels.moveToTop },
26
+ { name: "moveToBottom", label: labels.moveToBottom }
27
+ ];
28
+ function clamp(value, min, max) {
29
+ return Math.min(max, Math.max(min, value));
30
+ }
31
+ function Sortable({
32
+ items,
33
+ order,
34
+ defaultOrder,
35
+ onReorder,
36
+ onDraggingChange,
37
+ label: labelProp,
38
+ numbered = true,
39
+ handleIcon = "grip",
40
+ disabled = false,
41
+ formatAnnouncement,
42
+ motion = "full",
43
+ onNotify,
44
+ style,
45
+ labels: labelsProp
46
+ }) {
47
+ const { styles } = useStyles(sheet);
48
+ const labels = useLabels("sortable", DEFAULT_LABELS, labelsProp);
49
+ const label = labelProp ?? labels.list;
50
+ const ids = React.useMemo(() => items.map((item) => item.id), [items]);
51
+ const byId = React.useMemo(() => new Map(items.map((item) => [item.id, item])), [items]);
52
+ const isControlled = order !== void 0;
53
+ const [internalOrder, setInternalOrder] = React.useState(() => defaultOrder ?? ids);
54
+ const rawOrder = isControlled ? order : internalOrder;
55
+ const resolved = React.useMemo(() => {
56
+ const known = new Set(ids);
57
+ const kept = rawOrder.filter((id) => known.has(id));
58
+ const seen = new Set(kept);
59
+ return [...kept, ...ids.filter((id) => !seen.has(id))];
60
+ }, [ids, rawOrder]);
61
+ const [message, setMessage] = React.useState("");
62
+ const moveTo = (id, index) => {
63
+ const from = resolved.indexOf(id);
64
+ const to = clamp(index, 0, resolved.length - 1);
65
+ if (from < 0 || from === to) return;
66
+ const next = [...resolved];
67
+ next.splice(from, 1);
68
+ next.splice(to, 0, id);
69
+ if (!isControlled) setInternalOrder(next);
70
+ const detail = {
71
+ id,
72
+ label: byId.get(id)?.label ?? id,
73
+ from,
74
+ to,
75
+ count: next.length
76
+ };
77
+ onReorder?.(next, detail);
78
+ setMessage(
79
+ formatAnnouncement ? formatAnnouncement(detail) : labels.moved(detail.label, detail.to + 1, detail.count)
80
+ );
81
+ if (onNotify) {
82
+ const before = resolved;
83
+ onNotify({
84
+ text: labels.movedNotice(detail.label),
85
+ undo: () => {
86
+ if (!isControlled) setInternalOrder(before);
87
+ onReorder?.(before, { ...detail, from: to, to: from });
88
+ setMessage(labels.restored(detail.label, from + 1, detail.count));
89
+ }
90
+ });
91
+ }
92
+ };
93
+ const draggingRef = React.useRef(onDraggingChange);
94
+ draggingRef.current = onDraggingChange;
95
+ const reorder = useReorder({
96
+ motion,
97
+ disabled,
98
+ renderGhost: (id) => {
99
+ const item = byId.get(id);
100
+ return item ? /* @__PURE__ */ jsx(
101
+ RowBody,
102
+ {
103
+ item,
104
+ index: resolved.indexOf(id),
105
+ numbered,
106
+ handleIcon,
107
+ lifted: true
108
+ }
109
+ ) : null;
110
+ },
111
+ onLift: (id) => {
112
+ draggingRef.current?.(true);
113
+ setMessage(labels.pickedUp(byId.get(id)?.label ?? id));
114
+ },
115
+ onMove: ({ id, to }) => {
116
+ draggingRef.current?.(false);
117
+ moveTo(id, to);
118
+ },
119
+ onCancel: (id) => {
120
+ draggingRef.current?.(false);
121
+ setMessage(labels.droppedInPlace(byId.get(id)?.label ?? id));
122
+ }
123
+ });
124
+ const step = (id, to) => {
125
+ if (disabled) return false;
126
+ const from = resolved.indexOf(id);
127
+ const target = clamp(to, 0, resolved.length - 1);
128
+ if (from < 0 || target === from) return false;
129
+ reorder.animate(() => moveTo(id, target));
130
+ return true;
131
+ };
132
+ const onKey = (event, id) => {
133
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
134
+ const index = resolved.indexOf(id);
135
+ const to = event.key === "ArrowUp" ? index - 1 : event.key === "ArrowDown" ? index + 1 : event.key === "Home" ? 0 : event.key === "End" ? resolved.length - 1 : null;
136
+ if (to !== null && step(id, to)) event.preventDefault?.();
137
+ };
138
+ const onAction = (event, id) => {
139
+ const index = resolved.indexOf(id);
140
+ const name = event.nativeEvent.actionName;
141
+ if (name === "moveUp") step(id, index - 1);
142
+ else if (name === "moveDown") step(id, index + 1);
143
+ else if (name === "moveToTop") step(id, 0);
144
+ else if (name === "moveToBottom") step(id, resolved.length - 1);
145
+ };
146
+ return /* @__PURE__ */ jsxs(View, { style: [styles.root, style], children: [
147
+ /* @__PURE__ */ jsx(View, { role: "list", accessibilityLabel: label, style: styles.list, ...reorder.group("list"), children: resolved.map((id, index) => {
148
+ const item = byId.get(id);
149
+ const keyProps = {
150
+ onKeyDown: (event) => onKey(event, id)
151
+ };
152
+ return /* @__PURE__ */ jsx(Animated.View, { role: "listitem", ...reorder.item(id, "list", index), children: /* @__PURE__ */ jsx(
153
+ Pressable,
154
+ {
155
+ ...disabled ? {} : reorder.press(id),
156
+ disabled,
157
+ accessibilityRole: "button",
158
+ accessibilityLabel: item.label,
159
+ accessibilityHint: labels.rowHint(index + 1, resolved.length),
160
+ accessibilityState: { disabled },
161
+ accessibilityActions: disabled ? void 0 : rowActions(labels),
162
+ onAccessibilityAction: (event) => onAction(event, id),
163
+ style: ({ pressed }) => [styles.press, pressed && !disabled && styles.pressed],
164
+ ...keyProps,
165
+ children: /* @__PURE__ */ jsx(
166
+ RowBody,
167
+ {
168
+ item,
169
+ index,
170
+ numbered,
171
+ handleIcon,
172
+ disabled
173
+ }
174
+ )
175
+ }
176
+ ) }, id);
177
+ }) }),
178
+ reorder.overlay,
179
+ /* @__PURE__ */ jsx(
180
+ View,
181
+ {
182
+ role: "status",
183
+ style: styles.srOnly,
184
+ accessibilityLabel: message,
185
+ ...{ "aria-live": "polite" },
186
+ children: /* @__PURE__ */ jsx(Text, { style: styles.srOnly, children: message })
187
+ }
188
+ )
189
+ ] });
190
+ }
191
+ function RowBody({
192
+ item,
193
+ index,
194
+ numbered,
195
+ handleIcon,
196
+ lifted = false,
197
+ disabled = false
198
+ }) {
199
+ const { styles } = useStyles(sheet);
200
+ const theme = useLoamTheme("sortable");
201
+ return /* @__PURE__ */ jsxs(View, { style: [styles.row, lifted && styles.rowLifted, disabled && styles.rowDisabled], children: [
202
+ lifted ? /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: styles.draggedLayer }) : null,
203
+ /* @__PURE__ */ jsx(
204
+ Icon,
205
+ {
206
+ name: item.icon ?? handleIcon,
207
+ size: theme.icon.md,
208
+ color: lifted ? theme.color.accent : theme.color.text3,
209
+ strokeWidth: theme.icon.stroke
210
+ }
211
+ ),
212
+ numbered ? /* @__PURE__ */ jsx(Text, { style: styles.position, children: index + 1 }) : null,
213
+ /* @__PURE__ */ jsx(Text, { style: styles.label, numberOfLines: 1, children: item.label }),
214
+ item.meta ? /* @__PURE__ */ jsx(Text, { style: styles.meta, children: item.meta }) : null
215
+ ] });
216
+ }
217
+ var sheet = createStyleSheet((theme) => ({
218
+ root: { alignSelf: "stretch" },
219
+ list: { gap: theme.space.s2 },
220
+ press: { borderRadius: theme.radius.md },
221
+ pressed: { opacity: theme.state.pressedOpacity },
222
+ row: {
223
+ flexDirection: "row",
224
+ alignItems: "center",
225
+ gap: theme.space.s3,
226
+ minHeight: theme.layout.listRowH,
227
+ paddingHorizontal: theme.space.s3,
228
+ borderRadius: theme.radius.md,
229
+ borderWidth: theme.borderWidth.base,
230
+ borderColor: theme.color.border,
231
+ backgroundColor: theme.color.surface2,
232
+ overflow: "hidden"
233
+ },
234
+ // Lifted: an accent edge and the dragged state layer; the ghost carries the shadow.
235
+ rowLifted: { borderColor: theme.focus.ringColor },
236
+ rowDisabled: { opacity: theme.state.disabledOpacity },
237
+ draggedLayer: {
238
+ position: "absolute",
239
+ top: 0,
240
+ right: 0,
241
+ bottom: 0,
242
+ left: 0,
243
+ backgroundColor: theme.state.dragged
244
+ },
245
+ position: {
246
+ fontFamily: theme.font.mono,
247
+ fontSize: theme.type.footnote.fontSize,
248
+ color: theme.color.text2
249
+ },
250
+ label: {
251
+ flex: 1,
252
+ fontFamily: theme.font.sans,
253
+ fontSize: theme.type.body.fontSize,
254
+ lineHeight: theme.type.body.lineHeight,
255
+ color: theme.color.text
256
+ },
257
+ meta: {
258
+ fontFamily: theme.font.mono,
259
+ fontSize: theme.type.caption1.fontSize,
260
+ color: theme.color.text2
261
+ },
262
+ srOnly: {
263
+ position: "absolute",
264
+ width: theme.space[1],
265
+ height: theme.space[1],
266
+ overflow: "hidden"
267
+ }
268
+ }));
269
+
270
+ export { Sortable };
@@ -1,10 +1,10 @@
1
+ import { useResolvedMotion } from './chunk-J64KGCGX.js';
1
2
  import * as React from 'react';
2
3
  import { View, Animated, Easing, ScrollView } from 'react-native';
3
4
  import { Svg, Defs, LinearGradient, Stop, Rect } from 'react-native-svg';
4
5
  import { createStyleSheet, useStyles, useLoamTheme } from '@btndprojects/loam-theme-native';
5
6
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
7
 
7
- // src/scroll-area/scroll-area.tsx
8
8
  var FADE_SIZE = 32;
9
9
  function ScrollArea({
10
10
  children,
@@ -12,11 +12,12 @@ function ScrollArea({
12
12
  fade = false,
13
13
  maxHeight,
14
14
  maxWidth,
15
- motion = "full",
15
+ motion: motionProp = "full",
16
16
  accessibilityLabel
17
17
  }) {
18
+ const motion = useResolvedMotion(motionProp, "scroll-area");
18
19
  const { styles } = useStyles(sheet);
19
- const theme = useLoamTheme();
20
+ const theme = useLoamTheme("scroll-area");
20
21
  const horizontal = orientation === "horizontal";
21
22
  const axis = horizontal ? "x" : "y";
22
23
  const [container, setContainer] = React.useState(0);
@@ -115,20 +116,30 @@ function Fade({
115
116
  opacity.setValue(to);
116
117
  }
117
118
  }, [visible, motion, opacity, hoverDuration, hoverEasing]);
118
- const theme = useLoamTheme();
119
+ const theme = useLoamTheme("scroll-area");
119
120
  const fade = theme.space[FADE_SIZE];
120
121
  const vertical = side === "top" || side === "bottom";
121
122
  const solidAtStart = side === "top" || side === "start";
122
123
  const coords = vertical ? { x1: "0", y1: "0", x2: "0", y2: "1" } : { x1: "0", y1: "0", x2: "1", y2: "0" };
123
124
  const box = side === "top" ? { top: 0, left: 0, right: 0, height: fade } : side === "bottom" ? { bottom: 0, left: 0, right: 0, height: fade } : side === "start" ? { top: 0, bottom: 0, start: 0, width: fade } : { top: 0, bottom: 0, end: 0, width: fade };
124
125
  const id = `loam-scroll-fade-${side}`;
125
- return /* @__PURE__ */ jsx(Animated.View, { style: [{ position: "absolute", opacity, pointerEvents: "none" }, box], children: /* @__PURE__ */ jsxs(Svg, { width: "100%", height: "100%", children: [
126
- /* @__PURE__ */ jsx(Defs, { children: /* @__PURE__ */ jsxs(LinearGradient, { id, x1: coords.x1, y1: coords.y1, x2: coords.x2, y2: coords.y2, children: [
127
- /* @__PURE__ */ jsx(Stop, { offset: "0", stopColor: color, stopOpacity: solidAtStart ? 1 : 0 }),
128
- /* @__PURE__ */ jsx(Stop, { offset: "1", stopColor: color, stopOpacity: solidAtStart ? 0 : 1 })
129
- ] }) }),
130
- /* @__PURE__ */ jsx(Rect, { x: "0", y: "0", width: "100%", height: "100%", fill: `url(#${id})` })
131
- ] }) });
126
+ return /* @__PURE__ */ jsx(
127
+ Animated.View,
128
+ {
129
+ accessible: false,
130
+ accessibilityElementsHidden: true,
131
+ importantForAccessibility: "no-hide-descendants",
132
+ "aria-hidden": true,
133
+ style: [{ position: "absolute", opacity, pointerEvents: "none" }, box],
134
+ children: /* @__PURE__ */ jsxs(Svg, { width: "100%", height: "100%", children: [
135
+ /* @__PURE__ */ jsx(Defs, { children: /* @__PURE__ */ jsxs(LinearGradient, { id, x1: coords.x1, y1: coords.y1, x2: coords.x2, y2: coords.y2, children: [
136
+ /* @__PURE__ */ jsx(Stop, { offset: "0", stopColor: color, stopOpacity: solidAtStart ? 1 : 0 }),
137
+ /* @__PURE__ */ jsx(Stop, { offset: "1", stopColor: color, stopOpacity: solidAtStart ? 0 : 1 })
138
+ ] }) }),
139
+ /* @__PURE__ */ jsx(Rect, { x: "0", y: "0", width: "100%", height: "100%", fill: `url(#${id})` })
140
+ ] })
141
+ }
142
+ );
132
143
  }
133
144
  var sheet = createStyleSheet((theme) => ({
134
145
  root: {