@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,14 +1,23 @@
1
- import { PhaseAnnouncement, NoteBlock } from './chunk-N32RGOA5.js';
2
- import { Card, CardHeader, CardTitle, CardContent, CardFooter } from './chunk-KMI5ML5I.js';
3
- import { decorativeProps, camInk } from './chunk-RW6ZL2FQ.js';
4
- import { Button } from './chunk-3ARE4TES.js';
5
- import { Icon } from './chunk-TKVFVF5D.js';
1
+ import { PhaseAnnouncement, NoteBlock } from './chunk-LKFC4CS7.js';
2
+ import { Card, CardHeader, CardTitle, CardContent, CardFooter } from './chunk-YXOAPXMU.js';
3
+ import { useAnalyzerCopy, decorativeProps, camInk } from './chunk-HJLPZA4X.js';
4
+ import { Button } from './chunk-E2E3I5W2.js';
5
+ import { useLabels } from './chunk-APCWFOZW.js';
6
+ import { Icon } from './chunk-UXGIW7OK.js';
7
+ import { useResolvedMotion, motionTiming, springConfig } from './chunk-J64KGCGX.js';
6
8
  import * as React from 'react';
7
- import { View, Text, Platform, findNodeHandle, AccessibilityInfo } from 'react-native';
9
+ import { Animated, View, Text, Platform, findNodeHandle, AccessibilityInfo } from 'react-native';
8
10
  import { createStyleSheet, useLoamTheme, useStyles } from '@btndprojects/loam-theme-native';
9
- import { DONE_LABEL, permissionScreen, PERMISSION } from '@btndprojects/loam-analyzer';
11
+ import { permissionScreen } from '@btndprojects/loam-analyzer';
10
12
  import { jsx, jsxs } from 'react/jsx-runtime';
11
13
 
14
+ // src/camera-permission/camera-permission-labels.ts
15
+ var DEFAULT_CAMERA_PERMISSION_LABELS = {
16
+ takeAnother: "Take another"
17
+ };
18
+ function useCameraPermissionLabels(own) {
19
+ return useLabels("cameraPermission", DEFAULT_CAMERA_PERMISSION_LABELS, own);
20
+ }
12
21
  var STATE_ICON = {
13
22
  undetermined: "camera",
14
23
  prompting: "camera",
@@ -24,13 +33,29 @@ function ScreenShell({
24
33
  inert = false,
25
34
  announce = true,
26
35
  autoFocus = false,
27
- body
36
+ body,
37
+ copy: copyProp
28
38
  }) {
29
- const theme = useLoamTheme();
39
+ const words = useAnalyzerCopy(copyProp);
40
+ const theme = useLoamTheme("camera-permission");
30
41
  const { styles } = useStyles(permissionSheet, { inert });
31
- const screen = permissionScreen(state);
42
+ const screen = permissionScreen(state, words);
32
43
  const copy = body ?? screen.body;
33
44
  const heading = React.useRef(null);
45
+ const level = useResolvedMotion(void 0, "camera-permission");
46
+ const rise = React.useRef(new Animated.Value(level === "none" ? 1 : 0)).current;
47
+ React.useEffect(() => {
48
+ if (level === "none") return;
49
+ if (level === "reduced") {
50
+ Animated.timing(rise, { ...motionTiming(level), toValue: 1, useNativeDriver: true }).start();
51
+ } else {
52
+ Animated.spring(rise, {
53
+ ...springConfig(theme, "ds"),
54
+ toValue: 1,
55
+ useNativeDriver: true
56
+ }).start();
57
+ }
58
+ }, []);
34
59
  React.useLayoutEffect(() => {
35
60
  if (!autoFocus) return;
36
61
  const node = heading.current;
@@ -39,10 +64,16 @@ function ScreenShell({
39
64
  if (tag !== null) AccessibilityInfo.setAccessibilityFocus(tag);
40
65
  }, [autoFocus]);
41
66
  return /* @__PURE__ */ jsx(
42
- View,
67
+ Animated.View,
43
68
  {
44
69
  testID: `loam-permission-${state}`,
45
- style: styles.shell,
70
+ style: [
71
+ styles.shell,
72
+ {
73
+ opacity: rise,
74
+ transform: level === "full" ? [{ translateY: rise.interpolate({ inputRange: [0, 1], outputRange: [12, 0] }) }] : []
75
+ }
76
+ ],
46
77
  children: /* @__PURE__ */ jsxs(Card, { variant: "elevated", style: styles.card, children: [
47
78
  /* @__PURE__ */ jsx(PhaseAnnouncement, { message: announce ? `${screen.heading}. ${copy}` : null }),
48
79
  /* @__PURE__ */ jsxs(CardHeader, { children: [
@@ -57,22 +88,33 @@ function ScreenShell({
57
88
  /* @__PURE__ */ jsx(CardTitle, { children: /* @__PURE__ */ jsx(Text, { ref: heading, accessibilityRole: "header", style: styles.heading, children: screen.heading }) }),
58
89
  /* @__PURE__ */ jsx(Text, { style: styles.body, children: copy })
59
90
  ] }),
60
- /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(NoteBlock, { title: PERMISSION[state].label, description: screen.note }) }),
91
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(NoteBlock, { title: words.permission[state].label, description: screen.note }) }),
61
92
  /* @__PURE__ */ jsx(CardFooter, { children: /* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
62
- screen.secondary ? /* @__PURE__ */ jsx(View, { style: styles.actionSlot, children: /* @__PURE__ */ jsx(Button, { variant: "outline", size: "lg", fullWidth: true, disabled: inert, onPress: onSecondary, children: screen.secondary }) }) : null,
93
+ screen.secondary ? /* @__PURE__ */ jsx(View, { style: styles.actionSlot, children: /* @__PURE__ */ jsx(
94
+ Button,
95
+ {
96
+ variant: "outline",
97
+ size: "lg",
98
+ fullWidth: true,
99
+ disabled: inert,
100
+ onPress: onSecondary,
101
+ children: screen.secondary
102
+ }
103
+ ) }) : null,
63
104
  /* @__PURE__ */ jsx(View, { style: styles.actionSlot, children: /* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", fullWidth: true, disabled: inert, onPress: onPrimary, children: screen.primary }) })
64
105
  ] }) })
65
106
  ] })
66
107
  }
67
108
  );
68
109
  }
69
- function PermissionPrimer({
110
+ function CameraPermissionPrimer({
70
111
  privacyStatement,
71
112
  prompting = false,
72
113
  onContinue,
73
114
  onUpload,
74
115
  autoFocus,
75
- announce
116
+ announce,
117
+ copy
76
118
  }) {
77
119
  return /* @__PURE__ */ jsx(
78
120
  ScreenShell,
@@ -83,7 +125,8 @@ function PermissionPrimer({
83
125
  onPrimary: onContinue,
84
126
  onSecondary: onUpload,
85
127
  autoFocus,
86
- announce
128
+ announce,
129
+ copy
87
130
  }
88
131
  );
89
132
  }
@@ -91,7 +134,8 @@ function CameraDenied({
91
134
  onOpenSettings,
92
135
  onUpload,
93
136
  autoFocus,
94
- announce
137
+ announce,
138
+ copy
95
139
  }) {
96
140
  return /* @__PURE__ */ jsx(
97
141
  ScreenShell,
@@ -100,14 +144,16 @@ function CameraDenied({
100
144
  onPrimary: onOpenSettings,
101
145
  onSecondary: onUpload,
102
146
  autoFocus,
103
- announce
147
+ announce,
148
+ copy
104
149
  }
105
150
  );
106
151
  }
107
152
  function CameraUnavailable({
108
153
  onUpload,
109
154
  autoFocus,
110
- announce
155
+ announce,
156
+ copy
111
157
  }) {
112
158
  return /* @__PURE__ */ jsx(
113
159
  ScreenShell,
@@ -115,7 +161,8 @@ function CameraUnavailable({
115
161
  state: "unavailable",
116
162
  onPrimary: onUpload,
117
163
  autoFocus,
118
- announce
164
+ announce,
165
+ copy
119
166
  }
120
167
  );
121
168
  }
@@ -126,48 +173,89 @@ function CameraPermissionScreen({
126
173
  onUpload,
127
174
  privacyStatement,
128
175
  autoFocus,
129
- announce
176
+ announce,
177
+ copy
130
178
  }) {
131
- if (state === "granted") return null;
132
- if (state === "denied") {
179
+ const theme = useLoamTheme("camera-permission");
180
+ const level = useResolvedMotion(void 0, "camera-permission");
181
+ const last = React.useRef(state);
182
+ const fade = React.useRef(new Animated.Value(1)).current;
183
+ const [leaving, setLeaving] = React.useState(false);
184
+ const granted = state === "granted";
185
+ if (!granted) last.current = state;
186
+ React.useEffect(() => {
187
+ if (!granted) {
188
+ fade.setValue(1);
189
+ setLeaving(false);
190
+ return;
191
+ }
192
+ if (level === "none") return;
193
+ setLeaving(true);
194
+ Animated.timing(fade, {
195
+ duration: level === "reduced" ? theme.duration.fast : theme.duration.slow,
196
+ toValue: 0,
197
+ useNativeDriver: true
198
+ }).start(() => setLeaving(false));
199
+ }, [granted, level, fade]);
200
+ if (granted && !leaving) return null;
201
+ const shown = granted ? last.current : state;
202
+ return /* @__PURE__ */ jsx(Animated.View, { style: { opacity: fade }, pointerEvents: granted ? "none" : "auto", children: renderScreen(shown) });
203
+ function renderScreen(state2) {
204
+ if (state2 === "denied") {
205
+ return /* @__PURE__ */ jsx(
206
+ CameraDenied,
207
+ {
208
+ onOpenSettings,
209
+ onUpload,
210
+ autoFocus,
211
+ announce,
212
+ copy
213
+ }
214
+ );
215
+ }
216
+ if (state2 === "unavailable") {
217
+ return /* @__PURE__ */ jsx(
218
+ CameraUnavailable,
219
+ {
220
+ onUpload,
221
+ autoFocus,
222
+ announce,
223
+ copy
224
+ }
225
+ );
226
+ }
133
227
  return /* @__PURE__ */ jsx(
134
- CameraDenied,
228
+ CameraPermissionPrimer,
135
229
  {
136
- onOpenSettings,
230
+ prompting: state2 === "prompting",
231
+ privacyStatement,
232
+ onContinue: onRequestPermission,
137
233
  onUpload,
138
234
  autoFocus,
139
- announce
235
+ announce,
236
+ copy
140
237
  }
141
238
  );
142
239
  }
143
- if (state === "unavailable") {
144
- return /* @__PURE__ */ jsx(CameraUnavailable, { onUpload, autoFocus, announce });
145
- }
146
- return /* @__PURE__ */ jsx(
147
- PermissionPrimer,
148
- {
149
- prompting: state === "prompting",
150
- privacyStatement,
151
- onContinue: onRequestPermission,
152
- onUpload,
153
- autoFocus,
154
- announce
155
- }
156
- );
157
240
  }
158
241
  function CaptureDone({
159
- label = DONE_LABEL,
160
- actionLabel = "Take another",
242
+ label: labelProp,
243
+ actionLabel,
244
+ labels,
245
+ copy,
161
246
  onTakeAnother,
162
247
  announce = true
163
248
  }) {
164
- const theme = useLoamTheme();
249
+ const t = useCameraPermissionLabels(labels);
250
+ const words = useAnalyzerCopy(copy);
251
+ const label = labelProp ?? words.done;
252
+ const theme = useLoamTheme("camera-permission");
165
253
  const { styles } = useStyles(permissionSheet);
166
254
  return /* @__PURE__ */ jsxs(View, { testID: "loam-capture-done", style: styles.done, children: [
167
255
  /* @__PURE__ */ jsx(PhaseAnnouncement, { message: announce ? label : null }),
168
256
  /* @__PURE__ */ jsx(View, { accessible: false, style: styles.doneMark, ...decorativeProps(), children: /* @__PURE__ */ jsx(Icon, { name: "check", size: theme.icon.lg, color: theme.color.goodInk }) }),
169
257
  /* @__PURE__ */ jsx(Text, { style: [styles.doneLabel, { color: camInk(theme) }], children: label }),
170
- /* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", fullWidth: true, onPress: onTakeAnother, children: actionLabel })
258
+ /* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", fullWidth: true, onPress: onTakeAnother, children: actionLabel ?? t.takeAnother })
171
259
  ] });
172
260
  }
173
261
  var permissionSheet = createStyleSheet((theme) => ({
@@ -251,4 +339,4 @@ var permissionSheet = createStyleSheet((theme) => ({
251
339
  }
252
340
  }));
253
341
 
254
- export { CameraDenied, CameraPermissionScreen, CameraUnavailable, CaptureDone, PermissionPrimer };
342
+ export { CameraDenied, CameraPermissionPrimer, CameraPermissionScreen, CameraUnavailable, CaptureDone };
@@ -1,19 +1,23 @@
1
1
  import { resolveStepState } from './chunk-YLLCXTMC.js';
2
- import { NumberRoll } from './chunk-CUMUNPXY.js';
2
+ import { NumberRoll } from './chunk-T5LTPKX6.js';
3
+ import { useLabels } from './chunk-APCWFOZW.js';
3
4
  import * as React from 'react';
4
5
  import { Animated, Easing, View, Text } from 'react-native';
5
6
  import { createStyleSheet, useLoamTheme, useStyles } from '@btndprojects/loam-theme-native';
6
7
  import { jsxs, jsx } from 'react/jsx-runtime';
7
8
 
8
- var DEFAULT_LATE_LABEL = "Still working\u2026";
9
9
  var INDETERMINATE_SPAN = 0.4;
10
10
  var INDETERMINATE_CYCLES = 2;
11
11
  var INDETERMINATE_REST = 0.5;
12
+ var DEFAULT_LABELS = {
13
+ lateLabel: "Still working\u2026",
14
+ percent: (percent) => `${percent}%`
15
+ };
12
16
  function clamp(n, lo, hi) {
13
17
  return Math.max(lo, Math.min(hi, n));
14
18
  }
15
19
  function useFillColor(tone) {
16
- const theme = useLoamTheme();
20
+ const theme = useLoamTheme("progress");
17
21
  switch (tone) {
18
22
  case "good":
19
23
  return theme.color.good;
@@ -33,12 +37,14 @@ function Progress({
33
37
  showValue = false,
34
38
  label,
35
39
  late = false,
36
- lateLabel = DEFAULT_LATE_LABEL,
40
+ lateLabel,
37
41
  motion = "full",
38
42
  animateValue = false,
39
- accessibilityLabel
43
+ accessibilityLabel,
44
+ labels: labelsProp
40
45
  }) {
41
- const theme = useLoamTheme();
46
+ const theme = useLoamTheme("progress");
47
+ const labels = useLabels("progress", DEFAULT_LABELS, labelsProp);
42
48
  const { styles } = useStyles(sheet, { size });
43
49
  const fillColor = useFillColor(tone);
44
50
  const indeterminate = value === void 0;
@@ -83,22 +89,19 @@ function Progress({
83
89
  outputRange: ["-40%", "100%"]
84
90
  });
85
91
  return /* @__PURE__ */ jsxs(View, { style: styles.outer, children: [
86
- showHeader ? /* @__PURE__ */ jsx(View, { style: styles.header, children: late ? (
87
- // `role="status"` (aria-live: polite on rn-web) announces the copy
88
- // swap when work goes late, rather than silently sweeping on.
89
- /* @__PURE__ */ jsx(View, { accessibilityRole: "text", role: "status", style: styles.latePill, children: /* @__PURE__ */ jsx(Text, { style: styles.lateText, children: lateLabel }) })
90
- ) : label !== void 0 ? /* @__PURE__ */ jsx(Text, { style: styles.label, children: label }) : null }) : null,
92
+ showHeader ? /* @__PURE__ */ jsx(View, { style: styles.header, children: /* @__PURE__ */ jsx(View, { accessibilityRole: "text", role: "status", children: late ? /* @__PURE__ */ jsx(View, { style: styles.latePill, children: /* @__PURE__ */ jsx(Text, { style: styles.lateText, children: lateLabel ?? labels.lateLabel }) }) : label !== void 0 ? /* @__PURE__ */ jsx(Text, { style: styles.label, children: label }) : null }) }) : null,
91
93
  /* @__PURE__ */ jsxs(View, { style: styles.wrap, children: [
92
94
  /* @__PURE__ */ jsx(
93
95
  View,
94
96
  {
95
97
  accessibilityRole: "progressbar",
96
- accessibilityLabel,
97
- accessibilityValue: indeterminate ? void 0 : { min: 0, max, now },
98
+ accessibilityLabel: accessibilityLabel ?? label,
99
+ accessibilityValue: indeterminate ? void 0 : { min: 0, max: 100, now },
98
100
  accessibilityState: indeterminate ? { busy: true } : void 0,
99
101
  "aria-valuemin": 0,
100
- "aria-valuemax": max,
102
+ "aria-valuemax": 100,
101
103
  "aria-valuenow": indeterminate ? void 0 : now,
104
+ "aria-valuetext": indeterminate ? void 0 : labels.percent(now),
102
105
  style: styles.track,
103
106
  children: indeterminate ? /* @__PURE__ */ jsx(
104
107
  Animated.View,
@@ -115,7 +118,7 @@ function Progress({
115
118
  NumberRoll,
116
119
  {
117
120
  value: now,
118
- formatValue: (n) => `${n}%`,
121
+ formatValue: labels.percent,
119
122
  textStyle: {
120
123
  fontFamily: theme.font.mono,
121
124
  fontSize: theme.fontSize[14],
@@ -124,10 +127,7 @@ function Progress({
124
127
  motion,
125
128
  style: styles.valueRoll
126
129
  }
127
- ) : /* @__PURE__ */ jsxs(Text, { style: styles.value, children: [
128
- now,
129
- "%"
130
- ] }) : null
130
+ ) : /* @__PURE__ */ jsx(Text, { style: styles.value, children: labels.percent(now) }) : null
131
131
  ] })
132
132
  ] });
133
133
  }
@@ -202,14 +202,6 @@ var sheet = createStyleSheet((theme) => ({
202
202
  // Same reserved width as the static read-out, right-aligned, for the roll.
203
203
  valueRoll: { minWidth: theme.space[40], justifyContent: "flex-end" }
204
204
  }));
205
- var STEP_WORD = {
206
- working: "in progress",
207
- waiting: "waiting",
208
- done: "done",
209
- crashed: "failed",
210
- conflict: "conflict",
211
- pending: "pending"
212
- };
213
205
  function stepFill(theme, state) {
214
206
  switch (state) {
215
207
  case "working":
@@ -226,6 +218,18 @@ function stepFill(theme, state) {
226
218
  return theme.color.surface3;
227
219
  }
228
220
  }
221
+ var STEP_DEFAULT_LABELS = {
222
+ stepOf: (current, total) => `Step ${current} of ${total}`,
223
+ stepWithState: (stepOf, state) => `${stepOf}, ${state}`,
224
+ states: {
225
+ working: "in progress",
226
+ waiting: "waiting",
227
+ done: "done",
228
+ crashed: "failed",
229
+ conflict: "conflict",
230
+ pending: "pending"
231
+ }
232
+ };
229
233
  function StepProgress({
230
234
  total,
231
235
  current,
@@ -233,22 +237,24 @@ function StepProgress({
233
237
  size = "md",
234
238
  label,
235
239
  accessibilityLabel,
240
+ labels: labelsProp,
236
241
  style,
237
242
  testID
238
243
  }) {
239
- const theme = useLoamTheme();
244
+ const theme = useLoamTheme("progress");
245
+ const labels = useLabels("stepProgress", STEP_DEFAULT_LABELS, labelsProp);
240
246
  const { styles } = useStyles(stepSheet, { size });
241
247
  const count = Math.max(1, Math.trunc(total));
242
248
  const cur = Math.min(Math.max(Math.trunc(current), 1), count);
243
249
  const curIndex = cur - 1;
244
250
  const curState = resolveStepState(curIndex, curIndex, states);
245
- const readout = `Step ${cur} of ${count}`;
246
- const valueText = curState === "working" ? readout : `${readout}, ${STEP_WORD[curState]}`;
251
+ const readout = labels.stepOf(cur, count);
252
+ const valueText = curState === "working" ? readout : labels.stepWithState(readout, labels.states[curState]);
247
253
  return /* @__PURE__ */ jsxs(
248
254
  View,
249
255
  {
250
256
  accessibilityRole: "progressbar",
251
- accessibilityLabel,
257
+ accessibilityLabel: accessibilityLabel ?? label,
252
258
  accessibilityValue: { min: 1, max: count, now: cur, text: valueText },
253
259
  "aria-valuemin": 1,
254
260
  "aria-valuemax": count,
@@ -1,7 +1,8 @@
1
1
  import { overscrollIntent, bandIndicator, overscrollOffset, GESTURE_SLOP_PX, SCROLL_TOP_SLOP_PX, isReachExitArmed, REACH_ARM_PX } from './chunk-HU2EQNRZ.js';
2
- import { expandedProps } from './chunk-RQ3HASCC.js';
2
+ import { expandedProps } from './chunk-W23G6JLF.js';
3
3
  import { haptics } from './chunk-NY2U3PBI.js';
4
- import { Icon } from './chunk-TKVFVF5D.js';
4
+ import { useLabels } from './chunk-APCWFOZW.js';
5
+ import { Icon } from './chunk-UXGIW7OK.js';
5
6
  import * as React from 'react';
6
7
  import { useWindowDimensions, Animated, Easing, AccessibilityInfo, PanResponder, View, Pressable, ScrollView } from 'react-native';
7
8
  import { createStyleSheet, useStyles, useLoamTheme } from '@btndprojects/loam-theme-native';
@@ -38,23 +39,39 @@ function reachShift(windowHeight, reachZone = 0.62) {
38
39
  if (!Number.isFinite(windowHeight) || windowHeight <= 0) return REFERENCE_SHIFT;
39
40
  return Math.round(windowHeight * (1 - reachZone));
40
41
  }
42
+ var DEFAULT_LABELS = {
43
+ exit: "Exit one-handed reach",
44
+ exitHint: "Drag up or tap to move the content back",
45
+ indicator: "Pull down to refresh, keep pulling for one-handed reach",
46
+ refreshing: "Refreshing",
47
+ enterAnnouncement: "One-handed reach on. Content moved down.",
48
+ exitAnnouncement: "One-handed reach off."
49
+ };
41
50
  function OneHanded({
42
51
  active,
43
52
  onActiveChange,
44
53
  onRefresh,
45
54
  refreshing,
46
55
  shift,
47
- exitLabel = "Exit one-handed reach",
48
- exitHint = "Drag up or tap to move the content back",
49
- indicatorLabel = "Pull down to refresh, keep pulling for one-handed reach",
50
- refreshingLabel = "Refreshing",
51
- enterAnnouncement = "One-handed reach on. Content moved down.",
52
- exitAnnouncement = "One-handed reach off.",
56
+ exitLabel: exitLabelProp,
57
+ exitHint: exitHintProp,
58
+ indicatorLabel: indicatorLabelProp,
59
+ refreshingLabel: refreshingLabelProp,
60
+ enterAnnouncement: enterAnnouncementProp,
61
+ exitAnnouncement: exitAnnouncementProp,
62
+ labels: labelsProp,
53
63
  children,
54
64
  ...rest
55
65
  }) {
56
66
  const { styles } = useStyles(sheet);
57
- const theme = useLoamTheme();
67
+ const theme = useLoamTheme("one-handed");
68
+ const labels = useLabels("oneHanded", DEFAULT_LABELS, labelsProp);
69
+ const exitLabel = exitLabelProp ?? labels.exit;
70
+ const exitHint = exitHintProp ?? labels.exitHint;
71
+ const indicatorLabel = indicatorLabelProp ?? labels.indicator;
72
+ const refreshingLabel = refreshingLabelProp ?? labels.refreshing;
73
+ const enterAnnouncement = enterAnnouncementProp ?? labels.enterAnnouncement;
74
+ const exitAnnouncement = exitAnnouncementProp ?? labels.exitAnnouncement;
58
75
  const { height: windowHeight } = useWindowDimensions();
59
76
  const dropDistance = shift ?? reachShift(windowHeight, theme.layout.reachZone);
60
77
  const bandHeight = Math.max(dropDistance, EXIT_BAR_MIN_HEIGHT);
@@ -120,7 +137,15 @@ function OneHanded({
120
137
  springTo(dropScaleX, 1),
121
138
  springTo(dropScaleY, 1)
122
139
  ]).start();
123
- }, [dropOpacity, dropY, dropScaleX, dropScaleY, springTo, exitEasing, theme.motion.exit.duration]);
140
+ }, [
141
+ dropOpacity,
142
+ dropY,
143
+ dropScaleX,
144
+ dropScaleY,
145
+ springTo,
146
+ exitEasing,
147
+ theme.motion.exit.duration
148
+ ]);
124
149
  const onRefreshRef = React.useRef(onRefresh);
125
150
  onRefreshRef.current = onRefresh;
126
151
  const controlledRefreshing = refreshing != null;
@@ -138,6 +163,7 @@ function OneHanded({
138
163
  const changed = wasRefreshing.current !== isRefreshing;
139
164
  wasRefreshing.current = isRefreshing;
140
165
  if (isRefreshing) {
166
+ if (changed) AccessibilityInfo.announceForAccessibility(refreshingLabel);
141
167
  spinnerOpacity.setValue(1);
142
168
  Animated.parallel([
143
169
  Animated.timing(dropOpacity, {
@@ -383,6 +409,7 @@ function OneHanded({
383
409
  {
384
410
  accessibilityRole: "progressbar",
385
411
  accessibilityLabel: isRefreshing ? refreshingLabel : indicatorLabel,
412
+ accessibilityState: { busy: isRefreshing },
386
413
  style: [
387
414
  styles.droplet,
388
415
  {