@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
@@ -0,0 +1,419 @@
1
+ import { resolveTextRole } from './chunk-L4D5LHCH.js';
2
+ import { SkeletonText } from './chunk-YJ5PXOX3.js';
3
+ import { softToneSkin } from './chunk-PJLTKDVY.js';
4
+ import { useLabels } from './chunk-APCWFOZW.js';
5
+ import { useFocusRing } from './chunk-2YKVID2V.js';
6
+ import { Icon } from './chunk-PCEFCOLN.js';
7
+ import * as React from 'react';
8
+ import { Animated, Pressable, Text, Platform, Easing, findNodeHandle, AccessibilityInfo, Modal, View } from 'react-native';
9
+ import { useStyles, createStyleSheet, useLoamTheme } from '@btndprojects/loam-theme-native';
10
+ import { jsx, jsxs } from 'react/jsx-runtime';
11
+
12
+ var AnimatedPressable = Animated.createAnimatedComponent(Pressable);
13
+ var memoryStore = /* @__PURE__ */ new Map();
14
+ var defaultRememberStorage = {
15
+ getItem: (key) => memoryStore.get(key) ?? null,
16
+ setItem: (key, value) => {
17
+ memoryStore.set(key, value);
18
+ }
19
+ };
20
+ function measureBox(node) {
21
+ return new Promise((resolve) => {
22
+ if (!node?.measureInWindow) return resolve(null);
23
+ node.measureInWindow(
24
+ (x, y, w, h) => resolve(Number.isFinite(x) && w > 0 && h > 0 ? { x, y, w, h } : null)
25
+ );
26
+ });
27
+ }
28
+ var DEFAULT_LABELS = {
29
+ closeDialog: "Close dialog",
30
+ close: "Close"
31
+ };
32
+ var DialogPlatformContext = React.createContext(void 0);
33
+ function resolveDialogPlatform(explicit, themed) {
34
+ if (explicit) return explicit;
35
+ if (Platform.OS === "ios") return "ios";
36
+ if (Platform.OS === "android") return "android";
37
+ return themed === "Android" ? "android" : "ios";
38
+ }
39
+ function Dialog({
40
+ open,
41
+ defaultOpen = false,
42
+ onClose,
43
+ onOpenChange,
44
+ dismissible = true,
45
+ remember = false,
46
+ rememberKey,
47
+ storage = defaultRememberStorage,
48
+ title,
49
+ description,
50
+ showClose = dismissible,
51
+ accessibilityLabel,
52
+ motion = "full",
53
+ size,
54
+ loading = false,
55
+ tone,
56
+ morphFrom,
57
+ children,
58
+ labels: labelsProp,
59
+ platform
60
+ }) {
61
+ const labels = useLabels("dialog", DEFAULT_LABELS, labelsProp);
62
+ const theme = useLoamTheme("dialog");
63
+ const closeRing = useFocusRing(theme.ctl.r.md);
64
+ const os = resolveDialogPlatform(platform, theme.platform);
65
+ const { styles } = useStyles(sheet);
66
+ const skin = tone ? softToneSkin(theme, tone) : null;
67
+ const controlled = open !== void 0;
68
+ const persist = remember && rememberKey != null;
69
+ const reducedMotion = theme.reduceMotion || motion === "reduced";
70
+ const instantMotion = motion === "none";
71
+ const [internalOpen, setInternalOpen] = React.useState(() => {
72
+ if (!controlled && persist) {
73
+ const v = storage.getItem(rememberKey);
74
+ if (v === "open") return true;
75
+ if (v === "closed") return false;
76
+ }
77
+ return defaultOpen;
78
+ });
79
+ const actualOpen = controlled ? open : internalOpen;
80
+ const setOpen = React.useCallback(
81
+ (next) => {
82
+ if (persist) storage.setItem(rememberKey, next ? "open" : "closed");
83
+ if (!controlled) setInternalOpen(next);
84
+ onOpenChange?.(next);
85
+ },
86
+ [persist, rememberKey, storage, controlled, onOpenChange]
87
+ );
88
+ const requestDismiss = React.useCallback(() => {
89
+ if (!dismissible) return;
90
+ setOpen(false);
91
+ onClose?.();
92
+ }, [dismissible, setOpen, onClose]);
93
+ const [mounted, setMounted] = React.useState(actualOpen);
94
+ const progress = React.useRef(new Animated.Value(actualOpen ? 1 : 0)).current;
95
+ const canMorph = !!morphFrom && !reducedMotion && !instantMotion;
96
+ const rootRef = React.useRef(null);
97
+ const cardRef = React.useRef(null);
98
+ const fly = React.useRef(new Animated.Value(1)).current;
99
+ const [pending, setPending] = React.useState(false);
100
+ const [flight, setFlight] = React.useState(null);
101
+ const closingMorph = React.useRef(false);
102
+ const flightFor = React.useCallback(async () => {
103
+ const [src, dst, root] = await Promise.all([
104
+ measureBox(morphFrom?.current),
105
+ measureBox(cardRef.current),
106
+ measureBox(rootRef.current)
107
+ ]);
108
+ if (!src || !dst) return null;
109
+ const ox = root?.x ?? 0;
110
+ const oy = root?.y ?? 0;
111
+ const radius = Math.abs(src.w - src.h) < 2 ? src.h / 2 : Math.min(src.h / 2, theme.radius.md);
112
+ return {
113
+ src: { ...src, x: src.x - ox, y: src.y - oy },
114
+ dst: { ...dst, x: dst.x - ox, y: dst.y - oy },
115
+ radius
116
+ };
117
+ }, [morphFrom, theme.radius.md]);
118
+ const onCardLayout = React.useCallback(() => {
119
+ if (!pending) return;
120
+ void flightFor().then((f) => {
121
+ setPending(false);
122
+ if (!f) return;
123
+ setFlight(f);
124
+ fly.setValue(0);
125
+ Animated.timing(fly, {
126
+ toValue: 1,
127
+ duration: theme.motion.expand.duration,
128
+ easing: Easing.bezier(...theme.motion.expand.easing),
129
+ useNativeDriver: false
130
+ }).start(() => setFlight(null));
131
+ });
132
+ }, [pending, flightFor, fly, theme.motion.expand]);
133
+ React.useEffect(() => {
134
+ const easing = Easing.bezier(...theme.easing.base);
135
+ if (actualOpen) {
136
+ setMounted(true);
137
+ closingMorph.current = false;
138
+ if (canMorph) setPending(true);
139
+ if (instantMotion) {
140
+ progress.setValue(1);
141
+ return;
142
+ }
143
+ Animated.timing(progress, {
144
+ toValue: 1,
145
+ duration: theme.duration.base,
146
+ easing,
147
+ useNativeDriver: true
148
+ }).start();
149
+ } else {
150
+ if (instantMotion) {
151
+ progress.setValue(0);
152
+ setMounted(false);
153
+ return;
154
+ }
155
+ if (canMorph) {
156
+ closingMorph.current = true;
157
+ setPending(false);
158
+ void flightFor().then((f) => {
159
+ if (!closingMorph.current) return;
160
+ if (!f) {
161
+ closingMorph.current = false;
162
+ setMounted(false);
163
+ return;
164
+ }
165
+ setFlight(f);
166
+ fly.setValue(1);
167
+ Animated.timing(fly, {
168
+ toValue: 0,
169
+ duration: theme.motion.collapse.duration,
170
+ easing: Easing.bezier(...theme.motion.collapse.easing),
171
+ useNativeDriver: false
172
+ }).start(() => {
173
+ if (!closingMorph.current) return;
174
+ closingMorph.current = false;
175
+ setFlight(null);
176
+ setMounted(false);
177
+ });
178
+ });
179
+ }
180
+ Animated.timing(progress, {
181
+ toValue: 0,
182
+ duration: theme.motion.exit.duration,
183
+ easing: Easing.bezier(...theme.motion.exit.easing),
184
+ useNativeDriver: true
185
+ }).start(({ finished }) => {
186
+ if (finished && !closingMorph.current) setMounted(false);
187
+ });
188
+ }
189
+ }, [
190
+ actualOpen,
191
+ progress,
192
+ theme.duration.base,
193
+ theme.easing.base,
194
+ theme.motion.exit.duration,
195
+ theme.motion.exit.easing,
196
+ instantMotion,
197
+ canMorph,
198
+ flightFor,
199
+ fly,
200
+ theme.motion.collapse
201
+ ]);
202
+ const titleRef = React.useRef(null);
203
+ const cardMounted = mounted;
204
+ React.useEffect(() => {
205
+ if (!actualOpen || !cardMounted || Platform.OS === "web") return;
206
+ const node = titleRef.current;
207
+ const tag = node ? findNodeHandle(node) : null;
208
+ if (tag !== null) AccessibilityInfo.setAccessibilityFocus(tag);
209
+ }, [actualOpen, cardMounted]);
210
+ if (!mounted) return null;
211
+ const cardScale = reducedMotion || canMorph ? 1 : progress.interpolate({ inputRange: [0, 1], outputRange: [0.96, 1] });
212
+ const lerp = (a, b) => fly.interpolate({ inputRange: [0, 1], outputRange: [a, b] });
213
+ const clipStyle = flight ? [
214
+ styles.clip,
215
+ {
216
+ left: lerp(flight.src.x, flight.dst.x),
217
+ top: lerp(flight.src.y, flight.dst.y),
218
+ width: lerp(flight.src.w, flight.dst.w),
219
+ height: lerp(flight.src.h, flight.dst.h),
220
+ borderRadius: lerp(flight.radius, theme.radius.xl)
221
+ }
222
+ ] : styles.rest;
223
+ const innerStyle = flight ? {
224
+ position: "absolute",
225
+ left: lerp(flight.dst.x - flight.src.x, 0),
226
+ top: lerp(flight.dst.y - flight.src.y, 0),
227
+ width: flight.dst.w,
228
+ // The content arrives once the clip is big enough to hold it.
229
+ opacity: fly.interpolate({ inputRange: [0, 0.4, 1], outputRange: [0, 0, 1] })
230
+ } : styles.rest;
231
+ const cardStyle = flight ? [styles.card, styles.flat, { width: flight.dst.w, maxWidth: flight.dst.w }] : [
232
+ styles.card,
233
+ size ? { maxWidth: theme.dialog[size] } : null,
234
+ skin ? { borderWidth: theme.borderWidth.thin, borderColor: skin.edge } : null,
235
+ { opacity: pending ? 0 : progress, transform: [{ scale: cardScale }] }
236
+ ];
237
+ return /* @__PURE__ */ jsx(Modal, { transparent: true, visible: mounted, animationType: "none", onRequestClose: requestDismiss, children: /* @__PURE__ */ jsxs(View, { ref: rootRef, collapsable: false, style: styles.root, children: [
238
+ /* @__PURE__ */ jsx(
239
+ AnimatedPressable,
240
+ {
241
+ accessibilityRole: "button",
242
+ accessibilityLabel: labels.closeDialog,
243
+ accessibilityElementsHidden: !dismissible,
244
+ importantForAccessibility: dismissible ? "auto" : "no-hide-descendants",
245
+ onPress: dismissible ? requestDismiss : void 0,
246
+ style: [styles.scrim, { opacity: progress }]
247
+ }
248
+ ),
249
+ /* @__PURE__ */ jsx(Animated.View, { style: clipStyle, children: /* @__PURE__ */ jsx(Animated.View, { style: innerStyle, children: /* @__PURE__ */ jsxs(
250
+ Animated.View,
251
+ {
252
+ ref: cardRef,
253
+ role: "dialog",
254
+ accessibilityViewIsModal: true,
255
+ accessibilityLabel: accessibilityLabel ?? title,
256
+ "aria-busy": loading || void 0,
257
+ onLayout: onCardLayout,
258
+ style: cardStyle,
259
+ children: [
260
+ showClose ? /* @__PURE__ */ jsx(
261
+ Pressable,
262
+ {
263
+ accessibilityRole: "button",
264
+ accessibilityLabel: labels.close,
265
+ onPress: requestDismiss,
266
+ onFocus: closeRing.handlers.onFocus,
267
+ onBlur: closeRing.handlers.onBlur,
268
+ style: ({ pressed }) => [
269
+ styles.close,
270
+ pressed && styles.closePressed,
271
+ closeRing.focused && closeRing.style
272
+ ],
273
+ hitSlop: Math.max(0, (theme.tapMin - theme.ctl.iconBtn) / 2),
274
+ children: /* @__PURE__ */ jsx(Icon, { name: "x", size: theme.ctl.icon.md, color: theme.color.text3 })
275
+ }
276
+ ) : null,
277
+ /* @__PURE__ */ jsxs(DialogPlatformContext.Provider, { value: os, children: [
278
+ title ? /* @__PURE__ */ jsx(DialogTitle, { ref: titleRef, color: skin?.ink, children: title }) : null,
279
+ description ? /* @__PURE__ */ jsx(DialogDescription, { children: description }) : null,
280
+ loading ? /* @__PURE__ */ jsx(SkeletonText, { lines: 3 }) : children
281
+ ] })
282
+ ]
283
+ }
284
+ ) }) })
285
+ ] }) });
286
+ }
287
+ var DialogTitle = React.forwardRef(
288
+ function DialogTitle2({ children, color }, ref) {
289
+ const { styles, theme } = useStyles(sheet);
290
+ const os = resolveDialogPlatform(React.useContext(DialogPlatformContext), theme.platform);
291
+ const brand = theme.font.display !== theme.font.sans;
292
+ return /* @__PURE__ */ jsx(
293
+ Text,
294
+ {
295
+ ref,
296
+ accessibilityRole: "header",
297
+ style: [
298
+ styles.title,
299
+ resolveTextRole(theme, "dialogTitle", os === "android"),
300
+ brand ? { fontFamily: theme.font.display } : null,
301
+ color ? { color } : null
302
+ ],
303
+ children
304
+ }
305
+ );
306
+ }
307
+ );
308
+ function DialogDescription({ children }) {
309
+ const { styles } = useStyles(sheet);
310
+ return /* @__PURE__ */ jsx(Text, { style: styles.description, children });
311
+ }
312
+ function DialogFooter({ children }) {
313
+ const { styles, theme } = useStyles(sheet);
314
+ const os = resolveDialogPlatform(React.useContext(DialogPlatformContext), theme.platform);
315
+ if (os === "android") return /* @__PURE__ */ jsx(View, { style: styles.footer, children });
316
+ const ordered = React.Children.toArray(children).filter(Boolean);
317
+ const longLabel = ordered.some((child) => {
318
+ const label = React.isValidElement(child) ? child.props.children : null;
319
+ return typeof label === "string" && label.length >= 12;
320
+ });
321
+ const stacked = ordered.length >= 3 || longLabel;
322
+ const actions = stacked && ordered.length === 2 ? [...ordered].reverse() : ordered;
323
+ return /* @__PURE__ */ jsx(View, { style: stacked ? styles.footerStacked : styles.footerColumns, children: actions.map((child, i) => /* @__PURE__ */ jsx(View, { style: stacked ? void 0 : styles.column, children: child }, i)) });
324
+ }
325
+ var sheet = createStyleSheet((theme) => ({
326
+ root: {
327
+ flex: 1,
328
+ alignItems: "center",
329
+ justifyContent: "center",
330
+ padding: theme.space.s5
331
+ },
332
+ scrim: {
333
+ position: "absolute",
334
+ top: 0,
335
+ left: 0,
336
+ right: 0,
337
+ bottom: 0,
338
+ backgroundColor: theme.color.scrim
339
+ },
340
+ // loam-contrast-ignore — the boundary here is the scrim, not the shadow.
341
+ // `color.scrim` is a 44% wash and is *not* re-resolved by high contrast, so
342
+ // this surface is still separated from the page when the elevation zeroes
343
+ // out. A border would put a hairline around every modal for no gain.
344
+ card: {
345
+ width: "100%",
346
+ // The reference width, which is now a named tier rather than a literal.
347
+ maxWidth: theme.panel.xl,
348
+ alignSelf: "center",
349
+ backgroundColor: theme.color.surface,
350
+ borderRadius: theme.radius.xl,
351
+ padding: theme.space.s5,
352
+ gap: theme.space.s3,
353
+ ...theme.shadow.lg
354
+ },
355
+ // The pass-through wrappers around the card at rest: full width, centring it.
356
+ rest: {
357
+ width: "100%",
358
+ alignItems: "center"
359
+ },
360
+ // The travelling clip while the card morphs to or from its source.
361
+ clip: {
362
+ position: "absolute",
363
+ overflow: "hidden",
364
+ backgroundColor: theme.color.surface
365
+ },
366
+ // No shadow in flight: overflow clipping would cut it anyway.
367
+ flat: {
368
+ shadowOpacity: 0,
369
+ elevation: 0
370
+ },
371
+ close: {
372
+ position: "absolute",
373
+ top: theme.space.s4,
374
+ right: theme.space.s4,
375
+ zIndex: 1,
376
+ // Ghost icon button: 36 box, the control radius, pressed = the state fill.
377
+ width: theme.ctl.iconBtn,
378
+ height: theme.ctl.iconBtn,
379
+ alignItems: "center",
380
+ justifyContent: "center",
381
+ borderRadius: theme.ctl.r.md
382
+ },
383
+ closePressed: { backgroundColor: theme.state.pressed },
384
+ title: {
385
+ fontFamily: theme.font.sans,
386
+ color: theme.color.text
387
+ },
388
+ // F10: the subheadline role — 15 on iOS, 14 on Android.
389
+ description: {
390
+ fontFamily: theme.font.sans,
391
+ fontSize: theme.type.subheadline.fontSize,
392
+ lineHeight: theme.type.subheadline.lineHeight,
393
+ letterSpacing: theme.type.subheadline.letterSpacing,
394
+ color: theme.color.text2
395
+ },
396
+ footer: {
397
+ flexDirection: "row",
398
+ justifyContent: "flex-end",
399
+ alignItems: "center",
400
+ gap: theme.space.s2,
401
+ // 24 below the body: the card's 12 gap plus this.
402
+ marginTop: theme.space.s3
403
+ },
404
+ footerColumns: {
405
+ flexDirection: "row",
406
+ alignItems: "stretch",
407
+ gap: theme.space.s2,
408
+ marginTop: theme.space.s3
409
+ },
410
+ footerStacked: {
411
+ flexDirection: "column",
412
+ alignItems: "stretch",
413
+ gap: theme.space.s2,
414
+ marginTop: theme.space.s3
415
+ },
416
+ column: { flex: 1 }
417
+ }));
418
+
419
+ export { Dialog, DialogDescription, DialogFooter, DialogTitle, defaultRememberStorage, measureBox };
@@ -0,0 +1,139 @@
1
+ import { useWindowDimensions } from 'react-native';
2
+ import { breakpoints, useLoamTheme } from '@btndprojects/loam-theme-native';
3
+
4
+ // src/adaptive/form-factor.ts
5
+ var FORM_FACTORS = [
6
+ "phone",
7
+ "phoneLandscape",
8
+ "foldable",
9
+ "tablet",
10
+ "tabletLarge"
11
+ ];
12
+ var FOLD_LIST_FLEX = 1;
13
+ var FOLD_DETAIL_FLEX = 1.25;
14
+ var TABLET_LIST_FLEX = 0.85;
15
+ var TABLET_DETAIL_FLEX = 1.3;
16
+ var FORM_FACTOR_SPECS = {
17
+ phone: {
18
+ formFactor: "phone",
19
+ token: "--bp-phone 430px",
20
+ label: "390 \xD7 844 \xB7 compact width",
21
+ panes: 1,
22
+ nav: "bottom",
23
+ drawerAllowed: false,
24
+ hinge: false,
25
+ listFlex: 1,
26
+ detailFlex: 0,
27
+ asideFlex: 0,
28
+ collapseLargeTitle: false,
29
+ halveVerticalPadding: false,
30
+ modal: "fullWidthSheet",
31
+ fab: "floating",
32
+ rule: "Single column. Detail is a push. Sheets go full-width and respect the bottom safe area."
33
+ },
34
+ phoneLandscape: {
35
+ formFactor: "phoneLandscape",
36
+ token: "--bp-phone-land 740px",
37
+ label: "844 \xD7 390 \xB7 compact height",
38
+ panes: 1,
39
+ nav: "rail",
40
+ drawerAllowed: false,
41
+ hinge: false,
42
+ listFlex: 1,
43
+ detailFlex: 0,
44
+ asideFlex: 0,
45
+ collapseLargeTitle: true,
46
+ halveVerticalPadding: true,
47
+ modal: "fullWidthSheet",
48
+ fab: "floating",
49
+ rule: "Landscape phone: collapse large titles to inline, move nav to a rail, halve vertical padding, never a bottom bar over the keyboard."
50
+ },
51
+ foldable: {
52
+ formFactor: "foldable",
53
+ token: "--bp-fold 585px",
54
+ label: "585 \xD7 800 \xB7 medium width \xB7 hinge gutter",
55
+ panes: 2,
56
+ nav: "rail",
57
+ drawerAllowed: false,
58
+ hinge: true,
59
+ listFlex: FOLD_LIST_FLEX,
60
+ detailFlex: FOLD_DETAIL_FLEX,
61
+ asideFlex: 0,
62
+ collapseLargeTitle: false,
63
+ halveVerticalPadding: false,
64
+ modal: "fullWidthSheet",
65
+ fab: "floating",
66
+ rule: "Treat the hinge as a hard gutter \u2014 no interactive element straddles it. Support half-opened (tabletop) by keeping controls in the bottom half."
67
+ },
68
+ tablet: {
69
+ formFactor: "tablet",
70
+ token: "--bp-tablet 768px",
71
+ label: "768 \xD7 1024 \xB7 expanded width",
72
+ panes: 2,
73
+ nav: "rail",
74
+ drawerAllowed: true,
75
+ hinge: false,
76
+ listFlex: TABLET_LIST_FLEX,
77
+ detailFlex: TABLET_DETAIL_FLEX,
78
+ asideFlex: 0,
79
+ collapseLargeTitle: false,
80
+ halveVerticalPadding: false,
81
+ modal: "centeredDialog",
82
+ fab: "toolbarButton",
83
+ rule: "List\u2013detail side by side, one selection always visible. Modals become centred dialogs; FAB becomes a toolbar button."
84
+ },
85
+ tabletLarge: {
86
+ formFactor: "tabletLarge",
87
+ token: "--bp-tablet-lg 1024px",
88
+ label: "1024 \xD7 768 \xB7 expanded width",
89
+ panes: 3,
90
+ nav: "rail",
91
+ drawerAllowed: true,
92
+ hinge: false,
93
+ listFlex: TABLET_LIST_FLEX,
94
+ detailFlex: TABLET_DETAIL_FLEX,
95
+ // The spec's Expanded row reads "Two–three" panes; the third pane mirrors
96
+ // the list's weight so the detail stays the widest column.
97
+ asideFlex: TABLET_LIST_FLEX,
98
+ collapseLargeTitle: false,
99
+ halveVerticalPadding: false,
100
+ modal: "centeredDialog",
101
+ fab: "toolbarButton",
102
+ rule: "List\u2013detail(\u2013aside) side by side, one selection always visible. Modals become centred dialogs; FAB becomes a toolbar button."
103
+ }
104
+ };
105
+ function classifyFormFactor({ width, height }) {
106
+ if (height < breakpoints.phone && (width >= breakpoints.phoneLand || width > height)) {
107
+ return "phoneLandscape";
108
+ }
109
+ if (width >= breakpoints.tabletLg) return "tabletLarge";
110
+ if (width >= breakpoints.tablet) return "tablet";
111
+ if (width >= breakpoints.fold) return "foldable";
112
+ return "phone";
113
+ }
114
+ function adaptivePadding(formFactor, screenPad) {
115
+ const { halveVerticalPadding } = FORM_FACTOR_SPECS[formFactor];
116
+ return {
117
+ paddingHorizontal: screenPad,
118
+ paddingVertical: halveVerticalPadding ? screenPad / 2 : screenPad
119
+ };
120
+ }
121
+ function useFormFactor(override) {
122
+ const theme = useLoamTheme("adaptive");
123
+ const { width, height } = useWindowDimensions();
124
+ const formFactor = override ?? classifyFormFactor({ width, height });
125
+ const spec = FORM_FACTOR_SPECS[formFactor];
126
+ const padding = adaptivePadding(formFactor, theme.layout.screenPad);
127
+ return {
128
+ ...spec,
129
+ ...padding,
130
+ width,
131
+ height,
132
+ isLandscape: width > height,
133
+ isCompactHeight: height < breakpoints.phone,
134
+ reachZoneY: height * theme.layout.reachZone,
135
+ readingMeasure: theme.type.body.fontSize * 0.5 * theme.measure.base
136
+ };
137
+ }
138
+
139
+ export { FORM_FACTORS, FORM_FACTOR_SPECS, adaptivePadding, classifyFormFactor, useFormFactor };