@btndprojects/loam-ui-native 0.1.1 → 0.3.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 (412) hide show
  1. package/dist/accordion/index.js +7 -3
  2. package/dist/adaptive/index.js +16 -2
  3. package/dist/address-block/index.js +23 -0
  4. package/dist/alert/index.js +8 -2
  5. package/dist/analyzer/index.js +17 -6
  6. package/dist/announcement/index.js +18 -5
  7. package/dist/appearance-picker/index.js +15 -0
  8. package/dist/audio-player/index.js +29 -3
  9. package/dist/avatar/index.js +5 -2
  10. package/dist/avatar-group/index.js +9 -3
  11. package/dist/badge/index.js +10 -4
  12. package/dist/banner/index.js +6 -2
  13. package/dist/board/index.js +18 -6
  14. package/dist/button/index.js +9 -3
  15. package/dist/camera-permission/index.js +23 -12
  16. package/dist/capture-result/index.js +30 -17
  17. package/dist/card/index.js +10 -3
  18. package/dist/card-form/index.js +19 -9
  19. package/dist/carousel/index.js +6 -2
  20. package/dist/chart/index.js +18 -5
  21. package/dist/charts/index.js +21 -6
  22. package/dist/chat/index.js +41 -0
  23. package/dist/checkbox/index.js +9 -5
  24. package/dist/checklist/index.js +20 -8
  25. package/dist/checkout/index.js +30 -12
  26. package/dist/chip/index.js +11 -5
  27. package/dist/chunk-2BZD3NAP.js +1110 -0
  28. package/dist/chunk-2YKVID2V.js +35 -0
  29. package/dist/{chunk-JUAMLEHX.js → chunk-36DA3IPO.js} +137 -37
  30. package/dist/chunk-3A56MIAN.js +599 -0
  31. package/dist/chunk-3SCKCWF5.js +298 -0
  32. package/dist/chunk-3TZNDHKO.js +187 -0
  33. package/dist/chunk-43K3BLXV.js +9 -0
  34. package/dist/chunk-46ZJIQ2Z.js +208 -0
  35. package/dist/chunk-4CZMQDQL.js +192 -0
  36. package/dist/chunk-5DTKORLI.js +255 -0
  37. package/dist/{chunk-LOE5YNN3.js → chunk-5J4WFXFA.js} +68 -24
  38. package/dist/chunk-5KJ7TEQ6.js +305 -0
  39. package/dist/chunk-5NU33TXK.js +529 -0
  40. package/dist/chunk-5Z5ZYMOJ.js +1 -0
  41. package/dist/chunk-6KSUS7DF.js +690 -0
  42. package/dist/chunk-6RV6UW2J.js +349 -0
  43. package/dist/chunk-6RZM7RP2.js +520 -0
  44. package/dist/{chunk-4BXMXBJO.js → chunk-75BDCC7K.js} +24 -11
  45. package/dist/{chunk-PZXZJBMP.js → chunk-7CGJBQUA.js} +357 -32
  46. package/dist/{chunk-CJ5EOYZE.js → chunk-7IVF6JLJ.js} +24 -7
  47. package/dist/chunk-7IWCGXYA.js +143 -0
  48. package/dist/chunk-7LM4ASFH.js +172 -0
  49. package/dist/chunk-7MCEJFWV.js +341 -0
  50. package/dist/chunk-7NGMUVNU.js +245 -0
  51. package/dist/chunk-7PBSIXT7.js +355 -0
  52. package/dist/chunk-7QOYGENL.js +443 -0
  53. package/dist/{chunk-H6NIOQHK.js → chunk-A7SWYDE5.js} +66 -15
  54. package/dist/chunk-ADHPJALR.js +3051 -0
  55. package/dist/chunk-ALJYZLNQ.js +509 -0
  56. package/dist/chunk-APCWFOZW.js +28 -0
  57. package/dist/chunk-AQ5FIG74.js +419 -0
  58. package/dist/chunk-AWKQIE5I.js +139 -0
  59. package/dist/chunk-B2MMZZQB.js +426 -0
  60. package/dist/{chunk-ZVFE5QGU.js → chunk-B7JZ3N5G.js} +174 -97
  61. package/dist/chunk-BL37SW6G.js +1314 -0
  62. package/dist/chunk-BTRMA7GC.js +21 -0
  63. package/dist/chunk-C7IUWIUZ.js +643 -0
  64. package/dist/chunk-CA3DUVYD.js +10 -0
  65. package/dist/{chunk-S7F6XLTK.js → chunk-CBCJSO2B.js} +213 -54
  66. package/dist/chunk-CHPX4MFI.js +239 -0
  67. package/dist/chunk-CLGAMIOT.js +648 -0
  68. package/dist/chunk-CUE7VML6.js +1141 -0
  69. package/dist/chunk-CVU6S2E5.js +1587 -0
  70. package/dist/{chunk-AZRX6SAC.js → chunk-CXPQMA6Z.js} +112 -37
  71. package/dist/chunk-D2LN4I7I.js +581 -0
  72. package/dist/{chunk-UWFLYMAR.js → chunk-D34LNBO5.js} +635 -238
  73. package/dist/chunk-D4BCQICM.js +765 -0
  74. package/dist/chunk-EABKIIA4.js +1 -0
  75. package/dist/chunk-EICSYRAG.js +341 -0
  76. package/dist/chunk-EMWAJMAS.js +83 -0
  77. package/dist/chunk-EOLZWRV6.js +149 -0
  78. package/dist/chunk-EOQVTGB6.js +350 -0
  79. package/dist/{chunk-BEDBFJND.js → chunk-ESGUHNB2.js} +119 -43
  80. package/dist/{chunk-Q72LJOVE.js → chunk-F2KNBPKY.js} +74 -18
  81. package/dist/{chunk-O7AE6DAF.js → chunk-G7H3NX3G.js} +57 -24
  82. package/dist/chunk-GM7YIPB7.js +1052 -0
  83. package/dist/chunk-GVQQG435.js +581 -0
  84. package/dist/chunk-HE43OMEL.js +1056 -0
  85. package/dist/chunk-HHOMFQ7R.js +2535 -0
  86. package/dist/chunk-HJFFOOJ4.js +1 -0
  87. package/dist/chunk-HNAKS4Z3.js +207 -0
  88. package/dist/chunk-HP6ST2OW.js +352 -0
  89. package/dist/chunk-HW3OWDTU.js +1 -0
  90. package/dist/{chunk-3ENTMPQY.js → chunk-HZDB44K4.js} +102 -52
  91. package/dist/chunk-I2KLQ2HA.js +19 -0
  92. package/dist/chunk-I6CUP2LW.js +1155 -0
  93. package/dist/chunk-ICV4Y2WY.js +27 -0
  94. package/dist/chunk-IHSIENOE.js +3950 -0
  95. package/dist/{chunk-CUMUNPXY.js → chunk-IMMALLRU.js} +68 -32
  96. package/dist/chunk-J64KGCGX.js +55 -0
  97. package/dist/{chunk-IVNRBPGC.js → chunk-JA6TK7H2.js} +255 -84
  98. package/dist/{chunk-OOPPQH27.js → chunk-JAVZ5JPV.js} +83 -29
  99. package/dist/chunk-JCMTP3E4.js +1251 -0
  100. package/dist/{chunk-U7TFM2JA.js → chunk-JCXFFK64.js} +75 -18
  101. package/dist/chunk-JWCVBFDU.js +236 -0
  102. package/dist/chunk-JXRTD5RI.js +414 -0
  103. package/dist/chunk-JYIUZUIQ.js +1567 -0
  104. package/dist/chunk-K3TK3GIV.js +219 -0
  105. package/dist/chunk-KEVZIHM2.js +1511 -0
  106. package/dist/chunk-KHZDNQQD.js +171 -0
  107. package/dist/chunk-KL4GDV4V.js +131 -0
  108. package/dist/chunk-KNILMM4H.js +225 -0
  109. package/dist/chunk-KRBUZV45.js +25 -0
  110. package/dist/{chunk-ITTYJZWX.js → chunk-KXLDK6HB.js} +161 -45
  111. package/dist/chunk-KZ3X7TSL.js +196 -0
  112. package/dist/chunk-L2WMOA2V.js +474 -0
  113. package/dist/chunk-L4D5LHCH.js +109 -0
  114. package/dist/chunk-LAUJPLDB.js +853 -0
  115. package/dist/{chunk-SBMNWWBV.js → chunk-LGNTP5XA.js} +89 -17
  116. package/dist/chunk-LUZFCCSD.js +271 -0
  117. package/dist/{chunk-HPPW424V.js → chunk-LXJCP4PL.js} +129 -37
  118. package/dist/chunk-MCOZJWPU.js +731 -0
  119. package/dist/chunk-MG4SKWLL.js +2587 -0
  120. package/dist/chunk-MPEPTSER.js +414 -0
  121. package/dist/chunk-MWPJ4YGP.js +1 -0
  122. package/dist/{chunk-TKQYWZ5V.js → chunk-N7AX4OA4.js} +108 -41
  123. package/dist/chunk-NHSLM6SE.js +523 -0
  124. package/dist/chunk-NNCOFLNE.js +24 -0
  125. package/dist/{chunk-J7Q7VCVC.js → chunk-NNJLVA7M.js} +54 -15
  126. package/dist/chunk-NZG75DGA.js +282 -0
  127. package/dist/chunk-O76QXRBV.js +431 -0
  128. package/dist/chunk-OANH27AK.js +223 -0
  129. package/dist/chunk-OCHPK5YV.js +609 -0
  130. package/dist/chunk-OMHVEVX4.js +436 -0
  131. package/dist/{chunk-YF4NSSMT.js → chunk-ONKQUJWD.js} +220 -65
  132. package/dist/chunk-OVTK7A6T.js +615 -0
  133. package/dist/chunk-PCEFCOLN.js +120 -0
  134. package/dist/chunk-PFLNFIVB.js +186 -0
  135. package/dist/chunk-PHSZY37H.js +300 -0
  136. package/dist/chunk-PJLTKDVY.js +18 -0
  137. package/dist/{chunk-4YIP3CWS.js → chunk-PK7BN3MI.js} +89 -19
  138. package/dist/{chunk-KMI5ML5I.js → chunk-PWFRDRGS.js} +155 -29
  139. package/dist/chunk-PYPMD46W.js +707 -0
  140. package/dist/chunk-Q6CCHDI7.js +331 -0
  141. package/dist/chunk-QFA5WS2A.js +750 -0
  142. package/dist/chunk-QJMMM4RC.js +124 -0
  143. package/dist/chunk-QNZII37O.js +10 -0
  144. package/dist/chunk-QYWEVAM6.js +407 -0
  145. package/dist/chunk-R5T4VZ7Z.js +126 -0
  146. package/dist/chunk-R77HFLZD.js +1 -0
  147. package/dist/{chunk-YC6WORFL.js → chunk-RAESDNU5.js} +228 -102
  148. package/dist/chunk-RBYQUXNL.js +1 -0
  149. package/dist/chunk-RCM3DT5E.js +1 -0
  150. package/dist/chunk-RGNY56L7.js +282 -0
  151. package/dist/chunk-RIK6UX2K.js +344 -0
  152. package/dist/{chunk-LAECSR4H.js → chunk-RJA3RXO3.js} +75 -60
  153. package/dist/chunk-RJYRJ3LD.js +1 -0
  154. package/dist/chunk-RMA3NOY4.js +599 -0
  155. package/dist/{chunk-DM5QUKKO.js → chunk-RSWKKAHK.js} +160 -66
  156. package/dist/chunk-RVOIIX3V.js +204 -0
  157. package/dist/chunk-SA2RRBGT.js +1077 -0
  158. package/dist/chunk-SG3J4R45.js +1428 -0
  159. package/dist/chunk-SPUK7JD4.js +238 -0
  160. package/dist/chunk-SWXV2K5N.js +434 -0
  161. package/dist/chunk-SYJEPXP6.js +1303 -0
  162. package/dist/{chunk-N32RGOA5.js → chunk-SZLI34TA.js} +93 -28
  163. package/dist/{chunk-4GBOGOTV.js → chunk-T77WJA74.js} +143 -18
  164. package/dist/chunk-TDWWVJA4.js +630 -0
  165. package/dist/chunk-TFHI5XDR.js +610 -0
  166. package/dist/chunk-TH4PW2WU.js +17 -0
  167. package/dist/chunk-TTQ24HQX.js +12 -0
  168. package/dist/chunk-TUACVJNG.js +12 -0
  169. package/dist/{chunk-CYRBHQQZ.js → chunk-TUL5RUIA.js} +201 -59
  170. package/dist/{chunk-4ZAHCY44.js → chunk-TYOSA7JG.js} +74 -38
  171. package/dist/chunk-TYQTMMEV.js +1 -0
  172. package/dist/chunk-TZO6YDS7.js +346 -0
  173. package/dist/chunk-U3ETF22F.js +328 -0
  174. package/dist/chunk-U6BYHD2N.js +213 -0
  175. package/dist/{chunk-WSW6ZFAQ.js → chunk-UF6EJXPQ.js} +20 -5
  176. package/dist/chunk-UNNQIPGK.js +792 -0
  177. package/dist/chunk-UQEN55EY.js +1 -0
  178. package/dist/chunk-UQVO6AJV.js +171 -0
  179. package/dist/chunk-VFDQAAIW.js +351 -0
  180. package/dist/chunk-VIUE3VQT.js +1 -0
  181. package/dist/chunk-VJLSSSGC.js +438 -0
  182. package/dist/chunk-VLMT6KYT.js +350 -0
  183. package/dist/chunk-VMHGBUGS.js +35 -0
  184. package/dist/{chunk-7O2FMUPT.js → chunk-VQKPBYW6.js} +400 -139
  185. package/dist/{chunk-EJBDRVIH.js → chunk-VSSTWLC5.js} +61 -16
  186. package/dist/chunk-VZYYZRPN.js +1992 -0
  187. package/dist/chunk-W23G6JLF.js +37 -0
  188. package/dist/chunk-WAIJCD2V.js +480 -0
  189. package/dist/chunk-WFMQ3WKM.js +378 -0
  190. package/dist/chunk-WJ2KDRMY.js +66 -0
  191. package/dist/chunk-WKFZJO54.js +437 -0
  192. package/dist/{chunk-SYNOJOQO.js → chunk-WVVD3XOV.js} +189 -93
  193. package/dist/chunk-XAIWMSLB.js +1 -0
  194. package/dist/chunk-XBXUBBJZ.js +98 -0
  195. package/dist/chunk-XCU7MYBJ.js +1 -0
  196. package/dist/chunk-XHE4PGCI.js +717 -0
  197. package/dist/chunk-XRSJ32M3.js +331 -0
  198. package/dist/chunk-XTCVOEAW.js +1 -0
  199. package/dist/chunk-XWGXVQF6.js +58 -0
  200. package/dist/{chunk-35OFI3JG.js → chunk-Y3XKKO5K.js} +258 -123
  201. package/dist/chunk-Y4QNMBLO.js +533 -0
  202. package/dist/chunk-Y5H4CTKO.js +1 -0
  203. package/dist/chunk-YBQIN75A.js +403 -0
  204. package/dist/chunk-YJ5PXOX3.js +158 -0
  205. package/dist/{chunk-AWJOCGFZ.js → chunk-YLRSRUPS.js} +81 -55
  206. package/dist/chunk-YM6MPJ4A.js +1 -0
  207. package/dist/chunk-YV7KZENV.js +200 -0
  208. package/dist/chunk-Z7I4ZSO6.js +316 -0
  209. package/dist/chunk-ZIRMWD2B.js +555 -0
  210. package/dist/chunk-ZPMG3FWU.js +75 -0
  211. package/dist/{chunk-QWCMU5B2.js → chunk-ZTXMK2G7.js} +289 -115
  212. package/dist/chunk-ZVJCWXAL.js +541 -0
  213. package/dist/{chunk-P23EQNRQ.js → chunk-ZYQ23DPT.js} +215 -49
  214. package/dist/coachmark/index.js +10 -3
  215. package/dist/code-block/index.js +6 -3
  216. package/dist/color-field/index.js +15 -5
  217. package/dist/color-picker/index.js +23 -0
  218. package/dist/commerce/index.js +31 -17
  219. package/dist/confirm/index.js +31 -0
  220. package/dist/connection-card/index.js +34 -0
  221. package/dist/connectivity/index.js +6 -2
  222. package/dist/context-menu/index.js +13 -3
  223. package/dist/copy-button/index.js +5 -2
  224. package/dist/data-grid/index.js +35 -17
  225. package/dist/date-range-picker/index.js +22 -9
  226. package/dist/description-list/index.js +6 -1
  227. package/dist/device-frame/index.js +30 -0
  228. package/dist/dialog/index.js +10 -2
  229. package/dist/divider/index.js +2 -0
  230. package/dist/empty-state/index.js +15 -2
  231. package/dist/error-summary/index.js +9 -2
  232. package/dist/fab/index.js +7 -2
  233. package/dist/file-manager/index.js +44 -0
  234. package/dist/file-upload/index.js +16 -7
  235. package/dist/filter-bar/index.js +14 -7
  236. package/dist/flow-run/index.js +23 -13
  237. package/dist/form/index.js +32 -3
  238. package/dist/gallery/index.js +8 -2
  239. package/dist/hold-to-confirm/index.js +6 -2
  240. package/dist/hover-card/index.js +18 -0
  241. package/dist/icon-tile/index.js +10 -0
  242. package/dist/image/index.js +9 -0
  243. package/dist/index.d.ts +30789 -12332
  244. package/dist/index.js +424 -135
  245. package/dist/infinite-list/index.js +6 -2
  246. package/dist/inline-edit/index.js +8 -5
  247. package/dist/input/index.js +7 -4
  248. package/dist/interactions/index.js +5 -1
  249. package/dist/invoice/index.js +22 -9
  250. package/dist/job-row/index.js +22 -0
  251. package/dist/json-inspector/index.js +20 -0
  252. package/dist/kbd/index.js +5 -1
  253. package/dist/keyboard/index.js +9 -2
  254. package/dist/level-meter/index.js +9 -0
  255. package/dist/list-row/index.js +14 -4
  256. package/dist/log-viewer/index.js +11 -2
  257. package/dist/map-view/index.js +16 -3
  258. package/dist/markdown/index.js +12 -6
  259. package/dist/metric/index.js +10 -4
  260. package/dist/metric-strip/index.js +12 -0
  261. package/dist/money/index.js +16 -3
  262. package/dist/nav-drawer/index.js +8 -2
  263. package/dist/nav-header/index.js +15 -0
  264. package/dist/navigation/index.js +32 -2
  265. package/dist/notification-center/index.js +28 -12
  266. package/dist/number-roll/index.js +7 -2
  267. package/dist/onboarding-pager/index.js +22 -0
  268. package/dist/one-handed/index.js +5 -3
  269. package/dist/os-surfaces/index.js +9 -3
  270. package/dist/otp/index.js +9 -5
  271. package/dist/page-header/index.js +3 -1
  272. package/dist/pagination/index.js +8 -0
  273. package/dist/payment-method/index.js +21 -11
  274. package/dist/payment-status/index.js +26 -15
  275. package/dist/permission/index.js +21 -2
  276. package/dist/picker/index.js +22 -6
  277. package/dist/progress/index.js +11 -3
  278. package/dist/provenance/index.js +16 -0
  279. package/dist/pull-to-refresh/index.js +4 -2
  280. package/dist/qr-code/index.js +16 -0
  281. package/dist/query-builder/index.js +30 -0
  282. package/dist/radio-group/index.js +9 -5
  283. package/dist/rating/index.js +10 -2
  284. package/dist/receivables/index.js +35 -17
  285. package/dist/recording-indicator/index.js +21 -0
  286. package/dist/refund/index.js +28 -15
  287. package/dist/repeatable-rows/index.js +19 -0
  288. package/dist/save-status/index.js +7 -3
  289. package/dist/screen/index.js +3 -0
  290. package/dist/scroll-area/index.js +3 -1
  291. package/dist/search-field/index.js +13 -0
  292. package/dist/secret-field/index.js +19 -0
  293. package/dist/section-header/index.js +4 -0
  294. package/dist/segmented-control/index.js +4 -3
  295. package/dist/sheet/index.js +11 -3
  296. package/dist/shortcuts-sheet/index.js +2 -0
  297. package/dist/sign-in-screen/index.js +25 -0
  298. package/dist/skeleton/index.js +5 -1
  299. package/dist/slider/index.js +5 -2
  300. package/dist/sortable/index.js +8 -0
  301. package/dist/spinner/index.js +4 -1
  302. package/dist/split-button/index.js +21 -6
  303. package/dist/spotlight/index.js +9 -1
  304. package/dist/stack/index.js +2 -0
  305. package/dist/stage-timeline/index.js +8 -3
  306. package/dist/status-dot/index.js +8 -2
  307. package/dist/stepper/index.js +11 -4
  308. package/dist/streaming-text/index.js +4 -2
  309. package/dist/survey/index.js +29 -16
  310. package/dist/switch/index.js +9 -3
  311. package/dist/system-state/index.js +15 -4
  312. package/dist/tab-bar/index.js +13 -2
  313. package/dist/tabs/index.js +12 -2
  314. package/dist/tags-input/index.js +13 -0
  315. package/dist/text/index.js +4 -0
  316. package/dist/textarea/index.js +8 -5
  317. package/dist/thinking/index.js +6 -1
  318. package/dist/tile-rail/index.js +10 -0
  319. package/dist/time-field/index.js +20 -0
  320. package/dist/time-range-control/index.js +36 -0
  321. package/dist/timeline/index.js +4 -2
  322. package/dist/toast/index.js +6 -2
  323. package/dist/toolbar/index.js +5 -2
  324. package/dist/tour/index.js +15 -10
  325. package/dist/transcript/index.js +28 -0
  326. package/dist/truncation-notice/index.js +5 -2
  327. package/dist/update-notice/index.js +19 -9
  328. package/dist/video-player/index.js +29 -2
  329. package/dist/viewfinder/index.js +15 -5
  330. package/dist/widget/index.js +14 -4
  331. package/dist/wizard/index.js +10 -4
  332. package/package.json +13 -12
  333. package/dist/chunk-223Q2T2Q.js +0 -229
  334. package/dist/chunk-2A5NIQAK.js +0 -254
  335. package/dist/chunk-2GK6PHGE.js +0 -363
  336. package/dist/chunk-2ZZ7TDJ4.js +0 -324
  337. package/dist/chunk-3ARE4TES.js +0 -195
  338. package/dist/chunk-3NMD74ZU.js +0 -4
  339. package/dist/chunk-3WPW4KUN.js +0 -182
  340. package/dist/chunk-423B7SPN.js +0 -993
  341. package/dist/chunk-47FWHGUN.js +0 -394
  342. package/dist/chunk-4DS5ZWVC.js +0 -83
  343. package/dist/chunk-4SZYY6AN.js +0 -99
  344. package/dist/chunk-4YQOR7JM.js +0 -204
  345. package/dist/chunk-52X2VYTD.js +0 -228
  346. package/dist/chunk-5YNTNN5A.js +0 -177
  347. package/dist/chunk-6HT2LP62.js +0 -504
  348. package/dist/chunk-6N33LFQA.js +0 -35
  349. package/dist/chunk-6X6PQ443.js +0 -432
  350. package/dist/chunk-7CFF4HXS.js +0 -126
  351. package/dist/chunk-AI4DWZCD.js +0 -162
  352. package/dist/chunk-BTTFCMKG.js +0 -166
  353. package/dist/chunk-BV3B2HYZ.js +0 -1635
  354. package/dist/chunk-C2NTXVWM.js +0 -98
  355. package/dist/chunk-CDRZHT42.js +0 -424
  356. package/dist/chunk-DHWADYZX.js +0 -144
  357. package/dist/chunk-F5XNPWS7.js +0 -1024
  358. package/dist/chunk-FMYDDECK.js +0 -1521
  359. package/dist/chunk-GDKZTW34.js +0 -395
  360. package/dist/chunk-GL7B2DOW.js +0 -134
  361. package/dist/chunk-GNNJ4GCC.js +0 -471
  362. package/dist/chunk-HET4LLMX.js +0 -129
  363. package/dist/chunk-HZ6CNMAF.js +0 -870
  364. package/dist/chunk-IIQTAY3J.js +0 -715
  365. package/dist/chunk-JNH2TYIN.js +0 -96
  366. package/dist/chunk-JNY4ZHAR.js +0 -634
  367. package/dist/chunk-JXJB2X6M.js +0 -131
  368. package/dist/chunk-LRJNDEIA.js +0 -302
  369. package/dist/chunk-LSS54GLJ.js +0 -116
  370. package/dist/chunk-LZLHELAG.js +0 -137
  371. package/dist/chunk-MOUJOP55.js +0 -425
  372. package/dist/chunk-NKB7BZYK.js +0 -167
  373. package/dist/chunk-NQYBUO3K.js +0 -1795
  374. package/dist/chunk-O4AEHWII.js +0 -464
  375. package/dist/chunk-OETCUXQP.js +0 -134
  376. package/dist/chunk-OPXFZ4Y5.js +0 -204
  377. package/dist/chunk-PJXUJYS6.js +0 -248
  378. package/dist/chunk-PUPM2YGF.js +0 -376
  379. package/dist/chunk-QCDXZBC5.js +0 -247
  380. package/dist/chunk-QDYDBCFP.js +0 -197
  381. package/dist/chunk-QJJ6MADV.js +0 -274
  382. package/dist/chunk-QKXCPTFS.js +0 -349
  383. package/dist/chunk-RIBDXGUG.js +0 -108
  384. package/dist/chunk-RJQOOHT2.js +0 -214
  385. package/dist/chunk-RNGLIHFA.js +0 -191
  386. package/dist/chunk-RQ3HASCC.js +0 -6
  387. package/dist/chunk-RSOJT5YW.js +0 -124
  388. package/dist/chunk-RUZHTGKB.js +0 -237
  389. package/dist/chunk-RW6ZL2FQ.js +0 -284
  390. package/dist/chunk-TKVFVF5D.js +0 -95
  391. package/dist/chunk-TOXAGRDQ.js +0 -144
  392. package/dist/chunk-TUTI5HOZ.js +0 -112
  393. package/dist/chunk-UC2WGUP3.js +0 -627
  394. package/dist/chunk-UYG5L34B.js +0 -87
  395. package/dist/chunk-VBOXAEPI.js +0 -336
  396. package/dist/chunk-VCDBXW5H.js +0 -188
  397. package/dist/chunk-VEAYTRPX.js +0 -414
  398. package/dist/chunk-VQHPQEUH.js +0 -273
  399. package/dist/chunk-VXDZFJGP.js +0 -874
  400. package/dist/chunk-XNUVB5OL.js +0 -375
  401. package/dist/chunk-XOSCY2CW.js +0 -242
  402. package/dist/chunk-XXXEFXY5.js +0 -99
  403. package/dist/chunk-YDGVJETP.js +0 -60
  404. package/dist/chunk-YG3ZJHGU.js +0 -223
  405. package/dist/chunk-YTFKPRUK.js +0 -845
  406. package/dist/chunk-Z7H7VSFZ.js +0 -323
  407. package/dist/header/index.js +0 -5
  408. package/dist/search-bar/index.js +0 -5
  409. /package/dist/{chunk-3ECPOSKO.js → chunk-3BKLBYPK.js} +0 -0
  410. /package/dist/{chunk-JRLTGLN4.js → chunk-3UG6JUCV.js} +0 -0
  411. /package/dist/{chunk-RTIKSY6A.js → chunk-4QCR3K2J.js} +0 -0
  412. /package/dist/{chunk-VFCUIDRT.js → chunk-5WWRTEPS.js} +0 -0
@@ -1,10 +1,16 @@
1
- import { Skeleton } from './chunk-RIBDXGUG.js';
2
- import { Button } from './chunk-3ARE4TES.js';
3
- import { Icon } from './chunk-TKVFVF5D.js';
1
+ import { EmptyState } from './chunk-QJMMM4RC.js';
2
+ import { Button } from './chunk-5DTKORLI.js';
3
+ import { resolveTextRole } from './chunk-L4D5LHCH.js';
4
+ import { Skeleton } from './chunk-YJ5PXOX3.js';
5
+ import { haptics } from './chunk-NY2U3PBI.js';
6
+ import { isAndroidIdiom } from './chunk-TH4PW2WU.js';
7
+ import { useLabels, useLoamLocale } from './chunk-APCWFOZW.js';
8
+ import { Icon } from './chunk-PCEFCOLN.js';
9
+ import { springConfig } from './chunk-J64KGCGX.js';
4
10
  import * as React2 from 'react';
5
- import { PanResponder, View, Text, Pressable, ScrollView } from 'react-native';
11
+ import { Animated, PanResponder, View, Text, Pressable, ScrollView } from 'react-native';
6
12
  import Svg, { Defs, LinearGradient, Stop, Pattern, Rect, ClipPath, G, Text as Text$1, Circle, Path } from 'react-native-svg';
7
- import { createValuePalette, FULL_WINDOW, normalizeSpec, resolveHeight, isWholePlot, renderChart, tableModel, describeChart, readoutRows, pick, clampWindow, zoomAt, isZoomed, panBy, toCsv, NARROW_WIDTH, TIGHT_WIDTH, sceneToSvg } from '@btndprojects/loam-charts';
13
+ import { DEFAULT_CHART_LABELS, createValuePalette, FULL_WINDOW, normalizeSpec, resolveHeight, isWholePlot, renderChart, tableModel, describeChart, readoutRows, pick, clampWindow, zoomAt, isZoomed, panBy, toCsv, NARROW_WIDTH, TIGHT_WIDTH, sceneToSvg } from '@btndprojects/loam-charts';
8
14
  import { createStyleSheet, useLoamTheme, useStyles } from '@btndprojects/loam-theme-native';
9
15
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
10
16
 
@@ -152,6 +158,28 @@ function SceneDefsNodes({ defs, clipId }) {
152
158
  /* @__PURE__ */ jsx(ClipPath, { id: clipId, children: /* @__PURE__ */ jsx(Rect, { x: defs.clip.x, y: defs.clip.y, width: defs.clip.w, height: defs.clip.h }) })
153
159
  ] });
154
160
  }
161
+ var DEFAULT_CHART_UI_LABELS = {
162
+ ...DEFAULT_CHART_LABELS,
163
+ hideTable: "Hide the data table",
164
+ showTable: "Show the data table",
165
+ exportCsv: "Export the visible window as CSV",
166
+ shareImage: "Share the chart as an image",
167
+ readoutPlaceholder: "Drag across the chart to read values.",
168
+ clearReading: "Clear the reading",
169
+ legendHint: "tap to filter \xB7 hold to solo",
170
+ loading: "Loading chart",
171
+ emptyTitle: "No data in this range",
172
+ emptyText: "The series exist \u2014 the window is empty. Widen the range or clear a filter.",
173
+ clearFilter: "Clear the filter",
174
+ errorTitle: "That data did not load",
175
+ errorText: "Nothing was drawn, because a chart of nothing looks exactly like a chart of zero.",
176
+ tryAgain: "Try again",
177
+ resetZoomA11y: "Reset the zoom",
178
+ resetZoom: "Reset zoom",
179
+ source: (source) => "Source: " + source,
180
+ dataCaption: "Chart data",
181
+ tableRows: (caption, count) => caption + " \u2014 " + count + " rows"
182
+ };
155
183
  var UID = 0;
156
184
  function svgDocument(frame, uid, width, height, fonts) {
157
185
  const body = sceneToSvg(frame.scene, frame.defs, uid);
@@ -161,17 +189,23 @@ function svgDocument(frame, uid, width, height, fonts) {
161
189
  function escapeAttr(value) {
162
190
  return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
163
191
  }
192
+ var LINE_KEY_TYPES = ["line", "radialLine", "bump", "slope", "parallel"];
164
193
  function Chart({
165
194
  style,
166
195
  bare,
196
+ size = "md",
197
+ tone,
167
198
  defaultTableOpen = false,
168
199
  onExportCsv,
169
200
  onExportImage,
170
201
  onVisibilityChange,
171
202
  onZoomChange,
203
+ copy,
172
204
  ...specInput
173
205
  }) {
174
- const theme = useLoamTheme();
206
+ const labels = useLabels("chart", DEFAULT_CHART_UI_LABELS, copy);
207
+ const providerLocale = useLoamLocale();
208
+ const theme = useLoamTheme("chart");
175
209
  const { styles } = useStyles(stylesheet);
176
210
  const uid = React2.useMemo(() => "lc" + ++UID, []);
177
211
  const palette = React2.useMemo(() => nativeChartPalette(theme), [theme]);
@@ -181,8 +215,41 @@ function Chart({
181
215
  const [pinned, setPinned] = React2.useState(null);
182
216
  const [tableOpen, setTableOpen] = React2.useState(defaultTableOpen);
183
217
  const [zoom, setZoomState] = React2.useState(FULL_WINDOW);
184
- const spec = React2.useMemo(() => normalizeSpec(specInput), [specInput]);
218
+ const spec = React2.useMemo(() => {
219
+ const input = specInput;
220
+ const toneInk = tone ? tone === "neutral" ? theme.color.text3 : theme.color[tone] : void 0;
221
+ const sized = input.height === void 0 && size !== "md" ? { height: size === "sm" ? theme.space[224] : theme.space[256] + theme.space[128] } : null;
222
+ const toned = toneInk && input.series?.length === 1 && input.series[0]?.color === void 0 ? { series: [{ ...input.series[0], color: toneInk }] } : null;
223
+ return normalizeSpec({
224
+ ...input,
225
+ ...sized,
226
+ ...toned,
227
+ locale: specInput.locale ?? providerLocale,
228
+ copy: { ...labels, ...specInput.copy }
229
+ });
230
+ }, [specInput, labels, providerLocale, size, tone, theme]);
185
231
  const measured = width || 360;
232
+ const entry = React2.useRef(
233
+ new Animated.Value(spec.animate && !theme.reduceMotion ? 0 : 1)
234
+ ).current;
235
+ const entered = React2.useRef(false);
236
+ React2.useEffect(() => {
237
+ if (!width || entered.current) return;
238
+ entered.current = true;
239
+ if (!spec.animate || theme.reduceMotion) {
240
+ entry.setValue(1);
241
+ return;
242
+ }
243
+ Animated.spring(entry, {
244
+ ...springConfig(theme, "ds"),
245
+ toValue: 1,
246
+ useNativeDriver: true
247
+ }).start();
248
+ }, [width, spec.animate, theme, entry]);
249
+ const entryStyle = {
250
+ opacity: entry.interpolate({ inputRange: [0, 1], outputRange: [0, 1], extrapolate: "clamp" }),
251
+ transform: [{ translateY: entry.interpolate({ inputRange: [0, 1], outputRange: [8, 0] }) }]
252
+ };
186
253
  const narrow = measured < NARROW_WIDTH;
187
254
  const tight = measured < TIGHT_WIDTH;
188
255
  const height = resolveHeight(spec, measured, narrow);
@@ -215,6 +282,7 @@ function Chart({
215
282
  const scaleRef = React2.useRef(1);
216
283
  scaleRef.current = measured / (width || measured);
217
284
  const originRef = React2.useRef({ x: 0, y: 0 });
285
+ const lastReadRef = React2.useRef(null);
218
286
  const scrub = React2.useCallback((lx, ly) => {
219
287
  const f = frameRef.current;
220
288
  const s = specRef.current;
@@ -222,8 +290,16 @@ function Chart({
222
290
  const x = (lx - originRef.current.x) * k;
223
291
  const y = (ly - originRef.current.y) * k;
224
292
  const mode = s.tooltip.trigger === "item" ? "nearest" : "index";
225
- const hit = pick(f.items, x, y, isWholePlot(s.type) ? "nearest" : mode, { radius: 56, horizontal: f.horizontal });
293
+ const hit = pick(f.items, x, y, isWholePlot(s.type) ? "nearest" : mode, {
294
+ radius: 56,
295
+ horizontal: f.horizontal
296
+ });
226
297
  if (hit) {
298
+ const key = hit.si + ":" + hit.di;
299
+ if (key !== lastReadRef.current) {
300
+ lastReadRef.current = key;
301
+ haptics.selection();
302
+ }
227
303
  setPinned({ si: hit.si, di: hit.di, kind: hit.linkKind });
228
304
  s.onSelect?.(hit, s.series[hit.si]);
229
305
  }
@@ -242,15 +318,18 @@ function Chart({
242
318
  const resetZoom = React2.useCallback(() => setZoom(FULL_WINDOW), [setZoom]);
243
319
  const pinchRef = React2.useRef(null);
244
320
  const lastTapRef = React2.useRef(0);
245
- const pinchGeometry = React2.useCallback((touches) => {
246
- const [a, b] = touches;
247
- if (!a || !b) return null;
248
- const dist = Math.hypot(a.pageX - b.pageX, a.pageY - b.pageY);
249
- const f = frameRef.current;
250
- const plot = f.plot;
251
- const midX = (a.pageX + b.pageX) / 2 - originRef.current.x - plot.x;
252
- return { dist, anchor: plot.w ? Math.min(1, Math.max(0, midX / plot.w)) : 0.5 };
253
- }, []);
321
+ const pinchGeometry = React2.useCallback(
322
+ (touches) => {
323
+ const [a, b] = touches;
324
+ if (!a || !b) return null;
325
+ const dist = Math.hypot(a.pageX - b.pageX, a.pageY - b.pageY);
326
+ const f = frameRef.current;
327
+ const plot = f.plot;
328
+ const midX = (a.pageX + b.pageX) / 2 - originRef.current.x - plot.x;
329
+ return { dist, anchor: plot.w ? Math.min(1, Math.max(0, midX / plot.w)) : 0.5 };
330
+ },
331
+ []
332
+ );
254
333
  const responder = React2.useMemo(
255
334
  () => PanResponder.create({
256
335
  onStartShouldSetPanResponder: () => true,
@@ -298,16 +377,25 @@ function Chart({
298
377
  [scrub, zoomEnabled, resetZoom, setZoom, pinchGeometry]
299
378
  );
300
379
  const legendEntries = React2.useMemo(() => {
301
- const itemLegend = ["pie", "donut", "polarArea", "funnel", "pyramid", "radialBar", "waffle"].includes(spec.type);
380
+ const itemLegend = [
381
+ "pie",
382
+ "donut",
383
+ "polarArea",
384
+ "funnel",
385
+ "pyramid",
386
+ "radialBar",
387
+ "waffle"
388
+ ].includes(spec.type);
302
389
  if (wholePlot && !itemLegend) return [];
303
390
  if (wholePlot) {
304
391
  const raw = spec.series[0]?.data || spec.data;
305
392
  return (Array.isArray(raw) ? raw : []).map((d, i) => ({
306
393
  id: "i" + i,
307
- label: (d && typeof d === "object" ? d.label : null) || (spec.xAxis.data || [])[i] || "Item " + (i + 1),
394
+ label: (d && typeof d === "object" ? d.label : null) || (spec.xAxis.data || [])[i] || spec.copy.itemN(i + 1),
308
395
  color: palette.series(i),
309
396
  edge: palette.edge(i),
310
397
  off: false,
398
+ line: false,
311
399
  index: i
312
400
  }));
313
401
  }
@@ -317,6 +405,7 @@ function Chart({
317
405
  color: z.color || palette.series(i),
318
406
  edge: z.color || palette.edge(i),
319
407
  off: !!hidden[z.id] || solo != null && solo !== i || !!z.hidden,
408
+ line: LINE_KEY_TYPES.includes(z.type ?? spec.type),
320
409
  index: i
321
410
  }));
322
411
  }, [spec, wholePlot, hidden, solo, palette]);
@@ -399,6 +488,7 @@ function Chart({
399
488
  const w = e.nativeEvent.layout.width;
400
489
  if (Math.abs(w - width) > 0.5) setWidth(w);
401
490
  };
491
+ const android = isAndroidIdiom(theme);
402
492
  const showReadout = !wholePlot && spec.tooltip.trigger !== "none" && spec.readout !== false;
403
493
  return /* @__PURE__ */ jsxs(
404
494
  View,
@@ -411,7 +501,10 @@ function Chart({
411
501
  children: [
412
502
  (spec.title || spec.subtitle) && /* @__PURE__ */ jsxs(View, { style: styles.header, children: [
413
503
  /* @__PURE__ */ jsxs(View, { style: styles.headerText, children: [
414
- spec.title ? /* @__PURE__ */ jsx(Text, { style: styles.title, children: spec.title }) : null,
504
+ spec.title ? (
505
+ // F50: the OS surface title, not the web card's 15 / 600.
506
+ /* @__PURE__ */ jsx(Text, { style: [styles.title, resolveTextRole(theme, "surfaceTitle", android)], children: spec.title })
507
+ ) : null,
415
508
  spec.subtitle ? /* @__PURE__ */ jsx(Text, { style: styles.subtitle, children: spec.subtitle }) : null
416
509
  ] }),
417
510
  /* @__PURE__ */ jsxs(View, { style: styles.toolbar, children: [
@@ -419,7 +512,7 @@ function Chart({
419
512
  ToolButton,
420
513
  {
421
514
  icon: "grid",
422
- label: tableOpen ? "Hide the data table" : "Show the data table",
515
+ label: tableOpen ? labels.hideTable : labels.showTable,
423
516
  active: tableOpen,
424
517
  onPress: () => setTableOpen((v) => !v)
425
518
  }
@@ -428,15 +521,18 @@ function Chart({
428
521
  ToolButton,
429
522
  {
430
523
  icon: "download",
431
- label: "Export the visible window as CSV",
432
- onPress: () => onExportCsv(toCsv(table), (spec.title || "chart").replace(/[^\w.-]+/g, "-") + ".csv")
524
+ label: labels.exportCsv,
525
+ onPress: () => onExportCsv(
526
+ toCsv(table),
527
+ (spec.title || "chart").replace(/[^\w.-]+/g, "-") + ".csv"
528
+ )
433
529
  }
434
530
  ) : null,
435
531
  onExportImage ? /* @__PURE__ */ jsx(
436
532
  ToolButton,
437
533
  {
438
534
  icon: "image",
439
- label: "Share the chart as an image",
535
+ label: labels.shareImage,
440
536
  onPress: () => onExportImage(
441
537
  svgDocument(frame, uid, measured, height, {
442
538
  sans: theme.font.sans,
@@ -448,11 +544,19 @@ function Chart({
448
544
  ) : null
449
545
  ] })
450
546
  ] }),
451
- showReadout && state === "ready" ? /* @__PURE__ */ jsx(View, { style: styles.readout, accessibilityLiveRegion: "polite", children: rows.length === 0 ? /* @__PURE__ */ jsx(Text, { style: styles.readoutHint, children: "Drag across the chart to read values." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
547
+ showReadout && state === "ready" ? /* @__PURE__ */ jsx(View, { style: styles.readout, accessibilityLiveRegion: "polite", children: rows.length === 0 ? /* @__PURE__ */ jsx(Text, { style: styles.readoutHint, children: labels.readoutPlaceholder }) : /* @__PURE__ */ jsxs(Fragment, { children: [
452
548
  /* @__PURE__ */ jsxs(View, { style: styles.readoutBody, children: [
453
- /* @__PURE__ */ jsx(Text, { style: styles.readoutLabel, children: frame.axisLabels[pinned?.di ?? 0] }),
549
+ /* @__PURE__ */ jsx(Text, { style: [styles.readoutLabel, resolveTextRole(theme, "overline", android)], children: frame.axisLabels[pinned?.di ?? 0] }),
454
550
  /* @__PURE__ */ jsx(View, { style: styles.readoutRows, children: rows.map((r, i) => /* @__PURE__ */ jsxs(View, { style: styles.readoutRow, children: [
455
- /* @__PURE__ */ jsx(View, { style: [styles.swatch, { backgroundColor: r.color, borderColor: r.edge ?? r.color }] }),
551
+ /* @__PURE__ */ jsx(
552
+ View,
553
+ {
554
+ style: [
555
+ styles.swatch,
556
+ { backgroundColor: r.color, borderColor: r.edge ?? r.color }
557
+ ]
558
+ }
559
+ ),
456
560
  /* @__PURE__ */ jsxs(Text, { style: styles.readoutName, children: [
457
561
  r.label,
458
562
  ":"
@@ -464,47 +568,75 @@ function Chart({
464
568
  Pressable,
465
569
  {
466
570
  accessibilityRole: "button",
467
- accessibilityLabel: "Clear the reading",
468
- style: ({ pressed }) => [styles.readoutClear, pressed && styles.pressed],
469
- onPress: () => setPinned(null),
470
- children: /* @__PURE__ */ jsx(Icon, { name: "x", size: 15, color: theme.color.text3 })
571
+ accessibilityLabel: labels.clearReading,
572
+ hitSlop: (theme.hit.md - theme.ctl.md) / 2,
573
+ style: ({ pressed }) => [styles.iconBox, pressed && styles.pressed],
574
+ onPress: () => {
575
+ lastReadRef.current = null;
576
+ setPinned(null);
577
+ },
578
+ children: /* @__PURE__ */ jsx(Icon, { name: "x", size: theme.ctl.icon.md, color: theme.color.text2 })
471
579
  }
472
580
  )
473
581
  ] }) }) : null,
474
- legendEntries.length > 1 ? /* @__PURE__ */ jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.legend, children: [
582
+ legendEntries.length > 1 ? /* @__PURE__ */ jsxs(LegendRow, { wrap: wholePlot, children: [
475
583
  legendEntries.map((en) => /* @__PURE__ */ jsxs(
476
584
  Pressable,
477
585
  {
478
586
  accessibilityRole: "button",
479
587
  accessibilityState: { selected: !en.off },
480
588
  accessibilityLabel: en.label,
481
- hitSlop: { top: theme.space[6], bottom: theme.space[6], left: theme.space[4], right: theme.space[4] },
482
- style: ({ pressed }) => [styles.chip, en.off && styles.chipOff, pressed && styles.pressed],
589
+ hitSlop: {
590
+ top: (theme.hit.sm - theme.ctl.sm) / 2,
591
+ bottom: (theme.hit.sm - theme.ctl.sm) / 2
592
+ },
593
+ style: ({ pressed }) => [styles.key, pressed && styles.pressed],
483
594
  onPress: () => toggle(en.id, en.index),
484
595
  onLongPress: () => setSolo((s) => s === en.index ? null : en.index),
485
596
  children: [
597
+ en.line ? (
598
+ // A line series: a 14 × 2 rule with a 6 ring, hollow when off.
599
+ /* @__PURE__ */ jsxs(View, { style: styles.lineKey, children: [
600
+ /* @__PURE__ */ jsx(View, { style: [styles.lineRule, { backgroundColor: en.edge }] }),
601
+ /* @__PURE__ */ jsx(
602
+ View,
603
+ {
604
+ style: [
605
+ styles.lineRing,
606
+ { borderColor: en.edge },
607
+ !en.off && { backgroundColor: en.edge }
608
+ ]
609
+ }
610
+ )
611
+ ] })
612
+ ) : (
613
+ // Off hollows the swatch: the fill drops, the series edge
614
+ // stays, so a hidden series never reads as a fourth grey one.
615
+ /* @__PURE__ */ jsx(
616
+ View,
617
+ {
618
+ style: [
619
+ styles.swatch,
620
+ { backgroundColor: en.off ? "transparent" : en.color, borderColor: en.edge }
621
+ ]
622
+ }
623
+ )
624
+ ),
486
625
  /* @__PURE__ */ jsx(
487
- View,
626
+ Text,
488
627
  {
489
628
  style: [
490
- styles.swatch,
491
- // Outlined in the series edge: the pastel fill alone does
492
- // not clear 3:1 on the card.
493
- { backgroundColor: en.color, borderColor: en.edge },
494
- // The web twin greys the chip with `grayscale(1)`; RN has no
495
- // filter, so the muting is the system's own disabled opacity
496
- // rather than a hand-picked number. Only the *swatch* dims —
497
- // see the `chipOff` note for why the label does not.
498
- en.off && { opacity: theme.state.disabledOpacity }
499
- ]
629
+ styles.keyText,
630
+ en.off && (android ? styles.keyTextOff : styles.keyTextOffIos)
631
+ ],
632
+ children: en.label
500
633
  }
501
- ),
502
- /* @__PURE__ */ jsx(Text, { style: [styles.chipText, en.off && styles.chipTextOff], children: en.label })
634
+ )
503
635
  ]
504
636
  },
505
637
  en.id
506
638
  )),
507
- /* @__PURE__ */ jsx(Text, { style: styles.legendHint, children: "tap to filter \xB7 hold to solo" })
639
+ /* @__PURE__ */ jsx(Text, { style: styles.legendHint, children: labels.legendHint })
508
640
  ] }) : null,
509
641
  /* @__PURE__ */ jsx(View, { style: styles.plotWrap, children: /* @__PURE__ */ jsxs(View, { onLayout: onPlotLayout, style: styles.plot, children: [
510
642
  state === "loading" ? /* @__PURE__ */ jsx(
@@ -512,18 +644,30 @@ function Chart({
512
644
  {
513
645
  accessible: true,
514
646
  accessibilityRole: "progressbar",
515
- accessibilityLabel: "Loading chart",
647
+ accessibilityLabel: labels.loading,
516
648
  style: [styles.skeleton, { height }],
517
- children: Array.from({ length: 10 }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { style: { flex: 1, height: 28 + i * 37 % 62 + "%" }, radius: "sm" }, i))
649
+ children: Array.from({ length: 12 }, (_, i) => /* @__PURE__ */ jsx(
650
+ Skeleton,
651
+ {
652
+ style: { flex: 1, height: 28 + i * 37 % 62 + "%" },
653
+ radius: "sm",
654
+ decorative: true
655
+ },
656
+ i
657
+ ))
518
658
  }
519
659
  ) : null,
520
- state === "empty" || state === "error" ? /* @__PURE__ */ jsxs(View, { style: [styles.message, { minHeight: Math.max(180, height * 0.7) }], children: [
521
- /* @__PURE__ */ jsx(View, { style: styles.messageIcon, children: /* @__PURE__ */ jsx(Icon, { name: state === "error" ? "alert-triangle" : "chart-bar", size: 22, color: theme.color.text3 }) }),
522
- /* @__PURE__ */ jsx(Text, { style: styles.messageTitle, children: state === "error" ? frame.problem?.title || spec.errorTitle || "That data did not load" : spec.emptyTitle || "No data in this range" }),
523
- /* @__PURE__ */ jsx(Text, { style: styles.messageText, children: state === "error" ? frame.problem?.text || spec.errorText || "Nothing was drawn, because a chart of nothing looks exactly like a chart of zero." : spec.emptyText || "The series exist \u2014 the window is empty. Widen the range or clear a filter." }),
524
- state === "error" && spec.onRetry ? /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onPress: spec.onRetry, children: "Try again" }) : null,
525
- state === "empty" && spec.onReset ? /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onPress: spec.onReset, children: "Clear the filter" }) : null
526
- ] }) : null,
660
+ state === "empty" || state === "error" ? /* @__PURE__ */ jsx(View, { style: [styles.message, { minHeight: Math.max(180, height * 0.7) }], children: /* @__PURE__ */ jsx(
661
+ EmptyState,
662
+ {
663
+ variant: state === "error" ? "error" : "empty",
664
+ icon: state === "error" ? "alert-triangle" : "chart-bar",
665
+ title: state === "error" ? frame.problem?.title || spec.errorTitle || labels.errorTitle : spec.emptyTitle || labels.emptyTitle,
666
+ description: state === "error" ? frame.problem?.text || spec.errorText || labels.errorText : spec.emptyText || labels.emptyText,
667
+ actionLabel: state === "error" && spec.onRetry ? labels.tryAgain : state === "empty" && spec.onReset ? labels.clearFilter : void 0,
668
+ onAction: state === "error" ? spec.onRetry : spec.onReset
669
+ }
670
+ ) }) : null,
527
671
  state === "ready" ? /* @__PURE__ */ jsx(
528
672
  View,
529
673
  {
@@ -536,27 +680,52 @@ function Chart({
536
680
  onLayout: (e) => {
537
681
  originRef.current = { x: 0, y: 0 };
538
682
  },
539
- children: /* @__PURE__ */ jsxs(Svg, { width: "100%", height, viewBox: `0 0 ${measured} ${height}`, children: [
683
+ children: /* @__PURE__ */ jsx(Animated.View, { style: entryStyle, children: /* @__PURE__ */ jsxs(Svg, { width: "100%", height, viewBox: `0 0 ${measured} ${height}`, children: [
540
684
  /* @__PURE__ */ jsx(SceneDefsNodes, { defs: frame.defs, clipId: uid + "-clip" }),
541
685
  /* @__PURE__ */ jsx(SceneNodes, { scene: frame.scene, theme, clipId: uid + "-clip" })
542
- ] })
686
+ ] }) })
543
687
  }
544
688
  ) : null,
545
- zoomEnabled && isZoomed(zoom) ? /* @__PURE__ */ jsx(View, { style: styles.zoomPill, children: /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onPress: resetZoom, accessibilityLabel: "Reset the zoom", children: "Reset zoom" }) }) : null
689
+ zoomEnabled && isZoomed(zoom) ? /* @__PURE__ */ jsx(View, { style: styles.zoomPill, children: /* @__PURE__ */ jsx(
690
+ Button,
691
+ {
692
+ variant: "outline",
693
+ size: "sm",
694
+ onPress: resetZoom,
695
+ accessibilityLabel: labels.resetZoomA11y,
696
+ children: labels.resetZoom
697
+ }
698
+ ) }) : null
546
699
  ] }) }),
547
- (spec.footnote || spec.source) && /* @__PURE__ */ jsx(View, { style: styles.caption, children: /* @__PURE__ */ jsx(Text, { style: styles.captionText, children: [spec.footnote, spec.source && "Source: " + spec.source].filter(Boolean).join(" \xB7 ") }) }),
548
- tableOpen ? /* @__PURE__ */ jsx(ChartDataTable, { model: table, title: spec.title }) : null
700
+ (spec.footnote || spec.source) && /* @__PURE__ */ jsx(View, { style: styles.caption, children: /* @__PURE__ */ jsx(Text, { style: styles.captionText, children: [spec.footnote, spec.source && labels.source(spec.source)].filter(Boolean).join(" \xB7 ") }) }),
701
+ tableOpen ? /* @__PURE__ */ jsx(ChartDataTable, { model: table, title: spec.title, labels }) : null
549
702
  ]
550
703
  }
551
704
  );
552
705
  }
706
+ function LegendRow({
707
+ wrap,
708
+ children
709
+ }) {
710
+ const { styles } = useStyles(stylesheet);
711
+ if (wrap) return /* @__PURE__ */ jsx(View, { style: [styles.legend, styles.legendWrap], children });
712
+ return /* @__PURE__ */ jsx(
713
+ ScrollView,
714
+ {
715
+ horizontal: true,
716
+ showsHorizontalScrollIndicator: false,
717
+ contentContainerStyle: styles.legend,
718
+ children
719
+ }
720
+ );
721
+ }
553
722
  function ToolButton({
554
723
  icon,
555
724
  label,
556
725
  active,
557
726
  onPress
558
727
  }) {
559
- const theme = useLoamTheme();
728
+ const theme = useLoamTheme("chart");
560
729
  const { styles } = useStyles(stylesheet);
561
730
  return /* @__PURE__ */ jsx(
562
731
  Pressable,
@@ -564,16 +733,47 @@ function ToolButton({
564
733
  accessibilityRole: "button",
565
734
  accessibilityLabel: label,
566
735
  accessibilityState: { selected: !!active },
567
- style: ({ pressed }) => [styles.toolButton, active && styles.toolButtonActive, pressed && styles.pressed],
736
+ hitSlop: (theme.hit.md - theme.ctl.md) / 2,
737
+ style: ({ pressed }) => [
738
+ styles.iconBox,
739
+ styles.toolButton,
740
+ active && styles.toolButtonActive,
741
+ pressed && styles.pressed
742
+ ],
568
743
  onPress,
569
- children: /* @__PURE__ */ jsx(Icon, { name: icon, size: 17, color: active ? theme.color.accentStrong : theme.color.text2 })
744
+ children: /* @__PURE__ */ jsx(
745
+ Icon,
746
+ {
747
+ name: icon,
748
+ size: theme.ctl.icon.md,
749
+ color: active ? theme.color.accentOnSoft : theme.color.text
750
+ }
751
+ )
570
752
  }
571
753
  );
572
754
  }
573
- function ChartDataTable({ model, title }) {
755
+ function ChartDataTable({
756
+ model,
757
+ title,
758
+ labels: labelsProp
759
+ }) {
760
+ const labels = useLabels("chart", DEFAULT_CHART_UI_LABELS, labelsProp);
761
+ const theme = useLoamTheme("chart");
762
+ const android = isAndroidIdiom(theme);
574
763
  const { styles } = useStyles(stylesheet);
575
764
  return /* @__PURE__ */ jsxs(View, { style: styles.tableWrap, children: [
576
- /* @__PURE__ */ jsx(Text, { style: styles.tableCaption, children: (title || "Chart data") + " \u2014 " + model.rows.length + " rows" }),
765
+ /* @__PURE__ */ jsxs(
766
+ View,
767
+ {
768
+ style: styles.tableCaption,
769
+ accessible: true,
770
+ accessibilityLabel: labels.tableRows(title || labels.dataCaption, model.rows.length),
771
+ children: [
772
+ /* @__PURE__ */ jsx(Text, { style: [styles.tableCaptionText, resolveTextRole(theme, "overline", android)], children: title || labels.dataCaption }),
773
+ /* @__PURE__ */ jsx(Text, { style: styles.tableCount, children: model.rows.length })
774
+ ]
775
+ }
776
+ ),
577
777
  /* @__PURE__ */ jsx(ScrollView, { horizontal: true, focusable: true, showsHorizontalScrollIndicator: true, children: /* @__PURE__ */ jsx(ScrollView, { style: styles.tableScroll, focusable: true, nestedScrollEnabled: true, children: /* @__PURE__ */ jsxs(View, { accessibilityRole: "none", children: [
578
778
  /* @__PURE__ */ jsx(View, { style: [styles.tr, styles.thead], children: model.head.map((h, i) => /* @__PURE__ */ jsx(Text, { style: [styles.th, i === 0 && styles.thFirst], children: h }, i)) }),
579
779
  model.rows.map((r, i) => /* @__PURE__ */ jsx(View, { style: [styles.tr, i % 2 ? styles.trAlt : null], children: r.map((c, j) => /* @__PURE__ */ jsx(Text, { style: [styles.td, j === 0 && styles.tdFirst], children: c }, j)) }, i))
@@ -586,7 +786,7 @@ var stylesheet = createStyleSheet((theme) => ({
586
786
  paddingTop: theme.space[8]
587
787
  },
588
788
  card: {
589
- borderRadius: theme.radius.xl,
789
+ borderRadius: theme.radius.lg,
590
790
  borderWidth: theme.borderWidth.base,
591
791
  borderColor: theme.color.border,
592
792
  backgroundColor: theme.color.surface,
@@ -605,23 +805,36 @@ var stylesheet = createStyleSheet((theme) => ({
605
805
  paddingBottom: theme.space.s3
606
806
  },
607
807
  headerText: { flex: 1, minWidth: 0, gap: theme.space.s1 },
608
- title: { fontFamily: theme.font.sans, fontSize: theme.fontSize[15], fontWeight: theme.fontWeight.extrabold, color: theme.color.text },
609
- subtitle: { fontFamily: theme.font.sans, fontSize: theme.fontSize[13], color: theme.color.text3, lineHeight: theme.space[18] },
610
- toolbar: { flexDirection: "row", gap: theme.space.s2 },
611
- toolButton: {
612
- width: theme.tapMin,
613
- height: theme.tapMin,
808
+ title: {
809
+ fontFamily: theme.font.sans,
810
+ color: theme.color.text
811
+ },
812
+ subtitle: {
813
+ fontFamily: theme.font.sans,
814
+ fontSize: theme.fontSize[13],
815
+ color: theme.color.text3,
816
+ lineHeight: theme.space[18]
817
+ },
818
+ toolbar: { flexDirection: "row", gap: theme.space.s1 },
819
+ // The md 36 icon box every chart control shares — the Button md tier, square.
820
+ iconBox: {
821
+ width: theme.ctl.md,
822
+ height: theme.ctl.md,
614
823
  alignItems: "center",
615
824
  justifyContent: "center",
616
- borderRadius: theme.radius.sm,
825
+ borderRadius: theme.ctl.r.md
826
+ },
827
+ // Button outline: the strong 1.5 pressable edge on no ground (R3).
828
+ toolButton: {
829
+ borderWidth: theme.borderWidth.strong,
830
+ borderColor: theme.color.borderStrong
831
+ },
832
+ // Pressed = tonal, as on web: the soft accent ground and its edge.
833
+ toolButtonActive: {
617
834
  borderWidth: theme.borderWidth.base,
618
- borderColor: theme.color.borderStrong,
619
- backgroundColor: theme.color.surface2
835
+ borderColor: theme.edge.accent,
836
+ backgroundColor: theme.color.accentSoft
620
837
  },
621
- // The active edge is a graphical object under SC 1.4.11, so it takes the
622
- // *measured* accent rather than the brand input — the same colour the focus
623
- // ring uses, for the same reason.
624
- toolButtonActive: { borderColor: theme.focus.ringColor, backgroundColor: theme.color.accentSoft },
625
838
  // Press feedback for every chart control. Web leans on the unlayered global
626
839
  // `button:hover { filter: var(--hover-filter) }`; native has no equivalent,
627
840
  // so without this a tap on the toolbar, a legend chip or the readout's clear
@@ -633,7 +846,7 @@ var stylesheet = createStyleSheet((theme) => ({
633
846
  flexDirection: "row",
634
847
  alignItems: "center",
635
848
  gap: theme.space.s3,
636
- minHeight: theme.space[46],
849
+ minHeight: theme.tapMin,
637
850
  marginHorizontal: theme.space.s4,
638
851
  marginBottom: theme.space.s3,
639
852
  paddingHorizontal: theme.space.s3,
@@ -644,11 +857,13 @@ var stylesheet = createStyleSheet((theme) => ({
644
857
  backgroundColor: theme.color.surface2
645
858
  },
646
859
  readoutBody: { flex: 1, minWidth: 0, gap: theme.space.s1 },
647
- readoutHint: { fontFamily: theme.font.sans, fontSize: theme.fontSize[13], color: theme.color.text3 },
860
+ readoutHint: {
861
+ fontFamily: theme.font.sans,
862
+ fontSize: theme.fontSize[13],
863
+ color: theme.color.text3
864
+ },
648
865
  readoutLabel: {
649
- fontFamily: theme.font.mono,
650
- fontSize: theme.fontSize[11],
651
- letterSpacing: theme.tracking.wide,
866
+ fontFamily: theme.font.sans,
652
867
  color: theme.color.text3
653
868
  },
654
869
  readoutRows: {
@@ -658,56 +873,80 @@ var stylesheet = createStyleSheet((theme) => ({
658
873
  rowGap: theme.space.s1
659
874
  },
660
875
  readoutRow: { flexDirection: "row", alignItems: "center", gap: theme.space[6] },
661
- readoutName: { fontFamily: theme.font.sans, fontSize: theme.fontSize[13], color: theme.color.text2 },
662
- readoutValue: { fontFamily: theme.font.sans, fontSize: theme.fontSize[13], fontWeight: theme.fontWeight.bold, color: theme.color.text },
663
- readoutClear: {
664
- width: theme.space[38],
665
- height: theme.space[38],
876
+ readoutName: {
877
+ fontFamily: theme.font.sans,
878
+ fontSize: theme.fontSize[13],
879
+ color: theme.color.text2
880
+ },
881
+ readoutValue: {
882
+ fontFamily: theme.font.sans,
883
+ fontSize: theme.fontSize[13],
884
+ fontWeight: theme.fontWeight.semibold,
885
+ color: theme.color.text
886
+ },
887
+ legendWrap: { flexWrap: "wrap" },
888
+ legend: {
889
+ flexDirection: "row",
666
890
  alignItems: "center",
667
- justifyContent: "center",
668
- borderRadius: theme.radius.sm,
669
- borderWidth: theme.borderWidth.base,
670
- borderColor: theme.color.borderStrong,
671
- backgroundColor: theme.color.surface
891
+ gap: theme.space.s1,
892
+ paddingHorizontal: theme.space.s4,
893
+ paddingBottom: theme.space.s3
672
894
  },
673
- legend: { flexDirection: "row", alignItems: "center", gap: theme.space.s2, paddingHorizontal: theme.space.s4, paddingBottom: theme.space.s3 },
674
- chip: {
895
+ // Legend key: a ghost toggle on the sm 30 tier, r-sm 8 (Refinement 37 F50,
896
+ // Final 10 iOS "Chip sm 30", which supersede the md 36 of Refinement 18/19) — no
897
+ // border or ground at rest, so a row of keys matches the icon Buttons.
898
+ // On stays neutral (R1 exception): the swatch carries on and off.
899
+ key: {
675
900
  flexDirection: "row",
676
901
  alignItems: "center",
677
- gap: theme.space[7],
678
- height: theme.space[32],
679
- paddingHorizontal: theme.space.s3,
902
+ gap: theme.space[8],
903
+ height: theme.ctl.sm,
904
+ paddingHorizontal: theme.space[10],
905
+ borderRadius: theme.ctl.r.sm
906
+ },
907
+ keyText: {
908
+ fontFamily: theme.font.sans,
909
+ fontSize: theme.fontSize[13],
910
+ fontWeight: theme.fontWeight.medium,
911
+ color: theme.color.text
912
+ },
913
+ // Hidden series: Android text-3, iOS text-2 (Final 10 platform rows).
914
+ keyTextOff: { color: theme.color.text3 },
915
+ keyTextOffIos: { color: theme.color.text2 },
916
+ legendHint: {
917
+ fontFamily: theme.font.sans,
918
+ fontSize: theme.fontSize[12],
919
+ color: theme.color.text3,
920
+ paddingLeft: theme.space.s1
921
+ },
922
+ // One swatch: 10 × 10, r 3, a 1 px series edge.
923
+ swatch: {
924
+ width: theme.space[10],
925
+ height: theme.space[10],
926
+ borderRadius: theme.radius[3],
927
+ borderWidth: 1
928
+ },
929
+ lineKey: {
930
+ width: theme.space[14],
931
+ height: theme.space[10],
932
+ justifyContent: "center",
933
+ alignItems: "center"
934
+ },
935
+ lineRule: { position: "absolute", left: 0, right: 0, height: theme.space[2] },
936
+ lineRing: {
937
+ width: theme.space[6],
938
+ height: theme.space[6],
680
939
  borderRadius: theme.radius.full,
681
- borderWidth: theme.borderWidth.base,
682
- borderColor: theme.color.borderStrong,
683
- backgroundColor: theme.color.surface2
940
+ borderWidth: theme.borderWidth.strong,
941
+ backgroundColor: theme.color.surface
684
942
  },
685
- // No `opacity` here. An off chip is already carried on three axes — `border` for
686
- // `borderStrong`, transparent for `surface2`, and `text3` for `text2` in `chipTextOff`
687
- // — and dimming on top of that dims a *measured* ink: `text3` clears AA against the
688
- // surface with no headroom, so 60% puts an interactive control under it.
689
- chipOff: { borderColor: theme.color.border, backgroundColor: "transparent" },
690
- chipText: { fontFamily: theme.font.sans, fontSize: theme.fontSize[13], fontWeight: theme.fontWeight.semibold, color: theme.color.text2 },
691
- chipTextOff: { color: theme.color.text3 },
692
- legendHint: { fontFamily: theme.font.mono, fontSize: theme.fontSize[11], color: theme.color.text3, paddingLeft: theme.space.s1 },
693
- swatch: { width: theme.space[9], height: theme.space[9], borderRadius: theme.radius[3], borderWidth: 1 },
694
943
  // The inset lives on a wrapper so the plot's own `onLayout` width is the
695
944
  // width the scene is drawn at — padding on the measured view would put the
696
945
  // viewBox and the drawn box out of step.
697
946
  plotWrap: { paddingHorizontal: theme.space.s4, paddingBottom: theme.space.s3 },
698
947
  plot: { position: "relative", minWidth: 0 },
699
948
  skeleton: { flexDirection: "row", alignItems: "flex-end", gap: theme.space[8] },
700
- message: { alignItems: "center", justifyContent: "center", gap: theme.space.s2, paddingHorizontal: theme.space.s5, paddingVertical: theme.space.s6 },
701
- messageIcon: {
702
- width: theme.tapMin,
703
- height: theme.tapMin,
704
- alignItems: "center",
705
- justifyContent: "center",
706
- borderRadius: theme.radius.md,
707
- backgroundColor: theme.color.surface2
708
- },
709
- messageTitle: { fontFamily: theme.font.sans, fontSize: theme.fontSize[14], fontWeight: theme.fontWeight.bold, color: theme.color.text, textAlign: "center" },
710
- messageText: { fontFamily: theme.font.sans, fontSize: theme.fontSize[13], lineHeight: theme.space[19], color: theme.color.text3, textAlign: "center" },
949
+ message: { justifyContent: "center" },
711
950
  caption: {
712
951
  borderTopWidth: theme.borderWidth.base,
713
952
  borderTopColor: theme.color.border,
@@ -715,41 +954,63 @@ var stylesheet = createStyleSheet((theme) => ({
715
954
  paddingHorizontal: theme.space.s4,
716
955
  paddingVertical: theme.space.s2
717
956
  },
718
- captionText: { fontFamily: theme.font.mono, fontSize: theme.fontSize[11], color: theme.color.text3 },
719
- tableWrap: { borderTopWidth: theme.borderWidth.base, borderTopColor: theme.color.border, maxHeight: theme.space[256] },
957
+ // Footnote and source are prose: sans 12 / 1.5 text-2 (R18).
958
+ captionText: {
959
+ fontFamily: theme.font.sans,
960
+ fontSize: theme.fontSize[12],
961
+ lineHeight: theme.space[18],
962
+ color: theme.color.text2
963
+ },
964
+ tableWrap: {
965
+ borderTopWidth: theme.borderWidth.base,
966
+ borderTopColor: theme.color.border,
967
+ maxHeight: theme.space[256]
968
+ },
720
969
  tableScroll: { maxHeight: theme.space[224] },
721
970
  tableCaption: {
722
- fontFamily: theme.font.mono,
723
- fontSize: theme.fontSize[11],
724
- letterSpacing: theme.tracking.wide,
725
- color: theme.color.text3,
971
+ flexDirection: "row",
972
+ alignItems: "baseline",
973
+ gap: theme.space[8],
726
974
  paddingHorizontal: theme.space.s4,
727
975
  paddingVertical: theme.space.s2
728
976
  },
729
- tr: { flexDirection: "row" },
977
+ tableCaptionText: { fontFamily: theme.font.sans, color: theme.color.text3 },
978
+ // The count style: mono 12 / 500 text-2.
979
+ tableCount: {
980
+ fontFamily: theme.font.mono,
981
+ fontSize: theme.fontSize[12],
982
+ fontWeight: theme.fontWeight.medium,
983
+ color: theme.color.text2
984
+ },
985
+ tr: { flexDirection: "row", height: theme.space[38], alignItems: "center" },
730
986
  trAlt: { backgroundColor: theme.color.surface2 },
731
987
  thead: { backgroundColor: theme.color.surface2 },
732
988
  th: {
733
989
  minWidth: theme.space[96],
734
- paddingHorizontal: theme.space[3],
735
- paddingVertical: theme.space[2],
990
+ paddingHorizontal: theme.space.s4,
991
+ paddingVertical: theme.space.s2,
992
+ ...theme.type.footnote,
736
993
  fontFamily: theme.font.sans,
737
- fontSize: theme.fontSize[13],
738
- fontWeight: theme.fontWeight.bold,
994
+ fontWeight: theme.platform === "Android" ? theme.fontWeight.medium : theme.fontWeight.semibold,
739
995
  color: theme.color.text2,
740
996
  textAlign: "right"
741
997
  },
742
998
  thFirst: { textAlign: "left", minWidth: theme.space[120] },
743
999
  td: {
744
1000
  minWidth: theme.space[96],
745
- paddingHorizontal: theme.space[3],
746
- paddingVertical: theme.space[2],
1001
+ paddingHorizontal: theme.space.s4,
1002
+ paddingVertical: theme.space.s2,
1003
+ ...theme.type.subheadline,
747
1004
  fontFamily: theme.font.sans,
748
- fontSize: theme.fontSize[13],
749
1005
  color: theme.color.text,
750
1006
  textAlign: "right"
751
1007
  },
752
- tdFirst: { textAlign: "left", minWidth: theme.space[120], fontWeight: theme.fontWeight.semibold, color: theme.color.text2 }
1008
+ tdFirst: {
1009
+ textAlign: "left",
1010
+ minWidth: theme.space[120],
1011
+ fontWeight: theme.fontWeight.semibold,
1012
+ color: theme.color.text2
1013
+ }
753
1014
  }));
754
1015
 
755
1016
  export { Chart, ChartDataTable, SceneDefsNodes, SceneNodes, nativeChartPalette };