@coze-arch/cli 0.0.1-alpha.de5a13 → 0.0.1-alpha.deaedf

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 (143) hide show
  1. package/README.md +1 -0
  2. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +1 -1
  3. package/lib/__templates__/expo/client/components/Screen.tsx +2 -2
  4. package/lib/__templates__/expo/client/eslint.config.mjs +7 -0
  5. package/lib/__templates__/expo/client/metro.config.js +3 -0
  6. package/lib/__templates__/expo/client/scripts/install-missing-deps.js +10 -10
  7. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/index.js +9 -0
  8. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/rule.js +112 -0
  9. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/tech.md +94 -0
  10. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/index.js +9 -0
  11. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/rule.js +120 -0
  12. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/tech.md +58 -0
  13. package/lib/__templates__/expo/pnpm-lock.yaml +8 -5
  14. package/lib/__templates__/expo/server/package.json +1 -1
  15. package/lib/__templates__/native-static/.coze +11 -0
  16. package/lib/__templates__/native-static/index.html +33 -0
  17. package/lib/__templates__/native-static/styles/main.css +136 -0
  18. package/lib/__templates__/native-static/template.config.js +22 -0
  19. package/lib/__templates__/nextjs/.babelrc +3 -0
  20. package/lib/__templates__/nextjs/README.md +5 -0
  21. package/lib/__templates__/nextjs/eslint.config.mjs +5 -0
  22. package/lib/__templates__/nextjs/next.config.ts +1 -2
  23. package/lib/__templates__/nextjs/package.json +3 -6
  24. package/lib/__templates__/nextjs/pnpm-lock.yaml +1036 -10
  25. package/lib/__templates__/nextjs/scripts/build.sh +4 -1
  26. package/lib/__templates__/nextjs/scripts/dev.sh +8 -2
  27. package/lib/__templates__/nextjs/scripts/start.sh +7 -1
  28. package/lib/__templates__/nextjs/src/app/layout.tsx +1 -1
  29. package/lib/__templates__/nextjs/src/app/page.tsx +1 -2
  30. package/lib/__templates__/nextjs/src/server.ts +35 -0
  31. package/lib/__templates__/nextjs/tsconfig.json +1 -1
  32. package/lib/__templates__/nuxt-vue/.coze +12 -0
  33. package/lib/__templates__/nuxt-vue/README.md +73 -0
  34. package/lib/__templates__/nuxt-vue/_gitignore +24 -0
  35. package/lib/__templates__/nuxt-vue/_npmrc +23 -0
  36. package/lib/__templates__/nuxt-vue/app/app.vue +6 -0
  37. package/lib/__templates__/nuxt-vue/app/pages/index.vue +23 -0
  38. package/lib/__templates__/nuxt-vue/assets/css/main.css +24 -0
  39. package/lib/__templates__/nuxt-vue/nuxt.config.ts +116 -0
  40. package/lib/__templates__/nuxt-vue/package.json +35 -0
  41. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +8759 -0
  42. package/lib/__templates__/nuxt-vue/postcss.config.mjs +8 -0
  43. package/lib/__templates__/nuxt-vue/public/favicon.ico +0 -0
  44. package/lib/__templates__/nuxt-vue/public/robots.txt +2 -0
  45. package/lib/__templates__/nuxt-vue/scripts/build.sh +14 -0
  46. package/lib/__templates__/nuxt-vue/scripts/dev.sh +39 -0
  47. package/lib/__templates__/nuxt-vue/scripts/prepare.sh +14 -0
  48. package/lib/__templates__/nuxt-vue/scripts/start.sh +21 -0
  49. package/lib/__templates__/nuxt-vue/server/api/hello.ts +10 -0
  50. package/lib/__templates__/nuxt-vue/server/middleware/logger.ts +10 -0
  51. package/lib/__templates__/nuxt-vue/server/routes/health.ts +10 -0
  52. package/lib/__templates__/nuxt-vue/tailwind.config.js +13 -0
  53. package/lib/__templates__/nuxt-vue/template.config.js +87 -0
  54. package/lib/__templates__/nuxt-vue/tsconfig.json +18 -0
  55. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +107 -37
  56. package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +24 -1
  57. package/lib/__templates__/taro/README.md +138 -62
  58. package/lib/__templates__/taro/config/index.ts +105 -41
  59. package/lib/__templates__/taro/config/prod.ts +4 -5
  60. package/lib/__templates__/taro/eslint.config.mjs +82 -4
  61. package/lib/__templates__/taro/package.json +23 -7
  62. package/lib/__templates__/taro/patches/@tarojs__plugin-mini-ci@4.1.9.patch +30 -0
  63. package/lib/__templates__/taro/pnpm-lock.yaml +1198 -214
  64. package/lib/__templates__/taro/server/package.json +3 -1
  65. package/lib/__templates__/taro/src/app.css +140 -47
  66. package/lib/__templates__/taro/src/app.tsx +9 -0
  67. package/lib/__templates__/taro/src/components/ui/accordion.tsx +159 -0
  68. package/lib/__templates__/taro/src/components/ui/alert-dialog.tsx +260 -0
  69. package/lib/__templates__/taro/src/components/ui/alert.tsx +60 -0
  70. package/lib/__templates__/taro/src/components/ui/aspect-ratio.tsx +36 -0
  71. package/lib/__templates__/taro/src/components/ui/avatar.tsx +84 -0
  72. package/lib/__templates__/taro/src/components/ui/badge.tsx +37 -0
  73. package/lib/__templates__/taro/src/components/ui/breadcrumb.tsx +117 -0
  74. package/lib/__templates__/taro/src/components/ui/button-group.tsx +83 -0
  75. package/lib/__templates__/taro/src/components/ui/button.tsx +67 -0
  76. package/lib/__templates__/taro/src/components/ui/calendar.tsx +394 -0
  77. package/lib/__templates__/taro/src/components/ui/card.tsx +108 -0
  78. package/lib/__templates__/taro/src/components/ui/carousel.tsx +228 -0
  79. package/lib/__templates__/taro/src/components/ui/checkbox.tsx +58 -0
  80. package/lib/__templates__/taro/src/components/ui/code-block.tsx +169 -0
  81. package/lib/__templates__/taro/src/components/ui/collapsible.tsx +71 -0
  82. package/lib/__templates__/taro/src/components/ui/command.tsx +385 -0
  83. package/lib/__templates__/taro/src/components/ui/context-menu.tsx +614 -0
  84. package/lib/__templates__/taro/src/components/ui/dialog.tsx +256 -0
  85. package/lib/__templates__/taro/src/components/ui/drawer.tsx +192 -0
  86. package/lib/__templates__/taro/src/components/ui/dropdown-menu.tsx +561 -0
  87. package/lib/__templates__/taro/src/components/ui/field.tsx +228 -0
  88. package/lib/__templates__/taro/src/components/ui/hover-card.tsx +282 -0
  89. package/lib/__templates__/taro/src/components/ui/input-group.tsx +197 -0
  90. package/lib/__templates__/taro/src/components/ui/input-otp.tsx +136 -0
  91. package/lib/__templates__/taro/src/components/ui/input.tsx +56 -0
  92. package/lib/__templates__/taro/src/components/ui/label.tsx +24 -0
  93. package/lib/__templates__/taro/src/components/ui/menubar.tsx +595 -0
  94. package/lib/__templates__/taro/src/components/ui/navigation-menu.tsx +264 -0
  95. package/lib/__templates__/taro/src/components/ui/pagination.tsx +118 -0
  96. package/lib/__templates__/taro/src/components/ui/popover.tsx +291 -0
  97. package/lib/__templates__/taro/src/components/ui/portal.tsx +19 -0
  98. package/lib/__templates__/taro/src/components/ui/progress.tsx +28 -0
  99. package/lib/__templates__/taro/src/components/ui/radio-group.tsx +64 -0
  100. package/lib/__templates__/taro/src/components/ui/resizable.tsx +346 -0
  101. package/lib/__templates__/taro/src/components/ui/scroll-area.tsx +34 -0
  102. package/lib/__templates__/taro/src/components/ui/select.tsx +438 -0
  103. package/lib/__templates__/taro/src/components/ui/separator.tsx +30 -0
  104. package/lib/__templates__/taro/src/components/ui/sheet.tsx +262 -0
  105. package/lib/__templates__/taro/src/components/ui/skeleton.tsx +17 -0
  106. package/lib/__templates__/taro/src/components/ui/slider.tsx +203 -0
  107. package/lib/__templates__/taro/src/components/ui/sonner.tsx +1 -0
  108. package/lib/__templates__/taro/src/components/ui/switch.tsx +55 -0
  109. package/lib/__templates__/taro/src/components/ui/table.tsx +142 -0
  110. package/lib/__templates__/taro/src/components/ui/tabs.tsx +114 -0
  111. package/lib/__templates__/taro/src/components/ui/textarea.tsx +54 -0
  112. package/lib/__templates__/taro/src/components/ui/toast.tsx +517 -0
  113. package/lib/__templates__/taro/src/components/ui/toggle-group.tsx +120 -0
  114. package/lib/__templates__/taro/src/components/ui/toggle.tsx +77 -0
  115. package/lib/__templates__/taro/src/components/ui/tooltip.tsx +455 -0
  116. package/lib/__templates__/taro/src/lib/hooks/use-keyboard-offset.ts +37 -0
  117. package/lib/__templates__/taro/src/lib/measure.ts +115 -0
  118. package/lib/__templates__/taro/src/lib/platform.ts +12 -0
  119. package/lib/__templates__/taro/src/lib/utils.ts +6 -0
  120. package/lib/__templates__/taro/src/presets/dev-debug.ts +23 -0
  121. package/lib/__templates__/taro/src/presets/h5-container.tsx +15 -0
  122. package/lib/__templates__/taro/src/presets/h5-navbar.tsx +238 -0
  123. package/lib/__templates__/taro/src/presets/h5-styles.ts +220 -0
  124. package/lib/__templates__/taro/src/presets/index.tsx +18 -0
  125. package/lib/__templates__/templates.json +43 -0
  126. package/lib/__templates__/vite/README.md +190 -11
  127. package/lib/__templates__/vite/_gitignore +1 -0
  128. package/lib/__templates__/vite/eslint.config.mjs +6 -1
  129. package/lib/__templates__/vite/package.json +14 -5
  130. package/lib/__templates__/vite/pnpm-lock.yaml +768 -24
  131. package/lib/__templates__/vite/scripts/build.sh +4 -1
  132. package/lib/__templates__/vite/scripts/dev.sh +9 -2
  133. package/lib/__templates__/vite/scripts/start.sh +9 -3
  134. package/lib/__templates__/vite/server/routes/index.ts +31 -0
  135. package/lib/__templates__/vite/server/server.ts +65 -0
  136. package/lib/__templates__/vite/server/vite.ts +67 -0
  137. package/lib/__templates__/vite/tsconfig.json +4 -3
  138. package/lib/__templates__/vite/vite.config.ts +5 -0
  139. package/lib/cli.js +124 -103
  140. package/package.json +7 -3
  141. package/lib/__templates__/taro/src/app.ts +0 -14
  142. package/lib/__templates__/taro/src/utils/h5-styles.ts +0 -22
  143. package/lib/__templates__/taro/src/utils/wx-debug.ts +0 -23
@@ -0,0 +1,60 @@
1
+ import * as React from "react"
2
+ import { View } from "@tarojs/components"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+
5
+ import { cn } from "@/lib/utils"
6
+
7
+ const alertVariants = cva(
8
+ "relative w-full rounded-lg border p-4 [&>svg+*]:pl-7 [&>svg+*+*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-background text-foreground",
13
+ destructive:
14
+ "border-destructive border-opacity-50 text-destructive dark:border-destructive [&>svg]:text-destructive",
15
+ },
16
+ },
17
+ defaultVariants: {
18
+ variant: "default",
19
+ },
20
+ }
21
+ )
22
+
23
+ const Alert = React.forwardRef<
24
+ React.ElementRef<typeof View>,
25
+ React.ComponentPropsWithoutRef<typeof View> & VariantProps<typeof alertVariants>
26
+ >(({ className, variant, ...props }, ref) => (
27
+ <View
28
+ ref={ref}
29
+ role="alert"
30
+ className={cn(alertVariants({ variant }), className)}
31
+ {...props}
32
+ />
33
+ ))
34
+ Alert.displayName = "Alert"
35
+
36
+ const AlertTitle = React.forwardRef<
37
+ React.ElementRef<typeof View>,
38
+ React.ComponentPropsWithoutRef<typeof View>
39
+ >(({ className, ...props }, ref) => (
40
+ <View
41
+ ref={ref}
42
+ className={cn("mb-1 font-medium leading-none tracking-tight", className)}
43
+ {...props}
44
+ />
45
+ ))
46
+ AlertTitle.displayName = "AlertTitle"
47
+
48
+ const AlertDescription = React.forwardRef<
49
+ React.ElementRef<typeof View>,
50
+ React.ComponentPropsWithoutRef<typeof View>
51
+ >(({ className, ...props }, ref) => (
52
+ <View
53
+ ref={ref}
54
+ className={cn("text-sm [&_p]:leading-relaxed", className)}
55
+ {...props}
56
+ />
57
+ ))
58
+ AlertDescription.displayName = "AlertDescription"
59
+
60
+ export { Alert, AlertTitle, AlertDescription }
@@ -0,0 +1,36 @@
1
+ import * as React from "react"
2
+ import { View } from "@tarojs/components"
3
+
4
+ const AspectRatio = React.forwardRef<
5
+ React.ElementRef<typeof View>,
6
+ Omit<React.ComponentPropsWithoutRef<typeof View>, "style"> & {
7
+ ratio?: number
8
+ style?: React.CSSProperties
9
+ }
10
+ >(({ className, ratio = 1 / 1, style, ...props }, ref) => (
11
+ <View
12
+ ref={ref}
13
+ style={{
14
+ position: 'relative',
15
+ width: '100%',
16
+ paddingBottom: `${100 / ratio}%`,
17
+ ...style
18
+ }}
19
+ className={className}
20
+ {...props}
21
+ >
22
+ <View style={{
23
+ position: 'absolute',
24
+ top: 0,
25
+ left: 0,
26
+ right: 0,
27
+ bottom: 0,
28
+ }}
29
+ >
30
+ {props.children}
31
+ </View>
32
+ </View>
33
+ ))
34
+ AspectRatio.displayName = "AspectRatio"
35
+
36
+ export { AspectRatio }
@@ -0,0 +1,84 @@
1
+ import * as React from "react"
2
+ import { View, Image } from "@tarojs/components"
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const AvatarContext = React.createContext<{
6
+ status: "loading" | "error" | "loaded"
7
+ setStatus: (status: "loading" | "error" | "loaded") => void
8
+ } | null>(null)
9
+
10
+ const Avatar = React.forwardRef<
11
+ React.ElementRef<typeof View>,
12
+ React.ComponentPropsWithoutRef<typeof View>
13
+ >(({ className, ...props }, ref) => {
14
+ const [status, setStatus] = React.useState<"loading" | "error" | "loaded">("loading")
15
+ return (
16
+ <AvatarContext.Provider value={{ status, setStatus }}>
17
+ <View
18
+ ref={ref}
19
+ className={cn(
20
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
21
+ className
22
+ )}
23
+ {...props}
24
+ />
25
+ </AvatarContext.Provider>
26
+ )
27
+ })
28
+ Avatar.displayName = "Avatar"
29
+
30
+ const AvatarImage = React.forwardRef<
31
+ React.ElementRef<typeof Image>,
32
+ React.ComponentPropsWithoutRef<typeof Image>
33
+ >(({ className, src, ...props }, ref) => {
34
+ const context = React.useContext(AvatarContext)
35
+
36
+ const handleLoad = (e) => {
37
+ context?.setStatus("loaded")
38
+ props.onLoad?.(e)
39
+ }
40
+
41
+ const handleError = (e) => {
42
+ context?.setStatus("error")
43
+ props.onError?.(e)
44
+ }
45
+
46
+ return (
47
+ <Image
48
+ ref={ref}
49
+ src={src}
50
+ className={cn(
51
+ "aspect-square h-full w-full",
52
+ className,
53
+ context?.status !== "loaded" && "w-0 h-0 opacity-0 absolute"
54
+ )}
55
+ onLoad={handleLoad}
56
+ onError={handleError}
57
+ {...props}
58
+ />
59
+ )
60
+ })
61
+ AvatarImage.displayName = "AvatarImage"
62
+
63
+ const AvatarFallback = React.forwardRef<
64
+ React.ElementRef<typeof View>,
65
+ React.ComponentPropsWithoutRef<typeof View>
66
+ >(({ className, ...props }, ref) => {
67
+ const context = React.useContext(AvatarContext)
68
+
69
+ if (context?.status === "loaded") return null
70
+
71
+ return (
72
+ <View
73
+ ref={ref}
74
+ className={cn(
75
+ "flex h-full w-full items-center justify-center rounded-full bg-muted",
76
+ className
77
+ )}
78
+ {...props}
79
+ />
80
+ )
81
+ })
82
+ AvatarFallback.displayName = "AvatarFallback"
83
+
84
+ export { Avatar, AvatarImage, AvatarFallback }
@@ -0,0 +1,37 @@
1
+ import * as React from "react"
2
+ import { View } from "@tarojs/components"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+
5
+ import { cn } from "@/lib/utils"
6
+
7
+ const badgeVariants = cva(
8
+ "inline-flex items-center rounded-full border px-3 py-1 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default:
13
+ "border-transparent bg-primary text-primary-foreground hover:bg-primary hover:bg-opacity-80",
14
+ secondary:
15
+ "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary hover:bg-opacity-80",
16
+ destructive:
17
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive hover:bg-opacity-80",
18
+ outline: "text-foreground",
19
+ },
20
+ },
21
+ defaultVariants: {
22
+ variant: "default",
23
+ },
24
+ }
25
+ )
26
+
27
+ export interface BadgeProps
28
+ extends React.ComponentPropsWithoutRef<typeof View>,
29
+ VariantProps<typeof badgeVariants> {}
30
+
31
+ function Badge({ className, variant, ...props }: BadgeProps) {
32
+ return (
33
+ <View className={cn(badgeVariants({ variant }), className)} {...props} />
34
+ )
35
+ }
36
+
37
+ export { Badge, badgeVariants }
@@ -0,0 +1,117 @@
1
+ import * as React from "react"
2
+ import { View } from "@tarojs/components"
3
+ import { ChevronRight, Ellipsis } from "lucide-react-taro"
4
+
5
+ import { cn } from "@/lib/utils"
6
+
7
+ const Breadcrumb = React.forwardRef<
8
+ React.ElementRef<typeof View>,
9
+ React.ComponentPropsWithoutRef<typeof View> & {
10
+ separator?: React.ReactNode
11
+ }
12
+ >(({ ...props }, ref) => <View ref={ref} aria-label="breadcrumb" {...props} />)
13
+ Breadcrumb.displayName = "Breadcrumb"
14
+
15
+ const BreadcrumbList = React.forwardRef<
16
+ React.ElementRef<typeof View>,
17
+ React.ComponentPropsWithoutRef<typeof View>
18
+ >(({ className, ...props }, ref) => (
19
+ <View
20
+ ref={ref}
21
+ className={cn(
22
+ "flex flex-wrap items-center gap-2 break-words text-sm text-muted-foreground sm:gap-3",
23
+ className
24
+ )}
25
+ {...props}
26
+ />
27
+ ))
28
+ BreadcrumbList.displayName = "BreadcrumbList"
29
+
30
+ const BreadcrumbItem = React.forwardRef<
31
+ React.ElementRef<typeof View>,
32
+ React.ComponentPropsWithoutRef<typeof View>
33
+ >(({ className, ...props }, ref) => (
34
+ <View
35
+ ref={ref}
36
+ className={cn("inline-flex items-center gap-2", className)}
37
+ {...props}
38
+ />
39
+ ))
40
+ BreadcrumbItem.displayName = "BreadcrumbItem"
41
+
42
+ const BreadcrumbLink = React.forwardRef<
43
+ React.ElementRef<typeof View>,
44
+ React.ComponentPropsWithoutRef<typeof View> & {
45
+ asChild?: boolean
46
+ href?: string
47
+ }
48
+ >(({ asChild, className, href, ...props }, ref) => {
49
+ const linkProps = href ? { url: href } : {}
50
+
51
+ return (
52
+ <View
53
+ ref={ref}
54
+ className={cn("transition-colors hover:text-foreground", className)}
55
+ {...linkProps}
56
+ {...props as any}
57
+ />
58
+ )
59
+ })
60
+ BreadcrumbLink.displayName = "BreadcrumbLink"
61
+
62
+ const BreadcrumbPage = React.forwardRef<
63
+ React.ElementRef<typeof View>,
64
+ React.ComponentPropsWithoutRef<typeof View>
65
+ >(({ className, ...props }, ref) => (
66
+ <View
67
+ ref={ref}
68
+ role="link"
69
+ aria-disabled="true"
70
+ aria-current="page"
71
+ className={cn("font-normal text-foreground", className)}
72
+ {...props}
73
+ />
74
+ ))
75
+ BreadcrumbPage.displayName = "BreadcrumbPage"
76
+
77
+ const BreadcrumbSeparator = ({
78
+ children,
79
+ className,
80
+ ...props
81
+ }: React.ComponentPropsWithoutRef<typeof View>) => (
82
+ <View
83
+ role="presentation"
84
+ aria-hidden="true"
85
+ className={cn("[&>svg]:w-4 [&>svg]:h-4 flex items-center", className)}
86
+ {...props}
87
+ >
88
+ {children ?? <ChevronRight size={16} />}
89
+ </View>
90
+ )
91
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator"
92
+
93
+ const BreadcrumbEllipsis = ({
94
+ className,
95
+ ...props
96
+ }: React.ComponentPropsWithoutRef<typeof View>) => (
97
+ <View
98
+ role="presentation"
99
+ aria-hidden="true"
100
+ className={cn("flex h-9 w-9 items-center justify-center", className)}
101
+ {...props}
102
+ >
103
+ <Ellipsis color="#737373" size={16} />
104
+ <View className="sr-only">More</View>
105
+ </View>
106
+ )
107
+ BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"
108
+
109
+ export {
110
+ Breadcrumb,
111
+ BreadcrumbList,
112
+ BreadcrumbItem,
113
+ BreadcrumbLink,
114
+ BreadcrumbPage,
115
+ BreadcrumbSeparator,
116
+ BreadcrumbEllipsis,
117
+ }
@@ -0,0 +1,83 @@
1
+ import * as React from "react"
2
+ import { View } from "@tarojs/components"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+
5
+ import { cn } from "@/lib/utils"
6
+ import { Separator } from "@/components/ui/separator"
7
+
8
+ const buttonGroupVariants = cva(
9
+ "flex w-fit items-stretch",
10
+ {
11
+ variants: {
12
+ orientation: {
13
+ horizontal:
14
+ "[&>view:nth-child(n+2)]:rounded-l-none [&>view:nth-child(n+2)]:border-l-0 [&>view:nth-last-child(n+2)]:rounded-r-none",
15
+ vertical:
16
+ "flex-col [&>view:nth-child(n+2)]:rounded-t-none [&>view:nth-child(n+2)]:border-t-0 [&>view:nth-last-child(n+2)]:rounded-b-none",
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ orientation: "horizontal",
21
+ },
22
+ }
23
+ )
24
+
25
+ function ButtonGroup({
26
+ className,
27
+ orientation,
28
+ ...props
29
+ }: React.ComponentPropsWithoutRef<typeof View> & VariantProps<typeof buttonGroupVariants>) {
30
+ return (
31
+ <View
32
+ role="group"
33
+ data-slot="button-group"
34
+ data-orientation={orientation}
35
+ className={cn(buttonGroupVariants({ orientation }), className)}
36
+ {...props}
37
+ />
38
+ )
39
+ }
40
+
41
+ function ButtonGroupText({
42
+ className,
43
+ asChild = false,
44
+ ...props
45
+ }: React.ComponentPropsWithoutRef<typeof View> & {
46
+ asChild?: boolean
47
+ }) {
48
+
49
+ return (
50
+ <View
51
+ className={cn(
52
+ "bg-muted shadow-xs flex items-center gap-2 rounded-md border px-4 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none",
53
+ className
54
+ )}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ function ButtonGroupSeparator({
61
+ className,
62
+ orientation = "vertical",
63
+ ...props
64
+ }: React.ComponentPropsWithoutRef<typeof Separator>) {
65
+ return (
66
+ <Separator
67
+ data-slot="button-group-separator"
68
+ orientation={orientation}
69
+ className={cn(
70
+ "bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto",
71
+ className
72
+ )}
73
+ {...props}
74
+ />
75
+ )
76
+ }
77
+
78
+ export {
79
+ ButtonGroup,
80
+ ButtonGroupSeparator,
81
+ ButtonGroupText,
82
+ buttonGroupVariants,
83
+ }
@@ -0,0 +1,67 @@
1
+ import * as React from "react"
2
+ import { View } from "@tarojs/components"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+
5
+ import { cn } from "@/lib/utils"
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background active:translate-y-px disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-primary text-primary-foreground hover:bg-primary hover:bg-opacity-90",
13
+ destructive:
14
+ "bg-destructive text-destructive-foreground hover:bg-destructive hover:bg-opacity-90",
15
+ outline:
16
+ "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
17
+ secondary:
18
+ "bg-secondary text-secondary-foreground hover:bg-secondary hover:bg-opacity-80",
19
+ ghost: "hover:bg-accent hover:text-accent-foreground",
20
+ link: "text-primary underline-offset-4 hover:underline",
21
+ },
22
+ size: {
23
+ default: "h-10 px-4 py-2",
24
+ sm: "h-9 rounded-md px-3",
25
+ lg: "h-11 rounded-md px-8",
26
+ icon: "h-10 w-10",
27
+ },
28
+ },
29
+ defaultVariants: {
30
+ variant: "default",
31
+ size: "default",
32
+ },
33
+ }
34
+ )
35
+
36
+ export interface ButtonProps
37
+ extends React.ComponentPropsWithoutRef<typeof View>,
38
+ VariantProps<typeof buttonVariants> {
39
+ asChild?: boolean
40
+ disabled?: boolean
41
+ className?: string
42
+ }
43
+
44
+ const Button = React.forwardRef<React.ElementRef<typeof View>, ButtonProps>(
45
+ ({ className, variant, size, asChild = false, disabled, ...props }, ref) => {
46
+ const tabIndex = (props as { tabIndex?: number }).tabIndex ?? (disabled ? -1 : 0)
47
+ return (
48
+ <View
49
+ className={cn(
50
+ buttonVariants({ variant, size, className }),
51
+ disabled && "opacity-50 pointer-events-none"
52
+ )}
53
+ ref={ref}
54
+ {...({ tabIndex } as { tabIndex?: number })}
55
+ hoverClass={
56
+ disabled
57
+ ? undefined
58
+ : "border-ring ring-2 ring-ring ring-offset-2 ring-offset-background"
59
+ }
60
+ {...props}
61
+ />
62
+ )
63
+ }
64
+ )
65
+ Button.displayName = "Button"
66
+
67
+ export { Button, buttonVariants }