@coze-arch/cli 0.0.10 → 0.0.11

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 (437) hide show
  1. package/lib/__templates__/expo/AGENTS.md +3 -3
  2. package/lib/__templates__/expo/README.md +3 -3
  3. package/lib/__templates__/expo/client/components/Provider.tsx +4 -1
  4. package/lib/__templates__/expo/client/components/Screen.tsx +4 -1
  5. package/lib/__templates__/expo/client/eslint.config.mjs +2 -0
  6. package/lib/__templates__/expo/client/global.css +1 -0
  7. package/lib/__templates__/expo/client/heroui/components/accordion/accordion.animation.ts +178 -0
  8. package/lib/__templates__/expo/client/heroui/components/accordion/accordion.constants.ts +62 -0
  9. package/lib/__templates__/expo/client/heroui/components/accordion/accordion.md +437 -0
  10. package/lib/__templates__/expo/client/heroui/components/accordion/accordion.styles.ts +95 -0
  11. package/lib/__templates__/expo/client/heroui/components/accordion/accordion.tsx +340 -0
  12. package/lib/__templates__/expo/client/heroui/components/accordion/accordion.types.ts +267 -0
  13. package/lib/__templates__/expo/client/heroui/components/accordion/index.ts +17 -0
  14. package/lib/__templates__/expo/client/heroui/components/alert/alert.constants.ts +13 -0
  15. package/lib/__templates__/expo/client/heroui/components/alert/alert.hooks.ts +28 -0
  16. package/lib/__templates__/expo/client/heroui/components/alert/alert.md +263 -0
  17. package/lib/__templates__/expo/client/heroui/components/alert/alert.styles.ts +65 -0
  18. package/lib/__templates__/expo/client/heroui/components/alert/alert.tsx +181 -0
  19. package/lib/__templates__/expo/client/heroui/components/alert/alert.types.ts +99 -0
  20. package/lib/__templates__/expo/client/heroui/components/alert/alert.utils.tsx +25 -0
  21. package/lib/__templates__/expo/client/heroui/components/alert/default-icon.tsx +28 -0
  22. package/lib/__templates__/expo/client/heroui/components/alert/index.ts +15 -0
  23. package/lib/__templates__/expo/client/heroui/components/alert/success-icon.tsx +28 -0
  24. package/lib/__templates__/expo/client/heroui/components/alert/warning-icon.tsx +28 -0
  25. package/lib/__templates__/expo/client/heroui/components/avatar/avatar.animation.ts +123 -0
  26. package/lib/__templates__/expo/client/heroui/components/avatar/avatar.constants.ts +19 -0
  27. package/lib/__templates__/expo/client/heroui/components/avatar/avatar.context.ts +11 -0
  28. package/lib/__templates__/expo/client/heroui/components/avatar/avatar.md +386 -0
  29. package/lib/__templates__/expo/client/heroui/components/avatar/avatar.styles.ts +145 -0
  30. package/lib/__templates__/expo/client/heroui/components/avatar/avatar.tsx +307 -0
  31. package/lib/__templates__/expo/client/heroui/components/avatar/avatar.types.ts +239 -0
  32. package/lib/__templates__/expo/client/heroui/components/avatar/index.ts +13 -0
  33. package/lib/__templates__/expo/client/heroui/components/avatar/person-icon.tsx +23 -0
  34. package/lib/__templates__/expo/client/heroui/components/bottom-sheet/bottom-sheet.animation.ts +42 -0
  35. package/lib/__templates__/expo/client/heroui/components/bottom-sheet/bottom-sheet.constants.ts +13 -0
  36. package/lib/__templates__/expo/client/heroui/components/bottom-sheet/bottom-sheet.md +349 -0
  37. package/lib/__templates__/expo/client/heroui/components/bottom-sheet/bottom-sheet.styles.ts +66 -0
  38. package/lib/__templates__/expo/client/heroui/components/bottom-sheet/bottom-sheet.tsx +351 -0
  39. package/lib/__templates__/expo/client/heroui/components/bottom-sheet/bottom-sheet.types.ts +150 -0
  40. package/lib/__templates__/expo/client/heroui/components/bottom-sheet/index.ts +16 -0
  41. package/lib/__templates__/expo/client/heroui/components/button/button.constants.ts +7 -0
  42. package/lib/__templates__/expo/client/heroui/components/button/button.md +381 -0
  43. package/lib/__templates__/expo/client/heroui/components/button/button.styles.ts +89 -0
  44. package/lib/__templates__/expo/client/heroui/components/button/button.tsx +284 -0
  45. package/lib/__templates__/expo/client/heroui/components/button/button.types.ts +175 -0
  46. package/lib/__templates__/expo/client/heroui/components/button/button.utils.ts +34 -0
  47. package/lib/__templates__/expo/client/heroui/components/button/index.ts +9 -0
  48. package/lib/__templates__/expo/client/heroui/components/card/card.constants.ts +11 -0
  49. package/lib/__templates__/expo/client/heroui/components/card/card.md +186 -0
  50. package/lib/__templates__/expo/client/heroui/components/card/card.styles.ts +35 -0
  51. package/lib/__templates__/expo/client/heroui/components/card/card.tsx +153 -0
  52. package/lib/__templates__/expo/client/heroui/components/card/card.types.ts +77 -0
  53. package/lib/__templates__/expo/client/heroui/components/card/index.ts +10 -0
  54. package/lib/__templates__/expo/client/heroui/components/checkbox/checkbox.animation.ts +202 -0
  55. package/lib/__templates__/expo/client/heroui/components/checkbox/checkbox.constants.ts +6 -0
  56. package/lib/__templates__/expo/client/heroui/components/checkbox/checkbox.md +311 -0
  57. package/lib/__templates__/expo/client/heroui/components/checkbox/checkbox.styles.ts +105 -0
  58. package/lib/__templates__/expo/client/heroui/components/checkbox/checkbox.tsx +251 -0
  59. package/lib/__templates__/expo/client/heroui/components/checkbox/checkbox.types.ts +216 -0
  60. package/lib/__templates__/expo/client/heroui/components/checkbox/index.ts +3 -0
  61. package/lib/__templates__/expo/client/heroui/components/chip/chip.animation.ts +18 -0
  62. package/lib/__templates__/expo/client/heroui/components/chip/chip.constants.ts +7 -0
  63. package/lib/__templates__/expo/client/heroui/components/chip/chip.md +190 -0
  64. package/lib/__templates__/expo/client/heroui/components/chip/chip.styles.ts +234 -0
  65. package/lib/__templates__/expo/client/heroui/components/chip/chip.tsx +125 -0
  66. package/lib/__templates__/expo/client/heroui/components/chip/chip.types.ts +69 -0
  67. package/lib/__templates__/expo/client/heroui/components/chip/index.ts +3 -0
  68. package/lib/__templates__/expo/client/heroui/components/close-button/close-button.constants.ts +6 -0
  69. package/lib/__templates__/expo/client/heroui/components/close-button/close-button.md +109 -0
  70. package/lib/__templates__/expo/client/heroui/components/close-button/close-button.styles.ts +13 -0
  71. package/lib/__templates__/expo/client/heroui/components/close-button/close-button.tsx +57 -0
  72. package/lib/__templates__/expo/client/heroui/components/close-button/close-button.types.ts +30 -0
  73. package/lib/__templates__/expo/client/heroui/components/close-button/index.ts +6 -0
  74. package/lib/__templates__/expo/client/heroui/components/control-field/control-field.animation.ts +18 -0
  75. package/lib/__templates__/expo/client/heroui/components/control-field/control-field.constants.ts +7 -0
  76. package/lib/__templates__/expo/client/heroui/components/control-field/control-field.context.ts +14 -0
  77. package/lib/__templates__/expo/client/heroui/components/control-field/control-field.md +241 -0
  78. package/lib/__templates__/expo/client/heroui/components/control-field/control-field.styles.ts +15 -0
  79. package/lib/__templates__/expo/client/heroui/components/control-field/control-field.tsx +245 -0
  80. package/lib/__templates__/expo/client/heroui/components/control-field/control-field.types.ts +67 -0
  81. package/lib/__templates__/expo/client/heroui/components/control-field/index.ts +6 -0
  82. package/lib/__templates__/expo/client/heroui/components/description/description.animation.ts +53 -0
  83. package/lib/__templates__/expo/client/heroui/components/description/description.constants.ts +30 -0
  84. package/lib/__templates__/expo/client/heroui/components/description/description.md +129 -0
  85. package/lib/__templates__/expo/client/heroui/components/description/description.styles.ts +25 -0
  86. package/lib/__templates__/expo/client/heroui/components/description/description.tsx +81 -0
  87. package/lib/__templates__/expo/client/heroui/components/description/description.types.ts +77 -0
  88. package/lib/__templates__/expo/client/heroui/components/description/index.ts +3 -0
  89. package/lib/__templates__/expo/client/heroui/components/dialog/dialog.animation.ts +9 -0
  90. package/lib/__templates__/expo/client/heroui/components/dialog/dialog.constants.ts +13 -0
  91. package/lib/__templates__/expo/client/heroui/components/dialog/dialog.md +288 -0
  92. package/lib/__templates__/expo/client/heroui/components/dialog/dialog.styles.ts +77 -0
  93. package/lib/__templates__/expo/client/heroui/components/dialog/dialog.tsx +379 -0
  94. package/lib/__templates__/expo/client/heroui/components/dialog/dialog.types.ts +199 -0
  95. package/lib/__templates__/expo/client/heroui/components/dialog/index.ts +12 -0
  96. package/lib/__templates__/expo/client/heroui/components/field-error/field-error.animation.ts +50 -0
  97. package/lib/__templates__/expo/client/heroui/components/field-error/field-error.constants.ts +31 -0
  98. package/lib/__templates__/expo/client/heroui/components/field-error/field-error.md +204 -0
  99. package/lib/__templates__/expo/client/heroui/components/field-error/field-error.styles.ts +23 -0
  100. package/lib/__templates__/expo/client/heroui/components/field-error/field-error.tsx +91 -0
  101. package/lib/__templates__/expo/client/heroui/components/field-error/field-error.types.ts +79 -0
  102. package/lib/__templates__/expo/client/heroui/components/field-error/index.ts +3 -0
  103. package/lib/__templates__/expo/client/heroui/components/input/index.ts +3 -0
  104. package/lib/__templates__/expo/client/heroui/components/input/input.constants.ts +6 -0
  105. package/lib/__templates__/expo/client/heroui/components/input/input.md +193 -0
  106. package/lib/__templates__/expo/client/heroui/components/input/input.styles.ts +51 -0
  107. package/lib/__templates__/expo/client/heroui/components/input/input.tsx +96 -0
  108. package/lib/__templates__/expo/client/heroui/components/input/input.types.ts +44 -0
  109. package/lib/__templates__/expo/client/heroui/components/input-group/index.ts +9 -0
  110. package/lib/__templates__/expo/client/heroui/components/input-group/input-group.animation.ts +14 -0
  111. package/lib/__templates__/expo/client/heroui/components/input-group/input-group.constants.ts +6 -0
  112. package/lib/__templates__/expo/client/heroui/components/input-group/input-group.md +197 -0
  113. package/lib/__templates__/expo/client/heroui/components/input-group/input-group.styles.ts +31 -0
  114. package/lib/__templates__/expo/client/heroui/components/input-group/input-group.tsx +239 -0
  115. package/lib/__templates__/expo/client/heroui/components/input-group/input-group.types.ts +98 -0
  116. package/lib/__templates__/expo/client/heroui/components/input-otp/index.ts +9 -0
  117. package/lib/__templates__/expo/client/heroui/components/input-otp/input-otp.animation.ts +199 -0
  118. package/lib/__templates__/expo/client/heroui/components/input-otp/input-otp.constants.ts +12 -0
  119. package/lib/__templates__/expo/client/heroui/components/input-otp/input-otp.md +376 -0
  120. package/lib/__templates__/expo/client/heroui/components/input-otp/input-otp.styles.ts +68 -0
  121. package/lib/__templates__/expo/client/heroui/components/input-otp/input-otp.tsx +414 -0
  122. package/lib/__templates__/expo/client/heroui/components/input-otp/input-otp.types.ts +275 -0
  123. package/lib/__templates__/expo/client/heroui/components/label/index.ts +3 -0
  124. package/lib/__templates__/expo/client/heroui/components/label/label.animation.ts +18 -0
  125. package/lib/__templates__/expo/client/heroui/components/label/label.constants.ts +7 -0
  126. package/lib/__templates__/expo/client/heroui/components/label/label.md +187 -0
  127. package/lib/__templates__/expo/client/heroui/components/label/label.styles.ts +44 -0
  128. package/lib/__templates__/expo/client/heroui/components/label/label.tsx +172 -0
  129. package/lib/__templates__/expo/client/heroui/components/label/label.types.ts +86 -0
  130. package/lib/__templates__/expo/client/heroui/components/list-group/index.ts +17 -0
  131. package/lib/__templates__/expo/client/heroui/components/list-group/list-group.constants.ts +17 -0
  132. package/lib/__templates__/expo/client/heroui/components/list-group/list-group.md +387 -0
  133. package/lib/__templates__/expo/client/heroui/components/list-group/list-group.styles.ts +40 -0
  134. package/lib/__templates__/expo/client/heroui/components/list-group/list-group.tsx +206 -0
  135. package/lib/__templates__/expo/client/heroui/components/list-group/list-group.types.ts +132 -0
  136. package/lib/__templates__/expo/client/heroui/components/menu/index.ts +38 -0
  137. package/lib/__templates__/expo/client/heroui/components/menu/menu.animation.ts +121 -0
  138. package/lib/__templates__/expo/client/heroui/components/menu/menu.constants.ts +37 -0
  139. package/lib/__templates__/expo/client/heroui/components/menu/menu.md +620 -0
  140. package/lib/__templates__/expo/client/heroui/components/menu/menu.styles.ts +107 -0
  141. package/lib/__templates__/expo/client/heroui/components/menu/menu.tsx +664 -0
  142. package/lib/__templates__/expo/client/heroui/components/menu/menu.types.ts +394 -0
  143. package/lib/__templates__/expo/client/heroui/components/popover/arrow-svg.tsx +180 -0
  144. package/lib/__templates__/expo/client/heroui/components/popover/index.ts +18 -0
  145. package/lib/__templates__/expo/client/heroui/components/popover/popover.animation.ts +9 -0
  146. package/lib/__templates__/expo/client/heroui/components/popover/popover.constants.ts +34 -0
  147. package/lib/__templates__/expo/client/heroui/components/popover/popover.md +508 -0
  148. package/lib/__templates__/expo/client/heroui/components/popover/popover.styles.ts +98 -0
  149. package/lib/__templates__/expo/client/heroui/components/popover/popover.tsx +624 -0
  150. package/lib/__templates__/expo/client/heroui/components/popover/popover.types.ts +290 -0
  151. package/lib/__templates__/expo/client/heroui/components/pressable-feedback/index.ts +3 -0
  152. package/lib/__templates__/expo/client/heroui/components/pressable-feedback/pressable-feedback.animation.ts +450 -0
  153. package/lib/__templates__/expo/client/heroui/components/pressable-feedback/pressable-feedback.constants.ts +12 -0
  154. package/lib/__templates__/expo/client/heroui/components/pressable-feedback/pressable-feedback.md +328 -0
  155. package/lib/__templates__/expo/client/heroui/components/pressable-feedback/pressable-feedback.styles.ts +84 -0
  156. package/lib/__templates__/expo/client/heroui/components/pressable-feedback/pressable-feedback.tsx +330 -0
  157. package/lib/__templates__/expo/client/heroui/components/pressable-feedback/pressable-feedback.types.ts +386 -0
  158. package/lib/__templates__/expo/client/heroui/components/radio/index.ts +9 -0
  159. package/lib/__templates__/expo/client/heroui/components/radio/radio.animation.ts +92 -0
  160. package/lib/__templates__/expo/client/heroui/components/radio/radio.constants.ts +11 -0
  161. package/lib/__templates__/expo/client/heroui/components/radio/radio.md +339 -0
  162. package/lib/__templates__/expo/client/heroui/components/radio/radio.styles.ts +80 -0
  163. package/lib/__templates__/expo/client/heroui/components/radio/radio.tsx +217 -0
  164. package/lib/__templates__/expo/client/heroui/components/radio/radio.types.ts +106 -0
  165. package/lib/__templates__/expo/client/heroui/components/radio-group/index.ts +9 -0
  166. package/lib/__templates__/expo/client/heroui/components/radio-group/radio-group.animation.ts +20 -0
  167. package/lib/__templates__/expo/client/heroui/components/radio-group/radio-group.constants.ts +7 -0
  168. package/lib/__templates__/expo/client/heroui/components/radio-group/radio-group.context.ts +14 -0
  169. package/lib/__templates__/expo/client/heroui/components/radio-group/radio-group.md +273 -0
  170. package/lib/__templates__/expo/client/heroui/components/radio-group/radio-group.styles.ts +15 -0
  171. package/lib/__templates__/expo/client/heroui/components/radio-group/radio-group.tsx +220 -0
  172. package/lib/__templates__/expo/client/heroui/components/radio-group/radio-group.types.ts +64 -0
  173. package/lib/__templates__/expo/client/heroui/components/scroll-shadow/index.ts +7 -0
  174. package/lib/__templates__/expo/client/heroui/components/scroll-shadow/scroll-shadow.animation.ts +132 -0
  175. package/lib/__templates__/expo/client/heroui/components/scroll-shadow/scroll-shadow.constants.ts +21 -0
  176. package/lib/__templates__/expo/client/heroui/components/scroll-shadow/scroll-shadow.md +206 -0
  177. package/lib/__templates__/expo/client/heroui/components/scroll-shadow/scroll-shadow.styles.ts +52 -0
  178. package/lib/__templates__/expo/client/heroui/components/scroll-shadow/scroll-shadow.tsx +262 -0
  179. package/lib/__templates__/expo/client/heroui/components/scroll-shadow/scroll-shadow.types.ts +121 -0
  180. package/lib/__templates__/expo/client/heroui/components/search-field/index.ts +17 -0
  181. package/lib/__templates__/expo/client/heroui/components/search-field/search-field.animation.ts +18 -0
  182. package/lib/__templates__/expo/client/heroui/components/search-field/search-field.constants.ts +10 -0
  183. package/lib/__templates__/expo/client/heroui/components/search-field/search-field.md +231 -0
  184. package/lib/__templates__/expo/client/heroui/components/search-field/search-field.styles.ts +35 -0
  185. package/lib/__templates__/expo/client/heroui/components/search-field/search-field.tsx +253 -0
  186. package/lib/__templates__/expo/client/heroui/components/search-field/search-field.types.ts +160 -0
  187. package/lib/__templates__/expo/client/heroui/components/search-field/search-icon.tsx +37 -0
  188. package/lib/__templates__/expo/client/heroui/components/select/index.ts +28 -0
  189. package/lib/__templates__/expo/client/heroui/components/select/select.animation.ts +92 -0
  190. package/lib/__templates__/expo/client/heroui/components/select/select.constants.ts +53 -0
  191. package/lib/__templates__/expo/client/heroui/components/select/select.md +796 -0
  192. package/lib/__templates__/expo/client/heroui/components/select/select.styles.ts +149 -0
  193. package/lib/__templates__/expo/client/heroui/components/select/select.tsx +828 -0
  194. package/lib/__templates__/expo/client/heroui/components/select/select.types.ts +438 -0
  195. package/lib/__templates__/expo/client/heroui/components/separator/index.ts +7 -0
  196. package/lib/__templates__/expo/client/heroui/components/separator/separator.constants.ts +6 -0
  197. package/lib/__templates__/expo/client/heroui/components/separator/separator.md +106 -0
  198. package/lib/__templates__/expo/client/heroui/components/separator/separator.styles.ts +50 -0
  199. package/lib/__templates__/expo/client/heroui/components/separator/separator.tsx +62 -0
  200. package/lib/__templates__/expo/client/heroui/components/separator/separator.types.ts +40 -0
  201. package/lib/__templates__/expo/client/heroui/components/skeleton/index.ts +7 -0
  202. package/lib/__templates__/expo/client/heroui/components/skeleton/linear-gradient.tsx +45 -0
  203. package/lib/__templates__/expo/client/heroui/components/skeleton/skeleton.animation.ts +351 -0
  204. package/lib/__templates__/expo/client/heroui/components/skeleton/skeleton.constants.ts +39 -0
  205. package/lib/__templates__/expo/client/heroui/components/skeleton/skeleton.md +208 -0
  206. package/lib/__templates__/expo/client/heroui/components/skeleton/skeleton.styles.ts +49 -0
  207. package/lib/__templates__/expo/client/heroui/components/skeleton/skeleton.tsx +183 -0
  208. package/lib/__templates__/expo/client/heroui/components/skeleton/skeleton.types.ts +191 -0
  209. package/lib/__templates__/expo/client/heroui/components/skeleton-group/index.ts +7 -0
  210. package/lib/__templates__/expo/client/heroui/components/skeleton-group/skeleton-group.constants.ts +7 -0
  211. package/lib/__templates__/expo/client/heroui/components/skeleton-group/skeleton-group.md +247 -0
  212. package/lib/__templates__/expo/client/heroui/components/skeleton-group/skeleton-group.styles.ts +10 -0
  213. package/lib/__templates__/expo/client/heroui/components/skeleton-group/skeleton-group.tsx +94 -0
  214. package/lib/__templates__/expo/client/heroui/components/skeleton-group/skeleton-group.types.ts +28 -0
  215. package/lib/__templates__/expo/client/heroui/components/slider/index.ts +23 -0
  216. package/lib/__templates__/expo/client/heroui/components/slider/slider.animation.ts +87 -0
  217. package/lib/__templates__/expo/client/heroui/components/slider/slider.constants.ts +24 -0
  218. package/lib/__templates__/expo/client/heroui/components/slider/slider.md +348 -0
  219. package/lib/__templates__/expo/client/heroui/components/slider/slider.styles.ts +85 -0
  220. package/lib/__templates__/expo/client/heroui/components/slider/slider.tsx +413 -0
  221. package/lib/__templates__/expo/client/heroui/components/slider/slider.types.ts +120 -0
  222. package/lib/__templates__/expo/client/heroui/components/spinner/index.ts +10 -0
  223. package/lib/__templates__/expo/client/heroui/components/spinner/spinner-icon.tsx +49 -0
  224. package/lib/__templates__/expo/client/heroui/components/spinner/spinner.animation.ts +150 -0
  225. package/lib/__templates__/expo/client/heroui/components/spinner/spinner.constants.ts +36 -0
  226. package/lib/__templates__/expo/client/heroui/components/spinner/spinner.md +199 -0
  227. package/lib/__templates__/expo/client/heroui/components/spinner/spinner.styles.ts +44 -0
  228. package/lib/__templates__/expo/client/heroui/components/spinner/spinner.tsx +198 -0
  229. package/lib/__templates__/expo/client/heroui/components/spinner/spinner.types.ts +158 -0
  230. package/lib/__templates__/expo/client/heroui/components/surface/index.ts +3 -0
  231. package/lib/__templates__/expo/client/heroui/components/surface/surface.animation.ts +18 -0
  232. package/lib/__templates__/expo/client/heroui/components/surface/surface.constants.ts +6 -0
  233. package/lib/__templates__/expo/client/heroui/components/surface/surface.md +136 -0
  234. package/lib/__templates__/expo/client/heroui/components/surface/surface.styles.ts +28 -0
  235. package/lib/__templates__/expo/client/heroui/components/surface/surface.tsx +66 -0
  236. package/lib/__templates__/expo/client/heroui/components/surface/surface.types.ts +46 -0
  237. package/lib/__templates__/expo/client/heroui/components/switch/index.ts +3 -0
  238. package/lib/__templates__/expo/client/heroui/components/switch/switch.animation.ts +243 -0
  239. package/lib/__templates__/expo/client/heroui/components/switch/switch.constants.ts +26 -0
  240. package/lib/__templates__/expo/client/heroui/components/switch/switch.md +334 -0
  241. package/lib/__templates__/expo/client/heroui/components/switch/switch.styles.ts +83 -0
  242. package/lib/__templates__/expo/client/heroui/components/switch/switch.tsx +280 -0
  243. package/lib/__templates__/expo/client/heroui/components/switch/switch.types.ts +208 -0
  244. package/lib/__templates__/expo/client/heroui/components/tabs/index.ts +8 -0
  245. package/lib/__templates__/expo/client/heroui/components/tabs/tabs.animation.ts +246 -0
  246. package/lib/__templates__/expo/client/heroui/components/tabs/tabs.constants.ts +17 -0
  247. package/lib/__templates__/expo/client/heroui/components/tabs/tabs.context.ts +28 -0
  248. package/lib/__templates__/expo/client/heroui/components/tabs/tabs.md +565 -0
  249. package/lib/__templates__/expo/client/heroui/components/tabs/tabs.styles.ts +168 -0
  250. package/lib/__templates__/expo/client/heroui/components/tabs/tabs.tsx +445 -0
  251. package/lib/__templates__/expo/client/heroui/components/tabs/tabs.types.ts +341 -0
  252. package/lib/__templates__/expo/client/heroui/components/tag-group/index.ts +15 -0
  253. package/lib/__templates__/expo/client/heroui/components/tag-group/tag-group.animation.ts +17 -0
  254. package/lib/__templates__/expo/client/heroui/components/tag-group/tag-group.constants.ts +10 -0
  255. package/lib/__templates__/expo/client/heroui/components/tag-group/tag-group.md +404 -0
  256. package/lib/__templates__/expo/client/heroui/components/tag-group/tag-group.styles.ts +74 -0
  257. package/lib/__templates__/expo/client/heroui/components/tag-group/tag-group.tsx +325 -0
  258. package/lib/__templates__/expo/client/heroui/components/tag-group/tag-group.types.ts +125 -0
  259. package/lib/__templates__/expo/client/heroui/components/text-area/index.ts +3 -0
  260. package/lib/__templates__/expo/client/heroui/components/text-area/text-area.constants.ts +6 -0
  261. package/lib/__templates__/expo/client/heroui/components/text-area/text-area.md +133 -0
  262. package/lib/__templates__/expo/client/heroui/components/text-area/text-area.styles.ts +10 -0
  263. package/lib/__templates__/expo/client/heroui/components/text-area/text-area.tsx +44 -0
  264. package/lib/__templates__/expo/client/heroui/components/text-area/text-area.types.ts +6 -0
  265. package/lib/__templates__/expo/client/heroui/components/text-field/index.ts +3 -0
  266. package/lib/__templates__/expo/client/heroui/components/text-field/text-field.animation.ts +20 -0
  267. package/lib/__templates__/expo/client/heroui/components/text-field/text-field.constants.ts +6 -0
  268. package/lib/__templates__/expo/client/heroui/components/text-field/text-field.md +256 -0
  269. package/lib/__templates__/expo/client/heroui/components/text-field/text-field.styles.ts +10 -0
  270. package/lib/__templates__/expo/client/heroui/components/text-field/text-field.tsx +82 -0
  271. package/lib/__templates__/expo/client/heroui/components/text-field/text-field.types.ts +56 -0
  272. package/lib/__templates__/expo/client/heroui/components/toast/index.ts +4 -0
  273. package/lib/__templates__/expo/client/heroui/components/toast/toast.animation.ts +381 -0
  274. package/lib/__templates__/expo/client/heroui/components/toast/toast.constants.ts +10 -0
  275. package/lib/__templates__/expo/client/heroui/components/toast/toast.hooks.ts +73 -0
  276. package/lib/__templates__/expo/client/heroui/components/toast/toast.md +420 -0
  277. package/lib/__templates__/expo/client/heroui/components/toast/toast.styles.ts +89 -0
  278. package/lib/__templates__/expo/client/heroui/components/toast/toast.tsx +472 -0
  279. package/lib/__templates__/expo/client/heroui/components/toast/toast.types.ts +320 -0
  280. package/lib/__templates__/expo/client/heroui/docs.md +47 -0
  281. package/lib/__templates__/expo/client/heroui/helpers/external/hooks/index.ts +3 -0
  282. package/lib/__templates__/expo/client/heroui/helpers/external/hooks/use-is-on-surface.ts +8 -0
  283. package/lib/__templates__/expo/client/heroui/helpers/external/hooks/use-theme-color.ts +137 -0
  284. package/lib/__templates__/expo/client/heroui/helpers/external/utils/cn.ts +12 -0
  285. package/lib/__templates__/expo/client/heroui/helpers/external/utils/color-kit/index.ts +2395 -0
  286. package/lib/__templates__/expo/client/heroui/helpers/external/utils/color-kit/types.ts +212 -0
  287. package/lib/__templates__/expo/client/heroui/helpers/external/utils/index.ts +2 -0
  288. package/lib/__templates__/expo/client/heroui/helpers/internal/components/animated-check-icon.tsx +78 -0
  289. package/lib/__templates__/expo/client/heroui/helpers/internal/components/bottom-sheet-content-container.tsx +97 -0
  290. package/lib/__templates__/expo/client/heroui/helpers/internal/components/bottom-sheet-content.tsx +158 -0
  291. package/lib/__templates__/expo/client/heroui/helpers/internal/components/check-icon.tsx +28 -0
  292. package/lib/__templates__/expo/client/heroui/helpers/internal/components/chevron-down-icon.tsx +28 -0
  293. package/lib/__templates__/expo/client/heroui/helpers/internal/components/chevron-right-icon.tsx +29 -0
  294. package/lib/__templates__/expo/client/heroui/helpers/internal/components/close-icon.tsx +29 -0
  295. package/lib/__templates__/expo/client/heroui/helpers/internal/components/full-window-overlay.tsx +48 -0
  296. package/lib/__templates__/expo/client/heroui/helpers/internal/components/hero-text.tsx +71 -0
  297. package/lib/__templates__/expo/client/heroui/helpers/internal/components/index.ts +9 -0
  298. package/lib/__templates__/expo/client/heroui/helpers/internal/contexts/animation-settings-context.ts +19 -0
  299. package/lib/__templates__/expo/client/heroui/helpers/internal/contexts/bottom-sheet-is-dragging-context.ts +11 -0
  300. package/lib/__templates__/expo/client/heroui/helpers/internal/contexts/form-field-context.ts +36 -0
  301. package/lib/__templates__/expo/client/heroui/helpers/internal/contexts/index.ts +3 -0
  302. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/index.ts +14 -0
  303. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-augmented-ref.ts +32 -0
  304. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-bottom-sheet-aware-handlers.ts +94 -0
  305. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-bottom-sheet-gesture-handlers.ts +52 -0
  306. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-combined-animation-disabled-state.ts +49 -0
  307. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-controllable-state.ts +124 -0
  308. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-dev-info.ts +38 -0
  309. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-keyboard-status.ts +22 -0
  310. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-popup-bottom-sheet-content-animation.ts +67 -0
  311. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-popup-dialog-content-animation.ts +296 -0
  312. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-popup-overlay-animation.ts +91 -0
  313. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-popup-popover-content-animation.ts +199 -0
  314. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-popup-root-animation.ts +26 -0
  315. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-relative-position.ts +353 -0
  316. package/lib/__templates__/expo/client/heroui/helpers/internal/hooks/use-resolved-style-property.ts +118 -0
  317. package/lib/__templates__/expo/client/heroui/helpers/internal/types/animation.ts +131 -0
  318. package/lib/__templates__/expo/client/heroui/helpers/internal/types/bottom-sheet.ts +99 -0
  319. package/lib/__templates__/expo/client/heroui/helpers/internal/types/index.ts +5 -0
  320. package/lib/__templates__/expo/client/heroui/helpers/internal/types/misc.ts +10 -0
  321. package/lib/__templates__/expo/client/heroui/helpers/internal/types/primitives.ts +146 -0
  322. package/lib/__templates__/expo/client/heroui/helpers/internal/types/theme.ts +18 -0
  323. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/animation.ts +266 -0
  324. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/children-to-string.ts +117 -0
  325. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/combine-styles.ts +17 -0
  326. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/create-context.ts +60 -0
  327. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/ease-gradient/create-interpolation.ts +35 -0
  328. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/ease-gradient/index.ts +97 -0
  329. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/get-element-by-display-name.ts +15 -0
  330. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/get-element-with-default.ts +17 -0
  331. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/has-prop.ts +18 -0
  332. package/lib/__templates__/expo/client/heroui/helpers/internal/utils/index.ts +8 -0
  333. package/lib/__templates__/expo/client/heroui/index.tsx +51 -0
  334. package/lib/__templates__/expo/client/heroui/primitives/README.md +27 -0
  335. package/lib/__templates__/expo/client/heroui/primitives/accordion/accordion.tsx +270 -0
  336. package/lib/__templates__/expo/client/heroui/primitives/accordion/accordion.types.ts +117 -0
  337. package/lib/__templates__/expo/client/heroui/primitives/accordion/accordion.utils.ts +12 -0
  338. package/lib/__templates__/expo/client/heroui/primitives/accordion/index.ts +2 -0
  339. package/lib/__templates__/expo/client/heroui/primitives/activity-indicator/activity-indicator.tsx +50 -0
  340. package/lib/__templates__/expo/client/heroui/primitives/activity-indicator/activity-indicator.types.ts +24 -0
  341. package/lib/__templates__/expo/client/heroui/primitives/activity-indicator/index.ts +2 -0
  342. package/lib/__templates__/expo/client/heroui/primitives/alert/alert.tsx +124 -0
  343. package/lib/__templates__/expo/client/heroui/primitives/alert/alert.types.ts +87 -0
  344. package/lib/__templates__/expo/client/heroui/primitives/alert/index.ts +2 -0
  345. package/lib/__templates__/expo/client/heroui/primitives/avatar/avatar.tsx +171 -0
  346. package/lib/__templates__/expo/client/heroui/primitives/avatar/avatar.types.ts +62 -0
  347. package/lib/__templates__/expo/client/heroui/primitives/avatar/avatar.utils.ts +102 -0
  348. package/lib/__templates__/expo/client/heroui/primitives/avatar/index.ts +2 -0
  349. package/lib/__templates__/expo/client/heroui/primitives/bottom-sheet/bottom-sheet.tsx +235 -0
  350. package/lib/__templates__/expo/client/heroui/primitives/bottom-sheet/bottom-sheet.types.ts +127 -0
  351. package/lib/__templates__/expo/client/heroui/primitives/bottom-sheet/index.ts +2 -0
  352. package/lib/__templates__/expo/client/heroui/primitives/checkbox/checkbox.tsx +119 -0
  353. package/lib/__templates__/expo/client/heroui/primitives/checkbox/checkbox.types.ts +37 -0
  354. package/lib/__templates__/expo/client/heroui/primitives/checkbox/index.ts +2 -0
  355. package/lib/__templates__/expo/client/heroui/primitives/dialog/dialog.tsx +274 -0
  356. package/lib/__templates__/expo/client/heroui/primitives/dialog/dialog.types.ts +129 -0
  357. package/lib/__templates__/expo/client/heroui/primitives/dialog/index.ts +2 -0
  358. package/lib/__templates__/expo/client/heroui/primitives/input-otp/index.ts +3 -0
  359. package/lib/__templates__/expo/client/heroui/primitives/input-otp/input-otp.tsx +431 -0
  360. package/lib/__templates__/expo/client/heroui/primitives/input-otp/input-otp.types.ts +169 -0
  361. package/lib/__templates__/expo/client/heroui/primitives/input-otp/input-otp.utils.ts +31 -0
  362. package/lib/__templates__/expo/client/heroui/primitives/label/index.ts +2 -0
  363. package/lib/__templates__/expo/client/heroui/primitives/label/label.tsx +24 -0
  364. package/lib/__templates__/expo/client/heroui/primitives/label/label.types.ts +39 -0
  365. package/lib/__templates__/expo/client/heroui/primitives/menu/index.ts +2 -0
  366. package/lib/__templates__/expo/client/heroui/primitives/menu/menu.tsx +765 -0
  367. package/lib/__templates__/expo/client/heroui/primitives/menu/menu.types.ts +401 -0
  368. package/lib/__templates__/expo/client/heroui/primitives/popover/index.ts +2 -0
  369. package/lib/__templates__/expo/client/heroui/primitives/popover/popover.tsx +382 -0
  370. package/lib/__templates__/expo/client/heroui/primitives/popover/popover.types.ts +201 -0
  371. package/lib/__templates__/expo/client/heroui/primitives/portal/index.ts +1 -0
  372. package/lib/__templates__/expo/client/heroui/primitives/portal/portal.tsx +126 -0
  373. package/lib/__templates__/expo/client/heroui/primitives/radio/index.ts +2 -0
  374. package/lib/__templates__/expo/client/heroui/primitives/radio/radio.tsx +133 -0
  375. package/lib/__templates__/expo/client/heroui/primitives/radio/radio.types.ts +47 -0
  376. package/lib/__templates__/expo/client/heroui/primitives/radio-group/index.ts +2 -0
  377. package/lib/__templates__/expo/client/heroui/primitives/radio-group/radio-group.tsx +114 -0
  378. package/lib/__templates__/expo/client/heroui/primitives/radio-group/radio-group.types.ts +65 -0
  379. package/lib/__templates__/expo/client/heroui/primitives/select/index.ts +2 -0
  380. package/lib/__templates__/expo/client/heroui/primitives/select/select.tsx +705 -0
  381. package/lib/__templates__/expo/client/heroui/primitives/select/select.types.ts +409 -0
  382. package/lib/__templates__/expo/client/heroui/primitives/select/select.utils.ts +35 -0
  383. package/lib/__templates__/expo/client/heroui/primitives/slider/index.ts +3 -0
  384. package/lib/__templates__/expo/client/heroui/primitives/slider/slider.tsx +464 -0
  385. package/lib/__templates__/expo/client/heroui/primitives/slider/slider.types.ts +208 -0
  386. package/lib/__templates__/expo/client/heroui/primitives/slider/slider.utils.ts +93 -0
  387. package/lib/__templates__/expo/client/heroui/primitives/slot/index.ts +1 -0
  388. package/lib/__templates__/expo/client/heroui/primitives/slot/slot.tsx +122 -0
  389. package/lib/__templates__/expo/client/heroui/primitives/slot/types.ts +19 -0
  390. package/lib/__templates__/expo/client/heroui/primitives/slot/utils.ts +96 -0
  391. package/lib/__templates__/expo/client/heroui/primitives/switch/index.ts +2 -0
  392. package/lib/__templates__/expo/client/heroui/primitives/switch/switch.tsx +61 -0
  393. package/lib/__templates__/expo/client/heroui/primitives/switch/switch.types.ts +55 -0
  394. package/lib/__templates__/expo/client/heroui/primitives/tabs/index.ts +2 -0
  395. package/lib/__templates__/expo/client/heroui/primitives/tabs/tabs.tsx +202 -0
  396. package/lib/__templates__/expo/client/heroui/primitives/tabs/tabs.types.ts +77 -0
  397. package/lib/__templates__/expo/client/heroui/primitives/tag-group/index.ts +2 -0
  398. package/lib/__templates__/expo/client/heroui/primitives/tag-group/tag-group.tsx +324 -0
  399. package/lib/__templates__/expo/client/heroui/primitives/tag-group/tag-group.types.ts +119 -0
  400. package/lib/__templates__/expo/client/heroui/primitives/toast/index.ts +2 -0
  401. package/lib/__templates__/expo/client/heroui/primitives/toast/toast.tsx +138 -0
  402. package/lib/__templates__/expo/client/heroui/primitives/toast/toast.types.ts +86 -0
  403. package/lib/__templates__/expo/client/heroui/providers/animation-settings/index.ts +8 -0
  404. package/lib/__templates__/expo/client/heroui/providers/animation-settings/provider.tsx +47 -0
  405. package/lib/__templates__/expo/client/heroui/providers/animation-settings/types.ts +27 -0
  406. package/lib/__templates__/expo/client/heroui/providers/hero-ui-native/index.ts +2 -0
  407. package/lib/__templates__/expo/client/heroui/providers/hero-ui-native/provider.tsx +67 -0
  408. package/lib/__templates__/expo/client/heroui/providers/hero-ui-native/types.ts +114 -0
  409. package/lib/__templates__/expo/client/heroui/providers/hero-ui-native-raw/index.ts +2 -0
  410. package/lib/__templates__/expo/client/heroui/providers/hero-ui-native-raw/provider.tsx +50 -0
  411. package/lib/__templates__/expo/client/heroui/providers/hero-ui-native-raw/types.ts +39 -0
  412. package/lib/__templates__/expo/client/heroui/providers/text-component/index.ts +2 -0
  413. package/lib/__templates__/expo/client/heroui/providers/text-component/provider.tsx +9 -0
  414. package/lib/__templates__/expo/client/heroui/providers/text-component/types.ts +52 -0
  415. package/lib/__templates__/expo/client/heroui/providers/toast/index.ts +3 -0
  416. package/lib/__templates__/expo/client/heroui/providers/toast/insets-container.tsx +87 -0
  417. package/lib/__templates__/expo/client/heroui/providers/toast/provider.tsx +431 -0
  418. package/lib/__templates__/expo/client/heroui/providers/toast/reducer.ts +34 -0
  419. package/lib/__templates__/expo/client/heroui/providers/toast/toast-config.context.ts +27 -0
  420. package/lib/__templates__/expo/client/heroui/providers/toast/toast-item-renderer.tsx +45 -0
  421. package/lib/__templates__/expo/client/heroui/providers/toast/types.ts +373 -0
  422. package/lib/__templates__/expo/client/heroui/styles/index.css +3 -0
  423. package/lib/__templates__/expo/client/heroui/styles/theme.css +112 -0
  424. package/lib/__templates__/expo/client/heroui/styles/utilities.css +8 -0
  425. package/lib/__templates__/expo/client/heroui/styles/variables.css +146 -0
  426. package/lib/__templates__/expo/client/package.json +4 -1
  427. package/lib/__templates__/expo/package.json +1 -1
  428. package/lib/__templates__/expo/pnpm-lock.yaml +68 -0
  429. package/lib/__templates__/nextjs/AGENTS.md +6 -4
  430. package/lib/__templates__/nextjs/eslint.config.mjs +9 -0
  431. package/lib/__templates__/taro/.coze +2 -0
  432. package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +1 -2
  433. package/lib/__templates__/taro/config/index.ts +1 -1
  434. package/lib/__templates__/taro/package.json +1 -0
  435. package/lib/__templates__/taro/project.config.json +1 -1
  436. package/lib/cli.js +246 -252
  437. package/package.json +3 -2
@@ -0,0 +1,765 @@
1
+ import React, {
2
+ createContext,
3
+ forwardRef,
4
+ useCallback,
5
+ useContext,
6
+ useEffect,
7
+ useId,
8
+ useMemo,
9
+ useState,
10
+ } from 'react';
11
+ import {
12
+ BackHandler,
13
+ Pressable,
14
+ Text,
15
+ View,
16
+ type GestureResponderEvent,
17
+ type LayoutChangeEvent,
18
+ type LayoutRectangle,
19
+ } from 'react-native';
20
+ import {
21
+ useAugmentedRef,
22
+ useControllableState,
23
+ useRelativePosition,
24
+ type LayoutPosition,
25
+ } from '../../helpers/internal/hooks';
26
+ import { Portal as PrimitivePortal } from '../portal';
27
+ import * as Slot from '../slot';
28
+ import type {
29
+ CloseProps,
30
+ CloseRef,
31
+ ContentProps,
32
+ ContentRef,
33
+ GroupContextValue,
34
+ GroupProps,
35
+ GroupRef,
36
+ IItemContext,
37
+ IRootContext,
38
+ ItemDescriptionProps,
39
+ ItemDescriptionRef,
40
+ ItemIndicatorProps,
41
+ ItemIndicatorRef,
42
+ ItemProps,
43
+ ItemRef,
44
+ ItemTitleProps,
45
+ ItemTitleRef,
46
+ LabelProps,
47
+ LabelRef,
48
+ MenuKey,
49
+ OverlayProps,
50
+ OverlayRef,
51
+ PortalProps,
52
+ RootProps,
53
+ RootRef,
54
+ TriggerProps,
55
+ TriggerRef,
56
+ } from './menu.types';
57
+
58
+ const RootContext = React.createContext<IRootContext | null>(null);
59
+
60
+ const useRootContext = () => {
61
+ const context = useContext(RootContext);
62
+ if (!context) {
63
+ throw new Error(
64
+ 'Menu compound components cannot be rendered outside the Menu component'
65
+ );
66
+ }
67
+ return context;
68
+ };
69
+
70
+ const Root = forwardRef<RootRef, RootProps>(
71
+ (
72
+ {
73
+ asChild,
74
+ isOpen: isOpenProp,
75
+ isDefaultOpen,
76
+ onOpenChange: onOpenChangeProp,
77
+ isDisabled,
78
+ presentation = 'popover',
79
+ ...viewProps
80
+ },
81
+ ref
82
+ ) => {
83
+ const [isOpen = false, onOpenChange] = useControllableState({
84
+ prop: isOpenProp,
85
+ defaultProp: isDefaultOpen,
86
+ onChange: onOpenChangeProp,
87
+ });
88
+ const [triggerPosition, setTriggerPosition] =
89
+ useState<LayoutPosition | null>(null);
90
+ const [contentLayout, setContentLayout] = useState<LayoutRectangle | null>(
91
+ null
92
+ );
93
+
94
+ const nativeID = useId();
95
+
96
+ const Component = asChild ? Slot.View : View;
97
+ return (
98
+ <RootContext.Provider
99
+ value={{
100
+ isOpen,
101
+ onOpenChange,
102
+ isDisabled,
103
+ contentLayout,
104
+ nativeID,
105
+ setContentLayout,
106
+ setTriggerPosition,
107
+ triggerPosition,
108
+ isDefaultOpen,
109
+ presentation,
110
+ }}
111
+ >
112
+ <Component ref={ref} {...viewProps} />
113
+ </RootContext.Provider>
114
+ );
115
+ }
116
+ );
117
+
118
+ // --------------------------------------------------
119
+
120
+ const Trigger = forwardRef<TriggerRef, TriggerProps>(
121
+ ({ asChild, onPress: onPressProp, isDisabled = false, ...props }, ref) => {
122
+ const {
123
+ onOpenChange,
124
+ isOpen,
125
+ isDisabled: isDisabledRoot,
126
+ setTriggerPosition,
127
+ setContentLayout,
128
+ isDefaultOpen,
129
+ triggerPosition,
130
+ } = useRootContext();
131
+
132
+ const isDisabledValue = isDisabled ?? isDisabledRoot ?? undefined;
133
+
134
+ const augmentedRef = useAugmentedRef({
135
+ ref,
136
+ methods: {
137
+ open: () => {
138
+ augmentedRef.current?.measure(
139
+ (_x, _y, width, height, pageX, pageY) => {
140
+ setTriggerPosition({ width, pageX, pageY: pageY, height });
141
+ }
142
+ );
143
+ onOpenChange(true);
144
+ },
145
+ close: () => {
146
+ onOpenChange(false);
147
+ setTriggerPosition(null);
148
+ setContentLayout(null);
149
+ },
150
+ },
151
+ deps: [isOpen],
152
+ });
153
+
154
+ // Open menu on mount if isDefaultOpen is true
155
+ useEffect(() => {
156
+ if ((isDefaultOpen || isOpen) && !triggerPosition) {
157
+ // Use setTimeout to ensure the component is mounted and can be measured
158
+ const timeoutId = setTimeout(() => {
159
+ augmentedRef.current?.measure(
160
+ (_x, _y, width, height, pageX, pageY) => {
161
+ setTriggerPosition({ width, pageX, pageY: pageY, height });
162
+ if (isDefaultOpen) {
163
+ onOpenChange(true);
164
+ }
165
+ }
166
+ );
167
+ }, 0);
168
+ return () => clearTimeout(timeoutId);
169
+ }
170
+ return undefined;
171
+ // eslint-disable-next-line react-hooks/exhaustive-deps
172
+ }, []);
173
+
174
+ function onPress(ev: GestureResponderEvent) {
175
+ augmentedRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
176
+ setTriggerPosition({ width, pageX, pageY, height });
177
+ });
178
+ onOpenChange(!isOpen);
179
+ onPressProp?.(ev);
180
+ }
181
+
182
+ const Component = asChild ? Slot.Pressable : Pressable;
183
+
184
+ return (
185
+ <Component
186
+ ref={augmentedRef}
187
+ aria-disabled={isDisabledValue}
188
+ role="button"
189
+ onPress={onPress}
190
+ disabled={isDisabledValue}
191
+ {...props}
192
+ />
193
+ );
194
+ }
195
+ );
196
+
197
+ // --------------------------------------------------
198
+
199
+ /**
200
+ * @warning when using a custom `<PortalHost />`, you might have to adjust the Content's offset to account for nav elements like headers.
201
+ */
202
+ function Portal({ forceMount, hostName, children }: PortalProps) {
203
+ const value = useRootContext();
204
+
205
+ const isBottomSheet = value.presentation === 'bottom-sheet';
206
+
207
+ if (!value.triggerPosition && !isBottomSheet) {
208
+ return null;
209
+ }
210
+
211
+ if (!forceMount && !isBottomSheet) {
212
+ if (!value.isOpen) {
213
+ return null;
214
+ }
215
+ }
216
+
217
+ return (
218
+ <PrimitivePortal hostName={hostName} name={`${value.nativeID}_menu_portal`}>
219
+ <RootContext.Provider value={value}>{children}</RootContext.Provider>
220
+ </PrimitivePortal>
221
+ );
222
+ }
223
+
224
+ // --------------------------------------------------
225
+
226
+ const Overlay = forwardRef<OverlayRef, OverlayProps>(
227
+ (
228
+ {
229
+ asChild,
230
+ forceMount,
231
+ onPress: OnPressProp,
232
+ closeOnPress = true,
233
+ ...props
234
+ },
235
+ ref
236
+ ) => {
237
+ const { isOpen, onOpenChange, setTriggerPosition, setContentLayout } =
238
+ useRootContext();
239
+
240
+ function onPress(ev: GestureResponderEvent) {
241
+ if (closeOnPress) {
242
+ onOpenChange(false);
243
+ setTriggerPosition(null);
244
+ setContentLayout(null);
245
+ }
246
+ OnPressProp?.(ev);
247
+ }
248
+
249
+ if (!forceMount) {
250
+ if (!isOpen) {
251
+ return null;
252
+ }
253
+ }
254
+
255
+ const Component = asChild ? Slot.Pressable : Pressable;
256
+
257
+ return <Component ref={ref} onPress={onPress} {...props} />;
258
+ }
259
+ );
260
+
261
+ // --------------------------------------------------
262
+
263
+ /**
264
+ * @info `position`, `top`, `left`, and `maxWidth` style properties are controlled internally. Opt out of this behavior by setting `disablePositioningStyle` to `true`.
265
+ */
266
+ const Content = forwardRef<ContentRef, ContentProps>(
267
+ (
268
+ {
269
+ asChild = false,
270
+ forceMount,
271
+ align = 'start',
272
+ placement = 'bottom',
273
+ offset = 0,
274
+ alignOffset = 0,
275
+ avoidCollisions = true,
276
+ onLayout: onLayoutProp,
277
+ insets,
278
+ style,
279
+ disablePositioningStyle,
280
+ width = 'content-fit',
281
+ ...props
282
+ },
283
+ ref
284
+ ) => {
285
+ const {
286
+ isOpen,
287
+ onOpenChange,
288
+ contentLayout,
289
+ nativeID,
290
+ setContentLayout,
291
+ setTriggerPosition,
292
+ triggerPosition,
293
+ } = useRootContext();
294
+
295
+ useEffect(() => {
296
+ const backHandler = BackHandler.addEventListener(
297
+ 'hardwareBackPress',
298
+ () => {
299
+ onOpenChange(false);
300
+ setTriggerPosition(null);
301
+ setContentLayout(null);
302
+ return true;
303
+ }
304
+ );
305
+
306
+ return () => {
307
+ setContentLayout(null);
308
+ backHandler.remove();
309
+ };
310
+ // eslint-disable-next-line react-hooks/exhaustive-deps
311
+ }, []);
312
+
313
+ const positionStyle = useRelativePosition({
314
+ align,
315
+ avoidCollisions,
316
+ triggerPosition,
317
+ contentLayout,
318
+ alignOffset,
319
+ insets,
320
+ offset,
321
+ placement,
322
+ disablePositioningStyle,
323
+ });
324
+
325
+ // Calculate content width based on width prop
326
+ const widthStyle: { width?: number | `${number}%` } = {};
327
+ if (width === 'trigger' && triggerPosition) {
328
+ widthStyle.width = triggerPosition.width;
329
+ } else if (width === 'full') {
330
+ widthStyle.width = '100%';
331
+ } else if (typeof width === 'number') {
332
+ widthStyle.width = width;
333
+ }
334
+ // 'content-fit' is default - no explicit width set
335
+
336
+ function onLayout(event: LayoutChangeEvent) {
337
+ setContentLayout(event.nativeEvent.layout);
338
+ onLayoutProp?.(event);
339
+ }
340
+
341
+ if (!forceMount) {
342
+ if (!isOpen) {
343
+ return null;
344
+ }
345
+ }
346
+
347
+ const Component = asChild ? Slot.View : View;
348
+
349
+ return (
350
+ <Component
351
+ ref={ref}
352
+ role="menu"
353
+ nativeID={nativeID}
354
+ aria-modal={true}
355
+ style={[positionStyle, widthStyle, style]}
356
+ onLayout={onLayout}
357
+ {...props}
358
+ />
359
+ );
360
+ }
361
+ );
362
+
363
+ // --------------------------------------------------
364
+
365
+ const Close = forwardRef<CloseRef, CloseProps>(
366
+ ({ asChild, onPress: onPressProp, disabled = false, ...props }, ref) => {
367
+ const { onOpenChange, setContentLayout, setTriggerPosition } =
368
+ useRootContext();
369
+
370
+ function onPress(ev: GestureResponderEvent) {
371
+ if (disabled) return;
372
+ onOpenChange(false);
373
+ setTriggerPosition(null);
374
+ setContentLayout(null);
375
+ onPressProp?.(ev);
376
+ }
377
+
378
+ const Component = asChild ? Slot.Pressable : Pressable;
379
+
380
+ return (
381
+ <Component
382
+ ref={ref}
383
+ aria-disabled={disabled ?? undefined}
384
+ role="button"
385
+ onPress={onPress}
386
+ disabled={disabled ?? undefined}
387
+ {...props}
388
+ />
389
+ );
390
+ }
391
+ );
392
+
393
+ // --------------------------------------------------
394
+ // Group Context
395
+ // --------------------------------------------------
396
+
397
+ const GroupContext = createContext<GroupContextValue | null>(null);
398
+
399
+ /**
400
+ * Hook to access Menu Group context.
401
+ * Provides selection state, disabled state, and selection mode.
402
+ *
403
+ * @throws Error if used outside a Menu Group component
404
+ */
405
+ function useGroupContext() {
406
+ const context = useContext(GroupContext);
407
+
408
+ if (!context) {
409
+ throw new Error(
410
+ 'Menu.Group compound components cannot be rendered outside Menu.Group'
411
+ );
412
+ }
413
+
414
+ return context;
415
+ }
416
+
417
+ /**
418
+ * Reads the Group context without throwing if absent.
419
+ * Returns `null` when Item is used outside a Group (standalone mode).
420
+ */
421
+ function useOptionalGroupContext() {
422
+ return useContext(GroupContext);
423
+ }
424
+
425
+ // --------------------------------------------------
426
+ // Item Context
427
+ // --------------------------------------------------
428
+
429
+ const ItemContext = createContext<IItemContext | null>(null);
430
+
431
+ /**
432
+ * Hook to access Menu Item context.
433
+ * Provides the item's id, selected state, and disabled state.
434
+ *
435
+ * @throws Error if used outside a Menu Item component
436
+ */
437
+ function useItemContext() {
438
+ const context = useContext(ItemContext);
439
+
440
+ if (!context) {
441
+ throw new Error(
442
+ 'Menu.Item compound components cannot be rendered outside Menu.Item'
443
+ );
444
+ }
445
+
446
+ return context;
447
+ }
448
+
449
+ // --------------------------------------------------
450
+ // Group
451
+ // --------------------------------------------------
452
+
453
+ const Group = forwardRef<GroupRef, GroupProps>(
454
+ (
455
+ {
456
+ asChild,
457
+ selectionMode = 'none',
458
+ selectedKeys: selectedKeysProp,
459
+ defaultSelectedKeys,
460
+ onSelectionChange: onSelectionChangeProp,
461
+ disabledKeys: disabledKeysProp,
462
+ isDisabled = false,
463
+ shouldCloseOnSelect,
464
+ ...viewProps
465
+ },
466
+ ref
467
+ ) => {
468
+ const isControlled = selectedKeysProp !== undefined;
469
+
470
+ const [internalSelectedKeys, setInternalSelectedKeys] = useState<
471
+ Set<MenuKey>
472
+ >(() => new Set(defaultSelectedKeys ?? []));
473
+
474
+ const selectedKeys = useMemo(
475
+ () =>
476
+ isControlled ? new Set(selectedKeysProp ?? []) : internalSelectedKeys,
477
+ [isControlled, selectedKeysProp, internalSelectedKeys]
478
+ );
479
+
480
+ const disabledKeys = useMemo(
481
+ () => new Set(disabledKeysProp ?? []),
482
+ [disabledKeysProp]
483
+ );
484
+
485
+ const onSelectionChange = useCallback(
486
+ (keys: Set<MenuKey>) => {
487
+ if (!isControlled) {
488
+ setInternalSelectedKeys(keys);
489
+ }
490
+ onSelectionChangeProp?.(keys);
491
+ },
492
+ [isControlled, onSelectionChangeProp]
493
+ );
494
+
495
+ const contextValue = useMemo<GroupContextValue>(
496
+ () => ({
497
+ selectionMode,
498
+ selectedKeys,
499
+ onSelectionChange,
500
+ disabledKeys,
501
+ isDisabled,
502
+ shouldCloseOnSelect,
503
+ }),
504
+ [
505
+ selectionMode,
506
+ selectedKeys,
507
+ onSelectionChange,
508
+ disabledKeys,
509
+ isDisabled,
510
+ shouldCloseOnSelect,
511
+ ]
512
+ );
513
+
514
+ const Component = asChild ? Slot.View : View;
515
+
516
+ return (
517
+ <GroupContext.Provider value={contextValue}>
518
+ <Component ref={ref} role="group" {...viewProps} />
519
+ </GroupContext.Provider>
520
+ );
521
+ }
522
+ );
523
+
524
+ // --------------------------------------------------
525
+ // Item
526
+ // --------------------------------------------------
527
+
528
+ const Item = forwardRef<ItemRef, ItemProps>(
529
+ (
530
+ {
531
+ asChild,
532
+ id: itemId,
533
+ isDisabled: isDisabledProp = false,
534
+ shouldCloseOnSelect: shouldCloseOnSelectProp,
535
+ isSelected: isSelectedProp,
536
+ onSelectedChange,
537
+ onPress: onPressProp,
538
+ variant = 'default',
539
+ ...props
540
+ },
541
+ ref
542
+ ) => {
543
+ const { onOpenChange, setTriggerPosition, setContentLayout } =
544
+ useRootContext();
545
+
546
+ const groupContext = useOptionalGroupContext();
547
+ const isInsideGroup = groupContext !== null;
548
+
549
+ if (isInsideGroup && itemId === undefined) {
550
+ throw new Error(
551
+ 'Menu.Item requires an `id` prop when used inside Menu.Group'
552
+ );
553
+ }
554
+
555
+ // -- Resolve disabled state --
556
+ const effectiveDisabled = isInsideGroup
557
+ ? groupContext.isDisabled ||
558
+ isDisabledProp ||
559
+ (itemId !== undefined && groupContext.disabledKeys.has(itemId))
560
+ : isDisabledProp;
561
+
562
+ // -- Resolve selected state --
563
+ const isSelected = isInsideGroup
564
+ ? itemId !== undefined && groupContext.selectedKeys.has(itemId)
565
+ : (isSelectedProp ?? false);
566
+
567
+ // -- Resolve shouldCloseOnSelect --
568
+ // Priority: item prop > group prop > selectionMode default
569
+ const defaultCloseOnSelect = isInsideGroup
570
+ ? groupContext.selectionMode !== 'multiple'
571
+ : true;
572
+
573
+ const effectiveCloseOnSelect = isInsideGroup
574
+ ? (shouldCloseOnSelectProp ??
575
+ groupContext.shouldCloseOnSelect ??
576
+ defaultCloseOnSelect)
577
+ : (shouldCloseOnSelectProp ?? true);
578
+
579
+ // -- Resolve ARIA role --
580
+ // RN's Role type only supports "menuitem"; selection semantics are
581
+ // conveyed via aria-checked and accessibilityState.checked instead.
582
+ const role = 'menuitem' as const;
583
+
584
+ const closeMenu = useCallback(() => {
585
+ onOpenChange(false);
586
+ setTriggerPosition(null);
587
+ setContentLayout(null);
588
+ }, [onOpenChange, setTriggerPosition, setContentLayout]);
589
+
590
+ const onPress = useCallback(
591
+ (ev: GestureResponderEvent) => {
592
+ if (effectiveDisabled) return;
593
+
594
+ if (isInsideGroup && itemId !== undefined) {
595
+ const { selectionMode, selectedKeys, onSelectionChange } =
596
+ groupContext;
597
+
598
+ if (selectionMode === 'single') {
599
+ const newKeys = isSelected
600
+ ? new Set<MenuKey>()
601
+ : new Set<MenuKey>([itemId]);
602
+ onSelectionChange(newKeys);
603
+ } else if (selectionMode === 'multiple') {
604
+ const newKeys = new Set(selectedKeys);
605
+ if (isSelected) {
606
+ newKeys.delete(itemId);
607
+ } else {
608
+ newKeys.add(itemId);
609
+ }
610
+ onSelectionChange(newKeys);
611
+ }
612
+ } else {
613
+ // Standalone: toggle via callback if provided
614
+ onSelectedChange?.(!isSelected);
615
+ }
616
+
617
+ onPressProp?.(ev);
618
+
619
+ if (effectiveCloseOnSelect) {
620
+ closeMenu();
621
+ }
622
+ },
623
+ [
624
+ effectiveDisabled,
625
+ isInsideGroup,
626
+ itemId,
627
+ groupContext,
628
+ isSelected,
629
+ onSelectedChange,
630
+ onPressProp,
631
+ effectiveCloseOnSelect,
632
+ closeMenu,
633
+ ]
634
+ );
635
+
636
+ const itemContextValue = useMemo<IItemContext>(
637
+ () => ({
638
+ id: itemId,
639
+ isSelected,
640
+ isDisabled: effectiveDisabled,
641
+ variant,
642
+ }),
643
+ [itemId, isSelected, effectiveDisabled, variant]
644
+ );
645
+
646
+ const isCheckable = isInsideGroup
647
+ ? groupContext.selectionMode !== 'none'
648
+ : isSelectedProp !== undefined || onSelectedChange !== undefined;
649
+
650
+ const Component = asChild ? Slot.Pressable : Pressable;
651
+
652
+ return (
653
+ <ItemContext.Provider value={itemContextValue}>
654
+ <Component
655
+ ref={ref}
656
+ role={role}
657
+ aria-checked={isCheckable ? isSelected : undefined}
658
+ aria-disabled={effectiveDisabled}
659
+ disabled={effectiveDisabled}
660
+ accessibilityState={{
661
+ disabled: effectiveDisabled,
662
+ ...(isCheckable ? { checked: isSelected } : {}),
663
+ }}
664
+ onPress={onPress}
665
+ {...props}
666
+ />
667
+ </ItemContext.Provider>
668
+ );
669
+ }
670
+ );
671
+
672
+ // --------------------------------------------------
673
+ // ItemTitle
674
+ // --------------------------------------------------
675
+
676
+ const ItemTitle = forwardRef<ItemTitleRef, ItemTitleProps>(
677
+ ({ asChild, ...props }, ref) => {
678
+ useItemContext();
679
+
680
+ const Component = asChild ? Slot.Text : Text;
681
+
682
+ return <Component ref={ref} {...props} />;
683
+ }
684
+ );
685
+
686
+ // --------------------------------------------------
687
+ // ItemDescription
688
+ // --------------------------------------------------
689
+
690
+ const ItemDescription = forwardRef<ItemDescriptionRef, ItemDescriptionProps>(
691
+ ({ asChild, ...props }, ref) => {
692
+ useItemContext();
693
+
694
+ const Component = asChild ? Slot.Text : Text;
695
+
696
+ return <Component ref={ref} {...props} />;
697
+ }
698
+ );
699
+
700
+ // --------------------------------------------------
701
+ // ItemIndicator
702
+ // --------------------------------------------------
703
+
704
+ const ItemIndicator = forwardRef<ItemIndicatorRef, ItemIndicatorProps>(
705
+ ({ asChild, forceMount, ...props }, ref) => {
706
+ const { isSelected } = useItemContext();
707
+
708
+ if (!forceMount && !isSelected) {
709
+ return null;
710
+ }
711
+
712
+ const Component = asChild ? Slot.View : View;
713
+
714
+ return (
715
+ <Component
716
+ ref={ref}
717
+ role="presentation"
718
+ aria-hidden={!isSelected}
719
+ {...props}
720
+ />
721
+ );
722
+ }
723
+ );
724
+
725
+ // --------------------------------------------------
726
+ // Label
727
+ // --------------------------------------------------
728
+
729
+ const Label = forwardRef<LabelRef, LabelProps>(({ asChild, ...props }, ref) => {
730
+ const Component = asChild ? Slot.Text : Text;
731
+
732
+ return <Component ref={ref} accessibilityRole="header" {...props} />;
733
+ });
734
+
735
+ // --------------------------------------------------
736
+
737
+ Root.displayName = 'HeroUINative.Menu.Root';
738
+ Trigger.displayName = 'HeroUINative.Menu.Trigger';
739
+ Overlay.displayName = 'HeroUINative.Menu.Overlay';
740
+ Content.displayName = 'HeroUINative.Menu.Content';
741
+ Close.displayName = 'HeroUINative.Menu.Close';
742
+ Group.displayName = 'HeroUINative.Menu.Group';
743
+ Item.displayName = 'HeroUINative.Menu.Item';
744
+ ItemTitle.displayName = 'HeroUINative.Menu.ItemTitle';
745
+ ItemDescription.displayName = 'HeroUINative.Menu.ItemDescription';
746
+ ItemIndicator.displayName = 'HeroUINative.Menu.ItemIndicator';
747
+ Label.displayName = 'HeroUINative.Menu.Label';
748
+
749
+ export {
750
+ Close,
751
+ Content,
752
+ Group,
753
+ Item,
754
+ ItemDescription,
755
+ ItemIndicator,
756
+ ItemTitle,
757
+ Label,
758
+ Overlay,
759
+ Portal,
760
+ Root,
761
+ Trigger,
762
+ useGroupContext,
763
+ useItemContext,
764
+ useRootContext,
765
+ };