@open-dy/vibecoding-sdk-taro 0.0.1-beta.4 → 0.0.1-beta.6

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 (546) hide show
  1. package/dist/adapters/interest-card/eslint/eslint-plugin-custom-navigation.mjs +2 -290
  2. package/dist/adapters/interest-card/eslint/taro.mjs +8 -42
  3. package/dist/build/plugins/vite-tt-components-entry.d.ts +10 -0
  4. package/dist/build/plugins/vite-tt-components-entry.js +32 -0
  5. package/dist/build/plugins/vite-tt-components-entry.js.map +1 -0
  6. package/dist/build/taro.js +3 -1
  7. package/dist/build/taro.js.map +1 -1
  8. package/dist/components/miniapp-open-card.d.ts +46 -1
  9. package/dist/components/miniapp-open-card.js +14 -1
  10. package/dist/components/miniapp-open-card.js.map +1 -1
  11. package/dist/eslint/eslint-plugin-custom-navigation.mjs +290 -0
  12. package/dist/eslint/taro.mjs +11 -0
  13. package/dist/reference/llms.txt +76 -34
  14. package/dist/reference/sdk-api/build/taro/BuildContext.md +7 -2
  15. package/dist/reference/sdk-api/build/taro/CreateMicroappTaroConfigOptions.md +1 -2
  16. package/dist/reference/sdk-api/build/taro/createMicroappTaroConfig.md +1 -2
  17. package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCard.md +109 -0
  18. package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCardEnvVersion.md +38 -0
  19. package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCardErrorDetail.md +52 -0
  20. package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCardProps.md +76 -0
  21. package/dist/reference/sdk-api/components/miniapp-open-card/index.md +12 -0
  22. package/dist/reference/sdk-api/libraries/lucide-taro.md +151 -0
  23. package/dist/reference/sdk-api/runtime/CreateMicroappClientOptions.md +7 -2
  24. package/dist/reference/sdk-api/runtime/createMicroappClient.md +8 -3
  25. package/dist/reference/sdk-api/ui/accordion/Accordion.md +114 -0
  26. package/dist/reference/sdk-api/ui/accordion/AccordionContent.md +100 -0
  27. package/dist/reference/sdk-api/ui/accordion/AccordionItem.md +107 -0
  28. package/dist/reference/sdk-api/ui/accordion/AccordionTrigger.md +100 -0
  29. package/dist/reference/sdk-api/ui/accordion/index.md +12 -0
  30. package/dist/reference/sdk-api/ui/alert/Alert.md +106 -0
  31. package/dist/reference/sdk-api/ui/alert/AlertAction.md +100 -0
  32. package/dist/reference/sdk-api/ui/alert/AlertDescription.md +100 -0
  33. package/dist/reference/sdk-api/ui/alert/AlertTitle.md +100 -0
  34. package/dist/reference/sdk-api/ui/alert/index.md +12 -0
  35. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialog.md +58 -0
  36. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogAction.md +107 -0
  37. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogCancel.md +107 -0
  38. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogContent.md +106 -0
  39. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogDescription.md +100 -0
  40. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogFooter.md +100 -0
  41. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogHeader.md +100 -0
  42. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogOverlay.md +100 -0
  43. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogPortal.md +55 -0
  44. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogTitle.md +100 -0
  45. package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogTrigger.md +118 -0
  46. package/dist/reference/sdk-api/ui/alert-dialog/index.md +19 -0
  47. package/dist/reference/sdk-api/ui/aspect-ratio/AspectRatio.md +106 -0
  48. package/dist/reference/sdk-api/ui/aspect-ratio/index.md +9 -0
  49. package/dist/reference/sdk-api/ui/avatar/Avatar.md +106 -0
  50. package/dist/reference/sdk-api/ui/avatar/AvatarBadge.md +100 -0
  51. package/dist/reference/sdk-api/ui/avatar/AvatarFallback.md +100 -0
  52. package/dist/reference/sdk-api/ui/avatar/AvatarGroup.md +100 -0
  53. package/dist/reference/sdk-api/ui/avatar/AvatarGroupCount.md +100 -0
  54. package/dist/reference/sdk-api/ui/avatar/AvatarImage.md +108 -0
  55. package/dist/reference/sdk-api/ui/avatar/index.md +14 -0
  56. package/dist/reference/sdk-api/ui/badge/Badge.md +114 -0
  57. package/dist/reference/sdk-api/ui/badge/badgeVariants.md +70 -0
  58. package/dist/reference/sdk-api/ui/badge/index.md +10 -0
  59. package/dist/reference/sdk-api/ui/button/Button.md +210 -0
  60. package/dist/reference/sdk-api/ui/button/ButtonProps.md +188 -0
  61. package/dist/reference/sdk-api/ui/button/buttonVariants.md +84 -0
  62. package/dist/reference/sdk-api/ui/button/index.md +11 -0
  63. package/dist/reference/sdk-api/ui/button-group/ButtonGroup.md +106 -0
  64. package/dist/reference/sdk-api/ui/button-group/ButtonGroupSeparator.md +106 -0
  65. package/dist/reference/sdk-api/ui/button-group/ButtonGroupText.md +106 -0
  66. package/dist/reference/sdk-api/ui/button-group/buttonGroupVariants.md +70 -0
  67. package/dist/reference/sdk-api/ui/button-group/index.md +12 -0
  68. package/dist/reference/sdk-api/ui/calendar/Calendar.md +144 -0
  69. package/dist/reference/sdk-api/ui/calendar/CalendarProps.md +118 -0
  70. package/dist/reference/sdk-api/ui/calendar/index.md +10 -0
  71. package/dist/reference/sdk-api/ui/card/Card.md +106 -0
  72. package/dist/reference/sdk-api/ui/card/CardAction.md +100 -0
  73. package/dist/reference/sdk-api/ui/card/CardContent.md +100 -0
  74. package/dist/reference/sdk-api/ui/card/CardDescription.md +100 -0
  75. package/dist/reference/sdk-api/ui/card/CardFooter.md +100 -0
  76. package/dist/reference/sdk-api/ui/card/CardHeader.md +100 -0
  77. package/dist/reference/sdk-api/ui/card/CardTitle.md +100 -0
  78. package/dist/reference/sdk-api/ui/card/index.md +15 -0
  79. package/dist/reference/sdk-api/ui/carousel/Carousel.md +108 -0
  80. package/dist/reference/sdk-api/ui/carousel/CarouselContent.md +100 -0
  81. package/dist/reference/sdk-api/ui/carousel/CarouselItem.md +100 -0
  82. package/dist/reference/sdk-api/ui/carousel/CarouselNext.md +219 -0
  83. package/dist/reference/sdk-api/ui/carousel/CarouselPrevious.md +219 -0
  84. package/dist/reference/sdk-api/ui/carousel/index.md +14 -0
  85. package/dist/reference/sdk-api/ui/carousel/useCarousel.md +46 -0
  86. package/dist/reference/sdk-api/ui/checkbox/Checkbox.md +109 -0
  87. package/dist/reference/sdk-api/ui/checkbox/index.md +9 -0
  88. package/dist/reference/sdk-api/ui/collapsible/Collapsible.md +108 -0
  89. package/dist/reference/sdk-api/ui/collapsible/CollapsibleContent.md +100 -0
  90. package/dist/reference/sdk-api/ui/collapsible/CollapsibleTrigger.md +119 -0
  91. package/dist/reference/sdk-api/ui/collapsible/index.md +11 -0
  92. package/dist/reference/sdk-api/ui/combobox/Combobox.md +124 -0
  93. package/dist/reference/sdk-api/ui/combobox/ComboboxChip.md +107 -0
  94. package/dist/reference/sdk-api/ui/combobox/ComboboxChips.md +100 -0
  95. package/dist/reference/sdk-api/ui/combobox/ComboboxChipsInput.md +107 -0
  96. package/dist/reference/sdk-api/ui/combobox/ComboboxCollection.md +100 -0
  97. package/dist/reference/sdk-api/ui/combobox/ComboboxContent.md +106 -0
  98. package/dist/reference/sdk-api/ui/combobox/ComboboxEmpty.md +100 -0
  99. package/dist/reference/sdk-api/ui/combobox/ComboboxGroup.md +100 -0
  100. package/dist/reference/sdk-api/ui/combobox/ComboboxInput.md +113 -0
  101. package/dist/reference/sdk-api/ui/combobox/ComboboxItem.md +106 -0
  102. package/dist/reference/sdk-api/ui/combobox/ComboboxLabel.md +100 -0
  103. package/dist/reference/sdk-api/ui/combobox/ComboboxList.md +105 -0
  104. package/dist/reference/sdk-api/ui/combobox/ComboboxSeparator.md +100 -0
  105. package/dist/reference/sdk-api/ui/combobox/ComboboxTrigger.md +100 -0
  106. package/dist/reference/sdk-api/ui/combobox/ComboboxValue.md +105 -0
  107. package/dist/reference/sdk-api/ui/combobox/index.md +24 -0
  108. package/dist/reference/sdk-api/ui/combobox/useComboboxAnchor.md +43 -0
  109. package/dist/reference/sdk-api/ui/dialog/Dialog.md +58 -0
  110. package/dist/reference/sdk-api/ui/dialog/DialogClose.md +100 -0
  111. package/dist/reference/sdk-api/ui/dialog/DialogContent.md +107 -0
  112. package/dist/reference/sdk-api/ui/dialog/DialogDescription.md +100 -0
  113. package/dist/reference/sdk-api/ui/dialog/DialogFooter.md +100 -0
  114. package/dist/reference/sdk-api/ui/dialog/DialogHeader.md +100 -0
  115. package/dist/reference/sdk-api/ui/dialog/DialogOverlay.md +100 -0
  116. package/dist/reference/sdk-api/ui/dialog/DialogPortal.md +55 -0
  117. package/dist/reference/sdk-api/ui/dialog/DialogTitle.md +100 -0
  118. package/dist/reference/sdk-api/ui/dialog/DialogTrigger.md +106 -0
  119. package/dist/reference/sdk-api/ui/dialog/index.md +18 -0
  120. package/dist/reference/sdk-api/ui/drawer/Drawer.md +59 -0
  121. package/dist/reference/sdk-api/ui/drawer/DrawerClose.md +100 -0
  122. package/dist/reference/sdk-api/ui/drawer/DrawerContent.md +100 -0
  123. package/dist/reference/sdk-api/ui/drawer/DrawerDescription.md +100 -0
  124. package/dist/reference/sdk-api/ui/drawer/DrawerFooter.md +100 -0
  125. package/dist/reference/sdk-api/ui/drawer/DrawerHeader.md +100 -0
  126. package/dist/reference/sdk-api/ui/drawer/DrawerOverlay.md +100 -0
  127. package/dist/reference/sdk-api/ui/drawer/DrawerPortal.md +55 -0
  128. package/dist/reference/sdk-api/ui/drawer/DrawerTitle.md +100 -0
  129. package/dist/reference/sdk-api/ui/drawer/DrawerTrigger.md +100 -0
  130. package/dist/reference/sdk-api/ui/drawer/index.md +18 -0
  131. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenu.md +58 -0
  132. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuCheckboxItem.md +107 -0
  133. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuContent.md +106 -0
  134. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuGroup.md +100 -0
  135. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuItem.md +107 -0
  136. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuLabel.md +106 -0
  137. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuPortal.md +55 -0
  138. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuRadioGroup.md +100 -0
  139. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuRadioItem.md +106 -0
  140. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSeparator.md +100 -0
  141. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuShortcut.md +100 -0
  142. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSub.md +58 -0
  143. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSubContent.md +100 -0
  144. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSubTrigger.md +106 -0
  145. package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuTrigger.md +119 -0
  146. package/dist/reference/sdk-api/ui/dropdown-menu/index.md +23 -0
  147. package/dist/reference/sdk-api/ui/empty/Empty.md +100 -0
  148. package/dist/reference/sdk-api/ui/empty/EmptyContent.md +100 -0
  149. package/dist/reference/sdk-api/ui/empty/EmptyDescription.md +100 -0
  150. package/dist/reference/sdk-api/ui/empty/EmptyHeader.md +100 -0
  151. package/dist/reference/sdk-api/ui/empty/EmptyMedia.md +106 -0
  152. package/dist/reference/sdk-api/ui/empty/EmptyTitle.md +100 -0
  153. package/dist/reference/sdk-api/ui/empty/index.md +14 -0
  154. package/dist/reference/sdk-api/ui/field/Field.md +106 -0
  155. package/dist/reference/sdk-api/ui/field/FieldContent.md +100 -0
  156. package/dist/reference/sdk-api/ui/field/FieldDescription.md +100 -0
  157. package/dist/reference/sdk-api/ui/field/FieldError.md +112 -0
  158. package/dist/reference/sdk-api/ui/field/FieldGroup.md +100 -0
  159. package/dist/reference/sdk-api/ui/field/FieldLabel.md +85 -0
  160. package/dist/reference/sdk-api/ui/field/FieldLegend.md +106 -0
  161. package/dist/reference/sdk-api/ui/field/FieldSeparator.md +105 -0
  162. package/dist/reference/sdk-api/ui/field/FieldSet.md +100 -0
  163. package/dist/reference/sdk-api/ui/field/FieldTitle.md +100 -0
  164. package/dist/reference/sdk-api/ui/field/index.md +18 -0
  165. package/dist/reference/sdk-api/ui/helpers/collectDataIconState.md +66 -0
  166. package/dist/reference/sdk-api/ui/helpers/index.md +9 -0
  167. package/dist/reference/sdk-api/ui/index.md +57 -0
  168. package/dist/reference/sdk-api/ui/input/Input.md +141 -0
  169. package/dist/reference/sdk-api/ui/input/index.md +9 -0
  170. package/dist/reference/sdk-api/ui/input-group/InputGroup.md +100 -0
  171. package/dist/reference/sdk-api/ui/input-group/InputGroupAddon.md +109 -0
  172. package/dist/reference/sdk-api/ui/input-group/InputGroupButton.md +220 -0
  173. package/dist/reference/sdk-api/ui/input-group/InputGroupInput.md +135 -0
  174. package/dist/reference/sdk-api/ui/input-group/InputGroupText.md +100 -0
  175. package/dist/reference/sdk-api/ui/input-group/InputGroupTextarea.md +126 -0
  176. package/dist/reference/sdk-api/ui/input-group/index.md +14 -0
  177. package/dist/reference/sdk-api/ui/input-otp/InputOTP.md +111 -0
  178. package/dist/reference/sdk-api/ui/input-otp/InputOTPGroup.md +100 -0
  179. package/dist/reference/sdk-api/ui/input-otp/InputOTPSeparator.md +100 -0
  180. package/dist/reference/sdk-api/ui/input-otp/InputOTPSlot.md +107 -0
  181. package/dist/reference/sdk-api/ui/input-otp/index.md +12 -0
  182. package/dist/reference/sdk-api/ui/item/Item.md +115 -0
  183. package/dist/reference/sdk-api/ui/item/ItemActions.md +100 -0
  184. package/dist/reference/sdk-api/ui/item/ItemContent.md +100 -0
  185. package/dist/reference/sdk-api/ui/item/ItemDescription.md +100 -0
  186. package/dist/reference/sdk-api/ui/item/ItemFooter.md +100 -0
  187. package/dist/reference/sdk-api/ui/item/ItemGroup.md +100 -0
  188. package/dist/reference/sdk-api/ui/item/ItemHeader.md +100 -0
  189. package/dist/reference/sdk-api/ui/item/ItemMedia.md +106 -0
  190. package/dist/reference/sdk-api/ui/item/ItemSeparator.md +106 -0
  191. package/dist/reference/sdk-api/ui/item/ItemTitle.md +100 -0
  192. package/dist/reference/sdk-api/ui/item/index.md +18 -0
  193. package/dist/reference/sdk-api/ui/label/Label.md +85 -0
  194. package/dist/reference/sdk-api/ui/label/index.md +9 -0
  195. package/dist/reference/sdk-api/ui/menubar/Menubar.md +100 -0
  196. package/dist/reference/sdk-api/ui/menubar/MenubarCheckboxItem.md +111 -0
  197. package/dist/reference/sdk-api/ui/menubar/MenubarContent.md +108 -0
  198. package/dist/reference/sdk-api/ui/menubar/MenubarGroup.md +100 -0
  199. package/dist/reference/sdk-api/ui/menubar/MenubarItem.md +109 -0
  200. package/dist/reference/sdk-api/ui/menubar/MenubarLabel.md +106 -0
  201. package/dist/reference/sdk-api/ui/menubar/MenubarMenu.md +55 -0
  202. package/dist/reference/sdk-api/ui/menubar/MenubarPortal.md +55 -0
  203. package/dist/reference/sdk-api/ui/menubar/MenubarRadioGroup.md +108 -0
  204. package/dist/reference/sdk-api/ui/menubar/MenubarRadioItem.md +110 -0
  205. package/dist/reference/sdk-api/ui/menubar/MenubarSeparator.md +100 -0
  206. package/dist/reference/sdk-api/ui/menubar/MenubarShortcut.md +100 -0
  207. package/dist/reference/sdk-api/ui/menubar/MenubarSub.md +58 -0
  208. package/dist/reference/sdk-api/ui/menubar/MenubarSubContent.md +108 -0
  209. package/dist/reference/sdk-api/ui/menubar/MenubarSubTrigger.md +107 -0
  210. package/dist/reference/sdk-api/ui/menubar/MenubarTrigger.md +100 -0
  211. package/dist/reference/sdk-api/ui/menubar/index.md +24 -0
  212. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenu.md +100 -0
  213. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuContent.md +106 -0
  214. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuIndicator.md +100 -0
  215. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuItem.md +106 -0
  216. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuLink.md +106 -0
  217. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuList.md +100 -0
  218. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuPositioner.md +100 -0
  219. package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuTrigger.md +120 -0
  220. package/dist/reference/sdk-api/ui/navigation-menu/index.md +17 -0
  221. package/dist/reference/sdk-api/ui/navigation-menu/navigationMenuTriggerStyle.md +64 -0
  222. package/dist/reference/sdk-api/ui/pagination/Pagination.md +100 -0
  223. package/dist/reference/sdk-api/ui/pagination/PaginationContent.md +100 -0
  224. package/dist/reference/sdk-api/ui/pagination/PaginationEllipsis.md +100 -0
  225. package/dist/reference/sdk-api/ui/pagination/PaginationItem.md +100 -0
  226. package/dist/reference/sdk-api/ui/pagination/PaginationLink.md +107 -0
  227. package/dist/reference/sdk-api/ui/pagination/PaginationNext.md +121 -0
  228. package/dist/reference/sdk-api/ui/pagination/PaginationPrevious.md +121 -0
  229. package/dist/reference/sdk-api/ui/pagination/index.md +15 -0
  230. package/dist/reference/sdk-api/ui/popover/Popover.md +58 -0
  231. package/dist/reference/sdk-api/ui/popover/PopoverAnchor.md +100 -0
  232. package/dist/reference/sdk-api/ui/popover/PopoverContent.md +108 -0
  233. package/dist/reference/sdk-api/ui/popover/PopoverDescription.md +100 -0
  234. package/dist/reference/sdk-api/ui/popover/PopoverHeader.md +100 -0
  235. package/dist/reference/sdk-api/ui/popover/PopoverTitle.md +100 -0
  236. package/dist/reference/sdk-api/ui/popover/PopoverTrigger.md +119 -0
  237. package/dist/reference/sdk-api/ui/popover/index.md +15 -0
  238. package/dist/reference/sdk-api/ui/portal/Portal.md +55 -0
  239. package/dist/reference/sdk-api/ui/portal/index.md +9 -0
  240. package/dist/reference/sdk-api/ui/progress/Progress.md +109 -0
  241. package/dist/reference/sdk-api/ui/progress/ProgressIndicator.md +107 -0
  242. package/dist/reference/sdk-api/ui/progress/ProgressLabel.md +100 -0
  243. package/dist/reference/sdk-api/ui/progress/ProgressTrack.md +100 -0
  244. package/dist/reference/sdk-api/ui/progress/ProgressValue.md +105 -0
  245. package/dist/reference/sdk-api/ui/progress/index.md +13 -0
  246. package/dist/reference/sdk-api/ui/radio-group/RadioGroup.md +108 -0
  247. package/dist/reference/sdk-api/ui/radio-group/RadioGroupItem.md +107 -0
  248. package/dist/reference/sdk-api/ui/radio-group/index.md +10 -0
  249. package/dist/reference/sdk-api/ui/resizable/ResizableHandle.md +107 -0
  250. package/dist/reference/sdk-api/ui/resizable/ResizablePanel.md +108 -0
  251. package/dist/reference/sdk-api/ui/resizable/ResizablePanelGroup.md +107 -0
  252. package/dist/reference/sdk-api/ui/resizable/index.md +11 -0
  253. package/dist/reference/sdk-api/ui/scroll-area/ScrollArea.md +159 -0
  254. package/dist/reference/sdk-api/ui/scroll-area/ScrollBar.md +106 -0
  255. package/dist/reference/sdk-api/ui/scroll-area/index.md +10 -0
  256. package/dist/reference/sdk-api/ui/select/Select.md +80 -0
  257. package/dist/reference/sdk-api/ui/select/SelectContent.md +106 -0
  258. package/dist/reference/sdk-api/ui/select/SelectGroup.md +100 -0
  259. package/dist/reference/sdk-api/ui/select/SelectItem.md +106 -0
  260. package/dist/reference/sdk-api/ui/select/SelectLabel.md +100 -0
  261. package/dist/reference/sdk-api/ui/select/SelectScrollDownButton.md +100 -0
  262. package/dist/reference/sdk-api/ui/select/SelectScrollUpButton.md +100 -0
  263. package/dist/reference/sdk-api/ui/select/SelectSeparator.md +100 -0
  264. package/dist/reference/sdk-api/ui/select/SelectTrigger.md +106 -0
  265. package/dist/reference/sdk-api/ui/select/SelectValue.md +106 -0
  266. package/dist/reference/sdk-api/ui/select/index.md +18 -0
  267. package/dist/reference/sdk-api/ui/separator/Separator.md +106 -0
  268. package/dist/reference/sdk-api/ui/separator/index.md +9 -0
  269. package/dist/reference/sdk-api/ui/sheet/Sheet.md +58 -0
  270. package/dist/reference/sdk-api/ui/sheet/SheetClose.md +100 -0
  271. package/dist/reference/sdk-api/ui/sheet/SheetContent.md +113 -0
  272. package/dist/reference/sdk-api/ui/sheet/SheetDescription.md +100 -0
  273. package/dist/reference/sdk-api/ui/sheet/SheetFooter.md +100 -0
  274. package/dist/reference/sdk-api/ui/sheet/SheetHeader.md +100 -0
  275. package/dist/reference/sdk-api/ui/sheet/SheetOverlay.md +100 -0
  276. package/dist/reference/sdk-api/ui/sheet/SheetPortal.md +55 -0
  277. package/dist/reference/sdk-api/ui/sheet/SheetTitle.md +100 -0
  278. package/dist/reference/sdk-api/ui/sheet/SheetTrigger.md +100 -0
  279. package/dist/reference/sdk-api/ui/sheet/index.md +18 -0
  280. package/dist/reference/sdk-api/ui/skeleton/Skeleton.md +100 -0
  281. package/dist/reference/sdk-api/ui/skeleton/index.md +9 -0
  282. package/dist/reference/sdk-api/ui/slider/Slider.md +116 -0
  283. package/dist/reference/sdk-api/ui/slider/index.md +9 -0
  284. package/dist/reference/sdk-api/ui/sonner/Toaster.md +43 -0
  285. package/dist/reference/sdk-api/ui/sonner/index.md +10 -0
  286. package/dist/reference/sdk-api/ui/sonner/toast.md +58 -0
  287. package/dist/reference/sdk-api/ui/spinner/Spinner.md +100 -0
  288. package/dist/reference/sdk-api/ui/spinner/index.md +9 -0
  289. package/dist/reference/sdk-api/ui/switch/Switch.md +110 -0
  290. package/dist/reference/sdk-api/ui/switch/index.md +9 -0
  291. package/dist/reference/sdk-api/ui/table/Table.md +100 -0
  292. package/dist/reference/sdk-api/ui/table/TableBody.md +100 -0
  293. package/dist/reference/sdk-api/ui/table/TableCaption.md +100 -0
  294. package/dist/reference/sdk-api/ui/table/TableCell.md +106 -0
  295. package/dist/reference/sdk-api/ui/table/TableFooter.md +100 -0
  296. package/dist/reference/sdk-api/ui/table/TableHead.md +106 -0
  297. package/dist/reference/sdk-api/ui/table/TableHeader.md +100 -0
  298. package/dist/reference/sdk-api/ui/table/TableRow.md +100 -0
  299. package/dist/reference/sdk-api/ui/table/index.md +16 -0
  300. package/dist/reference/sdk-api/ui/tabs/Tabs.md +109 -0
  301. package/dist/reference/sdk-api/ui/tabs/TabsContent.md +106 -0
  302. package/dist/reference/sdk-api/ui/tabs/TabsList.md +106 -0
  303. package/dist/reference/sdk-api/ui/tabs/TabsTrigger.md +107 -0
  304. package/dist/reference/sdk-api/ui/tabs/index.md +13 -0
  305. package/dist/reference/sdk-api/ui/tabs/tabsListVariants.md +70 -0
  306. package/dist/reference/sdk-api/ui/textarea/Textarea.md +126 -0
  307. package/dist/reference/sdk-api/ui/textarea/index.md +9 -0
  308. package/dist/reference/sdk-api/ui/toggle/Toggle.md +118 -0
  309. package/dist/reference/sdk-api/ui/toggle/index.md +10 -0
  310. package/dist/reference/sdk-api/ui/toggle/toggleVariants.md +71 -0
  311. package/dist/reference/sdk-api/ui/toggle-group/ToggleGroup.md +122 -0
  312. package/dist/reference/sdk-api/ui/toggle-group/ToggleGroupItem.md +116 -0
  313. package/dist/reference/sdk-api/ui/toggle-group/index.md +10 -0
  314. package/dist/reference/sdk-api.json +74470 -146
  315. package/dist/reference/sdk-api.md +62 -3
  316. package/dist/ui/accordion.d.ts +48 -0
  317. package/dist/ui/accordion.js +40 -0
  318. package/dist/ui/accordion.js.map +1 -1
  319. package/dist/ui/alert-dialog.d.ts +123 -0
  320. package/dist/ui/alert-dialog.js +114 -0
  321. package/dist/ui/alert-dialog.js.map +1 -1
  322. package/dist/ui/alert.d.ts +41 -0
  323. package/dist/ui/alert.js +41 -0
  324. package/dist/ui/alert.js.map +1 -1
  325. package/dist/ui/aspect-ratio.d.ts +11 -0
  326. package/dist/ui/aspect-ratio.js +10 -0
  327. package/dist/ui/aspect-ratio.js.map +1 -1
  328. package/dist/ui/avatar.d.ts +65 -0
  329. package/dist/ui/avatar.js +63 -0
  330. package/dist/ui/avatar.js.map +1 -1
  331. package/dist/ui/badge.d.ts +22 -0
  332. package/dist/ui/badge.js +22 -0
  333. package/dist/ui/badge.js.map +1 -1
  334. package/dist/ui/button-group.d.ts +45 -0
  335. package/dist/ui/button-group.js +43 -0
  336. package/dist/ui/button-group.js.map +1 -1
  337. package/dist/ui/button.d.ts +52 -0
  338. package/dist/ui/button.js +30 -0
  339. package/dist/ui/button.js.map +1 -1
  340. package/dist/ui/calendar.d.ts +44 -0
  341. package/dist/ui/calendar.js +19 -0
  342. package/dist/ui/calendar.js.map +1 -1
  343. package/dist/ui/card.d.ts +71 -0
  344. package/dist/ui/card.js +70 -0
  345. package/dist/ui/card.js.map +1 -1
  346. package/dist/ui/carousel.d.ts +71 -0
  347. package/dist/ui/carousel.js +66 -0
  348. package/dist/ui/carousel.js.map +1 -1
  349. package/dist/ui/checkbox.d.ts +14 -0
  350. package/dist/ui/checkbox.js +10 -0
  351. package/dist/ui/checkbox.js.map +1 -1
  352. package/dist/ui/collapsible.d.ts +37 -0
  353. package/dist/ui/collapsible.js +30 -0
  354. package/dist/ui/collapsible.js.map +1 -1
  355. package/dist/ui/combobox.d.ts +190 -0
  356. package/dist/ui/combobox.js +167 -0
  357. package/dist/ui/combobox.js.map +1 -1
  358. package/dist/ui/dialog.d.ts +109 -0
  359. package/dist/ui/dialog.js +100 -0
  360. package/dist/ui/dialog.js.map +1 -1
  361. package/dist/ui/drawer.d.ts +106 -0
  362. package/dist/ui/drawer.js +100 -0
  363. package/dist/ui/drawer.js.map +1 -1
  364. package/dist/ui/dropdown-menu.d.ts +171 -0
  365. package/dist/ui/dropdown-menu.js +150 -0
  366. package/dist/ui/dropdown-menu.js.map +1 -1
  367. package/dist/ui/empty.d.ts +61 -0
  368. package/dist/ui/empty.js +61 -0
  369. package/dist/ui/empty.js.map +1 -1
  370. package/dist/ui/field.d.ts +105 -0
  371. package/dist/ui/field.js +101 -0
  372. package/dist/ui/field.js.map +1 -1
  373. package/dist/ui/helpers.d.ts +11 -0
  374. package/dist/ui/helpers.js +11 -0
  375. package/dist/ui/helpers.js.map +1 -1
  376. package/dist/ui/input-group.d.ts +65 -0
  377. package/dist/ui/input-group.js +65 -0
  378. package/dist/ui/input-group.js.map +1 -1
  379. package/dist/ui/input-otp.d.ts +48 -0
  380. package/dist/ui/input-otp.js +40 -0
  381. package/dist/ui/input-otp.js.map +1 -1
  382. package/dist/ui/input.d.ts +24 -2
  383. package/dist/ui/input.js +20 -0
  384. package/dist/ui/input.js.map +1 -1
  385. package/dist/ui/item.d.ts +103 -0
  386. package/dist/ui/item.js +103 -0
  387. package/dist/ui/item.js.map +1 -1
  388. package/dist/ui/label.d.ts +10 -0
  389. package/dist/ui/label.js +10 -0
  390. package/dist/ui/label.js.map +1 -1
  391. package/dist/ui/menubar.d.ts +193 -0
  392. package/dist/ui/menubar.js +160 -0
  393. package/dist/ui/menubar.js.map +1 -1
  394. package/dist/ui/navigation-menu.d.ts +98 -0
  395. package/dist/ui/navigation-menu.js +90 -0
  396. package/dist/ui/navigation-menu.js.map +1 -1
  397. package/dist/ui/pagination.d.ts +76 -0
  398. package/dist/ui/pagination.js +73 -0
  399. package/dist/ui/pagination.js.map +1 -1
  400. package/dist/ui/popover.d.ts +81 -0
  401. package/dist/ui/popover.js +70 -0
  402. package/dist/ui/popover.js.map +1 -1
  403. package/dist/ui/portal.d.ts +11 -0
  404. package/dist/ui/portal.js +10 -0
  405. package/dist/ui/portal.js.map +1 -1
  406. package/dist/ui/progress.d.ts +53 -26
  407. package/dist/ui/progress.js +50 -26
  408. package/dist/ui/progress.js.map +1 -1
  409. package/dist/ui/radio-group.d.ts +25 -0
  410. package/dist/ui/radio-group.js +20 -0
  411. package/dist/ui/radio-group.js.map +1 -1
  412. package/dist/ui/resizable.d.ts +37 -0
  413. package/dist/ui/resizable.js +30 -0
  414. package/dist/ui/resizable.js.map +1 -1
  415. package/dist/ui/scroll-area.d.ts +22 -0
  416. package/dist/ui/scroll-area.js +21 -0
  417. package/dist/ui/scroll-area.js.map +1 -1
  418. package/dist/ui/select.d.ts +122 -0
  419. package/dist/ui/select.js +108 -0
  420. package/dist/ui/select.js.map +1 -1
  421. package/dist/ui/separator.d.ts +11 -0
  422. package/dist/ui/separator.js +10 -0
  423. package/dist/ui/separator.js.map +1 -1
  424. package/dist/ui/sheet.d.ts +107 -0
  425. package/dist/ui/sheet.js +101 -0
  426. package/dist/ui/sheet.js.map +1 -1
  427. package/dist/ui/skeleton.d.ts +10 -0
  428. package/dist/ui/skeleton.js +10 -0
  429. package/dist/ui/skeleton.js.map +1 -1
  430. package/dist/ui/slider.d.ts +21 -0
  431. package/dist/ui/slider.js +14 -0
  432. package/dist/ui/slider.js.map +1 -1
  433. package/dist/ui/sonner.d.ts +23 -0
  434. package/dist/ui/sonner.js +21 -0
  435. package/dist/ui/sonner.js.map +1 -1
  436. package/dist/ui/spinner.d.ts +10 -0
  437. package/dist/ui/spinner.js +10 -0
  438. package/dist/ui/spinner.js.map +1 -1
  439. package/dist/ui/switch.d.ts +15 -0
  440. package/dist/ui/switch.js +10 -0
  441. package/dist/ui/switch.js.map +1 -1
  442. package/dist/ui/table.d.ts +81 -0
  443. package/dist/ui/table.js +80 -0
  444. package/dist/ui/table.js.map +1 -1
  445. package/dist/ui/tabs.d.ts +59 -0
  446. package/dist/ui/tabs.js +51 -0
  447. package/dist/ui/tabs.js.map +1 -1
  448. package/dist/ui/textarea.d.ts +13 -0
  449. package/dist/ui/textarea.js +13 -0
  450. package/dist/ui/textarea.js.map +1 -1
  451. package/dist/ui/toggle-group.d.ts +34 -0
  452. package/dist/ui/toggle-group.js +24 -0
  453. package/dist/ui/toggle-group.js.map +1 -1
  454. package/dist/ui/toggle.d.ts +28 -0
  455. package/dist/ui/toggle.js +24 -0
  456. package/dist/ui/toggle.js.map +1 -1
  457. package/package.json +4 -2
  458. package/release-provenance.json +15 -0
  459. package/src/adapters/interest-card/eslint/eslint-plugin-custom-navigation.mjs +2 -0
  460. package/src/adapters/interest-card/eslint/taro.mjs +21 -0
  461. package/src/adapters/interest-card/runtime/microapp.ts +11 -0
  462. package/src/adapters/interest-card/types/taro.d.ts +28 -0
  463. package/src/build/config-overrides.ts +39 -0
  464. package/src/build/index.ts +5 -0
  465. package/src/build/plugins/app-config.ts +47 -0
  466. package/src/build/plugins/depend-card/analyze.ts +122 -0
  467. package/src/build/plugins/depend-card/source.ts +97 -0
  468. package/src/build/plugins/vite-depend-card.ts +168 -0
  469. package/src/build/plugins/vite-image-asset-import.ts +178 -0
  470. package/src/build/plugins/vite-inline-json.ts +149 -0
  471. package/src/build/plugins/vite-taro-source-location.ts +224 -0
  472. package/src/build/plugins/vite-tt-components-entry.ts +33 -0
  473. package/src/build/taro.ts +830 -0
  474. package/src/components/miniapp-open-card.ts +94 -0
  475. package/src/components/native-miniapp-open-card.ts +7 -0
  476. package/src/eslint/eslint-plugin-custom-navigation.mjs +290 -0
  477. package/src/eslint/eslint-plugin-microapp-pages.mjs +659 -0
  478. package/src/eslint/server.mjs +69 -0
  479. package/src/eslint/taro.mjs +564 -0
  480. package/src/index.ts +2 -0
  481. package/src/internal/runtime/douyin-open-button.d.ts +29 -0
  482. package/src/internal/runtime/iframe-auth/identity.ts +236 -0
  483. package/src/internal/runtime/iframe-auth/index.ts +2 -0
  484. package/src/internal/runtime/iframe-auth/sync.ts +37 -0
  485. package/src/internal/vendor-modules.d.ts +8 -0
  486. package/src/lib/measure.ts +115 -0
  487. package/src/lib/platform.ts +11 -0
  488. package/src/lib/utils.ts +6 -0
  489. package/src/runtime/client.ts +246 -0
  490. package/src/runtime/default-client.ts +26 -0
  491. package/src/runtime/default-iframe-auth.ts +13 -0
  492. package/src/runtime/douyin-container-request.ts +367 -0
  493. package/src/runtime/douyin-login-request.ts +514 -0
  494. package/src/runtime/globals.d.ts +342 -0
  495. package/src/runtime/index.ts +4 -0
  496. package/src/runtime/network-url.ts +63 -0
  497. package/src/ui/accordion.tsx +226 -0
  498. package/src/ui/alert-dialog.tsx +407 -0
  499. package/src/ui/alert.tsx +149 -0
  500. package/src/ui/aspect-ratio.tsx +37 -0
  501. package/src/ui/avatar.tsx +238 -0
  502. package/src/ui/badge.tsx +77 -0
  503. package/src/ui/button-group.tsx +173 -0
  504. package/src/ui/button.tsx +215 -0
  505. package/src/ui/calendar.tsx +353 -0
  506. package/src/ui/card.tsx +217 -0
  507. package/src/ui/carousel.tsx +259 -0
  508. package/src/ui/checkbox.tsx +62 -0
  509. package/src/ui/collapsible.tsx +148 -0
  510. package/src/ui/combobox.tsx +650 -0
  511. package/src/ui/dialog.tsx +290 -0
  512. package/src/ui/drawer.tsx +272 -0
  513. package/src/ui/dropdown-menu.tsx +547 -0
  514. package/src/ui/empty.tsx +166 -0
  515. package/src/ui/field.tsx +427 -0
  516. package/src/ui/helpers.tsx +39 -0
  517. package/src/ui/index.ts +47 -0
  518. package/src/ui/input-group.tsx +320 -0
  519. package/src/ui/input-otp.tsx +189 -0
  520. package/src/ui/input.tsx +60 -0
  521. package/src/ui/item.tsx +338 -0
  522. package/src/ui/label.tsx +31 -0
  523. package/src/ui/menubar.tsx +835 -0
  524. package/src/ui/navigation-menu.tsx +341 -0
  525. package/src/ui/pagination.tsx +195 -0
  526. package/src/ui/popover.tsx +363 -0
  527. package/src/ui/portal.tsx +31 -0
  528. package/src/ui/progress.tsx +182 -0
  529. package/src/ui/radio-group.tsx +111 -0
  530. package/src/ui/resizable.tsx +410 -0
  531. package/src/ui/scroll-area.tsx +102 -0
  532. package/src/ui/select.tsx +471 -0
  533. package/src/ui/separator.tsx +37 -0
  534. package/src/ui/sheet.tsx +289 -0
  535. package/src/ui/skeleton.tsx +25 -0
  536. package/src/ui/slider.tsx +176 -0
  537. package/src/ui/sonner.tsx +40 -0
  538. package/src/ui/spinner.tsx +23 -0
  539. package/src/ui/switch.tsx +94 -0
  540. package/src/ui/table.tsx +240 -0
  541. package/src/ui/tabs.tsx +233 -0
  542. package/src/ui/tailwind.css +2 -0
  543. package/src/ui/textarea.tsx +49 -0
  544. package/src/ui/theme.css +234 -0
  545. package/src/ui/toggle-group.tsx +215 -0
  546. package/src/ui/toggle.tsx +113 -0
@@ -0,0 +1,835 @@
1
+ import * as React from "react"
2
+ import { ScrollView, View, type ViewProps } from "@tarojs/components"
3
+ import { Check, ChevronRight } from "@open-dy/lucide-taro"
4
+
5
+ import { Portal } from "./portal"
6
+ import { computePosition, getRectById } from "../lib/measure"
7
+ import { isH5 } from "../lib/platform"
8
+ import { cn } from "../lib/utils"
9
+
10
+ type MenuSide = "top" | "bottom" | "left" | "right"
11
+ type MenuAlign = "start" | "center" | "end"
12
+
13
+ const MenubarContext = React.createContext<{
14
+ openMenu?: string
15
+ setOpenMenu?: (id: string | undefined) => void
16
+ } | null>(null)
17
+
18
+ const MenubarMenuContext = React.createContext<{
19
+ id: string
20
+ open: boolean
21
+ onOpenChange: (open: boolean) => void
22
+ triggerId: string
23
+ } | null>(null)
24
+
25
+ const MenubarRadioGroupContext = React.createContext<{
26
+ value?: string
27
+ onValueChange?: (value: string) => void
28
+ } | null>(null)
29
+
30
+ const MenubarSubContext = React.createContext<{
31
+ open?: boolean
32
+ onOpenChange?: (open: boolean) => void
33
+ triggerId: string
34
+ } | null>(null)
35
+
36
+ /**
37
+ * @desc 菜单栏组件。
38
+ * @param {Parameters<typeof Menubar>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
39
+ * @return {ReturnType<typeof Menubar>} 组件渲染结果;类型见返回值契约。
40
+ * @example
41
+ * ```tsx
42
+ * import { Menubar } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
43
+ * <Menubar />
44
+ * ```
45
+ */
46
+ function Menubar({ className, ...props }: ViewProps) {
47
+ const [openMenu, setOpenMenu] = React.useState<string | undefined>()
48
+
49
+ return (
50
+ <MenubarContext.Provider value={{ openMenu, setOpenMenu }}>
51
+ <View
52
+ data-slot="menubar"
53
+ className={cn(
54
+ "relative z-[60] flex h-8 items-center gap-0.5 rounded-lg border p-[3px]",
55
+ className
56
+ )}
57
+ {...props}
58
+ />
59
+ </MenubarContext.Provider>
60
+ )
61
+ }
62
+
63
+ /**
64
+ * @desc 菜单栏Menu。
65
+ * @param {Parameters<typeof MenubarMenu>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
66
+ * @return {ReturnType<typeof MenubarMenu>} 组件渲染结果;类型见返回值契约。
67
+ * @example
68
+ * ```tsx
69
+ * import { Menubar, MenubarMenu } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
70
+ * <Menubar><MenubarMenu><MenubarMenu /></MenubarMenu></Menubar>
71
+ * ```
72
+ */
73
+ function MenubarMenu({ children }: {
74
+ /** @desc 当前菜单的触发器和内容区;应放在 Menubar 内,同一 Menubar 同时只展开一个菜单。 */
75
+ children?: React.ReactNode }) {
76
+ const context = React.useContext(MenubarContext)
77
+ const id = React.useRef(`menubar-menu-${Math.random().toString(36).slice(2, 10)}`)
78
+ const triggerId = React.useRef(`${id.current}-trigger`)
79
+
80
+ const open = context?.openMenu === id.current
81
+ const onOpenChange = React.useCallback(
82
+ (nextOpen: boolean) => {
83
+ context?.setOpenMenu?.(nextOpen ? id.current : undefined)
84
+ },
85
+ [context]
86
+ )
87
+
88
+ return (
89
+ <MenubarMenuContext.Provider
90
+ value={{ id: id.current, open, onOpenChange, triggerId: triggerId.current }}
91
+ >
92
+ {children}
93
+ </MenubarMenuContext.Provider>
94
+ )
95
+ }
96
+
97
+ /**
98
+ * @desc 菜单栏分组容器。
99
+ * @param {Parameters<typeof MenubarGroup>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
100
+ * @return {ReturnType<typeof MenubarGroup>} 组件渲染结果;类型见返回值契约。
101
+ * @example
102
+ * ```tsx
103
+ * import { Menubar, MenubarMenu, MenubarGroup } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
104
+ * <Menubar><MenubarMenu><MenubarGroup /></MenubarMenu></Menubar>
105
+ * ```
106
+ */
107
+ function MenubarGroup({ ...props }: ViewProps) {
108
+ return <View data-slot="menubar-group" {...props} />
109
+ }
110
+
111
+ /**
112
+ * @desc 菜单栏跨层级渲染入口。
113
+ * @param {Parameters<typeof MenubarPortal>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
114
+ * @return {ReturnType<typeof MenubarPortal>} 组件渲染结果;类型见返回值契约。
115
+ * @example
116
+ * ```tsx
117
+ * import { Menubar, MenubarMenu, MenubarPortal } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
118
+ * <Menubar><MenubarMenu><MenubarPortal /></MenubarMenu></Menubar>
119
+ * ```
120
+ */
121
+ function MenubarPortal({ children }: {
122
+ /** @desc 要渲染的子节点;该兼容包装只返回 Fragment,不额外创建原生容器或执行挂载迁移。 */
123
+ children?: React.ReactNode }) {
124
+ return <>{children}</>
125
+ }
126
+
127
+ /**
128
+ * @desc 菜单栏触发器。
129
+ * @param {Parameters<typeof MenubarTrigger>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
130
+ * @return {ReturnType<typeof MenubarTrigger>} 组件渲染结果;类型见返回值契约。
131
+ * @example
132
+ * ```tsx
133
+ * import { Menubar, MenubarMenu, MenubarTrigger } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
134
+ * <Menubar><MenubarMenu><MenubarTrigger /></MenubarMenu></Menubar>
135
+ * ```
136
+ */
137
+ function MenubarTrigger({
138
+ className,
139
+ onClick,
140
+ ...props
141
+ }: ViewProps) {
142
+ const menu = React.useContext(MenubarMenuContext)
143
+
144
+ return (
145
+ <View
146
+ id={menu?.triggerId}
147
+ data-slot="menubar-trigger"
148
+ data-state={menu?.open ? "open" : "closed"}
149
+ aria-expanded={menu?.open}
150
+ className={cn(
151
+ "flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted",
152
+ menu?.open && "bg-muted",
153
+ className
154
+ )}
155
+ onClick={(event) => {
156
+ event.stopPropagation()
157
+ menu?.onOpenChange(!menu.open)
158
+ onClick?.(event)
159
+ }}
160
+ {...props}
161
+ />
162
+ )
163
+ }
164
+
165
+ /**
166
+ * @desc 菜单栏内容容器。
167
+ * @param {Parameters<typeof MenubarContent>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
168
+ * @return {ReturnType<typeof MenubarContent>} 组件渲染结果;类型见返回值契约。
169
+ * @example
170
+ * ```tsx
171
+ * import { Menubar, MenubarMenu, MenubarContent } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
172
+ * <Menubar><MenubarMenu><MenubarContent /></MenubarMenu></Menubar>
173
+ * ```
174
+ */
175
+ function MenubarContent({
176
+ className,
177
+ align = "start",
178
+ side = "bottom",
179
+ sideOffset = 4,
180
+ children,
181
+ ...props
182
+ }: ViewProps & {
183
+ /** @desc 相对触发器的对齐位置:start 起端、center 居中、end 末端;默认 start。 */
184
+ align?: MenuAlign
185
+ /** @desc 内容出现的方向:top、bottom、left 或 right;默认 bottom,定位时会结合视口边界调整。 */
186
+ side?: MenuSide
187
+ /** @desc 内容与触发器之间的间距,单位为像素,默认 4;参与测量后的浮层定位。 */
188
+ sideOffset?: number
189
+ }) {
190
+ const menu = React.useContext(MenubarMenuContext)
191
+ const contentId = React.useRef(`menubar-content-${Math.random().toString(36).slice(2, 10)}`)
192
+ const [position, setPosition] = React.useState<{ left: number; top: number } | null>(null)
193
+
194
+ React.useEffect(() => {
195
+ if (!menu?.open) {
196
+ setPosition(null)
197
+ return
198
+ }
199
+
200
+ let cancelled = false
201
+
202
+ const updatePosition = async () => {
203
+ const [triggerRect, contentRect] = await Promise.all([
204
+ getRectById(menu.triggerId),
205
+ getRectById(contentId.current),
206
+ ])
207
+
208
+ if (cancelled || !triggerRect?.width || !contentRect?.width) return
209
+
210
+ setPosition(
211
+ computePosition({
212
+ triggerRect,
213
+ contentRect,
214
+ align,
215
+ side,
216
+ sideOffset,
217
+ })
218
+ )
219
+ }
220
+
221
+ const timer =
222
+ typeof requestAnimationFrame !== "undefined"
223
+ ? requestAnimationFrame(() => updatePosition())
224
+ : (setTimeout(() => updatePosition(), 0) as unknown as number)
225
+
226
+ return () => {
227
+ cancelled = true
228
+ if (typeof cancelAnimationFrame !== "undefined") {
229
+ cancelAnimationFrame(timer)
230
+ } else {
231
+ clearTimeout(timer)
232
+ }
233
+ }
234
+ }, [align, menu, side, sideOffset])
235
+
236
+ React.useEffect(() => {
237
+ if (!menu?.open || !isH5() || typeof document === "undefined") return
238
+
239
+ const onKeyDown = (event: KeyboardEvent) => {
240
+ if (event.key === "Escape") {
241
+ menu.onOpenChange(false)
242
+ }
243
+ }
244
+
245
+ document.addEventListener("keydown", onKeyDown)
246
+ return () => document.removeEventListener("keydown", onKeyDown)
247
+ }, [menu])
248
+
249
+ if (!menu?.open) return null
250
+
251
+ const overlayStyle =
252
+ position && side === "bottom"
253
+ ? ({ top: Math.max(position.top - sideOffset, 0) } as React.CSSProperties)
254
+ : undefined
255
+
256
+ return (
257
+ <Portal>
258
+ <View
259
+ className="fixed inset-0 z-40 bg-transparent"
260
+ style={overlayStyle}
261
+ onClick={() => menu.onOpenChange(false)}
262
+ />
263
+ <View
264
+ id={contentId.current}
265
+ data-slot="menubar-content"
266
+ data-state="open"
267
+ data-side={side}
268
+ className={cn(
269
+ "fixed z-50 min-w-36 overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10",
270
+ className
271
+ )}
272
+ style={
273
+ position
274
+ ? ({ left: position.left, top: position.top } as React.CSSProperties)
275
+ : ({
276
+ left: 0,
277
+ top: 0,
278
+ opacity: 0,
279
+ pointerEvents: "none",
280
+ } as React.CSSProperties)
281
+ }
282
+ onClick={(event) => event.stopPropagation()}
283
+ {...props}
284
+ >
285
+ <ScrollView scrollY className="max-h-[50vh] overflow-x-hidden overflow-y-auto">
286
+ {children}
287
+ </ScrollView>
288
+ </View>
289
+ </Portal>
290
+ )
291
+ }
292
+
293
+ /**
294
+ * @desc 菜单栏条目。
295
+ * @param {Parameters<typeof MenubarItem>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
296
+ * @return {ReturnType<typeof MenubarItem>} 组件渲染结果;类型见返回值契约。
297
+ * @example
298
+ * ```tsx
299
+ * import { Menubar, MenubarMenu, MenubarItem } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
300
+ * <Menubar><MenubarMenu><MenubarItem /></MenubarMenu></Menubar>
301
+ * ```
302
+ */
303
+ function MenubarItem({
304
+ className,
305
+ inset,
306
+ variant = "default",
307
+ disabled,
308
+ closeOnSelect = true,
309
+ onClick,
310
+ ...props
311
+ }: ViewProps & {
312
+ /** @desc 是否使用左侧缩进以对齐选择指示,默认 false;为 true 时使用 pl-7。 */
313
+ inset?: boolean
314
+ /** @desc 项目视觉样式,默认 default;destructive 使用危险操作色,仅影响样式。 */
315
+ variant?: "default" | "destructive"
316
+ /** @desc 是否禁止当前项的内部点击操作;默认可操作,禁用后不触发内部选择或关闭逻辑。 */
317
+ disabled?: boolean
318
+ /** @desc 点击操作后是否关闭父菜单,默认 true;为 false 时保留展开状态。 */
319
+ closeOnSelect?: boolean
320
+ }) {
321
+ const menu = React.useContext(MenubarMenuContext)
322
+
323
+ return (
324
+ <View
325
+ data-slot="menubar-item"
326
+ data-inset={inset ? "" : undefined}
327
+ data-variant={variant}
328
+ data-disabled={disabled ? "" : undefined}
329
+ className={cn(
330
+ "group/menubar-item relative flex cursor-default select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden transition-colors [&_svg:not([class*='size-'])]:size-4",
331
+ inset && "pl-7",
332
+ variant === "destructive" && "text-destructive",
333
+ disabled && "pointer-events-none opacity-50",
334
+ className
335
+ )}
336
+ onClick={(event) => {
337
+ if (disabled) return
338
+ onClick?.(event)
339
+ if (closeOnSelect) menu?.onOpenChange(false)
340
+ }}
341
+ {...props}
342
+ />
343
+ )
344
+ }
345
+
346
+ /**
347
+ * @desc 菜单栏复选条目。
348
+ * @param {Parameters<typeof MenubarCheckboxItem>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
349
+ * @return {ReturnType<typeof MenubarCheckboxItem>} 组件渲染结果;类型见返回值契约。
350
+ * @example
351
+ * ```tsx
352
+ * import { Menubar, MenubarMenu, MenubarCheckboxItem } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
353
+ * <Menubar><MenubarMenu><MenubarCheckboxItem /></MenubarMenu></Menubar>
354
+ * ```
355
+ */
356
+ function MenubarCheckboxItem({
357
+ className,
358
+ children,
359
+ checked: checkedProp,
360
+ defaultChecked = false,
361
+ onCheckedChange,
362
+ inset,
363
+ disabled,
364
+ closeOnSelect = false,
365
+ onClick,
366
+ ...props
367
+ }: ViewProps & {
368
+ /** @desc 受控选中状态;传入后以该值为准,需在 onCheckedChange 中更新。省略时由内部状态管理。 */
369
+ checked?: boolean
370
+ /** @desc 非受控模式的初始选中状态,默认 false;仅初始化时读取,传入 checked 后不生效。 */
371
+ defaultChecked?: boolean
372
+ /** @desc 用户点击切换时调用,参数为下一选中状态;禁用时不触发,受控模式需同步 checked。 */
373
+ onCheckedChange?: (checked: boolean) => void
374
+ /** @desc 是否使用左侧缩进以对齐选择指示,默认 false;为 true 时使用 pl-7。 */
375
+ inset?: boolean
376
+ /** @desc 是否禁止当前项的内部点击操作;默认可操作,禁用后不触发内部选择或关闭逻辑。 */
377
+ disabled?: boolean
378
+ /** @desc 切换勾选后是否关闭父菜单,默认 false;可在菜单内连续勾选多项。 */
379
+ closeOnSelect?: boolean
380
+ }) {
381
+ const menu = React.useContext(MenubarMenuContext)
382
+ const [checkedState, setCheckedState] = React.useState(defaultChecked)
383
+ const checked = checkedProp !== undefined ? checkedProp : checkedState
384
+
385
+ return (
386
+ <View
387
+ data-slot="menubar-checkbox-item"
388
+ data-inset={inset ? "" : undefined}
389
+ data-disabled={disabled ? "" : undefined}
390
+ data-state={checked ? "checked" : "unchecked"}
391
+ className={cn(
392
+ "relative flex cursor-default select-none items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden transition-colors",
393
+ inset && "pl-7",
394
+ disabled && "pointer-events-none opacity-50",
395
+ className
396
+ )}
397
+ onClick={(event) => {
398
+ if (disabled) return
399
+ const nextChecked = !checked
400
+ if (checkedProp === undefined) {
401
+ setCheckedState(nextChecked)
402
+ }
403
+ onCheckedChange?.(nextChecked)
404
+ onClick?.(event)
405
+ if (closeOnSelect) menu?.onOpenChange(false)
406
+ }}
407
+ {...props}
408
+ >
409
+ <View className="pointer-events-none absolute left-1.5 flex size-4 items-center justify-center">
410
+ {checked ? <Check size={16} color="#666" /> : null}
411
+ </View>
412
+ {children}
413
+ </View>
414
+ )
415
+ }
416
+
417
+ /**
418
+ * @desc 菜单栏单选分组。
419
+ * @param {Parameters<typeof MenubarRadioGroup>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
420
+ * @return {ReturnType<typeof MenubarRadioGroup>} 组件渲染结果;类型见返回值契约。
421
+ * @example
422
+ * ```tsx
423
+ * import { Menubar, MenubarMenu, MenubarRadioGroup } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
424
+ * <Menubar><MenubarMenu><MenubarRadioGroup /></MenubarMenu></Menubar>
425
+ * ```
426
+ */
427
+ function MenubarRadioGroup({
428
+ value: valueProp,
429
+ defaultValue,
430
+ onValueChange,
431
+ ...props
432
+ }: ViewProps & {
433
+ /** @desc 受控选中项的标识;传入后以该值为准,需在 onValueChange 中更新。省略时由内部状态管理。 */
434
+ value?: string
435
+ /** @desc 非受控模式的初始选中项;省略时没有选中项,传入 value 后不生效。 */
436
+ defaultValue?: string
437
+ /** @desc 用户选择项目时调用,参数为下一选中项标识;受控模式需由调用方同步 value。 */
438
+ onValueChange?: (value: string) => void
439
+ }) {
440
+ const [valueState, setValueState] = React.useState<string | undefined>(defaultValue)
441
+ const value = valueProp !== undefined ? valueProp : valueState
442
+
443
+ const handleValueChange = React.useCallback(
444
+ (nextValue: string) => {
445
+ if (valueProp === undefined) {
446
+ setValueState(nextValue)
447
+ }
448
+ onValueChange?.(nextValue)
449
+ },
450
+ [onValueChange, valueProp]
451
+ )
452
+
453
+ return (
454
+ <MenubarRadioGroupContext.Provider value={{ value, onValueChange: handleValueChange }}>
455
+ <View data-slot="menubar-radio-group" {...props} />
456
+ </MenubarRadioGroupContext.Provider>
457
+ )
458
+ }
459
+
460
+ /**
461
+ * @desc 菜单栏单选条目。
462
+ * @param {Parameters<typeof MenubarRadioItem>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
463
+ * @return {ReturnType<typeof MenubarRadioItem>} 组件渲染结果;类型见返回值契约。
464
+ * @example
465
+ * ```tsx
466
+ * import { Menubar, MenubarMenu, MenubarRadioItem } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
467
+ * <Menubar><MenubarMenu><MenubarRadioItem value="one" /></MenubarMenu></Menubar>
468
+ * ```
469
+ */
470
+ function MenubarRadioItem({
471
+ className,
472
+ children,
473
+ value,
474
+ checked: checkedProp,
475
+ inset,
476
+ disabled,
477
+ closeOnSelect = false,
478
+ onClick,
479
+ ...props
480
+ }: ViewProps & {
481
+ /** @desc 当前选项的唯一标识,点击时传给父 MenubarRadioGroup.onValueChange。 */
482
+ value: string
483
+ /** @desc 选中指示的可选覆盖值;省略时按父单选组 value 判断。传入后调用方需同步该值。 */
484
+ checked?: boolean
485
+ /** @desc 是否使用左侧缩进以对齐选择指示,默认 false;为 true 时使用 pl-7。 */
486
+ inset?: boolean
487
+ /** @desc 是否禁止当前项的内部点击操作;默认可操作,禁用后不触发内部选择或关闭逻辑。 */
488
+ disabled?: boolean
489
+ /** @desc 点击选择后是否关闭父菜单,默认 false;为 true 时请求关闭父菜单。 */
490
+ closeOnSelect?: boolean
491
+ }) {
492
+ const menu = React.useContext(MenubarMenuContext)
493
+ const group = React.useContext(MenubarRadioGroupContext)
494
+ const checked = checkedProp !== undefined ? checkedProp : group?.value === value
495
+
496
+ return (
497
+ <View
498
+ data-slot="menubar-radio-item"
499
+ data-inset={inset ? "" : undefined}
500
+ data-disabled={disabled ? "" : undefined}
501
+ data-state={checked ? "checked" : "unchecked"}
502
+ className={cn(
503
+ "relative flex cursor-default select-none items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden transition-colors",
504
+ inset && "pl-7",
505
+ disabled && "pointer-events-none opacity-50",
506
+ className
507
+ )}
508
+ onClick={(event) => {
509
+ console.log(event)
510
+ if (disabled) return
511
+ group?.onValueChange?.(value)
512
+ onClick?.(event)
513
+ if (closeOnSelect) menu?.onOpenChange(false)
514
+ }}
515
+ {...props}
516
+ >
517
+ <View className="pointer-events-none absolute left-1.5 flex size-4 items-center justify-center">
518
+ {checked ? <Check size={16} color="#666" /> : null}
519
+ </View>
520
+ {children}
521
+ </View>
522
+ )
523
+ }
524
+
525
+ /**
526
+ * @desc 菜单栏标签文本。
527
+ * @param {Parameters<typeof MenubarLabel>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
528
+ * @return {ReturnType<typeof MenubarLabel>} 组件渲染结果;类型见返回值契约。
529
+ * @example
530
+ * ```tsx
531
+ * import { Menubar, MenubarMenu, MenubarLabel } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
532
+ * <Menubar><MenubarMenu><MenubarLabel /></MenubarMenu></Menubar>
533
+ * ```
534
+ */
535
+ function MenubarLabel({
536
+ className,
537
+ inset,
538
+ ...props
539
+ }: ViewProps & {
540
+ /** @desc 是否使用左侧缩进以对齐选择指示,默认 false;为 true 时使用 pl-7。 */
541
+ inset?: boolean
542
+ }) {
543
+ return (
544
+ <View
545
+ data-slot="menubar-label"
546
+ data-inset={inset ? "" : undefined}
547
+ className={cn("px-1.5 py-1 text-sm font-medium", inset && "pl-7", className)}
548
+ {...props}
549
+ />
550
+ )
551
+ }
552
+
553
+ /**
554
+ * @desc 菜单栏分隔线。
555
+ * @param {Parameters<typeof MenubarSeparator>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
556
+ * @return {ReturnType<typeof MenubarSeparator>} 组件渲染结果;类型见返回值契约。
557
+ * @example
558
+ * ```tsx
559
+ * import { Menubar, MenubarMenu, MenubarSeparator } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
560
+ * <Menubar><MenubarMenu><MenubarSeparator /></MenubarMenu></Menubar>
561
+ * ```
562
+ */
563
+ function MenubarSeparator({
564
+ className,
565
+ ...props
566
+ }: ViewProps) {
567
+ return (
568
+ <View
569
+ data-slot="menubar-separator"
570
+ className={cn("-mx-1 my-1 h-px bg-border", className)}
571
+ {...props}
572
+ />
573
+ )
574
+ }
575
+
576
+ /**
577
+ * @desc 菜单栏快捷键说明。
578
+ * @param {Parameters<typeof MenubarShortcut>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
579
+ * @return {ReturnType<typeof MenubarShortcut>} 组件渲染结果;类型见返回值契约。
580
+ * @example
581
+ * ```tsx
582
+ * import { Menubar, MenubarMenu, MenubarShortcut } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
583
+ * <Menubar><MenubarMenu><MenubarShortcut /></MenubarMenu></Menubar>
584
+ * ```
585
+ */
586
+ function MenubarShortcut({
587
+ className,
588
+ ...props
589
+ }: ViewProps) {
590
+ return (
591
+ <View
592
+ data-slot="menubar-shortcut"
593
+ className={cn(
594
+ "ml-auto text-xs tracking-widest text-muted-foreground",
595
+ className
596
+ )}
597
+ {...props}
598
+ />
599
+ )
600
+ }
601
+
602
+ /**
603
+ * @desc 菜单栏子菜单上下文。
604
+ * @param {Parameters<typeof MenubarSub>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
605
+ * @return {ReturnType<typeof MenubarSub>} 组件渲染结果;类型见返回值契约。
606
+ * @example
607
+ * ```tsx
608
+ * import { Menubar, MenubarMenu, MenubarSub } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
609
+ * <Menubar><MenubarMenu><MenubarSub /></MenubarMenu></Menubar>
610
+ * ```
611
+ */
612
+ function MenubarSub({
613
+ open: openProp,
614
+ defaultOpen,
615
+ onOpenChange,
616
+ children,
617
+ }: {
618
+ /** @desc 受控展开状态;传入后以该值为准,需在 onOpenChange 中更新。省略时由组件内部管理。 */
619
+ open?: boolean
620
+ /** @desc 非受控模式的初始展开状态,默认 false;仅初始化时读取,传入 open 后不生效。 */
621
+ defaultOpen?: boolean
622
+ /** @desc 触发器或关闭操作请求改变展开状态时调用,参数为下一状态;受控模式需由调用方同步 open。 */
623
+ onOpenChange?: (open: boolean) => void
624
+ /** @desc 同一实例的触发器、内容区等组合子组件;省略时不显示内容,子组件通过上下文共享状态。 */
625
+ children?: React.ReactNode
626
+ }) {
627
+ const menu = React.useContext(MenubarMenuContext)
628
+ const [openState, setOpenState] = React.useState(defaultOpen ?? false)
629
+ const open = openProp !== undefined ? openProp : openState
630
+ const triggerId = React.useRef(`menubar-sub-trigger-${Math.random().toString(36).slice(2, 10)}`)
631
+
632
+ const handleOpenChange = React.useCallback(
633
+ (nextOpen: boolean) => {
634
+ if (openProp === undefined) {
635
+ setOpenState(nextOpen)
636
+ }
637
+ onOpenChange?.(nextOpen)
638
+ },
639
+ [onOpenChange, openProp]
640
+ )
641
+
642
+ React.useEffect(() => {
643
+ if (!menu?.open && open) {
644
+ handleOpenChange(false)
645
+ }
646
+ }, [handleOpenChange, menu?.open, open])
647
+
648
+ return (
649
+ <MenubarSubContext.Provider
650
+ value={{ open, onOpenChange: handleOpenChange, triggerId: triggerId.current }}
651
+ >
652
+ {children}
653
+ </MenubarSubContext.Provider>
654
+ )
655
+ }
656
+
657
+ /**
658
+ * @desc 菜单栏子菜单触发器。
659
+ * @param {Parameters<typeof MenubarSubTrigger>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
660
+ * @return {ReturnType<typeof MenubarSubTrigger>} 组件渲染结果;类型见返回值契约。
661
+ * @example
662
+ * ```tsx
663
+ * import { Menubar, MenubarMenu, MenubarSubTrigger } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
664
+ * <Menubar><MenubarMenu><MenubarSubTrigger /></MenubarMenu></Menubar>
665
+ * ```
666
+ */
667
+ function MenubarSubTrigger({
668
+ className,
669
+ inset,
670
+ disabled,
671
+ children,
672
+ onClick,
673
+ ...props
674
+ }: ViewProps & {
675
+ /** @desc 是否使用左侧缩进以对齐选择指示,默认 false;为 true 时使用 pl-7。 */
676
+ inset?: boolean
677
+ /** @desc 是否禁止当前项的内部点击操作;默认可操作,禁用后不触发内部选择或关闭逻辑。 */
678
+ disabled?: boolean
679
+ }) {
680
+ const sub = React.useContext(MenubarSubContext)
681
+
682
+ return (
683
+ <View
684
+ id={sub?.triggerId}
685
+ data-slot="menubar-sub-trigger"
686
+ data-inset={inset ? "" : undefined}
687
+ data-disabled={disabled ? "" : undefined}
688
+ data-state={sub?.open ? "open" : "closed"}
689
+ className={cn(
690
+ "relative flex cursor-default select-none items-center justify-between gap-1.5 rounded-md px-1.5 py-1 text-sm transition-colors",
691
+ inset && "pl-7",
692
+ sub?.open && "bg-accent text-accent-foreground",
693
+ disabled && "pointer-events-none opacity-50",
694
+ className
695
+ )}
696
+ onClick={(event) => {
697
+ event.stopPropagation()
698
+ if (disabled) return
699
+ sub?.onOpenChange?.(!sub.open)
700
+ onClick?.(event)
701
+ }}
702
+ {...props}
703
+ >
704
+ <View>{children}</View>
705
+ <View className="flex items-center justify-center opacity-50">
706
+ <ChevronRight size={16} color="#666" />
707
+ </View>
708
+ </View>
709
+ )
710
+ }
711
+
712
+ /**
713
+ * @desc 菜单栏子菜单内容。
714
+ * @param {Parameters<typeof MenubarSubContent>[0]} props 组件属性;自有字段的用途及默认行为见下表,继承属性另列。
715
+ * @return {ReturnType<typeof MenubarSubContent>} 组件渲染结果;类型见返回值契约。
716
+ * @example
717
+ * ```tsx
718
+ * import { Menubar, MenubarMenu, MenubarSubContent } from '@open-dy/vibecoding-sdk-taro/ui/menubar'
719
+ * <Menubar><MenubarMenu><MenubarSubContent /></MenubarMenu></Menubar>
720
+ * ```
721
+ */
722
+ function MenubarSubContent({
723
+ className,
724
+ align = "start",
725
+ side = "right",
726
+ sideOffset = 4,
727
+ children,
728
+ ...props
729
+ }: ViewProps & {
730
+ /** @desc 相对触发器的对齐位置:start 起端、center 居中、end 末端;默认 start。 */
731
+ align?: MenuAlign
732
+ /** @desc 内容出现的方向:top、bottom、left 或 right;默认 right,定位时会结合视口边界调整。 */
733
+ side?: MenuSide
734
+ /** @desc 内容与触发器之间的间距,单位为像素,默认 4;参与测量后的浮层定位。 */
735
+ sideOffset?: number
736
+ }) {
737
+ const menu = React.useContext(MenubarMenuContext)
738
+ const sub = React.useContext(MenubarSubContext)
739
+ const contentId = React.useRef(`menubar-sub-content-${Math.random().toString(36).slice(2, 10)}`)
740
+ const [position, setPosition] = React.useState<{ left: number; top: number } | null>(null)
741
+
742
+ React.useEffect(() => {
743
+ if (!menu?.open || !sub?.open) {
744
+ setPosition(null)
745
+ return
746
+ }
747
+
748
+ let cancelled = false
749
+
750
+ const updatePosition = async () => {
751
+ const [triggerRect, contentRect] = await Promise.all([
752
+ getRectById(sub.triggerId),
753
+ getRectById(contentId.current),
754
+ ])
755
+
756
+ if (cancelled || !triggerRect?.width || !contentRect?.width) return
757
+
758
+ setPosition(
759
+ computePosition({
760
+ triggerRect,
761
+ contentRect,
762
+ align,
763
+ side,
764
+ sideOffset,
765
+ })
766
+ )
767
+ }
768
+
769
+ const timer =
770
+ typeof requestAnimationFrame !== "undefined"
771
+ ? requestAnimationFrame(() => updatePosition())
772
+ : (setTimeout(() => updatePosition(), 0) as unknown as number)
773
+
774
+ return () => {
775
+ cancelled = true
776
+ if (typeof cancelAnimationFrame !== "undefined") {
777
+ cancelAnimationFrame(timer)
778
+ } else {
779
+ clearTimeout(timer)
780
+ }
781
+ }
782
+ }, [align, menu?.open, side, sideOffset, sub])
783
+
784
+ if (!menu?.open || !sub?.open) return null
785
+
786
+ return (
787
+ <Portal>
788
+ <View
789
+ id={contentId.current}
790
+ data-slot="menubar-sub-content"
791
+ data-state="open"
792
+ data-side={side}
793
+ className={cn(
794
+ "fixed z-50 min-w-32 overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10",
795
+ className
796
+ )}
797
+ style={
798
+ position
799
+ ? ({ left: position.left, top: position.top } as React.CSSProperties)
800
+ : ({
801
+ left: 0,
802
+ top: 0,
803
+ opacity: 0,
804
+ pointerEvents: "none",
805
+ } as React.CSSProperties)
806
+ }
807
+ onClick={(event) => event.stopPropagation()}
808
+ {...props}
809
+ >
810
+ <ScrollView scrollY className="max-h-[50vh] overflow-x-hidden overflow-y-auto">
811
+ {children}
812
+ </ScrollView>
813
+ </View>
814
+ </Portal>
815
+ )
816
+ }
817
+
818
+ export {
819
+ Menubar,
820
+ MenubarPortal,
821
+ MenubarMenu,
822
+ MenubarTrigger,
823
+ MenubarContent,
824
+ MenubarGroup,
825
+ MenubarSeparator,
826
+ MenubarLabel,
827
+ MenubarItem,
828
+ MenubarShortcut,
829
+ MenubarCheckboxItem,
830
+ MenubarRadioGroup,
831
+ MenubarRadioItem,
832
+ MenubarSub,
833
+ MenubarSubTrigger,
834
+ MenubarSubContent,
835
+ }