@nori-ui/core 1.6.0 → 1.8.0

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 (203) hide show
  1. package/dist/{chunk-7UKRN73P.js → chunk-2XJCLPNH.js} +3 -3
  2. package/dist/{chunk-7UKRN73P.js.map → chunk-2XJCLPNH.js.map} +1 -1
  3. package/dist/{chunk-5PSC5HT4.js → chunk-3B345SQU.js} +5 -5
  4. package/dist/{chunk-5PSC5HT4.js.map → chunk-3B345SQU.js.map} +1 -1
  5. package/dist/{chunk-JSAG5YO7.js → chunk-3IIIHZHT.js} +3 -3
  6. package/dist/{chunk-JSAG5YO7.js.map → chunk-3IIIHZHT.js.map} +1 -1
  7. package/dist/{chunk-DDGMLLS3.js → chunk-3W3XYULK.js} +3 -3
  8. package/dist/{chunk-DDGMLLS3.js.map → chunk-3W3XYULK.js.map} +1 -1
  9. package/dist/{chunk-WYPGQVDV.js → chunk-5YHT252H.js} +3 -3
  10. package/dist/{chunk-WYPGQVDV.js.map → chunk-5YHT252H.js.map} +1 -1
  11. package/dist/{chunk-ZMSIYLSI.js → chunk-7FSFJA33.js} +3 -3
  12. package/dist/{chunk-ZMSIYLSI.js.map → chunk-7FSFJA33.js.map} +1 -1
  13. package/dist/chunk-BOMPFNM4.js +165 -0
  14. package/dist/chunk-BOMPFNM4.js.map +1 -0
  15. package/dist/chunk-BVLOX4A3.js +256 -0
  16. package/dist/chunk-BVLOX4A3.js.map +1 -0
  17. package/dist/{chunk-YZ27OS2R.js → chunk-C32XGHWO.js} +3 -3
  18. package/dist/{chunk-YZ27OS2R.js.map → chunk-C32XGHWO.js.map} +1 -1
  19. package/dist/{chunk-UJWCEGQY.js → chunk-C5HQPXRI.js} +3 -3
  20. package/dist/{chunk-UJWCEGQY.js.map → chunk-C5HQPXRI.js.map} +1 -1
  21. package/dist/{chunk-XALU6LOT.js → chunk-EN4CLDGZ.js} +3 -3
  22. package/dist/{chunk-XALU6LOT.js.map → chunk-EN4CLDGZ.js.map} +1 -1
  23. package/dist/{chunk-6AD6KCVB.js → chunk-F5UKI7XD.js} +3 -3
  24. package/dist/{chunk-6AD6KCVB.js.map → chunk-F5UKI7XD.js.map} +1 -1
  25. package/dist/chunk-GTAXVTLF.js +43 -0
  26. package/dist/chunk-GTAXVTLF.js.map +1 -0
  27. package/dist/{chunk-NNFJKRXZ.js → chunk-H2LHWJ52.js} +3 -3
  28. package/dist/{chunk-NNFJKRXZ.js.map → chunk-H2LHWJ52.js.map} +1 -1
  29. package/dist/{chunk-PZS4A4VQ.js → chunk-HXCETKCC.js} +3 -3
  30. package/dist/{chunk-PZS4A4VQ.js.map → chunk-HXCETKCC.js.map} +1 -1
  31. package/dist/chunk-IGBXSBF7.js +71 -0
  32. package/dist/chunk-IGBXSBF7.js.map +1 -0
  33. package/dist/{chunk-JXLEMBDB.js → chunk-IIVTPN62.js} +3 -3
  34. package/dist/{chunk-JXLEMBDB.js.map → chunk-IIVTPN62.js.map} +1 -1
  35. package/dist/{chunk-PNP7L4TA.js → chunk-ISCJST4P.js} +3 -3
  36. package/dist/{chunk-PNP7L4TA.js.map → chunk-ISCJST4P.js.map} +1 -1
  37. package/dist/{chunk-TLS54G6Y.js → chunk-IWM2XDXH.js} +3 -3
  38. package/dist/{chunk-TLS54G6Y.js.map → chunk-IWM2XDXH.js.map} +1 -1
  39. package/dist/chunk-J5LK2XHE.js +118 -0
  40. package/dist/chunk-J5LK2XHE.js.map +1 -0
  41. package/dist/chunk-KFFGDET3.js +27 -0
  42. package/dist/chunk-KFFGDET3.js.map +1 -0
  43. package/dist/{chunk-MRJWPRCX.js → chunk-L6VYDM7S.js} +3 -3
  44. package/dist/{chunk-MRJWPRCX.js.map → chunk-L6VYDM7S.js.map} +1 -1
  45. package/dist/chunk-M4BI63P6.js +188 -0
  46. package/dist/chunk-M4BI63P6.js.map +1 -0
  47. package/dist/{chunk-RUWD35UI.js → chunk-MK57AOTI.js} +4 -4
  48. package/dist/{chunk-RUWD35UI.js.map → chunk-MK57AOTI.js.map} +1 -1
  49. package/dist/{chunk-3BDDPFCI.js → chunk-MOAIQHR7.js} +3 -3
  50. package/dist/{chunk-3BDDPFCI.js.map → chunk-MOAIQHR7.js.map} +1 -1
  51. package/dist/{chunk-5XEGZFG5.js → chunk-MYBBBLYE.js} +3 -3
  52. package/dist/{chunk-5XEGZFG5.js.map → chunk-MYBBBLYE.js.map} +1 -1
  53. package/dist/{chunk-WP2Z2ATO.js → chunk-O6M3F7BZ.js} +5 -5
  54. package/dist/{chunk-WP2Z2ATO.js.map → chunk-O6M3F7BZ.js.map} +1 -1
  55. package/dist/{chunk-FEPTH5RV.js → chunk-OELY6K44.js} +3 -3
  56. package/dist/{chunk-FEPTH5RV.js.map → chunk-OELY6K44.js.map} +1 -1
  57. package/dist/{chunk-BZLT6R62.js → chunk-OIHX5B4R.js} +3 -3
  58. package/dist/{chunk-BZLT6R62.js.map → chunk-OIHX5B4R.js.map} +1 -1
  59. package/dist/{chunk-QJVS2VXS.js → chunk-PGYEIXCO.js} +4 -4
  60. package/dist/{chunk-QJVS2VXS.js.map → chunk-PGYEIXCO.js.map} +1 -1
  61. package/dist/{chunk-UZD77M3J.js → chunk-PJTCO76H.js} +3 -3
  62. package/dist/{chunk-UZD77M3J.js.map → chunk-PJTCO76H.js.map} +1 -1
  63. package/dist/{chunk-4PUPKWEP.js → chunk-PJXVLE24.js} +4 -4
  64. package/dist/{chunk-4PUPKWEP.js.map → chunk-PJXVLE24.js.map} +1 -1
  65. package/dist/{chunk-WGT345SV.js → chunk-PLQPBMG2.js} +3 -3
  66. package/dist/{chunk-WGT345SV.js.map → chunk-PLQPBMG2.js.map} +1 -1
  67. package/dist/{chunk-OMU4R4Y5.js → chunk-PQW5LKAI.js} +3 -3
  68. package/dist/{chunk-OMU4R4Y5.js.map → chunk-PQW5LKAI.js.map} +1 -1
  69. package/dist/{chunk-Y5TJ7CAX.js → chunk-RI4Y2C5U.js} +3 -3
  70. package/dist/{chunk-Y5TJ7CAX.js.map → chunk-RI4Y2C5U.js.map} +1 -1
  71. package/dist/{chunk-3OIWAS2P.js → chunk-SF6WPUC5.js} +3 -3
  72. package/dist/{chunk-3OIWAS2P.js.map → chunk-SF6WPUC5.js.map} +1 -1
  73. package/dist/{chunk-MKSDYRWQ.js → chunk-STX5UKYT.js} +3 -3
  74. package/dist/{chunk-MKSDYRWQ.js.map → chunk-STX5UKYT.js.map} +1 -1
  75. package/dist/{chunk-2RL6WCFC.js → chunk-TSWPHJIU.js} +4 -4
  76. package/dist/{chunk-2RL6WCFC.js.map → chunk-TSWPHJIU.js.map} +1 -1
  77. package/dist/{chunk-SFNDR6DI.js → chunk-U2ZKY2CP.js} +3 -3
  78. package/dist/{chunk-SFNDR6DI.js.map → chunk-U2ZKY2CP.js.map} +1 -1
  79. package/dist/{chunk-PABG3IJ6.js → chunk-UKDDK42K.js} +3 -3
  80. package/dist/{chunk-PABG3IJ6.js.map → chunk-UKDDK42K.js.map} +1 -1
  81. package/dist/{chunk-VYRJ7OE5.js → chunk-USFXANEU.js} +3 -3
  82. package/dist/{chunk-VYRJ7OE5.js.map → chunk-USFXANEU.js.map} +1 -1
  83. package/dist/{chunk-CCUXO2HN.js → chunk-V5QSMDZL.js} +3 -3
  84. package/dist/{chunk-CCUXO2HN.js.map → chunk-V5QSMDZL.js.map} +1 -1
  85. package/dist/{chunk-NF7XG2FG.js → chunk-V75O7QQO.js} +3 -3
  86. package/dist/{chunk-NF7XG2FG.js.map → chunk-V75O7QQO.js.map} +1 -1
  87. package/dist/chunk-VFUV6XJR.js +257 -0
  88. package/dist/chunk-VFUV6XJR.js.map +1 -0
  89. package/dist/{chunk-NRYWNOG5.js → chunk-VL2WNGPF.js} +3 -3
  90. package/dist/{chunk-NRYWNOG5.js.map → chunk-VL2WNGPF.js.map} +1 -1
  91. package/dist/{chunk-JQQ3FBN7.js → chunk-VLZANXRZ.js} +3 -3
  92. package/dist/{chunk-JQQ3FBN7.js.map → chunk-VLZANXRZ.js.map} +1 -1
  93. package/dist/{chunk-2HMQDJ22.js → chunk-VOF3S5I4.js} +3 -3
  94. package/dist/{chunk-2HMQDJ22.js.map → chunk-VOF3S5I4.js.map} +1 -1
  95. package/dist/chunk-XQNVWHMN.js +60 -0
  96. package/dist/chunk-XQNVWHMN.js.map +1 -0
  97. package/dist/{chunk-JZ774T7U.js → chunk-ZGFXKYA5.js} +3 -3
  98. package/dist/{chunk-JZ774T7U.js.map → chunk-ZGFXKYA5.js.map} +1 -1
  99. package/dist/client.cjs +1106 -7
  100. package/dist/client.cjs.map +1 -1
  101. package/dist/client.d.cts +9 -0
  102. package/dist/client.d.ts +9 -0
  103. package/dist/client.js +56 -47
  104. package/dist/client.js.map +1 -1
  105. package/dist/components/Accordion/index.js +2 -2
  106. package/dist/components/Alert/index.js +2 -2
  107. package/dist/components/AlertDialog/index.js +2 -2
  108. package/dist/components/AspectRatio/index.cjs +67 -0
  109. package/dist/components/AspectRatio/index.cjs.map +1 -0
  110. package/dist/components/AspectRatio/index.d.cts +30 -0
  111. package/dist/components/AspectRatio/index.d.ts +30 -0
  112. package/dist/components/AspectRatio/index.js +5 -0
  113. package/dist/components/AspectRatio/index.js.map +1 -0
  114. package/dist/components/Avatar/index.js +2 -2
  115. package/dist/components/Badge/index.js +2 -2
  116. package/dist/components/Box/index.js +4 -4
  117. package/dist/components/Breadcrumb/index.js +3 -3
  118. package/dist/components/Button/index.js +2 -2
  119. package/dist/components/ButtonGroup/index.cjs +83 -0
  120. package/dist/components/ButtonGroup/index.cjs.map +1 -0
  121. package/dist/components/ButtonGroup/index.d.cts +45 -0
  122. package/dist/components/ButtonGroup/index.d.ts +45 -0
  123. package/dist/components/ButtonGroup/index.js +5 -0
  124. package/dist/components/ButtonGroup/index.js.map +1 -0
  125. package/dist/components/Calendar/index.js +3 -3
  126. package/dist/components/Card/index.js +2 -2
  127. package/dist/components/Carousel/index.cjs +297 -0
  128. package/dist/components/Carousel/index.cjs.map +1 -0
  129. package/dist/components/Carousel/index.d.cts +67 -0
  130. package/dist/components/Carousel/index.d.ts +67 -0
  131. package/dist/components/Carousel/index.js +5 -0
  132. package/dist/components/Carousel/index.js.map +1 -0
  133. package/dist/components/Checkbox/index.js +2 -2
  134. package/dist/components/Collapsible/index.cjs +512 -0
  135. package/dist/components/Collapsible/index.cjs.map +1 -0
  136. package/dist/components/Collapsible/index.d.cts +50 -0
  137. package/dist/components/Collapsible/index.d.ts +50 -0
  138. package/dist/components/Collapsible/index.js +7 -0
  139. package/dist/components/Collapsible/index.js.map +1 -0
  140. package/dist/components/Combobox/index.js +3 -3
  141. package/dist/components/ContextMenu/index.js +4 -4
  142. package/dist/components/DataTable/index.js +3 -3
  143. package/dist/components/DatePicker/index.js +5 -5
  144. package/dist/components/Dialog/index.js +2 -2
  145. package/dist/components/DropdownMenu/index.js +3 -3
  146. package/dist/components/Empty/index.cjs +385 -0
  147. package/dist/components/Empty/index.cjs.map +1 -0
  148. package/dist/components/Empty/index.d.cts +32 -0
  149. package/dist/components/Empty/index.d.ts +32 -0
  150. package/dist/components/Empty/index.js +7 -0
  151. package/dist/components/Empty/index.js.map +1 -0
  152. package/dist/components/FloatButton/index.js +3 -3
  153. package/dist/components/HStack/index.js +4 -4
  154. package/dist/components/HoverCard/index.cjs +894 -0
  155. package/dist/components/HoverCard/index.cjs.map +1 -0
  156. package/dist/components/HoverCard/index.d.cts +66 -0
  157. package/dist/components/HoverCard/index.d.ts +66 -0
  158. package/dist/components/HoverCard/index.js +9 -0
  159. package/dist/components/HoverCard/index.js.map +1 -0
  160. package/dist/components/InputGroup/index.js +2 -2
  161. package/dist/components/InputOTP/index.cjs +580 -0
  162. package/dist/components/InputOTP/index.cjs.map +1 -0
  163. package/dist/components/InputOTP/index.d.cts +49 -0
  164. package/dist/components/InputOTP/index.d.ts +49 -0
  165. package/dist/components/InputOTP/index.js +7 -0
  166. package/dist/components/InputOTP/index.js.map +1 -0
  167. package/dist/components/Item/index.cjs +443 -0
  168. package/dist/components/Item/index.cjs.map +1 -0
  169. package/dist/components/Item/index.d.cts +40 -0
  170. package/dist/components/Item/index.d.ts +40 -0
  171. package/dist/components/Item/index.js +7 -0
  172. package/dist/components/Item/index.js.map +1 -0
  173. package/dist/components/Kbd/index.cjs +396 -0
  174. package/dist/components/Kbd/index.cjs.map +1 -0
  175. package/dist/components/Kbd/index.d.cts +22 -0
  176. package/dist/components/Kbd/index.d.ts +22 -0
  177. package/dist/components/Kbd/index.js +7 -0
  178. package/dist/components/Kbd/index.js.map +1 -0
  179. package/dist/components/Pagination/index.js +4 -4
  180. package/dist/components/Popover/index.js +2 -2
  181. package/dist/components/Progress/index.js +2 -2
  182. package/dist/components/Radio/index.js +2 -2
  183. package/dist/components/SegmentedControl/index.js +2 -2
  184. package/dist/components/Select/index.js +2 -2
  185. package/dist/components/Separator/index.js +2 -2
  186. package/dist/components/Sheet/index.js +2 -2
  187. package/dist/components/Skeleton/index.js +2 -2
  188. package/dist/components/Slider/index.js +2 -2
  189. package/dist/components/Switch/index.js +2 -2
  190. package/dist/components/Table/index.js +2 -2
  191. package/dist/components/Tabs/index.js +2 -2
  192. package/dist/components/Text/index.js +2 -2
  193. package/dist/components/TextArea/index.js +3 -3
  194. package/dist/components/TextInput/index.js +2 -2
  195. package/dist/components/Toggle/index.js +2 -2
  196. package/dist/components/Tooltip/index.js +2 -2
  197. package/dist/components/VStack/index.js +4 -4
  198. package/dist/index.cjs +1106 -7
  199. package/dist/index.cjs.map +1 -1
  200. package/dist/index.d.cts +9 -0
  201. package/dist/index.d.ts +9 -0
  202. package/dist/index.js +54 -45
  203. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Kbd/Kbd.tsx"],"names":["RNText"],"mappings":";;;;;;;AA2BO,IAAM,GAAA,mBAAM,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,WAAU,KAAgB;AACtD,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,MAAA,GAAS,gBAAe,KAAM,MAAA;AAEpC,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACjF,EAAA,MAAM,WAAA,GAAc,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrF,EAAA,MAAM,SAAA,GAAY,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAEnF,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW,QAAA;AAAA,IACX,eAAA,EAAiB,OAAA;AAAA,IACjB,WAAA,EAAa,CAAA;AAAA,IACb,WAAA;AAAA,IACA,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,CAAA;AAAA;AAAA,IAEjB,GAAI,QAAA,CAAS,EAAA,KAAO,KAAA,GACb;AAAA,MACG,SAAA,EAAW,WAAW,WAAW,CAAA,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,QAEb;AAAC,GACX;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IACzB,KAAA,EAAO,SAAA;AAAA;AAAA,IAEP,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,IAAA,IAAQ,WAAA;AAAA,IACtC,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,IAC/B,UAAA,EAAY,OAAO,UAAA,CAAW,MAAA;AAAA,IAC9B,UAAA,EAAY,GAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM;AAAA,GACxE;AAOA,EAAA,MAAM,aAAA,GACF,QAAA,CAAS,EAAA,KAAO,KAAA,GACT;AAAA;AAAA;AAAA;AAAA,IAIG,iBAAA,EAAmB;AAAA,MAEvB,EAAC;AAEX,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,aAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,iEAAA;AAAA,QACA,SACM,oDAAA,GACA,oDAAA;AAAA,QACN;AAAA,OACJ;AAAA,MACA,KAAA,EAAO,cAAA;AAAA,MAIP,QAAA,kBAAA,GAAA;AAAA,QAACA,IAAA;AAAA,QAAA;AAAA,UACI,GAAI,SAAS,EAAA,KAAO,KAAA,GAAS,EAAE,UAAA,EAAY,EAAA,KAAkB,EAAC;AAAA,UAC/D,iBAAA,EAAkB,MAAA;AAAA,UAClB,KAAA,EAAO,SAAA;AAAA,UAEN;AAAA;AAAA;AACL;AAAA,GACJ;AAER,CAAA,EA5EmB,KAAA","file":"chunk-IGBXSBF7.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { TextStyle, ViewStyle } from 'react-native';\nimport { Platform, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useColorScheme } from '../../theme/use-color-scheme';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type KbdProps = {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Inline keyboard key hint. Use inside prose or UI labels to indicate a\n * keyboard shortcut.\n *\n * ```tsx\n * <Text>Press <Kbd>⌘K</Kbd> to open the command palette.</Text>\n * ```\n *\n * On web it renders a semantic `<kbd>` element (via rn-web's `accessibilityRole`\n * mapping). On native it renders a styled `<Text>`. The visual treatment is\n * identical: small monospace text in a pill with a subtle border.\n */\nexport const Kbd = ({ children, className }: KbdProps) => {\n const colors = useThemeColors();\n const isDark = useColorScheme() === 'dark';\n\n const bgColor = isDark ? colors.color.neutral['800'] : colors.color.neutral['100'];\n const borderColor = isDark ? colors.color.neutral['600'] : colors.color.neutral['300'];\n const textColor = isDark ? colors.color.neutral['200'] : colors.color.neutral['700'];\n\n const containerStyle: ViewStyle = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n alignSelf: 'center',\n backgroundColor: bgColor,\n borderWidth: 1,\n borderColor,\n borderRadius: px(colors.radius.sm),\n paddingHorizontal: px(colors.spacing['1']),\n paddingVertical: 2,\n // Subtle bottom shadow gives the classic key look.\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: `0 1px 0 ${borderColor}`,\n display: 'inline-flex',\n } as object)\n : {}),\n };\n\n const textStyle: TextStyle = {\n color: textColor,\n // Monospace font for key labels.\n fontFamily: colors.fontFamily.mono ?? 'monospace',\n fontSize: px(colors.fontSize.xs),\n fontWeight: colors.fontWeight.medium as '500',\n lineHeight: px(colors.fontSize.xs) * Number(colors.lineHeight.normal),\n };\n\n // On web, map to the semantic <kbd> element via accessibilityRole.\n // react-native-web renders role=\"term\" as <dfn> and doesn't have a\n // dedicated kbd mapping, so we use a raw className + aria approach.\n // The 'none' role avoids a superfluous ARIA landmark while keeping\n // the native <kbd> tag in the DOM (set via `aria-label` / class).\n const extraWebProps =\n Platform.OS === 'web'\n ? ({\n // rn-web: 'none' skips the role attribute so the outer\n // View is just a plain <div>; we rely on the inner\n // <span> with data-kbd for semantic annotation.\n accessibilityRole: 'none' as const,\n } as object)\n : {};\n\n return (\n <View\n {...extraWebProps}\n className={cn(\n 'inline-flex flex-row items-center rounded-sm border px-1 py-0.5',\n isDark\n ? 'bg-neutral-800 border-neutral-600 text-neutral-200'\n : 'bg-neutral-100 border-neutral-300 text-neutral-700',\n className\n )}\n style={containerStyle}\n >\n {/* On web, data-kbd is used for CSS targeting / semantics.\n On native this attribute is silently ignored. */}\n <RNText\n {...(Platform.OS === 'web' ? ({ 'data-kbd': '' } as object) : {})}\n accessibilityRole=\"none\"\n style={textStyle}\n >\n {children}\n </RNText>\n </View>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { Select } from './chunk-UZD77M3J.js';
1
+ import { Select } from './chunk-PJTCO76H.js';
2
2
  import { __name } from './chunk-WCQVDF3K.js';
3
3
  import { jsx } from 'nativewind/jsx-runtime';
4
4
 
@@ -7,5 +7,5 @@ var Combobox = /* @__PURE__ */ __name((props) => {
7
7
  }, "Combobox");
8
8
 
9
9
  export { Combobox };
10
- //# sourceMappingURL=chunk-JXLEMBDB.js.map
11
- //# sourceMappingURL=chunk-JXLEMBDB.js.map
10
+ //# sourceMappingURL=chunk-IIVTPN62.js.map
11
+ //# sourceMappingURL=chunk-IIVTPN62.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Combobox/Combobox.tsx"],"names":[],"mappings":";;;;AAcO,IAAM,QAAA,2BAAyB,KAAA,KAA0B;AAC5D,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAO,UAAA,EAAU,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AACzC,CAAA,EAFwB,UAAA","file":"chunk-JXLEMBDB.js","sourcesContent":["'use client';\n\nimport { Select, type SelectProps } from '../Select';\n\n/**\n * Combobox — a Select with search defaulted on.\n *\n * Use Combobox for long lists or async options where users benefit from\n * typeahead filtering. Use Select directly for short static lists where\n * clicking is enough.\n *\n * Every prop, behavior, and type is identical to Select; this is purely a\n * default + naming convenience.\n */\nexport const Combobox = <T = unknown>(props: SelectProps<T>) => {\n return <Select searchable {...props} />;\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Combobox/Combobox.tsx"],"names":[],"mappings":";;;;AAcO,IAAM,QAAA,2BAAyB,KAAA,KAA0B;AAC5D,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAO,UAAA,EAAU,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AACzC,CAAA,EAFwB,UAAA","file":"chunk-IIVTPN62.js","sourcesContent":["'use client';\n\nimport { Select, type SelectProps } from '../Select';\n\n/**\n * Combobox — a Select with search defaulted on.\n *\n * Use Combobox for long lists or async options where users benefit from\n * typeahead filtering. Use Select directly for short static lists where\n * clicking is enough.\n *\n * Every prop, behavior, and type is identical to Select; this is purely a\n * default + naming convenience.\n */\nexport const Combobox = <T = unknown>(props: SelectProps<T>) => {\n return <Select searchable {...props} />;\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { px } from './chunk-5A2QOOVN.js';
2
- import { cn } from './chunk-CHXHRJNZ.js';
3
2
  import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
4
  import { __name } from './chunk-WCQVDF3K.js';
5
5
  import { useState } from 'react';
6
6
  import { View, Image, Text } from 'react-native';
@@ -99,5 +99,5 @@ var Avatar = /* @__PURE__ */ __name(({ src, name, size = "md", fallback, classNa
99
99
  }, "Avatar");
100
100
 
101
101
  export { Avatar };
102
- //# sourceMappingURL=chunk-PNP7L4TA.js.map
103
- //# sourceMappingURL=chunk-PNP7L4TA.js.map
102
+ //# sourceMappingURL=chunk-ISCJST4P.js.map
103
+ //# sourceMappingURL=chunk-ISCJST4P.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["RNImage","RNText"],"mappings":"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","file":"chunk-PNP7L4TA.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport type { ImageStyle, ViewStyle } from 'react-native';\nimport { Image as RNImage, 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 AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarProps = {\n /** Image URL. When omitted or the load fails, the fallback renders instead. */\n src?: string;\n /**\n * Person/entity name. Used to derive initials for the fallback (first\n * letter of the first word + first letter of the last word, up to 2\n * characters). Also becomes the `alt` text on the image — set this\n * even when `src` loads cleanly.\n */\n name?: string;\n /**\n * Visual size. Maps to a fixed pixel diameter.\n * @defaultValue 'md'\n */\n size?: AvatarSize;\n /**\n * Custom fallback content shown when no `src` is provided or the image\n * fails to load. When omitted, initials derived from `name` render; if\n * `name` is also missing, a neutral placeholder shows.\n */\n fallback?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Diameter for each size — component-density literals — not from theme\n// (avatars have a tight visual ramp that doesn't tie to the spacing scale).\nconst SIZE_PX: Record<AvatarSize, number> = {\n sm: 32,\n md: 40,\n lg: 56,\n xl: 72,\n};\n\n// Maps each avatar size to the closest fontSize token key. Resolved to px\n// inside the component so theme overrides take effect.\nconst FALLBACK_FONT_KEY: Record<AvatarSize, 'xs' | 'sm' | 'lg' | 'xl'> = {\n sm: 'xs', // 12\n md: 'sm', // 14\n lg: 'lg', // 18\n xl: 'xl', // 20 (closest to legacy 22)\n};\n\nconst initialsFromName = (name: string | undefined): string => {\n if (!name) {\n return '';\n }\n const trimmed = name.trim();\n if (!trimmed) {\n return '';\n }\n const parts = trimmed.split(/\\s+/);\n const first = parts[0]?.[0] ?? '';\n const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';\n return (first + last).toUpperCase();\n};\n\n/**\n * Circular profile picture with graceful fallback. Renders the image when\n * `src` is provided and loads cleanly; otherwise renders the supplied\n * `fallback`, derived initials from `name`, or a neutral placeholder.\n *\n * Why a single component instead of compound (`AvatarImage` + `AvatarFallback`):\n * the common case is a one-liner — `<Avatar src name />` — and the fallback\n * decision is internal state, not consumer-driven layout.\n */\nexport const Avatar = ({ src, name, size = 'md', fallback, className, testID }: AvatarProps) => {\n const colors = useThemeColors();\n const [imageFailed, setImageFailed] = useState(false);\n const dim = SIZE_PX[size];\n const showImage = src !== undefined && src.length > 0 && !imageFailed;\n\n const containerStyle: ViewStyle = {\n width: dim,\n height: dim,\n borderRadius: dim / 2,\n backgroundColor: colors.semantic.background.subtle,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n };\n\n const imageStyle: ImageStyle = {\n width: dim,\n height: dim,\n };\n\n const initials = initialsFromName(name);\n const accessibilityLabel = name ?? 'Avatar';\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"image\"\n accessibilityLabel={accessibilityLabel}\n aria-label={accessibilityLabel}\n className={cn('rounded-full overflow-hidden bg-neutral-200 items-center justify-center', className)}\n style={containerStyle}\n >\n {showImage ? (\n <RNImage\n source={{ uri: src }}\n style={imageStyle}\n accessibilityLabel={accessibilityLabel}\n onError={() => setImageFailed(true)}\n />\n ) : fallback !== undefined ? (\n fallback\n ) : initials.length > 0 ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize[FALLBACK_FONT_KEY[size]]),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n >\n {initials}\n </RNText>\n ) : (\n <View\n style={{\n width: dim * 0.45,\n height: dim * 0.45,\n borderRadius: dim,\n backgroundColor: colors.semantic.text.muted,\n }}\n />\n )}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["RNImage","RNText"],"mappings":"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","file":"chunk-ISCJST4P.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport type { ImageStyle, ViewStyle } from 'react-native';\nimport { Image as RNImage, 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 AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarProps = {\n /** Image URL. When omitted or the load fails, the fallback renders instead. */\n src?: string;\n /**\n * Person/entity name. Used to derive initials for the fallback (first\n * letter of the first word + first letter of the last word, up to 2\n * characters). Also becomes the `alt` text on the image — set this\n * even when `src` loads cleanly.\n */\n name?: string;\n /**\n * Visual size. Maps to a fixed pixel diameter.\n * @defaultValue 'md'\n */\n size?: AvatarSize;\n /**\n * Custom fallback content shown when no `src` is provided or the image\n * fails to load. When omitted, initials derived from `name` render; if\n * `name` is also missing, a neutral placeholder shows.\n */\n fallback?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Diameter for each size — component-density literals — not from theme\n// (avatars have a tight visual ramp that doesn't tie to the spacing scale).\nconst SIZE_PX: Record<AvatarSize, number> = {\n sm: 32,\n md: 40,\n lg: 56,\n xl: 72,\n};\n\n// Maps each avatar size to the closest fontSize token key. Resolved to px\n// inside the component so theme overrides take effect.\nconst FALLBACK_FONT_KEY: Record<AvatarSize, 'xs' | 'sm' | 'lg' | 'xl'> = {\n sm: 'xs', // 12\n md: 'sm', // 14\n lg: 'lg', // 18\n xl: 'xl', // 20 (closest to legacy 22)\n};\n\nconst initialsFromName = (name: string | undefined): string => {\n if (!name) {\n return '';\n }\n const trimmed = name.trim();\n if (!trimmed) {\n return '';\n }\n const parts = trimmed.split(/\\s+/);\n const first = parts[0]?.[0] ?? '';\n const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';\n return (first + last).toUpperCase();\n};\n\n/**\n * Circular profile picture with graceful fallback. Renders the image when\n * `src` is provided and loads cleanly; otherwise renders the supplied\n * `fallback`, derived initials from `name`, or a neutral placeholder.\n *\n * Why a single component instead of compound (`AvatarImage` + `AvatarFallback`):\n * the common case is a one-liner — `<Avatar src name />` — and the fallback\n * decision is internal state, not consumer-driven layout.\n */\nexport const Avatar = ({ src, name, size = 'md', fallback, className, testID }: AvatarProps) => {\n const colors = useThemeColors();\n const [imageFailed, setImageFailed] = useState(false);\n const dim = SIZE_PX[size];\n const showImage = src !== undefined && src.length > 0 && !imageFailed;\n\n const containerStyle: ViewStyle = {\n width: dim,\n height: dim,\n borderRadius: dim / 2,\n backgroundColor: colors.semantic.background.subtle,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n };\n\n const imageStyle: ImageStyle = {\n width: dim,\n height: dim,\n };\n\n const initials = initialsFromName(name);\n const accessibilityLabel = name ?? 'Avatar';\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"image\"\n accessibilityLabel={accessibilityLabel}\n aria-label={accessibilityLabel}\n className={cn('rounded-full overflow-hidden bg-neutral-200 items-center justify-center', className)}\n style={containerStyle}\n >\n {showImage ? (\n <RNImage\n source={{ uri: src }}\n style={imageStyle}\n accessibilityLabel={accessibilityLabel}\n onError={() => setImageFailed(true)}\n />\n ) : fallback !== undefined ? (\n fallback\n ) : initials.length > 0 ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize[FALLBACK_FONT_KEY[size]]),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n >\n {initials}\n </RNText>\n ) : (\n <View\n style={{\n width: dim * 0.45,\n height: dim * 0.45,\n borderRadius: dim,\n backgroundColor: colors.semantic.text.muted,\n }}\n />\n )}\n </View>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { wrapStringChildren } from './chunk-JQQ3FBN7.js';
1
+ import { wrapStringChildren } from './chunk-VLZANXRZ.js';
2
2
  import { cn } from './chunk-CHXHRJNZ.js';
3
3
  import { __name } from './chunk-WCQVDF3K.js';
4
4
  import { View } from 'react-native';
@@ -11,5 +11,5 @@ var Box = /* @__PURE__ */ __name(({ className, children, flex, style, ...rest })
11
11
  }, "Box");
12
12
 
13
13
  export { Box };
14
- //# sourceMappingURL=chunk-TLS54G6Y.js.map
15
- //# sourceMappingURL=chunk-TLS54G6Y.js.map
14
+ //# sourceMappingURL=chunk-IWM2XDXH.js.map
15
+ //# sourceMappingURL=chunk-IWM2XDXH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Box/Box.tsx"],"names":[],"mappings":";;;;;;AAwBO,IAAM,GAAA,2BAAO,EAAE,SAAA,EAAW,UAAU,IAAA,EAAM,KAAA,EAAO,GAAG,IAAA,EAAK,KAAgB;AAC5E,EAAA,MAAM,SAAA,GAAmC,IAAA,KAAS,MAAA,GAAY,MAAA,GAAY,EAAE,IAAA,EAAK;AACjF,EAAA,MAAM,MAAA,GAAS,cAAc,MAAA,GAAY,KAAA,GAAQ,UAAU,MAAA,GAAY,SAAA,GAAY,CAAC,SAAA,EAAW,KAAK,CAAA;AACpG,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAM,GAAG,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAG,KAAA,EAAO,MAAA,EAC5C,QAAA,EAAA,kBAAA,CAAmB,QAAQ,CAAA,EAChC,CAAA;AAER,CAAA,EARmB,KAAA","file":"chunk-TLS54G6Y.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\n\nexport type BoxProps = ViewProps & {\n className?: string;\n testID?: string;\n /**\n * Flex grow factor for proportional layouts inside HStack / VStack.\n *\n * In an HStack with three children of `flex={1}`, each takes one third\n * of the available width. For a 20/60/20 split: `flex={1}`, `flex={3}`,\n * `flex={1}` — the values are ratios, not percentages.\n *\n * Maps directly to React Native / web flexbox `flex` style.\n */\n flex?: number;\n};\n\n/**\n * Generic layout primitive. Wraps react-native's `<View>` with className\n * support and a `flex` prop for proportional layouts. RSC-safe.\n */\nexport const Box = ({ className, children, flex, style, ...rest }: BoxProps) => {\n const flexStyle: ViewStyle | undefined = flex === undefined ? undefined : { flex };\n const merged = flexStyle === undefined ? style : style === undefined ? flexStyle : [flexStyle, style];\n return (\n <View {...rest} className={cn(className)} style={merged}>\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Box/Box.tsx"],"names":[],"mappings":";;;;;;AAwBO,IAAM,GAAA,2BAAO,EAAE,SAAA,EAAW,UAAU,IAAA,EAAM,KAAA,EAAO,GAAG,IAAA,EAAK,KAAgB;AAC5E,EAAA,MAAM,SAAA,GAAmC,IAAA,KAAS,MAAA,GAAY,MAAA,GAAY,EAAE,IAAA,EAAK;AACjF,EAAA,MAAM,MAAA,GAAS,cAAc,MAAA,GAAY,KAAA,GAAQ,UAAU,MAAA,GAAY,SAAA,GAAY,CAAC,SAAA,EAAW,KAAK,CAAA;AACpG,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAM,GAAG,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAG,KAAA,EAAO,MAAA,EAC5C,QAAA,EAAA,kBAAA,CAAmB,QAAQ,CAAA,EAChC,CAAA;AAER,CAAA,EARmB,KAAA","file":"chunk-IWM2XDXH.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\n\nexport type BoxProps = ViewProps & {\n className?: string;\n testID?: string;\n /**\n * Flex grow factor for proportional layouts inside HStack / VStack.\n *\n * In an HStack with three children of `flex={1}`, each takes one third\n * of the available width. For a 20/60/20 split: `flex={1}`, `flex={3}`,\n * `flex={1}` — the values are ratios, not percentages.\n *\n * Maps directly to React Native / web flexbox `flex` style.\n */\n flex?: number;\n};\n\n/**\n * Generic layout primitive. Wraps react-native's `<View>` with className\n * support and a `flex` prop for proportional layouts. RSC-safe.\n */\nexport const Box = ({ className, children, flex, style, ...rest }: BoxProps) => {\n const flexStyle: ViewStyle | undefined = flex === undefined ? undefined : { flex };\n const merged = flexStyle === undefined ? style : style === undefined ? flexStyle : [flexStyle, style];\n return (\n <View {...rest} className={cn(className)} style={merged}>\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
@@ -0,0 +1,118 @@
1
+ import { px } from './chunk-5A2QOOVN.js';
2
+ import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
+ import { __name } from './chunk-WCQVDF3K.js';
5
+ import { View, Text, Pressable } from 'react-native';
6
+ import { jsxs, Fragment, jsx } from 'nativewind/jsx-runtime';
7
+
8
+ var Item = /* @__PURE__ */ __name(({
9
+ leading,
10
+ title,
11
+ description,
12
+ trailing,
13
+ chevron = false,
14
+ onPress,
15
+ disabled = false,
16
+ className,
17
+ testID
18
+ }) => {
19
+ const colors = useThemeColors();
20
+ const isTappable = onPress !== void 0;
21
+ const rowStyle = {
22
+ flexDirection: "row",
23
+ alignItems: "center",
24
+ gap: px(colors.spacing["3"]),
25
+ paddingVertical: px(colors.spacing["3"]),
26
+ paddingHorizontal: px(colors.spacing["4"]),
27
+ minHeight: 52,
28
+ opacity: disabled ? 0.5 : 1
29
+ };
30
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
31
+ leading != null ? /* @__PURE__ */ jsx(View, { style: { flexShrink: 0 }, children: leading }) : null,
32
+ /* @__PURE__ */ jsxs(View, { style: { flex: 1, flexDirection: "column", gap: 2 }, children: [
33
+ typeof title === "string" ? /* @__PURE__ */ jsx(
34
+ Text,
35
+ {
36
+ style: {
37
+ color: colors.semantic.text.default,
38
+ fontFamily: colors.fontFamily.body,
39
+ fontSize: px(colors.fontSize.sm),
40
+ fontWeight: colors.fontWeight.medium
41
+ },
42
+ numberOfLines: 1,
43
+ children: title
44
+ }
45
+ ) : title,
46
+ description != null ? typeof description === "string" ? /* @__PURE__ */ jsx(
47
+ Text,
48
+ {
49
+ style: {
50
+ color: colors.semantic.text.muted,
51
+ fontFamily: colors.fontFamily.body,
52
+ fontSize: px(colors.fontSize.xs)
53
+ },
54
+ numberOfLines: 1,
55
+ children: description
56
+ }
57
+ ) : description : null
58
+ ] }),
59
+ trailing != null ? /* @__PURE__ */ jsx(View, { style: { flexShrink: 0 }, children: trailing }) : null,
60
+ chevron ? /* @__PURE__ */ jsx(
61
+ View,
62
+ {
63
+ style: { flexShrink: 0 },
64
+ "aria-hidden": true,
65
+ testID: testID != null ? `${testID}-chevron` : void 0,
66
+ children: /* @__PURE__ */ jsx(
67
+ Text,
68
+ {
69
+ accessibilityElementsHidden: true,
70
+ importantForAccessibility: "no-hide-descendants",
71
+ style: {
72
+ fontSize: 14,
73
+ lineHeight: 16,
74
+ color: colors.semantic.text.muted,
75
+ // On web rn-web passes style through — transform
76
+ // with a rotate is the lightest-weight approach
77
+ // that avoids importing the full SVG icon set.
78
+ transform: [{ rotate: "-90deg" }]
79
+ },
80
+ children: "\u2304"
81
+ }
82
+ )
83
+ }
84
+ ) : null
85
+ ] });
86
+ if (isTappable) {
87
+ return /* @__PURE__ */ jsx(
88
+ Pressable,
89
+ {
90
+ ...testID !== void 0 ? { testID } : {},
91
+ role: "button",
92
+ accessibilityRole: "button",
93
+ disabled,
94
+ onPress: disabled ? void 0 : onPress,
95
+ className: cn(
96
+ "flex-row items-center",
97
+ disabled ? "opacity-50" : "hover:bg-semantic-background-subtle active:bg-semantic-border-default",
98
+ className
99
+ ),
100
+ style: rowStyle,
101
+ children: content
102
+ }
103
+ );
104
+ }
105
+ return /* @__PURE__ */ jsx(
106
+ View,
107
+ {
108
+ ...testID !== void 0 ? { testID } : {},
109
+ className: cn("flex-row items-center", className),
110
+ style: rowStyle,
111
+ children: content
112
+ }
113
+ );
114
+ }, "Item");
115
+
116
+ export { Item };
117
+ //# sourceMappingURL=chunk-J5LK2XHE.js.map
118
+ //# sourceMappingURL=chunk-J5LK2XHE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Item/Item.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-J5LK2XHE.js","sourcesContent":["'use client';\n\nimport type { ReactNode } 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 ItemProps = {\n /** Leading slot — typically an Icon, Avatar, or image. */\n leading?: ReactNode;\n /** Primary label. Accepts a string or any ReactNode. */\n title: ReactNode;\n /** Secondary label rendered below the title. */\n description?: ReactNode;\n /** Trailing slot — value text, badge, icon, etc. */\n trailing?: ReactNode;\n /** Show a chevron-right arrow at the far end. Useful for navigation rows. */\n chevron?: boolean;\n /** Makes the row tappable. */\n onPress?: () => void;\n disabled?: boolean;\n className?: string;\n testID?: string;\n};\n\n/**\n * A generic list row primitive. Composes four horizontal zones:\n * `leading | title + description (stacked) | trailing | chevron`.\n *\n * All zones except `title` are optional. The row becomes tappable\n * when `onPress` is provided.\n *\n * ```tsx\n * <Item\n * leading={<Avatar src={user.avatar} />}\n * title={user.name}\n * description={user.email}\n * chevron\n * onPress={() => navigate(`/users/${user.id}`)}\n * />\n * ```\n */\nexport const Item = ({\n leading,\n title,\n description,\n trailing,\n chevron = false,\n onPress,\n disabled = false,\n className,\n testID,\n}: ItemProps) => {\n const colors = useThemeColors();\n const isTappable = onPress !== undefined;\n\n const rowStyle: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n gap: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['3']),\n paddingHorizontal: px(colors.spacing['4']),\n minHeight: 52,\n opacity: disabled ? 0.5 : 1,\n };\n\n const content = (\n <>\n {leading != null ? <View style={{ flexShrink: 0 }}>{leading}</View> : null}\n\n <View style={{ flex: 1, flexDirection: 'column', gap: 2 }}>\n {typeof title === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n numberOfLines={1}\n >\n {title}\n </RNText>\n ) : (\n title\n )}\n\n {description != null ? (\n typeof description === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n }}\n numberOfLines={1}\n >\n {description}\n </RNText>\n ) : (\n description\n )\n ) : null}\n </View>\n\n {trailing != null ? <View style={{ flexShrink: 0 }}>{trailing}</View> : null}\n\n {chevron ? (\n <View\n style={{ flexShrink: 0 }}\n aria-hidden={true}\n testID={testID != null ? `${testID}-chevron` : undefined}\n >\n {/* chevronRight: rotate chevronDown 90° CCW */}\n <RNText\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={{\n fontSize: 14,\n lineHeight: 16,\n color: colors.semantic.text.muted,\n // On web rn-web passes style through — transform\n // with a rotate is the lightest-weight approach\n // that avoids importing the full SVG icon set.\n transform: [{ rotate: '-90deg' }],\n }}\n >\n ⌄\n </RNText>\n </View>\n ) : null}\n </>\n );\n\n if (isTappable) {\n return (\n <Pressable\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n disabled={disabled}\n onPress={disabled ? undefined : onPress}\n className={cn(\n 'flex-row items-center',\n disabled ? 'opacity-50' : 'hover:bg-semantic-background-subtle active:bg-semantic-border-default',\n className\n )}\n style={rowStyle}\n >\n {content}\n </Pressable>\n );\n }\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-row items-center', className)}\n style={rowStyle}\n >\n {content}\n </View>\n );\n};\n"]}
@@ -0,0 +1,27 @@
1
+ import { cn } from './chunk-CHXHRJNZ.js';
2
+ import { __name } from './chunk-WCQVDF3K.js';
3
+ import { View } from 'react-native';
4
+ import { jsx } from 'nativewind/jsx-runtime';
5
+
6
+ var BASE_STYLE = {
7
+ overflow: "hidden"
8
+ };
9
+ var AspectRatio = /* @__PURE__ */ __name(({ ratio, children, className, testID }) => {
10
+ const containerStyle = {
11
+ ...BASE_STYLE,
12
+ aspectRatio: ratio
13
+ };
14
+ return /* @__PURE__ */ jsx(
15
+ View,
16
+ {
17
+ ...testID !== void 0 ? { testID } : {},
18
+ className: cn("overflow-hidden", className),
19
+ style: containerStyle,
20
+ children
21
+ }
22
+ );
23
+ }, "AspectRatio");
24
+
25
+ export { AspectRatio };
26
+ //# sourceMappingURL=chunk-KFFGDET3.js.map
27
+ //# sourceMappingURL=chunk-KFFGDET3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AspectRatio/AspectRatio.tsx"],"names":[],"mappings":";;;;;AAqBA,IAAM,UAAA,GAAwB;AAAA,EAC1B,QAAA,EAAU;AACd,CAAA;AAaO,IAAM,8BAAc,MAAA,CAAA,CAAC,EAAE,OAAO,QAAA,EAAU,SAAA,EAAW,QAAO,KAAwB;AACrF,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,GAAG,UAAA;AAAA,IACH,WAAA,EAAa;AAAA,GACjB;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,MAC1C,KAAA,EAAO,cAAA;AAAA,MAEN;AAAA;AAAA,GACL;AAER,CAAA,EAf2B,aAAA","file":"chunk-KFFGDET3.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\n\nexport type AspectRatioProps = {\n /**\n * The ratio expressed as width / height. Common values:\n * - `16 / 9` (1.777…) — widescreen video\n * - `4 / 3` (1.333…) — classic photo\n * - `1` — square\n * - `2 / 3` (0.666…) — portrait\n */\n ratio: number;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst BASE_STYLE: ViewStyle = {\n overflow: 'hidden',\n};\n\n/**\n * Wraps children in a container that maintains a fixed width-to-height ratio.\n * Works identically on web and native — React Native's `aspectRatio` style\n * property maps to the CSS `aspect-ratio` property via react-native-web.\n *\n * ```tsx\n * <AspectRatio ratio={16 / 9}>\n * <Image source={src} style={{ width: '100%', height: '100%' }} />\n * </AspectRatio>\n * ```\n */\nexport const AspectRatio = ({ ratio, children, className, testID }: AspectRatioProps) => {\n const containerStyle: ViewStyle = {\n ...BASE_STYLE,\n aspectRatio: ratio,\n };\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('overflow-hidden', className)}\n style={containerStyle}\n >\n {children}\n </View>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { wrapStringChildren } from './chunk-JQQ3FBN7.js';
1
+ import { wrapStringChildren } from './chunk-VLZANXRZ.js';
2
2
  import { cn } from './chunk-CHXHRJNZ.js';
3
3
  import { __name } from './chunk-WCQVDF3K.js';
4
4
  import { View } from 'react-native';
@@ -76,5 +76,5 @@ var VStack = /* @__PURE__ */ __name(({ gap, align, justify, className, children,
76
76
  }, "VStack");
77
77
 
78
78
  export { VStack };
79
- //# sourceMappingURL=chunk-MRJWPRCX.js.map
80
- //# sourceMappingURL=chunk-MRJWPRCX.js.map
79
+ //# sourceMappingURL=chunk-L6VYDM7S.js.map
80
+ //# sourceMappingURL=chunk-L6VYDM7S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/VStack/VStack.tsx"],"names":[],"mappings":";;;;;;AAcA,IAAM,WAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC7D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAAmE;AAAA,EACrE,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,MAAA,GAAmC;AAAA,EACrC,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAOO,IAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,GAAG,IAAA,EAAK,KAAmB;AACjG,EAAA,MAAM,MAAA,GAAoB,EAAE,aAAA,EAAe,QAAA,EAAS;AACpD,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,MAAA,CAAO,UAAA,GAAa,YAAY,KAAK,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAc,OAAO,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAU,CAAC,QAAQ,KAAK,CAAA;AAC7D,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAY,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAY,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC,6BAAmB,QAAQ;AAAA;AAAA,GAChC;AAER,CAAA,EA3BsB,QAAA","file":"chunk-MRJWPRCX.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\nimport type { StackAlign, StackGap, StackJustify } from '../HStack/HStack';\n\nexport type VStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\nconst ALIGN_STYLE: Record<StackAlign, ViewStyle['alignItems']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\nconst JUSTIFY_STYLE: Record<StackJustify, ViewStyle['justifyContent']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\n\nconst GAP_PX: Record<StackGap, number> = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n};\n\n/**\n * Vertical flex layout primitive. RSC-safe.\n *\n * Layout is driven by inline style; see HStack for the rationale.\n */\nexport const VStack = ({ gap, align, justify, className, children, style, ...rest }: VStackProps) => {\n const inline: ViewStyle = { flexDirection: 'column' };\n if (gap !== undefined && gap !== 0) {\n inline.gap = GAP_PX[gap];\n }\n if (align !== undefined) {\n inline.alignItems = ALIGN_STYLE[align];\n }\n if (justify !== undefined) {\n inline.justifyContent = JUSTIFY_STYLE[justify];\n }\n const merged = style === undefined ? inline : ([inline, style] as ViewStyle[]);\n return (\n <View\n {...rest}\n style={merged}\n className={cn(\n 'flex-col',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/VStack/VStack.tsx"],"names":[],"mappings":";;;;;;AAcA,IAAM,WAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC7D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAAmE;AAAA,EACrE,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,MAAA,GAAmC;AAAA,EACrC,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAOO,IAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,GAAG,IAAA,EAAK,KAAmB;AACjG,EAAA,MAAM,MAAA,GAAoB,EAAE,aAAA,EAAe,QAAA,EAAS;AACpD,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,MAAA,CAAO,UAAA,GAAa,YAAY,KAAK,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAc,OAAO,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAU,CAAC,QAAQ,KAAK,CAAA;AAC7D,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAY,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAY,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC,6BAAmB,QAAQ;AAAA;AAAA,GAChC;AAER,CAAA,EA3BsB,QAAA","file":"chunk-L6VYDM7S.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\nimport type { StackAlign, StackGap, StackJustify } from '../HStack/HStack';\n\nexport type VStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\nconst ALIGN_STYLE: Record<StackAlign, ViewStyle['alignItems']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\nconst JUSTIFY_STYLE: Record<StackJustify, ViewStyle['justifyContent']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\n\nconst GAP_PX: Record<StackGap, number> = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n};\n\n/**\n * Vertical flex layout primitive. RSC-safe.\n *\n * Layout is driven by inline style; see HStack for the rationale.\n */\nexport const VStack = ({ gap, align, justify, className, children, style, ...rest }: VStackProps) => {\n const inline: ViewStyle = { flexDirection: 'column' };\n if (gap !== undefined && gap !== 0) {\n inline.gap = GAP_PX[gap];\n }\n if (align !== undefined) {\n inline.alignItems = ALIGN_STYLE[align];\n }\n if (justify !== undefined) {\n inline.justifyContent = JUSTIFY_STYLE[justify];\n }\n const merged = style === undefined ? inline : ([inline, style] as ViewStyle[]);\n return (\n <View\n {...rest}\n style={merged}\n className={cn(\n 'flex-col',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
@@ -0,0 +1,188 @@
1
+ import { px } from './chunk-5A2QOOVN.js';
2
+ import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
+ import { __name } from './chunk-WCQVDF3K.js';
5
+ import { createContext, useId, useState, useCallback, useMemo, useRef, useEffect, useContext } from 'react';
6
+ import { View, Platform, Pressable, Text } from 'react-native';
7
+ import { jsx } from 'nativewind/jsx-runtime';
8
+
9
+ var CollapsibleContext = createContext(null);
10
+ var useCollapsibleContext = /* @__PURE__ */ __name((label) => {
11
+ const ctx = useContext(CollapsibleContext);
12
+ if (!ctx) {
13
+ throw new Error(`<${label}> must be rendered inside a <Collapsible>.`);
14
+ }
15
+ return ctx;
16
+ }, "useCollapsibleContext");
17
+ var CollapsibleRoot = /* @__PURE__ */ __name(({
18
+ open: controlledOpen,
19
+ defaultOpen = false,
20
+ onOpenChange,
21
+ children,
22
+ className,
23
+ testID
24
+ }) => {
25
+ const baseId = useId();
26
+ const [innerOpen, setInnerOpen] = useState(defaultOpen);
27
+ const isControlled = controlledOpen !== void 0;
28
+ const open = isControlled ? controlledOpen : innerOpen;
29
+ const toggle = useCallback(() => {
30
+ const next = !open;
31
+ if (!isControlled) {
32
+ setInnerOpen(next);
33
+ }
34
+ onOpenChange?.(next);
35
+ }, [open, isControlled, onOpenChange]);
36
+ const ctx = useMemo(
37
+ () => ({
38
+ open,
39
+ toggle,
40
+ contentId: `${baseId}-content`,
41
+ triggerId: `${baseId}-trigger`
42
+ }),
43
+ [open, toggle, baseId]
44
+ );
45
+ return /* @__PURE__ */ jsx(CollapsibleContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
46
+ View,
47
+ {
48
+ ...testID !== void 0 ? { testID } : {},
49
+ className: cn("flex-col", className),
50
+ style: { flexDirection: "column" },
51
+ children
52
+ }
53
+ ) });
54
+ }, "CollapsibleRoot");
55
+ var CollapsibleTrigger = /* @__PURE__ */ __name(({ children, className, testID }) => {
56
+ const { open, toggle, contentId, triggerId } = useCollapsibleContext("Collapsible.Trigger");
57
+ const colors = useThemeColors();
58
+ const triggerStyle = {
59
+ flexDirection: "row",
60
+ alignItems: "center",
61
+ paddingVertical: px(colors.spacing["2"]),
62
+ paddingHorizontal: px(colors.spacing["1"])
63
+ };
64
+ return /* @__PURE__ */ jsx(
65
+ Pressable,
66
+ {
67
+ id: triggerId,
68
+ ...testID !== void 0 ? { testID } : {},
69
+ role: "button",
70
+ accessibilityRole: "button",
71
+ "aria-expanded": open,
72
+ "aria-controls": contentId,
73
+ onPress: toggle,
74
+ className: cn("flex-row items-center py-2 px-1", className),
75
+ style: triggerStyle,
76
+ children: typeof children === "string" ? /* @__PURE__ */ jsx(
77
+ Text,
78
+ {
79
+ style: {
80
+ color: colors.semantic.text.default,
81
+ fontFamily: colors.fontFamily.body,
82
+ fontSize: px(colors.fontSize.sm),
83
+ fontWeight: colors.fontWeight.medium
84
+ },
85
+ children
86
+ }
87
+ ) : children
88
+ }
89
+ );
90
+ }, "CollapsibleTrigger");
91
+ var CollapsibleContent = /* @__PURE__ */ __name(({ children, className, testID }) => {
92
+ const { open, contentId, triggerId } = useCollapsibleContext("Collapsible.Content");
93
+ const wrapperRef = useRef(null);
94
+ const innerRef = useRef(null);
95
+ useEffect(() => {
96
+ if (Platform.OS !== "web") {
97
+ return;
98
+ }
99
+ const wrapper = wrapperRef.current;
100
+ const inner = innerRef.current;
101
+ if (!wrapper || !inner) {
102
+ return;
103
+ }
104
+ const isFirstPaint = wrapper.dataset.noriPainted !== "1";
105
+ wrapper.dataset.noriPainted = "1";
106
+ wrapper.style.overflow = "hidden";
107
+ wrapper.style.transitionProperty = "max-height, opacity";
108
+ wrapper.style.transitionDuration = "200ms";
109
+ wrapper.style.transitionTimingFunction = "cubic-bezier(0.16, 1, 0.3, 1)";
110
+ if (open) {
111
+ const target = inner.scrollHeight;
112
+ if (isFirstPaint) {
113
+ wrapper.style.maxHeight = `${target}px`;
114
+ wrapper.style.opacity = "1";
115
+ return;
116
+ }
117
+ wrapper.style.maxHeight = "0px";
118
+ wrapper.style.opacity = "0";
119
+ void wrapper.offsetHeight;
120
+ requestAnimationFrame(() => {
121
+ wrapper.style.maxHeight = `${target}px`;
122
+ wrapper.style.opacity = "1";
123
+ });
124
+ } else {
125
+ if (isFirstPaint) {
126
+ wrapper.style.maxHeight = "0px";
127
+ wrapper.style.opacity = "0";
128
+ return;
129
+ }
130
+ const current = inner.scrollHeight;
131
+ wrapper.style.maxHeight = `${current}px`;
132
+ wrapper.style.opacity = "1";
133
+ void wrapper.offsetHeight;
134
+ requestAnimationFrame(() => {
135
+ wrapper.style.maxHeight = "0px";
136
+ wrapper.style.opacity = "0";
137
+ });
138
+ }
139
+ }, [open]);
140
+ if (Platform.OS !== "web") {
141
+ if (!open) {
142
+ return null;
143
+ }
144
+ return /* @__PURE__ */ jsx(
145
+ View,
146
+ {
147
+ ...testID !== void 0 ? { testID } : {},
148
+ id: contentId,
149
+ "aria-labelledby": triggerId,
150
+ className: cn("flex-col", className),
151
+ style: { flexDirection: "column" },
152
+ children
153
+ }
154
+ );
155
+ }
156
+ return /* @__PURE__ */ jsx(
157
+ View,
158
+ {
159
+ ref: (node) => {
160
+ wrapperRef.current = node;
161
+ },
162
+ ...testID !== void 0 ? { testID } : {},
163
+ id: contentId,
164
+ "aria-labelledby": triggerId,
165
+ "aria-hidden": !open,
166
+ className: cn("overflow-hidden", className),
167
+ children: /* @__PURE__ */ jsx(
168
+ View,
169
+ {
170
+ ref: (node) => {
171
+ innerRef.current = node;
172
+ },
173
+ className: "flex-col",
174
+ style: { flexDirection: "column" },
175
+ children
176
+ }
177
+ )
178
+ }
179
+ );
180
+ }, "CollapsibleContent");
181
+ var Collapsible = Object.assign(CollapsibleRoot, {
182
+ Trigger: CollapsibleTrigger,
183
+ Content: CollapsibleContent
184
+ });
185
+
186
+ export { Collapsible };
187
+ //# sourceMappingURL=chunk-M4BI63P6.js.map
188
+ //# sourceMappingURL=chunk-M4BI63P6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Collapsible/Collapsible.tsx"],"names":["RNText"],"mappings":";;;;;;;;AA8BA,IAAM,kBAAA,GAAqB,cAA8C,IAAI,CAAA;AAE7E,IAAM,qBAAA,2BAAyB,KAAA,KAA2C;AACtE,EAAA,MAAM,GAAA,GAAM,WAAW,kBAAkB,CAAA;AACzC,EAAA,IAAI,CAAC,GAAA,EAAK;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAA,EAAI,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACX,CAAA,EAN8B,uBAAA,CAAA;AAwB9B,IAAM,kCAAkB,MAAA,CAAA,CAAC;AAAA,EACrB,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACJ,CAAA,KAAwB;AACpB,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,WAAW,CAAA;AACtD,EAAA,MAAM,eAAe,cAAA,KAAmB,MAAA;AACxC,EAAA,MAAM,IAAA,GAAO,eAAe,cAAA,GAAiB,SAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC7B,IAAA,MAAM,OAAO,CAAC,IAAA;AACd,IAAA,IAAI,CAAC,YAAA,EAAc;AACf,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACrB;AACA,IAAA,YAAA,GAAe,IAAI,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,IAAA,EAAM,YAAA,EAAc,YAAY,CAAC,CAAA;AAErC,EAAA,MAAM,GAAA,GAAM,OAAA;AAAA,IACR,OAAO;AAAA,MACH,IAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,GAAG,MAAM,CAAA,QAAA,CAAA;AAAA,MACpB,SAAA,EAAW,GAAG,MAAM,CAAA,QAAA;AAAA,KACxB,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,MAAA,EAAQ,MAAM;AAAA,GACzB;AAEA,EAAA,uBACI,GAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAO,GAAA,EAChC,QAAA,kBAAA,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,MACnC,KAAA,EAAO,EAAE,aAAA,EAAe,QAAA,EAAS;AAAA,MAEhC;AAAA;AAAA,GACL,EACJ,CAAA;AAER,CAAA,EA1CwB,iBAAA,CAAA;AAsDxB,IAAM,qCAAqB,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAA+B;AACrF,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,SAAA,EAAU,GAAI,sBAAsB,qBAAqB,CAAA;AAC1F,EAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,EAAA,MAAM,YAAA,GAA0B;AAAA,IAC5B,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,eAAA,EAAiB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACvC,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC;AAAA,GAC7C;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,EAAA,EAAI,SAAA;AAAA,MACH,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,IAAA,EAAK,QAAA;AAAA,MACL,iBAAA,EAAkB,QAAA;AAAA,MAClB,eAAA,EAAe,IAAA;AAAA,MACf,eAAA,EAAe,SAAA;AAAA,MACf,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW,EAAA,CAAG,iCAAA,EAAmC,SAAS,CAAA;AAAA,MAC1D,KAAA,EAAO,YAAA;AAAA,MAEN,QAAA,EAAA,OAAO,aAAa,QAAA,mBACjB,GAAA;AAAA,QAACA,IAAA;AAAA,QAAA;AAAA,UACG,KAAA,EAAO;AAAA,YACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAA;AAAA,YAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,YAC9B,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,YAC/B,UAAA,EAAY,OAAO,UAAA,CAAW;AAAA,WAClC;AAAA,UAEC;AAAA;AAAA,OACL,GAEA;AAAA;AAAA,GAER;AAER,CAAA,EAvC2B,oBAAA,CAAA;AAmD3B,IAAM,qCAAqB,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAA+B;AACrF,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAU,GAAI,sBAAsB,qBAAqB,CAAA;AAClF,EAAA,MAAM,UAAA,GAAa,OAA2B,IAAI,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,OAA2B,IAAI,CAAA;AAGhD,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,EAAO;AACpB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,WAAA,KAAgB,GAAA;AACrD,IAAA,OAAA,CAAQ,QAAQ,WAAA,GAAc,GAAA;AAE9B,IAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,QAAA;AACzB,IAAA,OAAA,CAAQ,MAAM,kBAAA,GAAqB,qBAAA;AACnC,IAAA,OAAA,CAAQ,MAAM,kBAAA,GAAqB,OAAA;AACnC,IAAA,OAAA,CAAQ,MAAM,wBAAA,GAA2B,+BAAA;AAEzC,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,MAAM,SAAS,KAAA,CAAM,YAAA;AACrB,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AACnC,QAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,QAAA;AAAA,MACJ;AACA,MAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,KAAA;AAC1B,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,MAAA,KAAK,OAAA,CAAQ,YAAA;AACb,MAAA,qBAAA,CAAsB,MAAM;AACxB,QAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AACnC,QAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACL,CAAA,MAAO;AACH,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,KAAA;AAC1B,QAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,UAAU,KAAA,CAAM,YAAA;AACtB,MAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA;AACpC,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,MAAA,KAAK,OAAA,CAAQ,YAAA;AACb,MAAA,qBAAA,CAAsB,MAAM;AACxB,QAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,KAAA;AAC1B,QAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACL;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,uBACI,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,QAC1C,EAAA,EAAI,SAAA;AAAA,QACJ,iBAAA,EAAiB,SAAA;AAAA,QACjB,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,QACnC,KAAA,EAAO,EAAE,aAAA,EAAe,QAAA,EAAS;AAAA,QAEhC;AAAA;AAAA,KACL;AAAA,EAER;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,CAAC,IAAA,KAAkB;AACpB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACzB,CAAA;AAAA,MACC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,EAAA,EAAI,SAAA;AAAA,MACJ,iBAAA,EAAiB,SAAA;AAAA,MACjB,eAAa,CAAC,IAAA;AAAA,MACd,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,MAE1C,QAAA,kBAAA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,CAAC,IAAA,KAAkB;AACpB,YAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,UACvB,CAAA;AAAA,UACA,SAAA,EAAU,UAAA;AAAA,UACV,KAAA,EAAO,EAAE,aAAA,EAAe,QAAA,EAAS;AAAA,UAEhC;AAAA;AAAA;AACL;AAAA,GACJ;AAER,CAAA,EA/F2B,oBAAA,CAAA;AAyHpB,IAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,eAAA,EAAiB;AAAA,EACtD,OAAA,EAAS,kBAAA;AAAA,EACT,OAAA,EAAS;AACb,CAAC","file":"chunk-M4BI63P6.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Platform, 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\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype CollapsibleContextValue = {\n open: boolean;\n toggle: () => void;\n contentId: string;\n triggerId: string;\n};\n\nconst CollapsibleContext = createContext<CollapsibleContextValue | null>(null);\n\nconst useCollapsibleContext = (label: string): CollapsibleContextValue => {\n const ctx = useContext(CollapsibleContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Collapsible>.`);\n }\n return ctx;\n};\n\n// ---------------------------------------------------------------------------\n// Root\n// ---------------------------------------------------------------------------\n\nexport type CollapsibleProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst CollapsibleRoot = ({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n children,\n className,\n testID,\n}: CollapsibleProps) => {\n const baseId = useId();\n const [innerOpen, setInnerOpen] = useState(defaultOpen);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : innerOpen;\n\n const toggle = useCallback(() => {\n const next = !open;\n if (!isControlled) {\n setInnerOpen(next);\n }\n onOpenChange?.(next);\n }, [open, isControlled, onOpenChange]);\n\n const ctx = useMemo<CollapsibleContextValue>(\n () => ({\n open,\n toggle,\n contentId: `${baseId}-content`,\n triggerId: `${baseId}-trigger`,\n }),\n [open, toggle, baseId]\n );\n\n return (\n <CollapsibleContext.Provider value={ctx}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col', className)}\n style={{ flexDirection: 'column' }}\n >\n {children}\n </View>\n </CollapsibleContext.Provider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Trigger\n// ---------------------------------------------------------------------------\n\nexport type CollapsibleTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst CollapsibleTrigger = ({ children, className, testID }: CollapsibleTriggerProps) => {\n const { open, toggle, contentId, triggerId } = useCollapsibleContext('Collapsible.Trigger');\n const colors = useThemeColors();\n\n const triggerStyle: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: px(colors.spacing['2']),\n paddingHorizontal: px(colors.spacing['1']),\n };\n\n return (\n <Pressable\n id={triggerId}\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n aria-expanded={open}\n aria-controls={contentId}\n onPress={toggle}\n className={cn('flex-row items-center py-2 px-1', className)}\n style={triggerStyle}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </Pressable>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Content\n// ---------------------------------------------------------------------------\n\nexport type CollapsibleContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst CollapsibleContent = ({ children, className, testID }: CollapsibleContentProps) => {\n const { open, contentId, triggerId } = useCollapsibleContext('Collapsible.Content');\n const wrapperRef = useRef<HTMLElement | null>(null);\n const innerRef = useRef<HTMLElement | null>(null);\n\n // Web: animate max-height via CSS transition for smooth open/close.\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n const wrapper = wrapperRef.current;\n const inner = innerRef.current;\n if (!wrapper || !inner) {\n return;\n }\n\n const isFirstPaint = wrapper.dataset.noriPainted !== '1';\n wrapper.dataset.noriPainted = '1';\n\n wrapper.style.overflow = 'hidden';\n wrapper.style.transitionProperty = 'max-height, opacity';\n wrapper.style.transitionDuration = '200ms';\n wrapper.style.transitionTimingFunction = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n if (open) {\n const target = inner.scrollHeight;\n if (isFirstPaint) {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n return;\n }\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n });\n } else {\n if (isFirstPaint) {\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n return;\n }\n const current = inner.scrollHeight;\n wrapper.style.maxHeight = `${current}px`;\n wrapper.style.opacity = '1';\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n });\n }\n }, [open]);\n\n // Native: just toggle visibility. Animation deferred to v2.\n if (Platform.OS !== 'web') {\n if (!open) {\n return null;\n }\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n id={contentId}\n aria-labelledby={triggerId}\n className={cn('flex-col', className)}\n style={{ flexDirection: 'column' }}\n >\n {children}\n </View>\n );\n }\n\n return (\n <View\n ref={(node: unknown) => {\n wrapperRef.current = node as HTMLElement | null;\n }}\n {...(testID !== undefined ? { testID } : {})}\n id={contentId}\n aria-labelledby={triggerId}\n aria-hidden={!open}\n className={cn('overflow-hidden', className)}\n >\n <View\n ref={(node: unknown) => {\n innerRef.current = node as HTMLElement | null;\n }}\n className=\"flex-col\"\n style={{ flexDirection: 'column' }}\n >\n {children}\n </View>\n </View>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public export\n// ---------------------------------------------------------------------------\n\n/**\n * Single open/close disclosure. Compose with `Collapsible.Trigger` and\n * `Collapsible.Content`:\n *\n * ```tsx\n * <Collapsible>\n * <Collapsible.Trigger>Show details</Collapsible.Trigger>\n * <Collapsible.Content>\n * <Text>Hidden until the trigger is pressed.</Text>\n * </Collapsible.Content>\n * </Collapsible>\n * ```\n *\n * Controlled usage: pass `open` + `onOpenChange`. Uncontrolled: pass\n * `defaultOpen` (or neither for closed-by-default).\n *\n * On web, `Content` animates via a CSS max-height / opacity transition\n * (200ms). On native, the content mounts/unmounts immediately — animated\n * height transition is a v2 follow-up.\n */\nexport const Collapsible = Object.assign(CollapsibleRoot, {\n Trigger: CollapsibleTrigger,\n Content: CollapsibleContent,\n});\n"]}
@@ -1,8 +1,8 @@
1
- import { Popover, usePopoverContext } from './chunk-PZS4A4VQ.js';
1
+ import { Popover, usePopoverContext } from './chunk-HXCETKCC.js';
2
2
  import { Slot } from './chunk-ZIBNLXIV.js';
3
3
  import { px } from './chunk-5A2QOOVN.js';
4
- import { cn } from './chunk-CHXHRJNZ.js';
5
4
  import { useThemeColors } from './chunk-R5JMDDCB.js';
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';
8
8
  import { Platform, View, Pressable, Text } from 'react-native';
@@ -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-RUWD35UI.js.map
303
- //# sourceMappingURL=chunk-RUWD35UI.js.map
302
+ //# sourceMappingURL=chunk-MK57AOTI.js.map
303
+ //# sourceMappingURL=chunk-MK57AOTI.js.map