@nori-ui/core 1.9.1 → 1.9.2

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 (267) hide show
  1. package/dist/{chunk-O6M3F7BZ.js → chunk-34TKMNID.js} +5 -5
  2. package/dist/{chunk-O6M3F7BZ.js.map → chunk-34TKMNID.js.map} +1 -1
  3. package/dist/{chunk-KLK7OMFT.js → chunk-35DVHUUE.js} +3 -3
  4. package/dist/{chunk-KLK7OMFT.js.map → chunk-35DVHUUE.js.map} +1 -1
  5. package/dist/{chunk-M4BI63P6.js → chunk-3FRCTNQH.js} +3 -3
  6. package/dist/{chunk-M4BI63P6.js.map → chunk-3FRCTNQH.js.map} +1 -1
  7. package/dist/{chunk-3CEJ5TB4.js → chunk-3H7LF45D.js} +4 -4
  8. package/dist/{chunk-3CEJ5TB4.js.map → chunk-3H7LF45D.js.map} +1 -1
  9. package/dist/{chunk-PJTCO76H.js → chunk-3KK2TXVY.js} +4 -4
  10. package/dist/{chunk-PJTCO76H.js.map → chunk-3KK2TXVY.js.map} +1 -1
  11. package/dist/{chunk-QB6RH6UU.js → chunk-3QQXYL5L.js} +4 -4
  12. package/dist/{chunk-QB6RH6UU.js.map → chunk-3QQXYL5L.js.map} +1 -1
  13. package/dist/{chunk-OELY6K44.js → chunk-3RNRVMNS.js} +3 -3
  14. package/dist/{chunk-OELY6K44.js.map → chunk-3RNRVMNS.js.map} +1 -1
  15. package/dist/{chunk-R5JMDDCB.js → chunk-3W2O4OBL.js} +4 -2
  16. package/dist/chunk-3W2O4OBL.js.map +1 -0
  17. package/dist/{chunk-MDOZGILD.js → chunk-4NBJW2JZ.js} +3 -3
  18. package/dist/{chunk-MDOZGILD.js.map → chunk-4NBJW2JZ.js.map} +1 -1
  19. package/dist/{chunk-ZGFXKYA5.js → chunk-57AVXG7D.js} +3 -3
  20. package/dist/{chunk-ZGFXKYA5.js.map → chunk-57AVXG7D.js.map} +1 -1
  21. package/dist/{chunk-HXCETKCC.js → chunk-7TESZOYQ.js} +3 -3
  22. package/dist/{chunk-HXCETKCC.js.map → chunk-7TESZOYQ.js.map} +1 -1
  23. package/dist/{chunk-TSWPHJIU.js → chunk-7UTQKMTE.js} +4 -4
  24. package/dist/{chunk-TSWPHJIU.js.map → chunk-7UTQKMTE.js.map} +1 -1
  25. package/dist/{chunk-U2ZKY2CP.js → chunk-AUNLIED3.js} +3 -3
  26. package/dist/{chunk-U2ZKY2CP.js.map → chunk-AUNLIED3.js.map} +1 -1
  27. package/dist/{chunk-J5LK2XHE.js → chunk-BBPKG3NI.js} +3 -3
  28. package/dist/{chunk-J5LK2XHE.js.map → chunk-BBPKG3NI.js.map} +1 -1
  29. package/dist/{chunk-IGBXSBF7.js → chunk-BCOXHHHC.js} +3 -3
  30. package/dist/{chunk-IGBXSBF7.js.map → chunk-BCOXHHHC.js.map} +1 -1
  31. package/dist/{chunk-L6VYDM7S.js → chunk-BJARVBFN.js} +3 -3
  32. package/dist/{chunk-L6VYDM7S.js.map → chunk-BJARVBFN.js.map} +1 -1
  33. package/dist/{chunk-BVLOX4A3.js → chunk-BJHMAGOQ.js} +3 -3
  34. package/dist/{chunk-BVLOX4A3.js.map → chunk-BJHMAGOQ.js.map} +1 -1
  35. package/dist/{chunk-VOF3S5I4.js → chunk-BOHLDAMY.js} +4 -4
  36. package/dist/{chunk-VOF3S5I4.js.map → chunk-BOHLDAMY.js.map} +1 -1
  37. package/dist/{chunk-3W3XYULK.js → chunk-C4HP2D46.js} +4 -4
  38. package/dist/{chunk-3W3XYULK.js.map → chunk-C4HP2D46.js.map} +1 -1
  39. package/dist/{chunk-C5HQPXRI.js → chunk-CMA3ZFCG.js} +4 -4
  40. package/dist/{chunk-C5HQPXRI.js.map → chunk-CMA3ZFCG.js.map} +1 -1
  41. package/dist/{chunk-EN4CLDGZ.js → chunk-D4J24WDF.js} +3 -3
  42. package/dist/{chunk-EN4CLDGZ.js.map → chunk-D4J24WDF.js.map} +1 -1
  43. package/dist/{chunk-MOAIQHR7.js → chunk-DJ3XX3CV.js} +3 -3
  44. package/dist/{chunk-MOAIQHR7.js.map → chunk-DJ3XX3CV.js.map} +1 -1
  45. package/dist/{chunk-IIVTPN62.js → chunk-DVO556JH.js} +3 -3
  46. package/dist/{chunk-IIVTPN62.js.map → chunk-DVO556JH.js.map} +1 -1
  47. package/dist/{chunk-2XJCLPNH.js → chunk-EC5TKCWA.js} +3 -3
  48. package/dist/{chunk-2XJCLPNH.js.map → chunk-EC5TKCWA.js.map} +1 -1
  49. package/dist/{chunk-VLZANXRZ.js → chunk-EMU3GXKM.js} +3 -3
  50. package/dist/{chunk-VLZANXRZ.js.map → chunk-EMU3GXKM.js.map} +1 -1
  51. package/dist/{chunk-F5UKI7XD.js → chunk-ENPBMEUW.js} +3 -3
  52. package/dist/{chunk-F5UKI7XD.js.map → chunk-ENPBMEUW.js.map} +1 -1
  53. package/dist/{chunk-V75O7QQO.js → chunk-FQDCPWLX.js} +3 -3
  54. package/dist/{chunk-V75O7QQO.js.map → chunk-FQDCPWLX.js.map} +1 -1
  55. package/dist/{chunk-3B345SQU.js → chunk-FRL5SLFT.js} +4 -4
  56. package/dist/{chunk-3B345SQU.js.map → chunk-FRL5SLFT.js.map} +1 -1
  57. package/dist/{chunk-5YHT252H.js → chunk-GTDDUPTE.js} +3 -3
  58. package/dist/{chunk-5YHT252H.js.map → chunk-GTDDUPTE.js.map} +1 -1
  59. package/dist/{chunk-OIHX5B4R.js → chunk-GYFX2I6B.js} +3 -3
  60. package/dist/{chunk-OIHX5B4R.js.map → chunk-GYFX2I6B.js.map} +1 -1
  61. package/dist/{chunk-PQW5LKAI.js → chunk-J2FSGJ2P.js} +3 -3
  62. package/dist/{chunk-PQW5LKAI.js.map → chunk-J2FSGJ2P.js.map} +1 -1
  63. package/dist/{chunk-C32XGHWO.js → chunk-KE2TP5XZ.js} +3 -3
  64. package/dist/{chunk-C32XGHWO.js.map → chunk-KE2TP5XZ.js.map} +1 -1
  65. package/dist/{chunk-USFXANEU.js → chunk-LWW3FJHF.js} +3 -3
  66. package/dist/{chunk-USFXANEU.js.map → chunk-LWW3FJHF.js.map} +1 -1
  67. package/dist/{chunk-3IIIHZHT.js → chunk-MQZXQOGY.js} +3 -3
  68. package/dist/{chunk-3IIIHZHT.js.map → chunk-MQZXQOGY.js.map} +1 -1
  69. package/dist/{chunk-BOMPFNM4.js → chunk-NSLVUCYP.js} +3 -3
  70. package/dist/{chunk-BOMPFNM4.js.map → chunk-NSLVUCYP.js.map} +1 -1
  71. package/dist/{chunk-7Z4NMNX6.js → chunk-O656K7OS.js} +3 -3
  72. package/dist/{chunk-7Z4NMNX6.js.map → chunk-O656K7OS.js.map} +1 -1
  73. package/dist/{chunk-S763GTIZ.js → chunk-PCUWBRNT.js} +3 -3
  74. package/dist/{chunk-S763GTIZ.js.map → chunk-PCUWBRNT.js.map} +1 -1
  75. package/dist/{chunk-MK57AOTI.js → chunk-QNYGQYAO.js} +5 -5
  76. package/dist/{chunk-MK57AOTI.js.map → chunk-QNYGQYAO.js.map} +1 -1
  77. package/dist/{chunk-UKDDK42K.js → chunk-QOVLTVJN.js} +3 -3
  78. package/dist/{chunk-UKDDK42K.js.map → chunk-QOVLTVJN.js.map} +1 -1
  79. package/dist/{chunk-PJXVLE24.js → chunk-QYA7HYFI.js} +5 -5
  80. package/dist/{chunk-PJXVLE24.js.map → chunk-QYA7HYFI.js.map} +1 -1
  81. package/dist/{chunk-SF6WPUC5.js → chunk-QZ6T4R44.js} +3 -3
  82. package/dist/{chunk-SF6WPUC5.js.map → chunk-QZ6T4R44.js.map} +1 -1
  83. package/dist/{chunk-7FSFJA33.js → chunk-SNGWMCZH.js} +3 -3
  84. package/dist/{chunk-7FSFJA33.js.map → chunk-SNGWMCZH.js.map} +1 -1
  85. package/dist/{chunk-XQNVWHMN.js → chunk-UHAI3QOA.js} +3 -3
  86. package/dist/{chunk-XQNVWHMN.js.map → chunk-UHAI3QOA.js.map} +1 -1
  87. package/dist/{chunk-OHWRTHGL.js → chunk-UHHW7GZ4.js} +4 -4
  88. package/dist/{chunk-OHWRTHGL.js.map → chunk-UHHW7GZ4.js.map} +1 -1
  89. package/dist/{chunk-PGYEIXCO.js → chunk-UKYSXWTI.js} +4 -4
  90. package/dist/{chunk-PGYEIXCO.js.map → chunk-UKYSXWTI.js.map} +1 -1
  91. package/dist/{chunk-IWM2XDXH.js → chunk-UPSNKESO.js} +3 -3
  92. package/dist/{chunk-IWM2XDXH.js.map → chunk-UPSNKESO.js.map} +1 -1
  93. package/dist/{chunk-BXZGCOKT.js → chunk-WEHUVESG.js} +4 -4
  94. package/dist/{chunk-BXZGCOKT.js.map → chunk-WEHUVESG.js.map} +1 -1
  95. package/dist/{chunk-ISCJST4P.js → chunk-WFR55YKL.js} +3 -3
  96. package/dist/{chunk-ISCJST4P.js.map → chunk-WFR55YKL.js.map} +1 -1
  97. package/dist/{chunk-MYBBBLYE.js → chunk-WKQUCDGP.js} +3 -3
  98. package/dist/{chunk-MYBBBLYE.js.map → chunk-WKQUCDGP.js.map} +1 -1
  99. package/dist/{chunk-STX5UKYT.js → chunk-XAXIQ55K.js} +3 -3
  100. package/dist/{chunk-STX5UKYT.js.map → chunk-XAXIQ55K.js.map} +1 -1
  101. package/dist/{chunk-H2LHWJ52.js → chunk-YHQFS4ZF.js} +4 -4
  102. package/dist/{chunk-H2LHWJ52.js.map → chunk-YHQFS4ZF.js.map} +1 -1
  103. package/dist/{chunk-VL2WNGPF.js → chunk-YUYYAMLE.js} +3 -3
  104. package/dist/{chunk-VL2WNGPF.js.map → chunk-YUYYAMLE.js.map} +1 -1
  105. package/dist/{chunk-CPIKN4BX.js → chunk-YYVL2FWF.js} +5 -5
  106. package/dist/{chunk-CPIKN4BX.js.map → chunk-YYVL2FWF.js.map} +1 -1
  107. package/dist/client.cjs +7 -5
  108. package/dist/client.cjs.map +1 -1
  109. package/dist/client.js +56 -56
  110. package/dist/components/Accordion/index.cjs +2 -0
  111. package/dist/components/Accordion/index.cjs.map +1 -1
  112. package/dist/components/Accordion/index.js +3 -3
  113. package/dist/components/Alert/index.cjs +2 -0
  114. package/dist/components/Alert/index.cjs.map +1 -1
  115. package/dist/components/Alert/index.js +3 -3
  116. package/dist/components/AlertDialog/index.cjs +2 -0
  117. package/dist/components/AlertDialog/index.cjs.map +1 -1
  118. package/dist/components/AlertDialog/index.js +2 -2
  119. package/dist/components/Avatar/index.cjs +2 -0
  120. package/dist/components/Avatar/index.cjs.map +1 -1
  121. package/dist/components/Avatar/index.js +2 -2
  122. package/dist/components/Badge/index.cjs +2 -0
  123. package/dist/components/Badge/index.cjs.map +1 -1
  124. package/dist/components/Badge/index.js +2 -2
  125. package/dist/components/Box/index.cjs +2 -0
  126. package/dist/components/Box/index.cjs.map +1 -1
  127. package/dist/components/Box/index.js +4 -4
  128. package/dist/components/Breadcrumb/index.cjs +2 -0
  129. package/dist/components/Breadcrumb/index.cjs.map +1 -1
  130. package/dist/components/Breadcrumb/index.js +3 -3
  131. package/dist/components/Button/index.cjs +2 -0
  132. package/dist/components/Button/index.cjs.map +1 -1
  133. package/dist/components/Button/index.js +2 -2
  134. package/dist/components/Calendar/index.cjs +2 -0
  135. package/dist/components/Calendar/index.cjs.map +1 -1
  136. package/dist/components/Calendar/index.js +4 -4
  137. package/dist/components/Card/index.cjs +2 -0
  138. package/dist/components/Card/index.cjs.map +1 -1
  139. package/dist/components/Card/index.js +2 -2
  140. package/dist/components/Checkbox/index.cjs +2 -0
  141. package/dist/components/Checkbox/index.cjs.map +1 -1
  142. package/dist/components/Checkbox/index.js +3 -3
  143. package/dist/components/Collapsible/index.cjs +2 -0
  144. package/dist/components/Collapsible/index.cjs.map +1 -1
  145. package/dist/components/Collapsible/index.js +2 -2
  146. package/dist/components/Combobox/index.cjs +2 -0
  147. package/dist/components/Combobox/index.cjs.map +1 -1
  148. package/dist/components/Combobox/index.js +4 -4
  149. package/dist/components/Command/index.cjs +2 -0
  150. package/dist/components/Command/index.cjs.map +1 -1
  151. package/dist/components/Command/index.js +4 -4
  152. package/dist/components/ContextMenu/index.cjs +3 -1
  153. package/dist/components/ContextMenu/index.cjs.map +1 -1
  154. package/dist/components/ContextMenu/index.js +4 -4
  155. package/dist/components/DataTable/index.cjs +2 -0
  156. package/dist/components/DataTable/index.cjs.map +1 -1
  157. package/dist/components/DataTable/index.js +3 -3
  158. package/dist/components/DatePicker/index.cjs +2 -0
  159. package/dist/components/DatePicker/index.cjs.map +1 -1
  160. package/dist/components/DatePicker/index.js +6 -6
  161. package/dist/components/Dialog/index.cjs +2 -0
  162. package/dist/components/Dialog/index.cjs.map +1 -1
  163. package/dist/components/Dialog/index.js +3 -3
  164. package/dist/components/DropdownMenu/index.cjs +3 -1
  165. package/dist/components/DropdownMenu/index.cjs.map +1 -1
  166. package/dist/components/DropdownMenu/index.js +3 -3
  167. package/dist/components/Empty/index.cjs +2 -0
  168. package/dist/components/Empty/index.cjs.map +1 -1
  169. package/dist/components/Empty/index.js +2 -2
  170. package/dist/components/Field/index.cjs +4 -2
  171. package/dist/components/Field/index.cjs.map +1 -1
  172. package/dist/components/Field/index.js +2 -2
  173. package/dist/components/FloatButton/index.cjs +2 -0
  174. package/dist/components/FloatButton/index.cjs.map +1 -1
  175. package/dist/components/FloatButton/index.js +4 -4
  176. package/dist/components/HStack/index.cjs +2 -0
  177. package/dist/components/HStack/index.cjs.map +1 -1
  178. package/dist/components/HStack/index.js +4 -4
  179. package/dist/components/HoverCard/index.cjs +2 -0
  180. package/dist/components/HoverCard/index.cjs.map +1 -1
  181. package/dist/components/HoverCard/index.js +3 -3
  182. package/dist/components/InputGroup/index.cjs +3 -1
  183. package/dist/components/InputGroup/index.cjs.map +1 -1
  184. package/dist/components/InputGroup/index.js +2 -2
  185. package/dist/components/InputOTP/index.cjs +2 -0
  186. package/dist/components/InputOTP/index.cjs.map +1 -1
  187. package/dist/components/InputOTP/index.js +2 -2
  188. package/dist/components/Item/index.cjs +2 -0
  189. package/dist/components/Item/index.cjs.map +1 -1
  190. package/dist/components/Item/index.js +2 -2
  191. package/dist/components/Kbd/index.cjs +2 -0
  192. package/dist/components/Kbd/index.cjs.map +1 -1
  193. package/dist/components/Kbd/index.js +2 -2
  194. package/dist/components/Label/index.cjs +3 -1
  195. package/dist/components/Label/index.cjs.map +1 -1
  196. package/dist/components/Label/index.js +2 -2
  197. package/dist/components/Pagination/index.cjs +2 -0
  198. package/dist/components/Pagination/index.cjs.map +1 -1
  199. package/dist/components/Pagination/index.js +4 -4
  200. package/dist/components/Popover/index.cjs +2 -0
  201. package/dist/components/Popover/index.cjs.map +1 -1
  202. package/dist/components/Popover/index.js +2 -2
  203. package/dist/components/Progress/index.cjs +2 -0
  204. package/dist/components/Progress/index.cjs.map +1 -1
  205. package/dist/components/Progress/index.js +2 -2
  206. package/dist/components/Radio/index.cjs +2 -0
  207. package/dist/components/Radio/index.cjs.map +1 -1
  208. package/dist/components/Radio/index.js +2 -2
  209. package/dist/components/SegmentedControl/index.cjs +2 -0
  210. package/dist/components/SegmentedControl/index.cjs.map +1 -1
  211. package/dist/components/SegmentedControl/index.js +2 -2
  212. package/dist/components/Select/index.cjs +2 -0
  213. package/dist/components/Select/index.cjs.map +1 -1
  214. package/dist/components/Select/index.js +3 -3
  215. package/dist/components/Separator/index.cjs +2 -0
  216. package/dist/components/Separator/index.cjs.map +1 -1
  217. package/dist/components/Separator/index.js +2 -2
  218. package/dist/components/Sheet/index.cjs +2 -0
  219. package/dist/components/Sheet/index.cjs.map +1 -1
  220. package/dist/components/Sheet/index.js +2 -2
  221. package/dist/components/Sidebar/index.cjs +2 -0
  222. package/dist/components/Sidebar/index.cjs.map +1 -1
  223. package/dist/components/Sidebar/index.js +2 -2
  224. package/dist/components/Skeleton/index.cjs +2 -0
  225. package/dist/components/Skeleton/index.cjs.map +1 -1
  226. package/dist/components/Skeleton/index.js +2 -2
  227. package/dist/components/Slider/index.cjs +2 -0
  228. package/dist/components/Slider/index.cjs.map +1 -1
  229. package/dist/components/Slider/index.js +2 -2
  230. package/dist/components/Switch/index.cjs +2 -0
  231. package/dist/components/Switch/index.cjs.map +1 -1
  232. package/dist/components/Switch/index.js +2 -2
  233. package/dist/components/Table/index.cjs +2 -0
  234. package/dist/components/Table/index.cjs.map +1 -1
  235. package/dist/components/Table/index.js +2 -2
  236. package/dist/components/Tabs/index.cjs +2 -0
  237. package/dist/components/Tabs/index.cjs.map +1 -1
  238. package/dist/components/Tabs/index.js +2 -2
  239. package/dist/components/Text/index.cjs +2 -0
  240. package/dist/components/Text/index.cjs.map +1 -1
  241. package/dist/components/Text/index.js +2 -2
  242. package/dist/components/TextArea/index.cjs +2 -0
  243. package/dist/components/TextArea/index.cjs.map +1 -1
  244. package/dist/components/TextArea/index.js +3 -3
  245. package/dist/components/TextInput/index.cjs +2 -0
  246. package/dist/components/TextInput/index.cjs.map +1 -1
  247. package/dist/components/TextInput/index.js +2 -2
  248. package/dist/components/Toggle/index.cjs +2 -0
  249. package/dist/components/Toggle/index.cjs.map +1 -1
  250. package/dist/components/Toggle/index.js +2 -2
  251. package/dist/components/Tooltip/index.cjs +2 -0
  252. package/dist/components/Tooltip/index.cjs.map +1 -1
  253. package/dist/components/Tooltip/index.js +2 -2
  254. package/dist/components/VStack/index.cjs +2 -0
  255. package/dist/components/VStack/index.cjs.map +1 -1
  256. package/dist/components/VStack/index.js +4 -4
  257. package/dist/icons/index.cjs +2 -0
  258. package/dist/icons/index.cjs.map +1 -1
  259. package/dist/icons/index.js +2 -2
  260. package/dist/index.cjs +7 -5
  261. package/dist/index.cjs.map +1 -1
  262. package/dist/index.js +53 -53
  263. package/dist/theme/index.cjs +2 -0
  264. package/dist/theme/index.cjs.map +1 -1
  265. package/dist/theme/index.js +2 -2
  266. package/package.json +1 -1
  267. package/dist/chunk-R5JMDDCB.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Sidebar/Sidebar.tsx"],"names":["RNText"],"mappings":";;;;;;;;AA+CA,IAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAErE,SAAS,kBAAkB,MAAA,EAAqC;AAC5D,EAAA,MAAM,GAAA,GAAM,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAA,EAAI,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,GAAA;AACX;AANS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAmCT,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,eAAA,GAAkB,EAAA;AAUxB,IAAM,8BAAc,MAAA,CAAA,CAAC;AAAA,EACjB,SAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,iBAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,OAAA,GAAU,UAAA;AAAA,EACV,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACJ,CAAA,KAAoB;AAChB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAkB,gBAAgB,CAAA;AAC5D,EAAA,MAAM,eAAe,SAAA,KAAc,MAAA;AACnC,EAAA,MAAM,OAAA,GAAU,eAAgB,SAAA,GAAwB,KAAA;AACxD,EAAA,MAAM,QAAQ,KAAA,EAAM;AACpB,EAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACjB,CAAC,IAAA,KAAkB;AACf,MAAA,IAAI,CAAC,YAAA,EAAc;AACf,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACjB;AACA,MAAA,iBAAA,GAAoB,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,cAAc,iBAAiB;AAAA,GACpC;AAEA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACtC,IAAA,YAAA,CAAa,CAAC,OAAO,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,OAAA,EAAS,YAAY,CAAC,CAAA;AAE1B,EAAA,MAAM,QAAA,GAAgC;AAAA,IAClC,SAAA,EAAW,OAAA;AAAA,IACX,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,MAAM,KAAA,GAAQ,UAAU,eAAA,GAAkB,cAAA;AAE1C,EAAA,MAAM,cAAA,GACF,QAAA,CAAS,EAAA,KAAO,KAAA,GACT;AAAA,IACG,QAAA,EAAU,OAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,MAAA,EAAQ,CAAA;AAAA,IACR,CAAC,IAAI,GAAG,CAAA;AAAA,IACR,KAAA;AAAA,IACA,kBAAA,EAAoB,OAAA;AAAA,IACpB,kBAAA,EAAoB,OAAA;AAAA,IACpB,wBAAA,EAA0B,+BAAA;AAAA,IAC1B,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACZ,GACA;AAAA,IACI,KAAA;AAAA,IACA,aAAA,EAAe,QAAA;AAAA,IACf,QAAA,EAAU;AAAA,GACd;AAEV,EAAA,MAAM,YAAA,GACF,QAAA,CAAS,EAAA,KAAO,KAAA,GACV,YAAY,UAAA,GACP;AAAA,IACG,MAAA,EAAQ,CAAA;AAAA,IACR,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,GAAA,EAAK,CAAA;AAAA,IACL,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACZ,GACA,YAAY,OAAA,GACT;AAAA,IACG,SAAA,EAAW;AAAA,GACf,GACA,EAAC,GACP,EAAC;AAEX,EAAA,MAAM,SAAA,GAAuB;AAAA,IACzB,GAAG,cAAA;AAAA,IACH,GAAG,YAAA;AAAA,IACH,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,QAAA;AAAA,IAC5C,gBAAA,EAAkB,OAAA,KAAY,UAAA,GAAa,CAAA,GAAI,CAAA;AAAA,IAC/C,gBAAA,EAAkB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,GAC7C;AAEA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,uBACI,GAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAO,QAAA,EAC5B,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,EAAA,EAAI,KAAA;AAAA,QACJ,YAAA,EAAW,SAAA;AAAA,QACX,gBAAA,EAAgB,OAAA;AAAA,QAChB,WAAA,EAAW,IAAA;AAAA,QACX,cAAA,EAAc,OAAA;AAAA,QACd,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA;AAAA,UACP,4EAAA;AAAA,UACA;AAAA,SACJ;AAAA,QACA,KAAA,EAAO,SAAA;AAAA,QAEN;AAAA;AAAA,KACL,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,2BACK,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,UAC5B,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,SAAA,EAAW,QAAgB,iBAAA,EAAkB,MAAA,EAAO,kBAAA,EAAmB,SAAA,EAC/E,UACL,CAAA,EACJ,CAAA;AAER,CAAA,EAnHoB,aAAA,CAAA;AAmIpB,IAAM,gCAAgB,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAA0B;AAC3E,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,KAAA,GAAmB;AAAA,IACrB,OAAA,EAAS,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC/B,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,OAAA;AAAA,IAC1C,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC3B,QAAA,EAAU;AAAA,GACd;AACA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,uBACI,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,QAC9C,KAAA;AAAA,QAEC;AAAA;AAAA,KACL;AAAA,EAER;AACA,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAc,MAAA,EACf,QAAA,EACL,CAAA;AAER,CAAA,EA3BsB,eAAA,CAAA;AA0CtB,IAAM,iCAAiB,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAA2B;AAC7E,EAAA,MAAM,KAAA,GAAmB,EAAE,IAAA,EAAM,CAAA,EAAG,UAAU,QAAA,EAAS;AACvD,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,uBACI,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA;AAAA,QAC/C,OAAO,EAAE,IAAA,EAAM,GAAG,SAAA,EAAW,MAAA,EAAQ,WAAW,QAAA,EAAS;AAAA,QAExD;AAAA;AAAA,KACL;AAAA,EAER;AACA,EAAA,uBACI,GAAA,CAAC,cAAW,KAAA,EAAc,MAAA,EAAgB,uBAAuB,EAAE,QAAA,EAAU,CAAA,EAAE,EAC1E,QAAA,EACL,CAAA;AAER,CAAA,EAlBuB,gBAAA,CAAA;AAiCvB,IAAM,gCAAgB,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAA0B;AAC3E,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,KAAA,GAAmB;AAAA,IACrB,OAAA,EAAS,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC/B,cAAA,EAAgB,CAAA;AAAA,IAChB,cAAA,EAAgB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,OAAA;AAAA,IACvC,QAAA,EAAU;AAAA,GACd;AACA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,uBACI,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,QAC9C,KAAA;AAAA,QAEC;AAAA;AAAA,KACL;AAAA,EAER;AACA,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAc,MAAA,EACf,QAAA,EACL,CAAA;AAER,CAAA,EAxBsB,eAAA,CAAA;AAuCtB,IAAM,+BAAe,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAAyB;AACzE,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,KAAA,GAAmB;AAAA,IACrB,UAAA,EAAY,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAClC,aAAA,EAAe,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC;AAAA,GACzC;AACA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,uBACI,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA;AAAA,QAC7C,KAAA;AAAA,QAEC;AAAA;AAAA,KACL;AAAA,EAER;AACA,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAc,MAAA,EACf,QAAA,EACL,CAAA;AAER,CAAA,EAtBqB,cAAA,CAAA;AAqCrB,IAAM,oCAAoB,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAA8B;AACnF,EAAA,MAAM,GAAA,GAAM,kBAAkB,oBAAoB,CAAA;AAClD,EAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,EAAA,IAAI,IAAI,SAAA,EAAW;AACf,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,KAAA,GAAmB;AAAA,IACrB,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACzC,eAAA,EAAiB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC;AAAA,GAC3C;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IACd,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAe,GAAA;AAAA,IACf,aAAA,EAAe,WAAA;AAAA,IACf,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK;AAAA,GAChC;AAEA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,uBACI,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,QACnD,KAAA;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,SAAA,EAAmC,QAAA,EAAS;AAAA;AAAA,KAC7D;AAAA,EAER;AAEA,EAAA,uBACI,GAAA,CAAC,QAAK,KAAA,EAAc,MAAA,EAChB,8BAACA,IAAA,EAAA,EAAO,KAAA,EAAO,SAAA,EAAY,QAAA,EAAS,CAAA,EACxC,CAAA;AAER,CAAA,EAtC0B,mBAAA,CAAA;AAqD1B,IAAM,8BAAc,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAAwB;AACvE,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,KAAA,GAAmB;AAAA,IACrB,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACzC,GAAA,EAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC;AAAA,GAC/B;AACA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,uBACI,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,SAAS,CAAA;AAAA,QAC5C,KAAA,EACI;AAAA,UACI,GAAI,KAAA;AAAA,UACJ,SAAA,EAAW,MAAA;AAAA,UACX,MAAA,EAAQ,CAAA;AAAA,UACR,OAAA,EAAS,CAAA,EAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAA;AAAA,SACrC;AAAA,QAGH;AAAA;AAAA,KACL;AAAA,EAER;AACA,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAc,MAAA,EACf,QAAA,EACL,CAAA;AAER,CAAA,EA7BoB,aAAA,CAAA;AAwDpB,IAAM,kCAAkB,MAAA,CAAA,CAAC;AAAA,EACrB,IAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA,EACX,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACJ,CAAA,KAA4B;AACxB,EAAA,MAAM,GAAA,GAAM,kBAAkB,kBAAkB,CAAA;AAChD,EAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,EAAA,MAAM,SAAA,GAAuB;AAAA,IACzB,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IACjC,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACzC,eAAA,EAAiB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACvC,GAAA,EAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC3B,OAAA,EAAS,WAAW,GAAA,GAAM,CAAA;AAAA,IAC1B,GAAI,GAAA,CAAI,SAAA,GAAY,EAAE,gBAAgB,QAAA,EAAU,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA,KAAM;AAAC,GACpG;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,OAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAE3D,EAAA,MAAM,cAAA,GAAiB;AAAA,IACnB,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,SAAU,KAAA,GAAmB,KAAA;AAAA,IACzC,KAAA,EAAO,SAAS,MAAA,CAAO,QAAA,CAAS,KAAK,OAAA,GAAU,MAAA,CAAO,SAAS,IAAA,CAAK,KAAA;AAAA,IACpE,IAAA,EAAM;AAAA,GACV;AAEA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,2BACK,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,SAAA,EAAW,QAAO,EAC3B,QAAA,kBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,aAAA,EAAa,MAAA;AAAA,QACb,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,QAChC,eAAA,EAAe,QAAA;AAAA,QACf,KAAA,EAAO,GAAA,CAAI,SAAA,IAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAAA,QAC9C,QAAA;AAAA,QACA,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,QAChC,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,SAAS,CAAA;AAAA,QACjD,KAAA,EACI;AAAA,UACI,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,UACvB,KAAA,EAAO,MAAA;AAAA,UACP,SAAA,EAAW,MAAA;AAAA,UACX,MAAA,EAAQ,MAAA;AAAA,UACR,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,UACnC,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,UAC5B,SAAS,GAAA,CAAI,SAAA,GACP,GAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAA,CAAA,GACtB,CAAA,EAAG,MAAA,CAAO,QAAQ,GAAG,CAAC,MAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,UACrD,cAAA,EAAgB,GAAA,CAAI,SAAA,GAAY,QAAA,GAAW,YAAA;AAAA,UAC3C,UAAA,EAAY,MAAA,GAAS,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAA,GAAO,aAAA;AAAA,UACvC,OAAA,EAAS,WAAW,GAAA,GAAM;AAAA,SAC9B;AAAA,QAGH,QAAA,EAAA;AAAA,UAAA,IAAA,wBACI,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,aAAA,EAAY,QACrD,QAAA,EAAA,IAAA,EACL,CAAA;AAAA,UAEH,CAAC,IAAI,SAAA,oBACF,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACG,KAAA,EAAO;AAAA,gBACH,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,SAAS,GAAA,GAAM,GAAA;AAAA,gBAC3B,KAAA,EAAO,SAAS,MAAA,CAAO,QAAA,CAAS,KAAK,OAAA,GAAU,MAAA,CAAO,SAAS,IAAA,CAAK,KAAA;AAAA,gBACpE,IAAA,EAAM,CAAA;AAAA,gBACN,QAAA,EAAU,QAAA;AAAA,gBACV,UAAA,EAAY,QAAA;AAAA,gBACZ,YAAA,EAAc;AAAA,eAClB;AAAA,cAEC;AAAA;AAAA;AACL;AAAA;AAAA,KAER,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,uBACI,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,MAAA;AAAA,MACA,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,QAAA;AAAA,MACA,iBAAA,EAAkB,UAAA;AAAA,MAClB,kBAAA,EAAoB,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS;AAAA,MACjD,KAAA,EAAO,CAAC,EAAE,OAAA,EAAQ,KAA4B;AAAA,QAC1C,SAAA;AAAA,QACA,SAAS,EAAE,eAAA,EAAiB,GAAG,QAAQ,CAAA,EAAA,CAAA,KAAS,EAAC;AAAA,QACjD,OAAA,IAAW,EAAE,OAAA,EAAS,GAAA;AAAI,OAC9B;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQ,GAAA,CAAC,QAAM,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QACpB,CAAC,IAAI,SAAA,oBACF,GAAA,CAACA,QAAO,KAAA,EAAO,cAAA,EAAgB,aAAA,EAAe,CAAA,EACzC,QAAA,EACL;AAAA;AAAA;AAAA,GAER;AAER,CAAA,EA9GwB,iBAAA,CAAA;AAgJjB,IAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa;AAAA,EAC9C,MAAA,EAAQ,aAAA;AAAA,EACR,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ,aAAA;AAAA,EACR,KAAA,EAAO,YAAA;AAAA,EACP,UAAA,EAAY,iBAAA;AAAA,EACZ,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU;AACd,CAAC","file":"chunk-S763GTIZ.js","sourcesContent":["'use client';\n\n/**\n * Sidebar — collapsible side-panel navigation (compound component).\n *\n * Anatomy:\n * Sidebar Root — owns collapsed state and provides context.\n * Sidebar.Header Top area of the panel (logo, workspace switcher, etc.).\n * Sidebar.Content Scrollable middle zone containing Groups.\n * Sidebar.Footer Pinned bottom area (user row, logout, etc.).\n * Sidebar.Group Logical section inside Content.\n * Sidebar.GroupLabel Section heading text.\n * Sidebar.Menu Ordered list of navigation items.\n * Sidebar.MenuItem Single tappable/clickable nav entry with optional icon.\n *\n * Web behaviour:\n * - Fixed `<aside>` with width transition between collapsed and expanded.\n * - When collapsed, text labels are hidden; only icons are shown.\n * - Collapsed label surfaced via `title` attribute (native browser tooltip on web).\n *\n * Native behaviour (v1):\n * - Always-visible View. Slide-in drawer is a v2 follow-up.\n * - No collapse — the panel is always expanded on native v1.\n *\n * Accessibility:\n * - role=\"navigation\" + aria-label on the <aside>.\n * - Each MenuItem is a button with aria-current=\"page\" when active.\n */\n\nimport { createContext, type ReactNode, useCallback, useContext, useId, useState } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, ScrollView, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype SidebarContextValue = {\n collapsed: boolean;\n setCollapsed: (next: boolean) => void;\n toggleCollapsed: () => void;\n navId: string;\n};\n\nconst SidebarContext = createContext<SidebarContextValue | null>(null);\n\nfunction useSidebarContext(caller: string): SidebarContextValue {\n const ctx = useContext(SidebarContext);\n if (!ctx) {\n throw new Error(`<${caller}> must be rendered inside <Sidebar>.`);\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SidebarVariant = 'standard' | 'inset' | 'floating';\nexport type SidebarSide = 'left' | 'right';\n\nexport type SidebarProps = {\n /** Controlled collapsed state. */\n collapsed?: boolean;\n /** Uncontrolled initial collapsed state. @defaultValue false */\n defaultCollapsed?: boolean;\n /** Fires with the new collapsed state. */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Which edge the panel is attached to. @defaultValue 'left' */\n side?: SidebarSide;\n /** Visual variant. @defaultValue 'standard' */\n variant?: SidebarVariant;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Widths\n// ---------------------------------------------------------------------------\n\nconst EXPANDED_WIDTH = 240;\nconst COLLAPSED_WIDTH = 56;\n\n// ---------------------------------------------------------------------------\n// Root\n// ---------------------------------------------------------------------------\n\n/**\n * Root of the Sidebar compound. Owns collapsed state and provides context\n * to all sub-components.\n */\nconst SidebarRoot = ({\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n side = 'left',\n variant = 'standard',\n children,\n className,\n testID,\n}: SidebarProps) => {\n const [inner, setInner] = useState<boolean>(defaultCollapsed);\n const isControlled = collapsed !== undefined;\n const current = isControlled ? (collapsed as boolean) : inner;\n const navId = useId();\n const colors = useThemeColors();\n\n const setCollapsed = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onCollapsedChange?.(next);\n },\n [isControlled, onCollapsedChange]\n );\n\n const toggleCollapsed = useCallback(() => {\n setCollapsed(!current);\n }, [current, setCollapsed]);\n\n const ctxValue: SidebarContextValue = {\n collapsed: current,\n setCollapsed,\n toggleCollapsed,\n navId,\n };\n\n const width = current ? COLLAPSED_WIDTH : EXPANDED_WIDTH;\n\n const containerStyle: ViewStyle =\n Platform.OS === 'web'\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: 0,\n bottom: 0,\n [side]: 0,\n width,\n transitionProperty: 'width',\n transitionDuration: '200ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n display: 'flex' as unknown as undefined,\n flexDirection: 'column',\n overflow: 'hidden',\n zIndex: 40,\n } as ViewStyle)\n : {\n width,\n flexDirection: 'column',\n overflow: 'hidden',\n };\n\n const variantStyle: ViewStyle =\n Platform.OS === 'web'\n ? variant === 'floating'\n ? ({\n margin: 8,\n borderRadius: colors.radius.lg,\n top: 8,\n bottom: 8,\n height: 'auto' as unknown as undefined,\n } as ViewStyle)\n : variant === 'inset'\n ? ({\n boxShadow: '4px 0 16px rgba(0,0,0,0.08)',\n } as ViewStyle)\n : {}\n : {};\n\n const rootStyle: ViewStyle = {\n ...containerStyle,\n ...variantStyle,\n backgroundColor: colors.semantic.background.elevated,\n borderRightWidth: variant !== 'floating' ? 1 : 0,\n borderRightColor: colors.semantic.border.default,\n };\n\n if (Platform.OS === 'web') {\n return (\n <SidebarContext.Provider value={ctxValue}>\n <nav\n id={navId}\n aria-label=\"Sidebar\"\n data-collapsed={current}\n data-side={side}\n data-variant={variant}\n data-testid={testID}\n className={cn(\n 'nori-sidebar flex flex-col overflow-hidden transition-[width] duration-200',\n className\n )}\n style={rootStyle as React.CSSProperties}\n >\n {children}\n </nav>\n </SidebarContext.Provider>\n );\n }\n\n return (\n <SidebarContext.Provider value={ctxValue}>\n <View style={rootStyle} testID={testID} accessibilityRole=\"menu\" accessibilityLabel=\"Sidebar\">\n {children}\n </View>\n </SidebarContext.Provider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Header\n// ---------------------------------------------------------------------------\n\nexport type SidebarHeaderProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Top section of the sidebar — logos, workspace switchers.\n * Fixed at the top; does not scroll.\n */\nconst SidebarHeader = ({ children, className, testID }: SidebarHeaderProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n padding: px(colors.spacing['4']),\n borderBottomWidth: 1,\n borderBottomColor: colors.semantic.border.default,\n flexDirection: 'row',\n alignItems: 'center',\n gap: px(colors.spacing['2']),\n overflow: 'hidden',\n };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-header', className)}\n style={style as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Content\n// ---------------------------------------------------------------------------\n\nexport type SidebarContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Scrollable middle zone containing Group components.\n */\nconst SidebarContent = ({ children, className, testID }: SidebarContentProps) => {\n const style: ViewStyle = { flex: 1, overflow: 'hidden' };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-content', className)}\n style={{ flex: 1, overflowY: 'auto', overflowX: 'hidden' }}\n >\n {children}\n </div>\n );\n }\n return (\n <ScrollView style={style} testID={testID} contentContainerStyle={{ flexGrow: 1 }}>\n {children}\n </ScrollView>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Footer\n// ---------------------------------------------------------------------------\n\nexport type SidebarFooterProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Pinned bottom area — user row, logout button, etc.\n */\nconst SidebarFooter = ({ children, className, testID }: SidebarFooterProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n padding: px(colors.spacing['4']),\n borderTopWidth: 1,\n borderTopColor: colors.semantic.border.default,\n overflow: 'hidden',\n };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-footer', className)}\n style={style as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Group\n// ---------------------------------------------------------------------------\n\nexport type SidebarGroupProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Logical section within Sidebar.Content — wraps a GroupLabel + Menu.\n */\nconst SidebarGroup = ({ children, className, testID }: SidebarGroupProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n paddingTop: px(colors.spacing['2']),\n paddingBottom: px(colors.spacing['2']),\n };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-group', className)}\n style={style as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// GroupLabel\n// ---------------------------------------------------------------------------\n\nexport type SidebarGroupLabelProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Section heading inside a Group. Hidden when the sidebar is collapsed.\n */\nconst SidebarGroupLabel = ({ children, className, testID }: SidebarGroupLabelProps) => {\n const ctx = useSidebarContext('Sidebar.GroupLabel');\n const colors = useThemeColors();\n\n if (ctx.collapsed) {\n return null;\n }\n\n const style: ViewStyle = {\n paddingHorizontal: px(colors.spacing['4']),\n paddingVertical: px(colors.spacing['1']),\n };\n\n const textStyle = {\n fontSize: 11,\n fontWeight: '600' as const,\n letterSpacing: 0.5,\n textTransform: 'uppercase' as const,\n color: colors.semantic.text.muted,\n };\n\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-group-label', className)}\n style={style as React.CSSProperties}\n >\n <span style={textStyle as React.CSSProperties}>{children}</span>\n </div>\n );\n }\n\n return (\n <View style={style} testID={testID}>\n <RNText style={textStyle}>{children}</RNText>\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Menu\n// ---------------------------------------------------------------------------\n\nexport type SidebarMenuProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Ordered list wrapper for MenuItem components.\n */\nconst SidebarMenu = ({ children, className, testID }: SidebarMenuProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n paddingHorizontal: px(colors.spacing['2']),\n gap: px(colors.spacing['1']),\n };\n if (Platform.OS === 'web') {\n return (\n <ul\n data-testid={testID}\n className={cn('nori-sidebar-menu', className)}\n style={\n {\n ...(style as React.CSSProperties),\n listStyle: 'none',\n margin: 0,\n padding: `0 ${colors.spacing['2']}px`,\n } as React.CSSProperties\n }\n >\n {children}\n </ul>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// MenuItem\n// ---------------------------------------------------------------------------\n\nexport type SidebarMenuItemProps = {\n /** Optional leading icon. Hidden text when collapsed; icon always shown. */\n icon?: ReactNode;\n /** Mark this item as the current page. Adds aria-current=\"page\". @defaultValue false */\n active?: boolean;\n /** Disable the item. @defaultValue false */\n disabled?: boolean;\n /** Press handler. */\n onPress?: () => void;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Single navigation entry.\n *\n * - Shows icon + label when expanded.\n * - Shows icon only when collapsed (web: label surfaced as title tooltip).\n * - aria-current=\"page\" when active.\n */\nconst SidebarMenuItem = ({\n icon,\n active = false,\n disabled = false,\n onPress,\n children,\n className,\n testID,\n}: SidebarMenuItemProps) => {\n const ctx = useSidebarContext('Sidebar.MenuItem');\n const colors = useThemeColors();\n\n const itemStyle: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: px(colors.radius.md),\n paddingHorizontal: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['2']),\n gap: px(colors.spacing['3']),\n opacity: disabled ? 0.5 : 1,\n ...(ctx.collapsed ? { justifyContent: 'center', paddingHorizontal: px(colors.spacing['2']) } : {}),\n };\n\n const activeBg = colors.semantic.interactive.primary;\n const labelStr = typeof children === 'string' ? children : undefined;\n\n const labelTextStyle = {\n fontSize: 14,\n fontWeight: active ? ('600' as const) : ('400' as const),\n color: active ? colors.semantic.text.default : colors.semantic.text.muted,\n flex: 1,\n };\n\n if (Platform.OS === 'web') {\n return (\n <li style={{ listStyle: 'none' }}>\n <button\n type=\"button\"\n data-testid={testID}\n aria-current={active ? 'page' : undefined}\n aria-disabled={disabled}\n title={ctx.collapsed && labelStr ? labelStr : undefined}\n disabled={disabled}\n onClick={disabled ? undefined : onPress}\n className={cn('nori-sidebar-menu-item', className)}\n style={\n {\n display: 'flex',\n alignItems: 'center',\n gap: colors.spacing['3'],\n width: '100%',\n textAlign: 'left',\n border: 'none',\n cursor: disabled ? 'not-allowed' : 'pointer',\n borderRadius: colors.radius.md,\n padding: ctx.collapsed\n ? `${colors.spacing['2']}px`\n : `${colors.spacing['2']}px ${colors.spacing['3']}px`,\n justifyContent: ctx.collapsed ? 'center' : 'flex-start',\n background: active ? `${activeBg}1a` : 'transparent',\n opacity: disabled ? 0.5 : 1,\n } as React.CSSProperties\n }\n >\n {icon && (\n <span className=\"nori-sidebar-menu-item-icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {!ctx.collapsed && (\n <span\n style={{\n fontSize: 14,\n fontWeight: active ? 600 : 400,\n color: active ? colors.semantic.text.default : colors.semantic.text.muted,\n flex: 1,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n }}\n >\n {children}\n </span>\n )}\n </button>\n </li>\n );\n }\n\n return (\n <Pressable\n testID={testID}\n onPress={disabled ? undefined : onPress}\n disabled={disabled}\n accessibilityRole=\"menuitem\"\n accessibilityState={{ selected: active, disabled }}\n style={({ pressed }: { pressed: boolean }) => [\n itemStyle,\n active ? { backgroundColor: `${activeBg}1a` } : {},\n pressed && { opacity: 0.7 },\n ]}\n >\n {icon && <View>{icon}</View>}\n {!ctx.collapsed && (\n <RNText style={labelTextStyle} numberOfLines={1}>\n {children}\n </RNText>\n )}\n </Pressable>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\n/**\n * Collapsible side-panel navigation surface.\n *\n * Web: fixed `<aside>` that transitions width between expanded (240px) and\n * collapsed (56px — icons only).\n *\n * Native v1: always-visible View. Slide-in drawer is a v2 follow-up.\n *\n * ```tsx\n * <Sidebar defaultCollapsed={false}>\n * <Sidebar.Header>\n * <Text>Acme Inc.</Text>\n * </Sidebar.Header>\n * <Sidebar.Content>\n * <Sidebar.Group>\n * <Sidebar.GroupLabel>Main</Sidebar.GroupLabel>\n * <Sidebar.Menu>\n * <Sidebar.MenuItem icon={<HomeIcon />} onPress={goHome}>Home</Sidebar.MenuItem>\n * <Sidebar.MenuItem icon={<UsersIcon />} active>Team</Sidebar.MenuItem>\n * </Sidebar.Menu>\n * </Sidebar.Group>\n * </Sidebar.Content>\n * <Sidebar.Footer>\n * <Button onPress={logout}>Logout</Button>\n * </Sidebar.Footer>\n * </Sidebar>\n * ```\n */\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header: SidebarHeader,\n Content: SidebarContent,\n Footer: SidebarFooter,\n Group: SidebarGroup,\n GroupLabel: SidebarGroupLabel,\n Menu: SidebarMenu,\n MenuItem: SidebarMenuItem,\n});\n\n// Re-export context hook for advanced use (e.g. a custom collapse toggle).\nexport { useSidebarContext };\n\nimport type React from 'react';\n"]}
1
+ {"version":3,"sources":["../src/components/Sidebar/Sidebar.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-PCUWBRNT.js","sourcesContent":["'use client';\n\n/**\n * Sidebar — collapsible side-panel navigation (compound component).\n *\n * Anatomy:\n * Sidebar Root — owns collapsed state and provides context.\n * Sidebar.Header Top area of the panel (logo, workspace switcher, etc.).\n * Sidebar.Content Scrollable middle zone containing Groups.\n * Sidebar.Footer Pinned bottom area (user row, logout, etc.).\n * Sidebar.Group Logical section inside Content.\n * Sidebar.GroupLabel Section heading text.\n * Sidebar.Menu Ordered list of navigation items.\n * Sidebar.MenuItem Single tappable/clickable nav entry with optional icon.\n *\n * Web behaviour:\n * - Fixed `<aside>` with width transition between collapsed and expanded.\n * - When collapsed, text labels are hidden; only icons are shown.\n * - Collapsed label surfaced via `title` attribute (native browser tooltip on web).\n *\n * Native behaviour (v1):\n * - Always-visible View. Slide-in drawer is a v2 follow-up.\n * - No collapse — the panel is always expanded on native v1.\n *\n * Accessibility:\n * - role=\"navigation\" + aria-label on the <aside>.\n * - Each MenuItem is a button with aria-current=\"page\" when active.\n */\n\nimport { createContext, type ReactNode, useCallback, useContext, useId, useState } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, ScrollView, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype SidebarContextValue = {\n collapsed: boolean;\n setCollapsed: (next: boolean) => void;\n toggleCollapsed: () => void;\n navId: string;\n};\n\nconst SidebarContext = createContext<SidebarContextValue | null>(null);\n\nfunction useSidebarContext(caller: string): SidebarContextValue {\n const ctx = useContext(SidebarContext);\n if (!ctx) {\n throw new Error(`<${caller}> must be rendered inside <Sidebar>.`);\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SidebarVariant = 'standard' | 'inset' | 'floating';\nexport type SidebarSide = 'left' | 'right';\n\nexport type SidebarProps = {\n /** Controlled collapsed state. */\n collapsed?: boolean;\n /** Uncontrolled initial collapsed state. @defaultValue false */\n defaultCollapsed?: boolean;\n /** Fires with the new collapsed state. */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Which edge the panel is attached to. @defaultValue 'left' */\n side?: SidebarSide;\n /** Visual variant. @defaultValue 'standard' */\n variant?: SidebarVariant;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Widths\n// ---------------------------------------------------------------------------\n\nconst EXPANDED_WIDTH = 240;\nconst COLLAPSED_WIDTH = 56;\n\n// ---------------------------------------------------------------------------\n// Root\n// ---------------------------------------------------------------------------\n\n/**\n * Root of the Sidebar compound. Owns collapsed state and provides context\n * to all sub-components.\n */\nconst SidebarRoot = ({\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n side = 'left',\n variant = 'standard',\n children,\n className,\n testID,\n}: SidebarProps) => {\n const [inner, setInner] = useState<boolean>(defaultCollapsed);\n const isControlled = collapsed !== undefined;\n const current = isControlled ? (collapsed as boolean) : inner;\n const navId = useId();\n const colors = useThemeColors();\n\n const setCollapsed = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onCollapsedChange?.(next);\n },\n [isControlled, onCollapsedChange]\n );\n\n const toggleCollapsed = useCallback(() => {\n setCollapsed(!current);\n }, [current, setCollapsed]);\n\n const ctxValue: SidebarContextValue = {\n collapsed: current,\n setCollapsed,\n toggleCollapsed,\n navId,\n };\n\n const width = current ? COLLAPSED_WIDTH : EXPANDED_WIDTH;\n\n const containerStyle: ViewStyle =\n Platform.OS === 'web'\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: 0,\n bottom: 0,\n [side]: 0,\n width,\n transitionProperty: 'width',\n transitionDuration: '200ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n display: 'flex' as unknown as undefined,\n flexDirection: 'column',\n overflow: 'hidden',\n zIndex: 40,\n } as ViewStyle)\n : {\n width,\n flexDirection: 'column',\n overflow: 'hidden',\n };\n\n const variantStyle: ViewStyle =\n Platform.OS === 'web'\n ? variant === 'floating'\n ? ({\n margin: 8,\n borderRadius: colors.radius.lg,\n top: 8,\n bottom: 8,\n height: 'auto' as unknown as undefined,\n } as ViewStyle)\n : variant === 'inset'\n ? ({\n boxShadow: '4px 0 16px rgba(0,0,0,0.08)',\n } as ViewStyle)\n : {}\n : {};\n\n const rootStyle: ViewStyle = {\n ...containerStyle,\n ...variantStyle,\n backgroundColor: colors.semantic.background.elevated,\n borderRightWidth: variant !== 'floating' ? 1 : 0,\n borderRightColor: colors.semantic.border.default,\n };\n\n if (Platform.OS === 'web') {\n return (\n <SidebarContext.Provider value={ctxValue}>\n <nav\n id={navId}\n aria-label=\"Sidebar\"\n data-collapsed={current}\n data-side={side}\n data-variant={variant}\n data-testid={testID}\n className={cn(\n 'nori-sidebar flex flex-col overflow-hidden transition-[width] duration-200',\n className\n )}\n style={rootStyle as React.CSSProperties}\n >\n {children}\n </nav>\n </SidebarContext.Provider>\n );\n }\n\n return (\n <SidebarContext.Provider value={ctxValue}>\n <View style={rootStyle} testID={testID} accessibilityRole=\"menu\" accessibilityLabel=\"Sidebar\">\n {children}\n </View>\n </SidebarContext.Provider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Header\n// ---------------------------------------------------------------------------\n\nexport type SidebarHeaderProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Top section of the sidebar — logos, workspace switchers.\n * Fixed at the top; does not scroll.\n */\nconst SidebarHeader = ({ children, className, testID }: SidebarHeaderProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n padding: px(colors.spacing['4']),\n borderBottomWidth: 1,\n borderBottomColor: colors.semantic.border.default,\n flexDirection: 'row',\n alignItems: 'center',\n gap: px(colors.spacing['2']),\n overflow: 'hidden',\n };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-header', className)}\n style={style as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Content\n// ---------------------------------------------------------------------------\n\nexport type SidebarContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Scrollable middle zone containing Group components.\n */\nconst SidebarContent = ({ children, className, testID }: SidebarContentProps) => {\n const style: ViewStyle = { flex: 1, overflow: 'hidden' };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-content', className)}\n style={{ flex: 1, overflowY: 'auto', overflowX: 'hidden' }}\n >\n {children}\n </div>\n );\n }\n return (\n <ScrollView style={style} testID={testID} contentContainerStyle={{ flexGrow: 1 }}>\n {children}\n </ScrollView>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Footer\n// ---------------------------------------------------------------------------\n\nexport type SidebarFooterProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Pinned bottom area — user row, logout button, etc.\n */\nconst SidebarFooter = ({ children, className, testID }: SidebarFooterProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n padding: px(colors.spacing['4']),\n borderTopWidth: 1,\n borderTopColor: colors.semantic.border.default,\n overflow: 'hidden',\n };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-footer', className)}\n style={style as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Group\n// ---------------------------------------------------------------------------\n\nexport type SidebarGroupProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Logical section within Sidebar.Content — wraps a GroupLabel + Menu.\n */\nconst SidebarGroup = ({ children, className, testID }: SidebarGroupProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n paddingTop: px(colors.spacing['2']),\n paddingBottom: px(colors.spacing['2']),\n };\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-group', className)}\n style={style as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// GroupLabel\n// ---------------------------------------------------------------------------\n\nexport type SidebarGroupLabelProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Section heading inside a Group. Hidden when the sidebar is collapsed.\n */\nconst SidebarGroupLabel = ({ children, className, testID }: SidebarGroupLabelProps) => {\n const ctx = useSidebarContext('Sidebar.GroupLabel');\n const colors = useThemeColors();\n\n if (ctx.collapsed) {\n return null;\n }\n\n const style: ViewStyle = {\n paddingHorizontal: px(colors.spacing['4']),\n paddingVertical: px(colors.spacing['1']),\n };\n\n const textStyle = {\n fontSize: 11,\n fontWeight: '600' as const,\n letterSpacing: 0.5,\n textTransform: 'uppercase' as const,\n color: colors.semantic.text.muted,\n };\n\n if (Platform.OS === 'web') {\n return (\n <div\n data-testid={testID}\n className={cn('nori-sidebar-group-label', className)}\n style={style as React.CSSProperties}\n >\n <span style={textStyle as React.CSSProperties}>{children}</span>\n </div>\n );\n }\n\n return (\n <View style={style} testID={testID}>\n <RNText style={textStyle}>{children}</RNText>\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Menu\n// ---------------------------------------------------------------------------\n\nexport type SidebarMenuProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Ordered list wrapper for MenuItem components.\n */\nconst SidebarMenu = ({ children, className, testID }: SidebarMenuProps) => {\n const colors = useThemeColors();\n const style: ViewStyle = {\n paddingHorizontal: px(colors.spacing['2']),\n gap: px(colors.spacing['1']),\n };\n if (Platform.OS === 'web') {\n return (\n <ul\n data-testid={testID}\n className={cn('nori-sidebar-menu', className)}\n style={\n {\n ...(style as React.CSSProperties),\n listStyle: 'none',\n margin: 0,\n padding: `0 ${colors.spacing['2']}px`,\n } as React.CSSProperties\n }\n >\n {children}\n </ul>\n );\n }\n return (\n <View style={style} testID={testID}>\n {children}\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// MenuItem\n// ---------------------------------------------------------------------------\n\nexport type SidebarMenuItemProps = {\n /** Optional leading icon. Hidden text when collapsed; icon always shown. */\n icon?: ReactNode;\n /** Mark this item as the current page. Adds aria-current=\"page\". @defaultValue false */\n active?: boolean;\n /** Disable the item. @defaultValue false */\n disabled?: boolean;\n /** Press handler. */\n onPress?: () => void;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Single navigation entry.\n *\n * - Shows icon + label when expanded.\n * - Shows icon only when collapsed (web: label surfaced as title tooltip).\n * - aria-current=\"page\" when active.\n */\nconst SidebarMenuItem = ({\n icon,\n active = false,\n disabled = false,\n onPress,\n children,\n className,\n testID,\n}: SidebarMenuItemProps) => {\n const ctx = useSidebarContext('Sidebar.MenuItem');\n const colors = useThemeColors();\n\n const itemStyle: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: px(colors.radius.md),\n paddingHorizontal: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['2']),\n gap: px(colors.spacing['3']),\n opacity: disabled ? 0.5 : 1,\n ...(ctx.collapsed ? { justifyContent: 'center', paddingHorizontal: px(colors.spacing['2']) } : {}),\n };\n\n const activeBg = colors.semantic.interactive.primary;\n const labelStr = typeof children === 'string' ? children : undefined;\n\n const labelTextStyle = {\n fontSize: 14,\n fontWeight: active ? ('600' as const) : ('400' as const),\n color: active ? colors.semantic.text.default : colors.semantic.text.muted,\n flex: 1,\n };\n\n if (Platform.OS === 'web') {\n return (\n <li style={{ listStyle: 'none' }}>\n <button\n type=\"button\"\n data-testid={testID}\n aria-current={active ? 'page' : undefined}\n aria-disabled={disabled}\n title={ctx.collapsed && labelStr ? labelStr : undefined}\n disabled={disabled}\n onClick={disabled ? undefined : onPress}\n className={cn('nori-sidebar-menu-item', className)}\n style={\n {\n display: 'flex',\n alignItems: 'center',\n gap: colors.spacing['3'],\n width: '100%',\n textAlign: 'left',\n border: 'none',\n cursor: disabled ? 'not-allowed' : 'pointer',\n borderRadius: colors.radius.md,\n padding: ctx.collapsed\n ? `${colors.spacing['2']}px`\n : `${colors.spacing['2']}px ${colors.spacing['3']}px`,\n justifyContent: ctx.collapsed ? 'center' : 'flex-start',\n background: active ? `${activeBg}1a` : 'transparent',\n opacity: disabled ? 0.5 : 1,\n } as React.CSSProperties\n }\n >\n {icon && (\n <span className=\"nori-sidebar-menu-item-icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {!ctx.collapsed && (\n <span\n style={{\n fontSize: 14,\n fontWeight: active ? 600 : 400,\n color: active ? colors.semantic.text.default : colors.semantic.text.muted,\n flex: 1,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n }}\n >\n {children}\n </span>\n )}\n </button>\n </li>\n );\n }\n\n return (\n <Pressable\n testID={testID}\n onPress={disabled ? undefined : onPress}\n disabled={disabled}\n accessibilityRole=\"menuitem\"\n accessibilityState={{ selected: active, disabled }}\n style={({ pressed }: { pressed: boolean }) => [\n itemStyle,\n active ? { backgroundColor: `${activeBg}1a` } : {},\n pressed && { opacity: 0.7 },\n ]}\n >\n {icon && <View>{icon}</View>}\n {!ctx.collapsed && (\n <RNText style={labelTextStyle} numberOfLines={1}>\n {children}\n </RNText>\n )}\n </Pressable>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\n/**\n * Collapsible side-panel navigation surface.\n *\n * Web: fixed `<aside>` that transitions width between expanded (240px) and\n * collapsed (56px — icons only).\n *\n * Native v1: always-visible View. Slide-in drawer is a v2 follow-up.\n *\n * ```tsx\n * <Sidebar defaultCollapsed={false}>\n * <Sidebar.Header>\n * <Text>Acme Inc.</Text>\n * </Sidebar.Header>\n * <Sidebar.Content>\n * <Sidebar.Group>\n * <Sidebar.GroupLabel>Main</Sidebar.GroupLabel>\n * <Sidebar.Menu>\n * <Sidebar.MenuItem icon={<HomeIcon />} onPress={goHome}>Home</Sidebar.MenuItem>\n * <Sidebar.MenuItem icon={<UsersIcon />} active>Team</Sidebar.MenuItem>\n * </Sidebar.Menu>\n * </Sidebar.Group>\n * </Sidebar.Content>\n * <Sidebar.Footer>\n * <Button onPress={logout}>Logout</Button>\n * </Sidebar.Footer>\n * </Sidebar>\n * ```\n */\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header: SidebarHeader,\n Content: SidebarContent,\n Footer: SidebarFooter,\n Group: SidebarGroup,\n GroupLabel: SidebarGroupLabel,\n Menu: SidebarMenu,\n MenuItem: SidebarMenuItem,\n});\n\n// Re-export context hook for advanced use (e.g. a custom collapse toggle).\nexport { useSidebarContext };\n\nimport type React from 'react';\n"]}
@@ -1,7 +1,7 @@
1
- import { Popover, usePopoverContext } from './chunk-HXCETKCC.js';
1
+ import { Popover, usePopoverContext } from './chunk-7TESZOYQ.js';
2
2
  import { Slot } from './chunk-ZIBNLXIV.js';
3
3
  import { px } from './chunk-5A2QOOVN.js';
4
- import { useThemeColors } from './chunk-R5JMDDCB.js';
4
+ import { useThemeColors } from './chunk-3W2O4OBL.js';
5
5
  import { cn } from './chunk-CHXHRJNZ.js';
6
6
  import { __name } from './chunk-WCQVDF3K.js';
7
7
  import { createContext, useContext, useRef, useEffect, useCallback, useState, isValidElement } from 'react';
@@ -123,7 +123,7 @@ var MenuItem = /* @__PURE__ */ __name(({
123
123
  onSelect?.();
124
124
  menu.close();
125
125
  }, [disabled, onSelect, menu]);
126
- const textColor = destructive ? colors.color.danger : disabled ? colors.semantic.text.muted : colors.semantic.text.default;
126
+ const textColor = destructive ? colors.color.dangerText : disabled ? colors.semantic.text.muted : colors.semantic.text.default;
127
127
  return /* @__PURE__ */ jsxs(
128
128
  Pressable,
129
129
  {
@@ -299,5 +299,5 @@ var DropdownMenu = Object.assign(DropdownMenuRoot, {
299
299
  });
300
300
 
301
301
  export { DropdownMenu, MenuContent, MenuContextProvider, MenuItem, MenuLabel, MenuSeparator };
302
- //# sourceMappingURL=chunk-MK57AOTI.js.map
303
- //# sourceMappingURL=chunk-MK57AOTI.js.map
302
+ //# sourceMappingURL=chunk-QNYGQYAO.js.map
303
+ //# sourceMappingURL=chunk-QNYGQYAO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/DropdownMenu/DropdownMenu.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-MK57AOTI.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Popover, usePopoverContext } from '../Popover/Popover';\n\n// ---------------------------------------------------------------------------\n// Internal menu context — carries open state + toggle/close for sub-components\n// ---------------------------------------------------------------------------\n\ntype MenuContextValue = {\n open: boolean;\n toggle: () => void;\n close: () => void;\n};\n\nconst MenuContext = createContext<MenuContextValue | null>(null);\n\n/**\n * @internal — provides MenuContext; exported so ContextMenu can reuse it\n * without re-implementing the provider.\n */\nexport const MenuContextProvider = ({\n open,\n toggle,\n close,\n children,\n}: {\n open: boolean;\n /** Optional — DropdownMenu passes it; ContextMenu items only need close. */\n toggle?: () => void;\n close: () => void;\n children: ReactNode;\n}) => <MenuContext.Provider value={{ open, toggle: toggle ?? close, close }}>{children}</MenuContext.Provider>;\n\n/** @internal */\nexport function useMenuContext(caller: string): MenuContextValue {\n const ctx = useContext(MenuContext);\n if (!ctx) {\n throw new Error(`<${caller}> must be rendered inside a <DropdownMenu> or <ContextMenu>.`);\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Shared menu surface sub-components\n// ---------------------------------------------------------------------------\n\nexport type MenuContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n side?: 'top' | 'right' | 'bottom' | 'left';\n align?: 'start' | 'center' | 'end';\n 'aria-label'?: string;\n};\n\n/**\n * The floating menu surface. Wraps `Popover.Content` and applies\n * `role=\"menu\"` so assistive tech announces the list of items.\n *\n * Web keyboard navigation:\n * - ArrowDown / ArrowUp — cycle focus between enabled items.\n * - Home / End — jump to first / last enabled item.\n * - Escape — closes the menu (handled by Popover.Content already).\n * - Enter / Space — activates the focused item.\n */\nexport const MenuContent = ({\n children,\n className,\n testID,\n side = 'bottom',\n align = 'start',\n 'aria-label': ariaLabel,\n}: MenuContentProps) => {\n const colors = useThemeColors();\n const containerRef = useRef<View | null>(null);\n\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n const container = containerRef.current as unknown as HTMLElement | null;\n if (!container) {\n return;\n }\n\n const getItems = (): HTMLElement[] =>\n Array.from(container.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])'));\n\n const onKeyDown = (e: KeyboardEvent) => {\n const items = getItems();\n if (items.length === 0) {\n return;\n }\n const focused = document.activeElement as HTMLElement | null;\n const idx = focused ? items.indexOf(focused) : -1;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n items[idx < items.length - 1 ? idx + 1 : 0]?.focus();\n break;\n case 'ArrowUp':\n e.preventDefault();\n items[idx > 0 ? idx - 1 : items.length - 1]?.focus();\n break;\n case 'Home':\n e.preventDefault();\n items[0]?.focus();\n break;\n case 'End':\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n default:\n break;\n }\n };\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n });\n\n return (\n <Popover.Content\n side={side}\n align={align}\n {...(testID !== undefined ? { testID } : {})}\n {...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n <View\n ref={containerRef}\n {...({\n role: 'menu',\n ...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {}),\n } as Record<string, unknown>)}\n style={{\n minWidth: 160,\n paddingVertical: px(colors.spacing['1']),\n margin: -px(colors.spacing['4']),\n borderRadius: px(colors.radius.lg),\n overflow: 'hidden',\n }}\n >\n {children}\n </View>\n </Popover.Content>\n );\n};\nMenuContent.displayName = 'MenuContent';\n\n// ---- MenuItem --------------------------------------------------------------\n\nexport type MenuItemProps = {\n /** Fired when the item is selected. Also closes the menu. */\n onSelect?: () => void;\n /** Prevents interaction and dims the item visually. */\n disabled?: boolean;\n /** Renders the item in a danger/destructive tone. */\n destructive?: boolean;\n /** Leading icon node. */\n icon?: ReactNode;\n /**\n * Keyboard shortcut hint shown on the trailing edge.\n * Purely presentational — web only, no function key binding.\n */\n shortcut?: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport const MenuItem = ({\n onSelect,\n disabled = false,\n destructive = false,\n icon,\n shortcut,\n children,\n className,\n testID,\n}: MenuItemProps) => {\n const colors = useThemeColors();\n const menu = useMenuContext('MenuItem');\n\n const handlePress = useCallback(() => {\n if (disabled) {\n return;\n }\n onSelect?.();\n menu.close();\n }, [disabled, onSelect, menu]);\n\n const textColor = destructive\n ? colors.color.danger\n : disabled\n ? colors.semantic.text.muted\n : colors.semantic.text.default;\n\n return (\n <Pressable\n onPress={handlePress}\n disabled={disabled}\n {...({\n role: 'menuitem',\n 'aria-disabled': disabled ? 'true' : undefined,\n tabIndex: disabled ? -1 : 0,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handlePress();\n }\n },\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-row items-center gap-2 px-3 py-2', className)}\n style={{ opacity: disabled ? 0.4 : 1 }}\n accessibilityRole=\"menuitem\"\n accessibilityState={{ disabled }}\n >\n {icon !== undefined && (\n <View style={{ width: 16, height: 16, alignItems: 'center', justifyContent: 'center' }}>{icon}</View>\n )}\n <RNText\n style={{\n flex: 1,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: textColor,\n }}\n >\n {children}\n </RNText>\n {shortcut !== undefined && Platform.OS === 'web' && (\n <RNText\n {...({ 'aria-hidden': 'true' } as Record<string, unknown>)}\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n color: colors.semantic.text.muted,\n }}\n >\n {shortcut}\n </RNText>\n )}\n </Pressable>\n );\n};\nMenuItem.displayName = 'MenuItem';\n\n// ---- MenuSeparator ---------------------------------------------------------\n\nexport type MenuSeparatorProps = {\n className?: string;\n testID?: string;\n};\n\nexport const MenuSeparator = ({ className, testID }: MenuSeparatorProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...({ role: 'separator' } as Record<string, unknown>)}\n accessibilityRole=\"none\"\n {...(testID !== undefined ? { testID } : {})}\n className={cn('mx-1 my-1', className)}\n style={{\n height: 1,\n marginVertical: 4,\n marginHorizontal: 4,\n backgroundColor: colors.semantic.border.default,\n }}\n />\n );\n};\nMenuSeparator.displayName = 'MenuSeparator';\n\n// ---- MenuLabel -------------------------------------------------------------\n\nexport type MenuLabelProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport const MenuLabel = ({ children, className, testID }: MenuLabelProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...({ role: 'presentation' } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('px-3 pt-2 pb-1', className)}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n color: colors.semantic.text.muted,\n textTransform: 'uppercase',\n letterSpacing: 0.6,\n fontWeight: '600',\n }}\n >\n {children}\n </RNText>\n </View>\n );\n};\nMenuLabel.displayName = 'MenuLabel';\n\n// ---------------------------------------------------------------------------\n// DropdownMenu root\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state (uncontrolled). @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Click-triggered dropdown menu.\n *\n * Compound parts:\n * - `DropdownMenu.Trigger` — wraps any element; click opens the menu.\n * - `DropdownMenu.Content` — the floating menu surface.\n * - `DropdownMenu.Item` — interactive menu item.\n * - `DropdownMenu.Separator` — visual divider.\n * - `DropdownMenu.Label` — non-interactive section heading.\n *\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenu.Trigger>\n * <Button>Options</Button>\n * </DropdownMenu.Trigger>\n * <DropdownMenu.Content>\n * <DropdownMenu.Item onSelect={() => console.log('edit')}>Edit</DropdownMenu.Item>\n * <DropdownMenu.Separator />\n * <DropdownMenu.Item destructive onSelect={() => console.log('delete')}>Delete</DropdownMenu.Item>\n * </DropdownMenu.Content>\n * </DropdownMenu>\n * ```\n */\nconst DropdownMenuRoot = ({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const toggle = useCallback(() => setOpen(!current), [setOpen, current]);\n const close = useCallback(() => setOpen(false), [setOpen]);\n\n return (\n <MenuContextProvider open={current} toggle={toggle} close={close}>\n <Popover open={current} onOpenChange={setOpen}>\n {children}\n </Popover>\n </MenuContextProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Trigger\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that toggles the dropdown menu on click/press. Uses asChild by\n * default — the wrapped child becomes the trigger. Gets `aria-haspopup=\"menu\"`\n * and `aria-expanded`.\n *\n * Internally uses the Popover context to measure the trigger rect (needed for\n * positioning) and set the triggerRef — same as PopoverTrigger, but with\n * `aria-haspopup=\"menu\"` instead of `\"dialog\"`.\n */\nconst DropdownMenuTrigger = ({ children, className, testID }: DropdownMenuTriggerProps) => {\n const menu = useMenuContext('DropdownMenu.Trigger');\n const popover = usePopoverContext('DropdownMenu.Trigger');\n\n const onPress = useCallback(() => {\n popover.measureTrigger();\n popover.setOpen(!popover.open);\n }, [popover]);\n\n if (isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n popover.measureTrigger();\n popover.setOpen(!popover.open);\n };\n\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n popover.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n {...({\n 'aria-haspopup': 'menu',\n 'aria-expanded': menu.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n popover.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={onPress}\n {...({\n 'aria-haspopup': 'menu',\n 'aria-expanded': menu.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {typeof children === 'string' || typeof children === 'number' ? <RNText>{children}</RNText> : children}\n </Pressable>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Content\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuContentProps = MenuContentProps;\n\nconst DropdownMenuContent = (props: DropdownMenuContentProps) => <MenuContent {...props} />;\n\n// ---------------------------------------------------------------------------\n// Public compound export\n// ---------------------------------------------------------------------------\n\nexport const DropdownMenu = Object.assign(DropdownMenuRoot, {\n Trigger: DropdownMenuTrigger,\n Content: DropdownMenuContent,\n Item: MenuItem,\n Separator: MenuSeparator,\n Label: MenuLabel,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/DropdownMenu/DropdownMenu.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-QNYGQYAO.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Popover, usePopoverContext } from '../Popover/Popover';\n\n// ---------------------------------------------------------------------------\n// Internal menu context — carries open state + toggle/close for sub-components\n// ---------------------------------------------------------------------------\n\ntype MenuContextValue = {\n open: boolean;\n toggle: () => void;\n close: () => void;\n};\n\nconst MenuContext = createContext<MenuContextValue | null>(null);\n\n/**\n * @internal — provides MenuContext; exported so ContextMenu can reuse it\n * without re-implementing the provider.\n */\nexport const MenuContextProvider = ({\n open,\n toggle,\n close,\n children,\n}: {\n open: boolean;\n /** Optional — DropdownMenu passes it; ContextMenu items only need close. */\n toggle?: () => void;\n close: () => void;\n children: ReactNode;\n}) => <MenuContext.Provider value={{ open, toggle: toggle ?? close, close }}>{children}</MenuContext.Provider>;\n\n/** @internal */\nexport function useMenuContext(caller: string): MenuContextValue {\n const ctx = useContext(MenuContext);\n if (!ctx) {\n throw new Error(`<${caller}> must be rendered inside a <DropdownMenu> or <ContextMenu>.`);\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Shared menu surface sub-components\n// ---------------------------------------------------------------------------\n\nexport type MenuContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n side?: 'top' | 'right' | 'bottom' | 'left';\n align?: 'start' | 'center' | 'end';\n 'aria-label'?: string;\n};\n\n/**\n * The floating menu surface. Wraps `Popover.Content` and applies\n * `role=\"menu\"` so assistive tech announces the list of items.\n *\n * Web keyboard navigation:\n * - ArrowDown / ArrowUp — cycle focus between enabled items.\n * - Home / End — jump to first / last enabled item.\n * - Escape — closes the menu (handled by Popover.Content already).\n * - Enter / Space — activates the focused item.\n */\nexport const MenuContent = ({\n children,\n className,\n testID,\n side = 'bottom',\n align = 'start',\n 'aria-label': ariaLabel,\n}: MenuContentProps) => {\n const colors = useThemeColors();\n const containerRef = useRef<View | null>(null);\n\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n const container = containerRef.current as unknown as HTMLElement | null;\n if (!container) {\n return;\n }\n\n const getItems = (): HTMLElement[] =>\n Array.from(container.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])'));\n\n const onKeyDown = (e: KeyboardEvent) => {\n const items = getItems();\n if (items.length === 0) {\n return;\n }\n const focused = document.activeElement as HTMLElement | null;\n const idx = focused ? items.indexOf(focused) : -1;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n items[idx < items.length - 1 ? idx + 1 : 0]?.focus();\n break;\n case 'ArrowUp':\n e.preventDefault();\n items[idx > 0 ? idx - 1 : items.length - 1]?.focus();\n break;\n case 'Home':\n e.preventDefault();\n items[0]?.focus();\n break;\n case 'End':\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n default:\n break;\n }\n };\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n });\n\n return (\n <Popover.Content\n side={side}\n align={align}\n {...(testID !== undefined ? { testID } : {})}\n {...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n <View\n ref={containerRef}\n {...({\n role: 'menu',\n ...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {}),\n } as Record<string, unknown>)}\n style={{\n minWidth: 160,\n paddingVertical: px(colors.spacing['1']),\n margin: -px(colors.spacing['4']),\n borderRadius: px(colors.radius.lg),\n overflow: 'hidden',\n }}\n >\n {children}\n </View>\n </Popover.Content>\n );\n};\nMenuContent.displayName = 'MenuContent';\n\n// ---- MenuItem --------------------------------------------------------------\n\nexport type MenuItemProps = {\n /** Fired when the item is selected. Also closes the menu. */\n onSelect?: () => void;\n /** Prevents interaction and dims the item visually. */\n disabled?: boolean;\n /** Renders the item in a danger/destructive tone. */\n destructive?: boolean;\n /** Leading icon node. */\n icon?: ReactNode;\n /**\n * Keyboard shortcut hint shown on the trailing edge.\n * Purely presentational — web only, no function key binding.\n */\n shortcut?: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport const MenuItem = ({\n onSelect,\n disabled = false,\n destructive = false,\n icon,\n shortcut,\n children,\n className,\n testID,\n}: MenuItemProps) => {\n const colors = useThemeColors();\n const menu = useMenuContext('MenuItem');\n\n const handlePress = useCallback(() => {\n if (disabled) {\n return;\n }\n onSelect?.();\n menu.close();\n }, [disabled, onSelect, menu]);\n\n const textColor = destructive\n ? colors.color.dangerText\n : disabled\n ? colors.semantic.text.muted\n : colors.semantic.text.default;\n\n return (\n <Pressable\n onPress={handlePress}\n disabled={disabled}\n {...({\n role: 'menuitem',\n 'aria-disabled': disabled ? 'true' : undefined,\n tabIndex: disabled ? -1 : 0,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handlePress();\n }\n },\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-row items-center gap-2 px-3 py-2', className)}\n style={{ opacity: disabled ? 0.4 : 1 }}\n accessibilityRole=\"menuitem\"\n accessibilityState={{ disabled }}\n >\n {icon !== undefined && (\n <View style={{ width: 16, height: 16, alignItems: 'center', justifyContent: 'center' }}>{icon}</View>\n )}\n <RNText\n style={{\n flex: 1,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: textColor,\n }}\n >\n {children}\n </RNText>\n {shortcut !== undefined && Platform.OS === 'web' && (\n <RNText\n {...({ 'aria-hidden': 'true' } as Record<string, unknown>)}\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n color: colors.semantic.text.muted,\n }}\n >\n {shortcut}\n </RNText>\n )}\n </Pressable>\n );\n};\nMenuItem.displayName = 'MenuItem';\n\n// ---- MenuSeparator ---------------------------------------------------------\n\nexport type MenuSeparatorProps = {\n className?: string;\n testID?: string;\n};\n\nexport const MenuSeparator = ({ className, testID }: MenuSeparatorProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...({ role: 'separator' } as Record<string, unknown>)}\n accessibilityRole=\"none\"\n {...(testID !== undefined ? { testID } : {})}\n className={cn('mx-1 my-1', className)}\n style={{\n height: 1,\n marginVertical: 4,\n marginHorizontal: 4,\n backgroundColor: colors.semantic.border.default,\n }}\n />\n );\n};\nMenuSeparator.displayName = 'MenuSeparator';\n\n// ---- MenuLabel -------------------------------------------------------------\n\nexport type MenuLabelProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport const MenuLabel = ({ children, className, testID }: MenuLabelProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...({ role: 'presentation' } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('px-3 pt-2 pb-1', className)}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n color: colors.semantic.text.muted,\n textTransform: 'uppercase',\n letterSpacing: 0.6,\n fontWeight: '600',\n }}\n >\n {children}\n </RNText>\n </View>\n );\n};\nMenuLabel.displayName = 'MenuLabel';\n\n// ---------------------------------------------------------------------------\n// DropdownMenu root\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state (uncontrolled). @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Click-triggered dropdown menu.\n *\n * Compound parts:\n * - `DropdownMenu.Trigger` — wraps any element; click opens the menu.\n * - `DropdownMenu.Content` — the floating menu surface.\n * - `DropdownMenu.Item` — interactive menu item.\n * - `DropdownMenu.Separator` — visual divider.\n * - `DropdownMenu.Label` — non-interactive section heading.\n *\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenu.Trigger>\n * <Button>Options</Button>\n * </DropdownMenu.Trigger>\n * <DropdownMenu.Content>\n * <DropdownMenu.Item onSelect={() => console.log('edit')}>Edit</DropdownMenu.Item>\n * <DropdownMenu.Separator />\n * <DropdownMenu.Item destructive onSelect={() => console.log('delete')}>Delete</DropdownMenu.Item>\n * </DropdownMenu.Content>\n * </DropdownMenu>\n * ```\n */\nconst DropdownMenuRoot = ({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const toggle = useCallback(() => setOpen(!current), [setOpen, current]);\n const close = useCallback(() => setOpen(false), [setOpen]);\n\n return (\n <MenuContextProvider open={current} toggle={toggle} close={close}>\n <Popover open={current} onOpenChange={setOpen}>\n {children}\n </Popover>\n </MenuContextProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Trigger\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that toggles the dropdown menu on click/press. Uses asChild by\n * default — the wrapped child becomes the trigger. Gets `aria-haspopup=\"menu\"`\n * and `aria-expanded`.\n *\n * Internally uses the Popover context to measure the trigger rect (needed for\n * positioning) and set the triggerRef — same as PopoverTrigger, but with\n * `aria-haspopup=\"menu\"` instead of `\"dialog\"`.\n */\nconst DropdownMenuTrigger = ({ children, className, testID }: DropdownMenuTriggerProps) => {\n const menu = useMenuContext('DropdownMenu.Trigger');\n const popover = usePopoverContext('DropdownMenu.Trigger');\n\n const onPress = useCallback(() => {\n popover.measureTrigger();\n popover.setOpen(!popover.open);\n }, [popover]);\n\n if (isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n popover.measureTrigger();\n popover.setOpen(!popover.open);\n };\n\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n popover.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n {...({\n 'aria-haspopup': 'menu',\n 'aria-expanded': menu.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n popover.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={onPress}\n {...({\n 'aria-haspopup': 'menu',\n 'aria-expanded': menu.open,\n 'aria-controls': popover.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {typeof children === 'string' || typeof children === 'number' ? <RNText>{children}</RNText> : children}\n </Pressable>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Content\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuContentProps = MenuContentProps;\n\nconst DropdownMenuContent = (props: DropdownMenuContentProps) => <MenuContent {...props} />;\n\n// ---------------------------------------------------------------------------\n// Public compound export\n// ---------------------------------------------------------------------------\n\nexport const DropdownMenu = Object.assign(DropdownMenuRoot, {\n Trigger: DropdownMenuTrigger,\n Content: DropdownMenuContent,\n Item: MenuItem,\n Separator: MenuSeparator,\n Label: MenuLabel,\n});\n"]}
@@ -1,5 +1,5 @@
1
1
  import { px } from './chunk-5A2QOOVN.js';
2
- import { useThemeColors } from './chunk-R5JMDDCB.js';
2
+ import { useThemeColors } from './chunk-3W2O4OBL.js';
3
3
  import { cn } from './chunk-CHXHRJNZ.js';
4
4
  import { __name } from './chunk-WCQVDF3K.js';
5
5
  import { createContext, useRef, useEffect, useCallback, useState, useMemo, useContext } from 'react';
@@ -272,5 +272,5 @@ var Radio = Object.assign(RadioOption, {
272
272
  });
273
273
 
274
274
  export { Radio };
275
- //# sourceMappingURL=chunk-UKDDK42K.js.map
276
- //# sourceMappingURL=chunk-UKDDK42K.js.map
275
+ //# sourceMappingURL=chunk-QOVLTVJN.js.map
276
+ //# sourceMappingURL=chunk-QOVLTVJN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Radio/Radio.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-UKDDK42K.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type RadioGroupOrientation = 'horizontal' | 'vertical';\n\ntype RadioRefMap = Map<string, RefObject<HTMLElement | null>>;\n\ntype RadioGroupContextValue = {\n value: string | undefined;\n select: (next: string) => void;\n disabled: boolean;\n orientation: RadioGroupOrientation;\n name: string | undefined;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n};\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nconst useRadioGroupContext = (): RadioGroupContextValue => {\n const ctx = useContext(RadioGroupContext);\n if (!ctx) {\n throw new Error('<Radio> must be rendered inside a <Radio.Group>.');\n }\n return ctx;\n};\n\nexport type RadioGroupProps = {\n /** Controlled selected value. */\n value?: string;\n /** Uncontrolled initial value. */\n defaultValue?: string;\n /** Fires with the new value when the selection changes. */\n onChange?: (next: string) => void;\n /** When true, every Radio inside is non-interactive. Individual Radios can also opt in. */\n disabled?: boolean;\n /**\n * Layout orientation. Drives the keyboard nav axis (Down/Up for vertical,\n * Right/Left for horizontal — both pairs work in either orientation as a\n * usability bonus).\n * @defaultValue 'vertical'\n */\n orientation?: RadioGroupOrientation;\n /** HTML `name` for form integration on web. Optional but recommended. */\n name?: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n // ── Accessibility / Field.Control injection ──────────────────────────────\n /** HTML id forwarded to the radiogroup container. Injected by Field.Control. */\n id?: string;\n /** React Native equivalent of `id`. Injected by Field.Control. */\n nativeID?: string;\n /** Points to the element that labels this group. Injected by Field.Control. */\n 'aria-labelledby'?: string;\n /** React Native equivalent of `aria-labelledby`. Injected by Field.Control. */\n accessibilityLabelledBy?: string;\n /** Points to description / error elements. Injected by Field.Control. */\n 'aria-describedby'?: string;\n /** React Native equivalent of `aria-describedby`. Injected by Field.Control. */\n accessibilityDescribedBy?: string;\n /** Marks the group as invalid. Injected by Field.Control when Field has an error. */\n 'aria-invalid'?: boolean;\n /** Marks the group as required. Injected by Field.Control when Field is required. */\n 'aria-required'?: boolean;\n};\n\nexport type RadioProps = {\n /** Unique value within the group. Required. */\n value: string;\n /** Visible label that doubles as the accessibility label. */\n label?: string;\n /** Disable just this option. */\n disabled?: boolean;\n /** Custom content rendered next to the radio dot. Overrides `label`. */\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Layout-only base; theme-driven gap is merged inside Radio. The dot\n// dimensions are component-density literals — not from theme — because the\n// radio dot has a fixed visual ramp independent of the spacing scale.\nconst ROW_LAYOUT_BASE: ViewStyle = { flexDirection: 'row', alignItems: 'center' };\nconst DOT_OUTER_BASE: ViewStyle = {\n width: 18, // component-density literal — not from theme\n height: 18, // component-density literal — not from theme\n borderRadius: 9, // perfect circle of dot diameter — not from theme\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n};\nconst DOT_INNER_BASE: ViewStyle = {\n width: 8, // component-density literal — not from theme\n height: 8, // component-density literal — not from theme\n borderRadius: 4, // perfect circle — not from theme\n};\n\n/**\n * Single-selection group of radio buttons. Container owns the value;\n * children declare their `value` and any extra disabled state.\n *\n * Keyboard nav follows the WAI-ARIA radiogroup pattern:\n * - Tab into the group → focus lands on the selected option (or the\n * first when nothing is selected). Tab out leaves the group.\n * - ArrowDown / ArrowRight → next option (wraps).\n * - ArrowUp / ArrowLeft → previous option (wraps).\n * - Home / End → first / last.\n * - Selection follows focus, so an arrow key both moves focus and\n * activates the option (the standard radiogroup behavior).\n */\nexport const RadioGroup = ({\n value,\n defaultValue,\n onChange,\n disabled = false,\n orientation = 'vertical',\n name,\n children,\n className,\n testID,\n id,\n nativeID,\n 'aria-labelledby': ariaLabelledBy,\n accessibilityLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n accessibilityDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n}: RadioGroupProps) => {\n const [inner, setInner] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const refs = useRef<RadioRefMap>(new Map());\n const orderRef = useRef<string[]>([]);\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const select = useCallback(\n (next: string) => {\n if (disabled) {\n return;\n }\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [disabled, isControlled, onChange]\n );\n\n const focusValue = useCallback((next: string) => {\n const ref = refs.current.get(next);\n ref?.current?.focus?.();\n }, []);\n\n const moveBy = useCallback(\n (offset: 1 | -1) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = current ? order.indexOf(current) : -1;\n const start = idx === -1 ? (offset === 1 ? -1 : 0) : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n select(next);\n focusValue(next);\n },\n [current, focusValue, select]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n event.preventDefault();\n moveBy(1);\n return;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n event.preventDefault();\n moveBy(-1);\n return;\n }\n case 'Home': {\n event.preventDefault();\n const first = order[0];\n if (first) {\n select(first);\n focusValue(first);\n }\n return;\n }\n case 'End': {\n event.preventDefault();\n const last = order[order.length - 1];\n if (last) {\n select(last);\n focusValue(last);\n }\n return;\n }\n }\n },\n [focusValue, moveBy, select]\n );\n\n const ctxValue = useMemo<RadioGroupContextValue>(\n () => ({ value: current, select, disabled, orientation, name, register, unregister }),\n [current, select, disabled, orientation, name, register, unregister]\n );\n\n // RN's View doesn't model onKeyDown in its TS surface but RN-Web passes\n // it through to the underlying div. Cast at the spread boundary.\n const groupProps: Record<string, unknown> = {\n role: 'radiogroup',\n accessibilityRole: 'radiogroup',\n 'aria-orientation': orientation,\n 'aria-disabled': disabled || undefined,\n onKeyDown: handleKeyDown,\n ...(testID !== undefined ? { testID } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(nativeID !== undefined ? { nativeID } : {}),\n ...(ariaLabelledBy !== undefined ? { 'aria-labelledby': ariaLabelledBy } : {}),\n ...(accessibilityLabelledBy !== undefined ? { accessibilityLabelledBy } : {}),\n ...(ariaDescribedBy !== undefined ? { 'aria-describedby': ariaDescribedBy } : {}),\n ...(accessibilityDescribedBy !== undefined ? { accessibilityDescribedBy } : {}),\n ...(ariaInvalid ? { 'aria-invalid': true } : {}),\n ...(ariaRequired ? { 'aria-required': true } : {}),\n };\n\n return (\n <RadioGroupContext.Provider value={ctxValue}>\n <RadioGroupViewport\n groupProps={groupProps}\n orientation={orientation}\n disabled={disabled}\n {...(className !== undefined ? { className } : {})}\n >\n {children}\n </RadioGroupViewport>\n </RadioGroupContext.Provider>\n );\n};\n\n// Inner view so we can call useThemeColors() to source the orientation\n// gap from the spacing token scale (the parent owns hooks for state).\nconst RadioGroupViewport = ({\n groupProps,\n orientation,\n disabled,\n className,\n children,\n}: {\n groupProps: Record<string, unknown>;\n orientation: RadioGroupOrientation;\n disabled: boolean;\n className?: string;\n children?: ReactNode;\n}) => {\n const colors = useThemeColors();\n return (\n <View\n {...groupProps}\n className={cn(\n orientation === 'horizontal' ? 'flex-row gap-4' : 'flex-col gap-3',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={[\n orientation === 'horizontal'\n ? { flexDirection: 'row', gap: px(colors.spacing['4']) }\n : { flexDirection: 'column', gap: px(colors.spacing['3']) },\n disabled ? { opacity: 0.6 } : null,\n ]}\n >\n {children}\n </View>\n );\n};\n\n/**\n * One option inside a `<Radio.Group>`. Must be rendered inside one — throws\n * with a clear message if not.\n */\nconst RadioOption = ({ value, label, disabled, children, className, testID }: RadioProps) => {\n const ctx = useRadioGroupContext();\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const selected = ctx.value === value;\n const isDisabled = disabled || ctx.disabled;\n\n useEffect(() => {\n ctx.register(value, ownRef);\n return () => ctx.unregister(value);\n }, [ctx, value]);\n\n const onPress = useCallback(() => {\n if (isDisabled) {\n return;\n }\n ctx.select(value);\n }, [ctx, value, isDisabled]);\n\n // Roving tabindex: only the selected option (or the first when nothing\n // is selected) participates in the tab order.\n const tabIndex = selected || (ctx.value === undefined && isFirstOption(ctx, value)) ? 0 : -1;\n\n const accessibilityLabel = label ?? value;\n\n const radioProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'radio',\n accessibilityRole: 'radio',\n 'aria-checked': selected,\n accessibilityState: { checked: selected, disabled: Boolean(isDisabled) },\n accessibilityLabel,\n 'aria-label': accessibilityLabel,\n tabIndex,\n onPress,\n ...(isDisabled ? { 'aria-disabled': true, disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n ...(ctx.name ? { name: ctx.name } : {}),\n };\n\n const dotOuterStyle: ViewStyle = {\n ...DOT_OUTER_BASE,\n backgroundColor: colors.semantic.background.elevated,\n borderColor: selected ? colors.semantic.interactive.primary : colors.color.neutral['400'],\n };\n const dotInnerStyle: ViewStyle = { ...DOT_INNER_BASE, backgroundColor: colors.semantic.interactive.primary };\n\n const rowStyle: ViewStyle = { ...ROW_LAYOUT_BASE, gap: px(colors.spacing['2']) };\n\n return (\n <Pressable\n {...radioProps}\n className={cn('flex-row items-center gap-2', isDisabled ? 'opacity-60' : undefined, className)}\n style={[rowStyle, isDisabled ? { opacity: 0.6 } : null]}\n >\n <View style={dotOuterStyle}>{selected ? <View style={dotInnerStyle} /> : null}</View>\n {children ??\n (label !== undefined ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n }}\n >\n {label}\n </RNText>\n ) : null)}\n </Pressable>\n );\n};\n\n// Tiny helper: when no value is selected yet, the first registered Radio is\n// the tabbable one. This is computed inside Radio (not the context) so we\n// don't have to re-render every Radio whenever the order changes.\nfunction isFirstOption(ctx: RadioGroupContextValue, value: string): boolean {\n // We only have access to register/unregister; Radio doesn't get a peek\n // at the order list. The simple-but-correct fallback: every Radio renders\n // tabIndex=0 when value is undefined, which is harmless for one-radio\n // groups and equivalent to the standard \"tab into the first\" for\n // multi-radio groups (browsers honor the first tabIndex=0 they hit).\n void ctx;\n void value;\n return true;\n}\n\n/**\n * Public `Radio` value — the per-option component plus its `.Group` static\n * member (the cluster). Use `<Radio.Group>` to wrap a list of `<Radio />`s.\n *\n * `Object.assign` produces a value whose inferred type carries the static\n * properties, so `.d.ts` consumers can write `<Radio.Group>` without a\n * separate import.\n */\nexport const Radio = Object.assign(RadioOption, {\n Group: RadioGroup,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/Radio/Radio.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-QOVLTVJN.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type RadioGroupOrientation = 'horizontal' | 'vertical';\n\ntype RadioRefMap = Map<string, RefObject<HTMLElement | null>>;\n\ntype RadioGroupContextValue = {\n value: string | undefined;\n select: (next: string) => void;\n disabled: boolean;\n orientation: RadioGroupOrientation;\n name: string | undefined;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n};\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nconst useRadioGroupContext = (): RadioGroupContextValue => {\n const ctx = useContext(RadioGroupContext);\n if (!ctx) {\n throw new Error('<Radio> must be rendered inside a <Radio.Group>.');\n }\n return ctx;\n};\n\nexport type RadioGroupProps = {\n /** Controlled selected value. */\n value?: string;\n /** Uncontrolled initial value. */\n defaultValue?: string;\n /** Fires with the new value when the selection changes. */\n onChange?: (next: string) => void;\n /** When true, every Radio inside is non-interactive. Individual Radios can also opt in. */\n disabled?: boolean;\n /**\n * Layout orientation. Drives the keyboard nav axis (Down/Up for vertical,\n * Right/Left for horizontal — both pairs work in either orientation as a\n * usability bonus).\n * @defaultValue 'vertical'\n */\n orientation?: RadioGroupOrientation;\n /** HTML `name` for form integration on web. Optional but recommended. */\n name?: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n // ── Accessibility / Field.Control injection ──────────────────────────────\n /** HTML id forwarded to the radiogroup container. Injected by Field.Control. */\n id?: string;\n /** React Native equivalent of `id`. Injected by Field.Control. */\n nativeID?: string;\n /** Points to the element that labels this group. Injected by Field.Control. */\n 'aria-labelledby'?: string;\n /** React Native equivalent of `aria-labelledby`. Injected by Field.Control. */\n accessibilityLabelledBy?: string;\n /** Points to description / error elements. Injected by Field.Control. */\n 'aria-describedby'?: string;\n /** React Native equivalent of `aria-describedby`. Injected by Field.Control. */\n accessibilityDescribedBy?: string;\n /** Marks the group as invalid. Injected by Field.Control when Field has an error. */\n 'aria-invalid'?: boolean;\n /** Marks the group as required. Injected by Field.Control when Field is required. */\n 'aria-required'?: boolean;\n};\n\nexport type RadioProps = {\n /** Unique value within the group. Required. */\n value: string;\n /** Visible label that doubles as the accessibility label. */\n label?: string;\n /** Disable just this option. */\n disabled?: boolean;\n /** Custom content rendered next to the radio dot. Overrides `label`. */\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Layout-only base; theme-driven gap is merged inside Radio. The dot\n// dimensions are component-density literals — not from theme — because the\n// radio dot has a fixed visual ramp independent of the spacing scale.\nconst ROW_LAYOUT_BASE: ViewStyle = { flexDirection: 'row', alignItems: 'center' };\nconst DOT_OUTER_BASE: ViewStyle = {\n width: 18, // component-density literal — not from theme\n height: 18, // component-density literal — not from theme\n borderRadius: 9, // perfect circle of dot diameter — not from theme\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n};\nconst DOT_INNER_BASE: ViewStyle = {\n width: 8, // component-density literal — not from theme\n height: 8, // component-density literal — not from theme\n borderRadius: 4, // perfect circle — not from theme\n};\n\n/**\n * Single-selection group of radio buttons. Container owns the value;\n * children declare their `value` and any extra disabled state.\n *\n * Keyboard nav follows the WAI-ARIA radiogroup pattern:\n * - Tab into the group → focus lands on the selected option (or the\n * first when nothing is selected). Tab out leaves the group.\n * - ArrowDown / ArrowRight → next option (wraps).\n * - ArrowUp / ArrowLeft → previous option (wraps).\n * - Home / End → first / last.\n * - Selection follows focus, so an arrow key both moves focus and\n * activates the option (the standard radiogroup behavior).\n */\nexport const RadioGroup = ({\n value,\n defaultValue,\n onChange,\n disabled = false,\n orientation = 'vertical',\n name,\n children,\n className,\n testID,\n id,\n nativeID,\n 'aria-labelledby': ariaLabelledBy,\n accessibilityLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n accessibilityDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n}: RadioGroupProps) => {\n const [inner, setInner] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const refs = useRef<RadioRefMap>(new Map());\n const orderRef = useRef<string[]>([]);\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const select = useCallback(\n (next: string) => {\n if (disabled) {\n return;\n }\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [disabled, isControlled, onChange]\n );\n\n const focusValue = useCallback((next: string) => {\n const ref = refs.current.get(next);\n ref?.current?.focus?.();\n }, []);\n\n const moveBy = useCallback(\n (offset: 1 | -1) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = current ? order.indexOf(current) : -1;\n const start = idx === -1 ? (offset === 1 ? -1 : 0) : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n select(next);\n focusValue(next);\n },\n [current, focusValue, select]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n event.preventDefault();\n moveBy(1);\n return;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n event.preventDefault();\n moveBy(-1);\n return;\n }\n case 'Home': {\n event.preventDefault();\n const first = order[0];\n if (first) {\n select(first);\n focusValue(first);\n }\n return;\n }\n case 'End': {\n event.preventDefault();\n const last = order[order.length - 1];\n if (last) {\n select(last);\n focusValue(last);\n }\n return;\n }\n }\n },\n [focusValue, moveBy, select]\n );\n\n const ctxValue = useMemo<RadioGroupContextValue>(\n () => ({ value: current, select, disabled, orientation, name, register, unregister }),\n [current, select, disabled, orientation, name, register, unregister]\n );\n\n // RN's View doesn't model onKeyDown in its TS surface but RN-Web passes\n // it through to the underlying div. Cast at the spread boundary.\n const groupProps: Record<string, unknown> = {\n role: 'radiogroup',\n accessibilityRole: 'radiogroup',\n 'aria-orientation': orientation,\n 'aria-disabled': disabled || undefined,\n onKeyDown: handleKeyDown,\n ...(testID !== undefined ? { testID } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(nativeID !== undefined ? { nativeID } : {}),\n ...(ariaLabelledBy !== undefined ? { 'aria-labelledby': ariaLabelledBy } : {}),\n ...(accessibilityLabelledBy !== undefined ? { accessibilityLabelledBy } : {}),\n ...(ariaDescribedBy !== undefined ? { 'aria-describedby': ariaDescribedBy } : {}),\n ...(accessibilityDescribedBy !== undefined ? { accessibilityDescribedBy } : {}),\n ...(ariaInvalid ? { 'aria-invalid': true } : {}),\n ...(ariaRequired ? { 'aria-required': true } : {}),\n };\n\n return (\n <RadioGroupContext.Provider value={ctxValue}>\n <RadioGroupViewport\n groupProps={groupProps}\n orientation={orientation}\n disabled={disabled}\n {...(className !== undefined ? { className } : {})}\n >\n {children}\n </RadioGroupViewport>\n </RadioGroupContext.Provider>\n );\n};\n\n// Inner view so we can call useThemeColors() to source the orientation\n// gap from the spacing token scale (the parent owns hooks for state).\nconst RadioGroupViewport = ({\n groupProps,\n orientation,\n disabled,\n className,\n children,\n}: {\n groupProps: Record<string, unknown>;\n orientation: RadioGroupOrientation;\n disabled: boolean;\n className?: string;\n children?: ReactNode;\n}) => {\n const colors = useThemeColors();\n return (\n <View\n {...groupProps}\n className={cn(\n orientation === 'horizontal' ? 'flex-row gap-4' : 'flex-col gap-3',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={[\n orientation === 'horizontal'\n ? { flexDirection: 'row', gap: px(colors.spacing['4']) }\n : { flexDirection: 'column', gap: px(colors.spacing['3']) },\n disabled ? { opacity: 0.6 } : null,\n ]}\n >\n {children}\n </View>\n );\n};\n\n/**\n * One option inside a `<Radio.Group>`. Must be rendered inside one — throws\n * with a clear message if not.\n */\nconst RadioOption = ({ value, label, disabled, children, className, testID }: RadioProps) => {\n const ctx = useRadioGroupContext();\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const selected = ctx.value === value;\n const isDisabled = disabled || ctx.disabled;\n\n useEffect(() => {\n ctx.register(value, ownRef);\n return () => ctx.unregister(value);\n }, [ctx, value]);\n\n const onPress = useCallback(() => {\n if (isDisabled) {\n return;\n }\n ctx.select(value);\n }, [ctx, value, isDisabled]);\n\n // Roving tabindex: only the selected option (or the first when nothing\n // is selected) participates in the tab order.\n const tabIndex = selected || (ctx.value === undefined && isFirstOption(ctx, value)) ? 0 : -1;\n\n const accessibilityLabel = label ?? value;\n\n const radioProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'radio',\n accessibilityRole: 'radio',\n 'aria-checked': selected,\n accessibilityState: { checked: selected, disabled: Boolean(isDisabled) },\n accessibilityLabel,\n 'aria-label': accessibilityLabel,\n tabIndex,\n onPress,\n ...(isDisabled ? { 'aria-disabled': true, disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n ...(ctx.name ? { name: ctx.name } : {}),\n };\n\n const dotOuterStyle: ViewStyle = {\n ...DOT_OUTER_BASE,\n backgroundColor: colors.semantic.background.elevated,\n borderColor: selected ? colors.semantic.interactive.primary : colors.color.neutral['400'],\n };\n const dotInnerStyle: ViewStyle = { ...DOT_INNER_BASE, backgroundColor: colors.semantic.interactive.primary };\n\n const rowStyle: ViewStyle = { ...ROW_LAYOUT_BASE, gap: px(colors.spacing['2']) };\n\n return (\n <Pressable\n {...radioProps}\n className={cn('flex-row items-center gap-2', isDisabled ? 'opacity-60' : undefined, className)}\n style={[rowStyle, isDisabled ? { opacity: 0.6 } : null]}\n >\n <View style={dotOuterStyle}>{selected ? <View style={dotInnerStyle} /> : null}</View>\n {children ??\n (label !== undefined ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n }}\n >\n {label}\n </RNText>\n ) : null)}\n </Pressable>\n );\n};\n\n// Tiny helper: when no value is selected yet, the first registered Radio is\n// the tabbable one. This is computed inside Radio (not the context) so we\n// don't have to re-render every Radio whenever the order changes.\nfunction isFirstOption(ctx: RadioGroupContextValue, value: string): boolean {\n // We only have access to register/unregister; Radio doesn't get a peek\n // at the order list. The simple-but-correct fallback: every Radio renders\n // tabIndex=0 when value is undefined, which is harmless for one-radio\n // groups and equivalent to the standard \"tab into the first\" for\n // multi-radio groups (browsers honor the first tabIndex=0 they hit).\n void ctx;\n void value;\n return true;\n}\n\n/**\n * Public `Radio` value — the per-option component plus its `.Group` static\n * member (the cluster). Use `<Radio.Group>` to wrap a list of `<Radio />`s.\n *\n * `Object.assign` produces a value whose inferred type carries the static\n * properties, so `.d.ts` consumers can write `<Radio.Group>` without a\n * separate import.\n */\nexport const Radio = Object.assign(RadioOption, {\n Group: RadioGroup,\n});\n"]}
@@ -1,8 +1,8 @@
1
1
  import { useTranslation } from './chunk-GJMHNEQ3.js';
2
- import { defaultSemanticIcons } from './chunk-7Z4NMNX6.js';
3
- import { Badge } from './chunk-MOAIQHR7.js';
2
+ import { defaultSemanticIcons } from './chunk-O656K7OS.js';
3
+ import { Badge } from './chunk-DJ3XX3CV.js';
4
4
  import { px } from './chunk-5A2QOOVN.js';
5
- import { useThemeColors } from './chunk-R5JMDDCB.js';
5
+ import { useThemeColors } from './chunk-3W2O4OBL.js';
6
6
  import { cn } from './chunk-CHXHRJNZ.js';
7
7
  import { __name } from './chunk-WCQVDF3K.js';
8
8
  import * as React from 'react';
@@ -650,5 +650,5 @@ function withAlpha(color, alpha) {
650
650
  __name(withAlpha, "withAlpha");
651
651
 
652
652
  export { FloatButton };
653
- //# sourceMappingURL=chunk-PJXVLE24.js.map
654
- //# sourceMappingURL=chunk-PJXVLE24.js.map
653
+ //# sourceMappingURL=chunk-QYA7HYFI.js.map
654
+ //# sourceMappingURL=chunk-QYA7HYFI.js.map